> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/it/articoli-approfonditi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Come funziona \expandafter: uno studio dettagliato dei comandi \expandafter consecutivi

&#x20;[Parte 1](/latex/it/articoli-approfonditi/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Parte 2](/latex/it/articoli-approfonditi/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Parte 3](/latex/it/articoli-approfonditi/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Parte 4](/latex/it/articoli-approfonditi/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Parte 5](/latex/it/articoli-approfonditi/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Parte 6](/latex/it/articoli-approfonditi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)&#x20;

## Caso di studio: Comprendere \expandafter\expandafter\expandafter...

Le macro avanzate, come quelle presenti nei pacchetti LaTeX, fanno spesso ampio uso di più comandi consecutivi `\\expandafter` comandi per eseguire sofisticati “giochetti” con i token. Per la maggior parte di noi, tali macro possono essere difficili da capire o scoraggianti da scrivere. In questa sezione esamineremo i meccanismi alla base dell'elaborazione da parte di TeX di comandi consecutivi `\\expandafter` comandi:

```
\expandafter\expandafter\expandafter...
```

Per facilitare la nostra spiegazione aggiungeremo pedici a ciascun `\\expandafter`— per indicare a quale ci riferiamo:

```
        \expandafter1\expandafter2\expandafter3...
```

Inoltre, estenderemo la notazione per i token elaborati da ciascun `\\expandafter` a usare $$\mathrm{T^i\_1}$$ e $$\mathrm{T^i\_2}$$ che rappresentano i token $$\mathrm{T\_1}$$ e $$\mathrm{T\_2}$$ letti in ingresso da `\\expandafter` con pedice `i`: `\\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Assumeremo anche che due token $$\mathrm{T\_X}$$ e $$\mathrm{T\_Y}$$ seguano dopo `\expandafter<sub>3</sub>` così che il nostro input appaia così: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Quando TeX inizia a elaborare questo input, per `\expandafter<sub>1</sub>` vedrà

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` che viene salvato per un successivo *reinserimento* nell'input
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, che viene espanso

Se torniamo alla nostra discussione precedente del [codice all'interno di TeX](/latex/it/articoli-approfonditi/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) che implementa `\\expandafter`, è con l'espansione di `\expandafter<sub>3</sub>` che vediamo avvenire la ricorsione. Per elaborare `\expandafter<sub>1</sub>` TeX ha già chiamato la sua funzione interna `expand()`, quindi per elaborare (espandere) `\expandafter<sub>3</sub>` TeX sta effettuando una *secondo* chiamata a `expand()`—dall'interno della `expand()` funzione stessa.

Per `\expandafter<sub>3</sub>` abbiamo

* $$\mathrm{T^3\_1 = T\_X}$$, che viene salvato per un successivo *reinserimento* nell'input
* $$\mathrm{T^3\_2 = T\_Y}$$, che supporremo essere espandibile

Supponiamo inoltre che l'espansione di $$\mathrm{T\_Y}$$ produca la seguente sequenza di token: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Abbiamo ora raggiunto la fine del processo di espansione avviato dalla sequenza di comandi `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ e TeX procede a “srotolare” il processo di ricorsione iniziato con `\expandafter<sub>1</sub>`.

Dopo aver elaborato `\expandafter<sub>3</sub>` TeX ha, nella sua memoria, una lista di token contenente token provenienti dall'espansione di $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX ora inizia a reinserire i token che ha salvato mentre elaborava `\\expandafter` comandi:

1. TeX inizia reinserendo il token $$\mathrm{T\_X}$$ salvato da `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ viene reinserito *davanti* dell'espansione di $$\mathrm{T\_Y}$$, che dà come risultato una sequenza di token: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Tuttavia, dobbiamo ancora completare il processo iniziato da `\expandafter<sub>1</sub>` che ha salvato il token che rappresenta `\expandafter<sub>2</sub>`
3. La sequenza finale di token assemblata da TeX, pronta per essere letta nella fase successiva dell'elaborazione di TeX, è `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX ha ora terminato il “primo giro” di elaborazione e passa a leggere la sequenza di liste di token che ha generato—quella sequenza inizia con `\expandafter<sub>2 (token)</sub>` che TeX procede a elaborare. Per `\expandafter<sub>2</sub>` abbiamo
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ che viene salvato per un successivo *reinserimento* nell'input
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ che è il primo token risultante dall'espansione di $$\mathrm{T\_Y}$$; se è espandibile, viene espanso
5. Se supponiamo che il token $$\mathrm{T^1\_Y}$$, il primo token risultante dall'espansione di $$\mathrm{T\_Y}$$, si espande in $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ allora, dopo che TeX ha reinserito $$\mathrm{T\_X}$$, la sequenza di token risultante da rielaborare da parte di TeX sarebbe: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   che possiamo riformulare come

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

Il diagramma seguente illustra le liste di token create dal codice TeX

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![Immagine che mostra TeX elaborare più comandi \expandafter](/files/51224a7fcc200322c6c3d6bd4b2310084fdc0e26)

### Dalla teoria alla pratica

A titolo di esempio, definiremo le seguenti macro da usare come $$\mathrm{T\_X}$$ e $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` dove definiamo `\foo` come `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` dove prima definiamo `\def\abc{Hello}`, `\def\xyz{, World!}` e poi `\def\bar{\abc\xyz}`

Useremo il seguente frammento di codice per dimostrare la nostra analisi precedente:

\expandafter\expandafter\expandafter\foo\bar

Dalla nostra discussione, il risultato di `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ produce una sequenza di token della forma:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

dove la sequenza esatta dipende dalla natura del token $$\mathrm{T\_Y}$$. Se inseriamo i nostri comandi di esempio usando $$\mathrm{T\_X}=$$`\foo` e $$\mathrm{T\_Y}=$$`\bar`, che è definito come `\def\bar{\abc\xyz}`, vediamo:

* il primo token in $$\mathrm{T\_Y}$$ è `\abc` e la sua espansione è una sequenza di token di carattere: `Ciao`
* i token rimanenti in $$\mathrm{T\_Y}$$ è il singolo token che rappresenta `\xyz`.

Se inseriamo queste informazioni nella nostra “analisi” otteniamo

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

Si noti che i pedici <sub>token</sub> e <sub>lista di token (caratteri)</sub> sono usati per enfatizzare (ricordarci) che TeX sta leggendo *valori interi dei token*, non *caratteri di testo*, quindi non c'è bisogno di mostrare caratteri di spazio o altri delimitatori dopo `\foo`: tali delimitatori sono stati da tempo elaborati o scartati; qui siamo saldamente nel mondo interno di TeX fatto di liste di token e valori interi dei token.

Quando TeX elabora la sequenza di liste di token prodotta dai nostri `\\expandafter` comandi, comporrà in tipografia `**H**ello, World!`—solo `H` è composto in grassetto. Potremmo ottenere lo stesso risultato scrivendo il codice TeX equivalente `\foo Hello\xyz`. Osserva che la definizione di `\foo` ha usato un singolo parametro; di conseguenza, `\foo` assorbe il singolo `H` token di carattere per il suo argomento, lasciando i token di carattere rimanenti (`ello`) intatti.

**Note:**

* scrivendo `\foo\bar` produce un output molto diverso: il token per `\bar` verrebbe usato come argomento per `\foo` il che comporta la composizione tipografica di **`Hello, World`**—tutto è composto in grassetto.
* scrivendo `\expandafter\foo\bar` fa sì che `\bar` venga espanso, il che produce due token: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Poi, dopo che il $$\text{foo}*\text{token}$$ viene reinserito da `\\expandafter` TeX elabora la sequenza di token $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ che compone `**Hello**, World`—solo **`Ciao`** è composto in grassetto. Qui, il singolo token $$\text{abc}*\text{token}$$ viene elaborato come argomento per il token macro $$\text{foo}*\text{token}$$, lasciando il token $$\text{xyz}\_\text{token}$$ intatto e il suo contenuto composto nel font corrente.

## Nota su \expandafter e macro con argomenti

Quando usi `\\expandafter` per forzare l'espansione delle macro, vale la pena sapere come funziona l'espansione delle macro—in particolare per quelle che accettano argomenti. Prima che TeX possa eseguire una macro—cioè leggere ed elaborare i token contenuti nella definizione della macro—TeX deve rendere la macro “pronta all'esecuzione” eseguendo il processo iniziale di espansione della macro. Se la definizione di una macro include l'uso di parametri (`#1`, `#2`, ... `#9`), parte del processo di espansione della macro richiede che TeX analizzi l'input alla ricerca dei token che compongono gli argomenti forniti dall'utente: quei token degli argomenti vengono assorbiti (rimossi) dall'input. Durante l'espansione della macro TeX legge e assorbe token dall'input per creare mini liste di token, una lista per argomento; tali liste di token verranno successivamente inserite nella posizione appropriata all'interno del corpo della macro—quando TeX la esegue. L'ultimo passo dell'espansione della macro prevede che TeX individui la definizione della macro memorizzata in memoria e disponga che quella posizione diventi la fonte da cui TeX leggerà il suo prossimo insieme di token di input. L'esecuzione della macro ha inizio quando TeX comincia a leggere ed elaborare quei token, inserendo le liste di token create in precedenza per memorizzare gli argomenti.

### Vengono assorbiti anche i token delimitatori

Se la definizione originale della macro utilizzava anche token che agivano da delimitatori, TeX dovrebbe anche confrontare la definizione originale della macro con l'uso (chiamata) che l'utente fa di quella macro, cercando di trovare e abbinare i token delimitatori. Una volta abbinati/individuati, i token delimitatori vengono successivamente ignorati perché il loro unico scopo è fungere da “punteggiatura”, aiutando TeX a individuare e identificare i token effettivi destinati a formare ciascun argomento.

&#x20;[Parte 1](/latex/it/articoli-approfonditi/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Parte 2](/latex/it/articoli-approfonditi/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Parte 3](/latex/it/articoli-approfonditi/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Parte 4](/latex/it/articoli-approfonditi/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Parte 5](/latex/it/articoli-approfonditi/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Parte 6](/latex/it/articoli-approfonditi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/it/articoli-approfonditi/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
