我目前正在阅读 TeXbook,我使用了\show
很多方法来了解 Knuth 如何根据 TeX 基元定义纯 TeX 宏。例如,要访问 的定义\centerline
,我会\show\centerline
在输入文件中写入。当我pdftex
从命令行(在我的情况下是 Unix 终端)以交互模式编译该文件时,TeX 会生成一条错误消息,向我显示终端中的 的定义\centerline
并提供一个选项菜单(如第 6 章所述:运行 TeX在 TeXbook 中)。
我理解 Knuth 的设计选择是让 TeX 为每个实例生成一个错误消息\show
:他可能想在\show...
让 TeX 恢复执行之前给用户一些时间来阅读终端中打印的内容,而不是仅在编译结束后才打开日志文件。
但是,\show...
输入文件中的实例会产生不良的副作用,即引发“错误”(误报(真的)pdftex
在 IDE 中调用时,例如 TeXmaker 带有选项-interaction=nonstopmode
。例如,
\show\centerline
\bye
当编译时pdftex -interaction=nonstopmode
导致 TeXmaker 报告
显然,这些误报在调试时确实很烦人。我总是不得不问自己:等一下...这些错误是由于\show
我的输入文件中的实例引起的,还是真正的错误?另一方面,我的理解是,你必须指定
-interaction=nonstopmode
如果您想从 IDE 中调用 pdftex。因此,我的问题是:
有什么方法可以阻止 TeXmaker 报告那些“误报”?
注意:我描述的问题也可能存在于 TeXmaker 以外的 IDE 中。
答案1
\show
使用与 TeX 处理错误消息相同的内部例程。现在看来,这似乎是一个设计错误,但人们必须始终记住,TeX 是在 1982 年发布的,当时的计算机内存比今天要少得多。
像 Texmaker 这样的前端原则上可以区分\show
(或\showthe
)给出的诊断消息和实际错误消息,因为前者以 开头>
,而后者以 开头!
。
但是,我发现\show
在非交互式会话中使用 很浪费时间,因为您无法添加其他命令。例如,如果您这样做\show\section
,您将受到
> \section=\long macro:
->\@startsection {section}{1}{\z@ }{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont \Large \bfseries }.
这不会告诉你太多含义和语法,除非你在提示符下添加,
i\makeatletter\show\@startsection
然后按照出现的其他宏进行操作。仅仅进行编译、查看日志文件并意识到需要其他\show
命令是一个非常繁琐的过程。
在这方面,一个很好的工具是texdef
:调用
texdef -t latex -c article \section
你会收到同样的信息;
texdef -t latex -c article -s \section
你甚至会得到
% article.cls, line 312:
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\bfseries}}
因此也会显示定义命令的位置(如果可能的话)。
你可以\show
使用\meaning
,而不是中断运行打印相同的信息。最好将调用包含在\texttt
命令中,例如
\texttt{\meaning\section}
(或{\tt\meaning\foo}
使用 Plain TeX)。但是,适用与 相同的限制\show
。