Qual é o motivo para ‘proteção’?

À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:

Além disso, simplesmente “esconder” um comando frágil em outro comando não tem efeito sobre a fragilidade. Então, se o \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:

\MakeRobustCommand\fred
e \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.
makerobust.sty
Distributed as part of Heiko Oberdiek’s bundle oberdiek

This answer last edited: 2011-06-01


Do you have any question? Ask on: latex.net.br - we love qood questions!