捕获 LaTeX 错误/警告

捕获 LaTeX 错误/警告

有没有办法在编译期间捕获 LaTeX 中的错误/警告?我正在考虑类似于 VB 脚本的东西On Error Goto <blah>,但这次是针对 LaTeX 的,类似于\OnErrorExecute{<command>}\OnWarningExecute{<command>}

遗憾的是,没有提供标准错误/警告代码(据我所知),因为软件包通过命令报告警告/错误

\PackageError{<message>}
\PackageWarning{<message>}

我所说的代码是指,例如,

  • 警告1 Underfull \hbox...:;
  • 警告2 Overfull \hbox...:;
  • ...
  • 错误1 No \begin{document}:;
  • 错误2 Perhaps a missing \item...:;
  • 错误3:File ended while scanning...

因为人们理想情况下希望根据产生的错误/警告类型进行条件化。可以理解的是,需要一种新的错误/警告报告机制,因为允许软件包作者随意发出警告/错误。因此,可以使用一些数字前缀将警告/错误设置为特定于软件包的(例如,amsmath.warning.1对于使用该amsmath软件包的警告 1)。

如果这个版本没有(可能),那么 LaTeX3 呢(希望如此)?

答案1

(部分采纳评论来做出回答。)

LaTeX 运行时会出现各种不同类型的错误、警告和消息。在 TeX 级别,您可能会收到类似 或 的警告Underfull \hbox...以及类似 的错误File ended while scanning...。这些无法在 LaTeX 端更改。*

在 LaTeX 层面,最多消息是使用\PackageError和类似的宏生成的。您可以重新定义这些,但更简单的方法是使用silence包。它提供了一组预先构建的宏,以选择性的方式执行此重新定义,从而允许“过滤掉”不需要的消息。

转向 LaTeX3,代码中采用的方法是将消息(所有类型)的定义与其使用分开。这意味着每条消息都有一个“名称”,可用于在给出消息时改变消息的行为。因此,我们可能会

\msg_new:nnnn { module } { my-message } { Some~text } { Some~more~text }

定义一条消息,使用

\msg_error:nn { module } { my-message } 

何时使用。如果没有过滤,这将引发错误。但是,我们可以使用以下方法改变行为

\msg_redirect_class:nn { error } { warning }

将所有错误转为警告,或者使用

\msg_redirect_module:nnn { module } { error } { warning }

改变那些消息module,甚至

\msg_redirect_name:nnn { module } { my-message } { warning }

只针对一条消息。正如 Bruno 所说,过滤行为目前可能并不理想,但我认为分离的想法是值得拥有的。仍然需要以这种方式编写一个“用户级”过滤界面。(注意。可以在加载模块之前应用重定向:有助于摆脱加载时消息。所使用的机制将消息文本定义和重定向分开。)

[*] 使用 LuaTeX 可以改变引擎的行为方式。我不确定目前是否有适合上述消息的钩子,但我认为这是可能的。我假设在我的回答的其余部分我们正在讨论跨引擎解决方案。

相关内容