gnuplot в LaTeX, без gnuplottex

gnuplot в LaTeX, без gnuplottex

Я использую 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).

Связанный контент