有没有办法在编译期间捕获 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 可以改变引擎的行为方式。我不确定目前是否有适合上述消息的钩子,但我认为这是可能的。我假设在我的回答的其余部分我们正在讨论跨引擎解决方案。