Re: Scelta automatica fra \clearpage e \cleardoublepage

#64114
Up
0
Down
::

antonio.macrì” post=63196

`\makeatletter
\expandafter\def\expandafter\cleardoublepage\expandafter{\expandafter
\if@openright
\cleardoublepage
\else
\clearpage
\fi}
\makeatother`
Esercizio: perché funziona e non va in circolo vizioso?

Ciao
Enrico

Mi esercito io: il motivo essenziale è che viene calcolato il significato del comando prima di assegnarlo al token \cleardoublepage. In altri termini, viene espanso il \cleardoublepage presente nel corpo della definizione prima di ridefinirlo, in modo che il suo significato sia quello vecchio, non quello che gli si vuole assegnare (che contiene lo stesso \cleardoublepage).

Giusto.

antonio.macrì”Ne approfitto per chiedere una cosa sull’espansione di token e in particolare su \expandafter. Quest’ultimo funziona così: prima espande il secondo (che lo segue) token e poi fa riprendere l’espansione dal token che lo segue immediatamente. Questo mi fa pensare che si crei una sorta di stack di espansione. Mi spiego meglio: vogliamo espandere tutta la ridefinizione di \cleardoublepage. Innanzitutto, devo espandere il primo \expandafter (la rappresentazione l’ho improvvisata):

[…

A questo punto ho espanso tutti gli \expandafter e \cleardoublepage. L’espansione riprende da \if@openright e, a seguire, da {, \cleardoublepage e infine \def.

Giusto il ragionamento?

Evidentemente no: non può mica riespandere \cleardoublepage. Ma allora non mi è ben chiaro come funziona.

Tutto quasi giusto, fino all’ultimo “code”. Vediamo il quasi. TeX mantiene una lista di token che elabora uno alla volta, prendendo il cibo necessario da un “input buffer” i cui rifornimenti vengono dal documento in elaborazione con il processo di “tokenization” (quello che forma comandi o passa caratteri). Se il primo token che ha nella lista è espandibile, esegue l’espansione e le procedure connesse; nel caso di una macro l’espansione provoca la ricerca degli argomenti, quindi anche il rifornimento dal buffer, e la sostituzione del token e dei suoi argomenti con la lista che viene presa dalla memoria, con la sostituzione di #1, …, #9 con gli argomenti stessi. Nel caso di \expandafter l’espansione richiede la lettura di due token e poi provoca l’espansione del secondo come detto; il primo token dopo \expandafter rimane lì nella lista (non è proprio uno stack, come vedi). Quando un token viene espanso, sparisce dalla “main token list” insieme ai suoi argomenti, ma rimane il prodotto dell’espansione da cui si ricomincia.

Ecco allora il punto fondamentale: nella lista che hai accuratamente scritto, il primo token che rimane è \def che non è espandibile! In questo caso TeX esegue la procedura connessa che, in questo caso, consiste nel riconoscere il token da definire, i “parameter tokens” (qui non ce ne sono) e il “replacement text”, cioè ciò che va dalla graffa aperta a quella chiusa corrispondente; il tutto viene passato alla memoria senza espansione e cancellato dalla “main token list”.

Un altro aspetto non secondario: l’espansione di una macro usa la definizione presente in memoria al momento. In questo caso \def ancora non è stato eseguito e quindi la definizione usata per l’espansione di \cleardoublepage a opera della catena di \expandafter è quella “precedente” (l’avevi osservato, ma è meglio dirlo più esplicitamente).

Ciao
Enrico

Go to top