在出现错误的 tex 文件上运行 latexmk 时,第二次运行不会报告任何错误

在出现错误的 tex 文件上运行 latexmk 时,第二次运行不会报告任何错误

我在 Jenkins 服务器上使用 latexmk 将大量 tex 文件编译为 PDF,其中一些 tex 文件已知有错误。我想尽可能减少构建时间,为了实现这一点,我尝试在运行前不清理 latexmk (-gg) 选项,但这会在第二次运行时给出错误的输出。

考虑以下 tex 文件

\documentclass{article}
\usepackage{graphics}
\begin{document}
Trying to include missing file

\includegraphics{missing_file}
\end{document}

如果我运行这个

latexmk -latexoption=-interaction=nonstopmode mwe.tex

第一次返回

<lines deleted...>
latex: Command for 'latex' gave return code 256
Latexmk: Use the -f option to force complete processing,
unless error was exceeding maximum runs of latex/pdflatex

第二次(没有报错,返回码为0)

Latexmk: This is Latexmk, John Collins, 10 Nov 2013, version: 4.39.
**** Report bugs etc to John Collins <collins at phys.psu.edu>. ****
Latexmk: All targets (mwe.dvi) are up-to-date

有没有办法避免这种行为而不使用-gg选项


更新:

我尝试echo X|latex -interaction=errorstopmode mwe.tex在 Ubuntu 和 Windows 上运行并且它确实有效,即它确实产生了任何输出文件。

然而,使用真实的 tex 文件,会生成 dvi 文件。我将尝试想出一个发生这种情况的 MWE。

答案1

对于那些“已知包含错误”的文件,它们是您想要修复的错误,还是它们会永远留在这里?

显然,即使出现错误,nonstopmode和都会生成输出文件。这会让人误以为文件实际上是最新的。batchmodelatexmk

因此,作为第一种情况下的肮脏的解决方法(您将在某一天修复错误),您可以使用以下任一命令行进行编译:

echo X | latex -interaction=errorstopmode main.tex
echo X | latex -interaction=scrollmode main.tex

效果是在X编译器第一次(也是最后一次)询问问题时发出(中止编译),即如果出现错误*。使用errorstopmode,它会在任何错误时取消编译,而使用 ,scrollmode它只会在出现严重错误(如文件丢失)时取消编译。

要与 一起使用latexmk,您可以添加以下.latexmkrc行:

$latex = 'echo X | latex -interaction=errorstopmode %O %S';

结果是所有有错误的文件都不会产生任何输出。


如果即使出现错误您仍希望获得输出,或者修复错误不是一种选择,则问题会变得更加困难,因为latexmk必须将“已知”错误与不需要的错误区分开来。

您可以使用-f命令行开关(强制处理)来完全latexmk忽略错误。我不确定这是否会再次使构建时间过长。

或者,您可以尝试向编译器隐藏已知错误。例如,对于丢失的文件,您可以按照这个问题


*。如果您在创建文档时将交互用于其他目的,它将不起作用。但那为什么要使用呢latexmk

相关内容