pdflatex bash 脚本可以抑制除错误消息之外的所有输出吗?

pdflatex bash 脚本可以抑制除错误消息之外的所有输出吗?

我有一个 bash 脚本,我用它来用 pdflatex 编译文件两次(以确保它正确地整理引用等)。这是我使用的“latexbuild”脚本:

module load ctan
pdflatex --shell-escape --interaction=nonstopmode $1
bibtex $1
pdflatex --shell-escape --interaction=nonstopmode --interaction=batchmode $1

然后我将使用 调用此脚本latexbuild test.tex。它会产生很多我想抑制的输出,除了我想看到的错误消息。有没有办法只允许显示错误消息?

答案1

您可以使用-file-line-error选项,然后grep输出该形式的内容filename:##:error code(下面我只使用正则表达式.*:[0-9]*:.*。在一些测试中效果很好。

注意,bibtex是在.aux文件上运行,而不是在.tex文件本身上运行。对于它,使用该-terse选项可能就足够了。

最后,我不知道你module load ctan做了什么(--我没有这样的程序--),所以我将其排除在外。

#!/bin/bash
ARGUMENT="$1"
#determine aux name by stripping .tex suffix and adding .aux
AUXNAME="${ARGUMENT%.tex}.aux"
pdflatex -shell-escape -interaction=nonstopmode -file-line-error "$ARGUMENT" | grep ".*:[0-9]*:.*" 
bibtex -terse "$AUXNAME"  
pdflatex -shell-escape -interaction=nonstopmode -file-line-error "$ARGUMENT" | grep ".*:[0-9]*:.*" 

如果您想要了解有关错误消息的一些上下文,而不仅仅是一行,您可能需要尝试使用-A-B选项。grep

我还会尝试使用 if 结构或检查退出状态来确定是否应该执行最后两个步骤。(例如,如果在第一次运行中发现错误,则不要执行第二次运行,等等。)如果需要,我可以提供更多详细信息。

编辑:刚刚看到你关于警告的评论。上面的内容只会捕获真正的错误。我不确定警告消息是否有标准,但搜索“警告”一词可能就足够了。所以它就像这样:

#!/bin/bash
ARGUMENT="$1"
#determine aux name by stripping .tex suffix and adding .aux
AUXNAME="${ARGUMENT%.tex}.aux"
pdflatex -shell-escape -interaction=nonstopmode -file-line-error "$ARGUMENT" | grep -i ".*:[0-9]*:.*\|warning" 
bibtex -terse "$AUXNAME"  
pdflatex -shell-escape -interaction=nonstopmode -file-line-error "$ARGUMENT" | grep -i ".*:[0-9]*:.*\|warning" 

答案2

texfot脚本由 Karl Berry 编写的 TeX Live 命令行工具最近被添加到了 TeX Live 中。

> texfot pdflatex eddy

哪里eddy.tex

\documentclass{article}
\begin{document}

A purposely overfull line
\makebox[1.1\textwidth]{x}

And an error
\abcdefghi

\end{document}

将在终端上产生以下输出:

/usr/texbin/texfot: invoking: pdflatex eddy
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
Overfull \hbox (156.0012pt too wide) in paragraph at lines 4--6
! Undefined control sequence.
l.8 \abcdefghi
! Emergency stop.
l.8 \abcdefghi
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on eddy.log.

尽管文档声称该--interactive选项允许在出现错误时停止,但这似乎不起作用(也许这将在下一个版本中修复)。

如果未设置环境变量,$TMPDIR/fot则“真实”终端输出可用。/tmp/fotTMPDIR

答案3

silence包裹提供了一种抑制 LaTeX 包和类警告和错误的方法。例如,命令

\WarningFilter{latex}{Marginpar on page}

latex会抑制所有以“...”开头的警告Marginpar on page。它并不总是完美的,但它似乎对你的情况有帮助。你也可以抑制全部使用\WarningsOff(或\ErrorsOff)发出警告(或错误)。请考虑阅读包装文档获得更多过滤选项。

答案4

新手尝试一些似乎有效的简单例子:

pdflatex a.tex | perl -0777 -ne 'print m/\n! .*?\nl\.\d.*?\n.*?(?=\n)/gs'

假设所有错误都是以下形式:

! Cryptic explanation
<maybe more cryptic explanations>
l.123 Undefined \asdfqwer
                          very very very very long line.

请立即改正。

编辑

正如我发帖后 egreg 所回答的那样,特克斯福特似乎是此尝试的一个超级高级版本,也基于“启发式”正则表达式过滤。TeX Live 2013 ISO 中没有,但如果可以使用,我更喜欢它。

相关内容