![当构建错误发生时,如何轻松确定 latex 文件的全名?](https://linux22.com/image/269162/%E5%BD%93%E6%9E%84%E5%BB%BA%E9%94%99%E8%AF%AF%E5%8F%91%E7%94%9F%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BD%BB%E6%9D%BE%E7%A1%AE%E5%AE%9A%20latex%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%85%A8%E5%90%8D%EF%BC%9F.png)
我运行了递归 makefile 来构建我的大型树,该树包含数百个 latex 文件(我使用 latex 来做所有事情)。这些 makefile 遍历树并构建 pdf 文件,并使用 htlatex 生成 HTML 文件。
我遇到的问题是,当出现错误时,我总是很难找到实际导致了该错误的文件。
由于某种原因,Latex 不显示文件名,只显示错误和行号。
我一直觉得这很奇怪。给出文件名有多难?
例如,这是我现在遇到的一个错误:
(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd)
(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd)
! Missing \endcsname inserted.
<to be read again>
\protect
l.88 \end{tabularx}
所以现在我尝试通过向上滚动终端来查找文件名。但是生成的输出太多了,很多时候我都要花很长时间在缓冲区中上下搜索才能找到 latex 命令,以便找到发生错误时正在编译哪个文件。
是否有一个选项可以告诉 latex/pdflatex 仅显示实际使用的命令而不是所有其他日志记录,以便于查看命令,或者更好的是,是否有办法告诉它除了行号之外还显示文件名?
使用基于 texliver 2012 debian。
答案1
currfile
您可以通过\usepackage{currfile}
在文档中加载包并使用-interaction=errorstopmode
如下参数启动 LaTeX pdflatex -interaction=errorstopmode thesis.tex
。
出现错误时,按I
(大写“i”,如“Insert”)并插入以下内容:
\PackageWarning{Build error in File}{\currfilepath}
这将导致如下输出
Package Build error in File Warning: /home/myuser/theproblematicfile.pgf on input line 1.
您还可以使用输入重定向来自动执行此操作:
echo -e "I\n\\PackageWarning{Build error in File}{\\\currfilepath}" | pdflatex -interaction=errorstopmode thesis.tex
我不确定为什么currfilepath
我的 shell 中之前需要三个反斜杠(我期望两个反斜杠),但除此之外它在这里不起作用。
请注意,这不是使用宏的推荐方法PackageWarning
。也许一些比我更了解错误输出的人可以相应地改进这个答案(并删除此段落)。
更新 正如 egreg 指出的,我还没有明确写出来:这是一种解决方法,请按照建议创建并跟踪功能请求。每个人都可以受益。