# Configuração: listas e matemática

> Listas com marcadores e numeradas, seus marcadores, recuos e aninhamento, listas de tarefas, e o tamanho, a cor e o espaçamento das fórmulas matemáticas

- Versão HTML: https://postext.dev/pt/docs/configuration-lists-math
- Última atualização: 2026-10-16
- Tempo de leitura: 19 min
- Outros idiomas: [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), [it](https://postext.dev/it/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)

## Em poucas palavras

Esta página trata das listas e das fórmulas. Uma lista com marcadores indica cada item com um símbolo, e uma lista numerada conta os itens com números ou letras. Você define o marcador, o recuo e o espaço de cada lista, e muda esses valores para listas dentro de listas. As listas de tarefas desenham uma caixinha que pode ser marcada. A última seção define o tamanho, a cor e o espaço em volta das fórmulas matemáticas.

## Listas com marcadores

A propriedade `unorderedLists` controla como são renderizadas as listas com marcadores (`-`, `*`, `+`) e as listas de tarefas do GFM (`- [ ]`, `- [x]`). São aceitos até cinco níveis de aninhamento.

### Padrões das listas com marcadores

| Propriedade | Tipo | Padrão | Descrição |
| --- | --- | --- | --- |
| `fontFamily` | `string` | herda `bodyText.fontFamily` | Fonte usada no texto dos itens. |
| `color` | `ColorValue` | Cor principal (`#295AA3`) | Cor do texto e do marcador dos itens. Vinculada à entrada `main-color` da paleta padrão. |
| `fontWeight` | `number` | `700` | Peso do texto dos itens (100–900). Os marcadores herdam esse peso, a menos que seja substituído por nível. |
| `italic` | `boolean` | `false` | Renderiza o texto dos itens em itálico. |
| `bulletChar` | `string` | `'•'` | Glifo usado como marcador. |
| `bulletFontSize` | `Dimension` | `1 em` | Tamanho do glifo do marcador. As unidades relativas acompanham o tamanho da fonte do corpo. |
| `gap` | `Dimension` | `0.5 em` | Espaço horizontal entre o marcador e o texto do item. |
| `indent` | `Dimension` | `0 em` | Recuo base do nível 1. Os níveis mais profundos partem do início do texto do nível pai, a menos que sejam substituídos (veja abaixo). |
| `bulletVerticalOffset` | `Dimension` | `0 em` | Ajuste fino da posição vertical do marcador. Valores negativos sobem o marcador; valores positivos o descem. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | Espaço antes e depois da lista como um todo. |
| `itemSpacing` | `Dimension` | `0 em` | Espaço vertical extra inserido entre os itens, além da entrelinha. Em volta de uma lista aninhada num item de outra, vale o espaçamento da lista externa dos dois lados, antes do primeiro item da lista aninhada e depois do último (até o postext 1.4 o item depois de uma lista aninhada recebia o espaçamento da lista aninhada). |
| `snapTopToGrid` | `boolean` | `false` | Arredonda para cima o espaço acima da lista para que o primeiro marcador fique na grade de linhas de base, como o texto sob um título; `marginTop` passa então a ser um mínimo. O fim de uma lista devolve o fluxo à grade de qualquer forma, então, com `itemSpacing` em 0, todos os itens se alinham com o texto da coluna ao lado. Desligado por padrão, como até o postext 1.4: uma `marginTop` que não é um número inteiro de linhas deixa os itens fora da grade até a lista terminar. As listas dentro de boxes, cujo interior fica fora da grade, não são afetadas. |
| `hangingIndent` | `boolean` | `true` | Quando ativado, as linhas quebradas se alinham com o primeiro caractere do texto, e não sob o marcador. |
| `levels` | `UnorderedListLevelConfig[]` | — | Substituições por profundidade para os níveis 1–5. Veja abaixo. |

### Extensões para listas de tarefas

Os itens de tarefa do GFM (`- [ ] …`, `- [x] …`) são renderizados como itens com marcador, com uma caixa de seleção no lugar do marcador. O próprio motor desenha a caixa, um quadrado em contorno com uma marca quando a tarefa está concluída: nenhuma fonte é consultada, então ela é igual em todas as máquinas, no canvas, no PDF, no HTML e no EPUB, e as tecnologias assistivas leem `☐` ou `☑`. O lado mede 0,6 em do tamanho do marcador (`bulletFontSize`, ou o `fontSize` do nível), e esse é o espaço que ela ocupa antes do `gap`; no tamanho do texto, ela se apoia na linha de base da primeira linha do item. O traço segue o `fontWeight` do marcador, e a cor, o `color` do marcador. Os campos a seguir se aplicam só aos itens de tarefa:

| Propriedade | Tipo | Padrão | Descrição |
| --- | --- | --- | --- |
| `taskCheckboxChar` | `string` | `'☐'` | Caractere de uma tarefa não marcada. O padrão não é composto como texto: o motor desenha a caixa. Qualquer outro caractere é composto como texto na fonte da lista, que então precisa contê-lo. |
| `taskCheckedChar` | `string` | `'☑'` | Caractere de uma tarefa concluída. O padrão também é desenhado, como uma caixa com marca; qualquer outro caractere é composto como texto na fonte da lista. |
| `taskBox` | `'drawn' \| 'character'` | `'drawn'` | Como os dois caracteres padrão são compostos. `'drawn'`: o motor desenha a caixa. `'character'`: `☐` e `☑` são texto na fonte da lista, como até o postext 1.28; numa fonte que não os tem, o navegador escolhe uma fonte do sistema, e o texto do item começa depois da largura que essa fonte dá. Uma configuração gravada antes da versão 13 é lida com `'character'`, então as linhas dela ficam onde estavam. |
| `taskCompletedStrikethrough` | `boolean` | `true` | Desenha um risco sobre o texto das tarefas concluídas. |
| `taskCompletedColor` | `ColorValue` | herda a cor do item | Cor opcional aplicada ao texto das tarefas concluídas. Quando omitida, usa-se a cor normal do item. |

### Substituições por nível (listas com marcadores)

Cada entrada de `levels` se refere a uma profundidade (1–5) e pode substituir qualquer um dos seguintes:

| Propriedade | Tipo | Descrição |
| --- | --- | --- |
| `bulletChar` | `string` | Glifo do marcador nesta profundidade. |
| `fontFamily` | `string` | Família tipográfica dos itens nesta profundidade. |
| `fontSize` | `Dimension` | Tamanho do glifo do marcador nesta profundidade. |
| `color` | `ColorValue` | Cor do item. |
| `fontWeight` | `number` | Peso do item. |
| `italic` | `boolean` | Liga ou desliga o itálico. |
| `indent` | `Dimension` | Recuo explícito do marcador nesta profundidade. Veja a regra de cascata abaixo. |
| `verticalOffset` | `Dimension` | Ajuste fino vertical do marcador nesta profundidade. |

**Cascata de recuos.** O nível 1 sempre começa no valor geral de `indent` (por padrão `0 em`: os marcadores ficam presos à borda da coluna). Nos níveis 2–5, se você deixar `indent` indefinido, o motor põe o marcador no início do texto do nível *anterior* (recuo do pai + largura do marcador + `gap`). Defina um `indent` explícito num nível para interromper a cascata e fixar essa profundidade onde quiser.

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

## Listas numeradas

A propriedade `orderedLists` controla as listas numeradas (`1.`, `2)` etc.). São aceitos até cinco níveis de aninhamento, e cada profundidade pode usar um formato de número diferente.

### Padrões das listas numeradas

| Propriedade | Tipo | Padrão | Descrição |
| --- | --- | --- | --- |
| `fontFamily` | `string` | herda `bodyText.fontFamily` | Fonte usada no texto dos itens e no número. |
| `color` | `ColorValue` | Cor principal (`#295AA3`) | Cor do texto e do número dos itens. Vinculada à entrada `main-color` da paleta padrão. |
| `fontWeight` | `number` | `700` | Peso do texto dos itens e dos números (100–900). |
| `italic` | `boolean` | `false` | Renderiza o texto dos itens em itálico. |
| `numberFormat` | `OrderedListNumberFormat` | `'arabic'` | Estilo do número: `'arabic'`, `'lower-alpha'`, `'upper-alpha'`, `'lower-roman'`, `'upper-roman'`. As grafias das outras configurações também funcionam (`'decimal'`, `'roman-lower'`, `'i'`…; veja [Grafias dos formatos de numeração](https://postext.dev/pt/docs/configuration-page-layout.md#grafias-dos-formatos-de-numeração)); um valor desconhecido numera em algarismos arábicos e é relatado. |
| `prefix` | `string` | `''` | Texto composto antes do número, no estilo do separador: com `'（'` aqui e `'）'` como separador, uma lista chinesa fica （一）, （二）. Quando o separador é desenhado como um trecho à parte, o prefixo também é, logo antes do número. |
| `separator` | `string` | `'.'` | Caractere posto entre o número e o texto, normalmente `'.'` ou `')'`. |
| `separatorFontFamily` | `string` | herda `fontFamily` | Fonte do separador. Quando algum estilo do separador difere do estilo do número, o separador é desenhado como um trecho à parte depois do número (alinhado à direita); por exemplo, `1` em Optima Bold preto seguido de `•` em DIN Pro Bold azul. |
| `separatorFontWeight` | `number` | herda `fontWeight` | Peso do separador (100–900). |
| `separatorItalic` | `boolean` | herda `italic` | Renderiza o separador em itálico. |
| `separatorColor` | `ColorValue` | herda `color` | Cor do separador. As referências à paleta são respeitadas. |
| `separatorGap` | `Dimension` | `0 em` | Espaço entre o número e o separador. O texto do item continua começando a `gap` do separador. |
| `numberFontSize` | `Dimension` | `1 em` | Tamanho do número. |
| `gap` | `Dimension` | `0.5 em` | Espaço horizontal entre o número e o texto do item. |
| `indent` | `Dimension` | `0 em` | Recuo base do nível 1; os níveis mais profundos partem do início do texto do nível pai, a menos que sejam substituídos. |
| `numberVerticalOffset` | `Dimension` | `0 em` | Ajuste fino da posição vertical do número. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | Espaço antes e depois da lista como um todo. |
| `itemSpacing` | `Dimension` | `0 em` | Espaço vertical extra entre os itens. Em volta de uma lista aninhada num item de outra, vale o espaçamento da lista externa dos dois lados, antes do primeiro item da lista aninhada e depois do último (até o postext 1.4 o item depois de uma lista aninhada recebia o espaçamento da lista aninhada). |
| `snapTopToGrid` | `boolean` | `false` | Arredonda para cima o espaço acima da lista para que o primeiro número fique na grade de linhas de base, como o texto sob um título; `marginTop` passa então a ser um mínimo. O fim de uma lista devolve o fluxo à grade de qualquer forma, então, com `itemSpacing` em 0, todos os itens se alinham com o texto da coluna ao lado. Desligado por padrão, como até o postext 1.4: uma `marginTop` que não é um número inteiro de linhas deixa os itens fora da grade até a lista terminar. As listas dentro de boxes, cujo interior fica fora da grade, não são afetadas. |
| `numberWidth` | `'run' \| 'level' \| 'item'` | `'run'` | A largura da coluna de números de um item, que define onde o seu texto começa; os números ficam alinhados à direita nela. `'run'`: o número mais largo da própria sequência do item, isto é, os itens de uma mesma profundidade sem nada além de itens mais profundos entre eles. Uma figura, um parágrafo ou um boxe entre dois itens inicia uma nova sequência, então `ii)` depois de uma tabela pode começar o texto um pouco mais à direita que `i)` antes dela, e uma lista de nove itens compõe o texto mais à esquerda que uma lista de doze. `'level'`: o número mais largo na profundidade do item em todo o documento (o capítulo, num livro), de modo que todas as listas, e todas as partes de uma lista interrompida, começam o texto no mesmo lugar, como já fazem os recuos dos níveis mais profundos. `'item'`: o número do próprio item, de modo que o texto de cada item começa um `gap` depois do seu próprio rótulo: 第九條 e 第十一條 são seguidos pelo mesmo espaço e os seus textos começam em lugares diferentes, como o Diário Oficial japonês imprime os artigos de uma lei. As linhas seguintes obedecem a `hangingIndent`: com `false` voltam ao recuo da lista, com `true` ficam penduradas sob o texto do próprio item. O recuo de um nível mais profundo continua sendo um só valor por nível. Desde o postext 1.28. |
| `numberAlign` | `'end' \| 'start'` | `'end'` | Como um número fica na sua coluna. `'end'`: junto ao texto, de modo que os números de uma sequência terminam na mesma posição e `9.` e `10.` alinham os pontos. `'start'`: no início da coluna (a esquerda numa página da esquerda para a direita, a direita numa da direita para a esquerda, o alto da linha em texto vertical), de modo que rótulos de comprimentos diferentes começam na mesma posição, como os artigos de uma lei (第九條, 第十一條). A coluna mantém a largura que `numberWidth` lhe dá, então o texto dos itens começa no mesmo lugar nos dois casos; com um separador de estilo próprio, o separador segue o seu número. Desde o postext 1.26. Com `numberWidth: 'item'` a coluna é o próprio número, então os dois valores compõem a mesma lista. |
| `hangingIndent` | `boolean` | `true` | As linhas quebradas se alinham com o primeiro caractere do texto, e não sob o número. |
| `levels` | `OrderedListLevelConfig[]` | — | Substituições por profundidade para os níveis 1–5. |

### Substituições por nível (listas numeradas)

Cada entrada de `levels` pode substituir `numberFormat`, `prefix`, `separator`, `fontFamily`, `fontSize`, `color`, `fontWeight`, `italic`, `indent`, `verticalOffset` e o estilo do separador (`separatorFontFamily`, `separatorFontWeight`, `separatorItalic`, `separatorColor`, `separatorGap`); vale a mesma cascata de recuos das listas com marcadores. O estilo do separador de um nível herda o estilo do número desse mesmo nível, a menos que a configuração do separador para a lista inteira seja informada.

**Alinhamento à direita.** O pipeline mede o número formatado mais largo de uma sequência e recua todos os itens dessa sequência para que os números se alinhem pela borda direita. Numa lista de dez itens renderizada como `1.` – `10.`, os números de um dígito recebem preenchimento à esquerda para que o separador fique na mesma coluna.

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

Isso produz a mistura aninhada clássica:

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

A hierarquia dos documentos chineses (GB/T 15834—2011, Anexo B.3) tem cinco níveis: 一、, depois （一）, depois 1., depois （1） e depois ①:

```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: '' },
  ],
}
```

## Matemática

A propriedade `math` controla como são analisadas e renderizadas as fórmulas LaTeX entre os delimitadores `$...$` (em linha) e `$$...$$` (em destaque). O motor por trás é o MathJax (o pacote `mathjax-full`) no modo de saída SVG, rasterizado no canvas e incorporado como glifos escaláveis no PDF.

```ts
interface MathConfig {
  enabled?: boolean;        // Renderiza o LaTeX. Com false, os trechos passam como TeX literal.
  fontSizeScale?: number;   // × o tamanho do texto ao redor (o tamanho do corpo nas fórmulas em destaque).
  color?: ColorValue;       // Cor das fórmulas; herda a cor do corpo se omitida.
  marginTop?: Dimension;    // Espaço acima dos blocos de fórmula em destaque.
  marginBottom?: Dimension; // Espaço mínimo abaixo; o ajuste à grade de linhas de base pode aumentá-lo.
  indentAfterDisplay?: boolean; // Recua um parágrafo que vem depois de uma fórmula em destaque.
  keepWithLeadIn?: boolean; // Mantém uma fórmula em destaque com a linha que a introduz.
  equationNumbering?: {      // Numera as fórmulas em destaque que levam um \label.
    enabled?: boolean;           // padrão true
    numberingTemplate?: string;  // '{n}'; '{h1}.{n}' numera por capítulo
    resetOn?: ResourceCounterReset; // 'never' | 'h1' … 'h6'
    counterFormat?: ResourceCounterFormat; // 'decimal'
    format?: string;             // '({n})': o que a fórmula e \eqref imprimem
  };
}
```

| Propriedade | Tipo | Padrão | Descrição |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `true` | Com false, os trechos `$...$` e `$$...$$` continuam sendo analisados (então os avisos de delimitador não fechado continuam aparecendo), mas são renderizados como o seu código TeX literal. Útil quando o conteúdo contém cifrões de propósito ou quando você quer desativar por completo a renderização de fórmulas. |
| `fontSizeScale` | `number` | `1.0` | Multiplicador aplicado ao tamanho do texto ao redor antes da renderização: um em da fonte TeX da fórmula é esse tamanho × `fontSizeScale`, ou seja, `bodyText.fontSize` numa fórmula em destaque e nas fórmulas em linha do texto do corpo, e o tamanho do bloco que as contém nas fórmulas em linha de um título, de um estilo de parágrafo, de uma legenda ou do corpo de um boxe. 1,0 iguala o texto ao redor; valores entre 0,9 e 1,1 são comuns quando a fonte matemática parece um pouco maior ou menor que a fonte do texto. **Mudou no postext 1.5:** até a 1.4 as fórmulas saíam cerca de 13% maiores que isso (veja abaixo). |
| `color` | `ColorValue` | herda a cor do corpo | Cor da fórmula renderizada. Omita para herdar `bodyText.color`. Defina explicitamente quando quiser as fórmulas numa cor diferente da do texto, por exemplo igual ao destaque de um título. |
| `marginTop` | `Dimension` | `0.8em` | Espaço acima de um bloco de fórmula em destaque. Ignorado nas fórmulas em linha. |
| `marginBottom` | `Dimension` | `0.8em` | Espaço abaixo de um bloco de fórmula em destaque. É um **mínimo**: o ajuste à grade pode aumentá-lo para que a próxima linha de base caia numa linha da grade (quer `page.baselineGrid` desenhe a grade, quer não). |
| `indentAfterDisplay` | `boolean` | `true` | Recua a primeira linha de um parágrafo que vem depois de uma fórmula em destaque, como em qualquer outro parágrafo. `false` compõe sem recuo todo parágrafo logo depois de uma fórmula em destaque, como continuação da frase que a fórmula interrompeu (“onde *L* é…”). Uma fórmula escrita dentro de um parágrafo (sem linha em branco acima nem abaixo dela) é sempre seguida sem recuo: o texto abaixo do seu `$$` de fechamento continua esse parágrafo e nunca recebe recuo (veja [Fórmulas matemáticas](https://postext.dev/pt/docs/document-format-inline.md#fórmulas-matemáticas)). |
| `keepWithLeadIn` | `boolean` | `false` | Mantém uma fórmula em destaque na coluna da linha que a introduz: a penalidade predisplay do TeX. Quando a fórmula não cabe abaixo da última linha do parágrafo anterior, essa linha vai para a coluna ou página seguinte junto com a fórmula; quando as linhas deixadas para trás seriam menos que `bodyText.widowMinLines` (menos que uma quando `bodyText.avoidWidows` está desligado), um parágrafo que começa nessa coluna passa inteiro adiante (com os títulos que fecham a coluna acima dele, conforme `headings.keepWithNext`). A linha levada fica sozinha no alto da coluna seguinte, seja o que for que a regra de órfãs peça. Com `false` só a fórmula passa adiante, e a linha que a introduz pode fechar a coluna acima ou ficar sobre uma figura que encabeça a seguinte. |
| `equationNumbering` | `{ enabled, numberingTemplate, resetOn, counterFormat, format }` | `true`, `'{n}'`, `'never'`, `'decimal'`, `'({n})'` | Como são numeradas as fórmulas em destaque que levam um `\label` (veja *Equações numeradas* abaixo). `numberingTemplate`, `resetOn` e `counterFormat` funcionam como os de um tipo de recurso: `'{h1}.{n}'` com `resetOn: 'h1'` numera (2.1), (2.2)… por capítulo, e `'{h1}.{h2}.{n}'` com `'h2'`, por seção. `format` é o número tal como a fórmula e `\eqref` o imprimem, com `{n}` no lugar do número: `'[{n}]'` compõe [3]. `enabled: false` não numera nada: um `\label` é descartado, e uma referência a ele imprime a sua página. Um token também aceita um estilo depois de dois-pontos (`'{h1:A}.{n}'`: (A.1) num apêndice com letra). |

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

**Tamanho das fórmulas, alterado no postext 1.5.** O MathJax dá a caixa de uma fórmula em `ex`, e um `ex` da sua fonte TeX equivale a 0,442 em. Até o postext 1.4 o motor o tomava como meio em, de modo que toda fórmula era composta cerca de 13% maior que `bodyText.fontSize × fontSizeScale`. Agora as fórmulas saem no tamanho documentado, e as linhas e páginas com fórmulas são recompostas. Uma configuração escrita em código para a 1.4 mantém o tamanho de fórmula da 1.4 se passar por `pinLegacyMathSize`, de `postext/bundle`, uma única vez, tal como foi escrita:

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

config = pinLegacyMathSize(config); // as fórmulas, e o espaço em volta das fórmulas em destaque, como a 1.4 as compunha
```

Outras mudanças de regras na 1.5 também podem mexer nas suas páginas: as quebras dos títulos, o espaço em volta de uma figura em linha (no texto corrido e nos boxes), as marcas em linha dos seus títulos, o tamanho das suas capitulares, o espaço reservado sob uma linha terminada em dois-pontos para a lista que ela introduz, as linhas que o corte de um boxe deixa de um parágrafo ou de um item de lista, as quebras de linha depois de um travessão, a quebra do texto em bandeira, a divisão de um parágrafo sob um título, as quebras de linha depois do hífen de uma palavra composta e o espaço sob um contêiner `:::paragraphs`. `migrateConfig`, executado uma vez com o markdown que a configuração diagrama, fixa as que esse texto precisa, o tamanho das fórmulas incluído (veja [Pacotes escritos pelo postext 1.4 ou anterior](https://postext.dev/pt/docs/configuration-bundles.md#pacotes-gravados-pelo-postext-14-ou-anterior)):

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

config = migrateConfig(config, undefined, { content: markdown }); // quebras de títulos, fórmulas, espaços em linha, marcas de títulos, capitulares, linhas com dois-pontos, cortes de boxes, quebras após travessão, quebras de compostos, texto em bandeira, divisões sob um título e espaço dos contêineres como a 1.4 os compunha
```

Isso segura o que essas mudanças de regras moveriam, mas não preserva todas as páginas da 1.4. A versão 1.5 também corrige bugs de layout, e uma correção não tem fixação: uma configuração antiga a recebe como uma nova, então uma página afetada por ela ainda pode mudar. Entre elas: um título na largura da página sem design próprio é medido na largura da página e composto na entrelinha do seu nível; nada é reservado sob a linha de base de uma capitular num design de título; uma capitular toma a cor de paleta da seção e é composta mesmo num texto de design cujo `overflow` não é `'wrap'`, que então quebra linhas; um parágrafo num boxe pinta o tracking com que foi medido; um boxe dividido mantém a coluna do ícone em todos os fragmentos; uma linha de boxe que esticaria os espaços além de 3× é composta em bandeira, como no texto corrido; o recurso de parágrafo frouxo nunca compõe uma linha justificada mais larga do que `maxWordSpacing` permite; um boxe flutuante mantém uma `marginBottom` (numa faixa superior) ou uma `marginTop` (numa faixa inferior) maior que o espaço entre flutuantes; um texto de design centralizado ou alinhado à direita com tracking (um cabeço, o título de uma abertura) é posicionado pelas suas letras, sem o tracking depois da última; sob uma abertura na largura da página, o texto que abre a segunda coluna começa onde começaria o texto logo abaixo da abertura, também quando um título segue a abertura; os pontos do sumário param antes do número de página numa fonte cujo kerning afasta uma sequência de pontos; um cabeço lê um título tal como foi escrito, sem espaço onde uma das suas linhas termina depois de um hífen ou de um travessão ou dentro de uma palavra cortada por largura (`MEDIOAMBIENTALES`, não `MEDIOAMBIENTALE S`), e o `{titleText}` de um design de título o lê do mesmo jeito (`thousand-colour`, não `thousand- colour`); um texto ancorado no pé ou no meio da faixa de um design de título mantém a faixa alta o bastante para contê-lo, de modo que ele não sobe mais sobre o texto acima do título; uma palavra mais larga que a sua linha, cortada junto a um hífen que ela própria tem, é cortada depois desse hífen e não recebe um segundo; o item depois de uma lista aninhada noutra recebe o `itemSpacing` da sua própria lista, não o da lista aninhada; e o resto de uma palavra cortada por ser mais larga que a sua linha mantém os seus próprios pontos de quebra, de modo que um endereço web continua quebrando nas suas junções, e uma palavra composta nos seus hifens, em vez de nas sílabas do dicionário.

`pinLegacyMathSize` multiplica a escala por 1,1312 (0,5 ÷ 0,442) e divide pelo mesmo fator as margens das fórmulas em destaque em `em`. Só a escala não basta para um livro com fórmulas em destaque: as margens delas são medidas do tamanho da própria fórmula, então cresceriam os mesmos 13% e empurrariam para baixo o texto abaixo delas. Escritos por extenso para as margens padrão, os três valores são:

```ts
math: {
  fontSizeScale: 1.131,
  marginTop: { value: 0.7072, unit: 'em' },
  marginBottom: { value: 0.7072, unit: 'em' },
} // fórmulas do tamanho que a 1.4 compunha, com o espaço que a 1.4 deixava em volta
```

Quando se sabe onde a configuração estava guardada, o motor faz isso por você: `openBundle` / `readBundle` num pacote `.postext` escrito antes da 1.5 (veja [Pacotes escritos pelo postext 1.4 ou anterior](https://postext.dev/pt/docs/configuration-bundles.md#pacotes-gravados-pelo-postext-14-ou-anterior)), e o Sandbox nos livros, na cópia de trabalho e nos arquivos `postext-config.json` salvos naquela época (veja **Sandbox → Persistência**). Eles são lidos por meio de `migrateConfig`, que fixa o tamanho (`pinLegacyMathSize`): `fontSizeScale` passa a ser a escala guardada (1 quando não definida) × 1,1312, e uma margem de fórmula em destaque em `em` ou `rem` (uma medida do tamanho da própria fórmula) é dividida pelo mesmo fator, de modo que o espaço em volta de uma fórmula em destaque fica como a 1.4 o deixava (os 0,8 em padrão passam a 0,7072 em). Uma margem numa unidade de página (`pt`, `mm`…) fica como está, assim como uma configuração com `enabled: false` ou uma cujo livro não tem nenhum `$`. O livro antigo é então diagramado como a 1.4 o diagramava, e a sua seção `math` mostra o tamanho em que é composto. Para compor esse livro no tamanho atual, redefina esses valores: **Fórmulas → Escala de tamanho**, *Margem acima (destaque)* e *Margem abaixo (destaque)* no Sandbox, ou em código:

```ts
math: { ...config.math, fontSizeScale: 1, marginTop: undefined, marginBottom: undefined } // tamanho e margens atuais
```

**Equações numeradas.** Uma fórmula em destaque com número ocupa a sua medida (a coluna, ou a largura interna do boxe em que está): a equação fica centralizada e o seu número, alinhado à direita na linha da equação, em cada linha numerada de um `align`. O número vem de um `\label{eq:x}` (desde o postext 1.19): as fórmulas rotuladas, e as linhas rotuladas de um `align`, `gather`, `alignat`, `flalign` ou `eqnarray`, são numeradas em ordem de leitura com `equationNumbering`, a menos que uma linha diga `\nonumber` ou `\notag`. Ambientes como `equation` não são numerados por si sós: uma fórmula sem rótulo não tem número. `\tag{…}` imprime o rótulo que você der, entre parênteses, e `\tag*{…}`, tal como foi escrito; nenhum dos dois é contado, e um `\label` ao lado de um deles lhe dá um nome. Uma equação numerada mais larga que a sua medida transborda para a direita, como qualquer fórmula em destaque. (Até o postext 1.4 uma fórmula com `\tag` não era desenhada; até a 1.18 só `\tag` numerava uma fórmula.)

`\eqref{eq:x}` no texto imprime o número no seu `format`, (3), e `\ref{eq:x}`, o número sozinho; o mesmo fazem `:ref{id="eq:x"}` e `@eq:x` (veja [Referências cruzadas](https://postext.dev/pt/docs/document-format-notes-references.md#referências-cruzadas-e-âncoras)), e dentro de uma fórmula `\eqref` o imprime como texto. Num livro diagramado capítulo por capítulo, o contador continua a partir do capítulo anterior: `continuationAfter` o leva em `LayoutContinuation.statementCounters` (`equation`), e o esboço do livro dá a cada rótulo o seu número (`OutlineEntry.numberLabel`), de modo que uma referência a uma equação de outro capítulo a imprime.

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

O resolvedor e o redutor seguem o padrão das outras seções:

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

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

### Inicializar o motor de fórmulas

O MathJax é carregado sob demanda, não junto com o resto do motor. Quando você diagrama na thread principal, inicialize-o antes de construir um documento que tenha fórmulas:

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

await initMathEngine(); // carrega o MathJax uma vez; as chamadas seguintes resolvem na hora
const doc = buildDocument({ markdown: 'Euler: $e^{i\\pi}+1=0$.' }, config);
document.body.append(renderPage(doc.pages[0], doc));
```

- **Até o motor rodar, as fórmulas são marcadores de posição.** Cada uma é diagramada como uma caixa cinza de tamanho estimado. Se um documento com fórmulas for diagramado sem que `initMathEngine()` tenha sido chamado alguma vez, o console mostra um aviso dizendo isso.
- **O worker de layout o inicializa por você.** Uma construção em `postext/worker` chama `initMathEngine()` por conta própria quando o markdown contém um `$`.
- **Diagramar agora e de novo quando estiver pronto.** `isMathReady()` diz se o motor está rodando. `onMathReady(fn)` chama `fn` assim que ele estiver (na hora, se já estiver) e devolve uma função que cancela a chamada. Um editor pode mostrar os marcadores de posição de imediato e diagramar de novo quando o MathJax chegar; nenhum aviso é impresso enquanto `initMathEngine()` está em andamento.
- **Falha.** `initMathEngine()` rejeita quando o MathJax não pode ser carregado, e uma chamada posterior tenta de novo.
- **Qualquer bundler, Node ou uma CDN.** O MathJax vem dentro do pacote como um único módulo pré-empacotado (cerca de 1,8 MB antes da compressão, baixado só por `initMathEngine`). O simples `import { initMathEngine } from 'https://esm.sh/postext'` funciona; não é preciso `?bundle`. O pacote `mathjax-full` só é necessário para compilar o postext, então instalar o postext não o instala. O MathJax e o analisador mhchem que ele inclui têm licença Apache-2.0: os avisos deles e o texto da licença acompanham o módulo, em `dist/math/THIRD_PARTY_LICENSES.txt`.
- **Um motor por página.** O motor e o seu cache de fórmulas renderizadas são compartilhados por tudo o que importa `postext` no mesmo realm JavaScript (veja [Estado global compartilhado numa página](https://postext.dev/pt/docs/configuration-programmatic-usage.md#estado-global-compartilhado-em-uma-página)).

Para a gramática do lado do documento (`$...$`, `$$...$$`, como escapar um cifrão literal), veja [Formato do documento](https://postext.dev/pt/docs/document-format-inline.md#fórmulas-matemáticas).
