À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
o\newcommand{\jim}{\fred}
\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:
o\DeclareRobustCommand{\jim}{\fred}
\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 \protect
ion.
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!