Vai al contenuto principale

Capitolo 3.14 · Parte II · Il mestiere

Configurazione: pagine composte

I modelli delle pagine composte: cornici, gruppi, decorazione, ereditarietà e varianti recto/verso, gli stili delle etichette degli ancoraggi delle immagini e gli avvisi che un modello può dare

Aggiornato 2026-10-166 minNel capitolo 3 Configurazioneenescadefritptzhjaar

In breve

Questa pagina presenta i modelli di pagina. Un modello è una pagina disegnata nelle impostazioni: riquadri con un nome, chiamati cornici, dove sta ciascuno, quanto può crescere e che aspetto ha. Il Markdown di una pagina composta riempie poi le cornici per nome, così il testo non contiene mai posizioni e le impostazioni non contengono mai testo. Un modello può partire da un altro e cambiare solo alcune cornici, e può essere diverso sulle pagine di sinistra e di destra. La pagina elenca anche gli stili delle etichette per le parole messe sulle immagini, e ogni avviso che un modello può dare insieme al modo di correggerlo.

#Modelli di pagina

Una pagina composta è una pagina la cui forma viene da un modello della configurazione e il cui contenuto viene dal Markdown di un blocco ::::page{template="…"}. Il modello dà un nome a dei rettangoli, chiamati cornici; il Markdown manda ogni parte del contenuto a una cornice per nome (il suo slot). La geometria non compare mai nel Markdown, e il testo del contenuto non compare mai nel modello. La proprietà pageTemplates contiene i modelli del libro:

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 modello che imposta solo il suo id e una cornice è una pagina intera in cui quella cornice riempie l’area del contenuto. Tutti gli altri campi sono facoltativi:

ProprietàTipoPredefinitoDescrizione
idstringobbligatorioIl nome che chiede un blocco di pagina (template="tema-cajas"). Unico tra i modelli: un secondo modello con lo stesso id viene ignorato.
namestringl’idIl nome mostrato nella Sandbox. L’impaginazione non lo legge mai.
extendsstringnessunoL’id del modello da cui parte questo. Vedi Ereditarietà e varianti.
area'content' | 'trim' | 'bleed''content'Il rettangolo a cui si riferiscono le posizioni delle cornici. 'content' è l’area del contenuto della pagina, speculare sulle pagine di sinistra e di destra come il testo corrente; 'trim' è la pagina rifilata; 'bleed' la pagina con la sua abbondanza.
grid{ columns, rows, columnGap?, rowGap? }nessunaDivide l’area in celle, così una cornice o un gruppo si può collocare per cella (grid: { col: 2, row: 1, cols: 2 }, contando da 1) invece che con placement. Gli spazi valgono 0 per impostazione predefinita.
framesFrameConfig[][]Le cornici, nell’ordine del modello: quello in cui vengono misurate e quello che decide i pareggi. Vedi Cornici.
groupsFrameGroupConfig[][]Pile e file di cornici che si dividono lo spazio. Vedi Gruppi.
decorationDesignSlotnessunaImmagini, filetti e riquadri dipinti con la pagina, nel linguaggio di elementi di intestazioni e piè di pagina. Gli elementi di testo contengono solo segnaposto ({pageNumber}, {chapterTitle}, {attr.x} per un attributo del blocco di pagina). Un elemento si può ancorare a una cornice o a un gruppo ('#dinero') e allora si sposta con esso. La decorazione si colloca dopo le cornici e non spinge mai il testo.
header, footerDesignSlot | falseereditatiIl titolo corrente e il numero di pagina. Se non sono impostati, la pagina tiene quelli del suo capitolo; false li nasconde.
spreadbooleanfalseIl modello descrive due pagine affiancate disposte come un unico foglio. Una doppia pagina comincia sempre su una pagina di sinistra in un libro da sinistra a destra (su una pagina di destra in uno da destra a sinistra), con una pagina bianca aggiunta prima quando serve.
gutterDimension0In una doppia pagina, la fascia sul dorso che le cornici lasciano libera, a meno che impostino crossGutter: true.
variants{ recto?, verso? }nessunaModifiche per una pagina di destra (recto) o di sinistra (verso), scritte come il modello stesso. Il lato è quello fisico, quindi funzionano sia i libri da sinistra a destra sia quelli da destra a sinistra.
overflowTemplatestringquesto modelloIl modello delle pagine aggiunte quando una cornice continua nella pagina successiva (overflow.continueIn: 'next-page'). Se non è impostato, la pagina aggiunta usa questo modello con riempite solo le cornici che continuano.
bodyStylestringnessunoUno stile di paragrafo per il testo della pagina, come quello degli stili dei titoli.
palettestringnessunaUna tavolozza sostitutiva per la pagina, come quella degli stili dei titoli e delle parti.
rolestring'composed'Il ruolo di pagina che vedono gli elementi di progetto grafico con un filtro pages.

#Cornici

Una cornice è un rettangolo con un nome che riceve contenuto composto. Il suo name è lo slot che chiede il Markdown, ed è unico nel suo modello (nemmeno un gruppo può prendere il nome di una cornice, perché gli ancoraggi indicano entrambi allo stesso modo).

Una cornice si colloca con la sua cella grid quando il modello ha una griglia, altrimenti con il suo placement, che funziona come quello di un elemento di progetto grafico: un ancoraggio ('container' è l’area, 'page', 'bleed', o '#name' per un’altra cornice o un altro gruppo), un bordo, uno scostamento e una dimensione. Una cornice ancorata a un’altra si sposta con essa. Senza né l’una né l’altro, la cornice occupa tutta l’area.

ProprietàTipoPredefinitoDescrizione
namestringobbligatorioIl nome dello slot.
placementElementPlacementtutta l’areaAncoraggio, bordo, scostamento e dimensione, come nella collocazione degli elementi. Ignorato quando una cella della griglia colloca la cornice.
grid{ col, row, cols?, rows? }nessunaUna cella della griglia del modello, contando da 1, estesa su cols × rows celle (1 per impostazione predefinita). Una cella oltre la griglia viene riportata al suo interno. Ignorato quando il modello non ha una griglia.
width, heightDimension | { percent } | 'auto' | 'fill''fill', 'auto'Una lunghezza fissa, una percentuale dell’area (da 0 a 100), 'auto' (la dimensione propria del contenuto) o 'fill' (quanto resta fino al bordo a cui la cornice è ancorata). Se non è impostata, la cornice legge placement.size e poi il valore predefinito: tutta la larghezza, alta quanto il suo contenuto. Una cornice di testo ha bisogno di una giustezza, quindi una larghezza 'auto' ha senso solo per una cornice che contiene una sola immagine (la larghezza dell’immagine all’altezza della cornice). Un valore che il motore non può usare (una lunghezza negativa, un’unità sconosciuta) vale come il predefinito.
minWidth, maxWidth, minHeight, maxHeightDimensionnessunoLimiti per una dimensione 'auto' o 'fill' e per lo spazio che un gruppo cede o prende. Il minimo prevale sul massimo, e una dimensione fissa fuori dai limiti viene riportata tra di essi (frameMinMax avvisa di entrambi i casi).
stylestringsenza riquadroL’id di uno stile dei riquadri: le cornici si disegnano con gli stili dei riquadri (sfondo, bordo, spaziatura interna, fascia, icona, linguetta dell’etichetta, titolo). Le parole di una linguetta vengono dal Markdown (:::frame{slot="dinero" label="El dinero"}). Le impostazioni dei riquadri che decidono dove va un riquadro nel testo corrente (placement, span, columns, width, fixed…) non valgono per una cornice.
padding{ top?, right?, bottom?, left? }quella dello stileSostituisce la spaziatura interna dello stile lato per lato: lo spazio per le foto che stanno sopra un riquadro, per esempio.
layernumber1L’ordine di pittura. La decorazione è il livello 0; un livello negativo si dipinge sotto di essa.
rotatenumber0Gradi, in senso orario. Il riquadro e il suo contenuto ruotano insieme.
verticalAlign'top' | 'middle' | 'bottom' | 'justify''top'Dove sta il contenuto in una cornice più alta di lui.
columns, columnGapnumber, Dimension1, quello dello stileColonne dentro la cornice.
exclude'none' | 'push''none''push': il testo delle altre cornici scorre attorno al rettangolo di questa.
flowbooleanfalseLa cornice riceve il contenuto che non indica nessuno slot.
takes'h1' … 'h6'nessunoLa cornice riceve il primo titolo di quel livello che non indica nessuno slot, quindi il titolo di una pagina è solo # Title in cima al blocco.
nextstringnessunoUna catena: il contenuto che non entra continua nella cornice con quel nome, nella stessa pagina.
overflow.continueInstringnessunoDove prosegue il contenuto che non entra: '#frame' (un’altra cornice della pagina, come next), 'next-page' (la stessa cornice in una pagina aggiunta dopo questa) o 'template:<id>' (una pagina di quel modello).
overflow.markstring | falsequello della linguaIl segno alla fine di un pezzo tagliato. Se non è impostato, la parola di continuazione della lingua del documento (quella delle tabelle divise); false non ne mette nessuno.
fit.shrinkTextbooleantrueQuando nient’altro fa entrare il contenuto, il suo testo si può comporre più piccolo.
fit.minScalenumber0.9La scala minima del testo, sopra 0 e al massimo 1 (un valore maggiore vale 1).
fit.scaleImages, fit.imageMinScaleboolean, numbertrue, 0.8Se le immagini della cornice si possono rimpicciolire, e fino a quale scala.
pinbooleanfalseLa cornice non si sposta né cambia dimensione, per un riquadro che deve restare allineato con l’illustrazione. Un gruppo si dispone attorno a essa.
grow, shrink, prioritynumber0Come la cornice divide lo spazio del suo gruppo: grow prende una parte dello spazio libero, shrink permette alla cornice di cedere spazio, e le cornici con priority più bassa lo cedono per prime.
optionalbooleanfalseNessun avviso quando il Markdown non manda nulla alla cornice.
crossGutterbooleanfalseIn una doppia pagina, la cornice può attraversare la fascia del dorso.
writingMode, direction'horizontal-tb' | 'vertical-rl', 'ltr' | 'rtl'quelli della paginaUn riquadro verticale su una pagina orizzontale, o il contrario.
removebooleanfalseIn un modello che ne estende un altro, o in una variante: elimina la cornice ereditata con quel nome.

#Gruppi

Un gruppo è una pila (dall’alto in basso) o una fila (dall’inizio alla fine) di cornici che si dividono lo spazio e si spostano insieme. Dentro un gruppo, la posizione propria delle cornici lungo la direzione del gruppo viene ignorata: il gruppo le dispone in ordine, con gap tra l’una e l’altra. Quando il testo di una cornice cresce, le cornici che la seguono si spostano. Un gruppo è un riquadro a cui si possono ancorare cornici e decorazione ('#pagina').

ProprietàTipoPredefinitoDescrizione
namestringobbligatorioUnico tra le cornici e i gruppi del modello.
kind'stack' | 'row''stack'Dall’alto in basso, o dall’inizio alla fine.
framesstring[][]Le cornici del gruppo, nel loro ordine sulla pagina. Una cornice appartiene al massimo a un gruppo; un nome che non è una cornice del modello, o una cornice già elencata, viene saltato.
gapDimension0Lo spazio tra due cornici del gruppo.
placement, gridcome le corniciil riquadro delle sue corniciIl riquadro proprio del gruppo. Se non è impostato, il riquadro che racchiude i riquadri dichiarati delle sue cornici.
align'start' | 'center' | 'end' | 'space-between''start'Dove va lo spazio libero quando nessuna cornice del gruppo cresce.
removebooleanfalseIn un modello che ne estende un altro, o in una variante: elimina il gruppo ereditato.

#Ereditarietà e varianti

Un modello con extends parte dal modello che indica (che a sua volta può estenderne un altro) e cambia solo ciò che scrive:

  • Un campo come area, header o overflowTemplate sostituisce quello del genitore. grid si unisce chiave per chiave. Anche spread, gutter e role si ereditano; id, name ed extends sono propri del modello.
  • frames e groups si uniscono per nome: una voce con il nome di una ereditata cambia i campi che scrive e tiene gli altri (fit, overflow e padding si uniscono chiave per chiave; placement si sostituisce per intero); remove: true la elimina; un nome nuovo si aggiunge dopo quelli ereditati.
  • Gli elementi della decorazione si uniscono per id allo stesso modo; un elemento con un id nuovo, o senza id, si aggiunge.

variants.recto e variants.verso si scrivono come un modello e si uniscono allo stesso modo, su una pagina di destra o di sinistra. Si applicano dopo tutta la catena di extends, prima la variante della radice. Una doppia pagina ha entrambi i lati, quindi nessuna variante vale per essa.

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

Un valore uguale a un predefinito non viene mai scartato quando la Sandbox salva un modello: in un modello che ne estende un altro, o in una variante, sostituisce il valore del genitore.

Dal codice, resolvePageTemplate(config, id, { parity }) restituisce un modello con la catena unita, la variante del lato applicata, ogni valore predefinito compilato e ogni riferimento risolto come descrivono gli avvisi più sotto; validatePageTemplates(config) restituisce gli avvisi.

#Stili delle etichette

La proprietà labelStyles dà un nome agli aspetti delle etichette messe su un’immagine: i mari e le città di una carta, le parti di uno schema. Un’etichetta sta in un ancoraggio dell’immagine (un punto salvato con la risorsa, come i personaggi dei fumetti) e prende lo stile che indica l’ancoraggio o l’etichetta.

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' } } },
]
ProprietàTipoPredefinitoDescrizione
idstringobbligatorioIl nome che usano ancoraggi ed etichette.
namestringl’idIl nome mostrato nella Sandbox.
paragraphStylestringnessunoUno stile di paragrafo da cui l’etichetta prende il carattere; i campi qui sotto lo sostituiscono.
fontFamily, fontSize, fontWeightstring, Dimension, numberquelli del testo correnteIl carattere dell’etichetta.
fontStyle'normal' | 'italic''normal'Tondo o corsivo.
colorColorValuecolore del testo correnteIl colore delle lettere.
textTransform'none' | 'uppercase''none'Maiuscole, come le carte scrivono mari e paesi.
letterSpacingnumber0Spazio in più tra le lettere, in em.
halo{ color, width }nessunoUn contorno dietro le lettere, perché si leggano su un’immagine carica di dettagli.
background, paddingColorValue, DimensionnessunoUna campitura dietro l’etichetta, e lo spazio attorno al suo testo.
minScalenumber0.85Quanto si può rimpicciolire un’etichetta che non entra nella sua larghezza.

#Campi di etichetta di un ancoraggio

Gli ancoraggi di un’immagine (Resource.anchors, i punti che i fumetti usano per i personaggi) accettano alcuni campi facoltativi per le etichette. Sono frazioni dell’immagine, quindi valgono in ogni lingua e con qualunque ritaglio dell’immagine. I fumetti li ignorano.

CampoTipoPredefinitoDescrizione
widthnumberquella dell’etichettaLa giustezza dell’etichetta, come frazione della larghezza dell’immagine: un nome lungo va a capo su due righe al suo interno.
align'start' | 'center' | 'end''center'Quale lato dell’etichetta sta sul punto dell’ancoraggio.
verticalAlign'top' | 'middle' | 'bottom''middle'Quale bordo dell’etichetta sta all’altezza dell’ancoraggio.
rotatenumber0Gradi, in senso orario, attorno al punto dell’ancoraggio: il nome di un fiume lungo il suo corso.
stylestringnessunoUn id di labelStyles. Un’etichetta che indica il proprio stile lo sostituisce.

#Avvisi dei modelli di pagina

Altrove il motore ignora una chiave che non conosce. I modelli di pagina e gli stili delle etichette invece vengono verificati, e ogni problema diventa un avviso di configurazione in postext check e nel pannello Verifiche della Sandbox. Il path di questi avvisi è un puntatore JSON al campo in errore: /pageTemplates/3/frames/2/style, /pageTemplates/0/variants/recto/frames/1/next, /resources/4/anchors/0/style. Quando il campo è stato ereditato, il puntatore indica il modello che l’ha scritto. Un avviso che cita un id o un nome inesistente suggerisce anche quello esistente più vicino.

Una chiave scritta male di un modello, di una cornice, di un gruppo, di una griglia, di fit, di overflow, di una variante o di uno stile di etichetta è un unknownConfigKey; una parola fuori dalle scelte di un’impostazione (area, verticalAlign, exclude, takes, kind, align, writingMode, direction, fontStyle, textTransform) è un unknownConfigValue, e l’impostazione tiene il suo valore predefinito. Un modello senza id, o una cornice o un gruppo senza name, viene ignorato con un unknownConfigValue su quel campo.

AvvisoCausaRimedio
templateDuplicateDue modelli hanno lo stesso id. Si usa il primo e quello successivo viene ignorato.Rinomina uno dei due, o elimina la copia.
templateExtendsCycleSeguendo extends si torna allo stesso modello (a → b → a). Tutti i modelli del ciclo, e tutti quelli che ne estendono uno, vengono scartati: nessuna pagina li può usare.Togli l’extends di un modello del ciclo.
templateExtendsUnknownextends indica un id che nessun modello ha. Il modello si usa da solo, senza ereditare nulla.Correggi l’id (l’avviso suggerisce quello più vicino), o aggiungi il modello genitore.
frameDuplicateDue cornici, o due gruppi, di uno stesso elenco hanno lo stesso name, oppure un gruppo ha il nome di una cornice. La voce successiva viene ignorata; un ancoraggio a quel nome legge la cornice.Dai a ogni cornice e a ogni gruppo un nome proprio. Per cambiare una cornice ereditata, scrivi una sola voce con il suo nome.
frameStyleUnknownLo style di una cornice non indica nessuno stile dei riquadri. La cornice si disegna senza riquadro.Correggi l’id, o aggiungi lo stile a calloutStyles.
frameAnchorUnknownUna cornice, un gruppo o un elemento della decorazione è ancorato a '#name' e il modello non ha cornici, gruppi o elementi con quel nome; oppure cornici e gruppi sono ancorati l’uno all’altro in un ciclo (anche attraverso un gruppo senza un proprio ancoraggio, il cui riquadro è quello delle sue cornici). L’ancoraggio vale come 'container', l’area.Ancora a una cornice o a un gruppo che esiste, o rompi il ciclo ancorandone uno all’area.
frameMinMaxUn minimo è maggiore del suo massimo (minHeight 40mm > maxHeight 30mm), oppure una width o una height fissa sta fuori dai limiti. Il minimo prevale, una dimensione fissa viene riportata tra i limiti, e used dice cosa prende la cornice. Le lunghezze in unità diverse si confrontano alla risoluzione della pagina, gli em al corpo del testo corrente.Rendi il minimo non maggiore del massimo, o togli il limite che la dimensione fissa contraddice.
groupFrameUnknownLe frames di un gruppo elencano un nome che non è una cornice del modello (forse eliminata da un modello figlio o da una variante). Il gruppo lo salta.Correggi il nome, o toglilo dall’elenco.
groupFrameTwiceUna cornice è elencata in due gruppi, o due volte nello stesso. Una cornice appartiene a un solo gruppo: la voce successiva viene saltata.Tieni la cornice nell’unico gruppo con cui si sposta.
frameChainLoopLe cornici continuano l’una nell’altra in un ciclo tramite next o overflow.continueIn: '#frame' (a → b → a). Il collegamento che chiude il ciclo viene scartato, quindi la catena finisce nella cornice che lo precede.Chiudi la catena nella sua ultima cornice: togli il suo next, o falla continuare nella pagina successiva.
overflowTargetUnknownUn next non indica nessuna cornice del modello; un overflow.continueIn non indica nessuna cornice ('#x') o nessun modello ('template:x'), oppure non ha nessuna delle forme '#frame', 'next-page' e 'template:<id>'; oppure overflowTemplate non indica nessun modello. Il contenuto che non entra non prosegue lì.Correggi il nome o l’id, o scrivi una delle tre forme.
labelStyleUnknownUn ancoraggio di un’immagine indica uno style che labelStyles non ha. L’avviso cita la risorsa. Le etichette in quell’ancoraggio prendono l’aspetto predefinito.Correggi l’id dello stile nell’ancoraggio, o aggiungi lo stile a labelStyles.

La versione della configurazione è la 15 dai modelli di pagina in poi (i bundle scritti prima continuano a caricarsi senza modifiche: niente di ciò che dice una configurazione più vecchia cambia significato).