我的源文件基于该standalone
包。\documentclass
命令具体如下:
\documentclass[preview, convert={density=300}]{standalone}
如果源文件名为main.tex
,则编译它将生成main.pdf
和main.png
文件。
latexmk
仅在第一次main.png
创建后运行。但是,一旦我开始更新源文件(因此和main.pdf
)main.png
,它就会进入无限循环
我认为这是因为latexmk
错误地将该main.png
文件作为构建最终版本的源的一部分main.pdf
。
有没有办法排除某些文件不受监控latexmk
?我在里面搜索过,man latexmk
但没有找到“排除”的字样。
答案1
我可以用 重现此问题latexmk 4.35
。问题是创建的png
文件包含创建日期+时间元信息,该信息在每次运行时都会发生变化,并且latexmk
认为该png
文件是输入的一部分,而不是输出。我想不出一个合适的正则表达式来$hash_calc_ignore_pattern{'png'}
真正在正确的级别上解决这个问题,因为png
s 是二进制文件。
不过,我可以帮助您latexmk
忽略生成的png
文件。之所以latexmk
认为该png
文件是文档的输入,是因为在 中standalone.cls
,有像 这样的命令,它\IfFileExists{\outfile
带有各种形式的文件扩展名,用于检测转换是否成功。因此,据 所知pdflatex
,您在运行期间读取该文件,但它对您写入文件一无所知,因为这是在 TeX 引擎外部完成的。 该功能pdflatex
获取了该信息。禁用该功能(通过添加latexmk
到选项)意味着不知道该文件,因此在文件发生变化时无法重新运行。我不知道 中是否有任何功能允许您指定“忽略依赖项”列表,您可以在其中具体命名输出文件。recorder
recorder
-recorder-
latexmk
latexmk
png
latexmk
png
另外,从standalone
手册中可以看出:
standalone
再次执行相同的 LaTeX 编译器(例如pdflatex
),作为子进程,对当前文档进行完整编译。这是在加载独立类时完成的,因此主编译器实例仍处于 状态,\documentclass
尚未打开输出文件进行写入。使用子进程编译文档后,将执行外部转换工具。如果需要,还会dvips
预先执行类似的中间转换。最后,主编译器运行终止而不产生任何输出,保持子进程生成的输出文件不变。这种实现的一个缺点是子进程创建的文件会被主进程覆盖,并且不包含有意义的信息。可以通过使用转换设置为子进程log
设置不同的设置来解决这个问题。jobname
subjobname
注意,这是指pdflatex
在子作业上运行,而不是latexmk
!由于latexmk
依赖于文件中的信息log
,我们应该遵循对子流程使用不同作业名称的建议。
因此,有两个步骤似乎可以解决现阶段的问题:
- 使用中的
subname
选项进行设置。convert
standalone
- 传递
-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 文件,可能更改Hello
为Hello world
并重新运行相同的latexmk
命令行。如果-recorder-
使用,则一切正常,否则则不行。但现在请记住,输出图像具有不同的文件名(-converted
附加)。
答案2
使用不同子作业名的解决方案至少在最简单的情况下有效。但是,如果不使用记录器选项,它就不会提供latexmk
有关依赖文件的完整信息。此外,实际所需的输出.png
文件不是pdflatex
由直接控制的运行生成的latexmk
,因此latexmk
可能会有误导性的依赖信息:例如,它不知道生成文件.aux
的运行所使用的实际文件。pdflatex
.png
原始示例中使用的安排是,包使用特殊命令行standalone
执行辅助运行,然后运行程序将文件转换为文件。另一种安排是使用合适的配置将所有工作交给。我有一个文件,内容如下:pdflatex
.pdf
.png
latexmk
latexmkrc
$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 进行一些更改。