> 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/19-how-tex-macros-actually-work-part-1.md).

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

[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 : objectifs de cette série

Cette série d'articles a un objectif ambitieux : expliquer *comment* Les macros TeX (comme les commandes LaTeX) fonctionnent en réalité — au niveau le plus fondamental, au sein même du moteur TeX. Au lieu de s’appuyer *uniquement* sur une série de macros d’exemple conçues pour démontrer diverses fonctionnalités, cas limites et comportements de TeX, nous allons examiner TeX lui-même pour voir *comment* et *pourquoi* pourquoi ses méthodes de programmation des macros fonctionnent comme elles le font.

Pour atteindre notre objectif, nous devons commencer par aborder des sujets assez bas niveau et, au début, ceux-ci peuvent sembler quelque peu éloignés de la tâche de la composition de vos documents. Espérons qu’après avoir approfondi le sujet, vous en ressortirez avec des bases pour mieux comprendre, ce qui, au final, vous fera gagner beaucoup de temps et, peut-être, réduira aussi le niveau de frustration.

### Le langage de programmation TeX : vous connaissez ce sentiment ?

Il n’est pas excessivement sévère de décrire le langage de programmation TeX comme quelque peu ésotérique, car il l’est — du moins selon les critères de la plupart des langages de programmation grand public utilisés aujourd’hui. À mesure que vous commencez votre parcours pour en apprendre davantage sur TeX/LaTeX, en particulier si vous voulez écrire des macros non triviales, vous rencontrez rapidement des notions telles que les codes de catégorie, les jetons/la tokenisation et « l’expansion » des commandes ou des macros. Cette pluie de concepts est susceptible d’être assez étrangère, vous laissant peut-être perplexe et, à certains moments, légèrement frustré, car votre chemin vers le succès n’est pas toujours facilité par certains messages d’erreur presque impénétrables de TeX/LaTeX.

## Alors, par où commencer ? Par les codes de catégorie.

Les moteurs TeX appartiennent à une catégorie de logiciels appelés [compilateurs](https://en.wikipedia.org/wiki/Compiler): des programmes qui prennent en entrée un fichier écrit dans une *langue* source et *compilent* (transforment) celui-ci en un fichier de sortie écrit dans une *langue* cible. Plus précisément, TeX est un *compilateur de documents*. Pour les moteurs TeX (compilateurs), le fichier d’entrée est écrit dans le langage de composition TeX et la cible est un fichier de sortie écrit dans un autre « langage » tel que [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) ou PDF — bien que nous prenions ici une certaine liberté avec notre notion de « langage ».

Examinons de plus près le « langage » source, ou d’entrée, utilisé pour écrire votre fichier TeX. Un `.tex` fichier est, en fin de compte, une longue séquence de caractères (y compris les caractères de saut de ligne) : composée de texte destiné à être composé, entrecoupé de `\`, `}`, `$`, `[` et de toutes sortes de caractères qui peuvent apparaître dans un ensemble apparemment quasi infini de combinaisons. Quiconque n’utilise pas TeX/LaTeX pourrait regarder un `.tex` fichier et être pardonné de le percevoir comme un méli-mélo assez déroutant de caractères avec peu, voire aucune, structure de fichier visible. Le paquet de macros LaTeX impose certainement en partie une certaine structure de base à un fichier d’entrée .tex. Cependant, entre les `\begin{document}` et `\end{document}` c’est à l’auteur du document de décider ce qui y figure. Si vous regardez `.tex` des fichiers écrits à l’aide du paquet de macros Plain TeX original de Knuth, vous verrez que la structure du document est presque totalement absente.

Ainsi, en général, un fichier d’entrée TeX peut sembler assez peu structuré, un mélange apparemment arbitraire de contenu à composer et d’instructions (commandes) qui guident la composition de ce contenu. Comment TeX peut-il seulement donner un sens à un fichier d’entrée TeX typique `.tex` : filtrer ce fatras de caractères entrant pour en extraire des instructions exploitables pour le moteur de composition et le contenu à composer ?

### Filtrer le fatras : dites bonjour aux codes de catégorie

Tout observateur humain, qui ne connaît rien à TeX, pourrait regarder un `.tex` fichier et reconnaître certains caractères tels que `$` et savoir que c’est le signe d’une monnaie, ou voir un `&` et l’identifier comme une esperluette. Cet observateur déduit une *signification* pour chaque caractère qu’il voit — une signification fondée sur le rôle que ce caractère joue dans la communication humaine. De plus, il peut voir des caractères tels que `a`, `e`, `o` et savoir qu’ils sont classés comme voyelles, tandis que d’autres, tels que `b`, `c` ou `d` sont classés comme consonnes. En tant qu’êtres humains, nous avons une sorte de table de consultation intégrée (dans notre mémoire) grâce à laquelle nous attribuons une signification à chaque caractère que nous voyons — une signification fondée sur le rôle que ce caractère joue dans les langues dans lesquelles nous sommes capables de communiquer.

Pour traiter un `.tex` fichier, le logiciel TeX doit lui aussi examiner chaque caractère de votre entrée et il doit également attribuer une *signification* signification

à chacun des caractères qu’il « voit ». Cependant, TeX n’est qu’une machine logicielle qui traite du texte — stocké sous forme de séquence d’entiers (codes de caractères) situés dans un fichier d’entrée. En tant que machine, TeX doit être programmé avec les données pertinentes qui lui indiquent comment déterminer la signification d’un caractère qu’il est en train de « regarder » et ensuite ce qu’il doit en faire. Comment TeX y parvient-il ? *codes de catégorie,* dont il existe 16, allant de 0 à 15. Du point de vue de TeX, chaque caractère qu’il s’attend à voir dans un `.tex` fichier a un soi-disant *code de catégorie* préaffecté. *actuellement* affecté à chaque caractère que TeX pourrait voir dans un fichier d’entrée .tex. Vous devez considérer les codes de catégorie de TeX comme attribuant une *signification* à chaque caractère individuel dans le flux d’entrée que TeX doit examiner (scanner).

Pour composer votre document, un moteur TeX doit lire (scanner) chaque caractère, mais l’intérêt immédiat de TeX ne porte pas sur les caractères eux-mêmes (codes de caractères) : le *code de catégorie* d’un caractère est plus important lors du balayage de l’entrée. Le *code de catégorie* actuel détermine la *signification actuelle* de ce caractère *au moment où TeX le lit*: ce code de catégorie détermine comment TeX traitera/traitera chaque caractère — nous expliquerons pourquoi nous disons « code de catégorie actuel » et « signification actuelle ». C’est grâce aux codes de catégorie que TeX est capable de filtrer le fatras entrant de caractères afin de distinguer les caractères (contenu) destinés à être composés et les caractères qui forment des instructions à traiter —*commandes* que TeX doit exécuter.

Le tableau suivant répertorie ces 16 codes de catégorie : ce que chacun signifie, ainsi que des exemples de caractères typiquement attribués à chaque catégorie.

| **Code de catégorie** | **Description**                                                                       | **LaTeX/TeX standard**                                                      |
| --------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| 0                     | Caractère d’échappement — indique à TeX de commencer à chercher une commande          | `\`                                                                         |
| 1                     | Début d’un groupe                                                                     | {                                                                           |
| 2                     | Fin d’un groupe                                                                       | }                                                                           |
| 3                     | Basculement mathématique — passage en mode mathématique / sortie du mode mathématique | $                                                                           |
| 4                     | Tabulation d’alignement                                                               | &                                                                           |
| 5                     | Fin de ligne                                                                          | Code ASCII 13 (`\r`)                                                        |
| 6                     | Paramètre de macro                                                                    | #                                                                           |
| 7                     | Exposant — pour la composition mathématique : `$y=x^2$` $$y=x^2$$                     | ˆ                                                                           |
| 8                     | Indice — pour la composition mathématique : `$y=x_2$` $$y=x\_2$$                      | \_                                                                          |
| 9                     | Caractère ignoré                                                                      | ASCII 0 `<nul>`                                                             |
| 10                    | Espace                                                                                | Codes ASCII 32 (espace) et 9 (caractère de tabulation)                      |
| 11                    | Lettre                                                                                | A...Z, a...z, (et des milliers de caractères Unicode)                       |
| 12                    | Autre                                                                                 | 0...9 plus ,.;?" et bien d’autres                                           |
| 13                    | Caractère actif                                                                       | Code de catégorie spécial pour créer des macros à un seul caractère comme ˜ |
| 14                    | Caractère de commentaire — ignorer tout ce qui suit jusqu’à la fin de la ligne        | %                                                                           |
| 15                    | Caractère invalide, non autorisé à apparaître dans le fichier d’entrée .tex           | Code ASCII 127 (`DEL`)                                                      |

L’utilisation des codes de catégorie est le mécanisme essentiel de TeX pour filtrer son flux entrant de caractères, afin de donner un sens à votre entrée et de déterminer :

* les caractères qui composent le texte à mettre en forme ;
* le contenu délimitant qui doit être composé en mathématiques ;
* les suites de caractères qui sont des noms de commandes à traiter ou à exécuter ;
* … et de nombreuses autres opérations de composition.

Au début, vous pourriez penser que le code de catégorie de chaque caractère (sa signification) est une sorte d’attribution fixe : immuable et gravée à jamais dans les fondations internes du logiciel TeX, mais ce n’est pas le cas. Comme indiqué, TeX conserve une table de consultation interne pour stocker les détails de quel code de catégorie est *actuellement* attribué à chaque caractère — nous disons très délibérément *actuellement attribué* car le code de catégorie de n’importe quel caractère (pas encore lu) peut être modifié en utilisant une commande primitive (intégrée) appelée `\catcode`catcode. Cela apporte une flexibilité considérable, car vous pouvez, si vous le souhaitez, changer complètement la manière dont TeX traitera ou interprétera la signification de n’importe quel caractère lu par la suite dans l’entrée, offrant ainsi un immense potentiel pour des applications de composition sophistiquées.

Si vous êtes surtout intéressé par l’utilisation de LaTeX pour « faire le travail », il y a de fortes chances que vous n’ayez pas rencontré directement les codes de catégorie, sauf peut-être à travers certains messages d’erreur que vous avez pu voir. Mais rassurez-vous, les codes de catégorie sont un composant essentiel du fonctionnement d’un moteur TeX : ils permettent à LaTeX (et aux paquets LaTeX) d’effectivement faire le travail de composition de votre document.

Lorsque votre moteur TeX démarre («[amorçage](https://en.wikipedia.org/wiki/Bootstrapping)») il utilisera un ensemble d’affectations par défaut des caractères aux codes de catégorie mais, via la `\catcode` commande, ces valeurs par défaut peuvent être modifiées par le code de base de LaTeX (macros) et/ou par les paquets LaTeX que vous avez chargés — ou même par votre propre code TeX ou vos macros. Cependant, au fil du temps et par tradition/usage, certains caractères affectés à des codes de catégorie particuliers sont devenus acceptés comme des « standards » et le respect de ces standards est certainement souhaitable si vous voulez que vos documents soient portables et facilement partagés avec des collègues ou d’autres utilisateurs. Par exemple, le `\` caractère est affecté au code de catégorie 0 pour indiquer le début d’une commande TeX/LaTeX — voir le [tableau ci-dessus](#tbl-0).

### Lecture (balayage) de l’entrée

Lorsque TeX lit (balaye) le caractère suivant de votre fichier d’entrée, la toute première chose qu’il fait est d’examiner son code de catégorie, alors regardons de plus près ce qui se passe lorsque TeX lit une ligne typique d’entrée.

Supposons que nous ayons un fichier .tex qui contient le texte `Hello World \jobname` quelque part dans un paragraphe. Si nous regardons à l’intérieur du `.tex` fichier à l’aide d’un [éditeur hexadécimal](https://en.wikipedia.org/wiki/Hex_editor), nous voyons que la séquence de caractères `Hello World \jobname` dans notre `.tex` fichier n’est qu’une suite d’entiers, ou de *codes de caractères*, comme indiqué dans la capture d’écran ci-dessous sous forme de séquence hexadécimale :

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![Codes de caractères hexadécimaux dans un fichier TeX](/files/b3cd38cfb007b7eaceb13b495e9eb37c883ba5c6)

Si nous convertissons de l’hexadécimal (base 16) au décimal (base 10), la séquence de codes de caractères est :

![Codes de caractères décimaux dans un fichier TeX](/files/a3f470553e9dedcadb67af8a11ab7a32701ed6f4)

Nous savons aussi que, pour TeX, chaque caractère a un code de catégorie correspondant ; donc, à partir de [tableau ci-dessus](#tbl-0) nous savons que les affectations par défaut de codes de catégorie suivantes sont (probablement) également utilisées :

![Codes de catégorie TeX](/files/3bc203a11e82f762cb83819882d513ffb380dd2a)

Ainsi, pour TeX, chaque caractère du fichier d’entrée est représenté par *deux* valeurs numériques — son code de caractère et son code de catégorie :

![Codes de caractères et codes de catégorie TeX correspondants](/files/740ddb4ad4088db25e90c4015bd91e52b5578ad5)

À ce stade, nous ne considérons que la toute première étape du traitement de votre fichier par TeX : le balayage des caractères individuels. Alors, que fait exactement TeX avec ces paires de codes de caractères et de codes de catégorie ? Une fois que TeX a balayé un caractère individuel et recherché son code de catégorie correspondant, comment exactement TeX utilise-t-il cette information pour « filtrer » les caractères entrants ?

## Partie 2

Dans la partie 2, nous examinons de plus près comment TeX lit votre entrée : en prétendant être les « yeux » de TeX lorsqu’il regarde votre entrée, caractère par caractère.

[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/19-how-tex-macros-actually-work-part-1.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.
