
Я использую cairolatex
терминал gnuplot
для создания некоторых поверхностных графиков ( pgfplots
не справляется с задачей из-за своей жажды памяти). Поскольку количество графиков увеличивается, я хотел бы включить компиляцию gnuplot
в свою tex
компиляцию, чтобы гарантировать, что графики актуальны. Я наткнулся на gnuplottex
пакет, который, похоже, справляется с этой задачей, хотя он и медленный.
У меня большой вложенный документ. Корень tex — это thesis.tex
то, куда я включаю, среди прочего, theory.tex
. В theory.tex
я поместил
\begin{figure}[htbp]
\centering
\input{gnuplot/cascade}
\input{figures/cascade}
\end{figure}
где gnuplot/cascade.tex
содержится gnuplot
код
\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}
Вывод этой настройки потрясающий. Но всякий раз, когда я что-то меняю в theory.tex
, вся gnuplottex
процедура перекомпилируется. Это занимает довольно много времени и очень раздражает.
Почему latexmk
не распознает, что gnuplot
код не изменился и оставляет его? Можно ли указать эту зависимость, и в таком случае, как?
EDIT: gnuplottex
довольно медленно на моей системе, хотя gnuplot
на самом деле быстро. Как мне избежать использования gnuplottex
, это долгое время компиляции и, таким образом, избежать перекомпиляции gnuplottex
каждый раз?
решение1
Я вообще избегал использования, gnuplottex
добавив следующую пользовательскую зависимость .latexmkrc
:
add_cus_dep('gnu','tex', 0, 'makegnu2tex');
sub makegnu2tex {
system("gnuplot \"$_[0].gnu\"") ;
}
Мой gnuplot
файл использует cairolatex
терминал (или любой другой терминал, который создает .tex
файл). Мой latex
документ содержит \input{gnuplot_output.tex}
, который из-за новой определенной зависимости вызывает системный вызов gnuplot
при tex
компиляции. .gnu
Файл и .tex
файлы теперь являются обычной зависимостью и gnuplot
не будут перекомпилироваться, если не будет изменена временная метка.
Важно отметить, что путь, указанный в set output "path/gnuplot_output.tex"
файле, .gnu
является относительным к tex root
файлу, если gnuplot
системный вызов вызван latexmk
.
решение2
Мое текущее решение без использования gnuplottex
— это модификация того, что я нашел некоторое время назад (Как включить изображение SVG в LaTeX) для включения SVG (с автоматическим вызовом Inkscape при необходимости).
\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}%
}
У меня есть файлы gnuplot в подпапке, например img/ch01/foo.gp
, и мне нравится хранить все временные файлы в tmp/
и все временные файлы изображений в tmp/img/
(так как я использую git
для отслеживания своих tex-файлов, но не хочу отслеживать производные файлы, то есть те, что находятся в tmp/
). Затем файл gnuplot можно встроить в документ следующим образом:
\begin{figure}
\centering
\includegp{img/ch01/}{foo}
\end{figure}
Я вызываю miktex-pdftex.exe
из TeXworks
с параметрами -aux-directory=tmp
и -shell-escape
для того, чтобы это работало. Кроме того, папка, содержащая двоичный файл gnuplot, должна быть в переменной PATH или, в моем случае, установлена в настройках TeXworks (например, D:/gnuplot/bin
).