Re: Nuovi ambienti: prevenire l’andata a capo

#13752
Up
0
Down
::

8) Prometti di usarlo solo se capisci ciò che fanno questii comandi 8)

Ti do la mia parola d’onore. Anzi, il minimo che posso fare per ringraziarti è spiegare cio che sono riuscito a capire della tua definizione agli altri lettori interessati:

Solo alcune imprecisioni. Il comando \par termina un paragrafo, ma non ne comincia uno nuovo. TeX comincia un nuovo paragrafo quando incontra, dopo un \par, un carattere, il comando \indent o il comando \noindent (o ancora altre cose, per la verità).

Il comando \@ifnextchar prende quattro argomenti:
`\@ifnextchar`
il primo è un token, il secondo contiene ciò che si deve fare se il primo argomento coincide con il quarto, il terzo cioè che si deve fare altrimenti. Lo si usa al termine della definizione di un comando specificando solo i primi tre argomenti, in modo che ii quarto sia il token che segue. Esempio:
`\def\@pippo[#1]#2{…}
\def\pippo{\@ifnextchar[\@pippo{\@pippo[xxx]}}`
è equivalente a
`\newcommand{\pippo}[2][xxx]{…}`
Infatti, quando TeX espande \pippo, \@ifnextchar raccoglie i suoi quattro argomenti e il quarto sarà esattamente il token che segue \pippo. La cosa importante è che questo quarto argomento viene poi rimesso al suo posto nella lista di token. Esaminiamo i due casi: se scriviamo \pippo[aaa]{ciao}, \@ifnextchar si accorge che il quarto argomento è la quadra, quindi sostituisce il tutto con \@pippo; se scriviamo \pippo{ciao}, sarà emesso \@pippo[xxx]. Perciò:
`\pippo[aaa]{ciao} \@pippo[aaa]{ciao}
\pippo{ciao} \@pippo[xxx]{ciao}`
Va osservato che il token con cui fare il paragone non può essere uno spazio, per motivi TeXnici. Normalmente si fa il paragone con un carattere (può essere [ oppure * per definire comandi con la variante), ma un token qualunque va bene. Per capire la definizione di \@pippo, occorre conoscere nei dettagli il comando \def e il modo di specificare i parametri delimitati e non delimitati.

Nel nostro caso invece di [ si usa \par per fare il confronto. Il fine riga dopo \begin{example} viene ignorato (\@ifnextchar si “mangia” gli spazi che seguono il terzo argomento e il quarto è il primo token “non spazio” che segue). L’eventuale riga vuota è trasformata in \par e rende vero il test; una riga non vuota invece rende falso il test. Il token che segue è rimesso al suo posto e tutto procede: nel caso “vero” diventa argomento di \@gobble e sparisce, nel caso “falso” è il punto da cui ricomincia la lettura dei token.

Certo, per definire un comando con un argomento opzionale non c’è da fare tutta quella fatica, visto che c’è \newcommand che può occuparsene. Ma se vogliamo due argomenti opzionali, \@ifnextchar dà il modo di risolvere. Si può usare anche per vedere se il token che segue è una graffa aperta, ma in questo caso il primo argomento deve essere specificato come \bgroup.

Il significato usuale di @ (cioè non fra \makeatletter e \makeatother) è “il carattere @”, semplicemente. Nei file richiamati con \usepackage o caricati da questi, il carattere @ è considerato una lettera (quindi con \makeatletter … \makeatother impliciti).

Ciao
Enrico

Go to top