Man könnte den zusätzlich benötigten Aufruf auch automatisieren. Dazu patche ich die Bibliothek `external` so, dass sie zusätzlich zu dem normalen `\write18`-Aufruf auch noch einen weiteren `\write18`-Aufruf nach dem Einlesen der `aux`-Datei durchführt:
\usepackage{scrlfile}
\usepackage{etoolbox}
\makeatletter
\newif\if@lateexternal
\newcommand*{\nextwithlateexternal}{\@lateexternaltrue}
\renewcommand*{\@lateexternalfalse}{\global\let\if@lateexternal\iffalse}
% Den Systemaufruf von external so ändern, dass er optional doppelt
% stattfindet: Zunächst wie gehabt unmittelbar und zusätzlich nachdem
% die aux-Datei geschlossen (und sogar neu gelesen) wurde.
\patchcmd\tikzexternal@externalizefig@systemcall@@
{\immediate\write18{\pgf@tempa}}%
{\immediate\write18{\pgf@tempa}%
\if@lateexternal
\@lateexternalfalse
\begingroup
\protected@edef\reserved@a{%
\noexpand\endgroup
\noexpand\AfterReadingMainAux{%
\noexpand\immediate\noexpand\write18{%
\expandafter\detokenize\expandafter{\pgf@tempa}}%
}%
}%
\reserved@a
\fi
}%
{}%
{\patchFailedError}
% Nun dafür sorgen, dass der Aufruf \nextwithlateexternal nur auf
% den nächsten potentiellen Systemaufruf von external wirkt statt
% auf den nächsten tatsächlichen oder gar alle:
\apptocmd\tikzexternal@externalizefig@systemcall@@
{\@lateexternalfalse}
{}
{\patchFailedError}
\makeatother
**Erklärung:**
Der späte `\write18`-Aufruf erfolgt mit Hilfe der Anweisung `\AfterReadingMainAux`, die von [`scrlfile`](http://www.ctan.org/pkg/koma-script) bereitgestellt wird. Für den Aufruf selbst greife ich dabei genau auf den Aufruf zurück, den `external` selbst durchführt. Dazu muss nur der Original-`\write18`-Aufruf erweitert werden. Ich muss damit nicht wissen, wie die externe Datei heißt, das ist alles in `\pgf@tempa` versteckt.
Außerdem habe ich einen Schalter eingebaut, damit man nur diejenigen Abbildungen doppelt durchlaufen lassen kann, die das wirklich benötigen. Das geht über `\nextwithlateexternal` unmittelbar vor der entsprechenden `tikzpicture`-Umgebung.
**Insgesamt sieht das dann so aus:**
\RequirePackage{filecontents}
\begin{filecontents}{\jobname Data.asc}
2 224694229071385000 8.97 8.72 3.275
5 561735572678462000 8.25 5.25 4.91
10 1123471145356920000 8.5 4.92 4.92
30 3370413436070770000 7.75 3.5 6.19
60 6740826872141550000 7.09 4.5 5.82
120 13481653744283100000 6.85 4.75 6.06
\end{filecontents}
\documentclass{article}
\usepackage{scrlfile}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepackage{siunitx}
\usepgfplotslibrary{external}
\tikzexternalize
\tikzsetexternalprefix{external_figs/}
% Jetzt wird die entscheidende Anweisung von external gepatcht,
% damit diese optional einen weiteren Lauf _nach_ dem Schließen
% der aux-Datei durchführt:
\usepackage{etoolbox}
\makeatletter
\newif\if@lateexternal
\newcommand*{\nextwithlateexternal}{\@lateexternaltrue}
\renewcommand*{\@lateexternalfalse}{\global\let\if@lateexternal\iffalse}
\patchcmd\tikzexternal@externalizefig@systemcall@@
{\immediate\write18{\pgf@tempa}}%
{\immediate\write18{\pgf@tempa}%
\if@lateexternal
\@lateexternalfalse
\begingroup
\protected@edef\reserved@a{%
\noexpand\endgroup
\noexpand\AfterReadingMainAux{%
\noexpand\immediate\noexpand\write18{%
\expandafter\detokenize\expandafter{\pgf@tempa}}%
}%
}%
\reserved@a
\fi
}%
{}%
{\patchFailedError}
\apptocmd\tikzexternal@externalizefig@systemcall@@
{\@lateexternalfalse}
{}
{\patchFailedError}
\makeatother
\begin{document}
\nextwithlateexternal% späte Externalisierung für nächstes tikzpicture aktivieren
\begin{tikzpicture}
\begin{axis}[
xlabel = {xlabel},
ylabel = {ylabel 1},
smooth,
axis y line*=left,
xmin = -2e18,
xmax = 1.6e19,
scaled x ticks=false,
xticklabel={\pgfmathprintnumber[sci,sci generic={mantissa sep=\times,exponent={10^{##1}}}]{\tick}},
xtick = {0,5e18,1e19,1.5e19},
legend style={draw=none},
]
\addplot[black, mark =x] table [x index = 1, y index = 2] {\jobname Data.asc};
\label{1}
\addplot[red, mark =x] table [x index = 1, y index = 3] {\jobname Data.asc};
\label{2}
\end{axis}
\begin{axis}[
ylabel = {ylabel 2},
smooth,
axis y line*=right,
xmin = -2e18,
xmax = 1.6e19,
ymin = 2.9,
ymax = 7.2,
%ytick ={3,4,...,9},
xmajorticks=false,
scaled x ticks=false,
legend style={draw=none},
]
\addlegendimage{/pgfplots/refstyle=1}\addlegendentry{\scriptsize{name 1}};
\addlegendimage{/pgfplots/refstyle=2}\addlegendentry{\scriptsize{name 2}};
\addplot[green, mark =x] table [x index = 1, y index = 4] {\jobname Data.asc};
\addlegendentry{\scriptsize{name 3}};
\end{axis}
\end{tikzpicture}
\end{document}
**Nach dem ersten LaTeX-Lauf** ist die Abbildung noch fehlerhaft:
![noch fehlerhaft][1]
**Nach dem zweiten LaTeX-Lauf** stimmt aber alles:
![nach zwei Läufen][2]
Da der von `external` auch für den ersten `pdflatex`-Lauf verwendete Aufruf kopiert wird, sollte das ganze **unabhängig vom Betriebssystem** sein. Damit es überhaupt funktioniert, muss aber natürlich `external` die Notwendigkeit eines neuen `pdflatex`-Laufs erkennen. Also bitte mit einem jungfräulichen `external_figs`-Verzeichnis testen!
Ein weiterer Vorteil der Lösung: Wann immer `external` den normalen externen `pdflatex`-Lauf durchführt, wird auch der zweite, späte `pdflatex`-Lauf automatisch durchgeführt. Erkennt `external` hingegen keine Notwendigkeit für den ersten Lauf, so entfällt auch automatisch der zweite.
Da die Lösung außerdem eine auf LaTeX-Ebene ist, ist sie auch **unabhängig vom verwendeten Editor**. Ideal wäre natürlich, wenn @cfeuersaenger eine solche Möglichkeit direkt in `external` einbauen würde, so dass man sie über einen TikZ-Schalter aktivieren könnte.
Einen Nachteil will ich aber nicht verschweigen: Gibt es im ersten von `external` durchgeführten `pdflatex`-Lauf einen Fehler, so wird der zweite trotzdem durchgeführt und der Fehler tritt ein zweites Mal auf.
[1]: http://texwelt.de/wissen/upfiles/test13.png
[2]: http://texwelt.de/wissen/upfiles/test15.png