为什么在 expl3 中使用 \msg_error:nn(nnnnn)?

为什么在 expl3 中使用 \msg_error:nn(nnnnn)?

expl3有几种在执行过程中可能发出的错误/警告类型,特别是:

  • \msg_fatal:nn(nnnn)停止执行;
  • \msg_critical:nn(nnnn)停止扫描当前文件;
  • \msg_error:nn(nnnn)中断 TeX 运行,但不打断它。

我不明白\msg_error:nn(nnnn)超过\msg_critical:nn(nnnn)或的好处\msg_fatal:nn(nnnn):在退出之前收集尽可能多的错误似乎是合理的,以便为用户提供更详细的反馈,但通常只有第一个错误才有意义,后面的错误只是第一个错误的直接后果。此外,即使生成的 PDF 肯定无效,强迫 TeX 扫描整个文档也只是浪费时间。

\msg_error:nn(nnnn)与其他错误消息类型相比,使用它们是否有一些正当的理由?

答案1

siunitx之所以存在差异,是因为人们可以想象不同的情况。以

  • 数字解析器可能会得到它不喜欢的东西(1.2.3)。这是一个错误,但只是局部错误,可以通过发出错误然后继续来处理:\msg_error:nn(nnnn)

  • 可用的版本expl3可能太旧:阻止加载siunitx但可能不会造成更广泛的致命影响(包可以加载但不能在文档中使用)\msg_critial:nn(nnnn):。

  • 类可能会加载siunitx并明确要求所有单位均使用 排版\unit。如果siunitx不可用或太旧,则会出现阻止程序:\msg_fatal:nn(nnnn)

答案2

在许多情况下,您可能希望给出错误,但可以正常恢复,而不会从 tex 的内置恢复中触发一系列虚假错误。它基本上相当于\PackageError经典的 2e 编程。

考虑一个丢失的图形文件:您可能想要给出错误,但仍然可以在排版一些标记后干净地跳过图形包含。如果用户希望滚动过去,您不需要终止整个运行。

答案3

TeX 从一开始就是这样的。

出现错误消息后,您将有机会(如果在交互模式下运行)尝试从错误中恢复。一个简单的控制序列名称输入错误,通常的例子是\hobx可以通过输入来恢复

I\hbox

并按下回车键。对于其他错误,这可能更困难,但系统会向您显示 TeX 停止的位置,在某些情况下,您可以通过输入数字并按下回车键从输入流中删除一些字符。 “缺失$”错误将产生无效输出,但大多数情况下可以恢复。

在编写 TeX 时,计算机时间非常昂贵。您通常坐在连接到大型计算机的终端前,会话时间有限。终端通常没有图形功能,并且只能以不太友好的方式显示输出。因此,在运行期间尽可能多地捕获错误是一项非常重要的功能。

如今,大多数 TeX 运行都是通过前端完成的,通常使用标志调用 TeX -interaction=nonstopmode。您也可以使用-interaction=errorstopmode,这样第一个错误就会停止运行。

如果能够读取日志文件,也许借助某些过滤程序(例如)texloganalyser,可以在单个会话中捕获多个错误。我不会担心您得到的无效 PDF:无错误的运行也可能产生错误的结果,无论如何都需要校对。

相关内容