如何使 texdef 返回缩进的定义?

如何使 texdef 返回缩进的定义?

使用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)。

相关内容