latexmk:使用 \includestandalone[mode=buildnew] 无限运行

latexmk:使用 \includestandalone[mode=buildnew] 无限运行

以下latexmkmode = buildnew\includestandalone

Latexmk:未获得稳定文件,已达到 lualatex 的最大运行次数

此消息可能重复之前的消息。Latexmk:处理文件失败:
“lualatex”需要太多遍

latexmk -lualatex -silent -synctex=1 -g -e "$max_repeat=3" -f -interaction=nonstopmode -shell-escape -usepretex=\AtBeginDocument{\printanswersfalse} <file name.tex>

\documentclass{exam}
\usepackage[subpreambles=false]{standalone}
\begin{filecontents*}[overwrite]{diaa_pic.tex}
    \documentclass[tikz]{standalone}
    \begin{document}
        \begin{tikzpicture} 
            \draw[->] (0,1cm)--++(14,-5);
        \end{tikzpicture}
    \end{document}
\end{filecontents*}

\begin{document}  
    \begin{figure}
        \includestandalone[mode=buildnew]{diaa_pic}
    \end{figure}
\end{document}

答案1

问题是由于主文档的编译导致diaa_pic.pdf创建了一个文件,而该文件在下一次编译期间被读入。该文件中编码了创建日期等,因此每次运行后它都会发生变化pdflatex,即使视觉形式没有变化。 Latexmk发现文件在编译后发生了变化,因此它决定需要再次运行。

(顺便说一下,该文档\usepackage{tikz}在编译之前需要几行。)

两种解决方案:

  1. 简单的:安排latexmk忽略文件中的相关行pdf。为此,请将以下几行放入 latexmkrc 文件中:

     $hash_calc_ignore_pattern{'pdf'} = '^/(CreationDate|ModDate|ID)';
     # Also apply the same idea to eps files, so that this code works with latex
     $hash_calc_ignore_pattern{'eps'} =  '^(%%CreationDate: |%DVIPSSource: )';
     # In compilation, -shell-escape has to be used:
     set_tex_cmds( '-shell-escape %O %S' );
    
  2. 想要:在 latexmk 发行版的目录中查找example_rcfiles文件tikz-externalized-latexmkrc,然后使用您需要的内容。(该文件和目录可以doc/support/latexmk在 TeXLive 或 MiKTeX 发行版的相关部分下找到。) 但请注意,此解决方案需要增强才能处理该问题中的特定文档。

答案2

感谢约翰的回答,我意识到设置选项filecontents会使每次运行都overwrite生成更新版本(具有相同内容)。diaa_pic.tex

通过传递mode=buildnew\includestandalonelatexmk将被迫在每次运行时创建图像,diaa_pic.pdf因为它的tex源比它更新。

因此,删除该overwite选项就足以使一切按预期工作。

相关内容