texdef 可以强制显示环境的完整定义吗?

texdef 可以强制显示环境的完整定义吗?

当使用texdef环境定义时,有时不会显示所有相关的行。我猜这与定义的书写方式有关。当环境定义为

\def\environmentname{A}
\def\endenvironmentname{B}

\def\environmentname{A}
\let\endenvironmentname B

然后texdef仅返回A(而不是B)。是否可以texdef同时返回AB?这是有道理的,因为想要查找环境定义的人想知道整个环境的定义,即开始和结束。

例如texdef -t latex equation返回

\equation:
macro:->$$\refstepcounter {equation}

当相关行

\def\equation{$$\refstepcounter{equation}}
\def\endequation{\eqno \hbox{\@eqnnum}$$\@ignoretrue}

另一个例子是texdef -t latex enumerate返回

\enumerate:
macro:->\ifnum \@enumdepth >\thr@@ \@toodeep \else \advance \@enumdepth \@ne \edef \@enumctr {enum\romannumeral \the \@enumdepth }\expandafter \list \csname label\@enumctr \endcsname {\usecounter \@enumctr \def \makelabel ##1{\hss \llap {##1}}}\fi

当相关行

\def\enumerate{%
  \ifnum \@enumdepth >\thr@@\@toodeep\else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}%
  \fi}
\let\endenumerate =\endlist

答案1

正如 egreg 所述,像 这样的环境foo是由宏\foo和构建的\endfoo。如果您使用 ,texdef通常会打印 的定义。它通过使用 TeX 原语 来实现这一点,它显示内部定义,而不是原始源代码。您需要手动使用 来获取环境的开始和结束代码的定义。\footexdef foo\showtexdef foo endfoo

但是,从 2012/04/29 的 v1.5 开始,texdef现在有一个--source/-s选项,它将尝试显示定义的原始源代码。这是通过首先使用--find/-f选项找到包含宏的(第一个)定义的文件,然后扫描文件以查找定义来完成的。这适用于大多数 LaTeX 和 TeX 形式的宏定义,但尚未实现等,\newenvironment并且不会/永远不会适用于任何更改通常 catcodes 的定义,即逐字相关的宏。

使用此选项,您现在可以获得例如的确切位置和源代码enumerate

$ ./texdef -t latex -s enumerate
% latex.ltx, line 4545:
\def\enumerate{%
  \ifnum \@enumdepth >\thr@@\@toodeep\else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}%
  \fi}

这是有效的,因为使用了\def和 而不是。不支持使用 等进行的定义。如果另外使用该选项,则会给出完整的文件路径。\newenvironment\let-F

请注意,如果找不到源,--source/目前将不返回任何内容。您必须手动删除此选项才能获取未格式化的定义。我将尝试在未来版本中改进这一点。-s


更新2011/05/02:

我现在发布了texdef支持\newenvironment并遵循\let-s选项的 v1.6。此外,现在还有一个-E选项,它告诉脚本您正在请求环境。如果-s使用该选项并且未找到 LaTeX 环境定义,或者没有-s,则对于每个<command>给定的参数end<command>都会自动添加一个。

例子:

$ texdef -t latex -s -E enumerate 
% latex.ltx, line 4545:
\def\enumerate{%
  \ifnum \@enumdepth >\thr@@\@toodeep\else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}%
  \fi}

% latex.ltx, line 4554:
\let\endenumerate =\endlist

% latex.ltx, line 4422:
\def\endlist{%
  \global\advance\@listdepth\m@ne
  \endtrivlist}
$ texdef -t latex -s abstract
% article.cls, line 376:
  \newenvironment{abstract}{%
      \titlepage
      \null\vfil
      \@beginparpenalty\@lowpenalty
      \begin{center}%
        \bfseries \abstractname
        \@endparpenalty\@M
      \end{center}}%
     {\par\vfil\null\endtitlepage}

由于和,此处-E不需要选项。不过,添加它也不会有什么坏处。-s\newenvironment

答案2

texdef通过将请求的宏输入到具有适当格式的 TeX(如果使用选项调用,则输入 LaTeTe -t latex)。foo环境实际上是通过定义\foo和获得的\endfoo,因此询问

texdef -t latex foo

显示 的定义\foo。我相信当格式为 LaTeX 时,如果定义,texdef也会显示\endfoo。然而这可能会暴露问题。调用 并不难

texdef -t latex foo endfoo

(可以在命令行中请求任意数量的命令)。

相关内容