Aller au contenu principal

Chapitre 5 · Partie II · Le métier

Configuration : texte et titres

La typographie du texte courant, la césure et la langue du document ; les titres, les listes à puces et numérotées, et les mathématiques

Mis à jour 2026-10-1011 minenescafrptzhjaar

En bref

Cette page réunit les réglages des mots sur la page. Vous choisissez la police, la taille et l’interlignage du texte principal, et la façon dont les mots sont coupés en fin de ligne. Vous indiquez à Postext la langue dans laquelle le livre est écrit. Vous réglez l’aspect de chaque niveau de titre et le dessin des listes à puces et des listes numérotées. La dernière section fixe la taille et la couleur des formules mathématiques.

#Texte courant

La propriété bodyText règle la typographie de tout le texte des paragraphes.

Échelle typographiqueHiérarchie typographique du H1 jusqu’au petit texte, avec les tailles relatives des titres, du texte courant et des légendes.H1Titre 132pxH2Titre 224pxH3Titre 320pxCorpsTexte courant16pxPetitLégende / note13px
Une échelle cohérente rend la hiérarchie lisible au premier coup d’œil.
Échelle d’espacementUne échelle d’espacement par paliers, avec des valeurs croissantes employées pour les marges, les retraits internes et les intervalles.xs4 px×1sm8 px×2md16 px×4lg24 px×6xl40 px×102xl64 px×164 px
Les paliers d’espacement installent un rythme prévisible dans la mise en page.
PropriétéTypeDéfautDescription
fontFamilystring'EB Garamond'Famille de caractères du texte courant. N’importe quelle police Google Fonts, police système ou famille personnalisée déclarée dans customFonts. Une seule famille, pas une pile de polices CSS (voir plus bas).
fontSizeDimension8 ptCorps de base du texte courant.
lineHeightDimension1.5 emEspacement vertical entre les lignes. Les unités relatives (em, rem) suivent le corps du texte.
paragraphSpacingbooleanfalseActivé, insère une ligne blanche (égale à lineHeight) entre deux paragraphes consécutifs, pour une séparation à la manière des éditeurs.
colorColorValue#000000Couleur du texte.
boldColorColorValueMain Color (#295AA3)Couleur des passages en gras (bold/strong). Résolue d’après l’entrée main-color de la palette par défaut : changer cette couleur de la palette reteinte tout le gras du document.
italicColorColorValueMain Color (#295AA3)Couleur des passages en italique (emphase). Même valeur par défaut liée à la palette que boldColor.
referenceColorColorValueMain Color (#295AA3)Couleur des étiquettes :ref en ligne (renvois vers des ressources). Même valeur par défaut liée à la palette que boldColor. Elle suit la palette depuis postext 1.5 ; jusqu’à la 1.4 elle restait #295AA3 quelle que soit la Main Color.
referenceBoldbooleantrueCompose les étiquettes :ref en ligne avec la police grasse. Un renvoi garde l’emphase du texte qui l’entoure (dans …, il reste en gras italique avec l’une ou l’autre valeur) ; cette option ne fait qu’ajouter le gras.
referenceItalicbooleanfalseCompose les étiquettes :ref en ligne en italique. Un renvoi placé dans un texte en italique reste en italique avec l’une ou l’autre valeur.
emphasis'auto' | 'italic' | 'bold' | 'color' | 'overline''auto'Comment … est composé : en italique, en gras dans la couleur boldColor, en romain dans la couleur italicColor, ou en romain avec un filet au-dessus des mots. 'auto' vaut 'bold' dans un document écrit en écriture arabe et 'italic' dans tout autre. Voir Texte arabe.
tashkil'keep' | 'strip' | 'strip-vowels''keep'Signes vocaliques arabes : composés tels qu’écrits, tous retirés, ou retirés sauf la chadda. Voir Texte arabe.
textAlign'left' | 'justify' | 'start' | 'end''justify'Alignement du texte. 'left' (ou 'start') désigne le côté où commence une ligne : la droite pour un paragraphe de droite à gauche (voir Sens du texte). Le texte justifié répartit l’espace sur chaque ligne pour obtenir des bords réguliers. Les dernières lignes des paragraphes justifiés sont composées en drapeau à leur largeur naturelle, sauf lorsque Knuth-Plass a accepté une dernière ligne trop pleine en comptant sur le rétrécissement des espaces : les espaces entre les mots se resserrent alors pour que la ligne remplisse exactement la largeur de ligne (sémantique de réglage des espaces de TeX, appliquée de la même façon par les moteurs de rendu canvas, HTML et PDF).
fontWeightnumber400Graisse du texte normal (100–900).
boldFontWeightnumber700Graisse du texte en gras (100–900).
hyphenationHyphenationConfigactivée, 'en-us'Réglages de la césure automatique. Voir plus bas.
firstLineIndentDimension1.5emRetrait appliqué à la première ligne de chaque paragraphe (ou à toutes les lignes sauf la première quand le retrait suspendu est activé).
hangingIndentbooleanfalseActivé, le retrait s’applique à toutes les lignes sauf la première (retrait suspendu, dit « à la française »).
indentAfterHeadingbooleantrueAvec false, le premier paragraphe qui suit immédiatement un titre est composé sans retrait de première ligne, convention typographique courante dans les publications scientifiques et dans de nombreux styles de livre. Il en va de même pour un paragraphe placé juste après une ligne :::space. Un encadré placé hors du texte entre les deux (dans la colonne latérale avec span: 'side', flottant en tête ou en pied de page, ou fixe) et une figure flottante sont ignorés : dans sa colonne, le paragraphe suit toujours le titre et il est composé sans retrait. Un encadré placé dans le texte (placement: 'here') compte, et le paragraphe qui le suit prend son retrait. Sans effet quand hangingIndent est activé.
maxWordSpacingnumber2Limite supérieure de l’espace entre les mots dans le texte justifié, exprimée en multiple de la largeur normale de l’espace. Knuth-Plass maintient sous cette limite toutes les lignes que le paragraphe permet, en coupant d’abord un mot ou en répartissant le surplus sur les lignes voisines ; une ligne qu’aucun jeu de coupures ne maintient sous la limite s’étire au-delà, et une ligne qui dépasse 3× l’espace normale est composée en drapeau. Les lignes qui dépassent ce rapport sont considérées comme « lâches » : voir Les lignes que le moteur de coupure ne peut pas remplir, et maxJustifyTracking pour leur laisser prendre un peu d’approche à la place.
minWordSpacingnumber0.6Limite inférieure de l’espace entre les mots dans le texte justifié, en multiple de la largeur normale de l’espace. Les deux limites bornent la variation de chaque espace par rapport à sa propre largeur, comptée en espaces du romain : une ligne qui contient une espace italique ou grasse, plus étroite ou plus large que celle du romain, est peinte quelques centièmes d’espace en deçà ou au-delà de la limite avec laquelle elle a été coupée. lineWordSpacing(line) renvoie la valeur que bornent les limites ; voir Justification.
maxJustifyTrackingnumber0Approche maximale qu’une ligne justifiée peut prendre, en millièmes de cadratin dans un sens ou dans l’autre (l’unité d’InDesign : 10 = 0,01 em par caractère), quand ses seules espaces s’étireraient au-delà de maxWordSpacing ou se resserreraient en deçà de minWordSpacing. La part de l’ajustement qui dépasse la limite passe dans les lettres : les espaces d’une ligne lâche reviennent à maxWordSpacing et une ligne serrée tient à minWordSpacing. Knuth-Plass en tient compte quand il choisit les coupures, et seulement pour les lignes que l’espacement des mots seul pousserait hors des limites : les autres, la dernière ligne d’un paragraphe (sauf si elle déborde), une ligne d’un seul mot et une ligne qui contient une pastille n’en prennent pas. La ligne l’enregistre comme letterSpacing, et le canvas, le HTML et le PDF la peignent. Nécessite optimalLineBreaking. 0 la désactive. Voir L’approche en dernier recours.
kashida'auto' | 'none''auto' dans un document en écriture arabe, sinon 'none'Justification par kachida : une ligne justifiée de texte en écriture arabe prend son surplus dans ses espaces (jusqu’au quart de leur largeur), puis dans des kachidas, des tatwils entiers (U+0640) insérés entre deux lettres liées, jamais sous forme d’interlettrage. Knuth-Plass compte l’allongement de chaque mot comme de l’étirement. Jamais dans les mots latins, les chiffres, les titres, les lignes en drapeau ni la dernière ligne d’un paragraphe. Les tatwils sont peints mais exclus du texte brut et du texte copié. Voir La kachida dans le texte arabe.
kashidaPatterns'auto' | 'naskh' | 'simple' | 'nastaliq''auto'Quelles liaisons reçoivent une kachida, et dans quel ordre : les règles classiques du naskh, les priorités de Microsoft, ou les règles du naskh adaptées au nastaʿlīq (d’après raqim-kashida). 'auto' lit la police du texte courant : aucune dans un caractère ruqʿa ou dīwānī (Aref Ruqaa), les règles du nastaʿlīq dans un caractère nastaʿlīq, le naskh sinon.
kashidaPerWordnumber1Nombre maximal d’allongements dans un même mot.
kashidaMaxLengthnumber0.6Allongement maximal à une liaison, en cadratins ; il prend autant de tatwils entiers qu’il en tient.
optimalLineBreakingbooleantrueUtilise la coupure optimale des lignes de Knuth-Plass au lieu du remplissage glouton ligne par ligne. Donne un espacement des mots plus régulier sur l’ensemble du paragraphe. Un paragraphe chinois, japonais ou coréen (voir Typographie d’Asie de l’Est), ou un paragraphe qui contient un mot plus large que la colonne, reste composé ligne par ligne ; un paragraphe latin qui cite quelques mots CJC la conserve. Le texte en drapeau en profite aussi avec optimalRagged. Voir Césure et justification.
optimalRaggedbooleantrueCoupe aussi le texte courant en drapeau avec Knuth-Plass : texte courant, citations et éléments de liste alignés à gauche, à droite ou centrés, ainsi que les styles de paragraphe en drapeau, les corps d’encadrés et les corps des parties et des styles de section. Les espaces entre les mots gardent leur largeur. Le moteur de coupure évalue de combien chaque ligne reste en deçà de la largeur de ligne (une ligne trop courte de 3 em coûte autant qu’une ligne justifiée à maxWordSpacing) : il égalise ainsi le bord au lieu de remplir chaque ligne avant la suivante, et les règles des lignes creuses (avoidRunts, tightenRunts) et hyphenateAcrossColumns s’appliquent au texte en drapeau comme au texte justifié. Avec hyphenation.ragged, la zone décide toujours des syllabes qui peuvent terminer une ligne (voir Texte en drapeau). Les titres, légendes, notes, cellules de tableau et la table des matières en drapeau restent composés ligne par ligne. Nécessite optimalLineBreaking. false compose le texte en drapeau ligne par ligne, comme jusqu’à postext 1.4 ; les configurations enregistrées auparavant qui composent du texte courant en drapeau sont lues avec cette valeur (voir Paquets écrits par postext 1.4 ou antérieur).
breakAfterDashesbooleantruePermet à une ligne de se terminer après un tiret cadratin ou demi-cadratin collé entre deux mots : say—that’s, riddles.—I, Hamburg–Berlin, y compris quand le mot qui suit le tiret est composé dans un autre style (see—and). Knuth-Plass le traite comme une espace entre les mots, et la ligne se termine sur le tiret sans rien ajouter. Jamais après un tiret qui ouvre une incise ou une réplique de dialogue (—dijo, said "—Hola, sagte »—Ich : une espace, ou une espace et un guillemet, avant le tiret ; après un guillemet qui ferme un mot, comme dans "no"—and, l’allemand „nein“—und ou le français « non »—et, la ligne peut se terminer), avant une ponctuation (él—,), avant un guillemet ou une parenthèse (thinking—" and, says—“no”, says—(no) : un guillemet après un tiret ferme souvent la réplique que le tiret a interrompue), à l’intérieur d’une suite de tirets, ni à l’intérieur d’un intervalle de nombres composé avec un tiret demi-cadratin (1914–1918). false conserve les coupures de la 1.4 : Knuth-Plass ne coupe jamais après un tiret, et le moteur de coupure ligne par ligne du texte enrichi ou du texte en drapeau avec césure seulement entre deux lettres ; les configurations enregistrées auparavant dont le texte contient un tel tiret sont lues avec cette valeur (voir Paquets écrits par postext 1.4 ou antérieur). S’applique au texte courant, aux titres, aux listes, aux citations et aux encadrés. Les légendes, les notes, les cellules de tableau et la table des matières gardent les coupures de la 1.4, et un paragraphe en drapeau sans mise en forme composé ligne par ligne suit dans tous les cas les règles propres de pretext.
breakAfterHyphensbooleantruePermet à une ligne de se terminer après le trait d’union d’un mot composé, un trait d’union entre deux lettres (well- · known, vencer- · se), dans tout paragraphe que Knuth-Plass coupe. La ligne se termine sur le trait d’union sans rien ajouter ; la coupure coûte autant qu’une coupure syllabique. Jamais après un trait d’union voisin d’un chiffre ou d’un signe (COVID-19, -5 °C). Un paragraphe justifié sans mise en forme en ligne n’y coupe qu’avec deux lettres de chaque côté du trait d’union : aucune ligne ne se termine donc sur le e- de e-mail. false conserve les coupures de la 1.4 : un paragraphe justifié sans mise en forme en ligne n’y coupe jamais, alors que le même paragraphe avec un seul mot en italique, un paragraphe en drapeau ou un paragraphe composé ligne par ligne y coupent ; les configurations enregistrées auparavant dont le texte contient un mot composé sont lues avec cette valeur (voir Paquets écrits par postext 1.4 ou antérieur). S’applique au texte courant, aux titres, aux listes, aux citations et aux encadrés. Voir Mots composés.
repeatHyphenbooleanfalseCommence aussi par un trait d’union la ligne qui suit une coupure au trait d’union d’un mot composé : vencer- · -se, comme le veut l’orthographe portugaise, et léxico- · -semántico, comme le demandent les règles de l’Académie espagnole depuis 2010. Le trait d’union répété est mesuré et peint avec sa ligne, qui l’enregistre comme repeatedHyphen ; ses plainStart et sourceStart pointent après lui, si bien que les liens, les titres courants et le Sandbox lisent le mot tel qu’il est écrit. Le PDF le peint sous un /ActualText qui l’omet : le texte copié ou extrait du PDF lit le mot une seule fois. Une adresse web n’en reçoit jamais. S’applique au texte courant, aux titres, aux listes, aux citations et aux encadrés ; un paragraphe sans mise en forme qui contient un mot composé est alors coupé par le moteur de coupure du texte enrichi.
hardLineBreaksbooleantrueLit une barre oblique inverse en fin de ligne source, et avant une espace, comme un saut de ligne forcé à l’intérieur d’un paragraphe, d’une citation ou d’un élément de liste (le saut de ligne dur de CommonMark) : les mots suivants commencent une nouvelle ligne du même paragraphe, et la ligne précédente est composée à sa largeur naturelle, comme une dernière ligne. Une barre oblique inverse qui termine le paragraphe s’imprime, et deux espaces en fin de ligne ne font pas de saut (voir Format du document › Sauts de ligne). false conserve la lecture de la 1.22 : les barres obliques inverses s’impriment et les lignes se rejoignent par une espace ; les configurations enregistrées auparavant dont le texte contient une telle barre sont lues avec cette valeur (voir Paquets écrits par postext 1.4 ou antérieur). Les titres, les légendes, les notes et les cellules de tableau coupent à dans tous les cas.
scriptContextbooleantrueMet en forme un mot sans lettre (46., 1367), ». : chiffres, ponctuation ou symboles seuls) dans l’écriture du texte qui l’entoure. Une police peut dessiner ces signes selon l’écriture (Amiri compose un point et des parenthèses latins dans un texte latin et arabes ailleurs, d’autres largeurs), et un moteur de mise en forme à qui l’on donne le mot seul choisit une écriture selon une règle qui lui est propre, différente selon les versions des navigateurs et dans le PDF. Avec ce réglage, le mot prend l’écriture de la lettre la plus proche qui le précède dans son isolat (sinon qui le suit), de la lettre de droite à gauche la plus proche quand il est peint de droite à gauche, et de la langue du document quand aucune lettre n’est proche ; la mise en page le mesure dans cette écriture, et le canvas, le HTML, l’EPUB à mise en page fixe et le PDF peignent ces formes à cette largeur. Il agit dans les contextes latin, grec, cyrillique, arabe et hébreu, et seulement avec une police dont la ponctuation ou les chiffres changent selon l’écriture ; un mot mis en forme dans l’écriture arabe ne prend pas d’interlettrage. Un fragment sans lettre d’un mot qui en a (10.1006/ et .2001 d’un DOI qui finit une ligne à ses jointures) prend l’écriture qu’il a à l’intérieur du mot. Dans un document chinois ou japonais, des points de suspension ou un tiret doublés (……, ——) cités dans une phrase d’une autre écriture gardent les formes du texte han. Les marques de liste, les étiquettes des renvois, le texte de maquette, le lettrage des bandes dessinées et les paragraphes composés par le compositeur CJC ne sont pas touchés. false met en forme un tel mot seul, comme jusqu’à postext 1.27 ; une configuration enregistrée avant la configVersion 12 est lue avec cette valeur (pinLegacyScriptContext). Voir Mots sans lettre.
shapingLanguage'document' | 'host''document'La langue dans laquelle le texte est mis en forme : mesuré, peint et incorporé. Une police répond par d’autres glyphes selon la langue (OpenType locl) : Noto Serif SC dessine autrement ses chiffres en chinois, un caractère qui a une forme catalane dessine l·l autrement, un autre qui applique la règle turque garde fi séparé. 'document' (la valeur par défaut depuis postext 1.30) : la langue du document (locale, sinon la langue de césure ; un document qui n’en nomme aucune est en anglais, en-US, et un document dont la locale n’est pas une étiquette de langue est mis en forme sans langue), et celle d’un passage là où il en nomme une (:ltr[…]{lang=en}). La mise en page la règle sur chaque contexte avec lequel elle mesure : un document coupe ses lignes de la même façon sur une page dans n’importe quelle langue et dans un worker de mise en page ; le canvas peint dans cette langue, la visionneuse HTML et l’EPUB la déclarent sur le document et sur chaque page, et le PDF met en forme avec le système de langue OpenType de la langue. Depuis postext 1.30, le texte est mesuré dans cette langue comme il est peint. Une chaîne a une seule largeur, quoi qu’on ait mesuré avant elle : Chrome garde les mots qu’il a déjà mis en forme, et Noto Serif SC compose 2026 sur 2,20 em dans une chaîne sans caractère au-delà de U+00FF et sur 2,23 em dans une chaîne qui en contient un ; les deux sortes de chaînes sont donc mesurées sur des contextes distincts. Un mot de droite à gauche est mesuré de droite à gauche avec n’importe quelle police. Un mot que le moteur de coupure peut couper (à une syllabe ou à un trait d’union) est mesuré entier et composé entier là où il reste sur une seule ligne, sur le canvas, dans la visionneuse HTML et dans le PDF, dans tout paragraphe (depuis postext 1.31 : jusqu’à la 1.30.1, un paragraphe sans mise en forme mesurait séparément chaque fragment d’un tel mot, si bien que ce qu’une police dessine à cheval sur un point de césure, le ff de of·fice en EB Garamond ou le large point catalan de Crimson Pro dans l·l, apparaissait dans le mot d’un paragraphe contenant un italique et pas dans le même mot d’un paragraphe sans mise en forme). Avec 'host', un paragraphe sans mise en forme mesure toujours séparément chaque fragment d’un tel mot. D’un mot coupé en fin de ligne, chaque partie est mesurée comme le texte peint : la partie qui ouvre la ligne suivante comme un texte à part, et la première partie d’un col·lecció catalan comme col-. Un texte de maquette (titre courant, ouverture, dessin de titre) est mesuré passage par passage, chacun dans le sens où il est peint. Le PDF met en forme mot par mot comme le fait le canvas du navigateur (un mot se termine à une espace, une tabulation, U+3000 ou U+200B, et avant un caractère han), compose un par un les caractères chinois et japonais que la mise en page a mesurés ainsi, et prend chaque caractère dans le fichier de police où le navigateur l’a pris quand le fournisseur de polices l’indique (voir Polices chinoises, japonaises et coréennes). 'host' : comme jusqu’à postext 1.28, la mise en page mesure dans la langue de la page qui l’héberge (aucune dans un worker) et le canvas peint dans cette même langue ; la visionneuse HTML déclare la langue d’un document chinois, japonais, coréen ou de droite à gauche. Un document en 'host' garde les largeurs et le PDF qu’il avait ; dans un paragraphe avec mise en forme, son canvas et sa visionneuse HTML composent aussi entier un mot qui reste sur une seule ligne (jusqu’à postext 1.29.2, ils le peignaient fragment par fragment). Dans ce mode, la partie d’un mot coupé qui ouvre la ligne suivante est mesurée comme le mot entier moins sa première partie : une police dont la forme propre à la langue a besoin des lettres des deux côtés de la coupure (le l·l catalan de Crimson Pro, un large point composé seulement entre deux l) laisse un blanc après le reste du mot, un tiers de cadratin dans cette police, sur une page dans cette langue. La valeur par défaut a été 'document' dans postext 1.29.0 seulement, dont le canvas et le PDF ne suivaient pas la mesure, 'host' dans les 1.29.1 et 1.29.2, et de nouveau 'document' depuis la 1.30.0. Une configuration enregistrée avant la configVersion 14 qui ne nomme pas le réglage reçoit 'host' en toutes lettres (pinLegacyShapingLanguage) : un document enregistré garde ses lignes ; une configuration qui nomme une valeur la garde. Un navigateur dont le canvas n’a pas de lang (Chrome avant la 136, et Firefox et Safari où il manque) ne reçoit aucune langue et garde les formes qu’il a toujours mesurées, et la ligne de commande met toujours en page avec 'host' (voir Différences avec le Sandbox).
tabStopsTabStop[]non définiTaquets de tabulation de chaque paragraphe, élément de liste et citation : l’endroit où une tabulation (:tab, ou un caractère de tabulation dans le texte) envoie les mots qui la suivent. Un style de paragraphe ou un corps d’encadré qui définit ses propres taquets les remplace. Non défini, un caractère de tabulation est une espace entre les mots, comme auparavant, et un :tab sans taquet où aller en est une aussi. Voir Taquets de tabulation. Depuis postext 1.23.
tabIntervalDimensionnon définiTaquets par défaut placés à chaque intervalle depuis le début de la ligne, au-delà du dernier de tabStops. Non défini, une tabulation située après le dernier taquet est une espace entre les mots. Depuis postext 1.23.
blockquoteBlockquoteConfigvoir plus basComment les citations Markdown (> …) sont composées : couleur, italique et retraits. Voir Citations.

#Citations

Une citation (lignes qui commencent par >) reprend la famille, le corps, l’interlignage, les graisses, l’alignement et la césure du texte courant. bodyText.blockquote règle le reste ; non défini, une citation a l’aspect qu’elle avait jusqu’à postext 1.4 : grise, en italique, avec le retrait de première ligne du texte courant et sans retrait latéral.

PropriétéTypeDéfautDescription
colorColorValue#666666Couleur du texte. Une couleur liée à une entrée de la palette (paletteId) suit cette entrée, comme partout ; les couleurs du gras, de l’italique et des renvois du texte courant ne s’appliquent pas dans une citation.
italicbooleantrueCompose le texte en italique. Un passage … à l’intérieur repasse en romain ; avec false, il est en italique comme dans un paragraphe.
indentDimension0Retrait de toutes les lignes depuis le bord gauche de la colonne ou de l’encadré. La largeur de ligne diminue d’autant : les lignes justifiées se terminent au bord droit. em est le corps du texte courant.
firstLineIndentDimensioncelui du texte courantRetrait de la première ligne de chaque paragraphe cité, compté depuis indent (avec le hangingIndent du texte courant, le retrait de toutes les lignes sauf la première). Non défini : bodyText.firstLineIndent.
bodyText: {
  firstLineIndent: { value: 1.5, unit: 'em' },
  // Upright verse in the body colour, set in by 2 em, no first-line indent.
  blockquote: { color: { hex: '#241f26', model: 'hex' }, italic: false, indent: { value: 2, unit: 'em' }, firstLineIndent: { value: 0, unit: 'em' } },
}

Dans le Sandbox, ces réglages forment le groupe Citations de la section Texte courant.

#Vers

Un poème :::verse dont les vers ne portent pas de séparateur d’hémistiches est composé vers par vers (voir Format du document › :::verse). bodyText.verse donne les valeurs par défaut de ces poèmes ; un attribut du même nom sur la clôture d’ouverture d’un poème le règle pour ce poème.

PropriétéTypeDéfautDescription
layout'auto' | 'bayt''auto'Comment est composé un poème dont la clôture ne nomme aucune disposition. 'auto' : en bayts quand un vers porte un séparateur (||), vers par vers sinon. 'bayt' : toujours en bayts, un poème sans séparateur en hémistiches isolés centrés, comme jusqu’à postext 1.22.
indentStepDimension0.5emLargeur d’une espace en début de vers (une tabulation en vaut quatre, une espace idéographique deux) ; em est le corps du poème.
turnover'hang' | 'right''hang'Comment un vers plus large que la ligne passe à la ligne : en retrait suspendu sur la ligne suivante, ou aligné sur la fin de la ligne derrière turnoverMark.
hangDimension2emRetrait d’un report suspendu (la partie du vers reportée à la ligne suivante) depuis le début de son vers, quand le style de paragraphe du poème ne définit pas de hangingIndent.
turnoverMarkstring'['Le signe placé devant un report aligné à droite.
stanzaSpacenumber1Espace entre les strophes, en lignes de l’interlignage du poème. Sur la grille de ligne de base, il donne des lignes de grille entières ; un style de paragraphe avec snapToGrid: false le garde exact.
keepStanzasnumber0Garde entière dans une seule colonne toute strophe de ce nombre de vers ou moins. 0 désactive le réglage.
tightenbooleantrueResserre les espaces d’un vers un peu plus large que la ligne, jusqu’à bodyText.minWordSpacing de leur largeur naturelle, et le garde sur une seule ligne ; seul un vers encore trop large passe à la ligne. Les lettres ne reçoivent jamais d’approche pour cela. false fait passer à la ligne tout vers plus large que la ligne, comme le faisait postext 1.23. L’EPUB recomposable, dont les lignes sont coupées par le système de lecture, ne resserre pas.
bodyText: {
  // Turnovers flush right behind a bracket; tankas kept whole.
  verse: { turnover: 'right', keepStanzas: 5 },
}

Une configuration enregistrée avant ces réglages (configVersion 8 ou antérieure) qui met en page un poème sans séparateur est lue avec layout: 'bayt' : le poème garde les lignes centrées que lui donnait postext 1.22. Une configuration enregistrée par postext 1.23 (configVersion 9) qui compose un poème vers par vers est lue avec tighten: false : ses vers passent à la ligne là où la 1.23 les faisait passer.

Dans le Sandbox, ces réglages forment le groupe Vers de la section Texte courant.

#Taquets de tabulation

bodyText.tabStops énumère les taquets vers lesquels va une tabulation : :tab, ou un caractère de tabulation dans un paragraphe qui a des taquets (voir Format du document › Tabulations et taquets pour le balisage et la composition d’une ligne). Les tabStops d’un style de paragraphe les remplacent pour ses paragraphes, et le body.tabStops d’un style d’encadré à l’intérieur de ses encadrés ; une liste vide n’en définit aucun. Chaque taquet est un TabStop :

bodyText: {
  tabStops: [
    { position: { value: 30, unit: 'mm' } },
    { position: 'end', align: 'end', leader: '.', leaderGap: { value: 2, unit: 'pt' } },
  ],
  tabInterval: { value: 10, unit: 'mm' },
}
PropriétéTypeDéfautDescription
positionobligatoireL’emplacement du taquet, depuis le bord de début de la ligne du paragraphe (après l’indent d’un style de paragraphe ; em est le corps propre du paragraphe) : une longueur, 'end' pour le bord de fin de la ligne, ou une fraction de la largeur de ligne ('50%'). Dans un texte de droite à gauche, le bord de début est le bord droit.
align'start' | 'end' | 'center' | 'decimal''start'Comment le texte qui suit la tabulation se place au taquet : il y commence, il s’y termine (le texte jusqu’à la tabulation suivante ou jusqu’à la fin du paragraphe), il y est centré, ou son séparateur décimal s’y aligne (un passage qui n’en a pas s’y termine).
leaderstringaucunRépété sur l’espace qui précède le taquet : '.', '. ', '·', '_', '-' ou tout texte court, dans la police et la couleur du paragraphe ; 'rule' trace un filet un peu sous la ligne de base. Les points de conduite se terminent alignés sur la fin de leur espace : ceux de plusieurs lignes s’alignent entre eux. Ils sont mesurés comme un seul passage, comme ceux d’une ligne de la table des matières.
leaderGapDimension0.5emEspace gardé entre les points de conduite et le texte de part et d’autre, comme le leader.gap de la table des matières. Aucun avant les points de conduite quand la tabulation ouvre sa ligne, aucun après quand rien ne suit.
decimalCharstringcelui de la langue du documentLe séparateur sur lequel s’aligne un taquet 'decimal' : . en anglais, en chinois, en japonais et en arabe, , en espagnol, en catalan, en portugais, en français, en allemand et dans d’autres langues.

tabInterval ajoute des taquets à chaque intervalle depuis le début de la ligne, au-delà du dernier taquet de la liste ; sans lui, une tabulation située après le dernier taquet est une espace entre les mots. Un caractère de tabulation saisi dans le texte n’est une tabulation que dans un paragraphe dont le style a des taquets ou un intervalle, les siens ou ceux du texte courant ; partout ailleurs il reste l’espace entre les mots qu’il a toujours été : un document enregistré se met en page comme avant et n’a besoin d’aucun verrouillage.

Les taquets sont vérifiés avec le reste de la configuration (voir Avertissements de configuration) : une clé inconnue dans un taquet (leaders) est signalée comme unknownConfigKey avec la clé la plus proche ; un align qui n’est aucun des quatre comme unknownConfigValue, et le taquet est composé en 'start' ; une position qui n’est ni une longueur, ni 'end', ni un pourcentage comme unknownConfigValue avec used: 'none', et le taquet est ignoré.

La couleur et la police des points de conduite sont celles du paragraphe ; il n’existe pas encore de réglage qui leur soit propre.

#Lettrines

Un paragraphe du texte courant peut s’ouvrir sur une lettrine : sa première lettre composée en grand à côté de ses premières lignes, raccourcies de la largeur de la lettre et d’un blanc, et composées comme toutes les autres lignes (coupées par Knuth–Plass, justifiées, avec césure). Un style de paragraphe en donne une au premier paragraphe de chaque groupe :::paragraphs de ce style (à chaque paragraphe avec each: true, pour un catalogue d’entrées) ; un niveau de titre ou un style de titre en donne une au premier paragraphe de texte courant qui suit le titre (voir le champ dropCap de Réglages par niveau, de Styles de paragraphe et de Styles de titre). Le paragraphe qui suit le titre est trouvé au-delà des clôtures de conteneurs, des directives, des encadrés sortis du flux et des figures flottantes, comme le trouve indentAfterHeading ; un paragraphe à l’intérieur d’un encadré, d’un élément de liste, d’une citation, d’un poème ou d’une note n’en prend jamais. Dans le texte, {dropcap}, {dropcap=false} et {dropcap=N} sur une ligne de titre ou sur une clôture :::paragraphs l’activent, la désactivent ou règlent son nombre de lignes pour ce chapitre ou ce groupe (voir Format du document › Lettrines). Depuis postext 1.23.

headings: {
  levels: [
    { level: 1, dropCap: { lines: 3, fontFamily: 'Libre Bodoni', fontWeight: 700, color: { hex: '#8b2e2a', model: 'hex', paletteId: 'accent' }, leadIn: { words: 3 } } },
  ],
},
PropriétéTypeDéfautDescription
linesnumber3Nombre de lignes que couvre l’initiale, du haut de ses capitales à sa ligne de base. 1 avec un fontSize plus grand donne une initiale montante posée sur la première ligne de base.
sinknumberlinesNombre de lignes dans lesquelles l’initiale descend dans le texte : elle repose sur la ligne de base de la ligne sink, et ces lignes sont raccourcies. Moins que lines la fait monter au-dessus de la première ligne.
charactersnumber1Grappes de graphèmes composées en grand : É, une lettre avec un signe combinant ou un caractère hors du plan multilingue de base compte pour une. Jamais au-delà du premier mot.
fontFamily, fontWeight, italicstring, number, booleanceux du paragraphe ; falseCaractère de l’initiale. Il est chargé et incorporé avec les autres caractères du document.
fontSizeDimensionvoir plus basCorps de l’initiale. Non défini : le corps qui aligne le haut de ses capitales sur les capitales de la première ligne lorsqu’elle descend de lines lignes.
colorColorValuecelle du paragrapheUne couleur liée à la palette suit les palettes de partie et de section.
gapDimension0.15emEspace entre l’initiale et les lignes raccourcies, em étant le corps du texte.
punctuation'with-cap' | 'hang' | 'text''with-cap'Un guillemet ouvrant, ¿, ¡ ou une parenthèse placés avant la lettre : composés en grand avec l’initiale, suspendus au corps du texte hors de la ligne devant elle, ou composés au corps du texte au début de la première ligne, après l’initiale.
leadIn{ words, smallCaps, uppercase }aucunLes words premiers mots qui suivent l’initiale en petites capitales (par défaut) ou en capitales (uppercase: true) ; words: 'line' prend les mots de la première ligne. Une attaque sur la première ligne est comptée lors d’une première composition et appliquée lors d’une seconde : en petites capitales, la ligne peut alors contenir un mot de plus, composé tel qu’il est écrit.
shortParagraph'reserve' | 'shrink' | 'skip''reserve'Un paragraphe de moins de sink lignes : garder au bloc une hauteur de sink lignes pour que le bloc suivant dégage l’initiale, composer l’initiale sur les lignes du paragraphe lui-même, ou composer le paragraphe sans lettrine. Chaque cas émet un avertissement de contenu dropCap.
eachbooleanfalseStyles de paragraphe seulement : chaque paragraphe du groupe s’ouvre sur la lettrine, pas seulement le premier.

Comment la lettre est composée :

  • Corps. Les deux hauteurs de capitale, celle du texte et celle de l’initiale, sont mesurées sur leurs caractères (l’encre d’un H ; de l’initiale elle-même dans un texte chinois ou japonais), et une police qui ne fournit pas de métriques d’encre compte ses capitales à 0,72 de son corps. Le corps par défaut convient à toute paire de caractères : aucune correction par police n’est nécessaire. Le dropCap d’un texte de maquette garde sa valeur fixe de 0,72 (voir Éléments de texte).
  • La lettre et son mot. L’initiale prend des grappes de graphèmes entières. Le reste du premier mot la suit sans espace ; un mot d’une seule lettre (A, Y) garde son espace au début de la première ligne. Le retrait de première ligne du paragraphe est supprimé. La copie, la recherche, la table de correspondance avec la source et le curseur du Sandbox lisent le paragraphe tel qu’il est écrit : le texte brut du bloc inclut la lettre, le plainStart de la première ligne compte au-delà d’elle, et VDTBlock.dropCap contient son étendue et sa géométrie sur le fragment qui porte la première ligne.
  • Une initiale montante (lines: 1 avec un fontSize plus grand, ou sink inférieur à lines) s’élève au-dessus de la première ligne, et le paragraphe garde ce dépassement dégagé au-dessus de lui, en lignes de grille entières, pour qu’il ne chevauche pas le texte situé au-dessus.
  • Coupure. Le paragraphe ne se coupe jamais avant la ligne sink : il passe entier à la colonne ou à la page suivante, sauf s’il est seul dans une colonne vide qui ne peut pas contenir ces lignes ; il se coupe alors quand même et émet un avertissement dropCap. Un titre gardé avec son texte garde ces lignes sous lui. La partie qui continue dans la colonne suivante n’a ni initiale ni lignes raccourcies ; recoupé pour une colonne d’une autre largeur, les premières lignes gardent leur retrait. L’équilibrage des colonnes peut composer le paragraphe plus lâche ou plus serré comme tout autre, et n’ajoute jamais d’espace entre les lignes raccourcies.
  • Écritures. Les lignes sont raccourcies du côté du début : à gauche dans un texte latin, à droite en arabe et en hébreu. Une lettre qui se lie à la suivante (arabe, syriaque, n’ko) n’est pas détachée, et le paragraphe émet un avertissement dropCap ; le chinois et le japonais horizontaux prennent une initiale d’un caractère (首字下沉). Le texte vertical n’en prend pas (avertissement). Un paragraphe qui ne s’ouvre ni sur une lettre ni sur un chiffre (un renvoi, une formule, un appel de note) n’en prend pas non plus (avertissement).
  • Sorties. Le canvas, la visionneuse HTML et l’EPUB à mise en page fixe peignent l’initiale à côté des lignes ; le HTML l’écrit juste avant le texte de la première ligne, sans rien entre les deux, pour qu’un lecteur d’écran lise le mot entier. Dans un PDF balisé, l’initiale fait partie du P du paragraphe et forme, avec le reste de son mot, un Span dont l’/ActualText est le mot : l’extraction du texte lit Long before, jamais L ong before. Un EPUB recomposable la compose comme un initial-letter CSS (lines, sink), flottante là où le système de lecture ne le prend pas en charge.

Les réglages sont vérifiés avec le reste de la configuration (voir Avertissements de configuration) : une clé inconnue dans une lettrine ou dans son attaque est signalée comme unknownConfigKey ; une punctuation ou un shortParagraph qui n’est aucun de ses mots, ou un lines, sink ou characters qui n’est pas un nombre entier à partir de 1, comme unknownConfigValue, et la valeur par défaut est utilisée. Les lettrines sont désactivées par défaut : aucun document enregistré ne change.

#Une seule famille par fontFamily

fontFamily (ici et dans tous les autres champs de famille de caractères : headings.fontFamily, tableStyle.bodyFontFamily, separatorFontFamily, le fontFamily d’un style de pastille ou d’un élément de maquette…) nomme une seule famille. Le canvas, la sortie HTML et le PDF doivent composer le même caractère, et le PDF incorpore une police par famille sans chaîne de repli : une pile de polices CSS n’a donc rien sur quoi se replier. Une pile est composée dans sa première famille et signalée par un avertissement de configuration :

bodyText: { fontFamily: "'EB Garamond', Georgia, serif" } // set in EB Garamond

Chargez cette famille avant la mise en page (voir Polices personnalisées et le fournisseur de polices dans Générer des PDF) ; si elle manque, le navigateur mesure avec sa police par défaut, quoi que dise le reste de la pile. Une virgule entre guillemets fait partie d’un nom ('"Foo, Bar"' est une seule famille).

#Césure

Quand l’alignement du texte vaut 'justify', la césure évite un espacement excessif entre les mots en coupant les mots longs aux limites de syllabes. Le moteur utilise les motifs TeX/Liang pour trouver les points de coupure naturels aux limites de syllabes. Voir Césure et justification pour une explication détaillée. Le texte en drapeau ne reçoit de césure que si vous la demandez : voir Texte en drapeau plus bas.

PropriétéTypeDéfautDescription
enabledbooleantrueAutorise ou non la césure.
localeLocaleTaglocale de premier niveau, sinon 'en-us'Règles de la langue pour les limites de syllabes : l’une des langues prises en charge ci-dessous, ou toute étiquette BCP 47 ('es-ES', 'pt-BR').
raggedbooleanfalseApplique aussi la césure au texte en drapeau (aligné à gauche, à droite ou centré), dans la limite de la zone. Voir Texte en drapeau.
zoneDimension3emZone de césure du texte en drapeau : un mot qui ne tient pas n’est coupé que si l’envoyer entier à la ligne suivante laisserait un blanc plus large que cette valeur. em se rapporte au corps propre du texte. Ignorée pour le texte justifié.
compoundsbooleantruePermet au dictionnaire de couper les mots d’un composé, un mot avec un trait d’union entre deux lettres (af-ter-dinner). false garde un tel mot entier, sauf à son propre trait d’union, où la ligne peut toujours se terminer (after- · dinner), comme le fait TeX. Un trait d’union conditionnel saisi dans le mot coupe toujours, et un composé plus large que toute la ligne est toujours coupé. S’applique au texte courant, aux titres, aux listes, aux citations et aux encadrés ; les légendes, les notes, les cellules de tableau et la table des matières continuent de couper les composés. Voir Mots composés.
exceptionsstring[]aucuneMots que le dictionnaire ne doit pas couper, ou seulement là où l’entrée l’indique : 'Alice' n’est jamais coupé, 'You-Tube' seulement à son trait d’union. Voir Mots gardés entiers.
capitalizedbooleantrueCoupe les mots à majuscule initiale comme les autres. false garde entier tout mot qui commence par une capitale (Alice, Ámsterdam, UNESCO), y compris le premier mot d’une phrase. Voir Mots gardés entiers.

Langues prises en charge : 'en-us' (anglais), 'es' (espagnol), 'fr' (français), 'de' (allemand), 'it' (italien), 'pt' (portugais), 'ca' (catalan), 'nl' (néerlandais).

Les sous-étiquettes de région, d’écriture et de variante sont ignorées au moment de choisir les motifs, de même que la casse et les séparateurs _ : 'es-ES', 'es-MX' et 'es_419' coupent avec 'es', 'pt-BR' avec 'pt', et toute étiquette anglaise ('en', 'en-GB') avec 'en-us', les seuls motifs anglais fournis : un texte britannique reçoit donc des coupures américaines. Une langue sans motifs fournis ('sv', 'pl', 'fi'…) est coupée avec les motifs 'en-us', ce qui donne de mauvaises coupures plutôt qu’aucune ; le moteur le signale une fois par étiquette avec un console.warn, et le Sandbox l’affiche dans son panneau Vérifications. Réglez enabled: false pour un tel document ; cela fait aussi taire l’avertissement. Le chinois, le japonais et le coréen (zh, ja, ko, quelles que soient la région ou l’écriture) n’ont pas besoin de motifs et n’affichent aucun avertissement : un document dans l’une de ces langues est composé sans césure. Pour couper les mots latins qui y sont cités, réglez enabled: true et nommez leur langue dans locale ('en-us' pour l’anglais). enabled: true sans locale, ou avec une locale chinoise, japonaise ou coréenne, laisse la césure désactivée et l’indique une fois dans la console. matchHyphenationLocale(tag) renvoie la langue fournie qui correspond à une étiquette (undefined s’il n’y en a aucune), et HYPHENATION_LOCALES énumère les langues fournies. La configuration résolue (doc.config.bodyText.hyphenation) nomme dans locale les motifs réellement utilisés, et garde dans tag l’étiquette que vous avez donnée quand elle diffère. Le moteur PDF déclare la langue du document d’après la locale de premier niveau, et d’après cette étiquette seulement quand locale n’est pas définie (voir Langue du document).

import { matchHyphenationLocale } from 'postext';
 
matchHyphenationLocale('es-MX'); // 'es'
matchHyphenationLocale('en-GB'); // 'en-us'
matchHyphenationLocale('sv');    // undefined: hyphenated with 'en-us', with a console warning

Les mots de moins de 5 caractères ne sont jamais coupés. Le moteur exige au moins 2 caractères avant et 3 caractères après un point de coupure.

Mots gardés entiers

Un dictionnaire coupe un nom comme n’importe quel mot : Al-ice, Áms-ter-dam, You-Tu-be. Trois réglages gardent des mots entiers, et tous trois valent par défaut ce que fait le dictionnaire.

hyphenation.exceptions est une liste de mots, comme le \hyphenation{…} de TeX. Une entrée écrite sans trait d’union n’est jamais coupée ; une entrée écrite avec des traits d’union n’est coupée qu’à ces endroits : 'You-Tube' donne You- · Tube et rien d’autre. Une entrée correspond à une suite de lettres, quoi qui l’entoure : 'Alice' couvre (Alice, et Alice’s, et un composé est comparé partie par partie (Blender-based correspond à 'Blender'). Une forme fléchie est un autre mot et demande sa propre entrée. Une entrée en minuscules correspond au mot quelle que soit sa casse ('blender' couvre Blender et BLENDER) ; une entrée à capitale initiale ne correspond qu’aux occurrences qui commencent par une capitale : 'Rose' garde le nom entier et laisse rose au dictionnaire. Les entrées ne contiennent que des lettres et des traits d’union ; tout le reste est supprimé.

hyphenation.capitalized: false garde entier tout mot qui commence par une capitale : les noms, les sigles, et aussi le premier mot de chaque phrase. C’est l’option « Césure des mots en majuscules » d’InDesign désactivée, et le \uchyph=0 de TeX. Une entrée de exceptions avec des traits d’union coupe toujours son mot à ces endroits. L’allemand met une capitale à tous les noms : l’option laisserait à un texte allemand à peine un mot à couper. Nommez-y plutôt les mots dans exceptions, ou utilisez citations.hyphenateNames.

citations.hyphenateNames: false garde entiers les noms de famille des auteurs que le document cite, où qu’ils se trouvent : dans une citation, dans le texte courant et dans la liste des références. Voir Citations.

const config: PostextConfig = {
  locale: 'es',
  bodyText: {
    hyphenation: { exceptions: ['Ámsterdam', 'Blender', 'You-Tube'] },
  },
};

Les trois atteignent tout texte que coupe le dictionnaire : texte courant, titres, listes, encadrés, légendes, cellules de tableau, notes, titres courants et les autres textes de maquette. C’est plus large que compounds, que les légendes, les notes, les cellules et la table des matières ignorent. Deux choses restent telles quelles. Un trait d’union conditionnel saisi dans une occurrence d’un mot décide toujours de cette occurrence, et un trait d’union conditionnel placé avant la première lettre garde une occurrence entière sans liste (voir Là où une ligne ne se coupe jamais). Et un mot plus large que toute sa ligne est toujours coupé : aux points de son entrée s’il en a, sinon aux syllabes du dictionnaire. Moins de mots coupés laissent à une colonne justifiée étroite moins de façons de remplir ses lignes : examinez l’espacement des mots après avoir désactivé capitalized sur une page à trois colonnes. L’EPUB recomposable laisse la césure au système de lecture, qui ignore tout de ces règles.

Texte en drapeau

Par défaut, seul le texte justifié reçoit la césure : avec textAlign: 'left', et dans les styles de paragraphe alignés à gauche, centrés ou à droite, chaque mot reste entier, aussi irrégulier que devienne le bord, sauf à un trait d’union conditionnel (U+00AD) saisi dans le texte. Réglez hyphenation.ragged: true pour appliquer aussi la césure au texte en drapeau.

Une ligne en drapeau n’est jamais étirée : couper chaque mot qui ne tient pas frangerait le bord de traits d’union. La zone de césure le limite, comme le fait le compositeur ligne à ligne d’un logiciel de PAO. Quand un mot ne tient pas en fin de ligne, le moteur regarde le blanc que laisserait son envoi entier à la ligne suivante. Si ce blanc est plus large que zone, le mot est coupé à la dernière syllabe qui tient ; sinon il descend entier. Une zone en em se rapporte au corps propre du texte. La valeur par défaut, 3em, ne coupe que les mots qui laisseraient une ligne nettement courte. Une zone plus large donne moins de traits d’union et un bord plus irrégulier ; 0 coupe tout mot qui ne tient pas. En composition ligne par ligne, pas plus de deux lignes consécutives ne se terminent sur une syllabe. Les traits d’union durs (enseñanza-aprendizaje), les jointures d’URL, les traits d’union conditionnels saisis dans le texte et les mots plus larges que toute la ligne se coupent comme toujours : la zone et la limite de deux lignes ne régissent que les syllabes du dictionnaire.

Le réglage vaut pour tout le document. Il s’applique au texte courant et aux citations quand ils sont en drapeau, et à tout style de paragraphe et corps d’encadré en drapeau dont la propre hyphenation est activée (elle vaut par défaut le hyphenation.enabled du texte courant) : hyphenation: false garde donc entiers les mots d’un style. Les titres, les légendes, les notes, les cellules de tableau et la table des matières ne reçoivent pas de césure ; là, comme partout, seul un mot plus large que toute la ligne est coupé. Le texte de maquette (titres courants, ouvertures, pages de partie) suit l’option hyphenate propre à chaque élément de texte, que règlent les ouvertures pleine page et les pages de partie intégrées, et utilise aussi le dictionnaire du document. Le texte justifié ignore ragged et zone.

const config: PostextConfig = {
  locale: 'es',
  bodyText: {
    textAlign: 'left',
    // A little more hyphenation than the 3 em default.
    hyphenation: { ragged: true, zone: { value: 2, unit: 'em' } },
  },
};

Avec optimalRagged (la valeur par défaut), le texte courant en drapeau est coupé avec Knuth-Plass, et la zone y garde son sens : un mot n’est coupé que s’il ne tient pas dans le reste de la ligne et que l’envoyer entier à la ligne suivante laisserait vide plus que la zone. Deux syllabes consécutives ne sont pas refusées, mais coûtent ce que coûtent deux traits d’union consécutifs dans le texte justifié : une troisième est donc rare. Avec optimalRagged: false, ou optimalLineBreaking: false, chaque ligne est remplie avant la suivante, comme jusqu’à postext 1.4.

La césure en drapeau met les paragraphes en page avec le moteur de coupure qu’utilisent toujours les paragraphes à mise en forme en ligne (gras, italique, liens, mathématiques) : l’activer peut donc déplacer quelques coupures autres que des traits d’union. Sur une ligne en drapeau, outre les espaces et les syllabes du dictionnaire, ce moteur coupe après un trait d’union dur ou un tiret entre deux mots (largas—separadas ; avec breakAfterDashes, tout tiret collé entre deux mots, riddles.—I et riddles—*and* aussi), aux jointures d’URL et entre idéogrammes, et il garde ensemble un mot composé en plusieurs passages (**Nota**:, (*véase*). Sans césure en drapeau, un paragraphe en drapeau sans mise en forme est coupé par Knuth-Plass quand optimalRagged est activé (la valeur par défaut) : aux espaces entre les mots, après un trait d’union dur entre deux lettres (meta- · analyses), comme le fait l’autre moteur, et, avec breakAfterDashes, après les tirets collés. Composé ligne par ligne, il passe par le moteur de coupure de pretext, qui diffère sur trois points : il peut aussi couper avant un tiret qui ferme une incise ou après un tiret qui l’ouvre (él · — y), après une barre oblique quand il applique la césure (km/ · h), et il coupe un mot plus large que la ligne à n’importe quel caractère sans trait d’union, là où l’autre moteur le coupe d’abord à une syllabe.

Dans le Sandbox, l’option s’appelle Césure du texte en drapeau ; elle se trouve sous l’alignement des paragraphes de la section Texte courant, avec la zone en dessous. Quand le texte courant est justifié, la même option se trouve avec les réglages de justification, pour les styles de paragraphe et les encadrés en drapeau.

#Langue du document

La locale de premier niveau est la langue du document dans son ensemble. Elle prend les mêmes valeurs que hyphenation.locale et sert de valeur de repli quand ce champ n’est pas défini : un livre espagnol n’a besoin que de locale: 'es' pour recevoir une césure espagnole. Elle choisit aussi la langue des chaînes de continuation intégrées des tableaux et des encadrés coupés ((cont.) / Continued contre Continúa, voir Tableaux plus hauts que la page et Marques sur un encadré coupé) et des numéros de titre écrits en toutes lettres (Chapter One contre Capítulo uno, voir Numéros en toutes lettres), et c’est la langue balisée dans un PDF accessible. Non définie, le moteur suppose 'en-us' ; le Sandbox se replie sur la langue de l’interface et règle le champ sous Maquette › Système d’écriture.

Elle choisit aussi les types de ressources intégrés. Quand resourceTypes n’est pas défini, buildDocument numérote et légende avec defaultResourceTypes(locale) : locale: 'de' seul donne Abbildung 1.1 et Tabelle 1.1. Quand locale n’est pas définie, la langue de césure la remplace, pour les types de ressources comme pour les chaînes des tableaux. Une liste resourceTypes explicite l’emporte toujours. Les versions antérieures utilisaient les types anglais quelle que soit la locale, sauf si vous passiez vous-même defaultResourceTypes(locale) ; un document qui définit locale et veut garder les étiquettes anglaises passe resourceTypes: defaultResourceTypes('en'). Les livres du Sandbox et les paquets portent leur propre liste : ils ne sont pas concernés.

Toute étiquette BCP 47 fonctionne ici comme dans hyphenation.locale : 'de-AT' reçoit les chaînes allemandes. Les chaînes intégrées existent dans les huit langues que la césure prend en charge, en chinois (en caractères simplifiés et en caractères traditionnels), en japonais et en arabe ; toute autre langue reçoit les chaînes anglaises.

Le chinois accepte zh, zh-Hans, zh-Hant, zh-CN, zh-SG, zh-TW, zh-HK, zh-MO et les formes longues (zh-Hant-TW), quelle que soit la casse et avec - ou _. Les chaînes suivent l’écriture, lue avec Intl.Locale(tag).maximize() : zh, zh-CN et zh-SG sont en caractères simplifiés, zh-TW, zh-HK et zh-MO en caractères traditionnels. Les valeurs typographiques par défaut qui dépendent de la langue suivent plutôt la région, comme le recommande clreq §1.2 : CN, SG et MY comptent comme la Chine continentale, TW comme Taïwan, HK et MO comme Hong Kong, et une étiquette sans région se règle sur son écriture (zh-Hant est Taïwan, zh et zh-Hans la Chine continentale). Le japonais accepte ja, ja-JP, ja-Jpan et toute autre étiquette ja (isJapaneseLanguage(tag)) ; depuis postext 1.16, il a ses propres chaînes et sa propre région, japan, dont les valeurs typographiques par défaut suivent la JLReq (voir Mise en page japonaise). Une table de chaînes sans entrée japonaise donne l’anglais, jamais le chinois. localeScript(tag), cjkRegionOf(tag), stringsKeyOf(tag) et sameContentLocale(a, b) donnent ces lectures, et DOCUMENT_LANGUAGES énumère les langues qui ont des chaînes intégrées, chacune nommée dans sa propre langue (日本語 entre les entrées chinoises et العربية), telles que les affiche le sélecteur Langue du document du Sandbox.

LangueFigure : nom, pluriel, étiquette courteTableau : nom, pluriel, étiquette courteContinuation de tableau : continuedSuffix, continuesMarker
Anglais (en)Figure, Figures, Fig.Table, Tables, Tab.(cont.), Continued
Espagnol (es)Figura, Figuras, Fig.Tabla, Tablas, Tabla(cont.), Continúa
Français (fr)Figure, Figures, Fig.Tableau, Tableaux, Tabl.(suite), À suivre
Allemand (de)Abbildung, Abbildungen, Abb.Tabelle, Tabellen, Tab.(Forts.), Wird fortgesetzt
Italien (it)Figura, Figure, Fig.Tabella, Tabelle, Tab.(segue), Continua
Portugais (pt)Figura, Figuras, Fig.Tabela, Tabelas, Tab.(cont.), Continua
Catalan (ca)Figura, Figures, Fig.Taula, Taules, Taula(cont.), Continua
Néerlandais (nl)Figuur, Figuren, Fig.Tabel, Tabellen, Tab.(vervolg), Wordt vervolgd
Chinois simplifié (zh-Hans, zh, zh-CN)图, 图, 图表, 表, 表(续), 接下页
Chinois traditionnel (zh-Hant, zh-TW, zh-HK)圖, 圖, 圖表, 表, 表(續), 接下頁
Japonais (ja, ja-JP)図, 図, 図表, 表, 表(続き), 次ページへ続く
Arabe (ar, ar-EG, ar-MA…)شكل, أشكال, شكلجدول, جداول, جدول(تابع), يتبع

Le préfixe de légende est le nom du type (Figure 1.1.). Les types chinois numérotent dans le chapitre avec un trait d’union, {h1}-{n} (图 1-1) ; avec les réglages de légende labelNumberGap: '' et labelSeparator: ' ', la légende se lit 图1-1 标题 (voir Style de légende). L’index suit lui aussi la langue : 见 et 另见 devant un renvoi, 符号 et 数字 au-dessus des symboles et des nombres en chinois simplifié ; 見, 另見, 符號 et 數字 en chinois traditionnel. Le japonais numérote ses types de la même façon et compose ses légendes 図1-1 題 sans ces deux réglages, écrit les renvois 第3章, 2.3節 et 12ページ, intitule la bibliographie 参考文献, et son index imprime 記号 et 数字 au-dessus des symboles et des nombres et écrit ses renvois avec une flèche, →夏目漱石 pour voir et →夏目漱石、森鷗外も見よ après les pages pour voir aussi, les étiquettes en romain. L’arabe numérote ses types de la même façon, {h1}-{n} (شكل 2-3), écrit les renvois الفصل 3, القسم 2-1 et ص 12, intitule la bibliographie المراجع, et son index imprime انظر / انظر أيضًا, رموز et أرقام, avec la virgule et le point-virgule arabes (، ؛).

Un document chinois, japonais ou coréen déclare sa langue dans la sortie HTML (lang sur la racine .pt-doc, zh-Hant-TW gardé entier) et sur le canvas qu’il peint (ctx.lang, dans Chrome 136 et ultérieur) : le navigateur dessine ainsi les formes de glyphes de la région. Unicode unifie les caractères han, et un même point de code n’a pas le même aspect dans une police taïwanaise et dans une police japonaise. Depuis postext 1.30, tous les autres documents le font aussi, dans la langue dans laquelle leur texte est mis en forme (bodyText.shapingLanguage: 'document', la valeur par défaut) ; avec 'host', les autres documents ne portent pas de lang, et chaque canvas peint dans la langue de la page qui l’héberge. Le PDF déclare /Lang d’après locale pour tout document, balisé ou non, avec son écriture et sa région. Un document dans une langue écrite de droite à gauche (arabe, persan, ourdou, hébreu…) déclare aussi sa langue : les formes propres à la langue de la police (locl) et la police de repli la suivent.

const config: PostextConfig = {
  locale: 'es',
  bodyText: { textAlign: 'justify', hyphenation: { enabled: true } }, // hyphenates in Spanish
};

Chiffres du document

Le numerals de premier niveau règle les chiffres de chaque nombre que le moteur écrit : numéros de page et étiquettes de page de la table des matières, de l’index et des renvois de page ; numéros des listes ordonnées et des notes de bas de page ; compteurs de titres et de chapitres, {chapterNumber} ; le {h1} et le {n} d’un numéro de figure et d’un renvoi vers elle ; {totalPages}, {bookTotalPages} et {numberDecimal}. 'latn' écrit 0–9, 'arab' les chiffres arabes orientaux ٠–٩ et 'arabext' les chiffres persans ۰–۹. Seul le format décimal change (decimal, le arabic des listes, ou un réglage laissé à sa valeur par défaut) : un format que l’auteur nomme s’imprime tel qu’il est nommé. lower-roman reste i, ii, iii, et arabic-indic dans un document latin écrit toujours ١, ٢, ٣. Le texte du document n’est jamais réécrit.

La valeur par défaut, 'auto', prend les chiffres de locale (defaultNumeralsFor(tag)) : 'arab' pour l’arabe sans région ou avec toute région hors du Maghreb (ar, ar-EG, ar-SA, ar-AE…), 'latn' pour ar-MA, ar-DZ, ar-TN, ar-LY, ar-MR et ar-EH, 'arabext' pour le persan (fa), le pachto (ps) et l’ourdou de l’Inde (ur-IN), et 'latn' pour tout le reste, y compris l’ourdou du Pakistan. Le CLDR donne latn pour un ar seul et pour ar-AE ; les livres arabes du Machrek et du Golfe impriment ٠–٩, et c’est ce que suit Postext. Une étiquette qui nomme ses chiffres les garde : ar-MA-u-nu-arab. Une page numérotée avec les chiffres du document enregistre arabic-indic ou persian comme pageNumberFormat : les étiquettes de page du PDF montrent les mêmes chiffres. Une valeur inconnue suit la langue et est signalée comme unknownNumerals.

Les nombres que l’auteur saisit sont lus dans n’importe lequel des trois systèmes : un élément de liste ٣. commence à 3, et {startAt=٥}, :::numbering{startAt=٥}, :::space{lines=٢} et :::part{number="٣"} (pour {numberDecimal}) lisent la valeur.

const config: PostextConfig = { locale: 'ar' };                     // ١، ٢، ٣
const maghreb: PostextConfig = { locale: 'ar-MA' };                 // 1, 2, 3
const forced: PostextConfig = { locale: 'ar', numerals: 'latn' };   // 1, 2, 3

Sens du texte

La direction de premier niveau règle le sens de base du document : 'ltr', 'rtl', ou 'auto' (la valeur par défaut), qui vaut 'rtl' quand l’écriture de locale s’écrit de droite à gauche (arabe, persan, ourdou, hébreu, syriaque, thâna, n’ko, adlam…, lu par directionOf(tag)) et 'ltr' sinon. Un document de droite à gauche est mis en page dans un cadre en miroir : ses lignes commencent à droite, sa première colonne est celle de droite, ses retraits, marques de liste, flottants, notes de bas de page et encadrés se placent à droite, et page.binding: 'auto' le relie à droite. La configuration résolue ne porte direction: 'rtl' que pour un tel document : un document de gauche à droite se résout comme avant. Une valeur inconnue est lue comme 'auto' et signalée comme unknownConfigValue. L’algorithme bidirectionnel Unicode (UAX #9) ordonne les passages de chaque ligne dans les deux sens : une citation arabe dans un livre anglais se lit de droite à gauche à sa place.

Dans le document, un titre ou un conteneur ::: prend {dir=ltr} ou {dir=rtl}, et les isolats en ligne :ltr[…] et :rtl[…] isolent un passage de texte (voir Le sens du texte dans le balisage) ; une ressource de tableau prend table.direction. Un bloc composé à contresens du document garde son propre côté de début : son retrait, ses marques de liste et l’extrémité de sa dernière ligne passent du côté où commence son texte.

Un réglage qui nomme un côté désigne un côté du texte ou du flux du texte courant, jamais de la feuille : une maquette conçue pour un livre anglais fonctionne quand le livre passe à l’arabe. 'start' et 'end' sont acceptés comme noms explicites :

Réglage'left' / 'right''start' / 'end'
textAlign du texte courant, des titres, des styles de paragraphe, des parties, des notes de bas de page et des corps d’encadrés ; align des légendes et des notes de légendeLes côtés du texte : 'left' est le côté où commence une ligne, la droite d’un paragraphe arabe, où va la dernière ligne d’un paragraphe justifié.Synonymes de 'left' et 'right'. Les configurations résolues portent 'left' / 'right' ; les configurations enregistrées gardent ce qui a été écrit.
align des cellules de tableauLes côtés du texte de la cellule, lus dans le sens du tableau (table.direction).Synonymes, lus dans le sens du tableau.
placement.align (flottants, figures étroites)Les côtés du flux du texte courant : dans un livre de droite à gauche, 'left' est la droite de la feuille.Synonymes.
stripe.side, icon.cornerSide, labelTab.position des encadrés ('top-start', 'top-end')Les côtés du flux du texte courant, les mêmes pour tous les encadrés de la page.Le sens propre de l’encadré (un :::callout{dir=ltr} dans un livre arabe commence à gauche de la feuille).
Emplacements d’en-tête et de pied de page ; éléments de maquette ancrés à la feuilleLes côtés de la feuille.Éléments de texte seulement : le début et la fin de la direction propre de l’élément.

placement.rotate garde son sens physique sur une page en miroir : une figure tournée dans le sens horaire est tournée dans le sens horaire sur la feuille. Un hôte qui lit la mise en page trouve le cadre en miroir sur chaque page (VDTPage.flow avec direction: 'rtl', pageIsMirrored(page)) et l’ordre visuel des segments de chaque ligne dans VDTLine.order ; flowToPage et pageToFlow font la correspondance entre le flux et la feuille. Voir Mise en page arabe.

const arabic: PostextConfig = { locale: 'ar' };                        // right to left, bound on the right
const english: PostextConfig = { locale: 'en', direction: 'rtl' };     // forced; rarely what you want

#Langues et écritures

Postext compose les écritures alphabétiques de gauche à droite, ainsi que le chinois et le japonais horizontalement et verticalement. Mise en page chinoise et Mise en page japonaise expliquent comment ils sont composés et quels réglages les contrôlent ; les clés se trouvent sous Typographie d’Asie de l’Est, Écriture verticale et Reliure. Ce que reçoit chaque écriture :

  • Le chinois est composé par le compositeur CJC quand un paragraphe contient plus de caractères CJC que d’espaces entre les mots : ses lignes se coupent entre les caractères selon les règles de début et de fin de ligne de cjk.lineBreak (aucune ligne ne commence par 。、」 ou ー, aucune ne se termine par 「 ou (), gardent entiers —— et ……, un nombre avec ses signes et un mot latin, et une ligne justifiée est étirée entre ses caractères jusqu’à la largeur de ligne. Les largeurs de ponctuation, la ponctuation suspendue, l’espace entre han et latin, la grille de caractères, les points d’emphase, les marques de nom propre et de titre d’ouvrage, les ruby et les notes warichu suivent la région de locale, à l’horizontale comme à la verticale (layout.writingMode: 'vertical-rl'). Un paragraphe latin qui cite quelques mots CJC garde la coupure optimale des lignes et peut couper à côté d’eux ; un crochet CJC, le point médian ou un signe pleine chasse cité dans un texte latin (〈h〉, %) ne change rien.
  • Le japonais passe par le même compositeur avec ses propres règles depuis postext 1.16, celles des Requirements for Japanese Text Layout du W3C (JLReq) et de la JIS X 4051 : une locale ja donne la région japan, dont les valeurs automatiques règlent les niveaux de kinsoku de la JLReq (les petits kana et ー n’ouvrent jamais une ligne), la ponctuation pleine chasse avec compression des paires, un cadratin après ?!, le crochet qui ouvre un paragraphe dans la seconde moitié du retrait, les points d’emphase en sésame au-dessus du texte, les titres d’ouvrage en 『』, les furigana espacés en 1:2:1, les compteurs japonais, les notes et un index trié par lecture. Les versions antérieures composaient le japonais avec les valeurs par défaut de la Chine continentale.
  • Le coréen passe par le même compositeur et est composé sans césure, mais avec les valeurs par défaut de la Chine continentale : ses propres règles (KLREQ) ne sont pas implémentées. Le texte coréen se coupe entre les syllabes ainsi qu’à ses espaces.
  • L’arabe et les autres écritures de droite à gauche (persan, ourdou, hébreu…) sont composés de droite à gauche : Mise en page arabe explique comment. La direction du document vient de l’écriture de locale, l’algorithme bidirectionnel Unicode ordonne les mots latins et les nombres à l’intérieur de chaque ligne, le livre est relié à droite avec sa première colonne à droite, et chaque nombre que le moteur écrit prend les chiffres de la région. Un mot qui contient une lettre d’écriture arabe n’est jamais coupé en fin de ligne, interlettré ni tronqué, et une ligne arabe justifiée est étirée à ses espaces et par des kachidas. Les signes vocaliques, l’emphase, les notes de bas de page et les chaînes de l’arabe se trouvent sous Texte arabe. Le persan, l’ourdou et l’hébreu reçoivent le sens, les chiffres et les règles des mots entiers, mais aucune chaîne intégrée qui leur soit propre.

Les motifs de césure sont fournis pour huit langues (en-us, es, fr, de, it, pt, ca, nl) ; les types de ressources intégrés et les chaînes de continuation existent dans ces huit langues, en chinois, en japonais et en arabe. Le chinois, le japonais, le coréen et les langues écrites de droite à gauche sont composés sans césure. Toute autre langue est coupée avec les motifs de l’anglais américain, avec un avertissement dans la console, et reçoit les chaînes anglaises. Pour un tel document, réglez hyphenation.enabled: false et passez resourceTypes et les chaînes de continuation de tableStyle dans sa langue.

#Texte arabe

Ces réglages servent le texte en écriture arabe ; aucun ne change un document écrit dans une autre écriture. Mise en page arabe les explique avec le reste d’un livre arabe : sens, reliure, chiffres, vers, table des matières et index.

  • Signes vocaliques et interlignage. Les signes vocaliques d’un texte vocalisé (fatḥa, kasra, chadda, tanwīn, l’alif suscrit, les signes coraniques) s’empilent au-dessus et au-dessous des lettres, dans l’interlignage, qui ne grandit jamais pour eux. Chaque ligne qui contient des signes enregistre jusqu’où va leur encre (VDTLine.markInk), et le détourage de colonne des moteurs de rendu englobe les signes des première et dernière lignes d’une colonne. Quand un signe au-dessus d’un mot rencontre les lettres ou les signes qui pendent sous le mot du dessus, la construction signale le paragraphe (arabicMarksExceedLeading, dans le panneau Vérifications du Sandbox). Seuls les mots placés l’un au-dessus de l’autre sont comparés. Un texte partiellement vocalisé demande environ 1,7–1,85 em de lineHeight, des vers entièrement vocalisés 1,9–2,1 em.
  • Emphase. Le caractère arabe n’a pas d’italique : dans un document dont la locale s’écrit en écriture arabe, *…* est composé en gras par défaut (bodyText.emphasis: 'auto'). 'color' le compose en romain dans la couleur italicColor, et 'overline' trace un filet au-dessus des mots, le khaṭṭ fawqī des livres arabes. Le réglage atteint tout texte composé dans les caractères du texte courant : paragraphes, listes, citations, styles de paragraphe, corps d’encadrés, notes et titres. Les légendes, les cellules de tableau, la table des matières et l’index gardent leurs propres réglages d’italique. Quel que soit le choix, le moteur n’incline jamais les lettres arabes : les mots arabes d’un passage composé en italique restent droits et ses mots latins gardent leur italique. Une citation est en romain par défaut dans un tel document.
  • Tashkīl. bodyText.tashkil: 'strip' retire les signes vocaliques et coraniques du texte que compose la mise en page, pour une édition non vocalisée tirée d’une source vocalisée : fatḥa, ḍamma, kasra et leurs tanwīn, sukūn, chadda, l’alif suscrit (هٰذا devient هذا) et les signes U+0656–U+065F et U+06D6–U+06ED. 'strip-vowels' garde la chadda, comme l’impriment la plupart des livres modernes. La hamza et la madda restent (أ إ آ sont des lettres, y compris quand elles sont saisies avec des signes combinants). La source garde ses signes ; les lignes, les titres et la table des matières sont composés sans eux, et chaque caractère composé renvoie toujours à sa place dans la source.
  • Notes de bas de page. footnotes.markerTemplate: '({n})' écrit les appels « (١) » dans les chiffres du document, numbering: 'page' les fait repartir à chaque page, et noteNumberPosition: 'inline' place le numéro de la note sur la ligne. Le filet de séparation et les numéros des notes se placent au début de la colonne, à droite dans un livre de droite à gauche.
  • Mots entiers. Un mot qui contient une lettre d’écriture arabe n’est jamais coupé en fin de ligne, tronqué ni interlettré, dans un livre arabe comme cité dans un autre. Un style qui applique un letterSpacing à du texte arabe est signalé (joiningScriptLetterSpacing), et un mot plus large que sa ligne en déborde et est signalé (unbreakableWordOverflow). Voir Mise en page arabe.
  • Kachida et vers. Une ligne arabe justifiée est étirée par des kachidas en plus de ses espaces (bodyText.kashida, voir La kachida dans le texte arabe), et un poème classique est composé à raison d’un bayt par ligne, en deux hémistiches de même largeur, avec :::verse (voir :::verse).
  • Index. Un index en arabe trie dans l’ordre alphabétique et ignore l’article ال (index.ignoreArticle), les signes vocaliques et les supports de la hamza ; voir Index.

#Orphelines, veuves, lignes creuses et règles de maintien

Voir Césure et justification pour le mécanisme de ces pénalités. Cette section est la référence des clés de bodyText qui les pilotent.

Au-delà de la césure et des limites d’espacement, la configuration du texte courant expose les règles souples qui empêchent les coupures de paragraphe maladroites du point de vue de la structure. Toutes sont injectées comme pénalités (demerits) dans l’algorithme de coupure des lignes de Knuth-Plass : elles orientent la mise en page vers des coupures propres sans jamais imposer de règle stricte. Réglez les valeurs *Penalty sur 0 pour désactiver en pratique l’une d’entre elles.

PropriétéTypeDéfautDescription
avoidOrphansbooleantrueDécourage un paragraphe de se terminer par moins de orphanMinLines lignes en haut de la colonne suivante. Sur une grille de caractères (cjk.grid) dans la région japan, la valeur par défaut est false.
orphanMinLinesnumber2Nombre minimal de lignes exigées en haut de la colonne suivante quand un paragraphe est coupé. Actif seulement quand avoidOrphans vaut true.
orphanPenaltynumber1000Pénalité ajoutée quand une contrainte d’orpheline n’est pas respectée. Des valeurs plus élevées orientent plus fortement l’algorithme contre les orphelines ; 0 désactive la pénalité.
avoidOrphansInListsbooleantrueAvec true, les éléments de liste reçoivent aussi la protection contre les orphelines (pas seulement les paragraphes). Efficace seulement quand avoidOrphans vaut true.
avoidWidowsbooleantrueDécourage un paragraphe de commencer par moins de widowMinLines lignes en bas de la colonne en cours. Sur une grille de caractères (cjk.grid), la valeur par défaut est false : la page contient les lignes que compte sa grille.
widowMinLinesnumber2Nombre minimal de lignes exigées en bas de la colonne en cours quand un paragraphe est coupé. Actif seulement quand avoidWidows vaut true.
widowPenaltynumber1000Pénalité ajoutée quand une contrainte de veuve n’est pas respectée. 0 désactive la pénalité.
avoidWidowsInListsbooleantrueAvec true, les éléments de liste reçoivent aussi la protection contre les veuves. Efficace seulement quand avoidWidows vaut true.
shortListSplit'allow' | 'warn' | 'avoid''allow'Une liste courte coupée entre deux colonnes ou deux pages : une liste d’au plus shortListMaxItems éléments dans le texte courant, comme une liste de trois éléments composée 1 + 2. avoidOrphansInLists et avoidWidowsInLists gardent ensemble les lignes d’un élément ; cette règle garde ensemble les éléments d’une liste. 'allow' coupe une telle liste là où la colonne se termine, comme toute autre. 'warn' la met en page de la même façon et signale chaque liste coupée (un avertissement shortListSplit, voir Avertissements dans le document). 'avoid' compose la liste entière : quand elle ne tient pas dans ce que contient la colonne, elle ouvre la colonne suivante, et les titres juste au-dessus d’elle ainsi que la ligne à deux-points qui l’introduit (keepColonWithList) l’accompagnent. Une liste plus haute qu’une colonne vide est coupée comme toute autre, et signalée. Les listes à l’intérieur d’un :::callout suivent les règles de coupure propres de l’encadré, et les entrées de :::toc et de :::index ne sont pas des listes. Depuis postext 1.28.
shortListMaxItemsnumber3Le nombre maximal d’éléments qu’une liste peut compter pour être courte au sens de shortListSplit, éléments de ses listes imbriquées compris. Un nombre entier, au moins 1. Depuis postext 1.28.
avoidRuntsbooleantrueDécourage les paragraphes de se terminer par une dernière ligne très courte, une ligne creuse (fin de paragraphe trop courte), par exemple un seul mot court isolé. Le texte en drapeau aussi, avec optimalRagged. Un paragraphe chinois, japonais ou coréen ne se termine pas sur une ligne d’un seul caractère, seul ou avec ses signes fermants (孤字) : la ligne du dessus lui donne son dernier caractère quand cette ligne peut encore être justifiée dans la limite d’approche. Une ligne alignée à gauche, à droite ou centrée cède aussi le caractère et reste plus courte d’un caractère ; avec cjk.grid.fullLines (papier manuscrit), elle garde toutes ses cases, et le paragraphe peut se terminer sur un seul caractère.
runtMinCharactersnumber20Seuil de la dernière ligne d’un paragraphe, compté en espaces entre les mots, pas en lettres : la ligne est creuse quand elle est plus étroite que runtMinCharacters × normalSpaceWidth pixels. Une espace entre les mots mesure d’un quart à un tiers de cadratin dans la plupart des caractères de texte, environ la moitié d’une lettre minuscule : la valeur par défaut de 20 détecte les dernières lignes de moins de 4 à 7 em, soit environ 8 à 12 lettres. Pour détecter les dernières lignes de moins d’environ N lettres, réglez-la vers 2 × N.
runtPenaltynumber1000Équivalent de « badness » injecté dans la formule des pénalités au carré de Knuth–Plass (même échelle que la badness de ligne, qui sature à 10 000). 0 désactive la pénalité.
gradedRuntPenaltybooleanfalseModule la pénalité de ligne creuse selon le manque de longueur de la dernière ligne : une dernière ligne de largeur w sous le seuil t coûte runtPenalty × (1 − w / t) au lieu de la pénalité entière. Une fin de deux mots coûte alors moins qu’une fin d’un mot, et le moteur de coupure fait descendre un mot quand une ligne du dessus peut s’en passer (« …sallies of » / « our minds. » plutôt que « …sallies of our » / « minds. »). Désactivé par défaut : toutes les lignes creuses coûtent la même chose, et le moteur de coupure garde les lignes plus serrées au-dessus.
avoidRuntsInListsbooleantrueAvec true, les éléments de liste reçoivent aussi la pénalité de ligne creuse. Efficace seulement quand avoidRunts vaut true.
tightenRuntsbooleantrueQuand la pénalité n’a pas pu éviter une ligne creuse, compose plutôt le paragraphe sur une ligne de moins : les espaces entre les mots se resserrent (jamais en deçà de minWordSpacing) et, si cela ne suffit pas à absorber la ligne, un peu d’approche négative s’y ajoute. Une composition plus courte est refusée, et la ligne creuse reste, quand elle étirerait une ligne justifiée au-delà de maxWordSpacing ou, si le paragraphe a déjà une ligne justifiée plus lâche, au-delà de cette ligne, ou quand elle composerait en drapeau plus de lignes (au-delà de 3× l’espace normale) que le paragraphe n’en avait. Les espaces du texte en drapeau gardent leur largeur : seule l’approche y intervient. Nécessite optimalLineBreaking et avoidRunts (et optimalRagged pour le texte en drapeau).
maxRuntTrackingnumber10Approche maximale que peut prendre la correction d’une ligne creuse, en millièmes de cadratin (l’unité d’InDesign : 10 = 0,01 em par caractère), appliquée comme un resserrement. 0 laisse la correction au seul espacement des mots.
slackWeightnumber10Poids appliqué au coût au carré de « l’espace de colonne inutilisé ». Des valeurs plus élevées font préférer à la mise en page des colonnes bien remplies ; 0 supprime entièrement cette pression.
keepColonWithListbooleantrueQuand un paragraphe se termine par un deux-points qui introduit directement une liste, garde la dernière ligne qui porte le deux-points avec la liste : si placer le paragraphe ne laissait pas la place au premier élément de la liste de commencer dans la même colonne ou la même page, la dernière ligne (ou le paragraphe entier, s’il tient sur une ligne) passe à la colonne suivante avec la liste. La place jugée suffisante est donnée par colonListRoom. Quand cette règle repousserait le paragraphe entier et qu’une suite de titres le précède immédiatement dans la colonne, ces titres sont avancés eux aussi pour que headings.keepWithNext reste respecté.
colonListRoom'item' | 'line''item'La place que keepColonWithList demande sous la ligne à deux-points. 'item' : ce que les règles d’orphelines et de veuves des listes laisseraient du premier élément au pied de la colonne, une ligne quand il peut s’y couper, la totalité quand elles le gardent entier (un élément de deux lignes, par exemple). 'line' : une ligne, comme jusqu’à postext 1.4 ; un premier élément que ces règles gardent entier passe alors seul à la colonne suivante et laisse la ligne à deux-points au pied. Une configuration enregistrée avant la configVersion 6, dans un livre qui introduit une liste par un deux-points, est lue avec 'line' (voir Paquets écrits par postext 1.4 ou antérieur). Toute autre valeur est lue comme 'item'.
hyphenateAcrossColumnsboolean | 'withinPage'truePermet à une colonne ou à une page de se terminer sur un mot coupé (le Hyphenate Across Column d’InDesign). false recoupe le paragraphe qui franchit le changement de colonne, pour que sa dernière ligne dans la colonne se termine sur un mot entier ; les espaces des lignes du dessus absorbent la différence, dans les limites de maxWordSpacing et de minWordSpacing. C’est une préférence : là où aucune coupure dans ces limites ne l’évite, le trait d’union reste. Le réglage essaie chaque changement de colonne d’un paragraphe : le premier, et les suivants qui tombent là où se termine une colonne pleine, en une seule recoupe ; et un changement ultérieur qui tombe ailleurs (une veuve gardée, une bande coupée à niveau) en une autre, à partir de cette colonne, qui garde à leurs coupures les lignes déjà composées dans les colonnes précédentes et ne recoupe que le reste. 'withinPage' protège les lignes qui ferment une page et aucune autre : un mot peut être partagé entre deux colonnes d’une même page, et la dernière ligne d’une page se termine sur un mot entier partout où les limites le permettent. Il modifie moins de lignes que false, ce qui compte à partir de trois colonnes, où deux fins de colonne sur trois se trouvent à l’intérieur de la page ; sur une seule colonne, les deux valeurs donnent les mêmes lignes. Une colonne ferme sa page quand aucune colonne suivante de la page ne reçoit de texte : ce n’est pas le cas d’une colonne latérale réservée aux flottants, ni d’une colonne qu’un tableau ou une figure a remplie. Les corps d’encadrés ne sont pas concernés. Avec optimalRagged, un paragraphe en drapeau est recoupé de la même façon : ses espaces gardent leur largeur, seules les fins de ses lignes bougent. Chaque recoupe mesure le paragraphe une fois de plus : un livre avec beaucoup de traits d’union en fin de colonne se met en page un peu plus lentement. Nécessite optimalLineBreaking, et optimalRagged pour le texte en drapeau.
paragraphContainerSpacing'collapse' | 'add''collapse'L’espace sous un conteneur :::paragraphs qui se termine par un paragraphe, entre ce paragraphe et le bloc qui le suit (voir Le conteneur :::paragraphs). 'collapse' : la plus grande valeur entre le spaceBetween et le marginBottom du style et l’espacement de paragraphe du texte qui entoure le conteneur (une ligne avec paragraphSpacing ; dans un encadré, celui de l’encadré), fusionnée avec l’espace que le bloc suivant garde au-dessus de lui, comme entre deux paragraphes du texte courant : un titre placé sous une bibliographie se place à son propre marginTop en dessous d’elle, et non à cette marge plus l’espacement des entrées. 'add' : comme jusqu’à postext 1.4, l’espace du style seul est placé sous la dernière ligne avant l’alignement sur la grille, l’espace propre du bloc suivant au-dessus de lui s’y ajoute, et l’espacement de paragraphe est omis : le paragraphe qui suit le conteneur pouvait donc se trouver plus près de lui que de tout autre. Une configuration enregistrée avant la configVersion 8 qui déclare un style de paragraphe, dans un livre qui contient un tel conteneur, est lue avec 'add' (voir Paquets écrits par postext 1.4 ou antérieur). Un marginBottom négatif remonte le bloc suivant dans les deux cas. Un style de paragraphe peut définir sa propre règle pour ses conteneurs (containerSpacing, depuis postext 1.28).

À propos des lignes creuses. Une ligne creuse est la dernière ligne d’un paragraphe trop courte pour passer pour une vraie ligne de texte : en général un ou deux mots courts échoués en fin de paragraphe. Comme la vérification repose sur la longueur en pixels de la ligne rapportée à la largeur normale de l’espace, runtMinCharacters s’adapte automatiquement au corps en cours. Un mot court visuellement plus large que runtMinCharacters × spaceWidth ne pose pas de problème ; un mot plus étroit (ou vraiment isolé) attire la pénalité de ligne creuse. Le seuil compte des espaces entre les mots, qui sont environ deux fois moins larges que les lettres : la valeur par défaut de 20 correspond à une dernière ligne d’environ 8 à 12 lettres. Toute ligne creuse coûte la pénalité entière : entre deux fins sous le seuil, le moteur de coupure garde les lignes plus serrées au-dessus ; gradedRuntPenalty évalue plutôt chacune selon ce qui lui manque, et la fin la plus longue l’emporte. Pour les esprits mathématiques : avec la runtPenalty par défaut de 1000, éviter une ligne creuse l’emporte sur tout autre jeu de coupures qui demanderait un étirement de l’espacement des mots allant jusqu’à environ r≈2,15.

Souples, pas strictes. Aucune de ces règles ne peut empêcher une coupure : le moteur produit toujours une mise en page. Ce sont des pénalités : l’algorithme met en balance la « badness », le coût de la césure, la régularité des classes d’ajustement et ces pénalités structurelles dans une seule optimisation globale, et retient le jeu de coupures au coût total le plus bas. Si vous avez besoin d’une garantie plus ferme, augmentez la pénalité ; si un document se lit mieux avec une pénalité relâchée, diminuez-la.

#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éTypeDéfautDescription
fontFamilystring'Open Sans'Famille de police de tous les titres.
lineHeightDimension1.2 emHauteur de ligne des titres. Plus serrée que celle du texte courant.
colorColorValueCouleur 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.
fontWeightnumber700Graisse des titres (100–900).
marginTopDimension1.5 emEspace au-dessus des titres. Supprimé pour un titre qui ouvre une colonne (voir columnHeadSpace).
marginBottomDimension0.5 emEspace sous les titres.
keepWithNextbooleantrueÀ 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.
keepWithNextSpreadbooleanfalseAvec 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). Avec avoidWidows ou avoidOrphans désactivé, ce côté de la règle est abandonné.
snapToGridbooleantrueIndique 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.
inlineMarksbooleantrueIndique 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 en texte brut dans tous les cas, sauf si son élément de texte lit les marques en ligne (inlineMarks: true) : là, 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).
balancingColumnBalancingConfigactivéÉ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 :

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).

#Équilibrage des colonnes

Les éditeurs attendent que chaque colonne commence en haut de la page et se termine au ras de son bas. Les règles de coupure (protection contre les veuves et les orphelines, titres gardés avec leur texte, figures indivisibles) laissent naturellement des colonnes courtes, avec une ou plusieurs lignes vides de la grille de ligne de base en bas. Quand l’équilibrage est activé, le moteur fait ce que ferait un compositeur, en appliquant ses leviers par ordre de priorité éditoriale :

  1. Un encadré qui ferme la colonne : un encadré qui termine une colonne courte est descendu exactement de la place libre sous son pied, si bien que son bord inférieur tombe sur la dernière case de la grille de la page, à la hauteur de la dernière ligne de la colonne voisine. Il prend cette place même quand elle fait moins d’une ligne, tant que rien ne passe dans une autre colonne. Par défaut, ce levier passe avant tous les autres et prend tout l’écart, si bien qu’un encadré qui annote le paragraphe au-dessus de lui peut se retrouver plusieurs lignes plus bas ; closingBox: 'last' laisse les titres, les fins de liste et les autres leviers d’espacement prendre d’abord les lignes entières, l’encadré ne prenant que ce qu’ils laissent, et closingBox: 'off' ne le déplace jamais.
  2. Images avec zone sûre : une image dotée d’une zone sûre (Resource.safeArea, voir Format de document › Zone sûre) placée en ligne dans la colonne courte, ou flottant en tête ou au pied de cette seule colonne, grandit par lignes entières de la grille, recadrée dans sa zone sûre, jusqu’à ce que la colonne soit pleine ou que le recadrage atteigne la zone sûre. Une image plus haute ne laisse aucun trou sur la page : ce levier passe donc avant tout ajout d’espace ; un flottant en tête de colonne sur une page ou une bande dont les têtes de colonne restent alignées (voir plus bas) ne grandit pas. Enregistré comme flexFigure. Il n’a pas de réglage propre : seule une image dont la ressource marque une zone sûre peut grandir.
  3. Titres : des lignes entières de la grille sont ajoutées à la marge supérieure des titres de la colonne courte. Quand plusieurs lignes sont nécessaires et que la colonne contient plusieurs titres, les lignes sont réparties entre eux, la plus grande part allant toujours au titre le plus important (un h2 reçoit plus qu’un h3). Les titres placés tout en haut d’une colonne ne reçoivent jamais d’espace supplémentaire, pour que les colonnes continuent de commencer en haut de la page, sauf un titre placé juste sous une figure ou un tableau qui ouvre sa colonne sur une page dont le flux continue : la place va au-dessus de ce titre, sous la figure. Un titre prend au plus maxLinesBeforeLoose lignes de cette façon (deux par défaut) avant que les leviers suivants soient essayés, et ses lignes supplémentaires, jusqu’à maxLinesPerHeading, seulement quand ceux-ci n’ont plus rien à donner.
  4. Fins de liste : quand les titres ne peuvent pas absorber tout l’écart, une ligne de la grille est ajoutée là où se termine une liste ou une énumération (un espace après une liste se lit naturellement), avec un plafond par fin de liste.
  5. Sous les formules, les encadrés et les figures : ensuite, une ligne de la grille va sous une formule hors texte ou un encadré après lesquels le texte reprend (stretchAfterDisplays ; elle se lit comme la marge propre de l’élément), et sous une figure ou un tableau qui ouvre la colonne (stretchAfterFloats, plafonné par maxLinesAfterFloat).
  6. Paragraphes lâches : en dernier recours, un paragraphe de la colonne est recoupé avec une ligne de plus (le \looseness=+1 de TeX), en choisissant le paragraphe le plus long pour que l’espacement supplémentaire entre les mots se dilue de façon invisible. La solution lâche n’est acceptée que si chaque ligne reste sous bodyText.maxWordSpacing : le gris typographique ne dépasse jamais la limite que vous avez déjà configurée. Nécessite bodyText.optimalLineBreaking.

Sur une grille de caractères (cjk.grid, voir Composition chinoise › La grille de caractères), chaque caractère occupe une case d’un em de large et chaque ligne suit le pas de ligne de la grille, qui est aussi la grille de ligne de base. L’équilibrage y est désactivé par défaut, comme en texte vertical : une page composée ligne à ligne sur une grille, à la manière dont GB/T 9704 compte 22 lignes de 28 caractères, laisse une colonne courte telle quelle. Une configuration qui pose enabled: true obtient des leviers qui respectent la grille : les titres, les fins de liste, les formules hors texte et les figures prennent des lignes entières de la grille, de sorte que le texte qui les suit se déplace par rangées entières, et gridLines: 'off' les exclut pour une norme qui n’a aucune rangée vide à donner. Un paragraphe chinois ou japonais ne s’allonge d’une ligne que si aucun intervalle entre deux de ses caractères ne s’élargit au-delà de maxTracking, et ses lettres ne reçoivent aucune approche : une ligne à qui il manque un caractère répartit un em sur ses intervalles, bien au-delà des 0,01 em par défaut, si bien que sur une grille de cases entières le levier des paragraphes lâches ne trouve généralement rien. L’encadré qui ferme une colonne et les images avec zone sûre sont hors grille par conception et fonctionnent comme partout ailleurs.

La dernière colonne d’une page n’est équilibrée que si la page se poursuit naturellement sur la suivante : la page de fin d’un chapitre se termine légitimement plus court. Une telle page, ainsi qu’une bande finale coupée à niveau par trailing, garde aussi ses têtes de colonne alignées : aucune ligne n’est ajoutée sous une figure ou un tableau qui ouvre l’une de ses colonnes (le levier après flottant), et un titre ou un encadré qui ouvre une colonne sous une telle figure reste en tête, quoi que dise stretchAfterFloats, de même que le titre placé juste sous une ouverture span: 'page' dans la colonne de l’ouverture, de sorte qu’une colonne ne commence jamais plus bas que sa voisine dans le seul but d’aligner les pieds.

PropriétéTypeDéfautDescription
enabledbooleantrueIndique s’il faut équilibrer le bas des colonnes. Désactivé par défaut en texte vertical (layout.writingMode: 'vertical-rl') et sur une grille de caractères (cjk.grid.enabled, depuis postext 1.25) ; true l’active là aussi.
maxLinesPerHeadingnumber4Nombre maximal de lignes de la grille pouvant être ajoutées au-dessus d’un même titre.
maxLinesBeforeLoosenumber2Lignes de la grille qu’un titre peut prendre avant que les leviers suivants soient essayés : les fins de liste, les formules et les encadrés, les figures et les paragraphes lâches. Un titre ne reçoit ses lignes supplémentaires, jusqu’à maxLinesPerHeading, que lorsque ceux-ci n’ont plus rien à donner, si bien qu’une page avec un seul titre n’ouvre pas quatre lignes au-dessus de lui alors que ses paragraphes pourraient s’allonger d’une ligne. Une valeur égale ou supérieure à maxLinesPerHeading donne d’abord aux titres toutes leurs lignes, comme jusqu’à postext 1.27 ; 0 essaie les autres leviers avant qu’aucune ligne n’aille au-dessus d’un titre. Depuis postext 1.28 ; les documents enregistrés plus tôt gardent l’ancien ordre (pinLegacyLooseOrder).
stretchAfterListsbooleantrueAutorise des lignes de la grille supplémentaires à la fin d’une liste, quand les titres ne peuvent pas absorber tout l’écart.
maxLinesAfterListnumber1Nombre maximal de lignes de la grille supplémentaires après une même fin de liste.
stretchAfterDisplaysbooleantrueAutorise une ligne de la grille supplémentaire sous une formule hors texte, et sous un encadré, dans la colonne courte, après le levier des fins de liste : le bloc qui suit descend d’une ligne. Mettez-le à false pour laisser l’espace sous les formules et les encadrés tel que leurs propres marges le fixent ; l’écart passe aux leviers suivants, et la colonne se termine court s’ils ne le comblent pas. Depuis postext 1.28.
stretchAfterFloatsbooleantrueAutorise des lignes de la grille supplémentaires sous une figure ou un tableau qui ouvre la colonne courte (un flottant en haut), après le levier des fins de liste, pour que le texte qui le suit descende au lieu que la colonne se termine court. Jamais sur une page dont le flux ne continue pas (la page de fin d’un chapitre) ni dans une bande finale coupée à niveau par trailing : là, les têtes de colonne restent alignées et la dernière colonne peut se terminer une ligne plus court. Le premier bloc sous la figure peut être la suite d’un paragraphe commencé à la page précédente : il descend tout de même, de la ligne que les règles de coupure ont laissée libre au pied de la colonne (une ligne que la règle des veuves a gardée vide, ou un espace de paragraphe sans place pour du texte après lui). Mettez-le à false pour garder le texte juste sous la figure. Sous un flottant qui couvre plusieurs colonnes, les colonnes descendent ensemble ou pas du tout, voir stretchAfterWideFloats.
maxLinesAfterFloatnumber1Nombre maximal de lignes de la grille supplémentaires sous un même flottant en haut.
stretchAfterWideFloats'flush' | 'always''flush'Sous une figure ou un tableau qui couvre deux colonnes de texte ou plus. Avec 'flush', une colonne ne descend sous le flottant que si toutes les colonnes de texte sous celui-ci prennent les mêmes lignes, pour que leurs têtes restent alignées, ou si ces lignes font finir cette colonne au ras du bas ; une ligne qui abaisserait la tête d’une colonne tout en la laissant courte n’est pas ajoutée, et l’écart passe aux paragraphes lâches. 'always' étire une telle colonne comme sous n’importe quel flottant, comme jusqu’à postext 1.27. Toute autre valeur se lit comme 'flush'. Depuis postext 1.28 ; les documents enregistrés plus tôt gardent 'always' (pinLegacyWideFloatStretch).
looseParagraphsbooleantrueDernier recours : recoupe des paragraphes d’une colonne courte de façon plus lâche (une ligne de plus chacun), dans la limite de bodyText.maxWordSpacing.
maxLooseParagraphsnumber2Nombre de paragraphes d’une même colonne courte qui peuvent s’allonger d’une ligne, les plus longs d’abord.
trackParagraphsbooleantrueQuand l’espacement des mots ne suffit pas à gagner la ligne, un paragraphe lâche peut aussi prendre la plus petite approche positive (interlettrage) qui y parvient.
maxTrackingnumber10Limite supérieure de cette approche, en millièmes d’em par caractère (10 = 0,01 em).
trailingbooleantrueMet à niveau la bande finale d’un chapitre et du document : quand le flux s’arrête avant que la page soit pleine (à une ouverture de chapitre, un :::part, un encadré placement: 'fixed' qui ferme un chapitre ou la fin du document) avec des colonnes inégales, elles sont coupées à niveau (un plafond de bande de ceil(Σ used / N / grid) lignes, calculé une fois que les leviers ci-dessus ont réglé les pages précédentes), si bien qu’une bibliographie courte se termine à la même hauteur dans chaque colonne au lieu de remplir la première et de laisser la dernière à moitié vide. La coupe respecte les règles d’une bande non coupée : quand un bloc qui ne peut pas se diviser à cet endroit (une fin de paragraphe que les minimums d’orphelines et de veuves gardent entière, un encadré à garder ensemble) la dépasserait (et perdrait ses dernières lignes, puisque les moteurs de rendu rognent une colonne à sa boîte) ou qu’un titre fermerait une colonne tandis que son texte ouvrirait la suivante (avec headings.keepWithNext, le défaut), la coupe est prise une ligne plus bas, jusqu’à trois fois, puis abandonnée. Un bloc qui ne peut pas commencer dans les lignes que la coupe laisse sous une figure ouvrant une colonne (un paragraphe y a besoin de son minimum d’orphelines) passe plutôt à la colonne suivante de la bande, comme il le ferait depuis une colonne non coupée, et la figure reste seule dans sa colonne. Les colonnes dont les pieds diffèrent d’une ligne de la grille ou moins restent telles quelles : une bande finale dont la dernière colonne se termine une ligne plus court est la finition habituelle, et la couper ne ferait que déplacer une ligne. La coupe va à la bande où elle a été mesurée, de même que la coupe qu’un encadré sur toute la largeur de la page demande en milieu de page : jusqu’à postext 1.4, quand le premier texte de la page finale avait d’abord été proposé à une bande sans place pour lui (une page qu’un flottant occupe entièrement, la bande étroite qu’un encadré sur toute la largeur de la page laisse au pied de la page précédente), la coupe était dépensée sur cette bande et la page finale gardait toutes ses lignes dans sa première colonne. Les colonnes de largeurs différentes (une maquette à colonne et demie avec du texte dans les deux) sont coupées à la surface, la hauteur de chaque colonne étant pondérée par sa largeur, puisqu’une ligne de la colonne étroite contient moins de texte. Actif uniquement quand enabled vaut true.
trailingStep'lines' | 'grid''lines'Unité de la coupe à niveau que prend trailing (et de la coupe que prend beforeSpan derrière un encadré qui passe plus loin). 'lines' : une bande dont le texte est composé sur un interlignage propre (un index, une liste de références, un conteneur en petit corps) est coupée, et retentée, par lignes entières de cet interlignage, c’est-à-dire la hauteur que partagent la plupart des lignes de la bande, titres et encadrés mis à part. Ses colonnes se terminent alors à moins d’une ligne l’une de l’autre, comme une bande de texte courant. Une bande de texte courant, et une bande qui mêle deux interlignages à parts égales, est coupée sur la grille de ligne de base comme avant. De même pour une bande dont les lignes partagent une hauteur et sont espacées d’une fraction de ligne (des références avec un espace entre les entrées, des groupes d’index avec une marge réglée à la main) : quatre lignes sur cinq de chaque colonne doivent être séparées l’une de l’autre par un nombre entier de lignes. 'grid' : chaque coupe est un nombre entier de lignes de la grille de ligne de base, comme jusqu’à postext 1.27, où une coupe sur la grille laissait entrer une ligne de plus dans une colonne d’une bande hors grille et où une coupe ratée était abaissée de plus d’une de ses lignes (colonnes jusqu’à trois lignes d’écart). Toute autre valeur se lit comme 'lines'. Depuis postext 1.28 ; les documents enregistrés plus tôt gardent 'grid' (pinLegacyTrailingStep).
beforeSpanbooleantrueMet à niveau la bande qu’un bloc sur toute la largeur de la page laisse derrière lui : quand un encadré span: 'page' ne tient pas sous les colonnes en cours, même après une coupe à niveau, et doit passer à la page suivante ou se diviser (calloutStyles[].keepTogether: false), les colonnes qu’il interrompt sont coupées à niveau (le même plafond final que reçoit une bande finale) au lieu que la première remplisse la page et que la dernière se termine court. La page est laissée comme un saut explicite pour que les leviers ci-dessus ne réétirent pas sa dernière colonne jusqu’en bas de la page ; l’encadré, ou la partie qui en tient, se place alors sous les colonnes mises à niveau. Actif uniquement quand enabled vaut true.
closingBox'first' | 'last' | 'off''first'Moment où un encadré qui ferme une colonne courte prend la place sous son pied (levier 1, enregistré comme trailingCallout). 'first' : avant tout autre levier, comme jusqu’à postext 1.4 ; l’encadré prend tout l’écart, même plusieurs lignes, et les titres au-dessus de lui n’en reçoivent aucune. 'last' : après les leviers des titres, des fins de liste, des formules hors texte et des flottants, qui prennent d’abord les lignes entières ; l’encadré descend avec le texte au-dessus de lui puis ne prend que ce qu’ils ont laissé, en général une fraction de ligne, si bien que son pied rejoint toujours la dernière case de la grille et qu’il reste proche du texte qu’il annote. 'off' : jamais ; l’encadré garde la place sous son pied, même si les autres leviers peuvent encore le descendre par lignes entières quand ils ajoutent de l’espace au-dessus de lui, et la fraction de ligne laissée sous lui demeure. Sur une page finale, où l’encadré est le seul levier qui aligne son pied sur la colonne voisine, 'off' le laisse là où le flux l’a placé. Toute autre valeur se lit comme 'first'. Un encadré qui ferme la seule colonne de texte de sa bande (une page à une colonne qui se termine tôt, son bloc suivant ouvrant la page suivante) n’est jamais déplacé : il n’y a pas de colonne voisine sur laquelle l’aligner (depuis postext 1.19).
gridLines'allow' | 'off''allow'Sur une grille de caractères : indique si les leviers qui ajoutent des lignes entières de la grille (au-dessus d’un titre, à la fin d’une liste, sous une formule hors texte ou un encadré, sous une figure qui ouvre la colonne) peuvent agir. Ils gardent chaque caractère dans sa case ; 'off' convient à une norme qui compte les lignes d’une page, et laisse plutôt la colonne courte. Sans effet hors de la grille. Toute autre valeur se lit comme 'allow'. Depuis postext 1.25.

Quel levier a agi

La mise en page enregistre chaque levier qu’elle a appliqué, sur le bloc auquel elle l’a appliqué : block.balancing dans le VDT que renvoie buildDocument. Une épreuve, un test ou un rapport peut ainsi dire pourquoi une colonne se termine au ras du bas, et quelles colonnes aucun levier n’a pu fermer. Les blocs que l’équilibrage n’a pas touchés ne portent pas de balancing, et un document construit avec enabled: false n’en a aucun.

Sur une grille de caractères, le document dit pourquoi une colonne peut se terminer court : doc.gridBalancing vaut { off: true } quand l’équilibrage est désactivé parce que la page est sur une grille et que la configuration ne l’active pas, et { gridLines: 'off' } quand il tourne sans les leviers à lignes entières ; une colonne restée courte porte column.gridRefused, les leviers que la grille lui a refusés ('looseParagraph' quand un paragraphe ne pouvait gagner sa ligne qu’en écartant ses caractères hors de leurs cases, les leviers à lignes entières avec gridLines: 'off'). Les deux sont absents hors grille.

interface VDTBalancing {
  levers: BalanceLever[]; // usually one: a paragraph after a list can take the list-end line and run a line long too
  spaceAbove: number;     // px the spacing levers added above the block (0 when only looseParagraph or flexFigure fired)
  bodyGrowth?: number;    // flexFigure: px the picture grew, cropped within its safe area
  extraLines?: number;    // looseParagraph: lines the paragraph gained
  tracking?: number;      // looseParagraph: the tracking that gained them, in thousandths of an em (0 = word spacing alone)
}
type BalanceLever = 'trailingCallout' | 'flexFigure' | 'heading' | 'listEnd' | 'afterDisplay' | 'afterFloat' | 'looseParagraph';
LevierEnregistré surCe qu’il a fait
trailingCalloutle bloc du cadre de l’encadréUn encadré qui ferme la colonne est descendu exactement de la place libre sous son pied (spaceAbove ; une fraction de ligne est admise).
flexFigurele bloc de l’image (en ligne) ou le flottantUne image avec zone sûre composée bodyGrowth px plus haute, par lignes entières de la grille, recadrée dans la zone sûre. Le bodySource du bloc de ressource est la partie affichée et bodyFlex.delta la même croissance.
headingle titreDes lignes entières de la grille au-dessus du titre, jusqu’à maxLinesPerHeading.
listEndle premier bloc après la listeUne ligne de la grille à la fin d’une liste, jusqu’à maxLinesAfterList.
afterDisplayle bloc qui suit la formule ou l’encadréUne ligne de la grille sous une formule hors texte ou un encadré.
afterFloatle premier bloc de la colonneUne ligne de la grille entre une bande de flottants qui ouvre la colonne et son texte, jusqu’à maxLinesAfterFloat.
looseParagraphle paragrapheLe paragraphe recoupé avec extraLines lignes de plus, avec la plus petite approche qui y parvient (tracking ; block.letterSpacing est la même valeur en px).

Les coupes à niveau sont enregistrées sur les colonnes qu’elles coupent : column.bandCapped vaut true sur chaque colonne coupée à niveau (la bande qu’un encadré sur toute la largeur de la page laisse derrière lui, une bande finale), et column.trailingCap marque en plus la bande finale d’un chapitre ou du document (trailing).

import { buildDocument } from 'postext';
 
const doc = buildDocument(content, config);
for (const page of doc.pages) {
  page.columns.forEach((column, i) => {
    const levers: string[] = column.blocks.flatMap((block) => block.balancing?.levers ?? []);
    if (column.trailingCap) levers.push('closing band cut level');
    else if (column.bandCapped) levers.push('band cut level');
    if (levers.length > 0) console.log(`page ${page.index + 1}, column ${i + 1}: ${levers.join(', ')}`);
  });
}
// page 3, column 1: heading, heading
// page 3, column 2: listEnd, looseParagraph

#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.

NiveauTaille de police par défautbreakBefore par défaut
H118 pt{ enabled: true, parity: 'always-odd' }
H215 pt{ enabled: false, parity: 'any' }
H312 pt{ enabled: false, parity: 'any' }
H410 pt{ enabled: false, parity: 'any' }
H59 pt{ enabled: false, parity: 'any' }
H68 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 :

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 :

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). 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). 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 les accepte aussi) :

PropriétéTypeDéfautDescription
italicbooleanfalseCompose 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).
letterSpacingDimension0Approche 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 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.
lineSpannumbernon définiLignes 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.
indentDimension0Retrait 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.
firstLineIndentDimension0Retrait 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.
jidorinumbernon définiEspacement 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.
dropCapParagraphDropCap | falseaucuneUne lettrine qui ouvre le premier paragraphe de texte courant après un titre de ce niveau (voir 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.
numberingTemplatestring''Modèle du numéro automatique du niveau. Un jeton … imprime le compteur courant de ce niveau de titre, éventuellement formaté par un suffixe : en chiffres romains majuscules, en chiffres romains minuscules, / en lettres, complété de zéros, en toutes lettres (twenty-one), en ordinal (twenty-first), en chiffres chinois (japonais dans un document japonais : 第百一章), chiffre par chiffre, en chiffres financiers et cerclé, ou tout nom des Graphies des formats de numérotation ; tout autre texte est littéral ('Chapter . ', '.', '第回' 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é 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 pour les mots, et Styles de titre pour un modèle propre à certains titres d’un niveau.
numberSeparatorstring' '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 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 (, ) et les signets du PDF le lisent aussi ; 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 peut avoir sa propre valeur, 'before' pour garder les titres que son niveau remplacerait.
breakBeforeHeadingBreakBeforeConfigH1 : { 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.
hiddenbooleanfalseUn 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 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 plutôt que sur tout un niveau ; un titre le redéfinit avec / .
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.

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 pour un titre qui doit commencer juste après un saut manuel.

Valeurs de parité

ValeurComportement
'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) 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éTypeDéfautDescription
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 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.
spanBreakbooleantrueIndique 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.
advancedDesignHeadingAdvancedDesignConfigEmplacement de maquette en composition libre pour ce niveau. Quand enabled est vrai, les éléments de l’emplacement composent l’ouverture. Utilisez dans un élément de texte pour rendre le texte du titre ; utilisez , , etc. pour insérer le numéro formaté du titre.
advancedDesign.minHeightDimension—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 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 :

{
  "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 : Three / three, Third / third (voir 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 :

{
  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 :

{
  "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.

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.

# 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) : 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 :

JetonAnglais (21)Espagnol (21)Chinois (21)
twenty-oneveintiuno二十一
Twenty-oneVeintiuno二十一
TWENTY-ONEVEINTIUNO二十一
twenty-firstvigesimoprimero第二十一
Twenty-firstVigesimoprimero第二十一
TWENTY-FIRSTVIGESIMOPRIMERO第二十一

L’anglais, l’espagnol, le chinois 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 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 jusqu’à 999 ; les nombres plus grands s’impriment en chiffres.

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}), 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 :

// 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}', /* … */ },
  ] } } }

#Listes à puces

La propriété unorderedLists règle le rendu des listes à puces (-, *, +) et des listes de tâches GFM (- [ ], - [x]). Jusqu’à cinq niveaux d’imbrication sont pris en charge.

#Valeurs par défaut des listes à puces

PropriétéTypeDéfautDescription
fontFamilystringhérite de bodyText.fontFamilyPolice du texte des éléments.
colorColorValueCouleur principale (#295AA3)Couleur du texte et des puces des éléments. Liée à l’entrée main-color de la palette par défaut.
fontWeightnumber700Graisse du texte des éléments (100–900). Les puces héritent de cette graisse sauf réglage propre à un niveau.
italicbooleanfalseCompose le texte des éléments en italique.
bulletCharstring'•'Glyphe utilisé comme puce.
bulletFontSizeDimension1 emTaille du glyphe de la puce. Les unités relatives suivent la taille du texte courant.
gapDimension0.5 emEspace horizontal entre la puce et le texte de l’élément.
indentDimension0 emRetrait de base du niveau 1. Les niveaux plus profonds partent du début du texte du parent, sauf réglage explicite (voir plus bas).
bulletVerticalOffsetDimension0 emAjuste finement la position verticale de la puce. Une valeur négative la remonte, une valeur positive la descend.
marginTop / marginBottomDimension1.5 emEspace avant et après la liste dans son ensemble.
itemSpacingDimension0 emEspace vertical ajouté entre les éléments, en plus de la hauteur de ligne. Autour d’une liste imbriquée dans un élément d’une autre, c’est l’espacement de la liste extérieure qui s’applique des deux côtés, avant le premier élément de la liste imbriquée et après son dernier (jusqu’à postext 1.4, l’élément qui suivait une liste imbriquée prenait l’espacement de celle-ci).
snapTopToGridbooleanfalseArrondit vers le haut l’espace au-dessus de la liste pour que sa première puce tombe sur la grille de ligne de base, comme le texte sous un titre ; marginTop devient alors un minimum. La fin d’une liste ramène de toute façon le flux sur la grille, si bien qu’avec itemSpacing à 0 chaque élément s’aligne sur le texte de la colonne voisine. Désactivé par défaut, comme jusqu’à postext 1.4 : un marginTop qui n’est pas un nombre entier de lignes laisse les éléments hors de la grille jusqu’à la fin de la liste. Les listes placées dans des encadrés, dont l’intérieur est hors grille, ne sont pas concernées.
hangingIndentbooleantrueActivé, les lignes suivantes s’alignent sur le premier caractère du texte au lieu de passer sous la puce.
levelsUnorderedListLevelConfig[]—Réglages propres aux niveaux 1 à 5. Voir plus bas.

#Extensions pour les listes de tâches

Les éléments de tâche GFM (- [ ] …, - [x] …) sont rendus comme des éléments à puces avec une case à cocher à la place de la puce. Le moteur dessine lui-même la case, un carré au trait, coché quand l’élément est fait : aucune police n’est sollicitée, elle est donc identique sur toutes les machines, sur le canvas, dans le PDF, dans le HTML et dans l’EPUB, et les technologies d’assistance lisent ☐ ou ☑. Son côté mesure 0,6 em de la taille de la marque (bulletFontSize, ou le fontSize du niveau), et c’est la place qu’elle occupe avant le gap ; à la taille du texte, elle repose sur la ligne de base de la première ligne de l’élément. Son trait suit la fontWeight de la marque et sa couleur la color de la marque. Les champs suivants ne concernent que les éléments de tâche :

PropriétéTypeDéfautDescription
taskCheckboxCharstring'☐'Caractère d’une tâche non cochée. La valeur par défaut n’est pas composée comme du texte : le moteur dessine la case. Tout autre caractère est composé comme du texte dans le caractère de la liste, qui doit alors le contenir.
taskCheckedCharstring'☑'Caractère d’une tâche terminée. La valeur par défaut est dessinée elle aussi, sous forme de case cochée ; tout autre caractère est composé comme du texte dans le caractère de la liste.
taskBox'drawn' | 'character''drawn'Manière de composer les deux caractères par défaut. 'drawn' : le moteur dessine la case. 'character' : ☐ et ☑ sont du texte dans le caractère de la liste, comme jusqu’à postext 1.28 ; avec un caractère qui ne les contient pas, le navigateur choisit une police du système, et le texte de l’élément commence après la largeur que donne cette police. Une configuration enregistrée avant la version 13 est lue avec 'character', pour que ses lignes restent à leur place.
taskCompletedStrikethroughbooleantrueBarre d’un trait le texte des tâches terminées.
taskCompletedColorColorValuehérite de la couleur de l’élémentCouleur facultative appliquée au texte des tâches terminées. Sans elle, la couleur habituelle de l’élément est utilisée.

#Réglages par niveau des listes à puces

Chaque entrée de levels vise une profondeur (1 à 5) et peut redéfinir n’importe lequel des champs suivants :

PropriétéTypeDescription
bulletCharstringGlyphe de la puce à cette profondeur.
fontFamilystringFamille de police des éléments à cette profondeur.
fontSizeDimensionTaille du glyphe de la puce à cette profondeur.
colorColorValueCouleur des éléments.
fontWeightnumberGraisse des éléments.
italicbooleanActive l’italique.
indentDimensionRetrait explicite de la puce à cette profondeur. Voir la règle de cascade ci-dessous.
verticalOffsetDimensionAjustement vertical fin de la puce à cette profondeur.

Cascade des retraits. Le niveau 1 commence toujours à la valeur générale indent (par défaut 0 em : les puces sont calées sur le bord de la colonne). Pour les niveaux 2 à 5, si vous laissez indent indéfini, le moteur place la puce au début du texte du niveau précédent (retrait du parent + largeur de la puce + gap). Donnez un indent explicite à un niveau pour rompre la cascade et caler cette profondeur où vous voulez.

unorderedLists: {
  bulletChar: '—',
  gap: { value: 0.4, unit: 'em' },
  hangingIndent: true,
  levels: [
    { level: 2, bulletChar: '·' },
    { level: 3, bulletChar: '◦', color: { hex: '#666666', model: 'hex' } },
  ],
}

#Listes numérotées

La propriété orderedLists règle les listes numérotées (1., 2), etc.). Jusqu’à cinq niveaux d’imbrication sont pris en charge, et chaque profondeur peut utiliser un format de numéro différent.

#Valeurs par défaut des listes numérotées

PropriétéTypeDéfautDescription
fontFamilystringhérite de bodyText.fontFamilyPolice du texte des éléments et du numéro.
colorColorValueCouleur principale (#295AA3)Couleur du texte et des numéros des éléments. Liée à l’entrée main-color de la palette par défaut.
fontWeightnumber700Graisse du texte des éléments et des numéros (100–900).
italicbooleanfalseCompose le texte des éléments en italique.
numberFormatOrderedListNumberFormat'arabic'Style de numéro : 'arabic', 'lower-alpha', 'upper-alpha', 'lower-roman', 'upper-roman'. Les graphies des autres réglages fonctionnent aussi ('decimal', 'roman-lower', 'i'… ; voir Graphies des formats de numérotation) ; une valeur inconnue numérote en chiffres arabes et est signalée.
prefixstring''Texte placé avant le numéro, dans le style du séparateur : avec '(' ici et ')' comme séparateur, une liste chinoise se lit (一), (二). Quand le séparateur est dessiné comme un segment à part, le préfixe l’est aussi, juste avant le numéro.
separatorstring'.'Caractère placé entre le numéro et le texte, en général '.' ou ')'.
separatorFontFamilystringhérite de fontFamilyPolice du séparateur. Dès qu’un style du séparateur diffère de celui du numéro, le séparateur est dessiné comme un segment à part après le numéro (aligné à droite) : par exemple 1 en Optima Bold noir suivi de • en DIN Pro Bold bleu.
separatorFontWeightnumberhérite de fontWeightGraisse du séparateur (100–900).
separatorItalicbooleanhérite de italicCompose le séparateur en italique.
separatorColorColorValuehérite de colorCouleur du séparateur. Les références à la palette sont respectées.
separatorGapDimension0 emEspace entre le numéro et le séparateur. Le texte de l’élément commence toujours gap après le séparateur.
numberFontSizeDimension1 emTaille du numéro.
gapDimension0.5 emEspace horizontal entre le numéro et le texte de l’élément.
indentDimension0 emRetrait de base du niveau 1 ; les niveaux plus profonds partent du début du texte du parent, sauf réglage explicite.
numberVerticalOffsetDimension0 emAjuste finement la position verticale du numéro.
marginTop / marginBottomDimension1.5 emEspace avant et après la liste dans son ensemble.
itemSpacingDimension0 emEspace vertical supplémentaire entre les éléments. Autour d’une liste imbriquée dans un élément d’une autre, c’est l’espacement de la liste extérieure qui s’applique des deux côtés, avant le premier élément de la liste imbriquée et après son dernier (jusqu’à postext 1.4, l’élément qui suivait une liste imbriquée prenait l’espacement de celle-ci).
snapTopToGridbooleanfalseArrondit vers le haut l’espace au-dessus de la liste pour que son premier numéro tombe sur la grille de ligne de base, comme le texte sous un titre ; marginTop devient alors un minimum. La fin d’une liste ramène de toute façon le flux sur la grille, si bien qu’avec itemSpacing à 0 chaque élément s’aligne sur le texte de la colonne voisine. Désactivé par défaut, comme jusqu’à postext 1.4 : un marginTop qui n’est pas un nombre entier de lignes laisse les éléments hors de la grille jusqu’à la fin de la liste. Les listes placées dans des encadrés, dont l’intérieur est hors grille, ne sont pas concernées.
numberWidth'run' | 'level' | 'item''run'Largeur de la colonne des numéros d’un élément, qui fixe l’endroit où commence son texte ; les numéros y sont alignés à droite. 'run' : le numéro le plus large de la série de l’élément, c’est-à-dire des éléments d’une même profondeur séparés seulement par des éléments plus profonds. Une figure, un paragraphe ou un encadré entre deux éléments ouvre une nouvelle série : ii) après un tableau peut donc faire commencer son texte un peu plus à droite que i) avant lui, et une liste de neuf éléments place son texte plus à gauche qu’une liste de douze. 'level' : le numéro le plus large à la profondeur de l’élément dans tout le document (le chapitre, dans un livre), si bien que chaque liste, et chaque morceau d’une liste interrompue, fait commencer son texte au même endroit, comme le font déjà les retraits des niveaux plus profonds. 'item' : le numéro propre de l’élément, si bien que le texte de chaque élément commence un gap après sa propre étiquette : 第九條 et 第十一條 sont suivis chacun du même espace et leurs textes commencent à des endroits différents, comme le Journal officiel japonais imprime les articles d’une loi. Les lignes suivantes obéissent à hangingIndent : false les ramène au retrait de la liste, true les suspend sous le texte propre de l’élément. Le retrait d’un niveau plus profond reste une seule valeur par niveau. Depuis postext 1.28.
numberAlign'end' | 'start''end'Position du numéro dans sa colonne. 'end' : contre le texte, de sorte que les numéros d’une série se terminent ensemble et que 9. et 10. s’alignent sur leurs points. 'start' : au début de la colonne (à gauche sur une page de gauche à droite, à droite sur une page de droite à gauche, en tête de ligne en texte vertical), de sorte que des étiquettes de longueurs différentes commencent ensemble, comme les articles d’un texte de loi (第九條, 第十一條). La colonne garde la largeur que lui donne numberWidth, si bien que le texte des éléments commence au même endroit dans les deux cas ; avec un séparateur dans un style propre, le séparateur suit son numéro. Depuis postext 1.26. Avec numberWidth: 'item', la colonne est le numéro lui-même, et les deux valeurs composent donc la même liste.
hangingIndentbooleantrueLes lignes suivantes s’alignent sur le premier caractère du texte au lieu de passer sous le numéro.
levelsOrderedListLevelConfig[]—Réglages propres aux niveaux 1 à 5.

#Réglages par niveau des listes numérotées

Chaque entrée de levels peut redéfinir numberFormat, prefix, separator, fontFamily, fontSize, color, fontWeight, italic, indent, verticalOffset et le style du séparateur (separatorFontFamily, separatorFontWeight, separatorItalic, separatorColor, separatorGap) ; la même cascade des retraits que pour les listes à puces s’applique. Le style du séparateur d’un niveau hérite du style de son propre numéro, sauf si le réglage du séparateur est donné pour toute la liste.

Alignement à droite. La chaîne de traitement mesure le numéro formaté le plus large d’une série et applique à tous les éléments de cette série un retrait qui aligne les numéros sur leur bord droit. Dans une liste de dix éléments rendus de 1. à 10., les numéros à un chiffre sont complétés à droite pour que le séparateur reste dans la même colonne.

orderedLists: {
  numberFormat: 'arabic',
  separator: '.',
  levels: [
    { level: 2, numberFormat: 'lower-alpha' },
    { level: 3, numberFormat: 'lower-roman', separator: ')' },
  ],
}

On obtient le mélange imbriqué classique :

1. First item
   a. Sub-item
      i) Deep note
   b. Sub-item
2. Second item

La hiérarchie des documents chinois (GB/T 15834—2011, annexe B.3) compte cinq niveaux : 一、 puis (一) puis 1. puis (1) puis ① :

orderedLists: {
  levels: [
    { level: 1, numberFormat: 'simp-chinese-informal', separator: '、' },
    { level: 2, numberFormat: 'simp-chinese-informal', prefix: '(', separator: ')' },
    { level: 3, numberFormat: 'arabic', separator: '.' },
    { level: 4, numberFormat: 'arabic', prefix: '(', separator: ')' },
    { level: 5, numberFormat: 'circled-decimal', separator: '' },
  ],
}

#Mathématiques

La propriété math règle l’analyse et le rendu des formules LaTeX placées entre les délimiteurs $...$ (en ligne) et $$...$$ (hors texte). Le moteur sous-jacent est MathJax (le paquet mathjax-full) en sortie SVG, rastérisé sur le canvas et incorporé au PDF sous forme de glyphes vectoriels.

interface MathConfig {
  enabled?: boolean;        // Render LaTeX. When false, spans pass through as literal TeX.
  fontSizeScale?: number;   // × the surrounding text's size (the body size for display maths).
  color?: ColorValue;       // Formula colour; inherits body colour if omitted.
  marginTop?: Dimension;    // Space above display math blocks.
  marginBottom?: Dimension; // Minimum space below; baseline grid snap may enlarge it.
  indentAfterDisplay?: boolean; // Indent a paragraph that follows a display formula.
  keepWithLeadIn?: boolean; // Keep a display formula with the line that leads into it.
  equationNumbering?: {      // Number the display formulas that carry a \label.
    enabled?: boolean;           // default true
    numberingTemplate?: string;  // '{n}'; '{h1}.{n}' numbers by chapter
    resetOn?: ResourceCounterReset; // 'never' | 'h1' … 'h6'
    counterFormat?: ResourceCounterFormat; // 'decimal'
    format?: string;             // '({n})': what the formula and \eqref print
  };
}
PropriétéTypeDéfautDescription
enabledbooleantrueÀ false, les segments $...$ et $$...$$ sont toujours analysés (les avertissements de délimiteur non fermé se déclenchent donc toujours), mais ils sont rendus sous leur source TeX littérale. Utile quand le contenu contient volontairement des signes dollar, ou pour désactiver entièrement le rendu des mathématiques.
fontSizeScalenumber1.0Multiplicateur appliqué à la taille du texte environnant avant le rendu : un em de la police TeX de la formule vaut cette taille × fontSizeScale, soit bodyText.fontSize pour une formule hors texte et pour les mathématiques en ligne dans le texte courant, et la taille du bloc englobant pour les mathématiques en ligne dans un titre, un style de paragraphe, une légende ou le corps d’un encadré. 1,0 correspond au texte environnant ; des valeurs entre 0,9 et 1,1 sont courantes quand la police mathématique paraît un peu plus grande ou plus petite que celle du texte. Modifié dans postext 1.5 : jusqu’à la 1.4, les formules sortaient environ 13 % plus grandes que cela (voir plus bas).
colorColorValuehérite de la couleur du texte courantCouleur de la formule rendue. Omettez-la pour hériter de bodyText.color. Donnez-la explicitement pour teinter les formules autrement que le texte, par exemple de la couleur d’accent des titres.
marginTopDimension0.8emEspace au-dessus d’un bloc mathématique hors texte. Ignoré pour les mathématiques en ligne.
marginBottomDimension0.8emEspace sous un bloc mathématique hors texte. C’est un minimum : le calage sur la grille peut l’agrandir pour que la ligne de base suivante tombe sur une ligne de la grille (que page.baselineGrid dessine la grille ou non).
indentAfterDisplaybooleantrueMet en retrait la première ligne d’un paragraphe qui suit une formule hors texte, comme pour tout autre paragraphe. false compose sans retrait tout paragraphe placé juste après une formule hors texte, comme la suite de la phrase que la formule a interrompue (« où L est… »). Une formule écrite à l’intérieur d’un paragraphe (sans ligne vide ni au-dessus ni au-dessous) est toujours suivie sans retrait : le texte sous son $$ fermant continue ce paragraphe et n’est jamais mis en retrait (voir Formules mathématiques).
keepWithLeadInbooleanfalseGarde une formule hors texte dans la colonne de la ligne qui l’introduit : c’est la pénalité « predisplay » de TeX. Quand la formule ne tient pas sous la dernière ligne du paragraphe qui la précède, cette ligne passe à la colonne ou à la page suivante avec la formule ; quand les lignes laissées derrière seraient moins nombreuses que bodyText.widowMinLines (moins d’une quand bodyText.avoidWidows est désactivé), un paragraphe qui s’ouvre dans cette colonne part en entier (avec les titres qui ferment la colonne au-dessus de lui, selon headings.keepWithNext). La ligne reportée se retrouve seule en tête de la colonne suivante, quoi que demande la règle des orphelines. Avec false, la formule part seule, et la ligne qui l’introduit peut fermer la colonne précédente, ou se poser au-dessus d’une figure qui ouvre la suivante.
equationNumbering{ enabled, numberingTemplate, resetOn, counterFormat, format }true, '{n}', 'never', 'decimal', '({n})'Numérotation des formules hors texte qui portent un \label (voir Équations numérotées plus bas). numberingTemplate, resetOn et counterFormat fonctionnent comme ceux d’un type de ressource : '{h1}.{n}' avec resetOn: 'h1' numérote (2.1), (2.2)… par chapitre, '{h1}.{h2}.{n}' avec 'h2' par section. format est le numéro tel que la formule et \eqref l’impriment, {n} tenant lieu du numéro : '[{n}]' compose [3]. enabled: false ne numérote rien : un \label est ignoré et un renvoi vers lui imprime sa page. Un jeton accepte aussi un style après deux-points ('{h1:A}.{n}' : (A.1) dans une annexe repérée par une lettre).
math: {
  enabled: true,
  fontSizeScale: 1.0,
  color: { hex: '#295AA3', model: 'hex' },
  marginTop: { value: 1, unit: 'em' },
  marginBottom: { value: 1, unit: 'em' },
}

Taille des formules, modifiée dans postext 1.5. MathJax donne la boîte d’une formule en ex, et un ex de sa police TeX vaut 0,442 em. Jusqu’à postext 1.4, le moteur le prenait pour un demi-em, si bien que chaque formule était composée environ 13 % plus grande que bodyText.fontSize × fontSizeScale. Les formules sortent désormais à la taille documentée, et les lignes et les pages qui contiennent des mathématiques se recomposent. Une configuration écrite en code pour la 1.4 garde la taille de formule de la 1.4 en passant par pinLegacyMathSize de postext/bundle, une seule fois, telle qu’elle est écrite :

import { pinLegacyMathSize } from 'postext/bundle';
 
config = pinLegacyMathSize(config); // formulas, and the space around display formulas, as 1.4 set them

D’autres changements de règles de la 1.5 peuvent aussi déplacer ses pages : les coupures des titres, l’espace autour d’une figure en ligne (dans le texte courant et dans les encadrés), les marques en ligne de ses titres, la taille de ses lettrines, la place gardée sous une ligne terminée par un deux-points pour la liste qu’elle introduit, les lignes qu’une coupe d’encadré laisse d’un paragraphe ou d’un élément de liste, les sauts de ligne après un tiret, la coupure du texte en drapeau, la division d’un paragraphe sous un titre, les sauts de ligne après le trait d’union d’un mot composé et l’espace sous un conteneur :::paragraphs. migrateConfig, lancé une fois avec le Markdown que la configuration met en page, fige celles dont ce texte a besoin, taille des formules comprise (voir Paquets écrits par postext 1.4 ou antérieur) :

import { migrateConfig } from 'postext/bundle';
 
config = migrateConfig(config, undefined, { content: markdown }); // heading breaks, formulas, inline gaps, heading marks, drop caps, colon lines, box cuts, dash breaks, compound breaks, ragged breaking, splits under a heading and container space as 1.4 set them

Cela retient ce que ces changements de règles déplaceraient, mais ne conserve pas toutes les pages de la 1.4. La version 1.5 corrige aussi des défauts de mise en page, et une correction ne se fige pas : une ancienne configuration en profite comme une nouvelle, si bien qu’une page qu’elle touche peut encore bouger. Parmi elles : un titre sur toute la largeur de la page sans maquette propre est mesuré sur la largeur de la page et composé avec l’interlignage de son niveau ; rien n’est réservé sous la ligne de base d’une lettrine dans une maquette de titre ; une lettrine prend la couleur de palette de la section, et est composée même sur un texte de maquette dont l’overflow n’est pas 'wrap', qui passe alors à la ligne ; un paragraphe dans un encadré peint l’approche avec laquelle il a été mesuré ; un encadré divisé garde sa colonne d’icône sur chaque fragment ; une ligne d’encadré qui étirerait ses espaces au-delà de 3× est composée en drapeau, comme dans le texte courant ; le levier des paragraphes lâches ne compose jamais une ligne justifiée plus large que ne le permet maxWordSpacing ; un encadré flottant garde un marginBottom (dans une bande du haut) ou un marginTop (dans une bande du bas) plus large que l’écart des flottants ; un texte de maquette centré ou aligné à droite avec de l’approche (un titre courant, un titre d’ouverture) est placé d’après ses lettres, sans l’approche qui suit la dernière ; sous une ouverture sur toute la largeur de la page, le texte qui ouvre la deuxième colonne commence là où commencerait un texte placé juste sous l’ouverture, y compris quand un titre suit l’ouverture ; les points de conduite de la table des matières s’arrêtent avant le numéro de page dans un caractère dont le crénage écarte une suite de points ; un titre courant lit un titre tel qu’il est écrit, sans espace là où l’une de ses lignes se termine après un trait d’union ou un tiret, ou à l’intérieur d’un mot coupé faute de place (MEDIOAMBIENTALES, pas MEDIOAMBIENTALE S), et le {titleText} d’une maquette de titre le lit de la même façon (thousand-colour, pas thousand- colour) ; un texte ancré au pied ou au milieu de la bande d’une maquette de titre garde la bande assez haute pour le contenir, et ne remonte donc plus sur le texte au-dessus du titre ; un mot plus large que sa ligne, coupé près d’un trait d’union qu’il porte, est coupé après ce trait d’union et n’en reçoit pas un second ; l’élément qui suit une liste imbriquée dans une autre prend l’itemSpacing de sa propre liste, pas celui de la liste imbriquée ; et le reste d’un mot coupé parce qu’il était plus large que sa ligne garde ses propres points de coupure, si bien qu’une adresse web continue de se couper à ses jointures et un mot composé à ses traits d’union, au lieu des syllabes du dictionnaire.

pinLegacyMathSize multiplie l’échelle par 1,1312 (0,5 ÷ 0,442) et divise par le même facteur les marges hors texte exprimées en em. L’échelle seule ne suffit pas pour un livre qui contient des formules hors texte : leurs marges sont des longueurs à la taille de la formule elle-même, elles grandiraient donc des mêmes 13 % et repousseraient vers le bas le texte qui les suit. Écrites pour les marges par défaut, les trois valeurs sont :

math: {
  fontSizeScale: 1.131,
  marginTop: { value: 0.7072, unit: 'em' },
  marginBottom: { value: 0.7072, unit: 'em' },
} // formulas as large as 1.4 set them, with the space 1.4 left around them

Là où la configuration a été enregistrée, le moteur le détecte et s’en charge pour vous : openBundle / readBundle pour un paquet .postext écrit avant la 1.5 (voir Paquets écrits par postext 1.4 ou antérieur), et le Sandbox pour les livres, la copie de travail et les fichiers postext-config.json enregistrés à cette époque (voir Sandbox → Persistance). Ils sont lus par migrateConfig, qui fige la taille (pinLegacyMathSize) : fontSizeScale devient l’échelle enregistrée (1 si elle n’est pas définie) × 1,1312, et une marge hors texte en em ou en rem (une longueur à la taille de la formule elle-même) est divisée par le même facteur, de sorte que l’espace autour d’une formule hors texte reste celui que laissait la 1.4 (les 0,8 em par défaut deviennent 0,7072 em). Une marge dans une unité de page (pt, mm…) reste telle quelle, de même qu’une configuration avec enabled: false ou dont le livre ne contient aucun $. L’ancien livre se met alors en page comme le faisait la 1.4, et sa section math affiche la taille à laquelle il est composé. Pour composer un tel livre à la taille actuelle, réinitialisez ces valeurs : Formules → Échelle de taille, Marge supérieure hors texte et Marge inférieure hors texte dans le Sandbox, ou en code :

math: { ...config.math, fontSizeScale: 1, marginTop: undefined, marginBottom: undefined } // today's size and margins

Équations numérotées. Une formule hors texte numérotée occupe toute sa justification (la colonne, ou la largeur intérieure de l’encadré qui la contient) : l’équation est centrée et son numéro aligné à droite sur la ligne de l’équation, sur chaque ligne numérotée d’un align. Un numéro vient d’un \label{eq:x} (depuis postext 1.19) : les formules étiquetées, et les lignes étiquetées d’un align, gather, alignat, flalign ou eqnarray, sont numérotées dans l’ordre de lecture selon equationNumbering, sauf si une ligne porte \nonumber ou \notag. Les environnements comme equation ne sont pas numérotés d’eux-mêmes : une formule sans étiquette n’a pas de numéro. \tag{…} imprime l’étiquette que vous lui donnez, entre parenthèses, et \tag*{…} telle qu’elle est écrite ; aucun des deux n’est compté, et un \label placé à côté lui donne un nom. Une équation numérotée plus large que sa justification déborde à droite, comme toute formule hors texte. (Jusqu’à postext 1.4, une formule avec \tag n’était pas dessinée du tout ; jusqu’à la 1.18, seul \tag en numérotait une.)

\eqref{eq:x} dans le texte imprime le numéro dans son format, (3), et \ref{eq:x} le numéro nu ; :ref{id="eq:x"} et @eq:x font de même (voir Renvois), et à l’intérieur d’une formule \eqref l’imprime comme du texte. Dans un livre mis en page chapitre par chapitre, le compteur reprend là où le chapitre précédent l’a laissé : continuationAfter le transporte dans LayoutContinuation.statementCounters (equation), et le plan du livre donne à chaque étiquette son numéro (OutlineEntry.numberLabel), si bien qu’un renvoi vers une équation d’un autre chapitre l’imprime.

math: {
  equationNumbering: { numberingTemplate: '{h1}.{n}', resetOn: 'h1' }, // (1.1), (1.2)… (2.1)
}

Le résolveur et le nettoyeur suivent le modèle des autres sections :

import {
  DEFAULT_MATH_CONFIG,
  resolveMathConfig,
  stripMathDefaults,
} from 'postext';
 
const resolved = resolveMathConfig(config.math);
const minimal  = stripMathDefaults(config.math);

#Démarrer le moteur mathématique

MathJax est chargé à la demande, et non avec le reste du moteur. Quand vous mettez en page sur le thread principal, démarrez-le avant de construire un document qui contient des formules :

import { buildDocument, initMathEngine, renderPage } from 'postext';
 
await initMathEngine(); // loads MathJax once; later calls resolve at once
const doc = buildDocument({ markdown: 'Euler: $e^{i\\pi}+1=0$.' }, config);
document.body.append(renderPage(doc.pages[0], doc));
  • Tant que le moteur ne tourne pas, les formules sont des espaces réservés. Chacune est mise en page comme une boîte grise de taille estimée. Si un document contenant des mathématiques est mis en page avant tout appel à initMathEngine(), la console affiche un avertissement qui le signale.
  • Le worker de mise en page le démarre pour vous. Une construction dans postext/worker appelle elle-même initMathEngine() quand le Markdown contient un $.
  • Mettre en page tout de suite, puis de nouveau quand il est prêt. isMathReady() indique si le moteur tourne. onMathReady(fn) appelle fn dès qu’il tourne (immédiatement s’il tourne déjà) et renvoie une fonction qui annule l’appel. Un éditeur peut afficher des espaces réservés tout de suite et remettre en page à l’arrivée de MathJax ; aucun avertissement n’est affiché tant que initMathEngine() est en cours.
  • Échec. initMathEngine() rejette sa promesse quand MathJax ne peut pas être chargé, et un appel ultérieur réessaie.
  • N’importe quel bundler, Node ou un CDN. MathJax est livré dans le paquet sous forme d’un module pré-empaqueté (environ 1,8 Mo avant compression, récupéré uniquement par initMathEngine). Le simple import { initMathEngine } from 'https://esm.sh/postext' fonctionne ; aucun ?bundle n’est nécessaire. Le paquet mathjax-full ne sert qu’à construire postext, installer postext ne l’installe donc pas. MathJax et l’analyseur mhchem qu’il embarque sont sous licence Apache-2.0 : leurs mentions et le texte de la licence sont livrés à côté du module, dans dist/math/THIRD_PARTY_LICENSES.txt.
  • Un seul moteur par page. Le moteur et son cache de formules rendues sont partagés par tout ce qui importe postext dans le même domaine d’exécution JavaScript (voir État global partagé dans une page).

Pour la grammaire côté document ($...$, $$...$$, échapper un dollar littéral), voir Format de document.