Una volta si parlava di comandi LaTeX “robusti” e “fragili” e c’era il comando \protect per rendere robusto un comando fragile e ricordo anche che i comandi “fragili” non erano pochissimi:
1) Perché alcuni comandi si “rompevano”? Che cosa vuol dire?
2) Ora non se ne sente più parlare perché le nuove versioni hanno risolto il problema o per qualche altro motivo?
Quando TeX scrive su un file ausiliare, esegue l’espansione completa delle macro che incontra. Facciamo l’esempio di un input come
`\chapter{Pippo \textit{va} al mare}`
Fra i vari mestieri di \chapter c’è di scrivere sul file .aux e sul .toc il titolo del capitolo. Qui nasce il problema: l’espansione di \textit{va} sarebbe
`\ifmmode
\nfss@text{\itshape va}%
\else
\hmode@bgroup\text@command {va}\itshape\check@icl va\check@icr
\expandafter \egroup
\fi`
e ancora ci sarebbe da espandere; ma proprio qui è uno dei problemi, sebbene nel caso in esame non sia rilevante. Il condizionale \ifmmode sarebbe espanso a sua volta e nel momento sbagliato: durante la scrittura e non durante la composizione.
LaTeX originale risolveva il problema con \protect che assume significati diversi quando si compone il testo e quando invece si scrive su file ausiliari; nel primo caso vale \relax (cioè non fa nulla), nel secondo vale \noexpand il cui effetto è di inibire l’espansione del token che lo segue. Perciò un ipotetico \chapter{Pippo \protect\textit{va} al mare} farebbe scrivere nel file ausiliario
`Pippo \textit {va} al mare`
come desiderato (nota che il nome del comando è seguito, secondo le regole, da uno spazio).
LaTeX2e risolve il problema in modo diverso, che ho già spiegato qui un paio di volte. Non per tutti i comandi, ma per quelli che sono maggiormente indiziati di andare in un titolo di sezione. Con il trucco escogitato ciò che viene scritto nel file ausiliario da \chapter{Pippo \textit{va} al mare} è
`Pippo \textit {va} al mare`
Qui il nome del comando è seguito da due spazi! Il trucco sta qui. 🙂 Cerca “\protect” nel forum per trovare la spiegazione, è un filone abbastanza recente.
Con le estensioni e-TeX, che ormai sono usate quando si compila con latex o pdflatex, c’è un altro sistema a disposizione. Sarà quello impiegato da LaTeX3: il segreto si chiama \protected\def, ma la spiegazione sarebbe troppo lunga. Storia analoga a quella del margine troppo stretto: “Hanc marginis exiguitas non caperet”. 😉
Ciao
Enrico