[texhax] \protect in LaTeX2e

Morten Høgholm moho01ab at student.cbs.dk
Wed Oct 6 13:30:47 CEST 2004


On Tue, 05 Oct 2004 17:55:01 -0400, Alexandru Scorpan  
<ascorpan at math.ufl.edu> wrote:

>> One has to think carefully which commands should be robust and which  
>> not.
>
> Why do certain commands need to be fragile?  For example, why is  
> \raisebox fragile? (Or ref, for that matter.)

Let me answer \ref first. \ref isn't fragile, rather it is completely  
expandable (in the non-babel case) which is quite important.

\documentclass{book}
\makeatletter
\DeclareRobustCommand\ref[1]{%
   \expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
\makeatother
\begin{document}
\section{Test of reference: \ref{test}}\label{test}
\end{document}

Try running this document and observe that the reference doesn't work in  
the header. The reason is \MakeUppercase acts on the text in the header  
but as \ref is robust and thus still appears as \ref{test} it is converted  
to upper case and then executed later on.

The reason for not robustifying commands from the get go had to do with  
speed and memory. Quoting David Carlisle (comp.text.tex on 2000/01/24):

   In the beginning, when latex had to fit on a 1/2 Meg PC and it took
   about 15 minutes per page to run a typical document, it was worth the
   saving of a bit of space and a bit of time to leave commands fragile.

   Now, it's not so clear:-)

Now we have \protected from eTeX which makes it easier on the memory  
because it doesn't take up two strings for each user command. One day  
maybe even \raisebox will be robust, but to be fair, it's not exactly one  
of those commands you use directly in section headings and captions, is it?
-- 
Morten Høgholm



More information about the texhax mailing list