如何了解强大命令的定义?

如何了解强大命令的定义?

我知道,每当我想查看某个控制序列是如何\mycontrolsequence定义的,我可以使用

\show\mycontrolsequence

然后编译我的代码并查找 .log 文件。但是,强大的命令似乎不受 的影响\show。例如,如果我编译以下代码,

\documentclass{article}

\newcommand\mycommand{foo}
\show\mycommand

\DeclareRobustCommand{\myrobustcommand}{bar}
\show\myrobustcommand

\begin{document}
hello
\end{document}

我的日志文件包含

\mycommand=\long macro:
->foo.
l.4 \show\mycommand

\myrobustcommand=macro:
->\protect \myrobustcommand  .
l.7 \show\myrobustcommand

请注意,虽然 的定义\mycommand已暴露(foo),但\myrobustcommand的定义并未发生变化。

当然,在实践中,我总是可以确定在哪个文件中定义了给定的健壮命令,并在那里查找其定义。但是,找到相关文件可能并不明显。因此我的问题是:

是否有其他方法可以了解强命令的定义?

答案1

用 定义的命令\DeclareRobustCommand是间接定义的;当你说

\DeclareRobustCommand{\foo}{...}

LaTeX 定义\foo

\expandafter\def\expandafter\foo\expandafter{\expandafter\protect\csname foo \endcsname}

因此它在内部使用一个\foo 命令(其名称中带有尾随空格)并执行

\@namedef{foo }{...}

实际上,这只是一个粗略的近似值。因此,要找到实际定义,你必须说

\expandafter\show\csname foo \endcsname

情况是很多当你这样做时会变得更加复杂

\DeclareRobustCommand{\foo}[1][default]{...}

因为上述命令不会回答任何有意义的问题。

您可以加载xpatch命令(或regexpatch)并使用

\xshowcmd\foo

它将为你做正确的事情。

如果您加载,regexpatch您还将获得一个显示更多信息的 *-variant。例如,在

\DeclareRobustCommand\foo[1][default]{something with #1}

\xshowcmd\foo你会从输出中得到

> \\foo =\long macro:
[#1]->something with #1.

同时\xshowcmd*\foo会告诉

*************************************************
* xpatch message
* `\foo' is a control word defined with `\DeclareRobustCommand' and a default
* optional argument `default'
*************************************************
> \\foo =\long macro:
[#1]->something with #1.

答案2

快速解决方法是定义

\def\pshow#1{{\let\protect\show #1}}

这会“拦截”\protect离子。请注意 的局部重新定义\protect

\documentclass{article}
\def\pshow#1{{\let\protect\show #1}}

\newcommand\mycommand{foo}
\show\mycommand

\DeclareRobustCommand{\myrobustcommand}{bar}
\pshow\myrobustcommand

\begin{document}
hello
\end{document}

.log文件显示:

> \mycommand=\long macro:
->foo.
l.5 \show\mycommand
                   

> \myrobustcommand =\long macro:
->bar.
\myrobustcommand ->\protect \myrobustcommand  
                                              
l.8 \pshow\myrobustcommand

相关内容