> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Comment LaTeX compose-t-il les en-têtes et les pieds de page ?

## Comment LaTeX compose-t-il les en-têtes et les pieds de page ?

### Introduction

Si vous cherchez un guide pratique sur la modification des en-têtes et des pieds de page, veuillez [consulter notre page d’aide](/latex/fr/mise-en-forme/02-headers-and-footers.md) car cet article se concentre sur l’explication des mécanismes de bas niveau utilisés par les moteurs TeX, et par LaTeX, pour produire des en-têtes et des pieds de page.

* **Note (mise à jour)**: Cet article explore le mécanisme de marque de base de LaTeX utilisé avant juin 2022, date à laquelle une nouvelle implémentation plus polyvalente de la gestion des marques de LaTeX a été introduite. Voir [Présentation du nouveau mécanisme de marques de LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) pour plus de détails. Pour des raisons de compatibilité ascendante, LaTeX continue de prendre en charge son ancien mécanisme de marques. Le contenu de l’article traitant du comportement des moteurs TeX n’est pas affecté par ces changements dans LaTeX.
* **Remarque**: les termes « LaTeX », « TeX » et « moteur TeX » sont utilisés tout au long de ces discussions, il est donc utile d’en comprendre la signification — voir l’article Overleaf [Ce qu’il y a dans un nom : guide des nombreuses variantes de TeX](/latex/fr/articles-approfondis/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) pour plus d’informations.

Pour fournir un contexte utile, nous commençons par un aperçu de quelques domaines de bas niveau pertinents de la composition typographique fondée sur TeX — y compris le stockage temporaire (interne) de contenu, les sauts de page et la construction des pages. Les discussions ont été simplifiées en considérant une page composée contenant un « corps » de texte ainsi que quelques en-têtes et pieds de page. Les éléments de page tels que les figures (flottantes) et les notes de bas de page ne sont pas abordés, car ils impliquent un mécanisme TeX complexe appelé *insertions*, qui est bien au-delà du cadre de cet article.

Nous commencerons par la notion de base de *nœuds*: les blocs fondamentaux utilisés par les moteurs TeX pour le stockage temporaire (interne) du contenu.

### Quelques notes sur le stockage du contenu : les nœuds TeX

Lorsque le moteur TeX sous-jacent traite votre code LaTeX pour produire du contenu composé — comme des paragraphes, des tableaux et des mathématiques —, il doit stocker temporairement ce contenu dans la mémoire du moteur TeX utilisé pour traiter votre code LaTeX. Pour stocker le contenu composé, les moteurs TeX utilisent une séquence de soi-disant *nœuds*nœuds, que l’on peut considérer comme des « blocs » de mémoire informatique (du dispositif) de taille variable, reliés entre eux pour former une liste (voir cet [article Wikipédia sur les structures de données chaînées](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Représentation schématique de la manière dont les moteurs TeX stockent le contenu à l’aide de nœuds chaînés](/files/bd18fcb8eec464c4d0085f546c9baf97cde430cf)

Pour représenter les éléments fondamentaux de la composition typographique fondée sur TeX — tels que les caractères, la colle, les boîtes, les pénalités, les kerns et les [*marques*](#why-were-here-understanding-mark-nodes) pour n’en citer que quelques-uns — les moteurs TeX utilisent différents *types* types de nœud. Certains nœuds, comme ceux des boîtes, doivent stocker davantage de données que des types de nœuds plus simples tels que les nœuds de caractère ; par conséquent, certains nœuds sont plus grands que d’autres — nécessitant davantage d’octets pour les stocker en mémoire. En lisant sur TeX, vous pouvez rencontrer des termes tels que *nœuds de caractère*, *nœuds de colle*, [*nœuds de marque*](#why-were-here-understanding-mark-nodes) et ainsi de suite : vous savez désormais qu’il s’agit simplement de noms donnés à des blocs de mémoire alloués pour stocker des données représentant un élément de la composition typographique TeX.

#### Pourquoi nous sommes ici : comprendre les nœuds de marque

Parmi les nombreux types de nœuds, celui dont nous devons parler s’appelle un *nœud de marque* qui est créé par la `\mark` commande :

```latex
\mark{stuff to store}
```

Le `\mark` commande ne produit directement aucun contenu composé : son argument `*stuff to store*` est enregistré en mémoire pour une utilisation ultérieure et un *nœud de marque* est créé pour contenir l’emplacement mémoire de *stuff to store*. Comme nous le verrons, la `\mark` commande a été créée *spécifiquement* pour aider à produire des en-têtes et des pieds de page.

Les nœuds de marque créés par les `\mark` commandes sont « intégrés » dans le contenu de la page, prêts à être utilisés lors des dernières étapes de la composition de la page, lorsque le moteur TeX est prêt à ajouter des en-têtes et des pieds de page à la page composée (corps). En général, `*stuff to store*` contiendra des éléments tels que les numéros de page et les titres/numéros de chapitre ou de section — les briques de base des en-têtes et des pieds de page.

#### ε-TeX ajoute la commande \marks

[La version 2 de ε-TeX](https://texdoc.org/serve/e-TeX/0), une extension du TeX original de Knuth, a été publiée en 1998 et offre de nouvelles capacités ainsi que des améliorations des fonctionnalités existantes. Aujourd’hui, la plupart des améliorations de ε-TeX ont été intégrées aux moteurs TeX courants : pdfTeX, LuaTeX et XeTeX — voir l’option de ligne de commande [**`-etex`** des moteurs TeX](/latex/fr/autres-sujets/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) qui permet d’utiliser les extensions ε-TeX.

Le logiciel TeX original de Knuth fournit la commande \mark qui ne crée qu’une seule « classe », ou « type », de nœud de marque. Votre document pourrait inclure de nombreuses commandes \mark, mais elles créent toutes des nœuds de marque du même « type » ou de la même « classe » — il n’existe aucun mécanisme intégré pour les regrouper ou les classer. Cette restriction a été supprimée par une amélioration de ε-TeX : la commande \marks, prise en charge par pdfTeX, LuaTeX et XeTeX :

```latex
\marks n {stuff to store}
```

où `n` est un entier (`0` <= `n` < `32768`) qui détermine le nœud de marque *classe*.

Remarques :

* écriture `\marks 0` (c.-à-d.  `n`=`0`) est synonyme de l’utilisation du `\mark` commande
* ε-TeX a également introduit des variables de marque ([voir plus loin](#pre-output-checks-looking-for-mark-nodes)) pour chaque classe (`n`) de marque : `\firstmarks n`, `\topmarks n` et `\botmarks n`. Certaines classes de variables de marque pouvaient être utilisées pour fournir des données de marque pour des tâches typographiques spécifiques.
* LuaTeX a augmenté la valeur maximale de `n` à `65535`, permettant $$2^{16}$$ des classes de marques

### Raisons de l’utilisation des marques par TeX

Pour comprendre *pourquoi* (et comment) les moteurs TeX utilisent la `\mark` (ou `\marks`) commande pour produire des en-têtes et des pieds de page, nous devons apprécier certaines « particularités » des mécanismes du moteur TeX pour construire les pages — trouver les sauts de page et exporter les pages terminées vers un fichier PDF. En réalité, ces processus de construction des pages sont complexes, mais les principes/concepts de base peuvent être simplifiés afin de fournir suffisamment d’explications de contexte qui aident à comprendre les marques.

À mesure qu’un moteur TeX termine la composition d’éléments de contenu individuels tels que des paragraphes, des tableaux ou des formules, il appelle une routine interne (une fonction appelée `build_page(...)`) qui tente d’ajouter ces éléments nouvellement composés à la page en cours de construction en mémoire. Lorsque ce nouveau contenu est ajouté à la page en cours de construction, TeX vérifie également si ce contenu nouvellement ajouté a rendu la page actuelle « suffisamment pleine ». Si la page est pleine, TeX peut créer un *saut de page*— envoyant cette quantité de contenu pour un traitement final (« emballage ») puis une sortie ultérieure vers le fichier PDF.

Une caractéristique clé de l’étape finale de l’emballage de la page (composition) est ce qu’on appelle une *routine de sortie* qui est, en pratique, une séquence de commandes définie par l’utilisateur, utilisée pour empaqueter la page de contenu afin qu’elle soit prête à être envoyée au fichier PDF. Une activité d’« empaquetage » consiste par exemple à ajouter des en-têtes et des pieds de page, mais il existe de nombreuses façons d’utiliser les routines de sortie — par exemple, voir [cet article dans TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Les routines de sortie sont un domaine assez complexe de TeX, nous n’entrerons donc pas dans les détails ici : pour l’instant, retenez simplement que l’étape finale de la composition de la page implique l’utilisation d’une séquence définie par l’utilisateur de commandes (collectivement appelée une *routine de sortie*).

Mais considérons ce qui pourrait se passer lorsque TeX termine la composition d’un long paragraphe de texte, en le découpant en une séquence de lignes composées individuelles. TeX voudra ajouter ce paragraphe nouvellement composé — ligne par ligne — à la page en cours de construction mais, peut-être, seulement *une partie* de ces lignes peut tenir sur la page actuelle. Notez que par « page », nous faisons référence à la zone principale du texte (corps de page) qui *ne déclenche pas* n’inclut pas d’autres éléments de page tels que les en-têtes et les pieds de page qui sont ajoutés plus tard (par la routine de sortie).

Après que plusieurs lignes du paragraphe ont été ajoutées à la page actuelle, celle-ci peut devenir « suffisamment pleine » et il est temps pour TeX de créer un saut de page. Cependant, nous avons du contenu « en trop » car seule *part* une partie du paragraphe a été intégrée à la page actuelle : le « contenu excédentaire du paragraphe » est conservé pour plus tard, prêt pour la création de la *suivant* page. Le graphique suivant illustre cette idée : une partie du paragraphe se trouve sur la *code de catégorie* page et une autre partie est retenue pour la *suivant* page.

![Représentation schématique d’un paragraphe s’étendant de part et d’autre d’un saut de page](/files/9b5b13456f8334ba175267ec5cdce0961521837d)

Cet exemple de paragraphe montre qu’un moteur TeX traitera souvent (composera) des morceaux de contenu qui ne peuvent pas, *dans leur totalité*, tenir sur la page actuelle — parce que ce contenu dépasse le point où un saut de page devient nécessaire. Rappelez-vous que les moteurs TeX trouvent les césures en saisissant, puis en composant, *des paragraphes entiers* et, contrairement à certaines applications, n’adoptent pas une approche ligne par ligne pour la composition des paragraphes. En d’autres termes, TeX compose *l’intégralité* du paragraphe, qu’il tienne ou non sur la page actuelle (cela est déterminé plus tard). Au passage, le principe consistant à « composer en entier puis ajouter à la page actuelle » vaut aussi pour d’autres types de contenu TeX, notamment les tableaux qui sont entièrement lus depuis le fichier .tex et composés dans leur totalité avant toute tentative de les ajouter à la page actuelle.

Pour notre exemple de paragraphe, le texte complet de ce paragraphe, *y compris toutes les commandes contenues dans ce texte*, a été entièrement traité — ce qui signifie que la composition TeX a atteint un certain emplacement dans votre `.tex` fichier. L’« état interne courant » du moteur TeX, comme la valeur des variables ou des réglages de paramètres stockés, reflétera le contenu, y compris toutes les commandes, traité jusqu’à l’emplacement courant — la fin du paragraphe.

Bien que le paragraphe complet ait été composé, une partie ne peut pas être accueillie par la page actuelle, ce qui entraîne l’enregistrement du « contenu excédentaire du paragraphe » pour la *suivant* page. Dans le code LaTeX (texte plus commandes) qui a produit le « contenu excédentaire du paragraphe », le moteur TeX *pourrait* avoir appelé un nombre quelconque de commandes et de macros qui ont modifié les valeurs et les variables stockées en interne par le moteur TeX — c.-à-d. qui ont modifié « l’état courant » de TeX.

Le diagramme suivant illustre une particularité extrêmement importante de TeX, qui a des répercussions sur plusieurs aspects de la composition typographique fondée sur TeX. En regardant la partie droite du diagramme, vous voyez une représentation des nœuds composant tout le contenu actuellement stocké en mémoire : la zone gris clair contient les nœuds formant la *code de catégorie* page et la zone gris foncé contient le contenu composé destiné à la *suivant* page. Cette situation reflète notre exemple de paragraphe : la zone gris foncé représente le « contenu excédentaire du paragraphe » : des lignes de texte retenues parce qu’elles ne tiennent pas sur la page actuelle.

![Représentation schématique de l’emplacement du nœud où TeX trouve un saut de page, montrant également le contenu retenu pour la page suivante](/files/d397331d459a5167abd2ecac30555472de5a51f1)

Rappelez-vous qu’une fois que TeX dispose d’une page (corps) « suffisamment pleine », il transmet ce contenu à ce qu’on appelle une *routine de sortie* qui est une séquence de commandes définie par l’utilisateur. Entre autres choses, la routine de sortie ajoute des en-têtes et des pieds de page au corps de la page, finalisant ainsi la page en vue de son exportation vers le fichier PDF.

Notre graphique (ci-dessus) représente le cas où TeX a choisi d’effectuer un saut de page à un nœud particulier, tel que `\baselineskip` la colle entre les lignes composées, et est prêt à commencer l’emballage de la page actuelle à l’aide de la routine de sortie — une séquence de commandes intégrées et de macros définies par l’utilisateur. *Cependant*, en plus du contenu constituant la page actuelle (stocké en mémoire), TeX a déjà traité et stocké (en mémoire) *du contenu supplémentaire*, provenant de votre `.tex` fichier. Ce contenu supplémentaire s’étend *au-delà du saut de page* et *pourrait* a pu inclure des commandes qui ont modifié des valeurs ou des variables importantes liées à la page, affectant l’« état interne courant » de TeX — qui comprend les valeurs de paramètres internes ou de données stockées par des macros.

Lorsque TeX commence à emballer la page actuelle, son « état interne courant » est *ne* défini par tout ce qui a été composé jusqu’à l’emplacement du saut de page, car TeX a déjà *dépassé ce point* dans votre fichier et traité du contenu supplémentaire. Si vous considérez l’emplacement dans votre fichier correspondant à celui où se produit le saut de page, et l’emplacement que TeX a effectivement atteint dans votre `.tex` fichier, les deux états internes correspondants de TeX, y compris les données stockées et la valeur des variables, pourraient être très différents. L’état courant de la composition TeX est généralement en avance sur l’endroit où se produit le saut de page ; c’est-à-dire que les activités de composition de TeX *ne sont pas synchronisées* avec le processus de sortie des pages composées via la routine de sortie.

#### Exemple hypothétique : comment obtenir les mauvais en-têtes

Le diagramme suivant illustre des commandes hypothétiques `\myheader` et `\myfooter` utilisées pour stocker le texte souhaité des en-têtes et des pieds de page ; par exemple, en utilisant des définitions de base telles que

```latex
\newtoks\headertoks% une nouvelle variable de liste de jetons pour le texte de l’en-tête
\newtoks\footertoks% une nouvelle variable de liste de jetons pour le texte du pied de page
% Utiliser \global pour garantir que les données d’en-tête ou de pied de page stockées sont
% accessibles partout, y compris dans les commandes de la
% routine de sortie
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

dans lequel `\headertoks` et `\footertoks` sont des listes de jetons utilisées pour stocker le texte des en-têtes et des pieds de page.

De plus, notre exemple hypothétique comporte aussi une routine de sortie qui récupère le texte de l’en-tête et du pied de page à partir des valeurs actuelles de `\myheader` et `\myfooter`. Comme le montre le diagramme, dans le contenu destiné à la page actuelle, `\myheader` et `\myfooter` définissent les valeurs appropriées (correctes). Cependant, il serait possible que `\myheader` et/ou `\myfooter` soit appelée dans un paragraphe qui s’étend sur un saut de page. Comme TeX doit traiter le paragraphe entier, `\myheader` et `\myfooter` serait appelée à nouveau pour réinitialiser le texte de l’en-tête/du pied de page enregistré dans « l’état interne de TeX », produisant des valeurs qui ne sont pas correctes pour la page actuelle. Lorsque la routine de sortie produit l’en-tête et le pied de page, ils contiendront un texte destiné à la page suivante.

![Graphique montrant des en-têtes et des pieds de page incorrects produits si la routine de sortie utilise uniquement des macros TeX pour récupérer le texte de l’en-tête et du pied de page](/files/ece4e874d243b3d1bc3b747a9599202ae3935b6d)

#### Le comportement asynchrone de TeX : la commande \mark à la rescousse

Les activités de composition (construction du contenu) de TeX sont *non synchronisées* avec le processus final de sortie d’une page composée via les commandes contenues dans la routine de sortie. Au moment de la sortie d’une page, l’état interne réel de TeX est en avance sur l’état qu’il pourrait avoir eu à l’emplacement du saut de page — là où il a composé le dernier morceau de contenu de la page en cours de sortie.

Dans [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, créateur de TeX, décrit cette situation comme

> ... la routine de sortie de TeX accuse un retard sur ses activités de construction des pages

En raison de cette relation désynchronisée, des « facilités spéciales » sous la forme du *mécanisme des marques*, appliqué via la commande `\mark` (ou `\marks n`) sont nécessaires pour garantir que les en-têtes et les pieds de page contiennent des éléments pertinents pour la page effectivement sortie. La `\mark` commande intègre des nœuds de marque dans le contenu de la page, stockant l’emplacement mémoire du contenu qui peut être utilisé pour l’en-tête et le pied de page de la page hôte.

L’auteur du livre bien connu et respecté [TeX par l’exemple](https://www.eijkhout.net/tex/tex-by-topic.html) décrit le `\mark` mécanisme comme

> ... le principal mécanisme par lequel la routine de sortie peut obtenir des informations sur le contenu de la page qui vient d’être détachée, en particulier son haut et son bas.

Le `\mark` commande est un mécanisme conçu pour contourner la nature asynchrone de l’algorithme de saut de page et de routine de sortie de TeX.

![Représentation schématique des données de marque (nœuds) intégrées dans le contenu du corps de la page](/files/7bc5b1081a584691ba88142ee0316aa6b5c53b06)

### Vérifications avant la sortie : recherche des nœuds de marque

Après que le moteur TeX a déterminé l’emplacement d’un saut de page, il appelle une routine interne (appelée `fire_up()`) qui effectue beaucoup de prétraitement avant que la routine de sortie ne termine la composition de la page et n’écrive la page terminée dans le fichier PDF. Une partie importante de ces étapes de prétraitement consiste à définir la valeur de trois *variables globales de marque*: `\botmark`, `\topmark` et `\firstmark` qui sont utilisées pour fournir des données destinées à la construction des en-têtes et des pieds de page. Bien entendu, une page peut contenir plusieurs nœuds de marque, mais ceux-ci sont filtrés pour produire les trois variables de marque qui fonctionnent comme suit :

* **`\botmark`** est la marque en vigueur au saut de page actuel ; c.-à-d. la dernière marque vue sur la *code de catégorie* page
* **`\topmark`** est la valeur de `\botmark` de la *précédente* page
* **`\firstmark`** est la première marque sur la *code de catégorie* page — la première marque entre `\topmark` et `\botmark`

Le schéma suivant montre les principes de base du prétraitement du contenu composé de la page afin de déterminer les valeurs des trois variables globales de marque `\botmark`, `\topmark` et `\firstmark`:

![Représentation schématique des principes de base utilisés pour déterminer les valeurs des trois variables globales de marque \botmark, \topmark et \firstmark](/files/04eb989eb82e480afd3340802b796125ffd58b6a)

La section suivante utilise certaines des explications données ci-dessus pour montrer comment LaTeX compose les en-têtes et les pieds de page.

### Les classes de LaTeX : styles de page et en-têtes/pieds de page

Lorsque vous écrivez `\documentclass{*class*}` où `*class*` peut être `article`, `book`, `report` ou `letter`, LaTeX charge un fichier nommé `*class*.cls`; par exemple, `book.cls`, `article.cls` et ainsi de suite. Ces `.cls` fichiers contiennent du code LaTeX pour implémenter des variations spécifiques à la classe de diverses commandes et fonctionnalités censées être présentes, et fournies, par toutes les classes de documents — les comportements partagés par toutes les classes de documents. Les exemples peuvent inclure des marges de mise en page spécifiques à la classe ainsi que des versions spécifiques à la classe de commandes, telles que `\section`, `\subsection` et ainsi de suite.

Un autre élément important des `.cls` fichiers est l’implémentation, propre à la classe, des styles de page standard qui définissent les en-têtes et les pieds de page des documents produits à l’aide d’une classe et d’un style de page particuliers. Par exemple :

* **`book.cls`** et **`article.cls`** contiennent chacun des implémentations des styles de page `headings` et `myheadings`
* **`letter.cls`** contient des définitions pour les styles de page `headings`, `vide`, `simple` et un appelé `firstpage`
* **`report.cls`** contient des définitions pour les styles de page `headings` et `myheadings`

Les implémentations des styles de page dépendent souvent de `twoside` option de `\documentclass`— que le document soit en simple ou en double face — afin que les en-têtes et les pieds de page soient définis de manière appropriée pour les pages paires et impaires.

Les classes de documents peuvent s’appuyer sur des définitions par défaut des `simple` ou `vide` styles de page fournies ailleurs dans LaTeX — en dehors du `.cls` fichier utilisé.

#### En savoir plus sur les styles de page

Lorsque vous changez le style d’une page à l’aide de `\pagestyle{*somestyle*}` ou `\thispagestyle{*somestyle*}` LaTeX s’attend à trouver une commande interne nommée `ps@*somestyle*`— généralement fournie par le fichier de classe du document `.cls` ou peut-être par un paquet tel que `fancyhdr`. À propos, par « commande interne », nous entendons une commande qui fait partie du code source de LaTeX et dont le nom contient un `@` symbole, ce qui empêche normalement son usage occasionnel (à cause de son [code de catégorie](/latex/fr/autres-sujets/43-table-of-tex-category-codes.md)).

La définition de `\ps@*somestyle*` est responsable de l’implémentation des fonctionnalités/comportements de ce style de page, ce qui inclut la fourniture de définitions pour :

* des commandes utilisées lors des dernières étapes de la composition de la page (pour ajouter des en-têtes et des pieds de page, voir [plus loin dans l’article](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* des commandes pour insérer des données de marque liées aux sections à utiliser pour générer des en-têtes et des pieds de page de document contenant des titres de section, des numéros et éléments similaires. Par exemple, le `headings` style de page (dans `book.cls`) définit les commandes productrices de marques suivantes :
  * `\chaptermark`
  * `\sectionmark`

Nous allons [explorer plus avant les commandes génératrices de marques](#mark-commands-and-mark-data), telles que `\chaptermark`, mais à titre d’exemple seulement : lorsque vous écrivez `\chapter{chapter title}` le `\chaptermark` commande est également exécutée pour insérer des données de marque liées au chapitre en vue de la production ultérieure des en-têtes de page.

#### Anatomie des commandes d’en-tête et de pied de page basées sur le style de page

Cette section explore certaines des commandes/processus fondamentaux de LaTeX utilisés pour créer des en-têtes et des pieds de page — en s’appuyant sur les explications ou concepts présentés plus haut dans cet article.

**Le « modèle » de LaTeX pour les en-têtes et les pieds de page**

Le contenu des en-têtes et des pieds de page (par défaut) de LaTeX repose sur une hiérarchie à deux niveaux des sections du document : une section de « niveau supérieur » contenant plusieurs sections de « niveau inférieur ». Pour les classes book et article, cela se traduit par :

* `**book**` **classe**: les sections de « niveau supérieur » sont produites par les commandes `\chapter` et les sections de « niveau inférieur » via `\section`, reflétant des chapitres contenant de nombreuses sections.
* `**article**` **classe** (en supposant des documents en double face) : les sections de « niveau supérieur » sont produites à l’aide de commandes `\section` et les sections de « niveau inférieur » via `\subsection`, reflétant plusieurs sous-sections apparaissant dans une même section.

LaTeX applique son « modèle » d’en-têtes et de pieds de page par le biais de ses commandes de sectionnement, qui « injectent » des nœuds de marque (via la `\mark` commande) pour stocker des données pertinentes pour la section du document en cours de création. Par exemple, chaque fois que vous écrivez `\section{*some section title*}` un nœud de marque sera créé, contenant des données qui reflètent `*some section title*` et le numéro de section.

LaTeX utilise un système de marques qui contiennent des données de la forme `{left}{right}`, générées en fin de compte via `\mark` commandes

```latex
\mark{{left}{right}}
```

inséré dans des couches de macros conçues pour masquer aux utilisateurs les détails de bas niveau — qui sont examinés dans les sections suivantes de cet article.

#### Exploration de la classe book

Lorsque la `book.cls` fichier est chargé, l’une de ses dernières actions consiste à exécuter `\pagestyle{headings}` qui définit le style de page par défaut sur `headings`, nous allons donc examiner ce style de page plus en détail.

Comme [mentionné plus haut](#more-on-page-styles), les fonctionnalités/propriétés du `headings` style de page, tel qu’implémenté par la classe `book` seront définies par la commande (interne) `\ps@headings` contenue dans le fichier `book.cls`. La définition précise de `\ps@headings` dépend de savoir si le document est en simple ou en double face (valeur par défaut pour la classe `book` ).

**« Commandes de marque » et « données de marque »**

Pour les documents en double face produits par la classe `book` , la définition de `\ps@headings` crée (définit) deux « commandes de marque » : `\chaptermark` et `\sectionmark` qui produisent des « données de marque », de la forme `{left}{right}`, utilisées dans les en-têtes et les pieds de page. Ces commandes de marque reflètent le modèle de LaTeX pour les en-têtes et les pieds de page — fondé sur la hiérarchie des sections du document :

* la commande de section « de niveau supérieur » (ici, `\chapter`) est utilisée pour fournir des « données de marque » pour les en-têtes des pages de gauche (paire). Lorsque vous commencez un nouveau chapitre, en écrivant `\chapter{*chapter title*}`, `\chaptermark` est appelée pour créer des « données de marque » qui reflètent ce nouveau chapitre — contenant son `*chapter title*` et son numéro.
* la commande de section « de niveau inférieur » (ici, `\section`) est utilisée pour fournir des « données de marque » pour les pages de droite (impaires). Lorsque vous écrivez `\section{*titre de section*}` le `\sectionmark` commande sera appelée pour créer des « données de marque » qui reflètent la nouvelle section — contenant son `*titre de section*` et son numéro. Toute donnée de marque fournie par le précédent `\chapter` n’est pas affectée par les commandes \section ultérieures.

**\markboth et \markright**

Les commandes de marque spécifiques aux sections de LaTeX, telles que `\chaptermark` et `\sectionmark`, utilisent deux autres commandes appelées `\markboth` et `\markright` qui fournissent les véritables données de marque pour les en-têtes et les pieds de page. `\markboth` et/ou `\markright` peut inclure des commandes pour styliser le texte de l’en-tête ou du pied de page, par exemple le mettre en majuscules.

Pour les documents produits à l’aide de `book` classes par défaut (double face, `headings` style de page), les commandes génératrices de marques fonctionnent comme suit :

* `\chaptermark` génère des données de marque à l’aide de `\markboth`
* `\sectionmark` génère des données de marque `\markright`

`\markboth` et `\markright` sont des macros qui, en fin de compte, utilisent le primitif (intégré, de bas niveau) `\mark` commande pour insérer effectivement des marques générées à l'intérieur des commandes de sectionnement.

`\markboth` prend la forme

* **`\markboth{left}{right}`**: insère une marque (nœud) en utilisant `\mark{{left}{right}}` ce qui donne un nœud de marque contenant une paire de valeurs entre accolades `{left}{right}`.

`\markright` prend la forme

* **`\markright{newright}`**: insère une marque (nœud) en utilisant `\mark{{currentleft}{newright}}`; c.-à-d., elle modifie la valeur actuelle de `droite` à `newright` mais la valeur actuelle de `gauche` (c.-à-d.  `currentleft`) reste inchangée, ce qui donne un nœud de marque contenant une paire de valeurs entre accolades `{currentleft}{newright}`.

Le comportement de `\markboth` et `\markright` prennent en charge la hiérarchie de sectionnement à deux niveaux, comme un document contenant plusieurs sections dans chaque chapitre.

À titre d'exemples pour la classe de document (à deux faces) `book`  (en utilisant le style de page headings) :

* `\chaptermark` utilise `\markboth` pour définir :
  * a `{left}` champ qui compose CHAPTER en majuscules.
  * un champ {right} vide (`{}`)
* `\sectionmark` utilise `\markright` pour définir le `{right}` champ de marque à composer, également en majuscules.

Pour comprendre pourquoi `\sectionmark` utilise `\markright` nous pouvons observer que chaque nouvelle `\section` commande devrait :

* insérer une nouvelle marque contenant des données pour ce `\section` (comme son titre et son numéro).
* mais *ne* affecter les valeurs des données de marque pour le `\chapter` dans lequel cette `\section` commande particulière apparaît

Pour ces raisons, la `\section` commande appelle `\sectionmark` qui utilise `\markright` pour créer une marque `\section`-associée : elle met à jour le `{right}` champ de données de marque mais n'affecte pas la valeur actuelle du `{left}` champ de données de marque qui a été définie par la `\chapter`.

Note : le code source LaTeX contient l'avertissement :

> Les commandes de marquage fonctionnent raisonnablement bien pour des marques droites « numérotées à l’intérieur de » marques gauches — par ex., la marque gauche est modifiée par une commande \chapter et la marque droite est modifiée par une commande \section. Cependant, elles donnent des résultats quelque peu anormaux si 2 \markboth apparaissent sur la même page.

**Commandes pour la routine de sortie**

Le `\ps@headings` commande implémente les définitions des commandes suivantes

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

qui sont utilisées par la routine de sortie pour ajouter en-têtes et pieds de page durant l'étape finale de composition de la page. Par exemple, `book.cls` définit `\@oddfoot` et `\@evenfoot` à la valeur `\@empty`, qui est définie comme `\def\@empty{}`, ainsi `\ps@headings` produit des pieds de page vides sur les pages recto et verso :

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

Les en-têtes sont définis comme suit :

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

où

* `\leftmark` extrait la `{left}` valeur d'une `{left}{right}` paire de marques
* `\rightmark` extrait la `{right}` valeur d'une `{left}{right}` paire de marques
* \thepage affiche le numéro de page courant

En substance, ces implémentations de `\@evenhead` et `\@oddhead` produisent les résultats suivants :

* `\@evenhead`: le numéro de page apparaît à gauche de l'en-tête et le contenu de `\leftmark`, mis en forme avec la commande de police `\slshape`, est affiché à droite de l'en-tête — l'espace blanc intermédiaire est fourni par la très flexible `\hfil` colle.
* `\@oddhead`: le contenu de `\rightmark`, mis en forme avec la commande de police `\slshape`, apparaît à gauche de l'en-tête et le numéro de page courant est affiché à droite de l'en-tête — là encore, l'espace blanc intermédiaire est fourni par `\hfil` colle.

Cependant, une question clé demeure : *qui* `{left}{right}` paire de marques sont utilisés par `\leftmark` et `\rightmark`: autrement dit, d'où tirent-ils leurs valeurs de données de marque ?

Comme [mentionné plus haut](#filtering) mais [expliqué ci-dessous](#explainfiltering), durant les étapes finales de composition de la page, toutes les marques contenues dans les pages du document sont « filtrées » et utilisées pour définir la valeur de trois variables globales de marque : `\botmark`, `\topmark` et `\firstmark`. En raison de la [structure des marques de LaTeX](#latexs-model-of-headers-and-footers), chacune de ces 3 variables de marque finira par contenir une valeur de `{left}{right}` pour une certaine paire de valeurs `{left}` et `{right}` et ce sont elles qui fournissent les véritables `{left}{right}` paire de marques (champs) pour `\leftmark` et `\rightmark`:

* `\leftmark` extrait la `gauche` valeur de la `{left}{right}` paire de marques (champs) fournie par `\botmark`
* `\rightmark` extrait la `droite` valeur de la `{left}{right}` paire de marques fournie par `\firstmark`

Remarque `\markboth` et `\markright` peut contenir des commandes pour styliser le texte de l'en-tête et du pied de page — comme la conversion en majuscules.

### Exemples utilisant des commandes LaTeX de plus bas niveau

Les exemples suivants montrent comment modifier les styles de page ou les en-têtes et pieds de page en redéfinissant certaines des commandes LaTeX de bas niveau (internes) évoquées dans cet article (celles qui contiennent le symbole @). Nous ne préconisons pas cette méthode pour modifier les en-têtes et les pieds de page, mais elle est disponible pour ceux qui en ont besoin (par ex., les auteurs de paquets). La solution préférable pour modifier les en-têtes et les pieds de page consiste à utiliser le [`fancyhdr` package](https://ctan.org/pkg/fancyhdr?lang=en), qui est discuté dans un [article d’aide Overleaf](/latex/fr/mise-en-forme/02-headers-and-footers.md).

#### Définition d'un style de page minimal

L'exemple suivant définit un nouveau style de page extrêmement minimal appelé `demostyle` qui utilise du texte statique pour définir les en-têtes et les pieds de page et ne s'appuie pas sur des commandes de sectionnement (`\chapter`, `\section` etc) pour définir le contenu de l'en-tête et du pied de page.

L'exemple commence par modifier le code de catégorie du `@` caractère à 11 afin qu'il puisse être utilisé dans les noms de macros. La `\ps@demostyle` commande met en œuvre notre style de page minimal en redéfinissant les commandes utilisées (dans la routine de sortie) pour produire les en-têtes et les pieds de page : `\@oddhead`, `\@oddfoot`, `\@evenhead` et `\@evenfoot`. Notez l' `twoside` option dans notre `\documentclass` déclaration — qui utilise le `article` classe.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Le pied de page des pages impaires\hfil}%
\renewcommand\@evenfoot{\hfil Le pied de page des pages paires\hfil}%
\renewcommand\@evenhead{\thepage\hfil L'en-tête des pages paires}%
\renewcommand\@oddhead{L'en-tête des pages impaires\hfil\thepage}}
\catcode`@=12
\title{Démonstration d'un style de page}
\author{Overleaf}
\date{August 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduction}
\newpage
\section{Plus de contenu}
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Modification des en-têtes pour la classe book

L'exemple suivant modifie les en-têtes pour la classe book en redéfinissant `\@oddhead` et `\@evenhead` afin que les en-têtes des pages recto et verso contiennent le numéro de page courant et le titre du chapitre. Notez comment le deuxième `\chapter` commande utilise le titre court de chapitre facultatif `[Le titre court]` qui fournit désormais le texte de l'en-tête, au lieu du titre long.

`\section` les commandes n'ont aucun effet sur le contenu de l'en-tête parce que nos redéfinitions d'en-tête n'utilisent que `\leftmark` qui obtient les détails du chapitre courant. Pour accéder aux détails de la section courante, nous devrions utiliser `\rightmark` dans la définition de `\@oddhead` et/ou `\evenhead`.

```latex
\documentclass{book}
% NB : le code de catégorie de « @ » est temporairement changé à 11
% pour permettre son utilisation dans les noms de commandes
\catcode `@=11
% Faire en sorte que \@oddfoot et \evenfoot soient équivalents à \@empty
% pour les rendre blancs (vides)
\let\@oddfoot\empty\let\evenfoot\empty
% Redéfinir \@oddhead et \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Utiliser une taille de page commodément petite
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Mémoires d'un utilisateur de \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Ceci est le frontmatter qui utilise des chiffres romains.
\mainmatter
\chapter{Par où commencer ?}
Chapitre 1 : un court chapitre.
\newpage
\section{Au commencement...}
Une section.
\chapter[Le titre court]{Un chapitre avec un titre très long, le rendant inadapté aux en-têtes}
\newpage
\section{Une autre section}
Avec peu de contenu.
\newpage
\section{Encore une section ?}
Aussi avec peu de contenu.
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Utilisation des commandes de marques étendues d'ε-TeX

Le `book` la classe utilise les définitions suivantes de `\@evenhead` et `\@oddhead` pour produire les en-têtes :

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

où les commandes `\leftmark` et `\rightmark` sont définies comme suit

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

En utilisant les commandes étendues d'ε-TeX, et l'équivalence entre la classe de marques 0 d'ε-TeX et les commandes originales de TeX, nous pouvons :

* réécrire `\leftmark` pour remplacer `\botmark` avec le `\botmarks0` équivalent, et
* réécrire `\rightmark` pour remplacer `\firstmark` avec le `\firstmarks0` équivalent

Ces redéfinitions produisent

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Notez l'utilisation de `\relax` pour mettre fin à la recherche de TeX de chiffres supplémentaires — vous pouvez aussi remplacer `\relax` par un espace pour servir de terminaison.

L'exemple suivant produit une sortie identique aux définitions originales de `\leftmark` et `\rightmark`.

```latex
\documentclass{book}
% Redéfinir \leftmark et \rightmark pour utiliser
% \botmarks0 et \firstmarks0 respectivement
% NB : le code de catégorie de « @ » est temporairement changé à 11
% pour permettre son utilisation dans les noms de commandes
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Utiliser une taille de page commodément petite
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Mémoires d'un utilisateur de \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Ceci est le frontmatter qui utilise des chiffres romains.
\mainmatter
\chapter{Par où commencer ?}
Chapitre 1 : un court chapitre.
\newpage
\section{Au commencement...}
Une section.
\newpage
Une autre section.
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Remarques sur ε-TeX**

Comme [nous l'avons noté ci-dessus](#etex), ε-TeX introduit `\marks` commande :

```latex
\marks n {stuff to store}
```

qui étend la `\mark` fonctionnalité originale du moteur TeX de Knuth et est disponible dans les trois moteurs TeX principaux : pdfTeX, LuaTeX et XeTeX.

L'implémentation d'ε-TeX introduit également de nouvelles variables globales de marque `\firstmarks n`, `\botmarks n` et `\topmarks n`: une pour chaque classe `n`. Ces variables de marque basées sur des classes sont déterminées [en utilisant les mécanismes décrits ci-dessus](#pre-output-checks-looking-for-mark-nodes), et peuvent toutes être utilisées dans la production des en-têtes et des pieds de page.

Vous pouvez utiliser n'importe laquelle des $$2^{15}$$ = 32768 classes de marques, allant de 0 à 32767, dans des redéfinitions de `\leftmark` ou `\rightmark`. Cela suppose que vous avez fourni (inséré) des données de marque appropriées pour la classe de marques choisie, `n`, via `\marks n{{left}{right}}`.

Notez que LuaTeX fournit $$2^{16}$$ = 65536 classes de marques, avec `n` allant de 0 à 65535.

**Exemple utilisant la classe de marques 10**

Cet exemple montre l'utilisation de la classe de marques 10 (choisie au hasard) pour créer des en-têtes de document. Le document d'exemple compose 6 pages qui contiennent la séquence de marques présentée dans l' [exemple travaillé à la fin de cet article](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). L'étude de cet exemple montrera pourquoi le moteur TeX a sélectionné une marque particulière, $$\alpha$$, $$\beta$$, $$\gamma$$ et $$\delta$$, pour l'utiliser dans chacun des en-têtes.

Nous commençons par définir une macro pratique, `\domark`, qui utilise `\marks 10` pour insérer des données de marque qui suivent la `{left}{right}` convention LaTeX :

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

Les marques de classe 10 sont rendues accessibles au mécanisme d'en-tête et de pied de page de LaTeX en redéfinissant `\leftmark` et `\rightmark`—avec un peu d'information supplémentaire ajoutée :

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

Après l'insertion d'un certain nombre de marques (de classe 10), le moteur TeX (ici, pdfTeX) crée obligeamment des variables globales de marque pour la classe 10 —`\botmarks10`, `\topmarks10` et `\firstsmarks10` qui `\leftmark` et `\rightmark` utilisées pour produire les en-têtes.

```latex
\documentclass{book}
% Une courte commande pour utiliser les marques de classe 10
% et suivant la structure de marque LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Redéfinir \leftmark et \rightmark pour utiliser
% \botmarks10 et \firstmarks10 respectivement
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Démonstration des marques améliorées de \(\varepsilon\)-\TeX}
\author{Overleaf}
\date{August 2022}
\begin{document}

Page 1 : aucune marque ajoutée, donc toutes les variables de marque restent dans leur état initialisé : vides (NULL).

\newpage
Page 2 : marque $\alpha$ ajoutée à cette page via

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Page 3 : aucune nouvelle marque ajoutée à cette page.

\newpage
Page 4 : marque $\beta$ suivie de marque $\gamma$ ajoutées à cette page via

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Page 5 : marque $\delta$ ajoutée à cette page via

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Page 6 : aucune marque ajoutée à cette page.
\end{document}
```

[Ouvrez cet exemple dans Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

Le graphique suivant montre les en-têtes produits par cet exemple :

![Graphique montrant la sortie du code LaTeX utilisant les commandes de marques étendues d'ε-TeX](/files/34376813945fa2f004214a9953c818adaa5eb903)

* **Remarque**: L'en-tête de la page 1 est créé à un moment où les trois variables de marque de la classe 10 —`\botmarks10`, `\topmarks10` et `\firstsmarks10`— sont vides. Le résultat final est que `\rightmark` (pour la page 1) insère seulement le dernier fragment d'en-tête : `(via \texttt{\string\firstmarks10})`, comme montré dans le graphique ci-dessus.

## Un exemple détaillé montrant comment les moteurs TeX déterminent les valeurs de \botmark, \topmark et \firstmark

![Db.gif](/files/06817a214d196d81a67a7f4c55b703e959d23056)![Db.gif](/files/06817a214d196d81a67a7f4c55b703e959d23056) Il semble approprié de reproduire l’utilisation par Knuth de doubles signes d’interdiction en zigzag (image fournie par [ce site web](http://www.truetex.com/db.htm)) parce que le matériau est quelque peu de bas niveau et « lève le capot » — bien que nous espérions qu'il pourra intéresser les lecteurs intrépides souhaitant comprendre quelques détails supplémentaires.

La discussion suivante est étroitement basée sur le dernier exemple de la page 258 du [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Ici, nous avons édité et recomposé cet exemple pour ceux qui n'ont pas accès au TeXbook :

![Une version éditée et recomposée d'un exemple de la page 258 du TeXbook](/files/979ace0799cba29f8fdbe5cc5eb2918243079200)

Le tableau présenté dans ce graphique est reproduit à partir d'un tableau fourni par Knuth, mais, comme l'original, il n'explique pas comment il a été obtenu. Ici, nous allons le faire pour fournir des détails supplémentaires montrant comment ces valeurs de `\botmark`, `\topmark` et `\firstmark` ont été déterminées — obtenir ces détails a nécessité d'explorer le code source d'un moteur TeX !

Le processus de définition des valeurs de `\botmark`, `\topmark` et `\firstmark` peut être résumé en 3 courts fragments de pseudocode comme indiqué dans le diagramme suivant et les explications qui suivent :

1. Vérification pré-contenu
2. Boucle sur le contenu
3. Vérification post-contenu

Remarque :

* Les tests de l'étape 1 « Vérification pré-contenu » et de l'étape 3 « Vérification post-contenu » sont effectués une fois par page.
* L'étape 2 « Boucle sur le contenu » consiste en un balayage de TeX à travers le contenu de la page à la recherche de nœuds de marque, puis à les utiliser pour définir les valeurs des variables de marque comme indiqué.

![Image montrant des versions pseudocodées du code utilisé pour définir les valeurs des trois variables globales de marque utilisées par les moteurs TeX](/files/6e1656689bae23f0728eff7a730487789674dd7f)

Chaque fois que TeX trouve une coupure de page convenable, il envoie le contenu de cette page pour traitement final, en effectuant ces (trois) étapes de traitement des marques pour chaque page de votre document. Les étapes de traitement numérotées 1, 2 et 3 sont référencées dans le diagramme final de cette section.

Notez que :

* avant que la première page n'ait été traitée, les trois variables globales de marque `\botmark`, `\topmark` et `\firstmark` ont été initialisées à vide (NULL).
* les valeurs finales de `\botmark`, `\topmark` et `\firstmark` déterminées à la fin de la *précédente* page deviennent les valeurs (d'entrée) pour le traitement de la *code de catégorie* page — celle qui est en cours de traitement.

Les fragments de code suivants sont ***du pseudocode*** dérivés (résumés) du code source réel du moteur TeX. L'objectif est de fournir un résumé concis du code qui aide à démontrer les principes clés en jeu.

**Étape 1 : vérification pré-contenu** Avant que TeX n'examine le contenu réel de la page courante, il vérifie si la `\botmark` valeur actuelle — c.-à-d. résultant de la *précédente* page — est vide (NULL) :

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

Dans ce test, si `\botmark` (de la *précédente* page) est *ne* vide :

* `\topmark` pour le *code de catégorie* page est définie sur la *précédente* page `\botmark` valeur
* `\firstmark`, pour la *code de catégorie* page (en cours de traitement), est définie sur vide (NULL) : commencez cette page en supposant qu'il n'y a pas de `\mark` nœuds.

Notez que ce test est effectué *une fois* pour chaque page traitée.

**Étape 2 : boucle sur le contenu** Ensuite, TeX parcourt le contenu de la page ; une partie de cette boucle consiste à rechercher des `\mark` nœuds :

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

Ce test est appliqué à chaque nœud de marque situé dans (contenu dans) la page courante. Le test précédent (étape 1, ci-dessus) a pu définir `\firstmark` à vide, de sorte que la toute première marque trouvée dans la page courante devient la valeur de `\firstmark` et `\botmark`. Tout *caractère* `\mark` nœud détecté pendant l'exécution de cette boucle ne modifiera pas la valeur de `\firstmark`, car elle n'est plus vide (NULL), mais `\botmark` est mise à jour — parce que tel est le but de `\botmark`: stocker le dernier `\mark` nœud vu pour cette page.

**Étape 3 : vérification post-contenu** Une fois qu'il a parcouru le contenu de la page, TeX applique le test final suivant, qui est également effectué une fois par page :

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* Si `\topmark` n'est pas vide (NULL), nous savons, d'après l'étape 1, que `\botmark` pour la page précédente n'était pas vide (NULL).
* Si `\firstmark` est encore vide, alors nous n'avons vu aucun `\mark` nœuds car le test de l'étape 2 n'a pas été déclenché ; par conséquent, `\firstmark` est définie à la valeur de `\topmark` qui est aussi la valeur de `\botmark` de la page précédente.

Après l'application séquentielle de ces trois étapes à toutes les 6 pages de notre exemple, les valeurs de `\botmark`, `\topmark` et `\firstmark` sont dérivées à l'aide des transitions montrées dans le diagramme ci-dessous où :

* les rectangles arrondis bleu clair sont les valeurs finales des variables de marque pour chaque page
* les carrés arrondis gris clair représentent les valeurs intermédiaires qui apparaissent pendant le traitement
* Les flèches étiquetées représentent les changements des valeurs des variables marqueurs selon les étapes 1, 2 ou 3 du schéma ci-dessus — ou bien une valeur n’a été modifiée par aucune des étapes ; elles sont étiquetées « aucun changement ».

Le schéma suivant montre comment les trois fragments de pseudocode génèrent les valeurs finales de `\botmark`, `\topmark` et `\firstmark` répertoriées dans le tableau figurant à la page 258 de The TeXbook.

![Un diagramme de transition accompagnant l’exemple de la page 258 de The TeXbook, montrant les transitions internes lorsque les variables de marque globales se voient attribuer leurs valeurs](/files/371bbd5d62e81e6083363426ba012a7dc2bd618d)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
