Hallo Leute! Wieder einmal habe ich eine Frage zu pgfplots und wieder ist es so, dass meine Zeichnung alleine als tex-file kompiliert genau so aussieht wie ich will und dann, eigebunden ins Dokument nicht mehr tut was sie soll. So funktioniert es: Open in writeLaTeX
% Legende korrekt: \begin{filecontents}{\jobname.csv} 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{pgfplots} \pgfplotsset{compat=1.10} \usepackage{siunitx} \begin{document} \begin{tikzpicture} \begin{axis}[ xlabel = {xlabel}, ylabel = {ylabel 1}, smooth, axis y line*=left, scaled x ticks=false, xticklabel={\pgfmathprintnumber[sci,sci generic={mantissa sep=\times,exponent={10^{##1}}}]{\tick}}, legend style={draw=none}, ] \addplot[black, mark =x] table [x index = 1, y index = 2] {\jobname.csv}; \label{label_1} \addplot[red, mark =x] table [x index = 1, y index = 3] {\jobname.csv}; \label{label_2} \end{axis} \begin{axis}[ ylabel = {Maximalwert [\SI{}{\percent}]}, smooth, axis y line*=right, xmajorticks=false, scaled x ticks=false, legend style={draw=none}, ] \addlegendimage{/pgfplots/refstyle=label_1}\addlegendentry{\scriptsize{Name 1}}; \addlegendimage{/pgfplots/refstyle=label_2}\addlegendentry{\scriptsize{Name 2}}; \addplot[green, mark =x] table [x index = 1, y index = 4] {\jobname.csv}; \addlegendentry{\scriptsize{Name 3}}; \end{axis} \end{tikzpicture} \end{document} Das Problem ist: Wenn ich das Bild Bild einzeln kompiliere ist alles schick. Wenn ich das Bild in mein Dokument einbinde, in dem ich die Open in writeLaTeX
% Legende nicht korrekt: \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{pgfplots} \pgfplotsset{compat=1.10} \usepackage{siunitx} \usepgfplotslibrary{external} \tikzexternalize \tikzsetexternalprefix{external_figs/} \begin{document} \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} Zwar gibt es bereits eine ähnliche Frage mit einer Antwort von @cfeuersaenger, ich weiß aber nicht, wie ich diese konkret auf mein Problem anwenden kann. |
Man könnte den zusätzlich benötigten Aufruf auch automatisieren. Dazu patche ich die Bibliothek Open in writeLaTeX
\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 \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 Außerdem habe ich einen Schalter eingebaut, damit man nur diejenigen Abbildungen doppelt durchlaufen lassen kann, die das wirklich benötigen. Das geht über Insgesamt sieht das dann so aus: Open in writeLaTeX
\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/} \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 \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: Nach dem zweiten LaTeX-Lauf stimmt aber alles: Da der von Ein weiterer Vorteil der Lösung: Wann immer 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 Einen Nachteil will ich aber nicht verschweigen: Gibt es im ersten von beantwortet 26 Sep '14, 10:26 gast3 Meine erste Lösung hatte leider nicht funktioniert, da dabei der zweite
(26 Sep '14, 10:38)
gast3
Toll, danke!
(26 Sep '14, 12:21)
lorbj
|
Solange, bis die Open in writeLaTeX
\usepackage{etoolbox} \makeatletter \newif\if@twoexternalruns \newcommand*{\nextwithtwoexternalruns}{\@twoexternalrunstrue} \renewcommand*{\@twoexternalrunsfalse}{\global\let\if@twoexternalruns\iffalse} \patchcmd\tikzexternal@externalizefig@systemcall@@ {\immediate\write18{\pgf@tempa}}% {\immediate\write18{\pgf@tempa}% \if@twoexternalruns\@twoexternalrunsfalse\immediate\write18{\pgf@tempa}\fi}% {}{\patchFailed} \makeatother Nun kann man unmittelbar vor Open in writeLaTeX
\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/} \usepackage{etoolbox} \makeatletter \newif\if@twoexternalruns \newcommand*{\nextwithtwoexternalruns}{\@twoexternalrunstrue} \renewcommand*{\@twoexternalrunsfalse}{\global\let\if@twoexternalruns\iffalse} \patchcmd\tikzexternal@externalizefig@systemcall@@ {\immediate\write18{\pgf@tempa}}% {\immediate\write18{\pgf@tempa}% \if@twoexternalruns\@twoexternalrunsfalse\immediate\write18{\pgf@tempa}\fi}% {}{\patchFailed} \makeatother \begin{document} \nextwithtwoexternalruns \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} Das schöne daran ist: Da genau der eine Aufruf der Ich erhalte auf diesem Weg direkt: In der `===== 'mode=convert with system call': Invoking 'pdflatex -shell-escape -halt-o n-error -interaction=batchmode -jobname "external_figs/test-figure0" "\def\tikz externalrealjob{test}\input{test}"' ======== \openout3 = `test.auxlock'. runsystem(pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "external_figs/test-figure0" "\def\tikzexternalrealjob{test}\input{test}")...e xecuted. runsystem(pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "external_figs/test-figure0" "\def\tikzexternalrealjob{test}\input{test}")...e xecuted. \openout3 = `test.auxlock'.` Beim nächsten Lauf erkennt Nachteil ist, dass bei Fehlern im TikZ-Code trotzdem zwei Aufrufe stattfinden, der Fehler also zweimal auftritt. beantwortet 26 Sep '14, 08:50 gast3 |
Die Ursache dieses Fehlers hat @cfeuersaenger in seiner Antwort auf die Frage Markierung in pgfplotlegende fehlerhaft übernommen erklärt. Wie dort ebenfalls erläutert, kannst Du zum einen die Abbildung von der Externalisierung ausnehmen, dann kannst Du auch einfach nur Zum anderen kannst Du die Abbildung trotzdem externalisieren, musst aber bei Änderungen an der Abbildung Open in writeLaTeX
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "<externalprefix><abbildungsname>" "\def\tikzexternalrealjob{<dateiname>}\input{<dateiname>}" aufrufen. Dabei ist Open in writeLaTeX
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "external_figs/mwe-figure0" "\def\tikzexternalrealjob{mwe}\input{mwe}" Ich habe das jetzt nur unter Windows getestet, vermute aber, dass das mit anderen Betriebssystemen genauso funktioniert. beantwortet 26 Sep '14, 01:17 esdd 1
Funktioniert auch unter Linux allerdings muss man dann
(26 Sep '14, 07:47)
gast3
Ich habe mein Beispiel jetzt in "mwe.tex" umbenannt, die Befehle kopiert, eingefügt und ausgeführt. Das Problem besteht weiterhin. Edit: geht jetzt, im zweiten Quellcodekasten war ein Tippfehler, es muss
(26 Sep '14, 08:40)
lorbj
|