> 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/fr/articles-approfondis/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Comment fonctionne \expandafter : étude détaillée de commandes \expandafter consécutives

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

## Étude de cas : comprendre \expandafter\expandafter\expandafter...

Les macros avancées, comme celles que l’on trouve dans les packages LaTeX, font souvent un usage intensif de plusieurs commandes consécutives `\expandafter` pour effectuer des manipulations sophistiquées des jetons. Pour la plupart d’entre nous, de telles macros peuvent être difficiles à comprendre ou intimidantes à écrire. Dans cette section, nous passerons en revue les mécanismes qui sous-tendent le traitement par TeX des commandes consécutives `\expandafter` commandes :

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

Pour faciliter notre explication, nous ajouterons des indices à chaque `\expandafter`—afin d’indiquer à laquelle nous faisons référence :

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

De plus, nous étendrons la notation des jetons traités par chaque `\expandafter` pour utiliser $$\mathrm{T^i\_1}$$ et $$\mathrm{T^i\_2}$$ représentant les jetons $$\mathrm{T\_1}$$ et $$\mathrm{T\_2}$$ lus par `\expandafter` avec l’indice `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Nous supposerons également que deux jetons $$\mathrm{T\_X}$$ et $$\mathrm{T\_Y}$$ suivent après `\expandafter<sub>3</sub>` afin que notre entrée ressemble à ceci : `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Lorsque TeX commence à traiter cette entrée, pour `\expandafter<sub>1</sub>` il verra

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` qui est conservé pour une *réinsertion* dans l’entrée
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, qui est développée

Si nous revenons à notre discussion précédente du [code à l’intérieur de TeX](/latex/fr/articles-approfondis/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) qui met en œuvre `\expandafter`, c’est avec l’expansion de `\expandafter<sub>3</sub>` que nous voyons la récursion à l’œuvre. Pour traiter `\expandafter<sub>1</sub>` TeX a déjà appelé sa fonction interne `expand()`, ainsi que pour traiter (développer) `\expandafter<sub>3</sub>` TeX effectue un *deuxième* appel à `expand()`—depuis l’intérieur de la `expand()` fonction elle-même.

Pour `\expandafter<sub>3</sub>` nous avons

* $$\mathrm{T^3\_1 = T\_X}$$, qui est conservé pour une *réinsertion* dans l’entrée
* $$\mathrm{T^3\_2 = T\_Y}$$, que nous supposerons être expansible

Supposons en outre que l’expansion de $$\mathrm{T\_Y}$$ produit la séquence de jetons suivante : $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Nous avons maintenant atteint la fin du processus d’expansion commencé par la séquence de commandes `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ et TeX procède à « dérouler » le processus de récursion qui a commencé avec `\expandafter<sub>1</sub>`.

Après le traitement de `\expandafter<sub>3</sub>` TeX a, dans sa mémoire, une liste de jetons contenant des jetons issus de l’expansion de $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX commence maintenant à réinsérer les jetons qu’il avait conservés pendant le traitement de `\expandafter` commandes :

1. TeX commence par réinsérer le jeton $$\mathrm{T\_X}$$ conservé par `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ est réinséré *devant* de l’expansion de $$\mathrm{T\_Y}$$, ce qui donne une séquence de jetons : $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Cependant, nous devons encore terminer le processus commencé par `\expandafter<sub>1</sub>` qui a conservé le jeton représentant `\expandafter<sub>2</sub>`
3. La séquence finale de jetons assemblée par TeX, prête à être lue à l’étape suivante du traitement de TeX, est `\expandafter<sub>2 (jeton)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX a maintenant terminé le « premier tour » du traitement et passe à la lecture de la séquence de listes de jetons qu’il a générée — cette séquence commence par `\expandafter<sub>2 (jeton)</sub>` que TeX procède à traiter. Pour `\expandafter<sub>2</sub>` nous avons
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ qui est conservé pour une *réinsertion* dans l’entrée
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ qui est le premier jeton issu de l’expansion de $$\mathrm{T\_Y}$$; s’il est expansible, il est développé
5. Si nous supposons que le jeton $$\mathrm{T^1\_Y}$$, le premier jeton issu de l’expansion de $$\mathrm{T\_Y}$$, se développe en $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ alors, après que TeX a réinséré $$\mathrm{T\_X}$$, la séquence de jetons résultante à retraiter par TeX serait : $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   que nous pouvons reformuler ainsi

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

Le diagramme suivant illustre les listes de jetons créées par le code TeX

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

![Image montrant TeX traitant plusieurs commandes \expandafter](/files/632a5d4dd7f411e1c03f17b0c390076993a1d885)

### De la théorie à la pratique

À titre d’exemple, nous définirons les macros suivantes pour servir de $$\mathrm{T\_X}$$ et $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` où nous définissons `\foo` comme `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` où nous définissons d’abord `\def\abc{Hello}`, `\def\xyz{, World!}` et ensuite `\def\bar{\abc\xyz}`

Nous utiliserons le fragment de code suivant pour illustrer notre analyse précédente :

\expandafter\expandafter\expandafter\foo\bar

D’après notre discussion, le résultat de `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ produit une séquence de jetons de la forme :

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

où la séquence exacte dépend de la nature du jeton $$\mathrm{T\_Y}$$. Si nous insérons nos commandes d’exemple en utilisant $$\mathrm{T\_X}=$$`\foo` et $$\mathrm{T\_Y}=$$`\bar`, qui est défini comme `\def\bar{\abc\xyz}`, nous obtenons :

* le premier jeton dans $$\mathrm{T\_Y}$$ est `\abc` et son expansion est une séquence de jetons de caractères : `Hello`
* les jetons restants dans $$\mathrm{T\_Y}$$ est le jeton unique représentant `\xyz`.

Si nous intégrons cette information dans notre « analyse », nous obtenons

$$\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\*}$$

Notez que les indices <sub>jeton</sub> et <sub>liste de jetons (caractères)</sub> sont utilisés pour souligner (nous rappeler) que TeX lit *valeurs entières de jetons*, pas des *caractères textuels*, d’où il n’est pas nécessaire d’afficher des caractères d’espace ou d’autres délimiteurs après `\foo`: ces délimiteurs ont depuis longtemps été traités ou écartés ; ici, nous sommes fermement dans le monde intérieur de TeX, fait de listes de jetons et de valeurs entières de jetons.

Lorsque TeX traite la séquence de listes de jetons produite par nos `\expandafter` commandes, il composera `**H**ello, World!`—seul `H` est mis en gras. Nous pourrions obtenir le même résultat en écrivant le code TeX équivalent `\foo Hello\xyz`. Remarquez que la définition de `\foo` utilisait un seul paramètre ; par conséquent, `\foo` absorbe le seul `H` jeton de caractère pour son argument, laissant les jetons de caractère restants (`ello`) intacts.

**Remarques :**

* écrire `\foo\bar` produit une sortie très différente : le jeton pour `\bar` serait utilisé comme argument pour `\foo` ce qui donne la composition de **`Hello, World`**—tout est mis en gras.
* écrire `\expandafter\foo\bar` provoque `\bar` à être développé, ce qui produit deux jetons : $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Puis, après le $$\text{foo}*\text{token}$$ est réinséré par `\expandafter` TeX traite la séquence de jetons $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ qui compose `**Hello**, World`—seul **`Hello`** est mis en gras. Ici, le jeton unique $$\text{abc}*\text{token}$$ est traité comme l’argument du jeton de macro $$\text{foo}*\text{token}$$, laissant le jeton $$\text{xyz}\_\text{token}$$ intact et son contenu mis en forme dans la police courante.

## Remarque sur \expandafter et les macros avec arguments

Lors de l'utilisation de `\expandafter` pour forcer l’expansion des macros, il vaut la peine de savoir comment fonctionne l’expansion des macros — en particulier pour les macros qui prennent des arguments. Avant que TeX ne puisse exécuter une macro — c’est-à-dire lire et traiter les jetons contenus dans la définition de la macro — TeX doit « préparer à l’exécution » la macro en effectuant le processus initial d’expansion de la macro. Si la définition d’une macro inclut l’usage de paramètres (`#1`, `#2`, ... `#9`), une partie du processus d’expansion de la macro exige que TeX parcoure l’entrée à la recherche des jetons qui constituent le ou les arguments fournis par l’utilisateur : ces jetons d’argument sont absorbés (retirés) de l’entrée. Pendant l’expansion de la macro, TeX lit et absorbe des jetons de l’entrée pour créer de mini-listes de jetons, une liste par argument ; ces listes de jetons seront ensuite insérées à l’emplacement approprié dans le corps de la macro — lorsque TeX l’exécute. La dernière étape de l’expansion de la macro consiste pour TeX à localiser la définition de la macro stockée en mémoire et à faire en sorte que cet emplacement devienne la source à partir de laquelle TeX lira son prochain ensemble de jetons d’entrée. L’exécution de la macro commence lorsque TeX se met à lire et traiter ces jetons, en y injectant les listes de jetons créées précédemment pour stocker les arguments.

### Les jetons délimiteurs sont également absorbés

Si la définition d’origine de la macro utilisait également des jetons servant de délimiteurs, TeX devrait aussi comparer la définition originale de la macro avec l’appel fait par l’utilisateur à cette macro, afin de trouver et faire correspondre les jetons délimiteurs. Une fois appariés/localisés, les jetons délimiteurs sont ensuite ignorés, car leur seul rôle est de servir de « ponctuation », aidant TeX à repérer et identifier les vrais jetons destinés à former chaque argument.

&#x20;[Partie 1](/latex/fr/articles-approfondis/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Partie 2](/latex/fr/articles-approfondis/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Partie 3](/latex/fr/articles-approfondis/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Partie 4](/latex/fr/articles-approfondis/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Partie 5](/latex/fr/articles-approfondis/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Partie 6](/latex/fr/articles-approfondis/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/fr/articles-approfondis/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.
