
Estoy usando la cairolatex
terminal gnuplot
para crear algunos gráficos de superficie ( pgfplots
está fallando en la tarea debido a su hambre de memoria). A medida que aumenta el número de gráficos, me gustaría incluir la gnuplot
compilación en mi tex
compilación para garantizar que estén actualizados. Encontré el gnuplottex
paquete, que parece realizar la tarea, aunque es lento.
Tengo un documento grande y anidado. La raíz de Tex es thesis.tex
donde incluyo, entre otros, theory.tex
. en theory.tex
he puesto
\begin{figure}[htbp]
\centering
\input{gnuplot/cascade}
\input{figures/cascade}
\end{figure}
donde gnuplot/cascade.tex
contiene el gnuplot
código
\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}
El resultado de esta configuración es asombroso. Pero cada vez que cambio algo theory.tex
, se vuelve a compilar toda la gnuplottex
rutina. Esto lleva bastante tiempo y es muy molesto.
¿Cómo es que latexmk
no reconoce que el gnuplot
código no ha cambiado y lo deja? ¿Se podría especificar esta dependencia y, en ese caso, cómo?
EDITAR: gnuplottex
es bastante lento en mi sistema, aunque gnuplot
es muy rápido. ¿Cómo puedo evitar el uso de gnuplottex
, el tiempo de compilación es largo y, por lo tanto, evitar tener que gnuplottex
volver a compilar cada vez?
Respuesta1
He evitado usarlo gnuplottex
agregando la siguiente dependencia personalizada a .latexmkrc
:
add_cus_dep('gnu','tex', 0, 'makegnu2tex');
sub makegnu2tex {
system("gnuplot \"$_[0].gnu\"") ;
}
Mi gnuplot
archivo usa la cairolatex
terminal (o cualquier otra terminal que produzca un .tex
archivo). Mi latex
documento contiene \input{gnuplot_output.tex}
que, debido a la dependencia recién definida, provoca una llamada al sistema gnuplot
durante tex
la compilación. El .gnu
archivo y .tex
los archivos ahora son una dependencia normal y gnuplot
no se volverán a compilar a menos que se cambie la marca de tiempo.
Es importante tener en cuenta que la ruta especificada en set output "path/gnuplot_output.tex"
el .gnu
archivo es relativa al tex root
archivo siempre que la gnuplot
llamada al sistema sea inducida por latexmk
.
Respuesta2
Mi solución actual sin usar gnuplottex
es una modificación de una que encontré hace un tiempo (Cómo incluir una imagen SVG en LaTeX) para la inclusión de SVG (con una llamada automática a Inkscape si es necesario).
\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}%
}
Tengo mis archivos gnuplot en una subcarpeta, por ejemplo img/ch01/foo.gp
, y me gusta tener todos los archivos temporales tmp/
y todos los archivos de imagen temporales tmp/img/
(ya que suelo git
rastrear mis archivos tex, pero no quiero rastrear ningún archivo derivado, es decir, los que están en tmp/
). Luego, el archivo gnuplot se puede incrustar en un documento como este:
\begin{figure}
\centering
\includegp{img/ch01/}{foo}
\end{figure}
Llamo miktex-pdftex.exe
desde TeXworks
con las opciones -aux-directory=tmp
y -shell-escape
para que esto funcione. Además, la carpeta que contiene el binario gnuplot debe estar en la variable PATH o, en mi caso, configurada en la configuración de TeXworks (por ejemplo D:/gnuplot/bin
).