How can I see the "implementation" of protected commands such as \LaTeX?
Some macros are defined to be robust by expanding to \protect
followed by a macro with almost the same name but ending with a space! Special care must be taken to define and use such macros because spaces are normally not allowed in macro names. If such a macro is written into external files (.aux
, .toc
, ...) the space is not taken as part of the macro name any longer, so that the original macro is called again.
To see the definitions of such macros you need to use the following code:
\expandafter\show\csname LaTeX \endcsname
The \csname <text>\endcsname
can be used to build a macro called \<text>
which can include non-letters like numbers or spaces. The \expandafter
is required to expand \csname LaTeX \endcsname
(note the space after the X
) to \LaTeX
(also note the space here) before \show
is executed.
I also programmed a command line tool called texdef
to display such definitions:
texdef -t latex LaTeX
(Instead of texdef -t latex
you can also write latexdef
if that name was installed)
This will display the definition of \LaTeX
and detect that it calls \LaTeX
and also shows the definition of it.
$ texdef -t latex LaTeX
\LaTeX:
macro:->\protect \LaTeX
\LaTeX :
\long macro:->L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize \sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX
Alternatively use quotes to add the space explicitly:
texdef -t latex 'LaTeX '
An alternative to Martin's answer to to redefine \protect
:
\begingroup
\let\protect\show
\LaTeX
\endgroup
(The group is not compulsory, but means that you can keep going with a document and not have everything go wrong. If you are just making a short 'test' document, you can miss it out.)
Besides Martin's solution, there is a show2e
package that I often use:
% \usepackage{show2e}
\showcmd\LaTeX
When compiling, it first gets
> \LaTeX=macro:
->\protect \LaTeX .
And then
> \LaTeX =\long macro:
->L\kern -.36em{\sbox \z@ T\vbox to\ht \z@ {\hbox {\check@mathfonts \fontsize
\sf@size \z@ \math@fontsfalse \selectfont A}\vss }}\kern -.15em\TeX .
<argument> \LaTeX