2 Luglio 2011 alle 11:10
#60851
::
Grazie Enrico per la macro e per le delucidazioni.
Nella tua soluzione ha un ruolo la macro \detokenize il cui significato
è spiegato qui: http://tex.stackexchange.com/questions/20059/what-detokenize-command-does
\detokenize è una primitiva di e-TeX; il suo uso per verificare se un argomento è vuoto l’ho imparato da H. Oberdiek. Siccome \if espande ciò che lo segue fino a quando trova due token non più espandibili per poterli confrontare, succede questo:
- 1. \relax non è espandibile, andiamo avanti
2. \detokenize è espandibile, quindi espandiamolo
3. l’espansione di \detokenize consiste nel contenuto del “general text” che lo segue come se a ogni token nel “balanced text” fosse applicato il comando \string; il risultato è una successione di caratteri di categoria 12 (o 10 per gli spazi)
4. se tra le graffe dopo \detokenize non c’è niente, cioè l’argomento è vuoto, \if trova dopo il primo \relax un altro \relax: sono uguali, perciò si segue il ramo “vero”, cioè tutto quanto va dal secondo \relax a \else (o a \fi se \else non c’è)
5. se tra le graffe c’è qualcosa, \if confronta il primo \relax con il primo carattere: non sono uguali, perciò si segue il ramo “falso”; tutto quello che segue il primo carattere fino a \else fa parte del ramo “falso”, quindi viene ignorato; se non c’è \else ma solo \fi, viene tutto buttato via
“general text”: {“balanced text”}
“balanced text”: qualsiasi codice TeX che sia bilanciato rispetto alle graffe esplicite.
Suppongo che non ci voglia tanta fantasia per capire di chi è la spiegazione nella pagina che indichi. 🙂
Ciao
Enrico