Às vezes, o LaTeX salva dados que serão relidos mais tarde. Esses dados são frequentemente o argumento de algum comando; eles são os chamados argumentos móvel. (‘Móveis’ porque os dados são movidos.) São candidatos todos os argumentos que podem entrar no sumário, na lista de figuras etc.; ou seja, dados que são gravados em um arquivo auxiliar e lidos posteriormente. Outros locais são aqueles dos dados que podem aparecer em cabeçalhos e rodapés. Títulos de seção e legendas de figuras são os exemplos mais proeminentes; há uma lista completa no livro de Lamport (veja Livros relacionados ao TeX).
O que está realmente acontecendo nos bastidores? Os comandos em argumentos móveis são normalmente expandidos para sua estrutura interna durante o processo de salvamento. Às vezes, essa expansão resulta em código TeX
inválido, que aparece durante a expansão ou quando o código é processado novamente. Proteger um comando por meio de
“\protect\cmd” diz ao LaTeX para salvar \cmd como
\cmd, sem expandi-lo.
Então, o que é um ‘comando frágil’? — é um comando que se expande para código TeX ilegal durante o processo de salvar.
O que é um ‘comando robusto’? — é um comando que se expande em código TeX legal durante o processo de salvar.
O livro de Lamport diz, na descrição de cada comando do LaTeX, se ele é ‘robusto’ ou ‘frágil’; ele diz também que todo comando com um argumento opcional é frágil. A lista não é confiável e nem a afirmação sobre argumentos opcionais; as declarações podem ter sido verdadeiras nas versões iniciais do LaTeX 2e, mas não são mais necessariamente assim:
\cite, foram tornados robustos em revisões posteriores do LaTeX.
\end e o \nocite, são frágeis mesmo que não tenham argumentos opcionais.
\newcommand ou \newcommand*) agora sempre cria um comando robusto (embora as macros sem argumentos opcionais ainda possam ser frágeis se fizerem coisas que sejam, elas próprias, frágeis).
\cite comumente sofre este tratamento).
\fred for frágil e você escrever:y
\newcommand{\jim}{\fred}
o \jim será frágil também. Há, no entanto, o substituto do
\newcommand, o \DeclareRobustCommand, que
sempre cria um comando robusto (com ou sem argumentos opcionais). A sintaxe do \DeclareRobustCommand é substancialmente idêntica à do \newcommand, e se você fizer o truque do embrulho, acima, como:
\DeclareRobustCommand{\jim}{\fred}
o \jim será robusto.
Finalmente, temos o pacote makerobust , que define o
\MakeRobustCommand para converter um comando em robusto. Com o pacote, o “embrulho” acima pode ser substituído simplesmente por:
e\MakeRobustCommand\fred
\fred será robusto. Usar o pacote pode ser razoável se você tiver muitos comandos frágeis que você precisa usar em argumentos móveis.
Em suma, a situação é confusa. Ninguém acredita que isso seja satisfatório; a equipe do LaTeX removeu a necessidade de proteção de algumas coisas, mas as técnicas disponíveis no LaTeX atual significam que este é um exercício dispendioso. Continua sendo um objetivo de longo prazo da equipe remover toda necessidade de \protection.
This answer last edited: 2011-06-01
This question on the Web: http://latex.net.br/faq/FAQ-protect.html
Do you have any question? Ask on: latex.net.br - we love qood questions!