![texdef 可以强制显示环境的完整定义吗?](https://linux22.com/image/245262/texdef%20%E5%8F%AF%E4%BB%A5%E5%BC%BA%E5%88%B6%E6%98%BE%E7%A4%BA%E7%8E%AF%E5%A2%83%E7%9A%84%E5%AE%8C%E6%95%B4%E5%AE%9A%E4%B9%89%E5%90%97%EF%BC%9F.png)
当使用texdef
环境定义时,有时不会显示所有相关的行。我猜这与定义的书写方式有关。当环境定义为
\def\environmentname{A}
\def\endenvironmentname{B}
或
\def\environmentname{A}
\let\endenvironmentname B
然后texdef
仅返回A
(而不是B
)。是否可以texdef
同时返回A
和B
?这是有道理的,因为想要查找环境定义的人想知道整个环境的定义,即开始和结束。
例如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 原语 来实现这一点,它显示内部定义,而不是原始源代码。您需要手动使用 来获取环境的开始和结束代码的定义。\foo
texdef foo
\show
texdef 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
(可以在命令行中请求任意数量的命令)。