Re: Scelta automatica fra \clearpage e \cleardoublepage

#64113
Up
0
Down
::

egreg9″ post=63183`\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 sta per assegnare.

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. Ho qualche dubbio su come interpretare quest’ultima affermazione, che mi farebbe venire in mente l’idea 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):
`
\expandafter\def\expandafter\cleardoublepage\expandafter{\expandafter\if@openright\cleardoublepage\else\clearpage\fi}
^`
che comporta l’espansione del secondo \expandafter dopo il quale dovrò riprendere a espandere da \def:
`
\def\expandafter\cleardoublepage\expandafter{\expandafter\if@openright\cleardoublepage\else\clearpage\fi}
^
^`
L’espansione del secondo \expandafter determina l’espansione del terzo \expandafter dopo il quale dovrò espandere il primo \cleardoublepage:
`
\def\cleardoublepage\expandafter{\expandafter\if@openright\cleardoublepage\else\clearpage\fi}
^
^
^`
Ancora la stessa storia:
`
\def\cleardoublepage{\expandafter\if@openright\cleardoublepage\else\clearpage\fi}
^
^
^
^`
da cui:
`
\def\cleardoublepage{\if@openright\else\clearpage\fi}
^
^
^
^`

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

Evidentemente il ragionamento non può essere giusto: non posso mica riespandere \cleardoublepage! L’espansione invece viene ripresa direttamente da \def, no? E non si crea nessuno stack, vero?

Ciao,
Antonio

Go to top