在非停止模式下使用 \show 会导致 TeXmaker 发出错误警报。有什么解决办法吗?

在非停止模式下使用 \show 会导致 TeXmaker 发出错误警报。有什么解决办法吗?

我目前正在阅读 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

相关内容