Chapitre 3.12 · Partie II · Le métier
Configuration : encadrés
Les styles nommés des encadrés :::callout : cadre, fond, bande, titre, icône et marqueur, énoncés numérotés, typographie dans l’encadré et encadrés coupés d’une page à l’autre
En bref
Cette page traite des encadrés qui mettent à part du texte une remarque, un conseil, un avertissement ou une liste d’objectifs. Vous donnez à chaque genre d’encadré un nom et un aspect : son fond, sa bordure, une bande de couleur, un titre et une icône. Un encadré peut porter un numéro, comme un théorème ou un exemple dans un manuel. Vous choisissez les polices à l’intérieur de l’encadré. Quand un long encadré continue sur la page suivante, vous choisissez ce qui marque la coupure.
#Styles d’encadré
La propriété calloutStyles déclare les styles d’encadré nommés qu’un document applique avec un conteneur :::callout{type="…"} : notes, conseils, avertissements, objectifs d’apprentissage, tout contenu mis à part du texte courant dans un cadre teinté ou bordé. Un style neutre, note, est fourni par défaut (fond gris clair, sans bordure, sans bande, sans icône, sans titre), si bien que :::callout fonctionne sans aucune configuration ; déclarer calloutStyles remplace cette liste par défaut.
const config: PostextConfig = {
calloutStyles: [
{ id: 'note', name: 'Note' },
{
id: 'objectives',
name: 'Learning objectives',
title: 'Objectives',
stripe: { enabled: true, side: 'left' },
icon: { kind: 'glyph', glyph: '✓' },
titleStyle: { textTransform: 'uppercase' },
lists: { bulletChar: '–' },
},
{
id: 'warning',
title: 'Warning',
backgroundEnabled: false,
border: { enabled: true, color: { hex: '#AA0000', model: 'hex' }, width: { value: 1, unit: 'pt' } },
borderRadius: { value: 1, unit: 'mm' },
titleStyle: { color: { hex: '#AA0000', model: 'hex' } },
},
],
};:::callout{type="objectives"}
- Describe the parts of the lantern.
- Trim the wick at dusk.
:::
:::callout{type="warning" title="Do not touch the lens"}
The glass stays hot for an hour after the flame is out.
:::| Propriété | Type | Par défaut | Description |
|---|---|---|---|
id | string | — | Identifiant choisi par :::callout{type="…"}. Une clôture dont le type est inconnu ou absent utilise le premier style configuré (le Sandbox signale les types inconnus). |
name | string | id | Nom lisible (interface de l’éditeur uniquement). |
title | string | '' | Texte du titre par défaut ; vide signifie sans titre. L’attribut title de la clôture le remplace pour chaque instance. |
span | 'column' | 'page' | 'side' | 'column' | Étendue horizontale : la colonne, toute la largeur de contenu, ou la colonne latérale réservée aux flottants d’une mise en page à une colonne et demie (layout.) ; l’encadré quitte alors le flux et s’empile dans cette colonne à côté du texte qu’il interrompt. Remplaçable par instance avec l’attribut span. Dans les mises en page à plusieurs colonnes, un encadré 'page' devient un bloc pleine largeur : il découpe la page en bandes de colonnes et occupe sa propre colonne sur toute la largeur (voir la section sur le conteneur plus bas). Un encadré latéral que la colonne latérale de sa page ne peut pas contenir prend la colonne latérale de la page suivante ; là où le chapitre (ou le document) se termine d’abord, chaque encadré encore en attente est composé dans la colonne latérale d’une page après le texte, dans l’ordre de ses clôtures, et la composition le signale (afterText ; jusqu’à postext 1.24, les encadrés situés après la première de ces pages étaient abandonnés). |
columns | number | 1 | Nombre de colonnes adjacentes qu’occupe un encadré flottant (placement 'auto', 'top' ou 'bottom', avec span: 'column'), comme placement.columns le fait pour une figure : l’encadré d’un article sur trois des cinq colonnes d’un journal. Autant de colonnes que la page en compte, ou plus, en font un encadré sur toute la largeur de la page. Un encadré composé dans le flux ('here') reste dans sa colonne. Remplaçable par instance avec l’attribut columns. Depuis postext 1.18. |
placement | 'here' | 'auto' | 'top' | 'bottom' | 'fixed' | 'here' | Où va l’encadré. 'here' le compose dans le flux ; 'top' / 'bottom' le font flotter comme une ressource ('auto' prend la première bande libre, en tête ou en pied) : il quitte le flux là où il apparaît et prend la première bande libre à ce point ou après (le pied de la page en cours, ou la tête / le pied de la page suivante qu’ouvre le flux), et le texte qui le suit remplit la page autour de lui ; 'fixed' l’ancre à des coordonnées de page au moyen de fixed ci-dessous, hors du flux des colonnes. Voir la section sur le conteneur pour les détails. Remplaçable par instance avec l’attribut placement. |
sideAtColumnEnd | 'before' | 'after' | 'before' | Où se place un encadré latéral (span: 'side') quand le texte qui suit sa clôture ne continue pas dans la même colonne : la colonne n’a plus de place pour lui, ou les règles de coupure le renvoient plus loin (un paragraphe que les règles de veuves et d’orphelines déplacent en entier, un titre gardé avec son texte). 'before' le garde à sa clôture, sur cette page, à côté du texte qui le précède, en remontant depuis le pied de la colonne quand il ne tient pas sous la clôture : la place d’une glose écrite après le passage qu’elle explique. 'after' l’aligne sur la première ligne du texte qui suit la clôture, dans la colonne latérale de la page où ce texte continue : la place d’un numéro de ligne ou d’un titre marginal écrit avant sa ligne. Quand le texte continue dans la même colonne, les deux placent l’encadré à sa clôture. Un encadré que rien ne suit dans son chapitre reste avec le texte qui le précède dans les deux cas, et des encadrés latéraux dont les clôtures se suivent gardent leur ordre. Jusqu’à postext 1.4, tout encadré latéral se comportait comme 'before', qui reste la valeur par défaut : un style de gloses garde ses encadrés sur la page du passage qu’ils expliquent. |
fixed | | | Position d’un encadré 'fixed' : un ElementAnchor (to : 'container' = la zone de contenu de la page, en miroir sur les pages paires ; 'page' = la zone de coupe ; 'bleed' = la zone de fond perdu ; edge : l’un des neuf bords du conteneur) plus un offset facultatif (dimensions x / y). |
floatBarrier | boolean | false | Fait de l’encadré une barrière pour les flottants : toute figure ou tout tableau référencé avant lui est placé avant lui (dans les emplacements libres de la page, sinon sur des pages ouvertes avant l’encadré), si bien qu’aucun flottant ne passe au-delà de l’encadré qui clôt un chapitre (un résumé des « points clés », en général). Les ouvertures de chapitre, :::part et la fin du document sont toujours des barrières. |
Un encadré span: 'page' sur une page à plusieurs colonnes coupe la bande sous le texte qu’il suit ; une figure pleine largeur référencée avant lui prend d’abord cette coupe : le texte est mis à niveau, la figure se place exactement là où il s’arrête, et l’encadré continue en dessous (ou passe à la page suivante quand il ne tient plus). Une figure trop haute pour suivre le texte mis à niveau ouvre plutôt la page suivante, l’encadré après elle, et la bande qu’elle a quittée se termine quand même à niveau. Un encadré sécable (keepTogether: false) s’ouvre sous le texte et la figure avec autant d’éléments qu’il en tient, le reste continuant sur la page suivante. | |||
width | 'fill' | 'auto' | 'fill' | 'fill' occupe la largeur disponible ; 'auto' s’ajuste au titre (usage en badge) et ignore les enfants. |
backgroundEnabled / background | boolean / ColorValue | true / #f4f4f4 | Fond de l’encadré. |
border | { enabled, color, width } | false, #cccccc, 0.5pt | Contour de l’encadré, tracé à l’intérieur du bord comme l’est la bordure d’un élément boîte (voir Éléments boîte). |
borderRadius | Dimension | 0 | Rayon des coins du fond / de la bordure (limité à la moitié de la largeur et de la hauteur de l’encadré). La bande le suit : sur un encadré arrondi, la bande est découpée selon le cadre arrondi, comme CSS découpe un border-left selon border-radius. L’onglet label garde des coins carrés. |
padding | { top, right, bottom, left } | 0.75em chacun | Retrait entre le bord de l’encadré et son contenu. Les valeurs en em se rapportent à la taille du texte de l’encadré. |
stripe | { enabled, side, width, color } | false, 'left', 1.5em, couleur principale | Bande pleine le long d’un bord. Une bande 'left' / 'right' rétrécit le contenu ; une bande 'top' le repousse vers le bas. 'left' et 'right' sont des côtés du flux du texte (dans un livre de droite à gauche, 'left' est la droite de la feuille) ; 'start' et 'end' suivent la direction propre de l’encadré, si bien qu’un :::callout{dir=ltr} dans un livre arabe place une bande 'start' à sa gauche. Sur un encadré doté d’un borderRadius, ses coins extérieurs sont arrondis comme ceux du cadre (jusqu’à postext 1.4, ils restaient carrés et dépassaient de l’arrondi). |
icon | { kind, glyph, resourceId, fontFamily, fontWeight, size, width, color, align, position, cornerSide } | 'none', police des titres, 400, 1.5em, couleur principale, 'top', 'inline', 'right' | Un glyphe de texte (kind: 'glyph') ou une ressource bitmap / SVG (kind: 'resource' + resourceId) à côté du contenu. Avec une bande latérale, l’icône est centrée sur la bande ; sinon elle réserve sa propre colonne (size + titleStyle.gap). align: 'center' la centre verticalement sur le contenu. Une image de ressource est ajustée dans le carré en gardant ses proportions, ou dans une boîte width × size quand width est défini (une large bande d’icônes) ; une icône plus haute que le contenu agrandit l’encadré pour la contenir (et, avec align: 'center', centre le contenu sur elle). position: 'corner' accroche l’icône à un coin supérieur comme un badge, à moitié au-delà de la bordure, sans prendre de place au contenu ; une icône large (width) est centrée sur le coin selon la largeur à laquelle elle est dessinée, et sur le coin gauche le titre commence après sa moitié intérieure (jusqu’à postext 1.4, elle était placée selon sa hauteur, si bien qu’une large bande dépassait de l’encadré et recouvrait le titre) ; cornerSide choisit le coin : 'right' / 'left', ou 'outer' / 'inner', qui suivent la parité de page des marges en miroir (extérieur = droite sur un recto, gauche sur un verso). |
marker | { kind, glyph, resourceId, fontFamily, fontWeight, size, color, align, gap, rule } | 'none', police des titres, 400, 1.5em, couleur principale, 'center', 0.5em, filet désactivé (0.5pt, couleur principale, longueur 0) | Une seconde icône dessinée à l’extérieur de l’encadré, dans une colonne à sa gauche, avec un rule vertical facultatif entre elle et l’encadré : la main « touchez ici » à côté d’un badge d’autoévaluation. Le cadre devient [marker][rule][gap][box], aussi haut que le plus haut des trois ; align les centre les uns sur les autres ou les aligne en haut. rule.length est un minimum : le filet couvre toujours au moins la hauteur de l’encadré. |
titleStyle | { fontFamily, fontSize, fontWeight, italic, color, textTransform, gap, letterSpacing, indent, lineHeight } | police des titres, taille du texte, 700, false, couleur principale, 'none', 0.5em, 0, 0, 1.2em | Typographie du titre. gap est l’espace entre le titre et le premier enfant (et l’écart de la colonne d’icône). lineHeight est l’interlignage des lignes du titre, en em rapportés à la taille propre du titre ; la ligne de base se place aux 0,8 de cette valeur sur chaque ligne, comme dans le texte courant, si bien qu’un titre sur l’interlignage du texte (lineHeight: 12pt sur une grille de 12 pt) garde à l’encadré un nombre entier de lignes et son titre sur la grille, là où le 1,2 em par défaut ajoute une fraction de ligne à chaque encadré. textTransform: 'uppercase' préserve la longueur. letterSpacing règle l’approche du titre (letterSpacing du canvas / Tc du PDF) ; indent le décale vers la droite depuis le bord intérieur de l’encadré. Un badge de coin accroché du côté du titre (le coin gauche) réserve d’abord sa propre place (la moitié intérieure du badge plus gap), si bien que le titre l’évite quelle que soit la page où il tombe ; indent ne fait qu’ajouter au-delà. |
body | { fontFamily, fontSize, lineHeight, color, boldColor, italicColor, fontWeight, boldFontWeight, italic, smallCaps, textAlign, hyphenation, paragraphSpacing, firstLineIndent, tabStops, tabInterval } | hérite de bodyText ; italic / smallCaps false | Typographie des paragraphes et des éléments de liste dans l’encadré. Chaque champ non défini hérite du texte courant ; italicColor fixe la couleur des passages en italique (une citation en exergue en italique dans la couleur de l’encadré). fontWeight / boldFontWeight fixent les graisses des passages en romain et en gras ; italic compose l’encadré en italique, les passages … passant en romain ; smallCaps le compose en petites capitales ; tabStops et tabInterval remplacent ceux du texte dans l’encadré (voir Taquets de tabulation). Voir Typographie dans un encadré pour ce que le texte de l’encadré prend d’autre. |
lists | { bulletChar, color, indent, gap, itemSpacing, bulletFontSize, bulletFontWeight } | hérite de unorderedLists | Typographie des listes dans l’encadré (color, indent, gap et itemSpacing s’appliquent aussi aux listes numérotées). bulletFontSize / bulletFontWeight composent le glyphe de la puce dans le caractère du texte de l’encadré, à cette taille et à cette graisse (une puce grasse et colorée). |
label | { fontFamily, fontSize, fontWeight, color, background, position, height, paddingX, offset, inset, icon, rule } | non défini (sans onglet) | Un onglet sur le bord supérieur de l’encadré qui imprime l’attribut label de la clôture : le numéro d’un encadré numéroté (« BOX 1-1 »). Il se colle au coin position ('top-right' / 'top-left'), en retrait de inset, s’élève de offset au-dessus du haut de l’encadré (cet espace fait partie du bloc, en plus de marginTop, si bien que l’onglet le garde aussi en tête de colonne), mesure height de haut avec paddingX de chaque côté du texte, et peut porter une ressource icon à côté ({ resourceId, width, gap }, du côté opposé au coin) et un rule ({ enabled, color, width }) le long du bord supérieur, du coin opposé jusqu’à lui. Valeurs par défaut : police des titres, taille du texte, 700, blanc sur la couleur principale, 1.4em de haut, 0.6em de marge intérieure. L’onglet est une forme à part posée sur le cadre : il garde des coins carrés quel que soit le borderRadius de l’encadré. |
columnGap | Dimension | 1.5em | Écart entre les colonnes d’un groupe :::columns dans l’encadré (voir la section sur le conteneur plus bas). |
marginTop / marginBottom | Dimension | 0.75em / 0.75em | Espace au-dessus de l’encadré (fusionné avec la marge du bloc précédent) et espace minimal en dessous (l’espace exact avec snapToGrid: false). Un encadré flottant (placement: 'top', 'bottom' ou 'auto') garde l’écart des flottants, une ligne de texte, entre sa bande et le texte ; un marginBottom plus grand fixe l’espace sous un encadré dans une bande de tête, et un marginTop plus grand l’espace au-dessus d’un encadré dans une bande de pied, arrondi à la grille avec la bande. Jusqu’à postext 1.4, un encadré flottant ignorait ses marges. |
snapToGrid | boolean | true | Avec true, le flux qui suit l’encadré revient sur la grille de ligne de base, si bien que l’espace en dessous est marginBottom arrondi à un nombre entier de lignes de la grille. Avec false, l’encadré garde son marginBottom exact, qui fusionne avec la marge supérieure du bloc suivant (deux encadrés consécutifs d’un tel style sont séparés d’exactement max(marginBottom, marginTop)), et le texte qui le suit peut se trouver hors de la grille jusqu’au point de recalage suivant (un titre, la fin d’une liste), comme après un titre avec headings.. Destiné aux documents faits d’encadrés empilés (fiches d’exercices, formulaires). Il s’applique aux encadrés dans le flux ; les encadrés sur toute la largeur de la page dans une mise en page à plusieurs colonnes, ainsi que les encadrés flottants, fixes et latéraux, gardent la grille, puisque les bandes de colonnes et les zones de flottants sont disposées sur elle. Les leviers d’équilibrage des colonnes ne changent pas : un encadré qui clôt une colonne est toujours repoussé jusqu’au dernier emplacement de grille de la colonne. |
keepTogether | boolean | true | Avec true, l’encadré est gardé entier : un encadré qui ne tient pas dans l’espace restant passe en entier à la colonne ou à la page suivante. Seul un encadré plus haut qu’une colonne vide et pleine (une page entière pour un encadré span: 'page') ne peut pas être gardé entier : il se coupe selon les règles de false ci-dessous au lieu de déborder, en commençant là où il apparaît, et une suite qui tient dans une colonne passe ensuite en entier ; un encadré flottant (placement: 'top' | 'bottom' | 'auto') aussi haut ne flotte pas, mais reste dans le flux là où il apparaît. Avec false, tout encadré peut se couper entre ses blocs enfants ou entre les lignes d’un paragraphe ou d’un élément de liste : la coupe la plus basse qui tient ferme la colonne en cours (ou, pour un encadré span: 'page', la page, au ras du bas des colonnes), et le reste continue en haut de la suivante dans un encadré à lui, avec le même cadre et la même bande, sans icône et sans titre sauf si repeatTitle le répète, et se coupe de nouveau s’il est encore trop haut. Le texte de chaque fragment garde la colonne qu’une icône en ligne occupe sur la tête, vide, si bien que l’encadré a une seule justification sur toutes les pages. Une coupe dans un élément de liste laisse sa puce avec la tête. Le cadre de chaque fragment partage le contentIndex / containerId de la clôture et enregistre callout.part / callout.continued. Utilisez-le sur un long encadré de « points clés » en fin de chapitre avec headings., ou sur un style de note dont les encadrés ne doivent jamais chasser une figure de la page. Un encadré imbriqué (un :::callout dans un autre) est un enfant de son parent : une coupe peut tomber avant ou après lui, et à l’intérieur seulement quand son propre style permet la coupe (keepTogether: false, ou plus haut qu’une colonne pleine), selon son propre splitMinLines. |
splitMinLines | number | 2 | Nombre minimal de lignes de texte qu’un fragment d’encadré coupé (keepTogether: false, ou un encadré à garder ensemble plus haut qu’une colonne pleine) garde de chaque côté de la coupe. Il ne protège que le texte : un côté qui contient au moins une figure, un tableau, une formule centrée ou un encadré imbriqué est acceptable quel que soit son nombre de lignes, si bien qu’un encadré d’images peut en laisser une seule sur une page. Une coupe dans un paragraphe ou un élément de liste compte toujours toutes les lignes de chaque côté (une figure ou une formule y comptant pour une ligne), et laisse aussi au moins layout. lignes de ce paragraphe ou de cet élément de chaque côté (deux par défaut ; ce minimum quand il est plus bas, si bien que 1 autorise une ligne). Avec les valeurs par défaut, un élément de deux ou trois lignes n’est jamais coupé et un élément de quatre lignes ne se coupe qu’en deux et deux. Avec la valeur par défaut, aucun encadré ne se coupe en laissant une ligne de texte isolée au pied d’une colonne ou en tête de la suivante ; quand aucune coupe ne satisfait le minimum, l’encadré passe en entier. (Avant postext 1.5, une coupe dans un paragraphe ne vérifiait que les lignes de tout le côté, si bien qu’un élément de deux lignes pouvait se couper en une et une quand d’autres lignes de l’encadré complétaient le minimum.) |
repeatTitle | boolean | false | Répète le titre en tête de chaque suite d’un encadré coupé, suivi de continuedSuffix (« Key points (cont.) »). La répétition prend le style du titre. Un encadré sans titre ne répète rien. Voir Marques sur un encadré coupé. |
continuedSuffix | string | '(cont.)' | Texte qui suit le titre répété, dans la langue du document (locale, sinon la langue de césure), comme celui d’un tableau coupé, et joint au titre comme pour un tableau. |
continuesMarkerEnabled | boolean | false | Place continuesMarker sous la dernière ligne de chaque partie d’un encadré coupé qui se poursuit, à l’intérieur de l’encadré. |
continuesMarker | string | 'Continued' / 'Continúa' | Texte de cette marque (le « (MORE) » d’un scénario), dans le caractère et la taille du texte de l’encadré, selon la langue du document. |
continuesMarkerAlign | 'left' | 'center' | 'right' | 'right' | Position de la marque dans la largeur intérieure de l’encadré. |
continuesMarkerItalic | boolean | true | Compose la marque en italique. |
numbering | { label, counter, numberingTemplate, resetOn, counterFormat, placement, bold, italic, suffix } | non défini | Compte les encadrés de ce style comme des énoncés numérotés : théorèmes, lemmes, définitions. Voir Énoncés numérotés et démonstrations. |
endMark | string | '' | Une marque placée au fer à droite à la fin de la dernière ligne de l’encadré, comme une démonstration se termine par '∎' ou '□' : sur la dernière ligne quand elle tient après une espace, sinon sur une ligne à part. Un encadré qui se termine par une formule centrée sans numéro la prend comme étiquette de la formule. Avec les mathématiques activées, les carrés (∎ □ ■ ▪ ◻ ▫) sont dessinés à partir des glyphes de TeX, si bien qu’un caractère qui ne les a pas (les fichiers latin de Fontsource) les imprime quand même ; avec les mathématiques désactivées, ils sont composés dans le caractère du texte de l’encadré. |
#Le conteneur :::callout
Une ligne :::callout{type="<id>"} ouvre l’encadré et une ligne ::: seule le ferme. La clôture accepte cinq attributs : type (l’id du style), title (remplace le titre du style), span, placement et columns (remplacent les valeurs du style) ; le contenu placé entre les deux est mis en page dans l’encadré : un titre facultatif, puis les paragraphes, listes, citations, formules ou ressources intégrées, chacun composé avec la typographie body / lists du style (les titres gardent leurs styles habituels). Les marges entre enfants fusionnent comme dans le texte courant ; l’intérieur quitte la grille de ligne de base, et le flux y revient après l’encadré avec au moins marginBottom en dessous (la grille l’emporte ; la marge est un minimum, la même convention que suivent les ressources). Un style avec snapToGrid: false garde plutôt le marginBottom exact, et le texte qui suit l’encadré reste hors de la grille jusqu’au titre suivant ou à la fin d’une liste. Un titre placé juste avant un encadré reste avec lui.
Limites de cette version :
- Un encadré est gardé entier, sauf si son style fixe
keepTogether: false. Quand il ne tient pas dans l’espace restant de la colonne, il passe en entier à la colonne ou à la page suivante, y compris hors d’une colonne vide que des bandes de flottants ou un plafond de bande ont raccourcie, pourvu qu’une colonne pleine puisse le contenir. Un encadré plus haut qu’une colonne pleine se coupe au contraire, comme un encadré sécable ; seul celui qu’aucune coupe ne peut diviser (une figure ou un tableau plus haut que la colonne, ou unsplitMinLinesqu’aucune coupe ne satisfait) est placé malgré tout et déborde ; la mise en page enregistre alors un avertissementcalloutOverflow(VDTDocument.warnings), que le Sandbox liste. Un groupe:::columnsse coupe comme l’encadré qui l’entoure, entre ses sous-colonnes (depuis postext 1.25) ; il reste entier, et peut déborder de la même façon, seulement aveclayout.flowColumns: falseou à l’intérieur d’un encadré imbriqué. Un encadré sécable laisse derrière lui la partie qui tient (des enfants entiers, ou les lignes d’un paragraphe jusqu’àsplitMinLinesde chaque côté ; une figure, un tableau ou une formule centrée suffisent à eux seuls pour un côté) et continue dans un encadré sans icône sur la colonne ou la page suivante, sans le titre sauf si le style le répète, et éventuellement avec une marque sous la partie qu’il laisse (voir Marques sur un encadré coupé). - Les flottants cèdent la place à un encadré insécable. Quand le bloc qui suit immédiatement la référence d’une figure est un encadré
keepTogether, un emplacement qui ne laisserait à l’encadré aucune colonne de la bande en cours où se poser (la colonne de la référence ou une colonne vide après elle, qui le contenait avant le flottant) n’est pas pris : la figure passe à son emplacement suivant, en général la page suivante, et l’encadré reste dans le flux, comme le composerait un compositeur, plutôt que de chasser l’encadré de la page et de laisser la colonne avec la figure seule. span: 'page'dans une mise en page à plusieurs colonnes fait de l’encadré un bloc pleine largeur : il est mis en page sur toute la largeur de contenu et découpe la page en bandes de colonnes ; les colonnes de texte au-dessus sont fermées à la ligne de coupe, l’encadré occupe sa propre colonne pleine largeur, et une nouvelle bande de colonnes de texte s’ouvre en dessous, si bien que le flux continue sous l’encadré dans chaque colonne. Là où les colonnes sont à niveau (en haut d’une page, juste sous un titre d’ouverturespan: 'page', juste sous un autre bloc pleine largeur, ou juste sous une bande de flottants de tête), l’encadré coupe simplement à cet endroit. S’il arrive en milieu de page, avec des colonnes inégales, il est composé comme le ferait un compositeur : le texte au-dessus est coupé à niveau sur toutes les colonnes (le moteur relance le placement avec les colonnes de la bande raccourcies au même nombre de lignes de grille, si bien que le texte passe naturellement d’une colonne à l’autre et que chaque règle d’orpheline, de veuve et de maintien avec le suivant s’applique toujours), l’encadré couvre la page et les colonnes reprennent en dessous. La coupe demande quelques passes de placement supplémentaires ; quand la ligne de coupe ne laisserait pas de place pour l’encadré plus le minimum de lignes de texte contre les veuves en dessous, ou qu’aucune disposition ne convient après quelques essais, l’encadré passe en haut de la page suivante. Le texte au-dessus respecte la coupe : un paragraphe qui ne peut pas commencer dans les quelques lignes qu’une colonne garde sous une figure au-dessus de la coupe passe à la colonne suivante (la figure reste alors seule dans sa colonne), et quand un bloc dépasserait encore la coupe, la coupe est prise une ligne plus bas plutôt qu’à la fin de ce bloc. Un encadré coupé qui ouvre la bande est coupé là aussi, si bien que son reste ne dépasse jamais la coupe. Avecheadings.balancing.beforeSpan(la valeur par défaut), la bande qu’il quitte est coupée à niveau derrière lui (comme la bande qui clôt un chapitre) et, quand le style permet la coupe (keepTogether: false), la partie de l’encadré qui tient sous les colonnes mises à niveau ferme la page et le reste ouvre la suivante ; avecbeforeSpan: false, la page qu’il quitte est simplement équilibrée comme d’habitude, sans forcer de saut de page. Un titre placé juste avant un bloc pleine largeur ne voyage pas avec lui. Dans les mises en page à une colonne,span: 'page'est simplement en ligne.placement: 'fixed'retire l’encadré du flux : il est mis en page (width: 'auto's’ajuste au titre ;'fill'prend la largeur de la colonne de texte sous le point d’ancrage) et épinglé sur la page où il apparaît dans le flux, à la position que décriventfixed.anchor/fixed.offset(par défaut, le coin inférieur gauche de la zone de contenu). Les colonnes de texte qu’il recouvre lui cèdent cette zone (coupée par le bas, ou par le haut quand la colonne est encore vide), exactement comme une bande de flottants ; quand la zone contient déjà du texte, un flottant ou un bloc pleine largeur, l’encadré passe à la page suivante. Un encadré fixe qui clôt le chapitre (le bloc suivant est une ouverture de chapitre, un:::part, un encadré barrière pour les flottants ou la fin du document) met d’abord à niveau les colonnes au-dessus de lui (headings.balancing.trailing), si bien qu’une dernière page courte se termine à niveau avec le badge en dessous. Le cadre et les enfants vivent danspage.floatset sont rendus hors du découpage des colonnes dans tous les moteurs de rendu.placement: 'top' | 'bottom'fait flotter l’encadré comme une ressource : il quitte le flux là où il apparaît et prend la première bande libre après ce point (le pied de la page en cours ('bottom'), ou la tête / le pied de la page suivante qu’ouvre le flux), à la largeur de la colonne (span: 'column') ou sur toute la largeur de contenu (span: 'page') ; le texte qui le suit remplit la page qu’il a quittée. Son cadre et ses enfants vont danspage.floats, comme pour un encadré fixe. Un encadré flottant en tête d’une nouvelle page est placé avant les figures qui attendent cette page, et une figure citée sur une page précédente qui tient ensuite sous lui prend le reste de cette page même quand il resterait moins de trois lignes de texte (une page de galerie : encadré plus figure, sans texte entre eux). Un encadréspan: 'side'ne flotte jamais : il s’empile à côté du texte quel que soit son placement. Aveccolumnssupérieur à 1 (dans le style ou comme attribut de la clôture, depuis postext 1.18), un encadréspan: 'column'occupe autant de colonnes adjacentes : la tête d’une suite de colonnes vides qui commencent à niveau, ou le pied de la colonne en cours et des colonnes vides qui la suivent, comme dans:::callout{placement="top" columns="2"}.width: 'auto's’ajuste au titre seulement ; les enfants sont ignorés.- Un
:::calloutimbriqué dans un autre encadré est un encadré à part entière : il est mis en page avec son propre style (fond, bordure, rayon, marge intérieure, bande, titre, icône, marque, onglet, typographie) sur toute la largeur intérieure de son parent et s’empile comme un enfant de celui-ci, sesmarginTop/marginBottomfusionnant avec ses voisins. Sonspanet sonplacement(de la clôture ou du style) sont ignorés (un encadré imbriqué suit toujours le flux de son parent), tout commefloatBarrieretsnapToGrid. Les encadrés s’imbriquent à toute profondeur et peuvent se trouver dans un groupe:::columns(chacun entier, dans une colonne). Quand le parent se coupe, la coupe tombe avant ou après un encadré imbriqué, ou à l’intérieur quand le style imbriqué permet la coupe ; chaque fragment redessine les cadres qu’il traverse, et un encadré imbriqué qui continue depuis le fragment précédent perd son titre et son icône, comme une suite de premier niveau. - Un groupe
:::columns{count=N}…:::parmi les enfants dispose ces enfants enNcolonnes de même largeur, séparées decolumnGap, dans l’encadré : la suite est coupée aux limites de bloc ou de ligne qui mettent le mieux les colonnes à niveau (un paragraphe ou un élément de liste coupé au milieu continue en tête de la colonne suivante sans sa puce), chaque colonne commence en haut du groupe et le groupe est aussi haut que sa colonne la plus haute ; les enfants qui le suivent reviennent à toute la largeur. Un encadré qui se coupe (keepTogether: false, ou plus haut qu’une colonne) coupe aussi à l’intérieur d’un groupe, entre ses colonnes : un groupe en serpentin remplit ses colonnes tour à tour et continue dans le fragment suivant, un groupe parallèle (breaks) continue flux par flux (depuis postext 1.25 ; voir Format du document ›:::columns). Ungapsur la clôture remplacecolumnGappour ce groupe, etruletrace un filet dans chaque gouttière. Utilisez-le pour un résumé des points clés sur deux colonnes, ou pour les tableaux d’un large encadré placés côte à côte. - Le sixième attribut de la clôture,
label, s’imprime sur l’onglet du style (voirlabelplus haut) ::::callout{type="box" label="BOX 1-1" title="The octet rule"}; sans stylelabel, l’attribut est ignoré.
Dans le VDT, l’encadré est un bloc cadre type: 'callout' dont la décoration (fond, bande, icône, titre) vit dans designOverlay, suivi de ses blocs enfants dans la même colonne ; le cadre et chaque enfant portent le containerId de la clôture. Un encadré imbriqué est un cadre type: 'callout' à part parmi les enfants, suivi de ses blocs ; ceux-ci gardent le containerId de la clôture de premier niveau (le placement et l’équilibrage voient toujours une seule unité) et ajoutent calloutPath, les id de conteneur des clôtures imbriquées qui les entourent, de la plus extérieure à la plus intérieure (l’id propre d’un cadre imbriqué est la dernière entrée). Le PDF balisé donne à chaque encadré imbriqué un Div à l’intérieur de celui de son parent. Les images d’icône se résolvent comme les images de ressource : le registre d’images du canvas, l’option HTML resourceImageUrl et le fournisseur PDF resourceBytes.
const resolved = resolveCalloutStylesConfig(config.calloutStyles, resolvedBodyText, resolvedHeadings, resolvedUnorderedLists, config.locale);
// => every inherited field filled from the resolved sections; the optional
// locale picks the language of the continuation strings
const minimal = stripCalloutStylesDefaults(config.calloutStyles);
// => undefined for the built-in `note` default; static defaults dropped#Énoncés numérotés et démonstrations
Un style doté de numbering compte ses encadrés, comme amsthm de LaTeX compte les environnements de théorème (depuis postext 1.19). Chaque encadré imprime son étiquette et son numéro (« Theorem 2. » en ouverture de son premier paragraphe), et le title de la clôture suit le numéro entre parenthèses : :::callout{type="theorem" title="Bradley–Terry"} s’ouvre sur « Theorem 2 (Bradley–Terry). ». Un encadré ouvert avec un identifiant ({#thm:main}) est une cible de renvois, qui impriment « Theorem 2 » (:ref{id="thm:main"}), et \ref{thm:main} ou style=number imprime 2.
| Champ | Type | Par défaut | Description |
|---|---|---|---|
label | string | — | Le mot avant le numéro : 'Theorem', 'Lemma', 'Definición'. |
counter | string | false | l’id du style | Le compteur que les encadrés font avancer. Les styles qui nomment un même compteur le partagent, comme le fait \newtheorem{lemma}[theorem] : Theorem 1, Lemma 2, Theorem 3. 'equation' compte avec les équations étiquetées. false imprime l’étiquette sans numéro (le « Proof. » d’une démonstration). |
numberingTemplate / resetOn / counterFormat | string / ResourceCounterReset / ResourceCounterFormat | '{n}' / 'never' / 'decimal' | Comme pour un type de ressource : '{h1}.{n}' avec resetOn: 'h1' numérote Theorem 2.1, 2.2… par chapitre ; '{h1}.{h2}.{n}' avec 'h2', par section. Un compteur partagé par plusieurs styles compte sur ce que leurs modèles impriment. Un jeton prend un style après deux-points, comme pour un type de ressource : '{h1:A}.{n}' imprime Theorem A.1 dans une annexe désignée par une lettre. |
placement | 'runIn' | 'title' | 'runIn' | 'runIn' ouvre le premier paragraphe de l’encadré avec l’étiquette (un encadré qui s’ouvre sur une liste, une formule ou un autre encadré reçoit un paragraphe pour elle) ; 'title' fait de l’étiquette le titre de l’encadré, dans son titleStyle : « Theorem 2 (Bradley–Terry) ». |
bold / italic | boolean | true / false | Le style de l’étiquette en ligne et de son suffixe, quel que soit le texte de l’encadré : un texte en italique (body.italic) garde en romain une étiquette en romain. Le titre entre parenthèses est composé en romain, dans la graisse normale. |
suffix | string | '.' | Placé après l’étiquette en ligne et son titre. |
Une démonstration est un style avec une étiquette non numérotée et une marque de fin :
calloutStyles: [
{ id: 'theorem', numbering: { label: 'Theorem' }, body: { italic: true } },
{ id: 'lemma', numbering: { label: 'Lemma', counter: 'theorem' }, body: { italic: true } },
{ id: 'definition', numbering: { label: 'Definition' } },
{ id: 'proof', backgroundEnabled: false, endMark: '□',
numbering: { label: 'Proof', counter: false, bold: false, italic: true } },
]Dans un livre mis en page chapitre par chapitre, les compteurs reprennent depuis le chapitre précédent (LayoutContinuation.statementCounters, que remplit continuationAfter), et le plan du livre donne à l’ancre de chaque encadré numéroté son étiquette (OutlineEntry.numberLabel), si bien qu’un renvoi depuis un autre chapitre l’imprime.
#Typographie dans un encadré
Un encadré compose son contenu avec sa propre typographie body et lists ; tout le reste garde les styles du document :
- Les paragraphes prennent le
bodyde l’encadré : caractère, taille, interlignage, couleur, couleurs d’emphase, graisses,italic,smallCaps, alignement, césure, retrait et espacement des paragraphes. Un champ non défini hérite debodyText. Une couleur d’emphase héritée garde son lien à la palette, si bien que le gras, l’italique et les étiquettes:refd’un encadré changent aveccolorPalettecomme à l’extérieur. (Jusqu’à postext 1.4, le gras d’un encadré restait#295AA3quelle que soit la Main Color.) - Les listes à puces prennent les
listsde l’encadré (caractère de puce, couleur, taille et graisse du glyphe, retrait, écart, espacement des éléments) par-dessusunorderedLists, et leur texte est le texte de l’encadré. Unlists.bulletCharou unlists.colordifférent de celui du document (unorderedLists) remplace la puce ou la couleur de tous les niveaux ; s’il le répète, ou s’il n’est pas défini, chaque niveau garde la sienne (unorderedLists.levels), si bien que les tirets imbriqués survivent dans l’encadré. - Les listes numérotées prennent
lists.indent,gapetitemSpacing, etlists.colordès que le style le fixe, y compris quand c’est la couleur de puce du document ; un style qui ne le fixe pas garde les numéros dansorderedLists.color. (Jusqu’à postext 1.4, la couleur n’atteignait les numéros que si elle différait deunorderedLists.color, si bien que lui donner cette couleur même n’avait aucun effet.) Le numéro lui-même (son caractère, sa taille et son séparateur) vient duorderedListsglobal, puisquelistsn’a que des champs de puce : c’est là qu’il faut styler les numéros d’un encadré. - Les
:::paragraphsdans un encadré utilisent leur style de paragraphe, dans les encadrés imbriqués aussi. Les champs que le style laisse non définis héritent dubodyTextdu document, non dubodyde l’encadré (ni de son italique ou de ses petites capitales). - Les groupes
:::columnsn’ont pas de style propre : toutes les colonnes partagent la typographie du texte et des listes de l’encadré, etcolumnGapfixe l’écart entre elles. - Les citations prennent le caractère, la taille et les graisses du texte de l’encadré (en italique et en gris, comme dans le texte courant), ainsi que ses petites capitales. Les titres gardent les styles de titre ; les formules centrées, les réglages mathématiques.
- Les figures et tableaux gardent les styles de légende et de tableau du document, à la largeur intérieure de l’encadré ; leurs graisses normale et grasse suivent les graisses du
bodyde l’encadré. - Les pastilles gardent leur style de pastille ; une taille en
emse lit par rapport à la taille du texte de l’encadré. :::spacese mesure en lignes du texte de l’encadré (voir:::spacepour les cas où il est supprimé).- Un encadré imbriqué prend entièrement son propre style ; ses
span,placement,floatBarrieretsnapToGridsont ignorés.
#Marques sur un encadré coupé
Quand un encadré se coupe entre colonnes ou pages (keepTogether: false, ou un encadré plus haut qu’une colonne), chaque partie après la première s’ouvre sans le titre ni l’icône, et par défaut rien n’indique au lecteur que l’encadré continue. Deux options ajoutent les marques qu’emploie un livre ou un scénario :
repeatTitle: truerépète le titre en tête de chaque suite, suivi decontinuedSuffix(« Key points (cont.) » par défaut). La répétition prend le style du titre : avectextTransform: 'uppercase', elle donne le « HAMLET (CONT'D) » d’un scénario. L’icône et l’onglet restent sur la première partie.continuesMarkerEnabled: trueplacecontinuesMarker(« Continued », ou « Continúa » dans un document espagnol) sous la dernière ligne de chaque partie qui se poursuit, à l’intérieur de l’encadré, dans le caractère et la taille du texte de l’encadré : en italique sauf sicontinuesMarkerItalicvautfalse, au fer à droite sauf sicontinuesMarkerAlignindique'left'ou'center'. La marque prend de la place dans la partie qu’elle clôt, et la coupe est choisie pour qu’elle tienne.
calloutStyles: [{
id: 'speech',
keepTogether: false,
titleStyle: { textTransform: 'uppercase' },
repeatTitle: true,
continuedSuffix: "(CONT'D)",
continuesMarkerEnabled: true,
continuesMarker: '(MORE)',
continuesMarkerAlign: 'center',
continuesMarkerItalic: false,
}],:::callout{type="speech" title="Hamlet"}
A speech long enough to run over the foot of the page…
:::La partie qui clôt la page se termine par « (MORE) », et la page suivante s’ouvre sur « HAMLET (CONT'D) ». Les deux relèvent de l’habillage de pagination : dans un PDF accessible, ce sont des artefacts, et dans le HTML elles sont masquées aux technologies d’assistance, si bien que le titre n’est lu qu’une fois. Dans le VDT, ce sont des blocs de texte designOverlay marqués artifact: true.