我有一个 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/fot
TMPDIR
答案3
答案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 中没有,但如果可以使用,我更喜欢它。