错误来源及其解决方法

错误来源及其解决方法

这个问题“以前有人问过”捕获 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}

相关内容