Ciao a tutti,
quando si desidera conoscere la definizione di una macro in TeX, è sufficiente avviare il relativo programma senza argomenti e interrogarlo mediante l’istruzione «\show». Ad esempio, per conoscere la definizione della macro «\TeX» basta avviare una finestra di terminale, digitare prima`tex
`
e successivamente`\show\TeX
`
La risposta del sistema sarà`> \TeX=macro:
->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
`
Domanda: è possibile fare la stessa cosa con LaTeX? Lo chiedo perché se avvio [pdf]latex usando l’istruzione «\show» per conoscere la definizione di una macro del linguaggio, come ad esempio «\LaTeX», ottengo in risposta solamente`> \LaTeX=macro:
->\protect \LaTeX .
`
In realtà non è che mi interessi conoscere la definizione di quella macro specifica, in quanto:
la si scopre subito con Google;
robitex ha comunque già spiegato che è sufficiente rintracciare la sezione «Logos» all’interno del documento «source2e.pdf» per conoscerla;
esistono altri modi (più o meno efficaci) per cercarla (es. richiamare grep ricorsivamente sull’albero di sistema e cercare i pattern «\def» o «\newcommand» seguiti dalla macro in questione).
Quello che mi interessa sapere, piuttosto, è se esiste un’istruzione specifica per LaTeX che abbia lo stesso significato di «\show» per TeX.
Grazie mille e a presto.
Il metodo per “irrobustire” una macro usato da LaTeX2e è piuttosto ingegnoso. Il problema della robustezza si ha quando occorre scrivere su file ausiliari e un’intempestiva espansione può creare errori in lettura.
Che hanno ideato dunque Mittelbach e soci? La macro “\LaTeX” è definita come “\protect\LaTeX “. C’è una differenza sostanziale fra “\LaTeX” e \LaTeX “: il nome della seconda macro termina con uno spazio! Lo si vede bene dall’output di \show: ogni nome di sequenza di controllo è seguito da uno spazio, si guardi \show\TeX; nel caso di \show\LaTeX è piuttosto evidente che dopo la X ci sono due spazi: il primo fa parte del nome.
Supponiamo che “\LaTeX” compaia in un titolo di capitolo e quindi vada scritto sul file .toc; in queste situazioni TeX esegue l’espansione completa, quindi avremo
“\LaTeX” -> “\protect\LaTeX ” -> “\LaTeX ”
e solo quest’ultimo token viene scritto sul file ausiliario (spazio compreso), perché in tali situazioni \protect significa \noexpand, la cui espansione è nulla, ma ha come effetto di rendere inespandibile il token che segue. Poco male, perché quando il .toc verrà letto, LaTeX vedrà solo “\LaTeX” seguito da due spazi che sono del tutto irrilevanti.
Se invece “\LaTeX” viene trovato durante la composizione di testo normale, \protect vale \relax, quindi sarà espanso “\LaTeX “.
Come vedere la definizione di “\LaTeX “? Facile. 🙂
`\expandafter\show\csname LaTeX \endcsname`
In questo modo si fornisce a TeX il token giusto, cioè quello il cui nome è “\LaTeX “, impossibile da scrivere altrimenti. Infatti \expandafter causa l’espansione di \csname, la cui funzione è proprio di costruire un token simbolico con i caratteri fino a \endcsname, senza tener conto dei codici di categoria. La definizione di \LaTeX è data con \DeclareRobustCommand{\LaTeX}{…} che equivale, in soldoni, a due definizioni:
`\expandafter\def\expandafter\LaTeX\expandafter{%
\expandafter\protect\csname LaTeX \endcsname}
\expandafter\def\csname LaTeX \endcsname{…}`
Un pochino più complesso è vedere il significato di un comando con argomento opzionale definito tramite \newcommand; per esempio
`\show\qbezier
> \qbezier=macro:
->\@protected@testopt \qbezier \\qbezier {0}.`
Qui il funzionamento è simile: quando si è durante la scrittura di un file ausiliario, \@protected@testopt fa sì che solo \qbezier sia scritto, ignorando il resto. Altrimenti \qbezier viene ignorato e si espande “\\qbezier”: con due barre rovesce! La prima è la solita, la seconda fa parte del nome. Soluzione:
`\expandafter\show\csname\string\qbezier\endcsname`
Ciao
Enrico