![如何使用 -interaction=batchmode 但同时在出现错误时停止并显示到终端?](https://linux22.com/image/448691/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20-interaction%3Dbatchmode%20%E4%BD%86%E5%90%8C%E6%97%B6%E5%9C%A8%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E6%97%B6%E5%81%9C%E6%AD%A2%E5%B9%B6%E6%98%BE%E7%A4%BA%E5%88%B0%E7%BB%88%E7%AB%AF%EF%BC%9F.png)
我做了一个实验,发现使用-interaction=batchmode
lualatex 可以最大程度地减少我拥有的一个大型 latex 文件的编译时间。从 77 分钟减少到 45 分钟。全部在 Linux WSL-2 Ubuntu 20.04 上进行。这甚至比使用lualatex foo.tex >/dev/null
(55 分钟)更快,因为输出直接从源头消除,甚至不需要将输出重定向到/dev/null
http://latexref.xyz/Command-line-options.html
因此我想修改我的 Makefile 来使用它。最大的问题是,当错误发生时,我不再能在屏幕上看到它们。所有内容都进入日志文件。
有没有办法使用它-interaction=batchmode
但让它停止和在屏幕上显示错误?否则,我现在每次都必须打开日志文件来查看文件编译时是否有错误。
这并不切实际,因为我有数万个 Latex 文件需要编译,并且我需要在发生错误时停下来查看错误消息,而不是稍后再查看。
这是一个有错误的 MWE
\documentclass{report}%
\begin{document}
This is a test
\sin x
\end{document}
现在
>lualatex -interaction=batchmode foo.tex
This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)
restricted system commands enabled.
>
屏幕上什么都没显示。错误确实出现在日志文件中。我也试过了
>lualatex -halt-on-error -interaction=batchmode foo.tex
This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)
restricted system commands enabled.
>
有没有办法让批处理模式在屏幕上显示编译错误然后停止?
我只使用 Lualatex。
更新
感谢提示,只需检查 Lualatex 的存在状态即可确定它是否成功完成。无需查看日志文件。
答案1
如果您只想确定是否发生了错误,您可以查看命令的退出状态lualatex
:如果没有发生错误,则为 0,否则为 1。如果发生错误,您可以查看日志文件。
如果您想直接查看错误,您也可以使用 Lua 回调。
mybatchmode.lua
创建包含以下内容的文件
texconfig.interaction = 0 -- Activate batchmode
texconfig.halt_on_error = true -- Stop at first error
callback.register('show_error_message', function(...)
texio.write_nl('term and log', status.lasterrorstring)
texio.write('term', '.\n')
end)
callback.register('show_lua_error_hook', function(...)
texio.write_nl('term and log', status.lastluaerrorstring)
texio.write('term', '.\n')
end)
然后运行
lualatex -lua=mybatchmode.lua file
对于您问题中的示例文件,这将导致
This is LuaHBTeX, Version 1.15.0 (TeX Live 2022)
restricted system commands enabled.
! Missing $ inserted.
答案2
您可以使用
lualatex --interaction=batchmode file || cat file.log
所以它只显示登录错误