Knuth 在 TeXbook 的“第六章:运行 TeX”中说道:
错误消息当你没有做好准备时,可能会很可怕;但是它们只要你有正确的态度,就会很有趣。只要记住,你并没有真正伤害计算机的感情,而且没有人会因为这些错误而责怪你。然后你会发现运行 TeX 实际上是一种创造性的体验,而不是一件可怕的事情。
我们如何在 LaTeX 中生成有趣/意外的消息?
以下是我的看法:
\documentclass{article}
\newenvironment{foobar}{}{}
\begin{document}
\begin{foobar}
\end{\csname @currenvir\endcsname}
\end{document}
产量:
! LaTeX Error: \begin{foobar} on input line 7 ended by \end{foobar}.
消息内容如下:
执行-macro(不扩展它们)会触发从构成其参数的标记中
\begin
定义宏。\@currenvir
\end
通过调用内核宏来执行宏(而不扩展它们)会触发从形成其参数的标记中定义宏,然后通过进行比较。\@checkend{⟨tokens that form the argument of the
\end
-macro⟩}\reserved@a
\reserved@a
\@currenvir
\ifx
如果比较产生了-branch
\else
,那么就会传递错误消息。\@badend{⟨tokens that form the argument of the
\end
-macro⟩}! LaTeX Error: \begin{⟨tokens coming from expanding \@currenvir which in turn was defined from the tokens that form the argumment of the \begin-macro⟩} on input line 7 ended by \end{⟨tokens that form the argument of the
\end
-macro⟩}在上述场景中,构成 -macro 参数的标记集
\begin
与构成 -macro 参数的标记集不同\end
。因此,\ifx
由 触发的 -comparison介于 (其定义来自构成-macro 参数的标记)和 (其定义来自构成 -macro 参数的标记)\@checkend
之间,通过 传递错误消息,从而 和扩展为相同的文本短语。\@currenvir
\begin
\reserved@a
\end
\@badend
⟨tokens coming from expanding \@currenvir which in turn was defined from the tokens that form the argumment of the \begin-macro⟩
⟨tokens that form the argument of the
\end
-macro⟩
\documentclass{article}
\let\elsecopy\else\AtEndDocument{\def\else{\let\else\elsecopy}}
\begin{document}
\end{document}
产生以下错误消息:
! LaTeX Error: \begin{document} ended by \end{document}.
在此示例中,您也会在追踪事物时偶然发现\ifx
-comparison 所做的比较:\@checkend
为了确定- 和- 宏是否使用相同的参数而进行的 - 比较,\else
并不被视为在- 条件不满足的情况下引入分支的东西。\ifx
\@checkend
\begin
\end
\ifx
希望有更多有趣的例子。:-)
答案1
> pdflatex funmessage
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./funmessage.tex
LaTeX2e <2021-06-01> patch level 1
L3 programming layer <2021-06-18>
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/02/12 v1.4n Standard LaTeX document class
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/size10.clo))
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.3 \begin{document}
请注意,编译器会停止\begin{document}
提示它缺失。
如何获得?很简单!
\documentclass{article}
\renewcommand{\fi}{fi}
\begin{document}
Foo
\end{document}
永远不要执行\renewcommand
你不知道的命令。