在哪里可以找到命令/环境是如何定义的?

在哪里可以找到命令/环境是如何定义的?

假设我想重新定义itemize环境,或者制作它的修改版本。我想知道它目前是如何定义的。我在哪里可以找到这些信息?如果是某个特定的包命令,我可以查看.sty该包的文件,但如果是更基本的东西,我不知道在哪里查看...

有没有一本参考手册可以解释所有这些内容?或者在我的 texmf 树深处是否有一个文件可供我查阅?

答案1

LaTeX 本身有文档记录source2e.pdftexdoc source2e)和标准类(,,,article等)记录在bookreportclasses.pdftexdoc classes)。

答案2

要了解命令是如何定义的,可以使用以下命令\show

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

日志文件将显示:

> \itemize=macro:
->\ifnum \@itemdepth >\thr@@ \@toodeep \else \advance \@itemdepth \@ne \edef \@
itemitem {labelitem\romannumeral \the \@itemdepth }\expandafter \list \csname     @itemitem \endcsname {\def \makelabel ##1{\hss \llap {##1}}}\fi .
l.3 \show\itemize

要找到包含定义的文件,该脚本texgrep很有用,我发布了该脚本来回答这个主题:查找整个 texmf 树

答案3

现在(la)texdefCTAN 上的脚本可用于显示 (La)TeX 定义。当前版本还支持显示定义宏的包,但您需要声明要加载的包列表。itemize用法如下

latexdef -f itemize

或者,如果仅texdef由你的发行版安装(latexdef仅是一个激活 LaTeX 模式的符号链接texdef):

texdef -t latex -f itemize

打印结果为:

\itemize is defined by (La)TeX.

\itemize:
macro:->\ifnum \@itemdepth >\thr@@ \@toodeep \else \advance \@itemdepth \@ne \edef \@itemitem {labelitem\romannumeral \the \@itemdepth }\expandafter \list \csname \@itemitem \endcsname {\def \makelabel ##1{\hss \llap {##1}}}\fi

要显示任何包中任何宏的定义,请使用:

latexdef -p package macro

请参阅latexdef --help以了解更多信息。


-s使用 2012/05/02 的 v1.6,您还可以使用/选项获取大多数宏的原始源代码--source

$ latexdef -f itemize -s -E
% latex.ltx, line 4556:
\def\itemize{%
  \ifnum \@itemdepth >\thr@@\@toodeep\else
    \advance\@itemdepth\@ne
    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
    \expandafter
    \list
      \csname\@itemitem\endcsname
      {\def\makelabel##1{\hss\llap{##1}}}%
  \fi}

% latex.ltx, line 4565:
\let\enditemize =\endlist

% latex.ltx, line 4422:
\def\endlist{%
  \global\advance\@listdepth\m@ne
  \endtrivlist}

这里-E讲的itemize是一个环境。

答案4

这些答案都不太方便,所以我整理了一个小脚本它基本上会遍历整个 LaTeX(在我的例子中是 TeX Live,因此得名)安装并查找单个命令/环境名称。它识别一些(不是全部)定义命令和环境的方法(参见注释)。

这听起来工作量很大,但速度确实非常快。这不禁让你疑惑为什么 LaTeX “IDE” 不做类似的事情。

例如,在完整安装 TeX Live 后,你将获得

~$ tlwhich todo
Files that define command todo:
    easy-todo.sty
    lilyglyphsStyle.sty
    todonotes.sty
    todo.sty
    tudscrdoc.cls
    udesoftec.cls

Files that define environment todo:
    ed.sty

Files that provide a package with similar name:
    easy-todo.sty
    fixmetodonotes.sty
    todonotes.sty
    todo.sty

grep可以使用正则表达式(与 兼容):

~$ tlwhich "align(\*|ed)?"
Files that define command align(\*|ed)?:
    amstex.sty
    divers.sty
    dprogress.sty
    euro.sty

Files that define environment align(\*|ed)?:
    amsmath.sty
    amstex.sty

Files that provide a package with similar name:
    asyalign.sty

如果它没有找到应该找到的东西,请给我留言(或在 Github 上留言)。

相关内容