我知道,每当我想查看某个控制序列是如何\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