为什么 TeX 不能向我们显示实际的“未定义的控制序列”?

为什么 TeX 不能向我们显示实际的“未定义的控制序列”?

这是一个关于 TeX 系统内部结构的问题,而不是如何使用它的问题。每次在文档中使用未定义的控制序列时,TeX 都会打印以下消息

undefined control sequence [<code>]

其中<code>通常是包含导致错误的实际控制序列的代码摘录。

然而,很多时候,TeX 似乎无法给我们提供准确的错误消息。beamer例如,在演示文稿中经常会出现这种情况,我们得到的只是

undefined control sequence [\end{frame}]

当然,在这个例子中,\end是定义的,问题出在环境中的某段代码上。这种情况也经常发生在从复杂宏扩展的未定义控制序列中。

我理解这种行为可能来自于环境中 token 扩展的复杂性frame,但是由于 TeX 本身正在扩展 token,那么打印 token 的名称有多难呢?实际的未定义的控制序列?这对于调试目的非常有用。

那么,TeX 不打印实际上未定义的控制序列是否存在技术原因,或者是故意这样做的?

答案1

一般来说,如果你在正确的地方寻找,你就能找到未定义的控制序列。这是一个简单的beamer文档:

\documentclass{beamer}
\begin{document}
\begin{frame}
\frametitle{A title}
\foo
\end{frame}
\end{document}

以及它产生的错误:

./undefined.tex:6: Undefined control sequence.
\beamer@doifinframe ...\frametitle {A title} \foo 
                                                  \end {beamer@frameslide}
l.6 \end{frame}

未定义的控制序列是错误报告的第一行代码中的最后一个控制序列。事实上,这是相当一致的,如果你向 TeX 寻求有关错误的帮助(通过h在控制台中输入),它正是告诉你的:

The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

因此,您可以知道实际有问题的未定义控制序列,只需知道在哪里查找即可。不幸的是,许多编辑环境会隐藏或以其他方式过滤控制台输出,因此也许这就是为什么它似乎没有报告有问题的命令的原因。

这并不是说 TeX 中的所有错误都很容易诊断;事实并非如此,因为通常发现错误的行位于导致错误的行之后。但对于未定义的控制序列,情况并非如此。

相关内容