Vai al contenuto principale

Capitolo 3.12 · Parte II · Il mestiere

Configurazione: riquadri

Stili con nome per i riquadri :::callout: cornice, sfondo, fascia, titolo, icona e marcatore, enunciati numerati, tipografia dentro il riquadro e riquadri divisi tra più pagine

Aggiornato 2026-10-1627 minNel capitolo 3 Configurazioneenescadefritptzhjaar

In breve

Questa pagina riguarda i riquadri che separano dal testo una nota, un suggerimento, un’avvertenza o un elenco di obiettivi. Dai a ogni tipo di riquadro un nome e un aspetto: lo sfondo, il bordo, una fascia colorata, un titolo e un’icona. Un riquadro può avere un numero, come un teorema o un esempio in un libro di testo. Scegli i font dentro il riquadro. Quando un riquadro lungo continua nella pagina seguente, scegli che cosa segna l’interruzione.

#Stili dei riquadri

La proprietà calloutStyles dichiara gli stili di riquadro con nome che un documento applica con un contenitore :::callout{type="…"}: note, suggerimenti, avvertenze, obiettivi di apprendimento, qualsiasi contenuto separato dal testo corrente in un riquadro colorato o bordato. Per impostazione predefinita è incluso uno stile neutro, note (sfondo grigio chiaro, nessun bordo, nessuna fascia, nessuna icona, nessun titolo), così :::callout funziona senza alcuna configurazione; dichiarare calloutStyles sostituisce questo elenco predefinito.

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.
:::
ProprietàTipoPredefinitoDescrizione
idstring—Identificatore selezionato da :::callout{type="…"}. Un recinto con un type sconosciuto o assente usa il primo stile configurato (la Sandbox segnala i tipi sconosciuti).
namestringidNome leggibile (solo nell’interfaccia dell’editor).
titlestring''Testo predefinito del titolo; vuoto significa nessun titolo. L’attributo title del recinto lo sostituisce caso per caso.
span'column' | 'page' | 'side''column'Estensione orizzontale: la colonna, l’intera larghezza del contenuto, o la colonna laterale riservata agli elementi flottanti di un’impaginazione a colonna e mezza (layout.sideColumnRole: 'floats'); in quest’ultimo caso il riquadro esce dal flusso e si impila in quella colonna accanto al testo che interrompe. Si può sostituire caso per caso con l’attributo span. Nelle impaginazioni a più colonne un riquadro 'page' diventa un blocco a tutta larghezza: divide la pagina in fasce di colonne e sta in una propria colonna a tutta larghezza (vedi più avanti la sezione sul contenitore). Un riquadro laterale che la colonna laterale della sua pagina non può contenere prende la colonna laterale della pagina successiva; dove il capitolo (o il documento) finisce prima, ogni riquadro ancora in attesa si compone nella colonna laterale di una pagina dopo il testo, nell’ordine dei suoi recinti, e la build lo segnala (afterText; fino a postext 1.24 i riquadri dopo la prima pagina del genere venivano scartati).
columnsnumber1Quante colonne adiacenti occupa un riquadro flottante (placement 'auto', 'top' o 'bottom', con span: 'column'), come fa placement.columns per una figura: il riquadro di un articolo su tre delle cinque colonne di un giornale. Tante colonne quante ne ha la pagina, o di più, ne fanno un riquadro a tutta larghezza. Un riquadro composto nel flusso ('here') resta nella sua colonna. Si può sostituire caso per caso con l’attributo columns. Da postext 1.18.
placement'here' | 'auto' | 'top' | 'bottom' | 'fixed''here'Dove va il riquadro. 'here' lo compone in linea nel flusso; 'top' / 'bottom' lo fanno flottare come una risorsa ('auto' prende la prima fascia libera, di testa o di piede): esce dal flusso nel punto in cui compare e prende la prima fascia libera in quel punto o dopo (il piede della pagina corrente, o la testa / il piede della pagina successiva che il flusso apre), e il testo che lo segue riempie la pagina attorno a esso; 'fixed' lo ancora a coordinate della pagina tramite fixed qui sotto, fuori dal flusso delle colonne. Vedi la sezione sul contenitore per i dettagli. Si può sostituire caso per caso con l’attributo placement.
sideAtColumnEnd'before' | 'after''before'Dove sta un riquadro laterale (span: 'side') quando il testo dopo il suo recinto non prosegue nella stessa colonna: la colonna non ha più spazio per esso, oppure le regole di interruzione lo mandano avanti (un paragrafo che le regole su vedove e orfane spostano intero, un titolo tenuto con il suo testo). 'before' lo tiene al suo recinto, in quella pagina, accanto al testo che lo precede, risalendo dal piede della colonna quando non ci sta sotto il recinto: il posto per una glossa scritta dopo il passo che spiega. 'after' lo allinea alla prima riga del testo dopo il recinto, nella colonna laterale della pagina in cui quel testo prosegue: il posto per un numero di riga o un titolo marginale scritto prima della sua riga. Quando il testo prosegue nella stessa colonna, entrambi compongono il riquadro al suo recinto. Un riquadro che nel suo capitolo non è seguito da nulla resta comunque con il testo che lo precede, e i riquadri laterali con recinti consecutivi mantengono il loro ordine. Fino a postext 1.4 ogni riquadro laterale si comportava come 'before', che resta il valore predefinito: uno stile per le glosse tiene i suoi riquadri nella pagina del passo che spiegano.
fixedPosizione di un riquadro 'fixed': un ElementAnchor (to: 'container' = l’area del contenuto della pagina, specchiata sulle pagine pari; 'page' = il formato rifilato; 'bleed' = l’area con l’abbondanza; edge: uno dei nove bordi del contenitore) più un offset facoltativo (dimensioni x / y).
floatBarrierbooleanfalseFa del riquadro una barriera per gli elementi flottanti: ogni figura o tabella richiamata prima di esso viene collocata prima di esso (negli spazi liberi della pagina, altrimenti in pagine aperte prima del riquadro), così nessun elemento flottante scavalca il riquadro di chiusura di un capitolo (tipicamente un riepilogo dei «punti chiave»). Le aperture di capitolo, :::part e la fine del documento sono sempre barriere.
Un riquadro span: 'page' su una pagina a più colonne taglia la fascia sotto il testo che segue; una figura a tutta larghezza richiamata prima di esso prende per prima quel taglio: il testo viene livellato, la figura si colloca proprio dove esso è finito, e il riquadro prosegue sotto di essa (o alla pagina successiva quando non ci sta più). Una figura troppo alta per seguire il testo livellato apre invece la pagina successiva, con il riquadro dopo di essa, e la fascia che ha lasciato termina comunque livellata. Un riquadro divisibile (keepTogether: false) si apre sotto il testo e la figura con tutti gli elementi che ci stanno, e il resto prosegue nella pagina successiva.
width'fill' | 'auto''fill''fill' occupa la larghezza disponibile; 'auto' si adatta al titolo (uso come etichetta) e ignora i figli.
backgroundEnabled / backgroundboolean / ColorValuetrue / #f4f4f4Riempimento del riquadro.
border{ enabled, color, width }false, #cccccc, 0.5ptContorno del riquadro, tracciato all’interno del bordo del riquadro come il bordo di un elemento riquadro (vedi Elementi riquadro).
borderRadiusDimension0Raggio degli angoli dello sfondo / del bordo (limitato a metà della larghezza e dell’altezza del riquadro). La fascia lo segue: su un riquadro arrotondato la fascia è ritagliata dalla cornice arrotondata, come CSS ritaglia un border-left con border-radius. La linguetta label mantiene gli angoli vivi.
padding{ top, right, bottom, left }0.75em ciascunoDistanza tra il bordo del riquadro e il suo contenuto. I valori in em sono relativi al corpo del testo del riquadro.
stripe{ enabled, side, width, color }false, 'left', 1.5em, colore principaleFascia piena lungo un bordo. Una fascia 'left' / 'right' restringe il contenuto; una fascia 'top' lo spinge in basso. 'left' e 'right' sono lati del flusso del testo (in un libro da destra a sinistra 'left' è la destra del foglio); 'start' e 'end' seguono la direzione propria del riquadro, quindi un :::callout{dir=ltr} in un libro arabo mette a sinistra una fascia 'start'. Su un riquadro con borderRadius i suoi angoli esterni si arrotondano come quelli della cornice (fino a postext 1.4 restavano vivi e sporgevano oltre l’arrotondamento).
icon{ kind, glyph, resourceId, fontFamily, fontWeight, size, width, color, align, position, cornerSide }'none', font dei titoli, 400, 1.5em, colore principale, 'top', 'inline', 'right'Un glifo di testo (kind: 'glyph') o una risorsa bitmap / SVG (kind: 'resource' + resourceId) accanto al contenuto. Con una fascia laterale l’icona si centra sulla fascia; altrimenti riserva una propria colonna (size + titleStyle.gap). align: 'center' la centra verticalmente sul contenuto. Un’immagine di risorsa si adatta al quadrato mantenendo le proporzioni, oppure a un riquadro width × size quando è impostato width (una larga striscia di icone); un’icona più alta del contenuto fa crescere il riquadro per contenerla (e, con align: 'center', centra il contenuto su di essa). position: 'corner' appende l’icona a un angolo superiore come un’etichetta, per metà oltre il bordo, senza togliere spazio al contenuto; un’icona larga (width) si centra sull’angolo in base alla larghezza a cui è disegnata, e sull’angolo sinistro il titolo inizia oltre la sua metà interna (fino a postext 1.4 si collocava in base all’altezza, quindi una striscia larga sporgeva dal riquadro e sopra il titolo); cornerSide sceglie l’angolo: 'right' / 'left', oppure 'outer' / 'inner', che seguono la parità della pagina dei margini speculari (esterno = destra su un recto, sinistra su un verso).
marker{ kind, glyph, resourceId, fontFamily, fontWeight, size, color, align, gap, rule }'none', font dei titoli, 400, 1.5em, colore principale, 'center', 0.5em, filetto disattivato (0.5pt, colore principale, lunghezza 0)Una seconda icona disegnata fuori dal riquadro, in una colonna alla sua sinistra, con un rule verticale facoltativo tra essa e il riquadro: la mano «tocca qui» accanto a un’etichetta di autovalutazione. La cornice diventa [marker][rule][gap][box] e alta quanto il più alto dei tre; align li centra l’uno sull’altro o li allinea in alto. rule.length è un minimo: il filetto copre sempre almeno l’altezza del riquadro.
titleStyle{ fontFamily, fontSize, fontWeight, italic, color, textTransform, gap, letterSpacing, indent, lineHeight }font dei titoli, corpo del testo corrente, 700, false, colore principale, 'none', 0.5em, 0, 0, 1.2emTipografia del titolo. gap è lo spazio tra il titolo e il primo figlio (e lo spazio della colonna dell’icona). lineHeight è l’interlinea delle righe del titolo, con em riferito alla dimensione propria del titolo; la linea di base sta a 0,8 di essa dall’alto di ogni riga, come nel testo corrente, quindi un titolo sull’interlinea del testo corrente (lineHeight: 12pt su una griglia di 12 pt) mantiene un riquadro di un numero intero di righe e il suo titolo sulla griglia, mentre l’1,2 em predefinito aggiunge una frazione di riga a ogni riquadro. textTransform: 'uppercase' conserva la lunghezza. letterSpacing applica la spaziatura tra lettere al titolo (letterSpacing del canvas / Tc del PDF); indent lo sposta a destra del bordo interno del riquadro. Un’etichetta d’angolo appesa sul lato del titolo (l’angolo sinistro) riserva prima il proprio spazio (la metà interna dell’etichetta più gap), così il titolo la evita su qualunque pagina capiti; indent aggiunge soltanto oltre quello.
body{ fontFamily, fontSize, lineHeight, color, boldColor, italicColor, fontWeight, boldFontWeight, italic, smallCaps, textAlign, hyphenation, paragraphSpacing, firstLineIndent, tabStops, tabInterval }eredita da bodyText; italic / smallCaps falseTipografia dei paragrafi e degli elementi di elenco dentro il riquadro. Ogni campo non impostato eredita dal testo corrente; italicColor imposta il colore dei tratti in corsivo (una citazione in evidenza in corsivo nel colore del riquadro). fontWeight / boldFontWeight impostano i pesi dei tratti normali e in grassetto; italic compone il riquadro in corsivo, con i tratti … che passano in tondo; smallCaps lo compone in maiuscoletto; tabStops e tabInterval sostituiscono quelli del testo corrente dentro il riquadro (vedi Stop di tabulazione). Vedi Tipografia dentro un riquadro per che cos’altro prende il testo del riquadro.
lists{ bulletChar, color, indent, gap, itemSpacing, bulletFontSize, bulletFontWeight }eredita da unorderedListsTipografia degli elenchi dentro il riquadro (color, indent, gap e itemSpacing si applicano anche agli elenchi ordinati). bulletFontSize / bulletFontWeight compongono il glifo del punto elenco nel carattere del testo del riquadro con quella dimensione e quel peso (un punto elenco pesante e colorato).
label{ fontFamily, fontSize, fontWeight, color, background, position, height, paddingX, offset, inset, icon, rule }non impostato (nessuna linguetta)Una linguetta sul bordo superiore del riquadro che stampa l’attributo label del recinto: il numero di un riquadro numerato («BOX 1-1»). Aderisce all’angolo position ('top-right' / 'top-left'), rientrata di inset, sporge di offset sopra la sommità del riquadro (quello spazio fa parte del blocco, in aggiunta a marginTop, così la linguetta lo conserva anche in testa a una colonna), è alta height con paddingX su ogni lato del testo, e può portare accanto una risorsa icon ({ resourceId, width, gap }, sul lato opposto all’angolo) e un rule ({ enabled, color, width }) lungo il bordo superiore dall’angolo opposto fino a essa. Valori predefiniti: font dei titoli, corpo del testo corrente, 700, bianco sul colore principale, alta 1.4em, spaziatura interna 0.6em. La linguetta è una forma a sé appoggiata sulla cornice, quindi mantiene gli angoli vivi qualunque sia il borderRadius del riquadro.
columnGapDimension1.5emSpazio tra le colonne di un gruppo :::columns dentro il riquadro (vedi più avanti la sezione sul contenitore).
marginTop / marginBottomDimension0.75em / 0.75emSpazio sopra il riquadro (si fonde con il margine del blocco precedente) e spazio minimo sotto di esso (lo spazio esatto con snapToGrid: false). Un riquadro flottante (placement: 'top', 'bottom' o 'auto') mantiene lo spazio degli elementi flottanti, una riga di testo, tra la sua fascia e il testo; un marginBottom più ampio imposta lo spazio sotto un riquadro in una fascia di testa, e un marginTop più ampio lo spazio sopra un riquadro in una fascia di piede, arrotondato alla griglia insieme alla fascia. Fino a postext 1.4 un riquadro flottante ignorava i suoi margini.
snapToGridbooleantrueCon true il flusso dopo il riquadro torna ad agganciarsi alla griglia della linea di base, quindi lo spazio sotto di esso è marginBottom arrotondato a righe intere della griglia. Con false il riquadro mantiene il suo marginBottom esatto, che si fonde con il margine superiore del blocco successivo (due riquadri consecutivi di uno stile del genere stanno esattamente a max(marginBottom, marginTop) di distanza), e il testo che lo segue può stare fuori griglia fino al punto di aggancio successivo (un titolo, la fine di un elenco), come dopo un titolo con headings.snapToGrid: false. Pensato per documenti fatti di riquadri impilati (schede di esercizi, moduli). Si applica ai riquadri nel flusso; i riquadri a tutta larghezza in un’impaginazione a più colonne, i riquadri flottanti, fissi e laterali mantengono la griglia, perché le fasce di colonne e le zone degli elementi flottanti sono impaginate su di essa. Le leve del bilanciamento delle colonne non cambiano: un riquadro che chiude una colonna viene comunque spinto fino all’ultimo slot della griglia della colonna.
keepTogetherbooleantrueCon true il riquadro resta intero: un riquadro che non sta nello spazio rimanente passa intero alla colonna o alla pagina successiva. Solo un riquadro più alto di una colonna vuota e completa (un’intera pagina per un riquadro span: 'page') non può restare intero: si divide secondo le regole di false descritte sotto invece di eccedere, a partire dal punto in cui compare, e una continuazione che sta in una colonna passa poi avanti intera; un riquadro flottante (placement: 'top' | 'bottom' | 'auto') così alto non flotta ma resta nel flusso dove compare. Con false qualsiasi riquadro può dividersi tra i suoi blocchi figli o tra le righe di un paragrafo o di un elemento di elenco: il taglio più profondo che ci sta chiude la colonna corrente (o, per un riquadro span: 'page', la pagina, a filo del fondo delle colonne) e il resto prosegue in cima alla successiva in un riquadro proprio (stessa cornice e stessa fascia, nessuna icona, e nessun titolo a meno che repeatTitle non lo ripeta), dividendosi di nuovo se è ancora troppo alto. Il testo di ogni frammento conserva, vuota, la colonna che un’icona in linea occupa nella parte iniziale, così il riquadro ha una sola giustezza su ogni pagina. Un taglio dentro un elemento di elenco lascia il suo punto elenco con la parte iniziale. La cornice di ogni frammento condivide contentIndex / containerId del recinto e registra callout.part / callout.continued. Usalo su un lungo riquadro di chiusura con i «punti chiave» insieme a headings.balancing.beforeSpan, o su uno stile di nota i cui riquadri non devono mai spingere una figura fuori dalla pagina. Un riquadro annidato (un :::callout dentro un altro) è un figlio del suo genitore: un taglio può cadere prima o dopo di esso, e al suo interno solo quando il suo stile consente la divisione (keepTogether: false, o più alto di una colonna intera), secondo il suo splitMinLines.
splitMinLinesnumber2Numero minimo di righe di testo che un frammento di un riquadro diviso (keepTogether: false, o un riquadro da tenere unito più alto di una colonna intera) conserva su ciascun lato del taglio. Protegge solo il testo: un lato che contiene almeno una figura, una tabella, una formula in evidenza o un riquadro annidato è accettabile qualunque sia il suo numero di righe, quindi un riquadro di immagini può lasciarne una sola su una pagina. Un taglio dentro un paragrafo o un elemento di elenco conta comunque tutte le righe di ciascun lato (una figura o una formula lì come una riga), e lascia anche almeno layout.boxChildSplitMinLines righe di quel paragrafo o elemento su ciascun lato (due per impostazione predefinita; questo minimo quando è inferiore, quindi 1 consente una riga). Con i valori predefiniti un elemento di due o tre righe non si divide mai e uno di quattro si divide solo due e due. Con il valore predefinito nessun riquadro si divide lasciando una riga di testo isolata al piede di una colonna o in testa alla successiva; quando nessun taglio soddisfa il minimo il riquadro passa avanti intero. (Prima di postext 1.5 un taglio dentro un paragrafo controllava solo le righe dell’intero lato, quindi un elemento di due righe poteva dividersi una e una quando altre righe del riquadro raggiungevano il minimo.)
repeatTitlebooleanfalseRipete il titolo in testa a ogni continuazione di un riquadro diviso, seguito da continuedSuffix («Punti chiave (segue)»). La ripetizione prende lo stile del titolo. Un riquadro senza titolo non ripete nulla. Vedi Segni su un riquadro diviso.
continuedSuffixstring'(cont.)'Testo dopo il titolo ripetuto, nella lingua del documento (locale, altrimenti la lingua di sillabazione), come quello di una tabella divisa, e unito al titolo come lo è quello di una tabella.
continuesMarkerEnabledbooleanfalseColloca continuesMarker sotto l’ultima riga di ogni parte di un riquadro diviso che prosegue, all’interno del riquadro.
continuesMarkerstring'Continued' / 'Continúa'Testo di quel segno (il «(MORE)» di una sceneggiatura), nel carattere e nel corpo del testo del riquadro, secondo la lingua del documento.
continuesMarkerAlign'left' | 'center' | 'right''right'Dove sta il segno nella larghezza interna del riquadro.
continuesMarkerItalicbooleantrueCompone il segno in corsivo.
numbering{ label, counter, numberingTemplate, resetOn, counterFormat, placement, bold, italic, suffix }non impostatoConta i riquadri di questo stile come enunciati numerati: teoremi, lemmi, definizioni. Vedi Enunciati numerati e dimostrazioni.
endMarkstring''Un segno allineato a destra alla fine dell’ultima riga del riquadro, come una dimostrazione termina con '∎' o '□': sull’ultima riga quando ci sta dopo uno spazio, altrimenti su una riga propria. Un riquadro che termina con una formula in evidenza senza numero lo prende come etichetta della formula. Con le formule attive, i quadrati (∎ □ ■ ▪ ◻ ▫) si disegnano dai glifi propri di TeX, quindi un carattere che non li ha (i file latini di Fontsource) li stampa comunque; con le formule disattivate si compongono nel carattere del testo del riquadro.

#Il contenitore :::callout

Una riga :::callout{type="<id>"} apre il riquadro e una riga ::: da sola lo chiude. Il recinto accetta cinque attributi, type (l’id dello stile), title (sostituisce il titolo dello stile), span, placement e columns (sostituiscono i valori dello stile), e il contenuto tra le due righe si impagina dentro il riquadro: un titolo facoltativo, poi i paragrafi, gli elenchi, le citazioni in blocco, le formule o le risorse incorporate, ciascuno composto con la tipografia body / lists dello stile (i titoli mantengono i loro stili consueti). I margini tra i figli si fondono come nel testo corrente; l’interno esce dalla griglia della linea di base, e il flusso vi si riaggancia dopo il riquadro con almeno marginBottom sotto (vince la griglia; il margine è un minimo, la stessa convenzione seguita dalle risorse). Uno stile con snapToGrid: false mantiene invece il marginBottom esatto, e il testo dopo il riquadro resta fuori griglia fino al titolo successivo o alla fine di un elenco. Un titolo subito prima di un riquadro resta unito a esso.

Limiti di questa versione:

  • Un riquadro resta intero a meno che il suo stile non imposti keepTogether: false. Quando non sta nello spazio rimanente della colonna passa intero alla colonna o alla pagina successiva, anche uscendo da una colonna vuota che fasce di elementi flottanti o un limite di fascia hanno accorciato, purché una colonna intera possa contenerlo. Un riquadro più alto di una colonna intera si divide invece, come uno divisibile; solo uno che nessun taglio può dividere (una figura o una tabella più alta della colonna, o uno splitMinLines che nessun taglio soddisfa) viene collocato comunque ed eccede; l’impaginazione registra allora un avviso calloutOverflow (VDTDocument.warnings), che la Sandbox elenca. Un gruppo :::columns si taglia come il riquadro che lo contiene, tra le sue sottocolonne (da postext 1.25); resta intero, e può eccedere allo stesso modo, solo con layout.flowColumns: false o dentro un riquadro annidato. Un riquadro divisibile lascia indietro la parte che ci sta (figli interi, o le righe di un paragrafo fino a splitMinLines su ciascun lato; una figura, una tabella o una formula in evidenza da sola basta per un lato) e prosegue in un riquadro senza icona nella colonna o pagina successiva, senza il titolo a meno che lo stile non lo ripeta, e facoltativamente con un segno sotto la parte che lascia (vedi Segni su un riquadro diviso).
  • Gli elementi flottanti cedono il passo a un riquadro indivisibile. Quando il blocco subito dopo il richiamo di una figura è un riquadro keepTogether, uno slot che non lascerebbe al riquadro alcuna colonna della fascia corrente in cui finire (la colonna del richiamo o una vuota dopo di essa, che lo conteneva prima dell’elemento flottante) non viene preso: la figura passa al suo slot successivo, di solito la pagina successiva, e il riquadro resta nel flusso, come lo comporrebbe un compositore, invece di spingere il riquadro fuori dalla pagina lasciando la colonna con la sola figura.
  • span: 'page' in un’impaginazione a più colonne fa del riquadro un blocco a tutta larghezza: si impagina all’intera larghezza del contenuto e divide la pagina in fasce di colonne; le colonne di testo sopra di esso si chiudono alla linea di taglio, il riquadro prende una propria colonna a tutta larghezza, e sotto di esso si apre una nuova fascia di colonne di testo, così il flusso prosegue sotto il riquadro in ogni colonna. Dove le colonne sono livellate (in cima a una pagina, subito sotto un titolo di apertura span: 'page', subito sotto un altro blocco a tutta larghezza, o subito sotto una fascia di elementi flottanti in testa) il riquadro taglia semplicemente lì. Quando arriva a metà pagina, con le colonne disuguali, si compone come farebbe un compositore: il testo sopra di esso viene tagliato alla stessa altezza in tutte le colonne (il motore ripete il posizionamento con le colonne della fascia accorciate allo stesso numero di righe della griglia, così il testo trabocca naturalmente da una colonna all’altra e tutte le regole su orfane, vedove e tieni con il successivo continuano ad applicarsi), il riquadro occupa tutta la larghezza della pagina, e le colonne riprendono sotto di esso. Il taglio richiede un paio di passaggi di posizionamento in più; quando la linea di taglio non lascerebbe spazio per il riquadro più il minimo di righe di testo per le vedove sotto di esso, o nessuna disposizione funziona dopo alcuni tentativi, il riquadro passa in cima alla pagina successiva. Il testo sopra rispetta il taglio: un paragrafo che non può iniziare nelle poche righe che una colonna sotto una figura conserva sopra di esso passa alla colonna successiva (la figura resta allora sola nella sua colonna), e quando un blocco supererebbe comunque il taglio, il taglio si prende una riga più in basso invece che dove termina quel blocco. Anche un riquadro diviso che apre la fascia viene tagliato lì, così il suo resto non supera mai il taglio. Con headings.balancing.beforeSpan (il valore predefinito) la fascia che lascia viene tagliata livellata dietro di esso, come la fascia di chiusura di un capitolo, e, quando lo stile consente la divisione (keepTogether: false), la parte del riquadro che sta sotto le colonne livellate chiude la pagina e il resto apre la successiva; con beforeSpan: false la pagina che lascia viene semplicemente bilanciata come al solito, senza forzare un’interruzione di pagina. Un titolo subito prima di un blocco a tutta larghezza non viaggia con esso. Nelle impaginazioni a una colonna span: 'page' è semplicemente in linea.
  • placement: 'fixed' toglie il riquadro dal flusso: viene impaginato (width: 'auto' si adatta al titolo; 'fill' prende la larghezza della colonna di testo sotto il punto di ancoraggio) e fissato alla pagina in cui compare nel flusso, nella posizione descritta da fixed.anchor / fixed.offset (per impostazione predefinita l’angolo inferiore sinistro dell’area del contenuto). Le colonne di testo che copre cedono quella zona (tagliate dal basso, o dall’alto quando la colonna è ancora vuota), esattamente come una fascia di elementi flottanti; quando la zona contiene già testo, un elemento flottante o un blocco a tutta larghezza, il riquadro passa alla pagina successiva. Un riquadro fisso che chiude il capitolo (il blocco successivo è un’apertura di capitolo, un :::part, un riquadro barriera o la fine del documento) livella prima le colonne sopra di esso (headings.balancing.trailing), così una breve pagina di chiusura termina livellata con l’etichetta sottostante. La cornice e i figli vivono in page.floats e si disegnano fuori dal ritaglio delle colonne in ogni backend.
  • placement: 'top' | 'bottom' fa flottare il riquadro come una risorsa: esce dal flusso nel punto in cui compare e prende la prima fascia libera dopo quel punto (il piede della pagina corrente, con 'bottom', o la testa / il piede della pagina successiva che il flusso apre) alla larghezza della colonna (span: 'column') o all’intera larghezza del contenuto (span: 'page'); il testo che lo segue riempie la pagina che ha lasciato. La sua cornice e i suoi figli vanno in page.floats, come per un riquadro fisso. Un riquadro flottante in testa a una pagina nuova si colloca prima delle figure in attesa di quella pagina, e una figura citata in una pagina precedente che ci sta poi sotto di esso prende il resto di quella pagina anche quando resterebbero meno di tre righe di testo (una pagina da galleria: riquadro più figura, senza testo in mezzo). Un riquadro span: 'side' non flotta mai: si impila accanto al testo qualunque sia il suo posizionamento. Con columns superiore a 1 (nello stile o come attributo del recinto, da postext 1.18) un riquadro span: 'column' occupa altrettante colonne adiacenti: la testa di una serie di colonne vuote che iniziano alla stessa altezza, o il piede della colonna corrente e di quelle vuote che la seguono, come in :::callout{placement="top" columns="2"}.
  • width: 'auto' si adatta solo al titolo; i figli vengono ignorati.
  • Un :::callout annidato dentro un altro riquadro è un riquadro a sé: si impagina con il proprio stile (sfondo, bordo, raggio, spaziatura interna, fascia, titolo, icona, segno, linguetta, tipografia) all’intera larghezza interna del genitore e si impila come uno dei suoi figli, con marginTop / marginBottom che si fondono con quelli dei vicini. I suoi span e placement (del recinto o dello stile) vengono ignorati, perché un riquadro annidato scorre sempre dentro il genitore, e così floatBarrier e snapToGrid. I riquadri si annidano a qualsiasi profondità e possono stare dentro un gruppo :::columns (ciascuno intero, in una colonna). Quando il genitore si divide, il taglio cade prima o dopo un riquadro annidato, o al suo interno quando lo stile annidato consente la divisione; ogni frammento ridisegna le cornici che attraversa, e un riquadro annidato che continua dal frammento precedente perde il titolo e l’icona, come una continuazione di primo livello.
  • Un gruppo :::columns{count=N} … ::: tra i figli impagina quei figli in N colonne di uguale larghezza, a distanza columnGap, dentro il riquadro: la sequenza si taglia ai confini di blocco o di riga che livellano meglio le colonne (un paragrafo o un elemento di elenco tagliato a metà prosegue in testa alla colonna successiva senza il suo punto elenco), ogni colonna inizia alla sommità del gruppo e il gruppo è alto quanto la sua colonna più alta; i figli successivi tornano all’intera larghezza. Un riquadro che si divide (keepTogether: false, o più alto di una colonna) taglia anche dentro un gruppo, tra le sue colonne: un gruppo a serpentina riempie a turno le sue colonne e prosegue nel frammento successivo, uno parallelo (breaks) prosegue flusso per flusso (da postext 1.25; vedi Formato del documento › :::columns). Un gap sul recinto sostituisce columnGap per quel gruppo, e rule traccia un filetto lungo ogni intercolonna. Usalo per un riepilogo dei punti chiave su due colonne, o per affiancare le tabelle di un riquadro largo.
  • Il sesto attributo del recinto, label, si stampa sulla linguetta dello stile (vedi label sopra): :::callout{type="box" label="BOX 1-1" title="The octet rule"}; senza uno stile label l’attributo viene ignorato.

Nel VDT il riquadro è un blocco cornice type: 'callout' la cui decorazione (sfondo, fascia, icona, titolo) vive in designOverlay, seguito dai suoi blocchi figli nella stessa colonna; la cornice e ogni figlio portano il containerId del recinto. Un riquadro annidato è una cornice type: 'callout' a sé tra i figli, seguita dai suoi blocchi; questi mantengono il containerId del recinto di primo livello (il posizionamento e il bilanciamento continuano a vedere un’unica unità) e aggiungono calloutPath, gli id dei contenitori dei recinti annidati che li circondano, dal più esterno (l’id proprio di una cornice annidata è l’ultima voce). Il PDF con tag dà a ogni riquadro annidato un Div dentro quello del genitore. Le immagini delle icone si risolvono come le immagini delle risorse: il registro delle immagini del canvas, l’opzione HTML resourceImageUrl e il provider 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

#Enunciati numerati e dimostrazioni

Uno stile con numbering conta i suoi riquadri, come amsthm di LaTeX conta gli ambienti teorema (da postext 1.19). Ogni riquadro stampa la sua etichetta e il suo numero («Theorem 2.» in apertura del suo primo paragrafo) e il title del recinto segue il numero tra parentesi: :::callout{type="theorem" title="Bradley–Terry"} si apre con «Theorem 2 (Bradley–Terry).». Un riquadro aperto con un identificatore ({#thm:main}) è una destinazione dei rimandi, che stampano «Theorem 2» (:ref{id="thm:main"}), e \ref{thm:main} o style=number stampa 2.

CampoTipoPredefinitoDescrizione
labelstring—La parola prima del numero: 'Theorem', 'Lemma', 'Definición'.
counterstring | falsel’id dello stileIl contatore che i riquadri fanno avanzare. Gli stili che indicano uno stesso contatore lo condividono, come fa \newtheorem{lemma}[theorem]: Theorem 1, Lemma 2, Theorem 3. 'equation' conta insieme alle equazioni etichettate. false stampa l’etichetta senza numero (il «Proof.» di una dimostrazione).
numberingTemplate / resetOn / counterFormatstring / ResourceCounterReset / ResourceCounterFormat'{n}' / 'never' / 'decimal'Come quello di un tipo di risorsa: '{h1}.{n}' con resetOn: 'h1' numera Theorem 2.1, 2.2… per capitolo; '{h1}.{h2}.{n}' con 'h2' per sezione. Un contatore condiviso da più stili conta su ciò che stampano i loro modelli. Un token prende uno stile dopo i due punti, come quello di un tipo di risorsa: '{h1:A}.{n}' stampa Theorem A.1 in un’appendice indicata da una lettera.
placement'runIn' | 'title''runIn''runIn' apre il primo paragrafo del riquadro con l’etichetta (un riquadro che si apre con un elenco, una formula o un altro riquadro riceve un paragrafo apposito); 'title' fa dell’etichetta il titolo del riquadro, nel suo titleStyle: «Theorem 2 (Bradley–Terry)».
bold / italicbooleantrue / falseIl carattere dell’etichetta in linea e del suo suffisso, qualunque sia il testo del riquadro: un testo in corsivo (body.italic) mantiene in tondo un’etichetta in tondo. Il titolo tra parentesi si compone in tondo e nel peso normale.
suffixstring'.'Collocato dopo l’etichetta in linea e il suo titolo.

Una dimostrazione è uno stile con un’etichetta non numerata e un segno finale:

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 } },
]

In un libro impaginato capitolo per capitolo i contatori proseguono dal capitolo precedente (LayoutContinuation.statementCounters, che continuationAfter compila), e la struttura del libro assegna all’ancora di ogni riquadro numerato la sua etichetta (OutlineEntry.numberLabel), così un rimando da un altro capitolo la stampa.

#Tipografia dentro un riquadro

Un riquadro compone il suo contenuto con la propria tipografia body e lists; tutto il resto mantiene gli stili del documento:

  • I paragrafi prendono il body del riquadro: carattere, dimensione, interlinea, colore, colori dell’enfasi, pesi, italic, smallCaps, allineamento, sillabazione, rientro e spaziatura tra paragrafi. Un campo non impostato eredita da bodyText. Un colore dell’enfasi ereditato mantiene il suo collegamento alla tavolozza, quindi grassetto, corsivo ed etichette :ref in un riquadro cambiano con colorPalette come fanno fuori da esso. (Fino a postext 1.4 il grassetto in un riquadro restava #295AA3 qualunque fosse il colore principale.)
  • Gli elenchi puntati prendono il lists del riquadro (carattere del punto elenco, colore, dimensione e peso del glifo, rientro, spazio, spaziatura tra gli elementi) al posto di unorderedLists, e il loro testo è il testo del riquadro. Un lists.bulletChar o lists.color diverso da quello del documento (unorderedLists) sostituisce il punto elenco o il colore di ogni livello; uno che lo ripete, o che resta non impostato, lascia a ogni livello il proprio (unorderedLists.levels), così i trattini annidati sopravvivono nel riquadro.
  • Gli elenchi ordinati prendono lists.indent, gap e itemSpacing, e lists.color ogni volta che lo stile lo imposta, anche quando è il colore del punto elenco del documento; uno stile che lo lascia non impostato mantiene i numeri in orderedLists.color. (Fino a postext 1.4 il colore arrivava ai numeri solo quando era diverso da unorderedLists.color, quindi impostarlo proprio su quel colore non faceva nulla.) Il numero stesso (il suo carattere, la sua dimensione e il suo separatore) viene dall’orderedLists globale, perché lists ha solo campi per i punti elenco: definisci lì lo stile dei numeri di un riquadro.
  • I :::paragraphs dentro un riquadro usano il loro stile di paragrafo, anche nei riquadri annidati. I campi che lo stile lascia non impostati ereditano dal bodyText del documento, non dal body del riquadro (né dal suo corsivo o dal suo maiuscoletto).
  • I gruppi :::columns non hanno uno stile proprio: ogni colonna condivide la tipografia del testo e degli elenchi del riquadro, e columnGap imposta lo spazio tra di esse.
  • Le citazioni in blocco prendono il carattere, la dimensione e i pesi del testo del riquadro (corsivo e grigio, come nel testo corrente), e il suo maiuscoletto. I titoli mantengono gli stili dei titoli; le formule in evidenza le impostazioni delle formule.
  • Le figure e le tabelle mantengono gli stili delle didascalie e delle tabelle del documento, alla larghezza interna del riquadro; i loro pesi normale e grassetto seguono i pesi del body del riquadro.
  • I chip mantengono il loro stile di chip; una dimensione in em si legge rispetto al corpo del testo del riquadro.
  • :::space si misura in righe del testo del riquadro (vedi :::space per i casi in cui viene scartato).
  • Un riquadro annidato prende per intero il proprio stile; i suoi span, placement, floatBarrier e snapToGrid vengono ignorati.

#Segni su un riquadro diviso

Quando un riquadro si divide tra colonne o pagine (keepTogether: false, o un riquadro più alto di una colonna), ogni parte dopo la prima si apre senza il titolo e l’icona, e per impostazione predefinita nulla dice al lettore che il riquadro prosegue. Due opzioni aggiungono i segni che usano un libro o una sceneggiatura:

  • repeatTitle: true ripete il titolo in testa a ogni continuazione, seguito da continuedSuffix, per impostazione predefinita «Key points (cont.)». La ripetizione prende lo stile del titolo, quindi con textTransform: 'uppercase' dà il «HAMLET (CONT'D)» di una sceneggiatura. L’icona e la linguetta restano sulla prima parte.
  • continuesMarkerEnabled: true colloca continuesMarker («Continued», o «Continúa» in un documento spagnolo) sotto l’ultima riga di ogni parte che prosegue, dentro il riquadro, nel carattere e nel corpo del testo del riquadro: in corsivo a meno che continuesMarkerItalic non sia false, allineato a destra a meno che continuesMarkerAlign non indichi 'left' o 'center'. Il segno occupa spazio nella parte che chiude, e il taglio viene scelto in modo che ci stia.
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 parte che chiude la pagina termina con «(MORE)», e la pagina successiva si apre con «HAMLET (CONT'D)». Entrambi sono elementi di servizio dell’impaginazione: in un PDF accessibile sono artefatti e nell’HTML sono nascosti alle tecnologie assistive, così il titolo si legge una sola volta. Nel VDT sono blocchi di testo designOverlay contrassegnati artifact: true.