我如何才能看到受保护命令(如 \LaTeX)的“实现”?

我如何才能看到受保护命令(如 \LaTeX)的“实现”?

在阅读了另一个有关如何查看命令定义的问题后,我尝试:

\documentclass{article}
\begin{document}
\show\LaTeX
\end{document}

但这在我的日志文件中显示:

\LaTeX=macro:
\protect \LaTeX

我只是想看看内心\LaTeX深处的命令最终会说“好的,把‘L’变大,然后把‘a’稍微凸起一点,然后……”

答案1

有些宏被定义为健壮的,方法是将其扩展为,\protect后面跟一个名称几乎相同但以空格结尾的宏!定义和使用此类宏时必须特别小心,因为宏名称中通常不允许有空格。如果将此类宏写入外部文件(.aux、、.toc...),则空格不再作为宏名称的一部分,因此会再次调用原始宏。

要查看此类宏的定义,您需要使用以下代码:

\expandafter\show\csname LaTeX \endcsname

\csname <text>\endcsname用于构建一个宏,\<text>该宏可包含非字母,如数字或空格。在执行之前\expandafter,需要将 扩展\csname LaTeX \endcsname(注意 后面的空格X)至\LaTeX (还要注意此处的空格) 。\show

我还编写了一个名为texdef显示这样的定义:

 texdef -t latex LaTeX

texdef -t latex您也可以写出latexdef该名称是否已安装)

\LaTeX这将显示并检测它调用的定义\LaTeX 并显示它的定义。

$ texdef -t latex LaTeX

\LaTeX:
macro:->\protect \LaTeX  


\LaTeX :
\long macro:->L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX 

或者使用引号明确添加空格:

 texdef -t latex 'LaTeX '

答案2

马丁对重新定义的回答的另一种解释\protect是:

\begingroup
  \let\protect\show
  \LaTeX
\endgroup

(该组不是强制性的,但意味着您可以继续处理文档而不会出错。如果您只是制作一个简短的“测试”文档,您可能会错过它。)

答案3

除了 Martin 的解决方案之外,还有一个show2e我经常使用的包:

% \usepackage{show2e}
\showcmd\LaTeX

编译时,它首先获取

> \LaTeX=macro:
->\protect \LaTeX  .

进而

> \LaTeX =\long macro:
->L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize
\sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX .
<argument> \LaTeX  

答案4

有一个程序texdef这使得这一点马丁在他的回答中提到。

我只想补充一点,当我们的朋友史密斯存在于社区聊天室,您可以texdef通过在聊天中发布以下格式的消息来运行:

!!/texdef -t latex -p multicol multicols

multicols(此命令将显示包中的环境定义multicol

相关内容