![抑制输出](https://linux22.com/image/296905/%E6%8A%91%E5%88%B6%E8%BE%93%E5%87%BA.png)
是否有可能制作一个包装脚本,或者是否存在用于 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
,包括错误消息,因此在使用 过滤它们之前,您会丢失它们grep
。 latexmk
似乎有选项可以让它调用的程序安静下来,例如latex
和makeindex
,但没有选项可以让它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 输出的设置。
笔记:我刚刚想到这个,还没有在实践中测试过。如果可以的话,请指出问题。