趣味:我们如何在 LaTeX 中生成有趣/意想不到的消息?

趣味:我们如何在 LaTeX 中生成有趣/意想不到的消息?

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}.

消息内容如下:

  1. 执行-macro(不扩展它们)会触发从构成其参数的标记中\begin定义宏。\@currenvir

  2. \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⟩}

  3. 在上述场景中,构成 -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你不知道的命令。

相关内容