# Configuration : titres

> Les valeurs communes des titres, les réglages propres à chaque niveau, les sauts de page avant un titre, les ouvertures de chapitre sur toute la largeur de la page et les numéros en toutes lettres

- Version HTML: https://postext.dev/fr/docs/configuration-headings
- Dernière mise à jour: 2026-10-16
- Temps de lecture: 35 min
- Autres langues: [en](https://postext.dev/en/docs/configuration-headings.md), [es](https://postext.dev/es/docs/configuration-headings.md), [ca](https://postext.dev/ca/docs/configuration-headings.md), [de](https://postext.dev/de/docs/configuration-headings.md), [it](https://postext.dev/it/docs/configuration-headings.md), [pt](https://postext.dev/pt/docs/configuration-headings.md), [zh](https://postext.dev/zh/docs/configuration-headings.md), [ja](https://postext.dev/ja/docs/configuration-headings.md), [ar](https://postext.dev/ar/docs/configuration-headings.md)

## En bref

Cette page réunit les réglages des titres. Vous leur donnez à tous une police, une taille et une couleur, et vous changez l’un de ces choix pour un seul niveau, comme les titres de chapitre. Vous décidez si un titre commence une nouvelle page, et si cette page doit être à gauche ou à droite. Un titre de chapitre peut s’ouvrir sur toute la largeur de la page avec sa propre maquette. Les numéros des titres peuvent s’écrire en toutes lettres, comme « Chapitre un ».

## Titres

La propriété `headings` règle la typographie de tous les niveaux de titre (H1 à H6). Vous pouvez définir des valeurs générales qui s’appliquent à tous les niveaux, puis redéfinir certaines propriétés niveau par niveau.

### Valeurs générales

| Propriété | Type | Défaut | Description |
| --- | --- | --- | --- |
| `fontFamily` | `string` | `'Open Sans'` | Famille de police de tous les titres. |
| `lineHeight` | `Dimension` | `1.2 em` | Hauteur de ligne des titres. Plus serrée que celle du texte courant. |
| `color` | `ColorValue` | Couleur principale (`#295AA3`) | Couleur du texte des titres. Liée à l’entrée `main-color` de la palette par défaut : changer cette couleur de la palette reteinte tous les titres. |
| `textAlign` | `'left' \| 'justify' \| 'center' \| 'right' \| 'start' \| 'end'` | `'left'` | Alignement de tous les niveaux de titre (il n’existe pas de valeur par niveau) : en drapeau à droite, justifié, centré ou en drapeau à gauche. Un titre justifié compose sa dernière ligne alignée à gauche, comme un paragraphe ; un titre d’une seule ligne se lit donc comme `'left'`. Le canvas, le HTML et le PDF placent les lignes de la même façon, préfixe de numéro compris. L’ouverture par défaut d’un titre `span: 'page'` sans maquette avancée le suit aussi (justifié compose aligné à gauche) ; une maquette avancée aligne ses propres éléments de texte selon leur `align`. |
| `fontWeight` | `number` | `700` | Graisse des titres (100–900). |
| `marginTop` | `Dimension` | `1.5 em` | Espace au-dessus des titres. Supprimé pour un titre qui ouvre une colonne (voir `columnHeadSpace`). |
| `marginBottom` | `Dimension` | `0.5 em` | Espace sous les titres. |
| `keepWithNext` | `boolean` | `true` | À `true`, un titre n’est jamais placé comme dernier élément d’une colonne ou d’une page. Si le bloc suivant ne disposait pas d’au moins `bodyText.widowMinLines` lignes de place après le titre (ou d’une ligne quand `bodyText.avoidWidows` vaut `false`), le titre est repoussé pour rester avec son texte. Interagit avec `bodyText.keepColonWithList` : si cette règle doit repousser en entier un paragraphe terminé par un deux-points, le ou les titres qui ferment la colonne partent avec lui au lieu de rester isolés. |
| `keepWithNextSpread` | `boolean` | `false` | Avec `keepWithNext`, laisse quand même un titre fermer la dernière colonne de texte d’une page paire, puisque son texte ouvre alors la page impaire en regard, dans la même double page (JLReq §4.1.7). Les doubles pages sont la page 1 seule, puis 2–3, 4–5…, comptées avec `pageIndexOffset`, dans les livres reliés à gauche comme à droite. Depuis postext 1.16. |
| `keepWithNextSplit` | `'rules' \| 'fill'` | `'rules'` | Manière de diviser le paragraphe sous un titre quand le titre se retrouve au pied d’une colonne et que repousser le paragraphe en entier laisserait le titre derrière. `'rules'` : le plus de lignes possible, tant qu’au moins `bodyText.widowMinLines` restent sous le titre et qu’au moins `bodyText.orphanMinLines` passent à la colonne suivante ; quand aucune division ne respecte les deux, le titre part avec son paragraphe, et l’équilibrage des colonnes comble la place qu’il laisse. `'fill'` : autant de lignes qu’il en tient, si peu qu’il en parte, si bien qu’un paragraphe de quatre lignes avec de la place pour trois se divise en 3 + 1. Jusqu’à postext 1.4, tous les titres se divisaient ainsi, et les configurations enregistrées avant le `configVersion` 8 le conservent (voir [Paquets écrits par postext 1.4 ou antérieur](https://postext.dev/fr/docs/configuration-bundles.md#paquets-écrits-par-postext-14-ou-antérieur)). Avec `avoidWidows` ou `avoidOrphans` désactivé, ce côté de la règle est abandonné. |
| `snapToGrid` | `boolean` | `true` | Indique si le flux revient sur la grille de ligne de base sous un titre. Avec `true`, le `marginBottom` du titre est arrondi vers le haut à un nombre entier de lignes de la grille ; avec `false`, la marge exacte est conservée et le texte sous le titre peut rester hors de la grille jusqu’au point de calage suivant (la fin d’une liste, la fin d’un `:::paragraphs`, une formule hors texte), comme beaucoup de livres laissent une ligne et demie sous un titre. Un niveau (`levels[].snapToGrid`) ou un style de titre peut avoir sa propre valeur ; celle-ci est celle dont ils héritent. |
| `columnHeadSpace` | `'none' \| 'remainder'` | `'none'` | Ce qu’un titre calé sur la grille garde de son espace supérieur quand il ouvre une colonne, en tête de page ou sous une figure ou un tableau qui ouvre la colonne. `'none'` : tout l’espace est supprimé et le titre se pose sur la première ligne de la colonne, à la hauteur de la colonne voisine ; le calage sur la grille met alors sous le titre la fraction de ligne dont il a besoin, si bien que son texte peut s’en trouver plus éloigné qu’après un paragraphe. `'remainder'` : l’espace n’est supprimé que par lignes entières de la grille, et la fraction de ligne restante demeure au-dessus du titre, de sorte que le texte qui le suit commence à la même distance qu’après un paragraphe ; le titre commence un peu plus bas que la tête de la colonne, et aucune ligne du texte courant ne bouge. Cela convient à un livre sur une colonne, où aucune tête de colonne voisine ne montre la différence. Toute autre valeur se lit comme `'none'`. Pas sous une ouverture sur toute la largeur de la page, ni pour un titre `span: 'page'`, `lineSpan`, masqué ou doté d’une maquette (`advancedDesign`). Depuis postext 1.28. |
| `inlineMarks` | `boolean` | `true` | Indique si un titre lit ses marques en ligne comme le fait un paragraphe : `*italic*`, `**bold**`, `^superscript^`, `~subscript~`, `:smallcaps[…]` et les liens. Un segment en italique inverse l’inclinaison du titre : il sort donc en romain dans un titre en italique ; un segment en gras prend `bodyText.boldFontWeight`, ou la graisse propre du titre quand elle est plus forte. La table des matières reprend aussi les segments en gras et en italique ; les titres courants et les signets du PDF n’impriment que le texte. Avec `false`, les marques sont supprimées et les mots s’impriment dans le style propre du titre, comme jusqu’à postext 1.4. L’ouverture par défaut d’un titre `span: 'page'` sans maquette compose aussi les segments en gras, en italique, en exposant et en indice ; une maquette de titre (une bande d’ouverture dessinée ou un `advancedDesign` dans la colonne) imprime `{titleText}` en texte brut dans tous les cas, sauf si son élément de texte lit les marques en ligne (`inlineMarks: true`) : là, `{titleText}` garde les segments en gras, en italique, en exposant et en indice du titre (depuis postext 1.19). Les configurations enregistrées plus tôt dont les titres portent des marques sont lues avec `false` (voir [Paquets écrits par postext 1.4 ou antérieur](https://postext.dev/fr/docs/configuration-bundles.md#paquets-écrits-par-postext-14-ou-antérieur)). |
| `balancing` | `ColumnBalancingConfig` | activé | Équilibrage vertical des colonnes : espace ajouté au-dessus des titres pour que les colonnes se terminent au ras du bas de la page. Voir plus bas. |

Des titres centrés pour des poèmes ou les actes d’une pièce, sans emplacement de maquette :

```ts
headings: {
  textAlign: 'center',
  levels: [{ level: 2, textTransform: 'uppercase' }],
}
```

Passer un objet `headings` conserve toutes les valeurs par défaut des niveaux que vous ne redonnez pas, saut de page du H1 compris (voir [Réglages par niveau](https://postext.dev/fr/docs/configuration-headings.md#réglages-par-niveau)).

### Réglages par niveau

Chaque niveau de titre peut redéfinir les valeurs générales par le tableau `levels`. Seul `fontSize` (plus le `breakBefore` du H1, signalé plus bas) diffère par défaut ; toutes les autres propriétés héritent des réglages généraux des titres.

| Niveau | Taille de police par défaut | `breakBefore` par défaut |
| --- | --- | --- |
| H1 | `18 pt` | `{ enabled: true, parity: 'always-odd' }` |
| H2 | `15 pt` | `{ enabled: false, parity: 'any' }` |
| H3 | `12 pt` | `{ enabled: false, parity: 'any' }` |
| H4 | `10 pt` | `{ enabled: false, parity: 'any' }` |
| H5 | `9 pt` | `{ enabled: false, parity: 'any' }` |
| H6 | `8 pt` | `{ enabled: false, parity: 'any' }` |

Le défaut du H1 reproduit la mise en page d’un livre par chapitres : chaque titre de premier niveau s’ouvre sur une nouvelle page de droite (impaire), avec une page blanche de séparation obligatoire après le chapitre précédent. Redéfinissez-le dans `levels[0].breakBefore` si votre document est moins structuré qu’un livre.

Le `breakBefore` d’un niveau est fusionné champ par champ avec ce défaut, et un objet `headings` qui ne le mentionne pas le conserve. `{ parity: 'odd' }` sur le H1 garde le saut et ne change que la parité ; `{ enabled: false }` fait s’enchaîner les chapitres :

```ts
headings: {
  fontFamily: 'Merriweather',                               // H1 still breaks to a fresh recto (always-odd)
  levels: [{ level: 1, breakBefore: { parity: 'odd' } }],    // …or: a recto, with no mandatory blank
}

headings: { levels: [{ level: 1, breakBefore: { enabled: false } }] } // chapters run on
```

**Modifié dans postext 1.5.** Jusqu’à postext 1.4, tout objet `headings` désactivait le saut du H1 à moins de redonner `levels[0].breakBefore`, et un `breakBefore` partiel complétait son champ manquant à partir du défaut sans saut. Une configuration écrite en code pour la 1.4 avec un objet `headings` et sans saut de H1 ouvre donc désormais chaque chapitre sur un nouveau recto, avec des versos blancs si nécessaire. Pour garder des chapitres qui s’enchaînent, donnez un champ à l’entrée H1 de `levels` :

```ts
headings: { fontFamily: 'Merriweather', levels: [{ level: 1, breakBefore: { enabled: false } }] } // as 1.4 laid it out
```

Là où la configuration a été enregistrée, le moteur le détecte et s’en charge pour vous : le Sandbox pour les livres et les configurations qu’il a enregistrés à cette époque (voir **Sandbox → Persistance**), et `openBundle` / `readBundle` pour un paquet `.postext` écrit par postext 1.4 ou antérieur (voir [Paquets écrits par postext 1.4 ou antérieur](https://postext.dev/fr/docs/configuration-bundles.md#paquets-écrits-par-postext-14-ou-antérieur)). Une configuration que vous avez enregistrée vous-même peut passer par `migrateConfig(config)` de `postext/bundle`, qui écrit explicitement les sauts que posait la 1.4 (`pinLegacyHeadingBreaks`) : `enabled: false` sur un H1 qui n’avait pas de saut, et `parity: 'any'` à côté d’un `enabled: true` qui ne nommait aucune parité, sur le H1 et sur les styles de titre. Elle fige aussi la taille des mathématiques, l’espace autour des figures en ligne (dans les encadrés aussi), les marques en ligne des titres, la taille des lettrines, la place sous une ligne terminée par un deux-points qui introduit une liste, les lignes qu’une coupe d’encadré laisse d’un paragraphe ou d’un élément de liste, les sauts de ligne aux tirets, la coupure ligne par ligne du texte en drapeau, la division d’un paragraphe sous un titre, les sauts de ligne au trait d’union d’un mot composé et l’espace sous les conteneurs `:::paragraphs`, tels que la 1.4 les composait. Passez le Markdown du livre en troisième argument, `{ content }`, et elle omet le figeage des mathématiques quand le texte n’a pas de `$`, les figeages d’espacement quand aucune ligne n’incorpore de ressource (celui des encadrés quand aucune n’en incorpore dans un encadré), le figeage des marques de titre quand aucun titre ne porte de marque, celui des lignes à deux-points quand aucune liste ne suit une ligne terminée par un deux-points, celui des coupes d’encadré quand le texte n’ouvre aucun `:::callout`, celui des tirets quand aucun tiret n’est composé collé entre deux mots, celui de la division sous un titre quand le texte n’a pas de titre, celui des conteneurs quand le texte n’ouvre aucun conteneur `:::paragraphs`, et celui des mots composés quand aucun trait d’union ne se trouve entre deux lettres ; le figeage de la coupure en drapeau ne va qu’à une configuration qui compose du texte courant en drapeau, et celui des conteneurs qu’à une configuration qui déclare un style de paragraphe (voir [Paquets écrits par postext 1.4 ou antérieur](https://postext.dev/fr/docs/configuration-bundles.md#paquets-écrits-par-postext-14-ou-antérieur)). Pour les sauts seuls, appelez `pinLegacyHeadingBreaks(config)`.

Les réglages par niveau acceptent les mêmes propriétés que les valeurs générales (`fontSize`, `lineHeight`, `fontFamily`, `color`, `fontWeight`, `marginTop`, `marginBottom`, `snapToGrid`), plus ces champs propres aux niveaux (un [style de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) les accepte aussi) :

| Propriété | Type | Défaut | Description |
| --- | --- | --- | --- |
| `italic` | `boolean` | `false` | Compose le titre en italique. S’applique en plus de `fontWeight`. |
| `textTransform` | `'none' \| 'uppercase'` | `'none'` | Met le titre en capitales (un préfixe de numérotation reste tel qu’il est écrit, de même qu’une pastille et le libellé d’un `:ref` qu’il contient). La longueur est préservée pour que la table de correspondance des sources de l’éditeur reste de 1 pour 1 : les caractères dont la capitale s’allonge (`ß` → `SS`) restent tels quels. Le titre transformé alimente aussi l’espace réservé `{titleText}` des maquettes avancées et des ouvertures de chapitre. Les signets du PDF gardent le titre tel qu’il est écrit (*Author contributions*, pas *AUTHOR CONTRIBUTIONS*), comme `text-transform` en CSS laisse le texte lui-même intact (jusqu’à postext 1.4, ils prenaient les capitales). |
| `letterSpacing` | `Dimension` | `0` | Approche après chaque glyphe du titre, espaces et préfixe de numérotation compris, comme le `letter-spacing` de CSS. Une valeur positive écarte les lettres (des capitales composées avec `textTransform: 'uppercase'` en demandent en général un peu : `{ value: 0.12, unit: 'em' }`), une valeur négative resserre un grand corps. Une valeur en `em` est relative au `fontSize` du niveau. Les lignes du titre sont mesurées avec elle, elles passent donc à la ligne là où se termine le texte espacé, et le canvas, le HTML et le PDF la peignent à l’identique. L’interlettrage ne change jamais les glyphes : les ligatures du caractère (fi, fl) restent, sur toutes les sorties. Une ligne centrée ou alignée à droite est placée d’après ses lettres : l’approche après son dernier glyphe est omise, comme dans les textes de maquette, si bien qu’un titre centré s’aligne sur l’ouverture par défaut d’un titre `span: 'page'`. Un niveau dessiné à partir de son `advancedDesign` l’ignore, comme les autres champs typographiques présentés ici : chaque élément de texte de la maquette a son propre `letterSpacing`. Un [style de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) le règle aussi, pour les titres qui l’utilisent. Jusqu’à postext 1.4, les titres n’avaient pas d’approche, et la clé était ignorée sans avertissement. |
| `lineSpan` | `number` | non défini | Lignes occupées (行取り, JLReq §4.1.6) : le titre est composé dans une bande de ce nombre de lignes du texte courant, ses caractères centrés dedans, à la place de `marginTop` et `marginBottom` ; `3` donne un titre 3行取り. La bande commence sur une ligne du texte courant quand le titre est calé sur la grille, et le texte qui le suit reste sur la grille, dans les deux modes d’écriture et avec `cjk.grid` ; un titre dont les lignes demandent davantage prend le nombre entier suivant. Le centre est celui des caractères (la ligne de base moins le centre idéographique du caractère), comme le mesure JLReq, et non celui des boîtes de ligne. Ne s’applique pas aux ouvertures (`span: 'page'`), aux titres dessinés à partir d’un `advancedDesign`, aux titres masqués ni aux titres dans des encadrés. Un style de titre peut poser `0` pour annuler celui de son niveau. Depuis postext 1.16. |
| `indent` | `Dimension` | `0` | Retrait du titre depuis le début de la ligne (字下げ), l’`em` valant la taille du **texte courant**, puisque les livres japonais comptent les retraits de titre en caractères du texte courant (JLReq §4.1.3) : `{ value: 6, unit: 'em' }` donne 6字下げ quelle que soit la taille du titre. La justification se réduit d’autant, et un titre centré se centre dans le reste. Depuis postext 1.16. |
| `firstLineIndent` | `Dimension` | `0` | Retrait de la seule première ligne du titre, mesuré depuis `indent` et, comme lui, en ems du **texte courant** : les lignes sur lesquelles se poursuit un long titre commencent à `indent` (au début de la ligne quand il n’est pas défini), comme GB/T 9704 compose chaque niveau de titre avec deux cases de retrait et ses lignes suivantes à la marge : `{ value: 2, unit: 'em' }`. Avec `cjk.grid` activé, deux ems du texte courant font deux cases de la grille. Un titre numéroté imprime son numéro après le retrait : le modèle de numérotation n’a donc pas besoin d’espaces idéographiques, qui s’imprimeraient aussi dans la table des matières et les signets du PDF. Il fonctionne en texte vertical (depuis le haut de la ligne), avec le compositeur CJK (un crochet ouvrant au début du titre suit les règles de début de ligne, comme dans un paragraphe) et avec Knuth–Plass. Un titre centré le traite comme un paragraphe centré : sa première ligne se centre dans la place qui suit le retrait. `{firstLineIndent=N}` après le titre règle un seul titre, et `{firstLineIndent=0}` annule celui de son niveau. Depuis postext 1.24. |
| `jidori` | `number` | non défini | Espacement régulier (字取り) : un titre d’une ligne plus étroit que ce nombre de ses **propres** ems est espacé régulièrement jusqu’à cette largeur exacte, si bien que `3` compose 序章 en 序　章. Les titres plus larges et les titres de plusieurs lignes restent tels quels. `{jidori=N}` après le titre règle un seul titre, et `{jidori=0}` désactive celui de son niveau. Depuis postext 1.16. |
| `dropCap` | `ParagraphDropCap \| false` | aucune | Une lettrine qui ouvre le premier paragraphe de texte courant après un titre de ce niveau (voir [Lettrines](https://postext.dev/fr/docs/configuration-text.md#lettrines)) : un seul réglage donne son initiale à chaque chapitre. Un titre la désactive avec `{dropcap=false}` ou règle son nombre de lignes avec `{dropcap=2}`. Depuis postext 1.23. |
| `numberingTemplate` | `string` | `''` | Modèle du numéro automatique du niveau. Un jeton `{1}` … `{6}` imprime le compteur courant de ce niveau de titre, éventuellement formaté par un suffixe : `{1:I}` en chiffres romains majuscules, `{1:i}` en chiffres romains minuscules, `{1:A}` / `{1:a}` en lettres, `{1:01}` complété de zéros, `{1:words}` en toutes lettres (*vingt et un*), `{1:ordinal}` en ordinal (*vingt et unième*), `{1:一}` en chiffres chinois (japonais dans un document japonais : 第百一章), `{1:〇}` chiffre par chiffre, `{1:壹}` en chiffres financiers et `{1:①}` cerclé, ou tout nom des [Graphies des formats de numérotation](https://postext.dev/fr/docs/configuration-page-layout.md#graphies-des-formats-de-numérotation) ; tout autre texte est littéral (`'Chapter {1}. '`, `'{1}.{2}'`, `'第{1:一}回'` pour 第一百二十回 ; une barre oblique inverse échappe une accolade littérale). Un jeton dont le compteur est encore vide disparaît avec le séparateur qui le jouxte. Vide (le défaut), il n’y a pas de numéro automatique. Le numéro rendu est placé devant le titre dans le flux, alimente l’espace réservé `{number}` d’un emplacement de maquette avancée (où le préfixe lui-même n’est pas ajouté) et est imprimé dans la table des matières. Voir [Numéros en toutes lettres](https://postext.dev/fr/docs/configuration-headings.md#numéros-en-toutes-lettres) pour les mots, et [Styles de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) pour un modèle propre à certains titres d’un niveau. |
| `numberSeparator` | `string` | `' '` | Ce qui se place entre le numéro et le titre : dans la colonne, dans l’ouverture par défaut d’un niveau `span: 'page'`, dans les titres courants qui impriment la ligne du titre et dans les signets du PDF. Le séparateur du niveau 1 joint aussi le numéro et le titre d’une partie dans la page de partie par défaut et dans la ligne de partie par défaut de la table des matières. Les titres de chapitre chinois prennent une espace idéographique ou rien (`'　'` : 第一回　甄士隱夢幻識通靈). La table des matières garde sa propre colonne de numéros (`toc.levels[].numberGap`). Un [style de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) peut avoir le sien. Quand un titre est coupé en deux avec `\\`, comme les titres en distiques des romans chinois, les formes sur une seule ligne (la colonne, la table des matières, les titres courants) joignent les deux moitiés par une espace idéographique quand les deux côtés sont des caractères chinois ou japonais, et par une espace sinon. |
| `numberPosition` | `'before' \| 'replace'` | `'before'` | Emplacement du numéro généré. `'before'` : avant le titre, joint par `numberSeparator`. `'replace'` : le numéro constitue tout le titre et le titre écrit dans la source n’est pas imprimé, si bien que `# Night` avec `numberingTemplate: 'الليلة {1:ordinal-feminine}'` imprime الليلة الثانية. La table des matières affiche le numéro comme titre de l’entrée (sans colonne de numéros), et les titres courants (`{chapterTitle}`, `{titleText}`) et les signets du PDF le lisent aussi ; `{number}` est vide pour un tel titre. Uniquement pour les titres numérotés dotés d’un modèle (celui du niveau ou de leur style) ; tout autre titre garde son texte. Un [style de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) peut avoir sa propre valeur, `'before'` pour garder les titres que son niveau remplacerait. |
| `breakBefore` | `HeadingBreakBeforeConfig` | H1 : `{ enabled: true, parity: 'always-odd' }` H2–H6 : `{ enabled: false, parity: 'any' }` | Force un saut de page avant chaque titre de ce niveau. `parity: 'odd'` / `'even'` précise en outre de quel côté de la double page le titre s’ouvre : une page blanche de remplissage est insérée si nécessaire (elle compte toujours dans la numérotation des pages). `'always-odd'` / `'always-even'` garantissent en plus au moins une page blanche de séparation obligatoire entre le contenu précédent et le nouveau titre (la page de séparation appartient au chapitre précédent ; tout remplissage supplémentaire dû à la parité appartient au nouveau). Quand le titre est le tout premier bloc du document et que la première page est encore vide, la contrainte de parité est ignorée : le titre tombe en page 1, comme écrit. Un champ non défini garde la valeur par défaut du niveau : le `{ parity: 'odd' }` du H1 provoque toujours un saut. |
| `hidden` | `boolean` | `false` | Un titre structurel : il n’imprime rien et n’occupe aucune place dans la colonne ni dans un encadré (ni texte, ni marges, ni bande d’ouverture), mais fait tout ce que fait un titre par ailleurs. Son `breakBefore` ouvre toujours une page, il ouvre la section de son style, il compte (sauf si son style indique `numbered: false`), il figure dans `:::toc`, il est nommé par les titres courants `{chapterTitle}` et il reçoit un signet dans le PDF. Pour une dédicace, une page d’épigraphe ou un colophon dont la table des matières et les signets du lecteur ont besoin, mais que la page n’affiche pas. Réglez-le sur un [style de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) plutôt que sur tout un niveau ; un titre le redéfinit avec `{hidden="true"}` / `{hidden="false"}`. |

```ts
headings: {
  fontFamily: 'Merriweather',
  levels: [
    // Canonical book preset: chapters on a right-hand (odd) page.
    { level: 1, fontSize: { value: 24, unit: 'pt' }, breakBefore: { enabled: true, parity: 'odd' } },
    { level: 2, fontSize: { value: 18, unit: 'pt' }, italic: true },
  ]
}
```

`snapToGrid` fonctionne aussi par niveau. Non défini, un niveau suit `headings.snapToGrid` ; défini, il le remplace. Un même document peut ainsi placer ses H2 une ligne et demie au-dessus de leur texte, hors de la grille jusqu’au point de calage suivant, tandis que ses H3 arrondissent l’espace qui les suit à des lignes entières de la grille. Un style de titre peut aussi le régler, pour les titres qui l’utilisent.

```ts
headings: {
  marginBottom: { value: 1.5, unit: 'em' },
  levels: [
    { level: 2, snapToGrid: false }, // exactly 1.5 em under every H2
    { level: 3 },                    // inherits headings.snapToGrid: true
  ],
}
```

### Saut avant

`breakBefore` est indépendant des réglages de numérotation : l’activer force un saut de page, mais le compteur numérique n’est remis à zéro que si vous insérez explicitement une directive `:::numbering`. Les pages blanches de parité comptent comme de vraies pages dans la séquence et reçoivent en-têtes et pieds de page selon leurs règles habituelles de pages paires et impaires.

Un `:::pagebreak` placé juste avant un tel titre ne remplace pas son saut : le titre applique quand même sa parité après la page que la directive a ouverte, ce qui peut ajouter une page blanche. Voir [Styles de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre) pour un titre qui doit commencer juste après un saut manuel.

#### Valeurs de parité

| Valeur | Comportement |
| --- | --- |
| `'any'` (défaut) | Aucune contrainte de parité. Le titre s’ouvre simplement sur la page suivante. |
| `'odd'` | Garantit que le titre s’ouvre sur une page impaire (de droite). Une seule page blanche est insérée, uniquement quand la page suivante naturelle est paire. |
| `'even'` | Pareil, mais pour une page paire (de gauche). |
| `'always-odd'` | Garantit **au moins une page blanche de séparation obligatoire** entre le contenu précédent et le nouveau titre, puis assure la parité impaire. Utile quand chaque chapitre doit commencer sur une nouvelle double page. |
| `'always-even'` | Pareil, mais pour une page paire. |

#### À qui appartiennent les pages blanches

Les pages blanches insérées par `breakBefore` portent des en-têtes avec le titre du chapitre selon la *raison* de leur insertion :

- Les pages insérées pour respecter une contrainte de parité (`'odd'`, `'even'`, ou la fin de parité de `'always-*'`) appartiennent au chapitre **à venir**. L’espace réservé `{chapterTitle}` de leur en-tête se résout en titre du nouveau chapitre, puisque la page blanche n’existe que pour amener le nouveau chapitre sur la bonne parité.
- La page de séparation obligatoire insérée par `'always-odd'` / `'always-even'` appartient au chapitre **précédent**. C’est une respiration voulue en fin de chapitre : l’en-tête `{chapterTitle}` affiche donc encore le titre de l’ancien chapitre.

Les titres courants et la palette d’une section stylée (voir [Styles de titre](https://postext.dev/fr/docs/configuration-styles.md#styles-de-titre)) suivent les deux mêmes règles sur les pages blanches.

#### Exception du début de document

Quand le tout premier bloc du document est un titre dont le `breakBefore` est activé, ou que la source s’ouvre sur `:::pagebreak`, la contrainte de parité est ignorée tant que la première page est encore vide. Le titre tombe en page 1, comme écrit, quelle que soit la parité configurée : un document qui commence par un `# Chapter 1` configuré avec `parity: 'odd'` n’hérite donc pas d’une page blanche parasite en tête. Dès qu’un contenu a été placé, la contrainte de parité se comporte normalement.

### Étendue et maquette avancée

Chaque niveau de titre accepte deux champs supplémentaires qui règlent la manière dont le titre se rend comme ouverture de chapitre sur toute la largeur de la page.

| Propriété | Type | Défaut | Description |
| --- | --- | --- | --- |
| `span` | `'column' \| 'page'` | `'column'` | Avec `'page'`, le titre est traité comme une ouverture de chapitre et sa maquette avancée (si elle est activée) est attachée à la page sous forme de bande d’ouverture au-dessus du texte. Associez-le à `breakBefore.enabled: true` pour que l’ouverture commence toujours une nouvelle page. Sans maquette propre, le titre est peint par une ouverture par défaut sur toute la zone de contenu, dans la typographie et l’interlignage du niveau, avec ses segments en gras, en italique, en exposant et en indice (`headings.inlineMarks`), et la bande est mesurée à cette largeur. La bande contient toutes les lignes que peint l’ouverture : quand l’ouverture prend plus de lignes que la justification propre du titre (un titre justifié dont les espaces se resserreraient sur une seule ligne, un saut forcé `\\`), la bande les prend aussi. Jusqu’à postext 1.4, la bande était mesurée avec le titre coupé à la largeur de la colonne, si bien qu’un titre qui tient sur une ligne dans la zone de contenu prenait une bande de deux lignes de haut, avec la ligne centrée dedans. Les autres colonnes commencent sous la bande, comme la colonne propre du titre. Le texte qui ouvre l’une d’elles commence là où commencerait un texte placé juste sous l’ouverture, quoi qui suive l’ouverture dans sa propre colonne : le `marginBottom` de l’ouverture sous son titre ou sa maquette, porté jusqu’à la ligne de grille suivante quand le niveau se cale sur la grille. Un titre, une formule hors texte ou une ligne de table des matières qui ouvre l’une d’elles est placé à la hauteur du premier titre ou de la première formule hors texte sous l’ouverture, marges comprises comme là-bas ; quand la colonne de l’ouverture continue avec autre chose, elle commence là où commence ce texte. Un titre masqué sous l’ouverture ne compte pas, et l’espace que l’[équilibrage des colonnes](https://postext.dev/fr/docs/configuration-page-flow.md#équilibrage-des-colonnes) ajoute au-dessus du titre placé sous l’ouverture n’est pas répété dans les autres colonnes. Ce que ces colonnes calent sur la grille tombe sur la grille de la page. Jusqu’à postext 1.4, leur premier bloc se posait au pied de la bande : hors de la grille quand la bande se terminait entre deux lignes, et collé à la bande, sans marge, quand un titre suivait l’ouverture (une ligne plus haut qu’aujourd’hui quand la bande se terminait sur la grille) ; un titre placé là perdait aussi la marge supérieure que gardait le titre de la première colonne. |
| `spanBreak` | `boolean` | `true` | Indique si un titre `span: 'page'` commence une nouvelle page. `true` ouvre la page suivante (son côté étant choisi par `breakBefore`). `false`, avec `breakBefore.enabled: false`, l’ouvre là où arrive le texte, comme le fait un encadré sur toute la largeur de la page : les colonnes au-dessus se terminent à niveau (la bande est équilibrée quand `headings.balancing.trailing` est activé), la maquette ou l’ouverture par défaut du titre est composée sur la zone de contenu sous elles, et le texte continue dans chaque colonne en dessous : un deuxième article d’un bulletin sous la fin du premier. Quand la place restante ne contiendrait pas le titre et le minimum de lignes de veuve sous lui, il ouvre la page suivante comme avec `true`. Le rôle de la page reste celui que lui donne son premier bloc. Sans effet sur un titre `span: 'column'`. Aussi sur un style de titre. Depuis postext 1.19. |
| `advancedDesign` | `HeadingAdvancedDesignConfig` | `{ enabled: false, slot: { elements: [] } }` | Emplacement de maquette en composition libre pour ce niveau. Quand `enabled` est vrai, les éléments de l’emplacement composent l’ouverture. Utilisez `{titleText}` dans un élément de texte pour rendre le texte du titre ; utilisez `{number}`, `{numberRoman}`, etc. pour insérer le numéro formaté du titre. |
| `advancedDesign.minHeight` | `Dimension` | — | Hauteur minimale réservée au titre dans le flux de la colonne. Le titre prend `max(design content bottom, minHeight)`, puis le `marginBottom` du titre sous lui (de son style de titre, de son niveau ou de `headings.marginBottom` ; 0,5 em de la taille du titre par défaut), et la somme est arrondie vers le haut à la grille de ligne de base quand les titres se calent. Une ouverture peut donc repousser le texte courant vers le bas (ou réclamer toute la page) même quand ses éléments sont courts ou ancrés aux cadres de la page ou du fond perdu au-dessus du titre. Pour une bande d’exactement `minHeight` de haut, mettez ce `marginBottom` à 0 et faites de `minHeight` un nombre entier de lignes de la grille. S’applique dès que `enabled` est vrai, même avec un emplacement vide. Voir [Hauteur réservée](https://postext.dev/fr/docs/configuration-headings.md#hauteur-réservée) pour ce que compte le bas du contenu de la maquette. |

**Une ouverture aussi haute que la page.** Quand la hauteur réservée dépasse le pied de la colonne (une couverture dont le `minHeight` est la hauteur de la page, une image ou un encadré ancré à la page ou au fond perdu et qui descend jusqu’au format rogné), l’ouverture réclame le reste de la page : le texte qui la suit commence à la page suivante, dans chaque colonne d’une maquette à deux colonnes comme d’une maquette à colonne et demie. Une couverture n’a donc pas besoin d’un `:::pagebreak` après elle (en mettre un ne fait pas de mal : il n’ajoute pas de page blanche). Un titre dans la colonne (`span: 'column'`) dont la maquette est plus haute que sa colonne réclame cette colonne, et le texte commence en tête de la suivante. Le bloc du titre descend alors jusqu’au pied de la colonne qu’il réclame, et sa maquette est mise en page par rapport à cette bande : les éléments ancrés en haut restent là où ils sont ancrés, et ceux qui suivent la bande (ancrés à son milieu ou à son pied, ou de hauteur `'fill'`) se tiennent dans la place que réclame le titre, comme ils se tiennent dans la hauteur réservée quand elle suffit (jusqu’à postext 1.4, le bloc gardait la hauteur de son texte : ces éléments étaient donc mis en page par rapport à une bande de la hauteur d’un titre, et le texte qui suivait passait sous la maquette). Les éléments d’habillage de page qui ne doivent pas réclamer la page (une bande le long de la tranche de gouttière sur toute la hauteur de la page, un ornement au pied de la page) ont plutôt leur place dans la maquette de l’en-tête ou du pied de page : ancrés à `'page'` ou `'bleed'` et affichés avec `pages: 'opener'`, ils se peignent sur la page d’ouverture et ne réservent aucune place dans le texte.

Exemple : une ouverture de chapitre minimaliste qui affiche « Chapter N » au-dessus du titre :

```json
{
  "headings": {
    "levels": [
      {
        "level": 1,
        "span": "page",
        "breakBefore": { "enabled": true, "parity": "always-odd" },
        "advancedDesign": {
          "enabled": true,
          "slot": {
            "elements": [
              {
                "kind": "text",
                "id": "chapterLabel",
                "placement": {
                  "anchor": { "to": "container", "edge": "top" },
                  "offset": { "y": { "value": 48, "unit": "pt" } },
                  "size": { "width": "fill" }
                },
                "content": "Chapter {numberRoman}",
                "fontSize": { "value": 10, "unit": "pt" },
                "align": "center",
                "overflow": "ellipsis-end"
              },
              {
                "kind": "text",
                "id": "chapterTitle",
                "placement": {
                  "anchor": { "to": "#chapterLabel", "edge": "below" },
                  "offset": { "y": { "value": 12, "unit": "pt" } },
                  "size": { "width": "fill" }
                },
                "content": "{titleText}",
                "fontSize": { "value": 24, "unit": "pt" },
                "fontWeight": 700,
                "align": "center",
                "overflow": "wrap",
                "hyphenate": true
              }
            ]
          }
        }
      }
    ]
  }
}
```

Espaces réservés de titre disponibles dans l’emplacement de maquette d’un niveau :

- `{titleText}` : le texte brut du titre (sans préfixe de numérotation). Un saut forcé dans le titre (`\\`) y est un saut de ligne, dans une bande d’ouverture comme dans une maquette dans la colonne (jusqu’à postext 1.4, une maquette dans la colonne imprimait une espace à cet endroit, alors que sa hauteur était mesurée avec le saut). Les lignes sur lesquelles le titre masqué se coupe dans sa colonne sont rassemblées dans le titre tel qu’il est écrit : un mot coupé après son propre trait d’union garde le trait d’union sans espace après lui, un mot que la colonne a divisé redevient entier sans le trait d’union ajouté par la coupure, un groupe soudé par une espace insécable plus large que la colonne et séparé à cette espace retrouve son espace insécable (`Capítulo XVIII`, pas `CapítuloXVIII`), et chaque autre coupure rend son espace unique. Jusqu’à postext 1.4, chaque saut de ligne devenait une espace : un titre coupé à un trait d’union imprimait donc `Word- Book`, et un saut forcé dans un tel titre était perdu.
- `{number}` : le numéro formaté selon le `numberingTemplate` du niveau.
- `{numberDecimal}`, `{numberRoman}`, `{numberRomanLower}`, `{numberAlpha}`, `{numberAlphaLower}` : le compteur du titre (le décompte courant de son niveau, quoi qu’imprime le modèle) dans d’autres formats de numération : le troisième chapitre donne `3`, `III`, `iii`, `C`, `c`, avec ou sans `numberingTemplate`. Un titre non numéroté (un style avec `numbered: false`) les laisse vides.
- `{numberWords}`, `{numberWordsLower}`, `{numberOrdinalWords}`, `{numberOrdinalWordsLower}` : le même compteur en toutes lettres, avec une capitale ou en minuscules : *Trois* / *trois*, *Troisième* / *troisième* (voir [Numéros en toutes lettres](https://postext.dev/fr/docs/configuration-headings.md#numéros-en-toutes-lettres)).
- `{numberHan}` : le même compteur en chiffres chinois, dans l’écriture de la `locale` du document : une ouverture composée avec `第{numberHan}回` imprime 第十二回 pour le douzième chapitre tandis que la table des matières affiche `12`.
- `{chapterNumber}`, `{chapterTitle}`, `{pageNumber}`, `{totalPages}`, `{bookTotalPages}`, `{title}`, `{subtitle}`, `{author}`, `{publishDate}` : espaces réservés de métadonnées partagés.
- `{attr.<key>}` : un attribut écrit sur la ligne du titre elle-même (`# Title {author="I. Zango Martín"}`), avec repli sur l’attribut du H1 du chapitre en cours. Les attributs absents se résolvent en chaîne vide, sans avertissement.

`{chapterNumber}` imprime ce que les titres courants impriment pour le chapitre : le numéro du H1 quand son niveau (ou son style) a un `numberingTemplate`, sinon le rang du chapitre (`1`, `2`…, en continuant après les chapitres mis en page avant celui-ci), et rien pour un chapitre non numéroté ou un style dont le modèle est `''`. Une maquette de titre lit le chapitre auquel appartient son titre : un titre de niveau 1 le sien, un titre inférieur le dernier titre de niveau 1 qui le précède. Cela vaut aussi là où deux chapitres se rencontrent sur une même page, tandis que les titres courants de cette page impriment le chapitre suivant. La hauteur que réserve une ouverture est mesurée avec cette même valeur. Jusqu’à postext 1.4, elle était mesurée avec le préfixe de numéro du titre (vide sans modèle), si bien qu’une maquette dont la hauteur dépend de `{chapterNumber}` pouvait se peindre plus haute que la place qu’elle prenait ; et la maquette imprimait le chapitre de la page, si bien que le premier de deux chapitres partageant une page affichait le numéro du second.

Les espaces réservés de compteur suivent le livre d’un chapitre à l’autre quand les chapitres sont mis en page un par un (les compteurs que transmet `continuationAfter()`), et l’attribut `startAt` d’un titre les fait repartir (voir **Format de document → Attributs de titre**). Une ouverture qui affiche *Chapter III* au-dessus d’un titre numéroté `3.` dans le flux et dans la table des matières :

```ts
{
  level: 1,
  span: 'page',
  numberingTemplate: '{1}.',
  advancedDesign: {
    enabled: true,
    slot: { elements: [
      { kind: 'text', id: 'label', content: 'Chapter {numberRoman}', fontSize: { value: 10, unit: 'pt' }, overflow: 'ellipsis-end',
        placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: 'fill', height: 'auto' } } },
      { kind: 'text', id: 'title', content: '{titleText}', fontSize: { value: 24, unit: 'pt' }, overflow: 'wrap',
        placement: { anchor: { to: '#label', edge: 'below' }, size: { width: 'fill', height: 'auto' } } },
    ] },
  },
}
```

#### Hauteur réservée

Un titre doté d’une maquette avancée occupe de la place dans la colonne comme n’importe quel bloc : le texte courant qui le suit commence sous cette place. Cette place est la plus grande de trois hauteurs, toutes mesurées vers le bas depuis le haut du titre (le haut de la zone de contenu pour une ouverture qui commence sa page) :

1. le texte propre du titre, composé dans la typographie du niveau (il est masqué sous la maquette, mais garde ses lignes) ;
2. le bas du contenu de la maquette, c’est-à-dire le bord inférieur le plus bas parmi les éléments qui comptent (voir plus bas) ;
3. `advancedDesign.minHeight`.

Le `marginBottom` du titre s’y ajoute (de son style de titre, de son niveau ou de `headings.marginBottom` ; 0,5 em par défaut), et le résultat est arrondi vers le haut à la grille de ligne de base quand les titres se calent. Pour une ouverture (`span: 'page'`), la même bande est laissée libre dans chaque colonne de la page. Pour un titre dans la colonne qui tient dans sa colonne, la maquette est mise en page dans la boîte du titre, qui a exactement cette hauteur.

**Quels éléments comptent.** Tous les éléments de la maquette comptent, textes, filets, boîtes et images confondus (jusqu’à postext 1.4, un élément `image` ne comptait jamais, si bien que le texte pouvait commencer par-dessus une image de bande, sauf si `minHeight` l’en tenait éloigné), à l’exception :

- **des éléments avec `reserve: false`** : une décoration qui peut se trouver sous le texte ;
- **des éléments qui suivent la bande elle-même** : ancrés à la rangée du milieu du conteneur (`left`, `center`, `right`) ou à sa rangée du bas (`bottom-left`, `bottom`, `bottom-right`), avec une hauteur `'fill'` par rapport au conteneur (une boîte ou un filet vertical sans hauteur le remplit par défaut), et de tout élément ancré à l’un d’eux. Le conteneur est la bande réservée : ces éléments se posent donc sur son pied ou la couvrent, comme un filet sous la bande ou un panneau teinté derrière le titre. Ils suivent la hauteur ; ils ne la fixent jamais. Un texte parmi eux qui garde sa propre hauteur a quand même besoin de place : un titre ancré au pied de la bande rend la bande au moins aussi haute que lui, si bien qu’il ne commence jamais au-dessus du haut du titre. Avec `minHeight: 36mm` et le titre ancré `bottom-left`, la boîte du titre mesure 36 mm plus son `marginBottom`, arrondis vers le haut à la grille, et le titre se pose au pied de cette boîte, juste au-dessus du texte qui suit ; sans `minHeight`, un titre qui prend plus de lignes que le texte propre du titre rend la bande aussi profonde que lui. Jusqu’à postext 1.4, un tel titre était peint vers le haut, par-dessus le texte placé au-dessus du titre. Les boîtes, filets et images qui suivent la bande ne fixent pas un tel plancher : un panneau ancré au pied peut donc monter au-dessus du titre.

Les éléments ancrés à la page ou au fond perdu comptent selon la distance à laquelle ils descendent sous le haut du titre. Une bande en haut de la page qui s’arrête au-dessus du titre ne compte pour rien ; une image à fond perdu qui le dépasse repousse le texte jusqu’à son bord inférieur. De même pour tout ce qui se trouve bas sur la page : un sceau à 25 mm du pied de page, une bande latérale sur toute la hauteur ou un cadre réserve la page jusqu’à son bord inférieur, et le texte commence en général à la page suivante. Marquez une telle décoration `reserve: false` (elle se peint toujours et les éléments peuvent toujours s’y ancrer), et donnez au titre la place dont il a besoin avec ses éléments de texte ou `minHeight` :

```json
{
  "kind": "image", "id": "seal", "resourceId": "seal", "reserve": false,
  "placement": {
    "anchor": { "to": "page", "edge": "bottom-right" },
    "offset": { "x": { "value": -25, "unit": "mm" }, "y": { "value": -25, "unit": "mm" } },
    "size": { "width": { "value": 30, "unit": "mm" } }
  }
}
```

Un élément ancré à un élément qui ne réserve pas compte quand même, sauf s’il est marqué lui aussi (une légende posée sur le sceau a besoin de son propre `reserve: false`).

**Où elle se peint.** La maquette d’une ouverture (`span: 'page'`) est dessinée avant le texte, si bien qu’une décoration qui ne réserve rien se trouve sous le texte. La maquette d’un titre dans la colonne est dessinée avec le bloc du titre (par-dessus les blocs qui le précèdent dans la colonne, sous ceux qui le suivent), où qu’elle soit placée au-dessus du pied de sa colonne : dans les marges latérales, la marge supérieure, le fond perdu et les colonnes voisines aussi. Le pied de la colonne la coupe, sur le canvas et dans le PDF, puisque le flux s’y arrête (voir **Plus haute que la colonne** plus bas). Jusqu’à postext 1.4, le canvas et le PDF la coupaient aussi en haut de sa colonne, si bien qu’une bande ancrée en haut de la page ou du fond perdu débordait dans les marges latérales mais s’arrêtait à la marge supérieure. Une décoration ancrée au pied de la page a sa place dans une ouverture, ou dans la maquette du pied de page avec `pages: 'opener'`.

**Plus haute que la colonne.** Quand la place dépasse le pied de la colonne (un `minHeight` aussi haut que la page, une image ou un cadre qui descend jusqu’au format rogné), le titre réclame le reste de sa page (une ouverture, dans chaque colonne) ou de sa colonne (un titre dans la colonne), et le texte qui le suit commence à la page ou à la colonne suivante. Son bloc descend alors jusqu’au pied de la colonne, sans jamais être ramené à la hauteur de son texte, si bien que la bande par rapport à laquelle sa maquette est mise en page est la place qu’il réclame (`minHeight` compris, jusqu’au pied). Une maquette plus haute que la page elle-même (un long chapeau sur une petite page d’écran) est quand même coupée au pied de la page (une maquette dans la colonne, au pied de sa colonne) : le Sandbox la signale dans le panneau **Vérifications** sous le nom *Maquette de titre coupée*. La mise en page ne lève aucun avertissement pour cela (une couverture qui réclame sa page est le cas habituel et ne perd rien), mais tout hôte peut lancer la même vérification sur la mise en page terminée : `collectHeadingDesignCuts(doc)` renvoie un `{ kind: 'headingDesignCut', pageIndex, level, where, overflowPx, sourceStart, sourceEnd }` pour chaque titre dont le texte de maquette dépasse le pied du format rogné de la page (`where: 'page'`, une ouverture) ou de sa colonne (`where: 'column'`), et `formatWarning` décrit chacun d’eux. Voir **Une ouverture aussi haute que la page** sous [Étendue et maquette avancée](https://postext.dev/fr/docs/configuration-headings.md#étendue-et-maquette-avancée).

**La colonne latérale.** Dans une maquette à colonne et demie dont la colonne latérale reçoit les flottants (`sideColumnRole: 'floats'`), un élément de la maquette d’un titre dans la colonne qui se trouve dans la colonne latérale (un numéro de chapitre ancré à la page dans la colonne de marge extérieure d’une ouverture de manuel) en tient la pile latérale éloignée. Chaque figure, tableau ou encadré `span: 'side'` que la page compose après le titre garde un écart de flottant libre autour de chacun de ces éléments : il reste là où la pile le place quand il tient au-dessus de l’élément, et passe sinon dessous, ou attend la page suivante quand le reste de la colonne latérale ne peut pas l’y contenir. Un numéro en tête du couloir latéral tient donc toute la pile sous lui, tandis qu’un numéro de section suspendu dans la marge à côté d’un titre plus bas sur la page laisse la tête du couloir aux figures que la page cite (la figure marginale se place toujours en haut de sa page). Ce que la colonne latérale contient déjà quand le titre est placé n’est pas déplacé : une figure empilée plus tôt sur la page qui descend jusqu’à l’élément du titre reste où elle est, sous l’élément ; une maquette dont l’élément se trouve dans la colonne latérale au milieu de la page veut donc ses figures citées après le titre. Les éléments avec `reserve: false` laissent la colonne latérale libre, comme ils laissent le texte. Une ouverture (`span: 'page'`) n’a besoin de rien de tel : sa bande est réservée dans chaque colonne, colonne latérale comprise. Jusqu’à postext 1.4, une figure latérale citée sur une telle ouverture était placée en tête de la colonne latérale, par-dessus le numéro.

**Couvertures.** Un titre de couverture qui remplit sa page (`minHeight` aussi haut que la page, ou une image pleine page dans sa maquette) envoie donc de lui-même le texte qui le suit à la page suivante, dans les maquettes à une ou à plusieurs colonnes. Un `:::pagebreak` juste après lui est facultatif et ne fait pas de mal : un saut de page sur une page encore vide ne fait rien, il n’ajoute donc jamais de page blanche. Il n’est nécessaire que lorsque la maquette de la couverture s’arrête avant le pied de la page et que le texte doit quand même commencer sur une nouvelle page.

```md
# Annual report 2026 {style="cover"}

:::pagebreak

# Letter from the chair
```

### Numéros en toutes lettres

Deux suffixes de modèle de numérotation écrivent un compteur en toutes lettres, dans la langue du document (la `locale` de premier niveau, sinon la langue de césure ; voir [Langue du document](https://postext.dev/fr/docs/configuration-language.md#langue-du-document)) : `words` pour le cardinal et `ordinal` pour l’ordinal. La casse du suffixe fixe la casse des mots, comme `A` / `a` le fait pour les lettres :

| Jeton | Anglais (21) | Espagnol (21) | Chinois (21) |
| --- | --- | --- | --- |
| `{1:words}` | twenty-one | veintiuno | 二十一 |
| `{1:Words}` | Twenty-one | Veintiuno | 二十一 |
| `{1:WORDS}` | TWENTY-ONE | VEINTIUNO | 二十一 |
| `{1:ordinal}` | twenty-first | vigesimoprimero | 第二十一 |
| `{1:Ordinal}` | Twenty-first | Vigesimoprimero | 第二十一 |
| `{1:ORDINAL}` | TWENTY-FIRST | VIGESIMOPRIMERO | 第二十一 |

L’anglais, l’espagnol, le français, l’italien, l’allemand, le catalan, le portugais, le chinois, le japonais et l’arabe sont écrits en toutes lettres ; toute autre langue prend les mots anglais, comme le font les chaînes de continuation de tableau intégrées. Le chinois écrit les chiffres informels de `simp-chinese-informal` ou de `trad-chinese-informal`, selon l’écriture de la `locale` (一万 / 一萬), avec 第 devant un ordinal ; les caractères Han n’ont pas de casse, les trois graphies d’un suffixe s’impriment donc de la même façon. L’anglais suit l’usage américain (*one hundred five*, sans *and*). L’espagnol emploie par défaut les formes masculines, comme on numérote un *capítulo* ou un *libro* (*capítulo primero*, *tercero*, *veintiuno*), et écrit les ordinaux de 13 à 29 en un seul mot, comme le préfère la RAE (*decimotercero*, *vigesimoprimero*). Les cardinaux sont écrits en toutes lettres jusqu’à 999 999 et les ordinaux espagnols, catalans et portugais jusqu’à 999 ; les nombres plus grands s’impriment en chiffres.

Le français suit l’orthographe traditionnelle (*vingt et un*, *soixante et onze*, *quatre-vingts*, *deux cent un*) et écrit *premier* pour un (*Chapitre premier*, mais *vingt et unième*) ; l’italien écrit chaque nombre en un seul mot (*ventuno*, *ventitré*, *duemilaventiquattro* ; *primo*, *ventunesimo*), l’allemand aussi (*einundzwanzig*, *hunderteins* ; *erste*, *einundzwanzigste*), avec *ss* pour *ß* en allemand de Suisse (`de-CH`) ; le catalan suit l’IEC (*vint-i-u*, *dos-cents* ; *primer*, *cinquè*, *vint-i-unè*), et le portugais est celui du Brésil (*dezesseis*) sauf si la `locale` nomme une autre région (`pt-PT` : *dezasseis*), avec les ordinaux latins (*vigésimo primeiro*). Les ordinaux catalans et portugais, comme les espagnols, sont écrits jusqu’à 999.

Les langues romanes lisent le modificateur de genre : `-feminine` (ou `-f`) accorde les mots avec un nom féminin (`{1:Ordinal-f} partie` donne *Première partie*, `Parte {1:ordinal-f}` donne en italien *Parte prima* ; de même *vingt et une*, *veintiuna*, *vint-i-una*, *duzentas*), et `-masculine` (`-m`) est le défaut. En allemand, le cardinal ne varie pas (*Kapitel eins*), mais l’ordinal varie : sans modificateur, il prend la terminaison qu’il a après l’article, la même aux trois genres (`Das {1:ordinal} Kapitel` donne *Das erste Kapitel*) ; devant un nom sans article, `-masculine` donne *Erster Teil*, `-feminine` *Erste Lektion* et `-neuter` (`-n`) *Erstes Kapitel*. Les nombres allemands s’écrivent en minuscules, comme le veut la langue (`Kapitel {1:words}` donne *Kapitel eins*) ; `{1:Words}` met une capitale initiale, pour le mot qui ouvre le titre, et `{1:WORDS}` écrit ß en SS.

Les nombres arabes s’accordent en genre avec le nom qu’ils comptent : le suffixe accepte donc un modificateur : `-feminine` (ou `-f`) pour un nom féminin, `-masculine` (`-m`, le défaut) pour un nom masculin ; `-classical` écrit les centaines مائة, comme le font Boulaq et la plupart des imprimés égyptiens, au lieu du moderne مئة. `{1:ordinal}` écrit l’ordinal défini au nominatif qu’emploie un titre : `الفصل {1:ordinal}` donne *الفصل الأول*, *الفصل الحادي عشر*, *الفصل الحادي والعشرون* ; `الليلة {1:ordinal-feminine}` donne *الليلة الأولى*, *الليلة الحادية عشرة*, *الليلة الحادية والعشرون*, *الليلة المئتان*, et au-delà de cent la formule classique « après » : *الليلة الخامسة والأربعون بعد الثلاثمئة*, *الليلة الحادية بعد الألف*. `{1:words}` écrit le cardinal (واحد وعشرون ; au féminin إحدى عشرة, واحدة وعشرون). Les ordinaux sont écrits en toutes lettres jusqu’à 9 999 et les cardinaux jusqu’à 99 999 ; les modificateurs se combinent (`{1:ordinal-f-classical}`) ; les langues romanes et l’allemand n’en lisent que le genre (voir plus haut), et les autres langues les ignorent. L’arabe n’a pas de capitales : la casse du suffixe ne change donc rien. Les espaces réservés de maquette `{numberWords}` et `{numberOrdinalWords}` écrivent les formes masculines ; pour une ouverture au féminin, mettez l’ordinal dans le modèle du niveau et imprimez-le avec `{number}`.

Dans une maquette de titre, `{numberWords}` / `{numberWordsLower}` et `{numberOrdinalWords}` / `{numberOrdinalWordsLower}` écrivent le compteur du titre de la même façon, si bien que l’ouverture peut afficher *Chapter One* tandis que la table des matières affiche `1`. Le `textTransform: 'uppercase'` d’un élément de texte donne les capitales :

```ts
// Spanish novel: "CAPÍTULO PRIMERO" above the title, "1." in the contents.
{ level: 1, numberingTemplate: '{1}.', span: 'page',
  advancedDesign: { enabled: true, slot: { elements: [
    { kind: 'text', id: 'n', content: 'Capítulo {numberOrdinalWordsLower}', textTransform: 'uppercase', /* … */ },
    { kind: 'text', id: 't', content: '{titleText}', /* … */ },
  ] } } }
```
