使用texdef
它很容易找到 (La)TeX 命令的定义。它可以显示给定命令的定义是什么。例如,如果我发出,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
问题是后者很难阅读,因为它只有一行长代码。在源代码中,它更容易阅读,因为它是缩进的。它的内容是:
\DeclareRobustCommand{\LaTeX}{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
返回缩进定义?
缩进定义更易于阅读。此外,如果您想使用缩进定义作为重新定义的基础,缩进定义是更好的选择,因为您不必亲自缩进它们,就能有效地使用它们。
答案1
自 v1.5 (04/2012) 以来,存在-s
/--source
选项,它将尝试定位宏的(第一个)原始定义并按源文件中的格式显示它。但是,由于 TeX 的动态特性,这不适用于所有宏。特别是逐字和类似的特殊宏无法被正确解析。texdef
如果此功能失败,则定义将以“正常”方式打印,因此无论如何使用此选项都是安全的。
对于示例\LaTeX
宏,其看起来如下:
$ latexdef -s LaTeX
% latex.ltx, line 1328:
\DeclareRobustCommand{\LaTeX}{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}
如果-F
还使用该选项,则会显示完整的文件路径,如果您想仔细查看源代码,这将很有用。
$ latexdef -Fs LaTeX
% /home/texlive/2012/texmf-dist/tex/latex/base/latex.ltx, line 1328:
\DeclareRobustCommand{\LaTeX}{L\kern-.36em%
...
答案2
为了显示命令的定义,texdef
运行带有适当前导的 (La)TeX。然后它使用原语\meaning
在屏幕上显示定义。\meaning
宏的输出为
<token>:
<prefixes> macro:<parameter text>-><replacement text>
在“强健命令”的情况下,texdef
还显示内部命令,这就是为什么您会得到两行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
做不是查看文件,这几乎毫无意义:命令可以改变其含义(想想\maketitle
,它根据选项通过 定义两次)或者可能以与或宏article.cls
非常不同的方式定义。\def\macro
\newcommand
例如,你会绝不找到\def\mathrm
,\newcommand\mathrm
或\DeclareRobustCommand\mathrm
,按\mathrm
(默认)定义为
\DeclareSymbolFontAlphabet{\mathrm}{operators}
很多数学命令也是如此。因此“找到命令的确切定义位置”通常是无望的。
人们可能会考虑用“代码美化器”来过滤输出,如果这样的工具在 Perl 发行版中普遍可用的话(这确实是一个很好的功能texdef
)。