这个问题“以前有人问过”捕获 LaTeX 错误/警告但我想更具体一点。我在 Linux 上只使用 lualatex。
在我的使用中,正确编译的 lualatex 文档在其末尾添加了专有的“批准印章”,使用immediate\write
。这可以加快 PDF 发送时的工作流程。“批准印章”并不意味着文件看起来很漂亮或具有有意义的内容。它仅表示 PDF 是根据某些标准处理的,这些标准超出了 TeX 的范围。
如果编译抛出 ClassError 或 PackageError,我可以使用宏来捕获它们(我相信)etoolbox
。\pretocmd
我添加的代码将二进制标志设置为 true。该标志表示抛出了错误。如果设置了标志,当处理到达写入“批准印章”的点时,它不会这样做。可能仍会得到 PDF,但没有印章。
但我发现也有一些错误不是来自软件包,我可以轻松识别它们。我猜它们来自裸机二进制文件。有办法解决这个问题吗?这是我的问题。
注意:我可以将 lualatex 作为 BASH 脚本的子进程启动,并以此方式处理它。这样我就可以在 lualatex 命令行上放置选项,在完成后检查日志文件,并在出现错误时删除 PDF。这似乎有点残忍。但我无法--shell-escape
在文档中使用。
我不在乎致命错误。它们不会达到“批准印章”阶段。
还请注意,我不是唯一的用户。虽然我知道遇到任何错误时应该暂停,但其他用户可能只需按回车键并继续。
答案1
您可以使用来show_error_hook
跟踪是否发出错误:
\documentclass{article}
\directlua{
local error_seen = false
local true_cmd = token.create'use_i:nn'
local false_cmd = token.create'use_ii:nn'
local id = luatexbase.new_luafunction'iferrorsissued'
token.set_lua('iferrorsissued', id)
lua.get_functions_table()[id] = function()
token.put_next(error_seen and true_cmd or false_cmd)
end
luatexbase.add_to_callback('show_error_hook', function()
error_seen = true
texio.write('.')
tex.show_context()
end, 'track_errors')
}
\begin{document}
Before
\iferrorsissued{Something bad happened}{All fine so far}
Some_error
\iferrorsissued{Something bad happened}{All fine so far}
\end{document}