Aller au contenu principal

Chapitre 3.14 · Partie II · Le métier

Configuration : pages composées

Les gabarits des pages composées : blocs, groupes, décor, héritage et variantes recto/verso, styles d’étiquette des ancrages d’image, et avertissements qu’un gabarit peut donner

Mis à jour 2026-10-166 minDans le chapitre 3 Configurationenescadefritptzhjaar

En bref

Cette page présente les gabarits de page. Un gabarit est une page dessinée dans les réglages : des boîtes nommées, appelées blocs, la place de chacune, la taille qu’elle peut prendre et son apparence. Le Markdown d’une page composée remplit ensuite les blocs par leur nom, si bien que le texte ne contient jamais de positions et que les réglages ne contiennent jamais de texte. Un gabarit peut partir d’un autre et ne changer que quelques blocs, et il peut différer entre les pages de gauche et de droite. La page liste aussi les styles d’étiquette des mots posés sur les images, ainsi que chaque avertissement qu’un gabarit peut donner, avec la façon de le corriger.

#Gabarits de page

Une page composée est une page dont la forme vient d’un gabarit de la configuration et dont le contenu vient du Markdown d’une clôture ::::page{template="…"}. Le gabarit nomme des rectangles, appelés blocs ; le Markdown envoie chaque morceau de contenu vers un bloc par son nom (son emplacement). La géométrie n’apparaît jamais dans le Markdown, et le texte du contenu n’apparaît jamais dans le gabarit. La propriété pageTemplates contient les gabarits du livre :

const config: PostextConfig = {
  calloutStyles: [{ id: 'caja-azul' }, { id: 'tab-titulo' }],
  pageTemplates: [
    {
      id: 'tema-cajas',
      decoration: {
        elements: [
          { kind: 'image', id: 'fondo', resourceId: '{attr.fondo}', decorative: true,
            placement: { anchor: { to: 'bleed', edge: 'top-left' }, size: { width: 'fill', height: 'fill' } } },
        ],
      },
      frames: [
        { name: 'titulo', takes: 'h1', style: 'tab-titulo' },
        { name: 'texto', flow: true },
        { name: 'dinero', style: 'caja-azul', padding: { right: { value: 62, unit: 'mm' } } },
        { name: 'dinero-fotos', layer: 2, width: { value: 60, unit: 'mm' },
          placement: { anchor: { to: '#dinero', edge: 'top-right' } } },
      ],
      groups: [
        { name: 'pagina', kind: 'stack', gap: { value: 6, unit: 'mm' }, frames: ['titulo', 'texto', 'dinero'] },
      ],
    },
  ],
};

Un gabarit qui ne fixe que son id et un bloc est une page entière dont ce bloc remplit la zone de contenu. Tous les autres champs sont facultatifs :

PropriétéTypePar défautDescription
idstringobligatoireLe nom que demande une clôture de page (template="tema-cajas"). Unique parmi les gabarits : un second gabarit avec le même id est ignoré.
namestringl’idLe nom affiché dans le Sandbox. La mise en page ne le lit jamais.
extendsstringaucunL’id du gabarit dont celui-ci part. Voir Héritage et variantes.
area'content' | 'trim' | 'bleed''content'Le rectangle auquel se rapportent les positions des blocs. 'content' est la zone de contenu de la page, en miroir sur les pages de gauche et de droite comme le texte courant ; 'trim' est la page rognée ; 'bleed' la page avec son fond perdu.
grid{ columns, rows, columnGap?, rowGap? }aucuneDivise la zone en cellules, pour qu’un bloc ou un groupe se place par cellule (grid: { col: 2, row: 1, cols: 2 }, en comptant à partir de 1) plutôt que par placement. Les espacements valent 0 par défaut.
framesFrameConfig[][]Les blocs, dans l’ordre du gabarit : celui dans lequel ils sont mesurés et celui qui départage les égalités. Voir Blocs.
groupsFrameGroupConfig[][]Des piles et des rangées de blocs qui se partagent l’espace. Voir Groupes.
decorationDesignSlotaucunDes images, des filets et des boîtes peints avec la page, dans le langage d’éléments des en-têtes et pieds de page. Les éléments de texte ne contiennent que des variables ({pageNumber}, {chapterTitle}, {attr.x} pour un attribut de la clôture de page). Un élément peut s’ancrer à un bloc ou à un groupe ('#dinero') et se déplace alors avec lui. Le décor est posé après les blocs et ne repousse jamais le texte.
header, footerDesignSlot | falsehéritéLe titre courant et le folio de la page. Non définis, la page garde ceux de son chapitre ; false les masque.
spreadbooleanfalseLe gabarit décrit deux pages en vis-à-vis posées comme une seule feuille. Une double page commence toujours sur une page de gauche dans un livre de gauche à droite (sur une page de droite dans un livre de droite à gauche), avec une page blanche ajoutée avant elle si nécessaire.
gutterDimension0Sur une double page, la bande au dos que les blocs laissent libre, sauf s’ils fixent crossGutter: true.
variants{ recto?, verso? }aucuneDes changements pour une page de droite (recto) ou de gauche (verso), écrits comme le gabarit lui-même. Le côté est le côté physique, si bien que les livres de gauche à droite et de droite à gauche fonctionnent tous deux.
overflowTemplatestringce gabaritLe gabarit des pages ajoutées quand un bloc continue sur la page suivante (overflow.continueIn: 'next-page'). Non défini, la page ajoutée utilise ce gabarit, avec seulement les blocs continués remplis.
bodyStylestringaucunUn style de paragraphe pour le texte de la page, comme en ont les styles de titre.
palettestringaucuneUne palette de remplacement pour la page, comme en ont les styles de titre et les parties.
rolestring'composed'Le rôle de page que voient les éléments de maquette dotés d’un filtre pages.

#Blocs

Un bloc est un rectangle nommé qui reçoit du contenu composé. Son name est l’emplacement que demande le Markdown, et il est unique dans son gabarit (un groupe ne peut pas non plus prendre le nom d’un bloc, puisque les ancrages nomment les deux de la même façon).

Un bloc se place par sa cellule grid quand le gabarit a une grille, sinon par son placement, qui fonctionne comme celui d’un élément de maquette : un ancrage ('container' est la zone, 'page', 'bleed', ou '#name' pour un autre bloc ou groupe), un bord, un décalage et une taille. Un bloc ancré à un autre se déplace avec lui. Sans l’un ni l’autre, le bloc prend toute la zone.

PropriétéTypePar défautDescription
namestringobligatoireLe nom de l’emplacement.
placementElementPlacementtoute la zoneAncrage, bord, décalage et taille, comme dans le placement des éléments. Ignoré quand une cellule de la grille place le bloc.
grid{ col, row, cols?, rows? }aucuneUne cellule de la grille du gabarit, en comptant à partir de 1, qui s’étend sur cols × rows cellules (1 par défaut). Une cellule au-delà de la grille y est ramenée. Ignoré quand le gabarit n’a pas de grille.
width, heightDimension | { percent } | 'auto' | 'fill''fill', 'auto'Une longueur fixe, un pourcentage de la zone (de 0 à 100), 'auto' (la taille propre du contenu) ou 'fill' (ce qui reste jusqu’au bord auquel le bloc est ancré). Non défini, le bloc lit placement.size, puis la valeur par défaut : toute la largeur, aussi haut que son contenu. Un bloc de texte a besoin d’une justification, donc une largeur 'auto' n’a de sens que pour un bloc qui contient une seule image (la largeur de l’image à la hauteur du bloc). Une valeur que le moteur ne peut pas utiliser (une longueur négative, une unité inconnue) est lue comme la valeur par défaut.
minWidth, maxWidth, minHeight, maxHeightDimensionaucuneDes limites pour une taille 'auto' ou 'fill' et pour l’espace qu’un groupe donne ou reprend. Le minimum l’emporte sur le maximum, et une taille fixe hors de ces limites est ramenée entre elles (frameMinMax signale les deux cas).
stylestringsans encadréUn id de style d’encadré : les blocs se dessinent avec les styles d’encadré (fond, bordure, marge intérieure, bande, icône, onglet d’étiquette, titre). Les mots d’un onglet viennent du Markdown (:::frame{slot="dinero" label="El dinero"}). Les réglages d’encadré qui décident où va une boîte dans le texte courant (placement, span, columns, width, fixed…) ne s’appliquent pas à un bloc.
padding{ top?, right?, bottom?, left? }celle du styleRemplace la marge intérieure du style, côté par côté : de la place pour les photos posées sur une boîte, par exemple.
layernumber1L’ordre de peinture. Le décor est le calque 0 ; un calque négatif se peint en dessous.
rotatenumber0En degrés, dans le sens des aiguilles d’une montre. La boîte et son contenu tournent ensemble.
verticalAlign'top' | 'middle' | 'bottom' | 'justify''top'La position du contenu dans un bloc plus haut que lui.
columns, columnGapnumber, Dimension1, celle du styleDes colonnes à l’intérieur du bloc.
exclude'none' | 'push''none''push' : le texte des autres blocs habille le rectangle de celui-ci.
flowbooleanfalseLe bloc reçoit le contenu qui ne nomme aucun emplacement.
takes'h1' … 'h6'aucunLe bloc reçoit le premier titre de ce niveau qui ne nomme aucun emplacement : un titre de page s’écrit donc simplement # Title en haut de la clôture.
nextstringaucunUn chaînage : le contenu qui ne tient pas continue dans le bloc de ce nom, sur la même page.
overflow.continueInstringaucunOù continue le contenu qui ne tient pas : '#frame' (un autre bloc de la page, comme next), 'next-page' (le même bloc sur une page ajoutée après celle-ci) ou 'template:<id>' (une page de ce gabarit).
overflow.markstring | falsecelle de la langueLa marque à la fin d’un morceau coupé. Non définie, le mot de suite de la langue du document (celui des tableaux coupés) ; false n’en met aucune.
fit.shrinkTextbooleantrueQuand rien d’autre ne fait tenir le contenu, son texte peut être composé plus petit.
fit.minScalenumber0.9La plus petite échelle du texte, au-dessus de 0 et au plus 1 (une valeur plus grande est lue comme 1).
fit.scaleImages, fit.imageMinScaleboolean, numbertrue, 0.8Si les images du bloc peuvent être réduites, et jusqu’à quelle échelle.
pinbooleanfalseLe bloc ne bouge jamais et ne change jamais de taille, pour une boîte qui doit rester alignée sur l’illustration. Un groupe se répartit autour de lui.
grow, shrink, prioritynumber0La façon dont le bloc partage l’espace de son groupe : grow prend une part de l’espace libre, shrink permet au bloc de rendre de l’espace, et les blocs de priority plus basse le rendent en premier.
optionalbooleanfalsePas d’avertissement quand le Markdown n’envoie rien au bloc.
crossGutterbooleanfalseSur une double page, le bloc peut traverser la bande du dos.
writingMode, direction'horizontal-tb' | 'vertical-rl', 'ltr' | 'rtl'ceux de la pageUne boîte verticale sur une page horizontale, ou l’inverse.
removebooleanfalseDans un gabarit qui en étend un autre, ou dans une variante : supprime le bloc hérité de ce nom.

#Groupes

Un groupe est une pile (de haut en bas) ou une rangée (du début à la fin) de blocs qui se partagent l’espace et se déplacent ensemble. Dans un groupe, la position propre des blocs dans le sens du groupe est ignorée : le groupe les dispose dans l’ordre, avec gap entre eux. Quand le texte d’un bloc s’allonge, les blocs qui le suivent se décalent. Un groupe est une boîte à laquelle les blocs et le décor peuvent s’ancrer ('#pagina').

PropriétéTypePar défautDescription
namestringobligatoireUnique parmi les blocs et les groupes du gabarit.
kind'stack' | 'row''stack'De haut en bas, ou du début à la fin.
framesstring[][]Les blocs du groupe, dans leur ordre sur la page. Un bloc appartient à un groupe au plus ; un nom qui n’est aucun bloc du gabarit, ou un bloc déjà listé, est sauté.
gapDimension0L’espace entre deux blocs du groupe.
placement, gridcomme pour les blocsla boîte de ses blocsLa boîte propre du groupe. Non définie, la boîte qui entoure les boîtes déclarées de ses blocs.
align'start' | 'center' | 'end' | 'space-between''start'Où va l’espace libre quand aucun bloc du groupe ne grandit.
removebooleanfalseDans un gabarit qui en étend un autre, ou dans une variante : supprime le groupe hérité.

#Héritage et variantes

Un gabarit doté d’extends part du gabarit qu’il nomme (qui peut lui-même en étendre un autre) et ne change que ce qu’il écrit :

  • Un champ comme area, header ou overflowTemplate remplace celui du parent. grid se fusionne clé par clé. spread, gutter et role sont hérités aussi ; id, name et extends sont propres au gabarit.
  • frames et groups se fusionnent par nom : une entrée qui porte le nom d’une entrée héritée change les champs qu’elle écrit et garde les autres (fit, overflow et padding se fusionnent clé par clé ; placement est remplacé en entier) ; remove: true la supprime ; un nom nouveau s’ajoute après les entrées héritées.
  • Les éléments du décor se fusionnent par id de la même façon ; un élément avec un id nouveau, ou sans id, s’ajoute.

variants.recto et variants.verso s’écrivent comme un gabarit et se fusionnent de la même façon, sur une page de droite ou de gauche. Elles s’appliquent après toute la chaîne d’extends, la variante de la racine en premier. Une double page a les deux côtés : aucune variante ne s’y applique.

pageTemplates: [
  { id: 'tema', frames: [{ name: 'texto', flow: true }, { name: 'margen', width: { value: 30, unit: 'mm' },
      placement: { anchor: { to: 'container', edge: 'top-left' } } }],
    variants: { recto: { frames: [{ name: 'margen', placement: { anchor: { to: 'container', edge: 'top-right' } } }] } } },
  { id: 'tema-sin-margen', extends: 'tema', frames: [{ name: 'margen', remove: true }] },
]

Une valeur égale à une valeur par défaut n’est jamais abandonnée quand le Sandbox enregistre un gabarit : dans un gabarit qui en étend un autre, ou dans une variante, elle remplace la valeur du parent.

Depuis le code, resolvePageTemplate(config, id, { parity }) renvoie un gabarit avec sa chaîne fusionnée, la variante du côté appliquée, toutes les valeurs par défaut remplies et chaque référence réglée comme le décrivent les avertissements ci-dessous ; validatePageTemplates(config) renvoie les avertissements.

#Styles d’étiquette

La propriété labelStyles nomme les apparences des étiquettes posées sur une image : les mers et les villes d’une carte, les parties d’un schéma. Une étiquette se place à un ancrage de l’image (un point enregistré avec la ressource, comme les locuteurs de la bande dessinée) et prend le style que nomme l’ancrage ou l’étiquette.

labelStyles: [
  { id: 'mar', fontStyle: 'italic', textTransform: 'uppercase', letterSpacing: 0.12,
    color: { hex: '#2b6ca3', model: 'hex' } },
  { id: 'ciudad', fontWeight: 600, halo: { color: { hex: '#ffffff', model: 'hex' }, width: { value: 0.6, unit: 'pt' } } },
]
PropriétéTypePar défautDescription
idstringobligatoireLe nom qu’utilisent les ancrages et les étiquettes.
namestringl’idLe nom affiché dans le Sandbox.
paragraphStylestringaucunUn style de paragraphe dont l’étiquette emprunte la typographie ; les champs ci-dessous le remplacent.
fontFamily, fontSize, fontWeightstring, Dimension, numberceux du texte courantLa typographie de l’étiquette.
fontStyle'normal' | 'italic''normal'Romain ou italique.
colorColorValuecouleur du texte courantLa couleur des lettres.
textTransform'none' | 'uppercase''none'Des capitales, comme les cartes écrivent les mers et les pays.
letterSpacingnumber0L’espace ajouté entre les lettres, en cadratins.
halo{ color, width }aucunUn contour derrière les lettres, pour qu’elles se lisent sur une image chargée.
background, paddingColorValue, DimensionaucunUn fond derrière l’étiquette, et l’espace autour de son texte.
minScalenumber0.85La taille minimale à laquelle une étiquette peut être réduite quand elle ne tient pas dans sa largeur.

#Champs d’étiquette d’un ancrage

Les ancrages d’une image (Resource.anchors, les points que la bande dessinée utilise pour les locuteurs) acceptent quelques champs facultatifs pour les étiquettes. Ce sont des fractions de l’image : ils restent valables dans toutes les langues et quel que soit le recadrage de l’image. La bande dessinée les ignore.

ChampTypePar défautDescription
widthnumbercelle de l’étiquetteLa justification de l’étiquette, en fraction de la largeur de l’image : un nom long s’y coupe sur deux lignes.
align'start' | 'center' | 'end''center'Le côté de l’étiquette qui se place au point d’ancrage.
verticalAlign'top' | 'middle' | 'bottom''middle'Le bord de l’étiquette qui se place à la hauteur de l’ancrage.
rotatenumber0En degrés, dans le sens des aiguilles d’une montre, autour du point d’ancrage : le nom d’un fleuve le long de son cours.
stylestringaucunUn id de labelStyles. Une étiquette qui nomme son propre style le remplace.

#Avertissements des gabarits de page

Ailleurs, le moteur ignore une clé qu’il ne connaît pas. Les gabarits de page et les styles d’étiquette sont au contraire vérifiés, et chaque problème devient un avertissement de configuration dans postext check et dans le panneau Vérifications du Sandbox. Le path de ces avertissements est un pointeur JSON vers le champ en cause : /pageTemplates/3/frames/2/style, /pageTemplates/0/variants/recto/frames/1/next, /resources/4/anchors/0/style. Quand le champ a été hérité, le pointeur nomme le gabarit qui l’a écrit. Un avertissement qui nomme un id ou un nom inexistant propose aussi le plus proche qui existe.

Une clé mal orthographiée d’un gabarit, d’un bloc, d’un groupe, d’une grille, de fit, d’overflow, d’une variante ou d’un style d’étiquette est un unknownConfigKey ; un mot hors des choix d’un réglage (area, verticalAlign, exclude, takes, kind, align, writingMode, direction, fontStyle, textTransform) est un unknownConfigValue, et le réglage garde sa valeur par défaut. Un gabarit sans id, ou un bloc ou un groupe sans name, est ignoré avec un unknownConfigValue sur ce champ.

AvertissementCauseCorrection
templateDuplicateDeux gabarits ont le même id. Le premier est utilisé et le suivant est ignoré.Renommer l’un des deux, ou supprimer la copie.
templateExtendsCycleEn suivant extends, on revient au même gabarit (a → b → a). Tous les gabarits de la boucle, et tous ceux qui étendent l’un d’eux, sont écartés : aucune page ne peut les utiliser.Retirer l’extends d’un gabarit de la boucle.
templateExtendsUnknownextends nomme un id qu’aucun gabarit n’a. Le gabarit est utilisé seul, sans rien hériter.Corriger l’id (l’avertissement propose le plus proche), ou ajouter le gabarit parent.
frameDuplicateDeux blocs, ou deux groupes, d’une même liste ont le même name, ou un groupe porte le nom d’un bloc. L’entrée suivante est ignorée ; un ancrage à ce nom lit le bloc.Donner à chaque bloc et à chaque groupe un nom qui lui soit propre. Pour changer un bloc hérité, écrire une seule entrée avec son nom.
frameStyleUnknownLe style d’un bloc ne nomme aucun style d’encadré. Le bloc est dessiné sans boîte.Corriger l’id, ou ajouter le style à calloutStyles.
frameAnchorUnknownUn bloc, un groupe ou un élément de décor est ancré à '#name' et le gabarit n’a aucun bloc, groupe ou élément de ce nom ; ou des blocs et des groupes sont ancrés les uns aux autres en boucle (y compris par un groupe sans ancrage propre, dont la boîte est celle de ses blocs). L’ancrage est lu comme 'container', la zone.Ancrer à un bloc ou à un groupe qui existe, ou casser la boucle en ancrant l’un d’eux à la zone.
frameMinMaxUn minimum dépasse son maximum (minHeight 40mm > maxHeight 30mm), ou une width ou une height fixe se trouve hors des limites. Le minimum l’emporte, une taille fixe est ramenée entre les limites, et used indique ce que prend le bloc. Les longueurs en unités différentes se comparent à la résolution de la page, les cadratins au corps du texte courant.Rendre le minimum inférieur ou égal au maximum, ou supprimer la limite que contredit la taille fixe.
groupFrameUnknownLes frames d’un groupe listent un nom qui n’est aucun bloc du gabarit (peut-être supprimé par un gabarit enfant ou par une variante). Le groupe le saute.Corriger le nom, ou le retirer de la liste.
groupFrameTwiceUn bloc est listé dans deux groupes, ou deux fois dans le même. Un bloc n’appartient qu’à un seul groupe : la mention suivante est sautée.Garder le bloc dans le seul groupe avec lequel il se déplace.
frameChainLoopDes blocs se continuent les uns dans les autres en boucle par next ou overflow.continueIn: '#frame' (a → b → a). Le lien qui ferme la boucle est écarté : la chaîne s’arrête au bloc qui le précède.Terminer la chaîne à son dernier bloc : retirer son next, ou le faire continuer sur la page suivante.
overflowTargetUnknownUn next ne nomme aucun bloc du gabarit ; un overflow.continueIn ne nomme aucun bloc ('#x') ou aucun gabarit ('template:x'), ou n’a aucune des formes '#frame', 'next-page' et 'template:<id>' ; ou overflowTemplate ne nomme aucun gabarit. Le contenu qui ne tient pas n’y continue pas.Corriger le nom ou l’id, ou écrire l’une des trois formes.
labelStyleUnknownUn ancrage d’une image nomme un style que labelStyles n’a pas. L’avertissement nomme la ressource. Les étiquettes de cet ancrage prennent l’apparence par défaut.Corriger l’id du style sur l’ancrage, ou ajouter le style à labelStyles.

La version de la configuration est 15 depuis les gabarits de page (les bundles écrits avant continuent de se charger sans changement : rien de ce que dit une configuration plus ancienne ne change de sens).