# Configurazione: elenchi e matematica

> Elenchi puntati e numerati, i loro marcatori, rientri e annidamenti, gli elenchi di attività, e dimensione, colore e spaziatura delle formule matematiche

- Versione HTML: https://postext.dev/it/docs/configuration-lists-math
- Ultimo aggiornamento: 2026-10-16
- Tempo di lettura: 19 min
- Altre lingue: [en](https://postext.dev/en/docs/configuration-lists-math.md), [es](https://postext.dev/es/docs/configuration-lists-math.md), [ca](https://postext.dev/ca/docs/configuration-lists-math.md), [de](https://postext.dev/de/docs/configuration-lists-math.md), [fr](https://postext.dev/fr/docs/configuration-lists-math.md), [pt](https://postext.dev/pt/docs/configuration-lists-math.md), [zh](https://postext.dev/zh/docs/configuration-lists-math.md), [ja](https://postext.dev/ja/docs/configuration-lists-math.md), [ar](https://postext.dev/ar/docs/configuration-lists-math.md)

## In breve

Questa pagina riguarda elenchi e formule. Un elenco puntato segna ogni voce con un simbolo, e un elenco numerato conta le voci con numeri o lettere. Stabilisci il marcatore, il rientro e lo spazio di ogni elenco, e puoi cambiarli per gli elenchi dentro altri elenchi. Gli elenchi di attività disegnano una casella da spuntare. L’ultima sezione imposta la dimensione, il colore e lo spazio intorno alle formule matematiche.

## Elenchi puntati

La proprietà `unorderedLists` controlla come vengono resi gli elenchi puntati (`-`, `*`, `+`) e gli elenchi di attività GFM (`- [ ]`, `- [x]`). Sono supportati fino a cinque livelli di annidamento.

### Valori predefiniti degli elenchi puntati

| Proprietà | Tipo | Predefinito | Descrizione |
| --- | --- | --- | --- |
| `fontFamily` | `string` | eredita `bodyText.fontFamily` | Font usato per il testo delle voci. |
| `color` | `ColorValue` | Colore principale (`#295AA3`) | Colore del testo e del punto elenco delle voci. Collegato alla voce `main-color` della palette predefinita. |
| `fontWeight` | `number` | `700` | Peso del testo delle voci (100–900). I punti elenco ereditano questo peso, salvo personalizzazioni per livello. |
| `italic` | `boolean` | `false` | Compone il testo delle voci in corsivo. |
| `bulletChar` | `string` | `'•'` | Glifo usato come segno di elenco. |
| `bulletFontSize` | `Dimension` | `1 em` | Dimensione del glifo del punto elenco. Le unità relative seguono il corpo del testo corrente. |
| `gap` | `Dimension` | `0.5 em` | Spazio orizzontale tra il punto elenco e il testo della voce. |
| `indent` | `Dimension` | `0 em` | Rientro di base del livello 1. I livelli più profondi partono a cascata dall’inizio del testo del livello superiore, salvo personalizzazioni (vedi sotto). |
| `bulletVerticalOffset` | `Dimension` | `0 em` | Regola finemente la posizione verticale del punto elenco. I valori negativi lo spostano in su, quelli positivi in giù. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | Spazio prima e dopo l’elenco nel suo insieme. |
| `itemSpacing` | `Dimension` | `0 em` | Spazio verticale aggiuntivo inserito tra le voci, oltre all’interlinea. Attorno a un elenco annidato in una voce di un altro, lo spazio dell’elenco esterno si applica su entrambi i lati, prima della prima voce dell’elenco annidato e dopo l’ultima (fino a postext 1.4 la voce che seguiva un elenco annidato prendeva lo spazio dell’elenco annidato). |
| `snapTopToGrid` | `boolean` | `false` | Arrotonda per eccesso lo spazio sopra l’elenco perché il primo punto elenco cada sulla griglia della linea di base, come fa il testo sotto un titolo; `marginTop` diventa allora un minimo. La fine di un elenco riporta comunque il flusso sulla griglia, quindi con `itemSpacing` a 0 ogni voce si allinea al testo della colonna accanto. Disattivato per impostazione predefinita, come fino a postext 1.4: un `marginTop` che non è un numero intero di righe lascia le voci fuori griglia fino alla fine dell’elenco. Gli elenchi dentro i riquadri, il cui interno è fuori griglia, non sono interessati. |
| `hangingIndent` | `boolean` | `true` | Se è attivo, le righe successive si allineano al primo carattere del testo anziché sotto il punto elenco. |
| `levels` | `UnorderedListLevelConfig[]` | — | Personalizzazioni per i livelli 1–5. Vedi sotto. |

### Estensioni per gli elenchi di attività

Le voci di attività GFM (`- [ ] …`, `- [x] …`) sono rese come voci di elenco puntato con una casella al posto del punto elenco. Il motore disegna la casella da sé, un quadrato vuoto con un segno di spunta quando l’attività è completata: non richiede alcun font, quindi è identica su ogni macchina, nel canvas, nel PDF, nell’HTML e nell’EPUB, e le tecnologie assistive leggono `☐` o `☑`. Il suo lato misura 0,6 em della dimensione del segno (`bulletFontSize`, o il `fontSize` del livello), ed è lo spazio che occupa prima del `gap`; alla dimensione del testo poggia sulla linea di base della prima riga della voce. Il suo tratto segue il `fontWeight` del segno e il suo colore il `color` del segno. I campi seguenti valgono solo per le voci di attività:

| Proprietà | Tipo | Predefinito | Descrizione |
| --- | --- | --- | --- |
| `taskCheckboxChar` | `string` | `'☐'` | Carattere di un’attività non spuntata. Quello predefinito non viene composto come testo: la casella la disegna il motore. Qualsiasi altro carattere viene composto come testo nel carattere dell’elenco, che quindi deve contenerlo. |
| `taskCheckedChar` | `string` | `'☑'` | Carattere di un’attività completata. Anche quello predefinito viene disegnato, come una casella con un segno di spunta; qualsiasi altro carattere viene composto come testo nel carattere dell’elenco. |
| `taskBox` | `'drawn' \| 'character'` | `'drawn'` | Come vengono composti i due caratteri predefiniti. `'drawn'`: la casella la disegna il motore. `'character'`: `☐` e `☑` sono testo nel carattere dell’elenco, come fino a postext 1.28; in un carattere che non li contiene il browser sceglie un font di sistema, e il testo della voce comincia dopo la larghezza che dà quel font. Una configurazione salvata prima della versione 13 viene letta con `'character'`, così le sue righe restano dov’erano. |
| `taskCompletedStrikethrough` | `boolean` | `true` | Traccia una linea barrata sul testo delle attività completate. |
| `taskCompletedColor` | `ColorValue` | eredita il colore della voce | Colore facoltativo applicato al testo delle attività completate. Se manca, si usa il colore normale della voce. |

### Personalizzazioni per livello degli elenchi puntati

Ogni voce di `levels` riguarda un livello di profondità (1–5) e può ridefinire uno qualsiasi di questi campi:

| Proprietà | Tipo | Descrizione |
| --- | --- | --- |
| `bulletChar` | `string` | Glifo del punto elenco per questo livello. |
| `fontFamily` | `string` | Famiglia di caratteri delle voci per questo livello. |
| `fontSize` | `Dimension` | Dimensione del glifo del punto elenco per questo livello. |
| `color` | `ColorValue` | Colore della voce. |
| `fontWeight` | `number` | Peso della voce. |
| `italic` | `boolean` | Attiva il corsivo. |
| `indent` | `Dimension` | Rientro esplicito del punto elenco a questo livello. Vedi più sotto la regola della cascata. |
| `verticalOffset` | `Dimension` | Regolazione verticale fine del punto elenco a questo livello. |

**Cascata dei rientri.** Il livello 1 parte sempre dal valore generale di `indent` (per impostazione predefinita `0 em`: i punti elenco sono fissati al bordo della colonna). Per i livelli 2–5, se lasci `indent` non definito il motore colloca il punto elenco all’inizio del testo del livello *precedente* (rientro del livello superiore + larghezza del punto elenco + `gap`). Imposta un `indent` esplicito su un livello per interrompere la cascata e fissare quel livello dove preferisci.

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

## Elenchi numerati

La proprietà `orderedLists` controlla gli elenchi numerati (`1.`, `2)`, ecc.). Sono supportati fino a cinque livelli di annidamento e ogni livello può usare un formato di numerazione diverso.

### Valori predefiniti degli elenchi numerati

| Proprietà | Tipo | Predefinito | Descrizione |
| --- | --- | --- | --- |
| `fontFamily` | `string` | eredita `bodyText.fontFamily` | Font usato per il testo delle voci e per il numero. |
| `color` | `ColorValue` | Colore principale (`#295AA3`) | Colore del testo e del numero delle voci. Collegato alla voce `main-color` della palette predefinita. |
| `fontWeight` | `number` | `700` | Peso del testo delle voci e dei numeri (100–900). |
| `italic` | `boolean` | `false` | Compone il testo delle voci in corsivo. |
| `numberFormat` | `OrderedListNumberFormat` | `'arabic'` | Stile di numerazione: `'arabic'`, `'lower-alpha'`, `'upper-alpha'`, `'lower-roman'`, `'upper-roman'`. Funzionano anche le grafie delle altre impostazioni (`'decimal'`, `'roman-lower'`, `'i'`…; vedi [Grafie dei formati di numerazione](https://postext.dev/it/docs/configuration-page-layout.md#grafie-dei-formati-di-numerazione)); un valore sconosciuto numera in cifre arabe e viene segnalato. |
| `prefix` | `string` | `''` | Testo composto prima del numero, nello stile del separatore: con `'（'` qui e `'）'` come separatore un elenco cinese si legge （一）, （二）. Quando il separatore è disegnato come segmento a sé, lo è anche il prefisso, subito prima del numero. |
| `separator` | `string` | `'.'` | Carattere posto tra il numero e il testo, di solito `'.'` o `')'`. |
| `separatorFontFamily` | `string` | eredita `fontFamily` | Font del separatore. Quando uno qualsiasi degli stili del separatore differisce da quello del numero, il separatore è disegnato come segmento a sé dopo il numero (allineato a destra), per esempio `1` in Optima Bold nero seguito da `•` in DIN Pro Bold blu. |
| `separatorFontWeight` | `number` | eredita `fontWeight` | Peso del separatore (100–900). |
| `separatorItalic` | `boolean` | eredita `italic` | Compone il separatore in corsivo. |
| `separatorColor` | `ColorValue` | eredita `color` | Colore del separatore. I riferimenti alla palette vengono rispettati. |
| `separatorGap` | `Dimension` | `0 em` | Spazio tra il numero e il separatore. Il testo della voce comincia comunque `gap` dopo il separatore. |
| `numberFontSize` | `Dimension` | `1 em` | Dimensione del numero. |
| `gap` | `Dimension` | `0.5 em` | Spazio orizzontale tra il numero e il testo della voce. |
| `indent` | `Dimension` | `0 em` | Rientro di base del livello 1; i livelli più profondi partono a cascata dall’inizio del testo del livello superiore, salvo personalizzazioni. |
| `numberVerticalOffset` | `Dimension` | `0 em` | Regola finemente la posizione verticale del numero. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | Spazio prima e dopo l’elenco nel suo insieme. |
| `itemSpacing` | `Dimension` | `0 em` | Spazio verticale aggiuntivo tra le voci. Attorno a un elenco annidato in una voce di un altro, lo spazio dell’elenco esterno si applica su entrambi i lati, prima della prima voce dell’elenco annidato e dopo l’ultima (fino a postext 1.4 la voce che seguiva un elenco annidato prendeva lo spazio dell’elenco annidato). |
| `snapTopToGrid` | `boolean` | `false` | Arrotonda per eccesso lo spazio sopra l’elenco perché il primo numero cada sulla griglia della linea di base, come fa il testo sotto un titolo; `marginTop` diventa allora un minimo. La fine di un elenco riporta comunque il flusso sulla griglia, quindi con `itemSpacing` a 0 ogni voce si allinea al testo della colonna accanto. Disattivato per impostazione predefinita, come fino a postext 1.4: un `marginTop` che non è un numero intero di righe lascia le voci fuori griglia fino alla fine dell’elenco. Gli elenchi dentro i riquadri, il cui interno è fuori griglia, non sono interessati. |
| `numberWidth` | `'run' \| 'level' \| 'item'` | `'run'` | Quanto è larga la colonna dei numeri di una voce, il che stabilisce dove comincia il suo testo; i numeri vi sono allineati a destra. `'run'`: il numero più largo della sequenza della voce, cioè le voci di uno stesso livello che hanno tra loro solo voci più profonde. Una figura, un paragrafo o un riquadro tra due voci apre una nuova sequenza, quindi `ii)` dopo una tabella può far cominciare il testo un po’ più a destra di `i)` prima di essa, e un elenco di nove voci compone il testo più a sinistra di un elenco di dodici. `'level'`: il numero più largo a quel livello in tutto il documento (il capitolo, in un libro), quindi ogni elenco, e ogni parte di un elenco interrotto, fa cominciare il testo nello stesso punto, come già fanno i rientri dei livelli più profondi. `'item'`: il numero della voce stessa, così il testo di ogni voce comincia un `gap` dopo la propria etichetta: 第九條 e 第十一條 sono seguiti dallo stesso spazio e i loro testi cominciano in punti diversi, come la Gazzetta ufficiale giapponese stampa gli articoli di una legge. Le righe successive seguono `hangingIndent`: `false` le riporta al rientro dell’elenco, `true` le appende sotto il testo della voce stessa. Il rientro di un livello più profondo resta un valore unico per livello. Da postext 1.28. |
| `numberAlign` | `'end' \| 'start'` | `'end'` | Come si colloca un numero nella sua colonna. `'end'`: contro il testo, così i numeri di una sequenza finiscono insieme e `9.` e `10.` si allineano sui punti. `'start'`: all’inizio della colonna (a sinistra in una pagina da sinistra a destra, a destra in una da destra a sinistra, in testa alla riga nel testo verticale), così le etichette di lunghezza diversa cominciano insieme, come gli articoli di una legge (第九條, 第十一條). La colonna mantiene la larghezza che le dà `numberWidth`, quindi il testo delle voci comincia comunque nello stesso punto; con un separatore in uno stile proprio, il separatore segue il suo numero. Da postext 1.26. Con `numberWidth: 'item'` la colonna è il numero stesso, quindi i due valori compongono lo stesso elenco. |
| `hangingIndent` | `boolean` | `true` | Le righe successive si allineano al primo carattere del testo anziché sotto il numero. |
| `levels` | `OrderedListLevelConfig[]` | — | Personalizzazioni per i livelli 1–5. |

### Personalizzazioni per livello degli elenchi numerati

Ogni voce di `levels` può ridefinire `numberFormat`, `prefix`, `separator`, `fontFamily`, `fontSize`, `color`, `fontWeight`, `italic`, `indent`, `verticalOffset` e lo stile del separatore (`separatorFontFamily`, `separatorFontWeight`, `separatorItalic`, `separatorColor`, `separatorGap`); vale la stessa cascata dei rientri degli elenchi puntati. Lo stile del separatore di un livello eredita lo stile del numero di quel livello, a meno che non sia data l’impostazione del separatore valida per tutto l’elenco.

**Allineamento a destra.** La pipeline misura il numero formattato più largo di una sequenza e fa rientrare tutte le voci di quella sequenza in modo che i numeri si allineino sul bordo destro. In un elenco di dieci voci reso come `1.` – `10.` i numeri di una cifra vengono spaziati fino ad allinearsi a destra, così il separatore resta nella stessa colonna.

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

Il risultato è il classico misto annidato:

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

La gerarchia dei documenti cinesi (GB/T 15834—2011, appendice B.3) prevede cinque livelli: 一、 poi （一） poi 1. poi （1） poi ①:

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

## Matematica

La proprietà `math` controlla come vengono analizzate e rese le formule LaTeX tra i delimitatori `$...$` (in linea) e `$$...$$` (in display). Il motore sottostante è MathJax (il pacchetto `mathjax-full`) in modalità di output SVG, rasterizzato sul canvas e incorporato nel PDF come glifi scalabili.

```ts
interface MathConfig {
  enabled?: boolean;        // Render LaTeX. When false, spans pass through as literal TeX.
  fontSizeScale?: number;   // × the surrounding text's size (the body size for display maths).
  color?: ColorValue;       // Formula colour; inherits body colour if omitted.
  marginTop?: Dimension;    // Space above display math blocks.
  marginBottom?: Dimension; // Minimum space below; baseline grid snap may enlarge it.
  indentAfterDisplay?: boolean; // Indent a paragraph that follows a display formula.
  keepWithLeadIn?: boolean; // Keep a display formula with the line that leads into it.
  equationNumbering?: {      // Number the display formulas that carry a \label.
    enabled?: boolean;           // default true
    numberingTemplate?: string;  // '{n}'; '{h1}.{n}' numbers by chapter
    resetOn?: ResourceCounterReset; // 'never' | 'h1' … 'h6'
    counterFormat?: ResourceCounterFormat; // 'decimal'
    format?: string;             // '({n})': what the formula and \eqref print
  };
}
```

| Proprietà | Tipo | Predefinito | Descrizione |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `true` | Se è false, i segmenti `$...$` e `$$...$$` vengono comunque analizzati (quindi gli avvisi sui delimitatori non chiusi scattano ancora) ma sono resi come il loro sorgente TeX letterale. Utile quando il contenuto contiene di proposito il simbolo del dollaro o quando vuoi disattivare del tutto la resa delle formule. |
| `fontSizeScale` | `number` | `1.0` | Moltiplicatore applicato alla dimensione del testo circostante prima della resa: un em del font TeX della formula vale quella dimensione × `fontSizeScale`, cioè `bodyText.fontSize` per una formula in display e per la matematica in linea nel testo corrente, e la dimensione del blocco che la contiene per la matematica in linea in un titolo, in uno stile di paragrafo, in una didascalia o nel corpo di un riquadro. 1,0 corrisponde al testo circostante; valori tra 0,9 e 1,1 sono tipici quando il font matematico sembra un po’ più grande o più piccolo del font della prosa. **Cambiato in postext 1.5:** fino alla 1.4 le formule uscivano circa il 13% più grandi di così (vedi sotto). |
| `color` | `ColorValue` | eredita il colore del testo corrente | Colore della formula resa. Omettilo per ereditare `bodyText.color`. Impostalo esplicitamente quando vuoi che le formule abbiano una tinta diversa dalla prosa, per esempio in accordo con il colore d’accento di un titolo. |
| `marginTop` | `Dimension` | `0.8em` | Spazio sopra un blocco di formule in display. Ignorato per la matematica in linea. |
| `marginBottom` | `Dimension` | `0.8em` | Spazio sotto un blocco di formule in display. È un **minimo**: l’aggancio alla griglia può allungarlo perché la linea di base successiva cada su una riga della griglia (che `page.baselineGrid` disegni la griglia o no). |
| `indentAfterDisplay` | `boolean` | `true` | Fa rientrare la prima riga di un paragrafo che segue una formula in display, come qualsiasi altro paragrafo. Con `false` ogni paragrafo subito dopo una formula in display è composto senza rientro, come continuazione della frase che la formula ha interrotto («dove *L* è…»). Una formula scritta dentro un paragrafo, senza una riga vuota né sopra né sotto, è sempre seguita senza rientro: il testo sotto il suo `$$` di chiusura continua quel paragrafo e non rientra mai (vedi [Formule matematiche](https://postext.dev/it/docs/document-format-inline.md#formule-matematiche)). |
| `keepWithLeadIn` | `boolean` | `false` | Tiene una formula in display nella colonna della riga che la introduce: la penalità predisplay di TeX. Quando la formula non entra sotto l’ultima riga del paragrafo che la precede, quella riga passa con la formula alla colonna o alla pagina successiva; quando le righe lasciate indietro sarebbero meno di `bodyText.widowMinLines` (meno di una se `bodyText.avoidWidows` è disattivato), un paragrafo che si apre in quella colonna passa avanti per intero (con i titoli che chiudono la colonna sopra di esso, secondo `headings.keepWithNext`). La riga portata avanti sta da sola in cima alla colonna successiva, qualunque cosa chieda la regola sulle orfane. Con `false` passa avanti solo la formula, e la riga che la introduce può chiudere la colonna sopra, o stare sopra una figura che apre la successiva. |
| `equationNumbering` | `{ enabled, numberingTemplate, resetOn, counterFormat, format }` | `true`, `'{n}'`, `'never'`, `'decimal'`, `'({n})'` | Come vengono numerate le formule in display che portano un `\label` (vedi *Equazioni numerate* più sotto). `numberingTemplate`, `resetOn` e `counterFormat` funzionano come quelli di un tipo di risorsa: `'{h1}.{n}'` con `resetOn: 'h1'` numera (2.1), (2.2)… per capitolo, `'{h1}.{h2}.{n}'` con `'h2'` per sezione. `format` è il numero come lo stampano la formula e `\eqref`, dove `{n}` sta per il numero: `'[{n}]'` compone [3]. `enabled: false` non numera nulla: un `\label` viene scartato e un rimando a esso stampa la sua pagina. Un segnaposto accetta anche uno stile dopo i due punti (`'{h1:A}.{n}'`: (A.1) in un’appendice contrassegnata da una lettera). |

```ts
math: {
  enabled: true,
  fontSizeScale: 1.0,
  color: { hex: '#295AA3', model: 'hex' },
  marginTop: { value: 1, unit: 'em' },
  marginBottom: { value: 1, unit: 'em' },
}
```

**Dimensione delle formule, cambiata in postext 1.5.** MathJax fornisce il riquadro di una formula in `ex`, e un `ex` del suo font TeX vale 0,442 em. Fino a postext 1.4 il motore lo considerava mezzo em, quindi ogni formula veniva composta circa il 13% più grande di `bodyText.fontSize × fontSizeScale`. Ora le formule escono alla dimensione documentata, e le righe e le pagine con formule si ridistribuiscono. Una configurazione scritta in codice per la 1.4 mantiene la dimensione delle formule della 1.4 passando una volta per `pinLegacyMathSize` di `postext/bundle`, così com’è scritta:

```ts
import { pinLegacyMathSize } from 'postext/bundle';

config = pinLegacyMathSize(config); // formulas, and the space around display formulas, as 1.4 set them
```

Anche altri cambiamenti di regole della 1.5 possono spostarne le pagine: le interruzioni dei titoli, lo spazio attorno a una figura in linea (nel testo corrente e nei riquadri), i segni in linea dei suoi titoli, la dimensione dei suoi capilettera, lo spazio lasciato sotto una riga che termina con i due punti per l’elenco che introduce, le righe che il taglio di un riquadro lascia di un paragrafo o di una voce di elenco, gli a capo dopo una lineetta, la divisione in righe del testo non giustificato, la divisione di un paragrafo sotto un titolo, gli a capo dopo il trattino di una parola composta e lo spazio sotto un contenitore `:::paragraphs`. `migrateConfig`, eseguito una volta con il markdown che la configurazione impagina, fissa quelli di cui questo testo ha bisogno, dimensione delle formule compresa (vedi [Pacchetti scritti da postext 1.4 o precedenti](https://postext.dev/it/docs/configuration-bundles.md#pacchetti-scritti-da-postext-14-o-precedenti)):

```ts
import { migrateConfig } from 'postext/bundle';

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

Questo trattiene ciò che quei cambiamenti di regole sposterebbero, ma non conserva ogni pagina della 1.4. La versione 1.5 corregge anche errori di impaginazione, e una correzione non si può fissare: una configurazione vecchia la riceve come una nuova, quindi una pagina che ne è toccata può comunque spostarsi. Tra queste correzioni: un titolo a tutta larghezza della pagina senza un design proprio viene misurato sulla larghezza della pagina e composto con l’interlinea del suo livello; in un design di titolo non si riserva nulla sotto la linea di base di un capolettera; un capolettera prende il colore della palette della sezione, e viene composto anche su un testo di design il cui `overflow` non è `'wrap'`, che allora va a capo; un paragrafo in un riquadro dipinge la spaziatura tra lettere con cui è stato misurato; un riquadro diviso mantiene la colonna dell’icona su ogni frammento; una riga di riquadro che allargherebbe i suoi spazi oltre 3× viene composta non giustificata, come nel testo corrente; la leva dei paragrafi troppo spaziati non compone mai una riga giustificata più larga di quanto consenta `maxWordSpacing`; un riquadro flottante mantiene un `marginBottom` (in una fascia in alto) o un `marginTop` (in una fascia in basso) più ampio dello spazio dei flottanti; un testo di design centrato o allineato a destra con spaziatura tra lettere (una testatina, il titolo di un’apertura) viene collocato in base alle sue lettere, senza la spaziatura dopo l’ultima; sotto un’apertura a tutta larghezza della pagina, il testo che apre la seconda colonna comincia dove comincerebbe il testo subito sotto l’apertura, anche quando un titolo segue l’apertura; i puntini dell’indice si fermano prima del numero di pagina in un carattere che con la crenatura allontana una sequenza di punti; una testatina legge un titolo così come è scritto, senza spazio dove una delle sue righe finisce dopo un trattino o una lineetta o dentro una parola tagliata per larghezza (`MEDIOAMBIENTALES`, non `MEDIOAMBIENTALE S`), e il `{titleText}` di un design di titolo lo legge allo stesso modo (`thousand-colour`, non `thousand- colour`); un testo ancorato al piede o al centro della fascia di un design di titolo mantiene la fascia abbastanza alta da contenerlo, così non sale più sopra il testo che precede il titolo; una parola più larga della sua riga, tagliata accanto a un trattino che contiene, viene tagliata dopo quel trattino e non ne riceve un secondo; la voce che segue un elenco annidato in un altro prende l’`itemSpacing` del proprio elenco, non quello dell’elenco annidato; e il resto di una parola tagliata perché più larga della sua riga mantiene i propri punti di divisione, così un indirizzo web continua a dividersi nelle sue giunture e una parola composta ai suoi trattini invece che nelle sillabe del dizionario.

`pinLegacyMathSize` moltiplica la scala per 1,1312 (0,5 ÷ 0,442) e divide per lo stesso fattore i margini delle formule in display espressi in `em`. La sola scala non basta per un libro con formule in display: i loro margini sono lunghezze relative alla dimensione della formula stessa, quindi crescerebbero dello stesso 13% e spingerebbero in giù il testo sottostante. Scritti per esteso per i margini predefiniti, i tre valori sono:

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

Dove la configurazione era salvata, il motore se ne accorge e lo fa per te: `openBundle` / `readBundle` per un pacchetto `.postext` scritto prima della 1.5 (vedi [Pacchetti scritti da postext 1.4 o precedenti](https://postext.dev/it/docs/configuration-bundles.md#pacchetti-scritti-da-postext-14-o-precedenti)), e la Sandbox per i libri, la copia di lavoro e i file `postext-config.json` salvati allora (vedi **Sandbox → Persistenza**). Vengono letti tramite `migrateConfig`, che fissa la dimensione (`pinLegacyMathSize`): `fontSizeScale` diventa la scala salvata (1 se non impostata) × 1,1312, e un margine delle formule in display in `em` o `rem`, che è una lunghezza relativa alla dimensione della formula stessa, viene diviso per lo stesso fattore, così lo spazio attorno a una formula in display resta quello che lasciava la 1.4 (il valore predefinito di 0,8 em diventa 0,7072 em). Un margine in un’unità di pagina (`pt`, `mm`…) resta com’è, e così una configurazione con `enabled: false` o il cui libro non contiene alcun `$`. Il vecchio libro viene allora impaginato come lo impaginava la 1.4, e la sua sezione `math` mostra la dimensione con cui è composto. Per comporre invece quel libro alla dimensione attuale, reimposta quei valori: **Formule → Scala del corpo**, *Margine superiore del display* e *Margine inferiore del display* nella Sandbox, oppure in codice:

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

**Equazioni numerate.** Una formula in display con un numero occupa tutta la sua giustezza (la colonna, o la larghezza interna del riquadro in cui si trova): l’equazione è centrata e il suo numero è allineato a destra sulla riga dell’equazione, su ogni riga numerata di un `align`. Un numero nasce da un `\label{eq:x}` (da postext 1.19): le formule con etichetta, e le righe con etichetta di un `align`, `gather`, `alignat`, `flalign` o `eqnarray`, vengono numerate in ordine di lettura secondo `equationNumbering`, a meno che una riga non dica `\nonumber` o `\notag`. Ambienti come `equation` non vengono numerati di per sé: una formula senza etichetta non ha numero. `\tag{…}` stampa l’etichetta che gli dai, tra parentesi, e `\tag*{…}` così come è scritta; nessuno dei due viene contato, e un `\label` accanto a uno dei due gli dà un nome. Un’equazione numerata più larga della sua giustezza deborda a destra, come qualsiasi formula in display. (Fino a postext 1.4 una formula con `\tag` non veniva disegnata affatto; fino alla 1.18 solo `\tag` dava un numero.)

`\eqref{eq:x}` nel testo stampa il numero nel suo `format`, (3), e `\ref{eq:x}` il numero nudo; lo stesso fanno `:ref{id="eq:x"}` e `@eq:x` (vedi [Rimandi](https://postext.dev/it/docs/document-format-notes-references.md#rimandi-e-ancore)), e dentro una formula `\eqref` lo stampa come testo. In un libro impaginato capitolo per capitolo il contatore prosegue dal capitolo precedente: `continuationAfter` lo porta in `LayoutContinuation.statementCounters` (`equation`), e lo schema del libro dà a ogni etichetta il suo numero (`OutlineEntry.numberLabel`), così un rimando a un’equazione di un altro capitolo la stampa.

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

Il resolver e lo stripper seguono le altre sezioni:

```ts
import {
  DEFAULT_MATH_CONFIG,
  resolveMathConfig,
  stripMathDefaults,
} from 'postext';

const resolved = resolveMathConfig(config.math);
const minimal  = stripMathDefaults(config.math);
```

### Avviare il motore matematico

MathJax viene caricato su richiesta, non insieme al resto del motore. Quando impagini nel thread principale, avvialo prima di costruire un documento che contiene formule:

```ts
import { buildDocument, initMathEngine, renderPage } from 'postext';

await initMathEngine(); // loads MathJax once; later calls resolve at once
const doc = buildDocument({ markdown: 'Euler: $e^{i\\pi}+1=0$.' }, config);
document.body.append(renderPage(doc.pages[0], doc));
```

- **Finché il motore non è avviato, le formule sono segnaposto.** Ognuna viene impaginata come un riquadro grigio di dimensione stimata. Se un documento con formule viene impaginato senza che `initMathEngine()` sia mai stato chiamato, la console mostra un avviso che lo segnala.
- **Il worker di impaginazione lo avvia per te.** Una build in `postext/worker` chiama da sé `initMathEngine()` quando il markdown contiene un `$`.
- **Impagina subito, e di nuovo quando è pronto.** `isMathReady()` dice se il motore è in funzione. `onMathReady(fn)` chiama `fn` appena lo è (subito, se lo è già) e restituisce una funzione che annulla la chiamata. Un editor può mostrare subito i segnaposto e impaginare di nuovo quando arriva MathJax; mentre `initMathEngine()` è in corso non viene stampato alcun avviso.
- **Errori.** `initMathEngine()` viene rifiutata quando MathJax non si può caricare, e una chiamata successiva riprova.
- **Qualsiasi bundler, Node o una CDN.** MathJax è incluso nel pacchetto come un unico modulo già impacchettato (circa 1,8 MB prima della compressione, scaricato solo da `initMathEngine`). Il semplice `import { initMathEngine } from 'https://esm.sh/postext'` funziona; non serve `?bundle`. Il pacchetto `mathjax-full` serve solo a compilare postext, quindi installare postext non lo installa. MathJax e il parser mhchem che include sono distribuiti con licenza Apache-2.0: le loro note e il testo della licenza sono distribuiti accanto al modulo, come `dist/math/THIRD_PARTY_LICENSES.txt`.
- **Un solo motore per pagina.** Il motore e la sua cache delle formule rese sono condivisi da tutto ciò che importa `postext` nello stesso realm JavaScript (vedi [Stato globale condiviso in una pagina](https://postext.dev/it/docs/configuration-programmatic-usage.md#stato-globale-condiviso-in-una-pagina)).

Per la grammatica lato documento (`$...$`, `$$...$$`, l’escape di un dollaro letterale), vedi [Formato del documento](https://postext.dev/it/docs/document-format-inline.md#formule-matematiche).
