显示命令的来源

显示命令的来源

使用时renewcommand,有时我希望先检查某个特定命令的原始源代码(例如chapter在我更改它之前),这样我就可以确定我没有做出意外的更改。当我加载了很多包时,有时查看包的源代码来找到答案并不那么简单。有没有办法打印出用于定义特定命令的源代码?

答案1

  • 使用\meaning,\show来获取宏的含义。(参见 TeXbook 或 TeX by Topic)

  • 使用\the,\showthe获取寄存器的值。(参见 TeXbook 或 TeX by Topic)

  • 使用\tracingcommands\tracingmacros(参见 TeXbook 或 TeX by Topic)和trace包来在日志文件中获取更多信息。

  • 使用 eTeX 的\ifdefined\ifcsname参见 eTeX 手册)或 LaTeX 命令\@ifundefined(参见source2e)或\ifx\foo\undefined技巧来检查宏是否已定义。

  • 使用 LaTeX 命令\CheckCommand(如中所述clsguide)检查 LaTeX 宏的定义。

答案2

是的,使用\show\mycommand将会把宏定义打印\mycommand到控制台(您的.log文件)。

例如,编译

\documentclass{book}
\begin{document}
test
\show\chapter
\end{document}

输出

> \chapter=\long macro:
->\if@openright \cleardoublepage \else \clearpage \fi \thispagestyle {plain}\gl
obal \@topnum \z@ \@afterindentfalse \secdef \@chapter \@schapter .

到控制台。请注意,输出的对齐方式与在代码中输入时不同。因此,有时直接查看源代码更容易看到确切的结构(如果缩进正确)。以下是来自book.cls为了\chapter

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}

还请注意,使用\show仅显示给定宏的一个扩展级别。使用上面的示例,必须发出(例如)\show\@chapter和(通过和对进行\show\@schapter适当的类别代码修改)才能查看 中后续调用的含义。\makeatletter\makeatother\chapter

\meaning可以在类似的上下文中使用。


来自TeX 书(第 10 页):

您可以在运行 TeX 时显示控制序列的含义。如果您输入\show\cs\cs任何控制序列,TeX 将响应其当前含义。例如,\show\input结果为> \input=\input.,因为\input是原始的。另一方面,\show\thinspace产生

> \thinspace=macro:
->\kern .16667em .

这意味着\thinspace已被定义为 的缩写 \kern .16667em。通过输入,\show\kern您可以验证\kern 是原始的。 的结果出现在您的终端上以及运行 TeX 后获得的文件\show中。.log

答案3

您可以使用texdef在终端中打印定义。要将其与 LaTeX 定义一起使用,您必须使用选项调用它-t latex或使用相应的别名latexdef(如果您的系统上定义了别名)。

要检查 的定义,\chapter您可以发出texdef -t latex -c book chapter。您必须使用 选项调用它的原因-c book\chapter您似乎正在寻找的 已在那个类中定义。要检查在哪个文件中可以找到定义,请添加选项-f-F获取完整路径。在我的系统上texdef -t latex -c book -F chapter返回

\chapter first defined in "/usr/local/texlive/2011/texmf-dist/tex/latex/base/book.cls".

\chapter:
\long macro:->\if@openright \cleardoublepage \else \clearpage \fi \thispagestyle {plain}\global \@topnum \z@ \@afterindentfalse \secdef \@chapter \@schapter

如果您想要查看可用选项texdef或了解更多信息,您可以通过 访问其文档texdoc texdef

相关内容