Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 9
Schalter verbessert

26 Sep '14, 12:11

gast3's gravatar image

gast3
(ausgesetzt)

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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 8
Ein wenig mehr Struktur

26 Sep '14, 11:52

gast3's gravatar image

gast3
(ausgesetzt)

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} \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} \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 greif eich 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 **Insgesamt sieht das dann so aus: 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} \makeatother \begin{document} \nextwithlateexternal \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 **Nach dem ersten LaTeX-Lauf LaTeX-Lauf** ist die Abbildung noch fehlerhaft: ![noch fehlerhaft][1] nach **Nach dem zweiten LaTeX-Lauf 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 **unabhängig vom Betriebssystem und vom Editor 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 **unabhängig vom verwendeten Editor. 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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 7
x zuviel

26 Sep '14, 10:52

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 6
siehe letzte Änderung

26 Sep '14, 10:50

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Versehentlich gelöschte Zeile von Hand wiede reingetippt

26 Sep '14, 10:49

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

26 Sep '14, 10:41

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

26 Sep '14, 10:36

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

26 Sep '14, 10:31

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

26 Sep '14, 10:26

gast3's gravatar image

gast3
(ausgesetzt)