> 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/autres-sujets/23-how-tex-macros-actually-work-part-5.md).

# Comment fonctionnent réellement les macros TeX : partie 5

[Partie 1](/latex/fr/autres-sujets/19-how-tex-macros-actually-work-part-1.md) [Partie 2](/latex/fr/autres-sujets/20-how-tex-macros-actually-work-part-2.md) [Partie 3](/latex/fr/autres-sujets/21-how-tex-macros-actually-work-part-3.md) [Partie 4](/latex/fr/autres-sujets/22-how-tex-macros-actually-work-part-4.md) [Partie 5](/latex/fr/autres-sujets/23-how-tex-macros-actually-work-part-5.md) [Partie 6](/latex/fr/autres-sujets/24-how-tex-macros-actually-work-part-6.md)

## Introduction et aperçu

Dans la partie 4, nous avons passé en revue quelques propriétés de base des macros TeX en préparation des deux articles suivants, où nous examinons de près les mécanismes sous-jacents des macros TeX : les listes spécialisées de jetons. Dans ces deux derniers articles, nous utilisons des diagrammes, appelés listes de nœuds, qui ont été préparés à partir de données générées à l’aide d’une version spécialement modifiée du logiciel TeX original de Knuth — ces modifications étaient destinées à accéder aux structures de données internes de TeX, normalement inaccessibles à l’utilisateur. En se « branchant » sur les routines internes de traitement et d’exécution des macros de TeX, il a été possible d’écrire des données graphiques qui permettent une discussion plus détaillée et plus précise du comportement du traitement des macros de TeX. Overleaf espère que ces diagrammes aideront les lecteurs à mieux comprendre comment les macros TeX fonctionnent réellement.

### Lectures complémentaires possibles

Overleaf a déjà publié deux articles liés aux jetons qui fournissent des informations contextuelles supplémentaires sur les jetons TeX et les listes de jetons TeX. Veuillez prendre le temps de les consulter si vous avez besoin de combler certaines lacunes dans votre compréhension et de tirer le meilleur parti des parties 5 et 6 de cette série.

* [Qu’est-ce qu’un « jeton TeX » ?](/latex/fr/articles-approfondis/53-what-is-a-tex-token.md)
* [Qu’est-ce qu’une liste de jetons TeX ?](/latex/fr/articles-approfondis/54-what-is-a-tex-token-list.md)

## Les macros comme listes de jetons

Lorsque TeX détecte une commande de création de macro (`\def`, `\edef`, `\gdef` ou `\xdef`) dans le flux d’entrée, il déclenche un processus qui convertit les deux sections `<texte de paramètre><texte de remplacement>` de la définition de notre macro en une longue liste de jetons — mais d’un type de liste de jetons très particulier.

Les listes de jetons des macros sont légèrement différentes des autres listes de jetons utilisées dans TeX, car elles contiennent des valeurs de jetons « spéciales » que seuls des processus internes à TeX peuvent créer/générer : ces jetons spéciaux ne peuvent pas être créés directement par des commandes que vous pouvez inclure dans votre fichier .tex. TeX crée et utilise ces valeurs de jetons « spéciales » pour aider au traitement de votre appel de macro, comme nous allons l’explorer et l’expliquer ci-dessous.

### Un bref mot sur la manière dont les listes de jetons sont stockées : les nœuds

Pour stocker une liste de jetons (valeurs entières), TeX utilise une structure de données appelée [liste chaînée](https://en.wikipedia.org/wiki/Linked_list), qui, dans le cas de TeX, comprend une liste de soi-disant *nœuds*. Vous pouvez considérer un nœud comme un petit paquet de mémoire informatique pouvant servir à stocker un ensemble d’éléments de données. Pour stocker une macro, ces nœuds sont enchaînés comme une chaîne, où chaque nœud (maillon de la chaîne) peut stocker plusieurs informations, y compris une valeur de jeton et l’adresse mémoire du nœud suivant dans la liste. Pour plus d’informations, vous pouvez lire l’article [Qu’est-ce qu’une liste de jetons TeX](/latex/fr/articles-approfondis/54-what-is-a-tex-token-list.md) mais le diagramme suivant résume les principales caractéristiques d’une macro stockée sous forme de liste de jetons :

![Diagramme d’une liste de jetons de macro TeX stockée comme une liste chaînée de nœuds](/files/4d612183604201716ee1b12405fc2c94b4b6bded)

### Rappel : les 4 parties d’une définition de macro

Comme nous l’avons vu dans la partie 4, la structure de toute macro peut s’écrire ainsi :

```
<primitive de macro TeX><nom de macro><texte de paramètre>{<texte de remplacement>}
```

où :

* `<primitive de macro TeX>` = l’une des `\def`, `\edef`, `\gdef` ou `\xdef`;
* `<nom de macro>`= le nom de votre macro, tel que `\foo`;
* `<texte de paramètre>` peut être « nul » (absent) ou peut être une chaîne de jetons délimiteurs et de jetons de paramètre de macro ;
* `<texte de remplacement>` est le corps réel de votre macro : la section qui est « exécutée » lorsque vous appelez la macro.

**REMARQUE**: (Comme également observé dans la partie 4) tout au long de la discussion, nous supposons que `<nom de macro>` sera suivi d’un caractère espace de code de catégorie 10 pour agir comme délimiteur afin de terminer le `<nom de macro>`. Nous *n’avons pas* montré explicitement ce caractère espace dans notre texte/discussion, mais nous supposons qu’il est là. À strictement parler, nous devrions le représenter un peu comme ceci :

```
<primitive de macro TeX><nom de macro><espace><texte de paramètre>{<texte de remplacement>}
```

Cependant, nous omettrons l’inclusion explicite d’un `<espace>` caractère et supposerons implicitement sa présence.

**REMARQUE**: Les caractères `{` et `}` *ne deviennent pas* partie de la liste de jetons de la macro : leur rôle est simplement d’indiquer au scanner d’entrée de TeX (qui crée les jetons) où le `<texte de remplacement>` commence et s’arrête.

Lorsque TeX définit une macro, les sections `<texte de paramètre><texte de remplacement>` sont converties en une seule longue liste continue de jetons — le nombre total de jetons dans cette liste dépend de la complexité de la macro. Comme nous l’avons vu, la section a pour rôle spécifique de servir de « modèle de jetons » ou de « plan » que TeX utilise pour extraire les jetons qui forment les arguments (valeurs) à utiliser avec la macro réelle : c’est-à-dire les jetons à fournir au `<texte de remplacement>`.

Pour affermir ces idées, prenons un exemple de macro, mais restons concis afin que les diagrammes suivants ne deviennent pas trop chargés :

```
\def\foo A#1\fake{123 #1}
```

Pour notre macro, `\foo`

* `<texte de paramètre>` = `A#1\fake`
* `<texte de remplacement>` = `123 #1`

Bien que cet exemple soit une macro simple, il contient toutes les caractéristiques dont nous avons besoin pour l’explorer.

Comme indiqué, TeX convertira `<texte de paramètre><texte de remplacement>` en une longue liste de jetons que vous pouvez voir dans le diagramme ci-dessous. Dans notre exemple, les jetons formés à partir de `A#1\fake{123 #1}` ont été convertis en une séquence continue de jetons stockés dans une liste de jetons (sous forme de liste chaînée de nœuds).

## Schéma montrant une véritable liste de jetons de macro

Le diagramme suivant, montrant comment la macro `\def\foo A#1\fake{123 #1}` est stockée, utilise de vraies données provenant de l’intérieur d’un moteur TeX. Il a été créé à l’aide d’une [version personnalisée de TeX de Knuth](/latex/fr/articles-approfondis/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) qui a été modifiée avec du code supplémentaire pour intercepter les appels de macro, examiner les données internes de TeX et les exporter dans un format pouvant être traité à l’aide d’un programme graphique open source appelé [Graphviz](https://www.graphviz.org/).

Vous pouvez télécharger le graphique suivant sous forme de [fichier PDF](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 Ko) ou [fichier SVG](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1,8 Mo).

![Diagramme d’une liste de jetons TeX annotée](/files/cf44631f2a0e5d8e29324c02c74bbcbeb3636e50)

#### Comprendre les nœuds

Dans le diagramme ci-dessus, vous verrez que chaque nœud contient deux éléments de données appelés le **nœud suivant** et le **nœud courant**. Ce ne sont que des valeurs entières qui représentent des emplacements mémoire à l’intérieur de TeX — des emplacements où d’autres nœuds sont stockés. Les valeurs de **nœud suivant** et **nœud courant** ne sont pas importantes, elles stockent simplement les emplacements (adresses mémoire) qui permettent d’enchaîner les nœuds dans une liste.

![La signification de nœud suivant et de nœud courant](/files/501d4e9f046b78fd8b77ddb3fd60473ff6581c60)

#### Retour à l’exemple

Dans le diagramme des nœuds, la liste de jetons formée à partir de `A#1\fake{123 #1}` contient plusieurs « jetons spéciaux » introduits au début de cet article. En outre, la liste de nœuds représentant notre macro commence par un « premier nœud spécial » : nous allons explorer ce qu’ils sont et ce qu’ils font.

Le tout premier élément d’une liste de jetons de macro (et de certains autres types de listes de jetons) ne stocke pas une valeur de jeton mais un élément de données appelé *compteur de références* de la macro, que TeX utilise pour suivre l’utilisation de la macro.

![Un nœud de compteur de références est le premier d’une liste de jetons](/files/363e4d30ebb1c6aeb9536b9a16ac0633c87223eb)

Le premier jeton de `<texte de paramètre>` est stocké dans le nœud qui suit immédiatement le compteur de références : vous pouvez voir qu’il s’agit d’un jeton représentant la lettre `A` avec le code de catégorie 11. D’après les discussions des parties 2 et 3, nous savons qu’un jeton de caractère est calculé à l’aide de

$$\text{token value}=256\times \text{category code} + \text{character code}$$

qui, pour une lettre `A` avec le code de catégorie 11, est

$$\text{token value}=256\times 11 + 65$$

donnant la valeur 2881, comme indiqué dans le nœud.

#### La « commande » \fake utilisée dans \foo

Dans notre définition de macro `\def\foo A#1\fake{123 #1}` l’un des délimiteurs est un *indéfini* commande `\fake` qui est stocké dans la liste de jetons dans le cadre de la `<texte de paramètre>` section. Comme vous pouvez le voir, dans la liste de jetons globale de la macro `\fake` est un jeton dont la valeur est `19491`— une valeur entière calculée par TeX à l’aide de la formule discutée dans la partie 3. Lorsque TeX tente d’exécuter `\foo` il s’attendra à trouver la valeur de jeton `\fake` à la fin de la `<texte de paramètre>` section. TeX *n’essaiera pas de* d’exécuter la `\fake` commande parce que son rôle est simplement de fournir une sorte de « ponctuation » dans le `<texte de paramètre>` « modèle de jetons ».

![Utiliser un jeton de commande comme délimiteur de macro](/files/c171882ef793cf0431bc3ea33da5a51c2c4dfb61)

#### Jetons spéciaux dans la liste de jetons

**Le jeton de « fin de correspondance »**

Lors de l’appel d’une macro, la première tâche de TeX est d’analyser la macro telle qu’elle est tapée par l’utilisateur et de comparer les jetons présents dans la `<texte de paramètre>` section de l’utilisateur avec les jetons contenus dans le modèle `<texte de paramètre>` stocké en mémoire (créé au moment où la macro a été définie). Parce que la définition complète de la macro, construite à partir de `<texte de paramètre><texte de remplacement>` est stockée comme une seule longue liste continue de jetons, TeX doit savoir où, dans cette liste de jetons, `<texte de paramètre>` *s'arrête* et où `<texte de remplacement>` *démarre*. Pour ce faire, lorsque TeX définit la macro (en construisant la liste de jetons), il insère un jeton terminateur spécial appelé **jeton de fin de correspondance** comme tout dernier jeton de l’ensemble des jetons générés à partir de `<texte de paramètre>`. Le **jeton de fin de correspondance** ce jeton ne peut pas être généré par les commandes de l’utilisateur, seul TeX lui-même peut le créer, d’où la certitude de TeX de détecter la fin de la `<texte de paramètre>`.

![Affichage du jeton de fin de correspondance dans une liste de jetons TeX](/files/618fd9ef0407aff87a499457613a5e8069c23493)

Ici, nous pouvons voir que le premier jeton suivant **jeton de fin de correspondance** est un jeton représentant le chiffre `1` Cela est à prévoir, car le `<texte de remplacement>` pour notre macro `\foo` est `123 #1`— c’est-à-dire qu’il commence par le jeton représentant le chiffre `1` (avec le code de catégorie 12).

D’après la discussion dans les parties 2 et 3, nous savons qu’un jeton de caractère est calculé à l’aide de

$$\text{token value}=256\times \text{category code} + \text{character code}$$

qui, pour un chiffre `1` avec le code de catégorie 12, est

$$\text{token value}=256\times 12 + 49$$

donnant la valeur de jeton 3121, comme indiqué dans le nœud.

**jetons « paramètre de correspondance »**

Lorsque TeX stocke la définition de la macro, il convertit tout jeton de paramètre (`#1`, `#2`… `#9`) dans `<texte de paramètre>` en un jeton appelé **paramètre de correspondance** Ces jetons indiquent à TeX qu’il doit commencer à chercher, dans l’appel de macro de l’utilisateur, les jetons qui sont les arguments de la macro.

![Affichage du jeton de paramètre de correspondance dans une liste de jetons TeX](/files/8059ee841f9574c8b54c661a9fd2f3744ba73741)

### Jetons spéciaux dans la liste de jetons

#### jetons « paramètre de sortie »

Lorsque TeX a tout traité et est prêt à réellement exécuter (développer) la macro, le **paramètre de sortie** des jetons indique à TeX les emplacements dans le `<texte de remplacement>` où il doit injecter les jetons représentant les arguments fournis par l’utilisateur lorsque la macro a été appelée. En effet : « À cet emplacement, insérez les jetons représentant l’argument n de l’utilisateur, où n=1...9 ».

Dans la `<texte de remplacement>` section de la liste de jetons stockée de la définition de macro, il y aura un **paramètre de sortie** jeton correspondant à chaque `#1`, `#2`... `#9` présent dans la définition originale.

![Affichage du jeton de paramètre de sortie dans une liste de jetons TeX](/files/ca083cd934488a563af1d72b81aaa38babe6bfe5)

Si nous regardons notre définition de `\foo` (`\def\foo A#1\fake{123 #1}`) nous voyons qu’il n’y a qu’un seul paramètre de macro (`#1`) dans la `<texte de paramètre>` (`A#1\fake`) et, par conséquent, un seul paramètre de macro (`#1`) apparaît ensuite dans la `<texte de remplacement>` (`123 #1`) : cela ne donne qu’un seul **paramètre de sortie** jeton présent dans la liste de jetons représentant la `<texte de remplacement>`.

Remarquez ce qui suit dans la liste de nœuds représentant `\foo`de `<texte de remplacement>`:

* le jeton immédiatement avant le **paramètre de sortie** jeton représente un caractère espace (code de catégorie 10, code de caractère 32) parce qu’il y a un espace entre le `123` et le paramètre de macro (`#1`) dans la définition originale de `\foo`;
* le **paramètre de sortie** est le dernier jeton de la liste : le **nœud suivant** a une valeur spéciale « nulle » (c’est-à-dire « vide ») qui sert à terminer la liste : il n’y a plus de nœuds après **paramètre de sortie** car c’est le jeton final, indiquant la fin de la `<texte de remplacement>` et donc la fin de la définition de macro.

## Partie 6

Dans la partie 6, nous utilisons quelques graphiques détaillés pour expliquer et explorer la signification exacte de l’expansion des macros et les conséquences de la tokenisation par TeX des arguments de macro avant de les fournir à la `<texte de remplacement>`.

[Partie 1](/latex/fr/autres-sujets/19-how-tex-macros-actually-work-part-1.md) [Partie 2](/latex/fr/autres-sujets/20-how-tex-macros-actually-work-part-2.md) [Partie 3](/latex/fr/autres-sujets/21-how-tex-macros-actually-work-part-3.md) [Partie 4](/latex/fr/autres-sujets/22-how-tex-macros-actually-work-part-4.md) [Partie 5](/latex/fr/autres-sujets/23-how-tex-macros-actually-work-part-5.md) [Partie 6](/latex/fr/autres-sujets/24-how-tex-macros-actually-work-part-6.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/autres-sujets/23-how-tex-macros-actually-work-part-5.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.
