domande sull'espansione TeX

Oct 01 2020

Guarda gli esempi di seguito:

\documentclass{article}

\begin{document}
\def\a{1}
\def\b{\def\a{2}}
\def\c{\b}
\c\a
\end{document}

Nella fase di espansione \def, il testo dei parametri e il testo sostitutivo non vengono espansi. Allora come può sapere il processore TeX \c, \aè una macro in questa fase?

E i gettoni vengono espansi uno per uno, quindi l'ho fatto

\c\a ==>
\b 1 ==>
\def\a{2} 1

ma l'uscita è 2. È l'output corretto e normale se non penso a queste cose, ma a quanto pare ho frainteso qualcosa sulla fase di espansione e sulla fase di esecuzione.

Risposte

11 egreg Oct 02 2020 at 07:48

Quando TeX sta espandendo i token e trova una macro, la sostituisce con il testo di sostituzione della macro, dopo aver assorbito gli argomenti, se così specificato dalla macro. Quindi si riavvia dal primo token nel testo sostitutivo.

Quindi i passaggi con il tuo codice sono

\c\a
\b\a
\def\a{2}\a
     <do the assignment>
\a
2

Per completare la descrizione di cui sopra, quando TeX scopre di dover eseguire un incarico (qui \def), assorbe i token necessari, memorizza l'assegnazione in memoria e rimuove quei token dal flusso di input.

Pertanto \anon viene esaminato finché non è il primo token nel flusso di input, a meno che l'ordine di espansione non venga modificato con \expandafter.

Otterrai 1 con

\expandafter\c\a

Un'ulteriore chiamata a \a, consegnerebbe 2.

6 DonHosek Oct 02 2020 at 02:39

L'espansione è prima la profondità, cioè \csarà completamente espansa prima di \aessere espansa, quindi andrà così:

\c\a ==>
\b\a ==>
\def\a{2}\a ==>
2