
Ich verwende das cairolatex
Terminal, gnuplot
um einige Oberflächendiagramme zu erstellen ( pgfplots
die Aufgabe schlägt fehl, weil es zu viel Speicher benötigt). Da die Anzahl der Diagramme zunimmt, möchte ich die gnuplot
Kompilierung in meine tex
Kompilierung einbeziehen, um sicherzustellen, dass die Diagramme auf dem neuesten Stand sind. Ich bin auf das gnuplottex
Paket gestoßen, das die Aufgabe zu bewältigen scheint, obwohl es langsam ist.
Ich habe ein großes, verschachteltes Dokument. In Tex root thesis.tex
füge ich unter anderem ein theory.tex
. In theory.tex
habe ich
\begin{figure}[htbp]
\centering
\input{gnuplot/cascade}
\input{figures/cascade}
\end{figure}
wobei gnuplot/cascade.tex
der gnuplot
Code
\begin{gnuplot}[terminal=cairolatex]
set samp 100;
set iso 40;
set xrange [0:1];
set yrange [0:1];
set zrange [0.8:2];
unset key;
unset colorbox;
set hidden3d front;
a = 1;
set xyplane at a;
f(x,y) = (x+y)/(2*sqrt(x*y));
set xlabel "$\\tau_I$";
set ylabel "$\\tau_D$";
set zlabel "$\\zeta$";
set output "figures/cascade.tex"
splot f(x,y) with pm3d at b, f(x,y) with lines;
unset output
\end{gnuplot}
Die Ausgabe dieses Setups ist fantastisch. Aber jedes Mal, wenn ich etwas ändere theory.tex
, wird die gesamte gnuplottex
Routine neu kompiliert. Das dauert ziemlich lange und ist sehr ärgerlich.
Wie kommt es latexmk
, dass nicht erkannt wird, dass sich der gnuplot
Code nicht geändert hat und er nicht geändert wird? Könnte diese Abhängigkeit angegeben werden und wenn ja, wie?
EDIT: gnuplottex
ist auf meinem System ziemlich langsam, obwohl gnuplot
es wirklich schnell ist. Wie kann ich die Verwendung von vermeiden gnuplottex
, die lange Kompilierungszeit und so gnuplottex
jedes Mal eine Neukompilierung vermeiden?
Antwort1
Ich habe die Verwendung gnuplottex
vollständig vermieden, indem ich die folgende benutzerdefinierte Abhängigkeit hinzugefügt habe .latexmkrc
:
add_cus_dep('gnu','tex', 0, 'makegnu2tex');
sub makegnu2tex {
system("gnuplot \"$_[0].gnu\"") ;
}
Meine gnuplot
Datei verwendet das cairolatex
Terminal (oder jedes andere Terminal, das eine .tex
Datei erzeugt). Mein latex
Dokument enthält , was aufgrund der neu definierten Abhängigkeit beim Kompilieren \input{gnuplot_output.tex}
einen Systemaufruf auslöst . Die Datei und die Dateien sind jetzt eine normale Abhängigkeit und werden nicht neu kompiliert, es sei denn, der Zeitstempel wird geändert.gnuplot
tex
.gnu
.tex
gnuplot
Es ist wichtig zu beachten, dass der in set output "path/gnuplot_output.tex"
der .gnu
Datei angegebene Pfad relativ zur tex root
Datei ist, solange der gnuplot
Systemaufruf durch ausgelöst wird latexmk
.
Antwort2
Meine aktuelle Lösung ohne Verwendung gnuplottex
ist eine Modifikation einer Lösung, die ich vor einiger Zeit gefunden habe (So fügen Sie ein SVG-Bild in LaTeX ein) zum Einbinden von SVGs (mit automatischem Aufruf von Inkscape falls nötig).
\newcommand{\executeiffilenewer}[3]{%
\ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
{\pdffilemoddate{#2}}>0%
{\immediate\write18{#3}}\fi%
}
\newcommand{\includegp}[2]{%
\executeiffilenewer{#1#2.gp}{tmp/img/#2.tex}%
{gnuplot #1#2.gp}%
\import{tmp/img/}{#2.tex}%
}
Ich habe meine Gnuplot-Dateien in einem Unterordner, z. B. img/ch01/foo.gp
, und möchte alle temporären Dateien tmp/
und alle temporären Bilddateien in haben tmp/img/
(da ich git
meine Tex-Dateien verfolge, aber keine abgeleiteten Dateien verfolgen möchte, also die in tmp/
). Die Gnuplot-Datei kann dann wie folgt in ein Dokument eingebettet werden:
\begin{figure}
\centering
\includegp{img/ch01/}{foo}
\end{figure}
Damit dies funktioniert, rufe ich miktex-pdftex.exe
von TeXworks
mit den Optionen -aux-directory=tmp
und auf. Außerdem muss der Ordner, der die Gnuplot-Binärdatei enthält, in der Variable PATH enthalten sein oder in meinem Fall in den TeXworks-Einstellungen festgelegt sein (z. B. ).-shell-escape
D:/gnuplot/bin