
Estou usando o cairolatex
terminal gnuplot
para criar alguns gráficos de superfície ( pgfplots
está falhando na tarefa devido à sua fome de memória). À medida que o número de parcelas aumenta, gostaria de incluir a gnuplot
compilação em minha tex
compilação para garantir que as parcelas estejam atualizadas. Me deparei com o gnuplottex
pacote, que parece dar conta da tarefa, embora seja lento.
Eu tenho um documento grande e aninhado. A raiz Tex é thesis.tex
onde incluo, entre outros, theory.tex
. Em theory.tex
eu coloquei
\begin{figure}[htbp]
\centering
\input{gnuplot/cascade}
\input{figures/cascade}
\end{figure}
onde gnuplot/cascade.tex
contém o 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}
O resultado desta configuração é incrível. Mas sempre que eu mudo alguma coisa theory.tex
, toda a gnuplottex
rotina é recompilada. Isso leva algum tempo e é muito chato.
Por que latexmk
não reconhece que o gnuplot
código não mudou e sai dele? Essa dependência poderia ser especificada e, nesse caso, como?
EDIT: gnuplottex
é bastante lento no meu sistema, embora gnuplot
seja muito rápido. Como posso evitar o uso gnuplottex
, é um longo tempo de compilação e, assim, evitar gnuplottex
recompilar todas as vezes?
Responder1
Evitei usar gnuplottex
adicionando a seguinte dependência personalizada a .latexmkrc
:
add_cus_dep('gnu','tex', 0, 'makegnu2tex');
sub makegnu2tex {
system("gnuplot \"$_[0].gnu\"") ;
}
Meu gnuplot
arquivo usa o cairolatex
terminal (ou qualquer outro terminal que produza um .tex
arquivo). Meu latex
documento contém \input{gnuplot_output.tex}
which, devido à dependência recém-definida, causa uma chamada do sistema gnuplot
na tex
compilação. O .gnu
arquivo e .tex
os arquivos agora são uma dependência normal e gnuplot
não serão recompilados a menos que o carimbo de data/hora seja alterado.
É importante notar que o caminho especificado no set output "path/gnuplot_output.tex"
arquivo .gnu
é relativo ao tex root
arquivo, desde que a gnuplot
chamada do sistema seja induzida por latexmk
.
Responder2
Minha solução atual sem usar gnuplottex
é uma modificação de uma que encontrei há algum tempo (Como incluir uma imagem SVG no LaTeX) para inclusão de SVGs (com chamada automática ao Inkscape se necessário).
\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}%
}
Eu tenho meus arquivos gnuplot em uma subpasta, por exemplo img/ch01/foo.gp
, e gosto de ter todos os arquivos temporários tmp/
e todos os arquivos de imagem temporários tmp/img/
(já que uso git
para rastrear meus arquivos tex, mas não quero rastrear nenhum arquivo derivado, ou seja, aqueles em tmp/
). O arquivo gnuplot pode então ser incorporado em um documento como este:
\begin{figure}
\centering
\includegp{img/ch01/}{foo}
\end{figure}
Eu ligo miktex-pdftex.exe
com TeXworks
as opções -aux-directory=tmp
e -shell-escape
para que isso funcione. Além disso, a pasta que contém o binário gnuplot deve estar na variável PATH ou no meu caso definida nas configurações do TeXworks (por exemplo D:/gnuplot/bin
).