当指定非 PDF 输出时 latexmk 无限循环

当指定非 PDF 输出时 latexmk 无限循环

我的源文件基于该standalone包。\documentclass命令具体如下:

\documentclass[preview, convert={density=300}]{standalone}

如果源文件名为main.tex,则编译它将生成main.pdfmain.png文件。

latexmk仅在第一次main.png创建后运行。但是,一旦我开始更新源文件(因此和main.pdfmain.png,它就会进入无限循环

我认为这是因为latexmk错误地将该main.png文件作为构建最终版本的源的一部分main.pdf

有没有办法排除某些文件不受监控latexmk?我在里面搜索过,man latexmk但没有找到“排除”的字样。

答案1

我可以用 重现此问题latexmk 4.35。问题是创建的png文件包含创建日期+时间元信息,该信息在每次运行时都会发生变化,并且latexmk认为该png文件是输入的一部分,而不是输出。我想不出一个合适的正则表达式来$hash_calc_ignore_pattern{'png'}真正在正确的级别上解决这个问题,因为pngs 是二进制文件。

不过,我可以帮助您latexmk忽略生成的png文件。之所以latexmk认为该png文件是文档的输入,是因为在 中standalone.cls,有像 这样的命令,它\IfFileExists{\outfile带有各种形式的文件扩展名,用于检测转换是否成功。因此,据 所知pdflatex,您在运行期间读取该文件,但它对您写入文件一无所知,因为这是在 TeX 引擎外部完成的。 该功能pdflatex获取了该信息。禁用该功能(通过添加latexmk到选项)意味着不知道该文件,因此在文件发生变化时无法重新运行。我不知道 中是否有任何功能允许您指定“忽略依赖项”列表,您可以在其中具体命名输出文件。recorderrecorder-recorder-latexmklatexmkpnglatexmkpng

另外,从standalone手册中可以看出:

standalone再次执行相同的 LaTeX 编译器(例如pdflatex),作为子进程,对当前文档进行完整编译。这是在加载独立类时完成的,因此主编译器实例仍处于 状态,\documentclass尚未打开输出文件进行写入。使用子进程编译文档后,将执行外部转换工具。如果需要,还会dvips预先执行类似的中间转换。最后,主编译器运行终止而不产生任何输出,保持子进程生成的输出文件不变。这种实现的一个缺点是子进程创建的文件会被主进程覆盖,并且不包含有意义的信息。可以通过使用转换设置为子进程log设置不同的设置来解决这个问题。jobnamesubjobname

注意,这是指pdflatex在子作业上运行,而不是latexmk!由于latexmk依赖于文件中的信息log,我们应该遵循对子流程使用不同作业名称的建议。

因此,有两个步骤似乎可以解决现阶段的问题:

  • 使用中的subname选项进行设置。convertstandalone
  • 传递-recorder-选项来latexmk禁用该recorder功能pdflatex(因此生成的png文件不会被识别为依赖项)。

MWE(converttest.tex调用下面给出的命令行):

\documentclass[preview, convert={density=300,subjobname=\jobname-converted}]{standalone}
\begin{document}
    Hello.
\end{document}

latexmk命令行:latexmk -pdf -shell-escape -recorder- "converttest"

然后,更改 TeX 文件,可能更改HelloHello world并重新运行相同的latexmk命令行。如果-recorder-使用,则一切正常,否则则不行。但现在请记住,输出图像具有不同的文件名(-converted附加)。

答案2

使用不同子作业名的解决方案至少在最简单的情况下有效。但是,如果不使用记录器选项,它就不会提供latexmk有关依赖文件的完整信息。此外,实际所需的输出.png文件不是pdflatex由直接控制的运行生成的latexmk,因此latexmk可能会有误导性的依赖信息:例如,它不知道生成文件.aux的运行所使用的实际文件。pdflatex.png

原始示例中使用的安排是,包使用特殊命令行standalone执行辅助运行,然后运行程序将文件转换为文件。另一种安排是使用合适的配置将所有工作交给。我有一个文件,内容如下:pdflatex.pdf.pnglatexmklatexmkrc

$pdf_mode = 1;
$dvi_mode = $postscript_mode = 0;
$pdflatex =
   'pdflatex %O'.
      '"\\expandafter\\def\\csname sa@internal@rune\\endcsname{1}\\input{"%S"}"; '.
   'convert -density 300 %D -quality 90 %R.png';

和一个文档文件

\documentclass[preview]{standalone}
\begin{document}
\begin{equation}
   \label{eq:Emc2}
   E=mc^2.
\end{equation}
See (\ref{eq:Emc2}).
\end{document}

只需在文档文件上运行latexmk即可获得所需结果。无需额外选项。

请注意,配置的命令行pdflatex具有在类 UNIX 系统(例如,我已测试过的 OS-X,以及大概的 Linux)上工作的引用。它需要针对 MS-Windows 进行一些更改。

相关内容