抑制输出

抑制输出

是否有可能制作一个包装脚本,或者是否存在用于 latexmk 的标志序列 -XYZ(查看手册,似乎不存在),以便命令按以下方式运行:

~/latexmk -XYZ bla.tex
~/

如果文件中没有错误。(因此 latexmk 不会给出任何响应),并且

~/latexmk -XYZ bla.tex
Error on line 54 in file bla.tex
~/

如果有错误。

如果没有无用的输出那就太好了。

答案1

阅读文档会得到一些有用的信息。例如,使用标准(pdf|lua)latex选项,我们立即得出以下内容:

pdflatex -interaction="batchmode" myfile.tex

这将产生一条非常简短的消息,说明程序的名称、版本、是否启用了受限模式\write18以及它正在进入扩展模式。它会抑制所有其他输出。latexmk文档提供了选项-silent,它可以抑制大量输出,但不是全部。

但是,这些选项都无法让错误通过,而且不幸的是,TeX 不是为区分stderr和 的系统编写stdout的,因此标准输出重定向选项在这里不起作用。您可能不得不过滤输出来实现这一点。幸运的是,这并不太难。假设您使用的是某种类似于 bash 的 shell:

pdflatex -halt-on-error file.tex | grep -A3 '^!'

就可以了。它完全是静默的,除非它遇到错误(以“!”开头的行),此时它会大声停止,吐出声明错误的行以及以下三行。

我对 不是很熟悉latexmk,稍微摆弄了一下就发现,除了它调用的程序的输出之外,它似乎还会产生大量输出。重定向latexmk的输出会捕获全部的输出latex,包括错误消息,因此在使用 过滤它们之前,您会丢失它们greplatexmk似乎有选项可以让它调用的程序安静下来,例如latexmakeindex,但没有选项可以让它latexmk自己安静下来。因此,您可能需要编写一个脚本,以与上述命令类似的方式pdflatex,让您实际调用的程序安静下来。类似的东西:

#!/bin/bash
pdflatex -halt-on-error file.tex | grep -A3 '^!'
makeindex file.idx &> /dev/null
pdflatex -halt-on-error file.tex | grep -A3 '^!'

makeindex将所有消息发送到stderr,因此您需要与号(或“2”)才能使其工作。)

答案2

根据@dgoodmaniii 的回答,我进行了一些实验latexmk,这个latexmkrc文件似乎可以使 LaTeX 输出安静,但仍然会打印任何错误消息。

$pdflatex = "! xelatex -halt-on-error %O %S | grep -A3 '^!'";
$pdf_mode = 1;
$postscript_mode = 0;
$dvi_mode = 0;

我正在运行 XeLaTeX,但如果你将xelatex上面的内容更改为pdflatex,它应该可以正常工作,它应该可以同样适用于 pdfLaTeX。

上述工作通过将 XeLaTeX 输出通过管道传输到grep(正如 dgoodmaniii 所描述的,但在内部latexmk)并且仅从xelatex输出中提取以!+ 3 行上下文开头的行。

!在命令开头添加的反转命令的退出状态。这是必要的,因为它latexmk会监听返回代码,grep如果返回代码为真,则返回 0(=true)。找到以以下项开头的行!否则为 1 (=false)。因此,如果存在,则通过反转退出状态latexmk将看到 1因为发现错误而匹配,否则为 0。

边注:附加的$pdf_mode$postscript_mode$dvi_mode只是用于告知latexmk仅期望 PDF 输出的设置。

笔记:我刚刚想到这个,还没有在实践中测试过。如果可以的话,请指出问题。

相关内容