# Configuración: página y disposición

> El tamaño de página, los márgenes y la rejilla base, las columnas y su medianil, y los encabezados y pies de página

- Versión HTML: https://postext.dev/es/docs/configuration-page-layout
- Última actualización: 2026-10-10
- Tiempo de lectura: 6 min
- Otros idiomas: [en](https://postext.dev/en/docs/configuration-page-layout.md), [ca](https://postext.dev/ca/docs/configuration-page-layout.md), [pt](https://postext.dev/pt/docs/configuration-page-layout.md), [zh](https://postext.dev/zh/docs/configuration-page-layout.md), [ja](https://postext.dev/ja/docs/configuration-page-layout.md), [ar](https://postext.dev/ar/docs/configuration-page-layout.md)

## En pocas palabras

Esta página reúne los ajustes de la hoja. Eliges el tamaño de página, los márgenes, el lado por el que se encuaderna el libro y la rejilla sobre la que se apoyan las líneas de texto. Decides cuántas columnas tiene la página y cuánto espacio las separa. También decides qué se imprime arriba y abajo en cada página, como el número de página o el título del capítulo. Es una de las nueve páginas de la referencia de configuración.

## Página

La propiedad `page` controla las dimensiones físicas y la apariencia de la página.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `sizePreset` | `PageSizePreset` | `'17x24'` | Tamaño de página predefinido. Establece `'custom'` para usar ancho/alto explícitos. |
| `width` | `Dimension` | `17 cm` | Ancho de página. Se toma de `sizePreset` cuando se omite; un valor explícito siempre prevalece (usa `sizePreset: 'custom'` para tamaños totalmente personalizados). |
| `height` | `Dimension` | `24 cm` | Alto de página. Se toma de `sizePreset` cuando se omite; un valor explícito siempre prevalece. |
| `margins` | `PageMargins` | `2 cm` todos los lados | Espacio entre el borde de la página y el área de contenido. Cada lado (superior, inferior, izquierdo, derecho) se configura independientemente. Con `mirror: true` los márgenes son márgenes *de páginas enfrentadas*: `left` es el margen interior (del lomo) y `right` el exterior; las páginas impares (la página 1 es impar) los mantienen tal cual y las pares los intercambian, de modo que el área de contenido — y con ella las columnas, las bandas de flotantes, los contenedores de encabezado/pie y las bandas de apertura — se desplaza a lo largo del pliego. Por defecto `false`. Ver más abajo. |
| `backgroundColor` | `ColorValue` | `transparent` | Color de fondo de la página. |
| `dpi` | `number` | `300` | Los píxeles por pulgada con los que trabaja la maquetación: cómo se convierten las unidades físicas (cm, mm, in, pt) en sus píxeles. Un mapa de bits sin resolución propia ocupa un píxel de maquetación por cada píxel de imagen, así que se imprime a estos ppp: deja 300 para imprenta, o da una resolución a las imágenes (`Resource.bitmap.resolution`, `layout.bitmapResolution`; véase [Formato del documento › Tamaño de los mapas de bits](https://postext.dev/es/docs/document-format.md#tamaño-de-los-mapas-de-bits)). El [preflight](https://postext.dev/es/docs/configuration-fonts-colors-viewers.md#preflight) comprueba la resolución efectiva de cada imagen. |
| `cutLines` | `CutLinesConfig` | desactivado | Mostrar marcas de corte en las esquinas de la página para impresión. Al activarlo, el lienzo se expande para incluir el área de sangrado y las marcas de corte. Ver más abajo. |
| `baselineGrid` | `BaselineGridConfig` | desactivado | Dibujar la rejilla base sobre las páginas, para comprobar el ritmo vertical. La maquetación se ajusta a la rejilla tanto si se dibuja como si no. Ver más abajo. |
| `binding` | `'auto' \| 'left' \| 'right'` | `'auto'` | El borde por el que se encuaderna el libro. `'auto'` es `'right'` cuando `layout.writingMode` es `'vertical-rl'`, cuando el documento va de derecha a izquierda ([`direction`](https://postext.dev/es/docs/configuration-text.md#dirección-del-texto)) o cuando su sección [`comics`](https://postext.dev/es/docs/configuration-comics.md#cómics) se lee de derecha a izquierda (un manga, una edición japonesa o en chino tradicional), y `'left'` en otro caso. Un libro encuadernado por la derecha empieza en una página izquierda y espeja los márgenes al revés. Vale para todo el libro: el `layout` propio de un estilo de título no lo cambia. Ver [Encuadernación](https://postext.dev/es/docs/configuration-page-layout.md#encuadernación). |

### Márgenes simétricos (espejo)

Los libros se leen por pliegos, y el margen interior suele diferir del exterior. `margins.mirror` convierte los cuatro márgenes en márgenes de páginas enfrentadas:

```json
{
  "page": {
    "margins": {
      "top": { "value": 2, "unit": "cm" },
      "bottom": { "value": 2.5, "unit": "cm" },
      "left": { "value": 2.2, "unit": "cm" },
      "right": { "value": 1.4, "unit": "cm" },
      "mirror": true
    }
  }
}
```

Con esta configuración toda página impar tiene 2,2 cm de margen a la izquierda (el lomo) y 1,4 cm a la derecha (el corte delantero); toda página par tiene 1,4 cm a la izquierda (el corte delantero) y 2,2 cm a la derecha (el lomo). Cada página compuesta lleva su propio `contentArea` en la `VDTPage`, así que todo lo que deriva de él — columnas, bandas de flotantes a todo el ancho, contenedores de encabezado y pie, y bandas de apertura con `span: 'page'` — sigue automáticamente la geometría espejada. Los marcos de página y sangre que usan los elementos de diseño anclados a `'page'` / `'bleed'` no se ven afectados: describen el pliego físico, no los márgenes.

### Encuadernación

«Los documentos chinos compuestos en vertical se encuadernan por el lado derecho, y los compuestos en horizontal por el izquierdo» ([clreq §7.1.1.1](https://www.w3.org/TR/clreq/#x7-1-1-1-basic-elements-of-page-formatting)). `page.binding: 'right'` compone un libro para el borde derecho:

- La página 1 sigue siendo impar y sigue siendo la página impar del pliego (recto), así que `breakBefore.parity`, `:::pagebreak{parity}`, los elementos de diseño con `parity` y la cuenta de páginas conservan su sentido. Lo que cambia es el lado en que queda la impar: la página izquierda del pliego. Un capítulo que empieza en impar empieza en una página izquierda ([clreq §7.1.3.3](https://www.w3.org/TR/clreq/#x7-1-3-3-how-to-handle-headings-with-new-recto-and-page-break)).
- Con `margins.mirror`, `left` sigue siendo el margen interior, pero son las páginas impares las que lo cambian de lado: la página 1 tiene el margen interior a su derecha y la 2 a su izquierda. La columna lateral de `oneAndHalf` en `'outer'` / `'inner'`, el flotante girado que se apoya en el lomo, los márgenes de las páginas de parte y los iconos de esquina `'outer'` / `'inner'` de las cajas siguen la misma regla.
- El documento lo indica (`VDTDocument.binding: 'right'`), de modo que quien lo muestra no tiene que leer la configuración: el Sandbox enseña los pliegos como `[3 | 2]`, con la página 1 sola a la izquierda del lomo, y su visor HTML ordena las páginas de derecha a izquierda, se abre por el extremo derecho y la flecha izquierda pasa a la página siguiente. `renderToHtml` en modo múltiple ordena la fila de derecha a izquierda.
- El PDF lleva `/ViewerPreferences << /Direction /R2L >>` y `/PageLayout /TwoPageRight` (la página 1 sola y luego por pares), etiquetado o no. Acrobat y Foxit los respetan; el visor integrado de Chrome no hace caso de ninguno.

Los folios y los encabezados no cambian de lado por sí solos: una plantilla que pone el número de página en la esquina exterior necesita sus elementos de página par e impar preparados para el borde derecho (los elementos admiten `parity`).

Un libro escrito de derecha a izquierda (árabe, persa, hebreo…) también se encuaderna por la derecha: `'auto'` da el borde derecho cuando la [`direction`](https://postext.dev/es/docs/configuration-text.md#dirección-del-texto) del documento resulta `'rtl'`. Un libro así espeja además todo su flujo: su primera columna es la de la derecha, y sus sangrías, marcadores de lista, flotantes y notas quedan a la derecha; las ranuras de cabecera y pie siguen siendo físicas. Véase [Composición árabe](https://postext.dev/es/docs/arabic-layout.md#orden-de-las-páginas-y-encuadernación-por-la-derecha).

Un cómic que se lee de derecha a izquierda también se encuaderna por la derecha: `'auto'` da el borde derecho cuando la configuración tiene una sección `comics` cuyo sentido de lectura resulta `'rtl'`. Es el caso de un manga (`comics.artDirection: 'rtl'`) y de una edición japonesa o en chino tradicional de un cómic occidental. La sección decide por todo el libro, no los bloques `:::page` de un capítulo. Véase [Cómics](https://postext.dev/es/docs/comics.md#sentido-de-lectura).

### Tamaños de página predefinidos

| Preset | Ancho | Alto | Uso habitual |
| --- | --- | --- | --- |
| `'11x17'` | 11 cm | 17 cm | Libros de bolsillo |
| `'12x19'` | 12 cm | 19 cm | Formato rústica estándar |
| `'17x24'` | 17 cm | 24 cm | Libros técnicos, manuales |
| `'21x28'` | 21 cm | 28 cm | Revistas, informes (cercano a A4) |
| `'broadsheet'` | 375 mm | 597 mm | Periódicos de formato sábana |
| `'berliner'` | 315 mm | 470 mm | Periódicos de formato berlinés |
| `'tabloid'` | 280 mm | 430 mm | Tabloides |
| `'compact'` | 297 mm | 420 mm | Periódicos compactos (una sábana doblada por la mitad) |

> **Figura: Tamaños de página predefinidos**
> Cuatro tamaños de página predefinidos dibujados a escala proporcional: bolsillo 11x17, rústica 12x19, técnico 17x24 y cercano a A4 21x28 cm.
>
> *Presets dibujados a escala proporcional.*

Los cuatro formatos de periódico llegan con postext 1.18 y no aparecen en el dibujo: una página sábana tiene casi cuatro veces la superficie de una de 21 × 28. Suelen componerse con la [disposición `'multiple'`](https://postext.dev/es/docs/configuration-page-layout.md#tipos-de-disposición): seis columnas son habituales en una sábana y cinco en un tabloide.

### Rejilla base

La rejilla base es el ritmo del texto de cuerpo: líneas separadas por el interlineado del cuerpo, contadas desde el borde superior del área de contenido. La maquetación la usa tanto si se dibuja como si no: los encabezados, los finales de lista, los recuadros, las figuras y las fórmulas en bloque devuelven el texto a la rejilla (salvo que su propio `snapToGrid` esté desactivado), de modo que las líneas de columnas vecinas quedan alineadas. `enabled` solo dibuja las líneas, en el lienzo, el PDF y las vistas del Sandbox, para comprobar ese ritmo; activarla o desactivarla no mueve nada. Las líneas cubren solo el texto real de la página — desde la primera línea de texto hasta la última — de modo que las bandas de flotantes, las páginas en blanco por paridad y el espacio sobrante al final no muestran rejilla.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `false` | Si se dibujan las líneas de la rejilla (lienzo y PDF). Solo el dibujo: la maquetación es la misma en ambos casos. |
| `color` | `ColorValue` | `#cccccc` | Color de las líneas de la rejilla. |
| `lineWidth` | `Dimension` | `0.5 pt` | Grosor de las líneas de la rejilla. |

```ts
page: {
  baselineGrid: { enabled: true, color: { hex: '#e0e0e0', model: 'hex' } }
}
```

### Marcas de corte

Al activarse, el lienzo se expande para incluir una zona de sangrado y el motor dibuja marcas de corte en cada esquina para producción impresa. El PDF da a cada página una TrimBox y una BleedBox; un archivo [PDF/X](https://postext.dev/es/docs/configuration-fonts-colors-viewers.md#pdfx-1a-y-pdfx-4) las lleva aunque no haya marcas de corte. En el Sandbox se ajustan en **Exportación › Preparación para imprenta**.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `false` | Si se expande el lienzo con sangrado y se dibujan las marcas de corte. |
| `bleed` | `Dimension` | `3 mm` | Área extra alrededor de la página usada como sangrado de impresión. |
| `markLength` | `Dimension` | `5 mm` | Longitud de cada marca de corte. |
| `markOffset` | `Dimension` | `3 mm` | Separación entre el borde de corte y el inicio de cada marca. Una marca nunca empieza dentro del sangrado: si `bleed` es mayor, la marca empieza en el borde del sangrado. |
| `markWidth` | `Dimension` | `0.25 pt` | Grosor de las marcas de corte. |
| `color` | `ColorValue` | `#000000` | Color de las marcas de corte en el lienzo (la vista en pantalla). El PDF las pinta siempre en color de registro (ver más abajo). |

El pliego crece `bleed + markOffset + markLength` por cada lado, y la página cortada queda en el centro. Cada esquina del corte lleva dos marcas de `markLength` de largo, cada una en la prolongación de uno de los bordes que se encuentran en ella. Una marca empieza a `markOffset` del corte, o en el borde del sangrado si `bleed` es el mayor de los dos, de modo que ninguna marca cae sobre una imagen que se extiende hasta el sangrado. Con los valores por defecto (3 mm de sangrado y 3 mm de separación), las marcas van de 3 a 8 mm fuera del corte, y por fuera de ellas queda una franja en blanco de 3 mm alrededor del pliego. `cropMarkSegments(page, doc.config.page, doc.trimOffset)` devuelve las ocho marcas de una página en píxeles, las mismas que dibujan el canvas y el PDF. El tercer argumento es la distancia a la que queda el corte dentro del pliego, el valor con el que se escribe el `TrimBox` del PDF; si falta, se calcula a partir de `cutLines` del mismo modo.

Fuera del sangrado solo se imprimen las marcas. Todo lo que pinta la página, incluidos los elementos de diseño anclados a `'page'` o a `'bleed'`, se recorta a la caja de sangrado en el canvas, en el PDF y en la salida HTML, como lo recorta una exportación de maquetación: una banda o una imagen que se sale del sangrado a propósito se corta en el borde del sangrado, donde la guillotina la perdería de todos modos. Hasta postext 1.4 un elemento así seguía por encima de las marcas hasta el borde del pliego.

En el PDF (`postext-pdf`), la MediaBox de cada página es el pliego entero. La página lleva además una TrimBox, la página cortada, y una BleedBox, el corte más el sangrado, que leen las herramientas de imposición y de preflight. Las marcas se pintan en color de registro, la separación `/All`, y se imprimen en todas las planchas. Es así en cualquier espacio de color en que se escriba el PDF (RGB, escala de grises o CMYK): un negro corriente llegaría a la imprenta como negro enriquecido o solo en la plancha del negro. `color` solo se aplica al lienzo.

### Numeración

El bloque `page.pageNumbering` controla cómo se formatean las etiquetas de página y dónde empieza el contador. Define únicamente el valor por defecto de todo el documento — para reiniciar la numeración en medio del documento (por ejemplo, números romanos en las páginas preliminares que pasan a decimal desde 1 en los capítulos), usa la directiva `:::numbering` (consulta **Formato del documento → Directivas**).

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `format` | `'decimal' \| 'lower-roman' \| 'upper-roman' \| 'lower-alpha' \| 'upper-alpha'`, o un estilo de Asia oriental | `'decimal'` | Estilo numérico utilizado para renderizar las etiquetas de página. Los estilos de Asia oriental (`'trad-chinese-informal'` numera las páginas 一, 二, 三) figuran en [Grafías de los formatos de numeración](https://postext.dev/es/docs/configuration-page-layout.md#grafías-de-los-formatos-de-numeración). |
| `startAt` | `number` | `1` | Valor numérico asignado a la primera página, independientemente del formato. `format: 'lower-roman', startAt: 1` produce `i, ii, iii, …`; `format: 'decimal', startAt: 17` produce `17, 18, 19, …`. |

La etiqueta calculada se almacena en cada `VDTPage` como `pageLabel` y es el valor que resuelve el marcador `{pageNumber}` en encabezados y pies. Los PDFs emiten un árbol `/PageLabels` de modo que el indicador de página y la navegación «Ir a la página» de Preview / Acrobat coinciden exactamente con las etiquetas impresas. Un estilo sin código en PDF (los numerales chinos, las cifras en círculo y las de ancho completo) se escribe página a página, de modo que el lector muestra también 一, 二, 三.

#### Grafías de los formatos de numeración

Tres ajustes eligen un formato de numeración, y cada uno creció con su propia grafía: las etiquetas de página (`page.pageNumbering.format` y `:::numbering{format=…}`) dicen `lower-roman`, las listas numeradas (`orderedLists.numberFormat`) dicen `arabic` para el decimal y los tipos de recurso (`counterFormat`) dicen `roman-lower`. Todos aceptan todas las grafías de la tabla, así que un formato copiado de un ajuste funciona en los demás. Los nombres no distinguen mayúsculas; las formas de un solo carácter sí (`i` e `I` son distintas).

| Formato | Imprime | Grafías aceptadas |
| --- | --- | --- |
| Decimal | `1, 2, 3` | `decimal`, `arabic`, `1` |
| Romano en minúsculas | `i, ii, iii` | `lower-roman`, `roman-lower`, `i` |
| Romano en mayúsculas | `I, II, III` | `upper-roman`, `roman-upper`, `I` |
| Alfabético en minúsculas | `a, b, c` | `lower-alpha`, `alpha-lower`, `lower-latin`, `a` |
| Alfabético en mayúsculas | `A, B, C` | `upper-alpha`, `alpha-upper`, `upper-latin`, `A` |
| Numerales chinos, simplificado | 一, 十二, 一百零一 | `simp-chinese-informal`, `一` en un documento en chino simplificado |
| Numerales chinos, tradicional | 一, 十二, 一萬 | `trad-chinese-informal`, `cjk-ideographic`, `一` en un documento en chino tradicional |
| Numerales chinos financieros, simplificado | 壹, 壹拾贰, 壹佰贰拾 | `simp-chinese-formal`, `壹` en un documento en chino simplificado |
| Numerales chinos financieros, tradicional | 壹, 壹拾貳, 壹佰貳拾 | `trad-chinese-formal`, `壹` en un documento en chino tradicional |
| Cifras chinas | 一二〇, 二〇二六 | `cjk-decimal`, `〇` |
| Troncos celestes | 甲, 乙, 丙 … 癸 | `cjk-heavenly-stem`, `甲` |
| Ramas terrestres | 子, 丑, 寅 … 亥 | `cjk-earthly-branch`, `子` |
| Numerales japoneses | 一, 十二, 百一, 一万一 | `japanese-informal`, `一` en un documento japonés |
| Numerales japoneses formales | 壱, 壱拾弐, 壱百 | `japanese-formal`, `壱` |
| Hiragana, orden gojūon | あ, い, う … ん, ああ | `hiragana`, `あ` |
| Katakana, orden gojūon | ア, イ, ウ … ン, アア | `katakana`, `ア` |
| Hiragana, orden iroha | い, ろ, は … す, いい | `hiragana-iroha`, `い` |
| Katakana, orden iroha | イ, ロ, ハ … ス, イイ | `katakana-iroha`, `イ` |
| En círculo | ①, ②, ③ … ㊿ | `circled-decimal`, `①` |
| Cifras de ancho completo | １, ２, ３ | `fullwidth-decimal`, `１` |
| Cifras arábigo-índicas | ١, ٢, ٣ … ١٠ | `arabic-indic`, `١` |
| Cifras persas | ۱, ۲, ۳ … ۱۰ | `persian`, `urdu`, `۱` |
| Letras árabes, orden abyad | أ, ب, ج, د, هـ … غ, أأ | `abjad`, `أبجد` |
| Letras árabes, orden alfabético | أ, ب, ت, ث … ي, أأ | `hijai`, `arabic-alpha`, `arabic-alphabetic`, `أبتث` |
| Numerales abyad | ا, ب … يا (11), غتمو (1446) | `arabic-abjad` |
| Numerales abyad, valores magrebíes | ص (60), ض (90), ش (1000) | `arabic-abjad-maghrebi`, `maghrebi-abjad` |

Los estilos de Asia oriental conservan su nombre de [CSS Counter Styles](https://www.w3.org/TR/css-counter-styles-3/#limited-chinese) en los tres ajustes. Los numerales chinos informales escriben 十 del 10 al 19 sin un 一 delante (十二, pero 一百一十), un solo 零 por cada tramo de ceros dentro del número (一百零一, 一千零五十), y 万 o 萬 para la decena de millar, 亿 o 億 para los cien millones (一万零一十). Solo `cjk-decimal` usa 〇, cifra a cifra, como se escriben los años (二〇二六, GB/T 15835—2011). Los troncos llegan al 10, las ramas al 12 y las cifras en círculo al 50; más allá, el número se imprime en cifras. `一` y `壹` siguen la escritura del `locale` del documento: tradicional para `zh-Hant`, `zh-TW` o `zh-HK`, simplificada en los demás casos. Algunas ediciones antiguas escriben 101 como 一百一, sin 零; Postext no imprime esa forma.

Los estilos japoneses (desde postext 1.16) siguen también CSS Counter Styles. `japanese-informal` escribe 十 sin 一 delante y sin 零 para una posición vacía (百一, 千十), y `japanese-formal`, los 大字 壱 弐 参 拾 百 阡, con 壱 delante de cada unidad (壱拾, 壱百). CSS detiene los dos en 9999; Postext sigue por grupos de cuatro cifras con 万 億 兆 (en el formal, 萬 億 兆), y cada grupo conserva su 一 delante de una unidad: 一万一 es 10 001, y 一億一万, 100 010 000. En un documento japonés (`ja`, `ja-JP`…) `一` significa `japanese-informal`, así que `第{1:一}章` imprime ahí 第百一章 y en uno chino 第一百零一章; `壹` sigue siendo el de los numerales formales chinos. Las series de kana son las listas de CSS: 48 kana en el orden del gojūon (con ゐ y ゑ) y 47 en el del poema iroha; tras el último siguen con dos kana (ああ, いい), y no tienen cero, así que un elemento numerado 0 imprime `0`. Las cifras kanji posicionales (二〇二六), la forma de los años y los folios, son `cjk-decimal`.

Los estilos árabes conservan el nombre CSS cuando lo hay (`arabic-indic`, `persian`; `urdu` y `maghrebi-abjad`, de la nota del W3C *Ready-made Counter Styles*, se leen como `persian` y `arabic-abjad-maghrebi`). `arabic` mantiene su sentido de siempre: las cifras europeas. `arabic-abjad` escribe los numerales abyad aditivos del árabe clásico y de la foliación de manuscritos, el valor mayor primero: 11 es يا, 1446 غتمو, y el número de millares va antes de غ (2000 بغ, 1002 غب); a partir de 999 999 el número se imprime en cifras. La nota del W3C usa ese nombre para una serie de 28 letras en la que 11 es ك; Postext llama a esa serie `abjad`, la que letra los elementos de lista en orden abyad (أ، ب، ج، د، هـ), y `hijai` al orden alfabético (أ، ب، ت، ث). Las dos escriben la primera letra con su hamza (أ) y una he que quedaría aislada como هـ, con tatweel, para que no se lean como las cifras ١ y ٥; pasadas las 28 letras se duplican, como `lower-alpha` (أأ, أب). Los valores magrebíes siguen la regla mnemotécnica صعفض قرست ثخذ ظغش (ص 60, ض 90); la lista del W3C intercambia ص y ض. Una sola أ no distingue las dos series de letras, así que su token son sus cuatro primeras letras: `{1:أبجد}`, `{1:أبتث}`. Las cifras del propio documento se eligen con [`numerals`](https://postext.dev/es/docs/configuration-text.md#cifras-del-documento).

Las demás grafías son para las configuraciones que nada comprueba en tipos: los presets en JSON y el JavaScript sin tipos. Los tipos de TypeScript siguen nombrando solo la grafía propia de cada ajuste —la que escribe el Sandbox y devuelve `resolveAllConfig`, con los nombres de Asia oriental incluidos—, así que un `PostextConfig` tipado se ciñe a ella, y otra grafía necesita una conversión de tipo (*cast*).

```js
// JavaScript o un preset en JSON (en TypeScript, la grafía propia de cada ajuste)
orderedLists: { numberFormat: 'decimal' },          // igual que 'arabic'
page: { pageNumbering: { format: 'roman-lower' } }, // igual que 'lower-roman'
resourceTypes: [{ id: 'lamina', counterFormat: 'upper-roman', … }], // igual que 'roman-upper'
```

`resolveAllConfig` lleva los formatos de listas y de página a la grafía de su propio ajuste —`'decimal'` se resuelve como `'arabic'` en `orderedLists`, `'roman-lower'` como `'lower-roman'` en `page.pageNumbering`— y `stripConfigDefaults` elimina cualquier grafía del valor por defecto. Los paneles del Sandbox muestran cada uno de los tres ajustes en su propia grafía, sea cual sea la que use la configuración. Cualquier otro valor —`roman`, `01`, una errata— numera en decimal en lugar de imprimir `undefined`, y se notifica como [aviso de configuración](https://postext.dev/es/docs/configuration-fonts-colors-viewers.md#avisos-de-configuración). Las plantillas de numeración de los encabezados aceptan los mismos nombres tras los dos puntos (`{1:roman-upper}` equivale a `{1:I}`), junto a su propio `{1:01}` con cero a la izquierda.

## Disposición

La propiedad `layout` controla cómo se organizan las columnas dentro del área de contenido.

> **Figura: Columnas, medianil y margen**
> Una página dividida en tres columnas: cada columna es el área de contenido para el texto, los medianiles son los huecos verticales entre columnas, y el margen es el borde en blanco entre los límites de la página y la primera columna.
>
> *Las columnas contienen el texto. Los medianiles las separan. Los márgenes enmarcan el contenido.*

> **Figura: Sistema de márgenes**
> Una página con márgenes independientes superior, derecho, inferior e izquierdo alrededor del área de contenido.
>
> *Cada lado de la página puede tener su propio margen.*

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `layoutType` | `'single' \| 'double' \| 'oneAndHalf' \| 'multiple'` | `'double'` | Disposición de columnas. Ver más abajo para detalles de cada tipo. |
| `columnCount` | `number` | `3` | Cuántas columnas iguales hace del texto una disposición `'multiple'`: un número entero de 3 a 8. Un valor fuera de ese intervalo, o que no es entero, se ajusta y se avisa (véase [Tipos de disposición](https://postext.dev/es/docs/configuration-page-layout.md#tipos-de-disposición)). La disposición `'multiple'` propia de un estilo de encabezado toma el número del documento salvo que fije el suyo. Desde postext 1.18. |
| `gutterWidth` | `Dimension` | `0.75 cm` | Espacio horizontal entre columnas. Solo aplica a disposiciones multicolumna. |
| `sideColumnPercent` | `number` | `33` | Ancho de la columna lateral como porcentaje del área de contenido. Cualquier valor que deje algo de ancho a las dos columnas se usa tal cual; uno que no lo haga se ajusta, y la composición lo avisa (véase [Tipos de disposición](https://postext.dev/es/docs/configuration-page-layout.md#tipos-de-disposición)). Solo aplica a la disposición `'oneAndHalf'`. |
| `sideColumnRole` | `'text' \| 'floats'` | `'text'` | Qué lleva la columna lateral: texto corrido (fluye a ella tras la columna principal) o solo los recursos y avisos colocados con `span: 'side'` — una columna de margen solo para flotantes. Solo en `'oneAndHalf'`. Con `'text'`, un párrafo que sigue de una columna a la otra se vuelve a cortar para el ancho de la columna en la que sigue; hasta postext 1.4 conservaba las líneas de la columna en la que empezó, y una línea compuesta para la columna principal se salía de la lateral, que la recortaba. |
| `sideColumnSide` | `'right' \| 'left' \| 'outer' \| 'inner'` | `'right'` | Borde del área de contenido en el que se sitúa la columna lateral. `'outer'` / `'inner'` siguen la paridad de la página cuando los márgenes están espejados (el borde exterior de una página impar es el derecho; el de una par, el izquierdo). Solo en `'oneAndHalf'`. |
| `columnRule` | `ColumnRuleConfig` | desactivado | Filete vertical opcional trazado entre columnas. Ver más abajo. |
| `fitFiguresToPage` | `boolean` | `false` | Reduce una figura (mapa de bits o SVG) cuya imagen, pie y nota quedarían más altos que el área de contenido hasta que quepan en ella (una imagen con zona segura, `Resource.safeArea`, se recorta antes dentro de ella a todo su ancho, y solo se reduce si sigue sin caber), y compone más pequeña una figura en línea que no cabe por poco en lo que queda de su columna (hasta la mitad de su ancho; el pie conserva la medida de la columna) para que siga junto a su texto. La imagen reducida se sitúa en su hueco según `placement.align`. El visor HTML la activa, porque sus páginas son tan altas como la pantalla; las páginas impresas se dimensionan para sus figuras. |
| `bitmapResolution` | `'document' \| 'file' \| number` | `'document'` | Cómo toma su tamaño natural de impresión un mapa de bits sin `bitmap.resolution` propia. `'document'` lee sus píxeles a `page.dpi`; un número es la resolución en ppp de todos esos mapas de bits (`300`: una imagen de 2400 px mide 203,2 mm de ancho sean cuales sean los dpi de la página); `'file'` usa la resolución que indica su archivo (`bitmap.fileResolution`), salvo 72 y 96, que cuentan como sin indicar, y si no, `page.dpi`. La columna sigue limitando la imagen, y una más pequeña nunca se amplía. Véase [Formato del documento › Tamaño de los mapas de bits](https://postext.dev/es/docs/document-format.md#tamaño-de-los-mapas-de-bits). Desde postext 1.24. |
| `floatShrink` | `FloatShrinkConfig` | `mode: 'never'` | El valor del documento para `placement.shrink` (`mode`: `'never'`, `'page'` o `'slot'`) y `placement.minScale` (`minScale`, 0.7 si no se indica) de una imagen flotante: reducirla, sin cambiar sus proporciones, al sitio de su hueco en lugar de llevarla más adelante (véase [Formato del documento › Colocación](https://postext.dev/es/docs/document-format.md#colocación)). La colocación del recurso y después la `defaultPlacement` de su tipo lo sustituyen. `fitFiguresToPage` limita toda figura al área de contenido; `floatShrink` mira la banda que el flotante ocuparía de verdad, bajo una apertura, junto a otros flotantes o encima de las notas al pie. Desde postext 1.24. |
| `wrap` | `TextWrapConfig` | `minTextWidth: 12em`, `minLinesBeside: 2`, `defaultWidth: 0.45` | Texto compuesto al lado de una imagen o una caja más estrecha que su columna (`placement.wrap`, el `wrap` de una caja): `gap`, el espacio entre el elemento y el texto (una línea del cuerpo si no se indica); `minTextWidth`, la medida más estrecha que puede tener el texto de al lado, una longitud o una parte de la columna (más estrecha: el elemento ocupa su banda entera, con un aviso `textWrap`); `minLinesBeside`, el mínimo de líneas que merece la pena componer a su lado; `defaultWidth`, la parte de la columna que ocupa un elemento ajustado sin `width` propio. Véase [Formato del documento › Ajuste del texto](https://postext.dev/es/docs/document-format.md#ajuste-del-texto). Desde postext 1.24. |
| `floatsAtCitingPage` | `boolean` | `false` | El valor por defecto de `placement.citingPage`: un flotante `'top'` o `'auto'` puede ocupar la cabeza de la página (un flotante a lo ancho de la página) o de la columna (un flotante de columna) donde cae la línea que lo cita por primera vez, en lugar del primer hueco libre después de esa línea; el texto que hay encima de la referencia baja bajo él (véase [Formato del documento › Colocación](https://postext.dev/es/docs/document-format.md#colocación)). La colocación del recurso y después el `defaultPlacement` de su tipo lo sustituyen. Desde postext 1.25. |
| `maxTopFraction` | `number` | `0.7` | La mayor fracción de la altura de la columna, de 0 a 1, que puede ocupar un flotante que encabeza la página o la columna que lo cita, junto con los flotantes que ya están allí, para que la página guarde sitio para su texto (el `\topfraction` de LaTeX). Un flotante que ocuparía más va a su hueco habitual. Desde postext 1.25. |
| `hugClosingFloats` | `boolean` | `true` | En la página de cierre de un capítulo (y del documento), las figuras y tablas a lo ancho de la página que quedan bajo la última banda de texto suben hasta quedar a un hueco de flotante bajo ella, apiladas en su orden: ahí nada las sigue. Con `false` se quedan donde las puso su colocación, de modo que un flotante `position: 'bottom'` termina al pie de la página de cierre como en cualquier otra — por ejemplo, en una ficha técnica cuyo contorno acaba a la misma altura en todas las páginas. En las páginas con columna lateral nunca se mueven. |
| `inlineResourceGap` | `'around' \| 'above'` | `'around'` | Dónde deja un recurso en línea (`placement.position: 'here'`, insertado con `::resource`) el hueco de los flotantes, de una línea. `'around'` lo conserva encima y debajo del recurso, y el texto que sigue vuelve a la rejilla base bajo ese hueco; un encabezado, una lista, un recuadro u otro recurso en línea justo después comparte el hueco de debajo con su propio espacio superior, y se aplica el mayor de los dos. `'above'` lo conserva solo encima: el texto que sigue al recurso continúa en la siguiente línea de la rejilla, por cerca que quede —entre nada y una línea—, como hasta postext 1.4. Las configuraciones guardadas por versiones anteriores cuyos capítulos insertan un recurso se leen con `'above'`, para que sus páginas no se muevan (ver [Paquetes escritos por postext 1.4 o anterior](https://postext.dev/es/docs/configuration-programmatic-usage.md#paquetes-escritos-por-postext-14-o-anterior)). Una configuración escrita en código para la 1.4 conserva el espacio antiguo si pone ella misma `'above'`, o si pasa por `pinLegacyInlineGap`, de `postext/bundle`. |
| `inlineResourceGapInBoxes` | `boolean` | `true` | Si un recurso en línea dentro de un recuadro (`:::callout`) conserva el hueco que fija `inlineResourceGap`, una línea del texto del propio recuadro: encima del recurso y, con `'around'`, también debajo, y se aplica el mayor de ese hueco y el espacio propio del bloque siguiente. Al principio o al final del recuadro, o de un fragmento de un recuadro partido, ya lo separa el relleno y no se añade hueco. Con `false` el recurso queda justo bajo el texto anterior y el texto siguiente justo bajo el recurso, como hasta postext 1.4. Las configuraciones guardadas por versiones anteriores cuyos capítulos insertan un recurso dentro de un recuadro se leen con `false` (ver [Paquetes escritos por postext 1.4 o anterior](https://postext.dev/es/docs/configuration-programmatic-usage.md#paquetes-escritos-por-postext-14-o-anterior)); en código, `pinLegacyBoxResourceGap`, de `postext/bundle`, hace lo mismo. |
| `boxChildSplitMinLines` | `number` | `2` | Mínimo de líneas de un párrafo o de un elemento de lista que deja a cada lado un corte dentro de él cuando una caja se parte (`splitMinLines`, en [Estilos de aviso](https://postext.dev/es/docs/configuration-styles.md#estilos-de-aviso), sigue contando todas las líneas de la caja a cada lado del corte). Un número entero, como mínimo 1. Con el valor por defecto, un corte nunca deja una línea sola de un párrafo o elemento al pie de una columna ni al principio de la siguiente; si el `splitMinLines` del estilo de la caja es menor, manda ese. Con `1` un corte puede dejar una línea del párrafo o elemento a un lado, como hasta postext 1.4. Las configuraciones guardadas por versiones anteriores cuyos capítulos tienen algún `:::callout` se leen con `1` (ver [Paquetes escritos por postext 1.4 o anterior](https://postext.dev/es/docs/configuration-programmatic-usage.md#paquetes-escritos-por-postext-14-o-anterior)); en código, `pinLegacyBoxChildCut`, de `postext/bundle`, hace lo mismo. |
| `flowColumns` | `boolean` | `true` | Una valla `:::columns` fuera de un recuadro compone sus bloques en subcolumnas de la columna de texto (o a lo ancho de la página con `span="page"`), y un grupo, en un recuadro o en el texto, se corta entre sus subcolumnas cuando no cabe y sigue en la columna o la página siguiente (ver [Formato del documento › `:::columns`](https://postext.dev/es/docs/document-format.md#columns)). Con `false` se ignora la valla fuera de un recuadro y nunca se corta dentro de un grupo, como hasta postext 1.24; las configuraciones guardadas por versiones anteriores cuyos capítulos tienen alguna valla `:::columns` se leen con `false`; en código, `pinLegacyFlowColumns`, de `postext/bundle`, hace lo mismo. Una sección con estilo conserva el valor del documento. Desde postext 1.25. |
| `floatsUnderOpener` | `boolean` | `true` | Bajo una apertura a ancho de página (un nivel o un estilo de encabezado con `span: 'page'`) compuesta sobre dos o más columnas de texto, la cabeza de la columna de la propia apertura, justo bajo su banda, es un hueco para un flotante `'top'` o `'auto'`, a la altura de las cabezas de las demás columnas: una caja flotante puesta justo después de la apertura, o un recurso incrustado ahí, queda bajo la apertura en la primera columna (y en varias a partir de ella con `columns`), y el texto de la columna empieza debajo. Un flotante citado en el texto sigue yendo después de la línea que lo cita. Con `false` no se ofrece ese hueco y el flotante cae a partir de la segunda columna, como hasta postext 1.24; las configuraciones guardadas por versiones anteriores que definen un encabezado a ancho de página se leen con `false`; en código, `pinLegacyOpenerHeadFloats`, de `postext/bundle`, hace lo mismo. Una sección con estilo conserva el valor del documento. Desde postext 1.25. |
| `writingMode` | `'horizontal-tb' \| 'vertical-rl'` | `'horizontal-tb'` | Cómo corren las líneas. `'vertical-rl'` compone el texto chino o japonés en vertical: los caracteres de arriba abajo y cada línea a la izquierda de la anterior. El `layout` de un estilo de título lo hereda salvo que fije el suyo, así que un apéndice horizontal puede seguir a un libro vertical. Ver [Escritura vertical](https://postext.dev/es/docs/configuration-page-layout.md#escritura-vertical). |

### Escritura vertical

Con `writingMode: 'vertical-rl'` una página se compone como una página horizontal girada un cuarto de vuelta en el sentido de las agujas del reloj. El flujo se compone en un marco tan ancho como alto es el pliego; sus líneas son las columnas del texto vertical, que se leen desde la derecha, y todo lo que el motor hace con las líneas (cortes, justificación, flotantes, notas al pie, reglas de cohesión) funciona en ese marco. En el pliego, por tanto:

- Una columna de la disposición es un **piso** (栏): `layoutType: 'double'` da dos pisos apilados de arriba abajo, que se llenan desde la esquina superior derecha; `gutterWidth` es el hueco entre ellos y el filete de columna, una línea horizontal entre ambos. Los pisos no se igualan al final de un capítulo ([clreq §7.1.3.4](https://www.w3.org/TR/clreq/#x7-1-3-4-handling-of-spaces-just-before-the-new-recto-page-breaks-and-new-edges)): el equilibrado de columnas está desactivado en un documento vertical salvo que se fije `headings.balancing.enabled`.
- Lo que el flujo llama «arriba» es el borde **derecho** del pliego, donde empieza la lectura: un flotante superior queda a la derecha de la página, uno inferior a la izquierda, una apertura a toda la página es una franja a lo largo del borde derecho y las notas al pie caen en el extremo izquierdo de cada piso. Un elemento de diseño anclado a la parte superior de la página (un diseño de título, una caja fija) se ancla al borde derecho. En `sideColumnSide`, `'left'` es el piso de arriba y `'right'` el de abajo; `'outer'` e `'inner'` valen como `'right'` y `'left'`.
- Los márgenes del flujo son los del pliego girados: el margen derecho es la parte superior del flujo y el superior su izquierda. `page.margins` conservan sus nombres en el pliego.
- Los encabezados, los folios, las marcas de corte y el fondo de página siguen en el pliego, en horizontal, como describe clreq para los libros verticales.
- **Las figuras y las tablas se mantienen derechas.** Una figura ocupa la altura de su piso hasta donde lo permite su pie, y como mucho el ancho de la página; el ancho que toma es el espacio que ocupa en el flujo. Su pie se compone en horizontal debajo de ella, igual que las celdas de una tabla: ambos se miden como texto horizontal. Una tabla se compone derecha a lo ancho de la página y, si es más alta que el piso, sus filas se reparten entre pisos. `placement.align` coloca la figura arriba (`'left'`), en medio o al pie de su piso. Un `placement.rotate` no se aplica cuando la figura se cita por primera vez en texto vertical: la composición avisa con `rotateIgnoredVertical`. Una sección horizontal del libro (un estilo de título cuyo `layout` fija `'horizontal-tb'`) gira sus figuras como se le pide.
- Las imágenes de un diseño (la ilustración de una apertura o de una página de parte) también quedan derechas. Su caja en el flujo se dimensiona con el ancho y el alto de la imagen intercambiados, de modo que `size.width` es lo que la imagen ocupa a lo largo de la columna, y su ancho en el pliego sale de sus proporciones.
- Caracteres: los hanzi, los kana y las formas de ancho completo quedan derechos, a un cuadratín cada uno; las palabras latinas y los números se tumban con su ancho horizontal; la puntuación toma la forma vertical de la fuente. Los signos de pausa y de final nunca se giran: una fuente de China continental pone 、。，． en la esquina superior derecha de la celda y ！？：； en su mitad derecha, y una de Taiwán o Hong Kong los centra (`cjk.region`). Los paréntesis y las comillas toman su forma vertical, y “ ” ‘ ’ se leen como 『』「」 en texto de China continental. Las rayas, los puntos suspensivos y la tilde de onda toman la forma vertical de la fuente cuando la tiene (Noto CJK liga la de — a `vert` junto con `fwid`: un filete por el centro de la celda); si no, se giran con su tinta centrada en el eje de la columna. El 破折号 (——) de un texto chino es un solo filete a lo largo de la columna: sus formas verticales dejarían blanco en los dos extremos de cada celda, así que cada raya se gira con la línea y se estira como en el texto horizontal (ver [Anchos de la puntuación](https://postext.dev/es/docs/configuration-east-asian.md#anchos-de-la-puntuación)). Un número de dos cifras como mucho queda de pie en una sola celda, salvo dentro de una frase latina, cuyas palabras sigue (ver [Números en texto vertical](https://postext.dev/es/docs/configuration-east-asian.md#números-en-texto-vertical)). El punto medio (·) ocupa media celda en texto de China continental y una celda entera en el de Taiwán y Hong Kong. Los signos que Unicode pone derechos (× © ± § ℃ ① y parecidos) ocupan una celda propia, también dentro de un número: `3×4` son el 3 y el 4 tumbados con el × derecho entre ellos. Un apóstrofo o un punto medio entre dos letras de una palabra latina (`don’t`, `l·l`) sigue en la palabra, tumbado. Un párrafo latino dentro de un flujo vertical sigue las mismas reglas. Las fórmulas en línea, las fichas y las muestras de color se tumban con la línea.
- Cada carácter se mide como se pinta: una celda avanza su celda a lo largo de la línea, un tramo tumbado su ancho horizontal. El texto que queda horizontal en el pliego (titulillos, folios, pies, celdas de tabla) se mide en horizontal.
- Los [anchos de la puntuación](https://postext.dev/es/docs/configuration-east-asian.md#anchos-de-la-puntuación), la [puntuación colgada](https://postext.dev/es/docs/configuration-east-asian.md#puntuación-colgada) y el [espacio entre chino y latín](https://postext.dev/es/docs/configuration-east-asian.md#espacio-entre-chino-y-latín) se aplican a lo largo de la línea vertical igual que en la horizontal. El blanco que va delante de un dibujo queda encima y el que va detrás, debajo: un 、 kaiming ocupa media celda, `」「` se comprimen a celda y media, un paréntesis de apertura recortado a la cabeza de una línea empieza media celda más arriba, un 。 colgado queda bajo el pie de su línea, y el espacio entre chino y latín es un cuarto de cuadratín de columna encima y debajo de una palabra tumbada. `：；？！` conservan la celda entera en texto vertical en todas las regiones.
- La [retícula de caracteres](https://postext.dev/es/docs/configuration-east-asian.md#retícula-de-caracteres) cuenta los caracteres a lo largo de la línea y las líneas a lo ancho de la página: `charsPerLine` fija lo que mide un piso, `linesPerPage` cuántas líneas lleva una página, y `layoutType: 'double'` da dos pisos de caracteres enteros con un medianil de cuadratines enteros entre ellos.

Para quien lee la composición: una página vertical lleva `VDTPage.flow`. Su `contentArea`, sus columnas, bloques, líneas, flotantes, áreas de notas, banda de apertura y superposiciones de diseño de los bloques están en coordenadas del flujo; `width`, `height`, `header` y `footer` están en el pliego. `flowToPage`, `pageToFlow`, `flowRectToPage` y `pageRectToFlow` pasan de unas a otras, y `verticalOrientation(char, region)` dice cómo queda un carácter. `flow.centralBaselines` da, por familia tipográfica, el eje sobre el que la composición centró los caracteres derechos: el centro de la tinta de 中, cuyo trazo largo ocupa el alto del cuadratín (0,38 cuadratines sobre la línea de base en Noto Serif y Noto Sans, SC y TC por igual), y que tienen todas las fuentes chinas, japonesas y coreanas. Cada línea se centra en ese eje: la línea de base de una línea vertical queda, desde el borde de su caja, a la mitad de su interlineado más la línea de base central de la familia (la de una línea horizontal, a 0,8 del interlineado), así que una columna de caracteres queda en el centro de su paso y un filete trazado entre dos columnas a un paso entero cae a medio camino entre ellas. Un texto de diseño vertical se compone igual en sus propias líneas. El canvas pinta la página vertical por su cuenta; para pintar la puntuación con las formas verticales propias de la fuente, un anfitrión en el navegador carga, una vez por familia, una fuente gemela con ellas activadas: `loadVerticalAlternates(family, faces)`, donde `faces` son los orígenes de la familia (URL o bytes) y sus descriptores. La gemela solo se queda si el navegador aplica la función al texto del canvas (Chrome 140 y posteriores): dibuja 「（《 con la gemela y con una copia de las mismas fuentes cargada sin la función, en el peso y el estilo de las fuentes recibidas, y se queda con la gemela cuando la tinta difiere. Una llamada posterior con otras fuentes de una familia cuya gemela ya está en uso (la negrita después de la redonda) las añade a ella. El Sandbox lo hace con todas las familias de un documento vertical. Sin gemela, los paréntesis se giran sobre el centro de su cuadratín y los signos de pausa y de final de China continental se desplazan dentro de su celda adonde los ponen las formas verticales de la fuente: 、。，． a la esquina superior derecha (a menos de 0,07 cuadratines de las formas verticales de Noto Serif SC) y ！？：； medio cuadratín a la derecha y un poco hacia arriba (a menos de 0,02). El PDF y el HTML componen la misma página: ver [Texto vertical en el PDF](https://postext.dev/es/docs/configuration-programmatic-usage.md#texto-vertical-en-el-pdf) y la tabla de [En qué se diferencia la salida HTML del canvas y del PDF](https://postext.dev/es/docs/configuration-programmatic-usage.md#en-qué-se-diferencia-la-salida-html-del-canvas-y-del-pdf). Comparados celda a celda con HarfBuzz (composición vertical con `vert`) en Noto Serif TC y SC, todos los caracteres de 「賈雨村」云云，宜乎？故曰！；：、。“引”‘單’…… quedan a menos de 0,02 cuadratines de él en el canvas y en el PDF, y a menos de 0,05 en el HTML (Chrome centra un glifo girado en el medio del ascendente y el descendente de la fuente, que en Noto queda 0,05 cuadratines por encima del centro del cuadratín). `flow.dashAdvances` da, por familia, el avance horizontal en cuadratines de cada raya que la página estira hasta llenar su celda (— – ― ⸺ ⸻ －), para quien pinta sin métricas de fuente propias: el HTML estira la raya con él, como el canvas y el PDF lo hacen con las suyas. Las cabeceras y los folios también pueden ir en vertical: ver [Elementos de texto verticales](https://postext.dev/es/docs/configuration-page-layout.md#elementos-de-texto-verticales).

### Filete de columna

Dibuja una línea vertical fina en el medianil para separar visualmente las columnas.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `false` | Si se dibuja el filete de columna. |
| `color` | `ColorValue` | `#cccccc` | Color del filete. |
| `lineWidth` | `Dimension` | `0.5 pt` | Grosor del filete. |

Bajo un encabezado de página completa (`span: 'page'`), el filete empieza donde empieza el texto de las columnas, bajo la banda del encabezado, tanto si la pinta la apertura por defecto como un diseño propio. Hasta postext 1.4 bajaba desde el principio de la caja de texto, atravesando la banda.

Un estilo de encabezado puede fijar su propio filete en su `layout` (ver [Estilos de encabezado](https://postext.dev/es/docs/configuration-styles.md#estilos-de-encabezado)), y las páginas de su sección dibujan ese. Un campo que el estilo deja sin fijar toma el valor del documento, así que una sección que solo cambia sus columnas conserva el filete del documento. Hasta postext 1.4 el filete de un estilo no se dibujaba nunca: todas las páginas dibujaban el del documento.

### Tipos de disposición

- **`'single'`** — Una columna que ocupa todo el ancho del contenido. Ideal para páginas estrechas o contenido con párrafos largos.

- **`'double'`** — Dos columnas de igual ancho. La disposición editorial clásica — mantiene el ancho de carro en el rango óptimo de 40–50 caracteres para una lectura cómoda.

- **`'oneAndHalf'`** — Una disposición asimétrica con una columna principal y una columna lateral más estrecha. La columna lateral (controlada por `sideColumnPercent`) es ideal para notas al margen, figuras pequeñas o contenido complementario. Valores entre 25–40% funcionan bien, y un canal estrecho para numerar líneas o poner marcas al margen ocupa en torno al 10–15%. La columna lateral ocupa el `sideColumnPercent` % del ancho del área de contenido y la principal, lo que queda tras el medianil — así, con el 50% la lateral es un medianil más ancha que la principal. Cualquier valor se compone tal cual mientras las dos columnas conserven al menos el 1% del ancho del área de contenido; uno que dejaría alguna más estrecha — 0 o menos, o uno tan grande que la principal desaparece tras el medianil — se ajusta al valor más cercano que respete las dos, y un valor que no es un número toma el de por defecto, 33. Los `configWarnings` del documento llevan entonces `{ kind: 'sideColumnPercentClamped', path: 'layout.sideColumnPercent', value, used }` — la ruta del `layout` propio de un estilo de encabezado nombra el estilo, como en `headingStyles[2].layout.sideColumnPercent`, y se mide con los márgenes de ese estilo —, que el Sandbox muestra en el panel **Revisión**; `collectConfigWarnings(config)` devuelve la misma lista sin componer nada. Una disposición que no es `'oneAndHalf'` no lee el valor, y tampoco lo avisa. Con `sideColumnRole: 'floats'` el texto corrido nunca entra en la columna lateral: se convierte en un canal para las figuras, tablas y recuadros colocados con `span: 'side'`. Una figura o tabla lateral se apila desde la cabeza del canal en la página que la cita por primera vez: la figura marginal de un libro de texto queda en lo alto de su página aunque el texto la cite más abajo, y si no cabe en lo que queda del canal espera al de la página siguiente. Un recuadro lateral se apila junto al texto que interrumpe; si el resto del canal no puede alojarlo ahí, sube a la posición más baja en la que cabe (su pie en el pie del canal) o espera a la página siguiente. Cuando el texto que sigue a la valla de un recuadro continúa en la página siguiente (la columna está llena, o las reglas de corte llevan ese texto más allá), el recuadro se queda en su valla, junto al texto anterior; un estilo con `sideAtColumnEnd: 'after'` lo pone en cambio a la altura de la primera línea del texto que sigue a la valla, en el canal de la página siguiente, como necesitan los números de línea y los ladillos escritos antes de su línea. Un elemento del diseño de un encabezado que cae en el canal —un numeral de capítulo anclado en el margen exterior— también queda fuera de la pila (ver [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada)). Los flotantes y recuadros `span: 'page'` siguen cruzando ambas columnas, y un flotante de columna con `placement.captionSide` pone su pie en el canal, a la altura de la figura. Combinada con márgenes espejados y `sideColumnSide: 'outer'`, el canal queda en el borde exterior de cada página — la columna marginal de un manual.

- **`'multiple'`** — De tres a ocho columnas iguales, tantas como diga `columnCount` (3 por defecto): la retícula de los periódicos y de muchas revistas (desde postext 1.18). Cada columna mide `(ancho del contenido − (n − 1) × gutterWidth) / n`. El texto pasa de una columna a la siguiente como en una disposición a dos columnas; el filete se dibuja en cada medianil, el equilibrado de columnas iguala todas en la última página de un capítulo y antes de una caja a todo el ancho, las notas al pie funcionan en cada columna, y las figuras, cajas y encabezados a todo el ancho cruzan la página entera. Una figura o una caja flotante puede ocupar solo algunas columnas: `placement.columns` (véase [Tipos de recurso](https://postext.dev/es/docs/configuration-resources.md#tipos-de-recurso)) y el `columns` de un estilo de recuadro. Un `columnCount` fuera de 3–8, o que no es entero, se redondea y se ajusta al número válido más cercano (un valor que no es un número toma 3), y los `configWarnings` del documento llevan `{ kind: 'columnCountClamped', path: 'layout.columnCount', value, used }` (la ruta del `layout` propio de un estilo de encabezado nombra el estilo, como en `headingStyles[1].layout.columnCount`). Una disposición de otro tipo nunca lee el valor. Un estilo de encabezado cuyo `layout` es `'multiple'` toma el `columnCount` del documento salvo que fije el suyo, así que un periódico a cinco columnas puede componer sus páginas de opinión a cuatro.

## Encabezados y pies

Las propiedades `header` y `footer` controlan los bloques de encabezado y pie de página. Los encabezados y pies se dibujan **dentro de los márgenes de página existentes** — no reservan espacio adicional ni reducen el área de contenido.

**Marco del contenedor.** Un elemento anclado a `'container'` se coloca en la franja de margen entre el cuerpo y el borde de corte, con el ancho del área de contenido. El contenedor del encabezado va desde el **borde superior de corte** hasta la parte superior del cuerpo; el del pie, desde la parte inferior del cuerpo hasta el **borde inferior de corte**. Así, los anclajes `top-*` del encabezado y `bottom-*` del pie se miden desde el borde de corte, mientras que los `bottom-*` del encabezado y `top-*` del pie se miden desde el borde del cuerpo. El contenedor nunca incluye el sangrado ni la franja de las marcas de corte, de modo que un encabezado o pie queda en la misma posición en la página cortada tanto si `page.cutLines` está activado como si no. Ancla a `'page'` (la caja de corte) o a `'bleed'` para salir del ancho del área de contenido o llegar al sangrado.

Los bloques utilizan el modelo unificado de **ranura de diseño**: cada elemento define un `placement` con un `anchor` (al contenedor o a otro elemento por `#id`), un `offset` opcional y un `size` opcional. Los campos planos heredados `align`, `marginFromBody`, `marginFromEdge` y `width: 'full'` siguen aceptándose como entrada y se migran automáticamente al nuevo formato; debajo se documenta la equivalencia.

Cada bloque contiene una lista de elementos de **texto**, **línea** (`rule`) y **caja** (`box`). El orden del array es el orden de pintado (el primer elemento se pinta primero, el último se pinta encima). Esto se cumple sean cuales sean los anclajes: un elemento puede anclarse a otro que aparece después en la lista (`anchor.to: '#ttl'`), de modo que una caja de fondo puede ir primero y colocarse respecto al texto que se pinta encima de ella.

**Valores por defecto incluidos.** Cuando `header` o `footer` son `undefined`, postext aplica un valor por defecto sensato en lugar de un bloque vacío:

- **Encabezado por defecto:** `{title}` alineado a la derecha en páginas impares, `{chapterTitle}` alineado a la izquierda en páginas pares y una línea a todo el ancho — todos en el color principal de la paleta, Open Sans 8pt/600, `marginFromBody` `16pt` (texto) / `13pt` (línea).
- **Pie por defecto:** `{pageNumber}` centrado en todas las páginas en el color principal de la paleta, Open Sans 8pt/600, `marginFromBody` `16pt`.

Para renunciar a los valores por defecto, establece `header: { elements: [] }` (o `footer: { elements: [] }`). Un array `elements` vacío explícito se conserva como «sin elementos» — solo `undefined` activa los valores por defecto.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `elements` | `HeaderFooterElement[]` | valores por defecto integrados cuando es `undefined`; `[]` los desactiva | Lista ordenada de elementos de texto y línea. |

### Elementos de texto

Los elementos de texto renderizan una plantilla con sustitución de marcadores. Los marcadores usan la sintaxis `{nombre}`; `{{` y `}}` se emiten como llaves literales.

Los valores por defecto de la tabla siguiente son los de un elemento de texto que añades tú. El encabezado y el pie integrados descritos en **Valores por defecto incluidos** son elementos ya hechos con sus propios valores (Open Sans 8pt/600 en el color principal de la paleta), no los valores por defecto del elemento.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `kind` | `'text'` | — | Discriminador. |
| `id` | `string` | — | Id estable, único dentro del bloque. Otros elementos se anclan a él con `anchor.to: '#id'`. El sandbox asigna uno al crearlo. |
| `content` | `string` | `''` | Plantilla. Admite los marcadores listados más abajo, además de `{attr.<clave>}` — un atributo escrito en la línea del H1 del capítulo actual (`# Título {author="I. Zango"}`). Un atributo ausente se resuelve como cadena vacía sin aviso. Un salto de línea —o los dos caracteres `\n`, escritos en la plantilla o en el valor de un atributo— empieza siempre una línea nueva, sea cual sea el `overflow`. El texto que un marcador copia del documento (un título, un campo del frontmatter) se imprime tal cual: ahí solo un salto de línea real, como el salto de un título, empieza una línea nueva. |
| `align` | `'left' \| 'center' \| 'right' \| 'justify' \| 'start' \| 'end'` | `'center'` | Alineación horizontal de las líneas dentro de la caja del elemento. `'justify'` ensancha los espacios entre palabras de cada línea ajustada, salvo la última de cada párrafo, hasta que la línea llena la caja; las líneas que acompañan a una letra capital llenan el espacio que queda a su lado. Con `hyphenate`, una palabra que no cabe en lo que queda de una línea justificada también se parte por una sílaba para llenarla. La última línea de un párrafo, una línea sin espacios que ensanchar y un texto que no se ajusta se alinean a la izquierda. El texto justificado se compone párrafo a párrafo, así que varias líneas en blanco entre párrafos cuentan como una. El lienzo y el PDF colocan cada palabra donde la puso la maquetación; el HTML ensancha los espacios con `word-spacing`. `'start'` y `'end'` siguen la `direction` del texto: la derecha y la izquierda de un texto de derecha a izquierda. `'left'` y `'right'` son los lados de la propia caja; en un diseño que se compone en el flujo de una página de derecha a izquierda (una banda de apertura, el diseño de un título) el flujo está espejado, así que son su principio y su final, como en el texto general. |
| `direction` | `'ltr' \| 'rtl' \| 'auto'` | la del documento | Dirección base del texto: dónde van sus caracteres neutros, el orden de sus tramos en una línea y qué lados significan `'start'` y `'end'`. `'auto'` lee la primera letra fuerte del texto resuelto y, si no la hay, toma la [`direction`](https://postext.dev/es/docs/configuration-text.md#dirección-del-texto) del documento. Los tramos en árabe o hebreo se leen de derecha a izquierda sea cual sea la base. Un texto que contiene una letra árabe nunca se espacia (se ignora su `letterSpacing` entero) y sus palabras no se cortan al ajustar ni al truncar; una palabra más ancha que la caja la desborda y se avisa como `unbreakableWordOverflow`. |
| `parity` | `'all' \| 'odd' \| 'even'` | `'all'` | En qué páginas aparece el elemento (paridad por número de página: la página 1 es impar). |
| `pages` | `'all' \| 'body' \| 'opener' \| 'part' \| 'blank'` | `'all'` | En qué *roles* de página aparece el elemento, combinado con `parity`. Tras la colocación cada página se clasifica como `'blank'` (relleno de paridad o separador, o sin contenido), `'part'` (página divisoria de parte), `'opener'` (su primer bloque es un encabezado cuyo nivel abarca la página o fuerza un salto de página antes — la primera página de un capítulo) o `'body'` (el resto). `pages: 'body'` oculta una cabecera corriente en las aperturas de capítulo; `pages: 'opener'` muestra un folio solo allí. |
| `fontFamily` | `string` | `'EB Garamond'` | Familia tipográfica. |
| `fontSize` | `Dimension` | `8 pt` | Tamaño de fuente. |
| `fontWeight` | `number` | `400` | Grosor de fuente (100–900). |
| `italic` | `boolean` | `false` | Si se renderiza en cursiva. |
| `color` | `ColorValue` | `#000000` | Color del texto. |
| `overflow` | `'wrap' \| 'ellipsis-start' \| 'ellipsis-middle' \| 'ellipsis-end' \| 'clip'` | `'wrap'` en diseños de título y de parte; si no, `'ellipsis-end'` | Cómo se gestiona el texto que excede el ancho disponible del elemento. `'wrap'` divide el texto en varias líneas; las variantes de elipsis mantienen cada línea en una sola y la truncan con `…` al principio, en el centro o al final; `'clip'` recorta de forma estricta al rectángulo del elemento sin insertar ningún carácter. Los saltos de línea del contenido valen en todos los modos: la elipsis y el recorte se aplican a cada línea por separado. Un elemento que omite `overflow` toma el valor por defecto de su hueco: en un diseño de título (`advancedDesign.slot`) o en una página de parte (`parts.design`, `parts.versoDesign`) pasa de línea; en un encabezado, un folio o una fila de parte del índice (`toc.parts.design`, una fila de alto fijo) termina en `…`. Usa `'wrap'` en un encabezado que pueda ocupar varias líneas (una dirección), o una elipsis en una entradilla que deba quedarse en una línea dentro de una apertura. Una línea cortada con elipsis, o recortada con tinta fuera de la caja, se avisa con el aviso de contenido `designTextTruncated`, una vez por elemento y página (un encabezado o un folio, una vez por elemento y capítulo). Una configuración guardada antes de postext 1.24 (`configVersion` 9 o anterior) se lee con `'ellipsis-end'` en cada texto de título o de parte que no lo fija, para que sus páginas no se muevan. Un texto con `dropCap` pasa a nueva línea diga lo que diga este valor; con `'clip'` sus líneas se siguen cortando en el borde de una caja de alto fijo. `'ellipsis-end'` y `'ellipsis-start'` cortan por un límite de palabra —*La historia de la…*, no *La historia de la na…*—, y ningún espacio ni signo de enlace (coma, dos puntos, raya, barra, paréntesis de apertura) queda junto a la elipsis. Solo se corta una palabra por donde haga falta cuando el límite, suprimidos esos signos, conservaría menos de la mitad de lo que cabe: una palabra larga o una URL (*http://exampl…*, no *http…*). Un espacio de no separación o un guion de no separación (U+2011, como en *MS‑DOS*) no es un límite de palabra; `'ellipsis-middle'` corta en cualquier punto, pero suprime los espacios que la rodean. Hasta postext 1.4 todos los modos cortaban en el último carácter que cabía, espacios incluidos. |
| `verticalAlign` | `'top' \| 'middle' \| 'bottom'` | `'middle'` | Dónde se sitúa el texto dentro de una caja más alta que sus líneas — un `placement.size.height` fijo, o una caja estirada por un vecino anclado. Si las líneas son más altas que la caja (una cifra grande en una caja de alto fijo, un `lineHeight` apretado), sobresalen por el lado que la alineación deja libre, como en la alineación flex de CSS: `'bottom'` mantiene el pie de la caja de la última línea sobre el pie de la caja y sobresale por arriba, `'middle'` sobresale lo mismo por los dos extremos y `'top'` por el pie. Hasta postext 1.4 esas líneas colgaban siempre de la parte superior, fuera cual fuera la alineación. La capitular (`dropCap`) se mueve con sus líneas (hasta postext 1.4 se quedaba arriba en una caja donde `'middle'` o `'bottom'` las bajaban). |
| `lineHeight` | `number \| Dimension` | `1.2` | Interlineado de las líneas del elemento. Un número es un múltiplo de `fontSize`. También se acepta un `Dimension`, como se escriben todos los demás interlineados de la configuración: `em` / `rem` es el mismo múltiplo, y una longitud absoluta (`pt`, `mm`, `px`…) es la distancia entre líneas base: `{ value: 15.5, unit: 'pt' }` fija un interlineado de 15,5 pt sea cual sea el cuerpo. Cualquier otro valor (cero, un número negativo, una dimensión mal formada) toma el valor por defecto. Hasta postext 1.4 un `Dimension` aquí hacía imposible medir la altura del diseño: una apertura no reservaba entonces ningún espacio, ni siquiera su `minHeight`, y el cuerpo corría por debajo del título. |
| `letterSpacing` | `Dimension` | `0` | Tracking: espacio adicional que avanza tras cada carácter, espacios incluidos, exactamente como el `letter-spacing` de CSS. Las medidas crecen con él, así que una caja de ancho automático sigue ajustada. El tracking que sigue al último carácter de una línea no cuenta para su alineación ni para una caja de ancho automático, así que un título espaciado y centrado queda centrado sobre sus letras, uno alineado a la derecha termina en el borde y la última letra de una línea justificada llega al borde (hasta postext 1.4 quedaban medio espacio de tracking, o uno entero, a la izquierda, y un elemento anclado a la derecha de uno espaciado quedaba un espacio de tracking más lejos). Un valor negativo aprieta las letras —un título de 36 pt suele llevar `{ value: -0.3, unit: 'pt' }`— y las medidas se reducen igual; canvas, HTML y PDF lo pintan por igual (hasta postext 1.4 un valor negativo se componía como `0`, sin aviso). |
| `textTransform` | `'none' \| 'uppercase'` | `'none'` | Transformación de mayúsculas aplicada al texto resuelto, marcadores incluidos — el título de una parte en versales en el índice. |
| `box` | `ElementBoxStyle` | — | Fondo y borde opcionales dibujados tras el texto: `backgroundColor`, `borderColor`, `borderWidth`, `borderRadius` y un `padding` por lado que amplía la caja más allá del texto (ver [Elementos de caja](https://postext.dev/es/docs/configuration-page-layout.md#elementos-de-caja) para los campos). |
| `dropCap` | `{ lines, fontFamily, fontWeight, fontSize, color, gap }` | — | Letra capital: la primera letra, grande, junto a las primeras `lines` líneas (2 por defecto), con su propia fuente, peso y color, y a `gap` del texto. La letra se apoya en la línea base de la última línea que abarca, y `fontSize` vale por defecto el tamaño que enrasa su parte alta con las mayúsculas de la primera línea: el cuerpo del texto más `lines` − 1 interlineados, tomando la altura de las mayúsculas como 0,72 del cuerpo (una fuente con mayúsculas mucho más altas o más bajas pide su propio `fontSize`). Un texto con letra capital se ajusta a nuevas líneas sea cual sea su `overflow`; con `'clip'` sus líneas se siguen cortando en el borde de una caja de alto fijo. Un `color` enlazado a la paleta sigue las paletas de la parte y de la sección, como el resto del diseño. En el diseño de un encabezado, la letra no reserva espacio por debajo del texto: la parte de su caja de línea que queda bajo su línea base no empuja el cuerpo hacia abajo. Una letra que baja de su línea base (la Q o la J de muchas fuentes) puede entonces entrar en el espacio que hay bajo el diseño: dale al encabezado un `marginBottom` para ella. Hasta postext 1.4, el tamaño por defecto hacía la letra tan alta como todas las cajas de línea que abarca, de modo que sobresalía por encima de la primera línea; cualquier `overflow` distinto de `'wrap'` quitaba la letra sin avisar; la paleta de una sección o de una parte no cambiaba su color; y una letra tan profunda como el texto de su lado podía bajar el cuerpo una línea de la retícula. Las configuraciones guardadas antes conservan el tamaño de la 1.4, escrito como `fontSize` (ver [Paquetes escritos por postext 1.4 o anterior](https://postext.dev/es/docs/configuration-programmatic-usage.md#paquetes-escritos-por-postext-14-o-anterior)). La capitular del texto corrido se fija en cambio desde los estilos de párrafo y de encabezado (ver [Letras capitulares](https://postext.dev/es/docs/configuration-text.md#letras-capitulares)), con la altura de las mayúsculas medida en las propias fuentes. |
| `paragraphIndent` | `Dimension` | `0` | Sangría de primera línea de cada párrafo a partir del segundo. Un salto de línea en el contenido —o los dos caracteres `\n`, en un texto que viene de un atributo— separa párrafos; varios saltos seguidos cuentan como uno. |
| `hyphenate` | `boolean` | `false` | Cuando es `true` y el texto pasa a nueva línea (`overflow: 'wrap'`, o un `dropCap`, que siempre lo hace), las palabras largas que aún excederían el ancho tras un salto de línea normal se dividen en límites silábicos (utilizando el idioma de separación silábica activo del documento) insertando un guion blando en el corte. En un texto justificado (`align: 'justify'`), una palabra que no cabe en lo que queda de una línea también se parte por su última división silábica que quepa, para llenar la línea. |
| `inlineMarks` | `boolean` | `false` | Lee el texto resuelto —con los valores de los marcadores— como Markdown en línea: `**negrita**`, `*cursiva*`, `^superíndice^`, `~subíndice~`. Desactivado, los signos de marca se imprimen tal cual. En el diseño de un encabezado, `{titleText}` conserva entonces los tramos del propio encabezado en negrita, en cursiva, en superíndice y en subíndice (`*Pneumocystis*`, `CO~2~`), con el resto de sus caracteres escapados para que se impriman tal cual (desde postext 1.19). Ver [Marcas en línea y contornos](https://postext.dev/es/docs/configuration-page-layout.md#marcas-en-línea-y-contornos). |
| `stroke` | `{ width, color?, hollow? }` | — | Contorno trazado alrededor de las letras: `width` (un `Dimension`, centrado en los bordes de los glifos), `color` (por defecto, el del texto; la letra capital toma su propio color) y `hollow` (`true` pinta solo el contorno). Ver [Marcas en línea y contornos](https://postext.dev/es/docs/configuration-page-layout.md#marcas-en-línea-y-contornos). |
| `writingMode` | `'horizontal-tb' \| 'vertical-rl'` | `'horizontal-tb'` | `'vertical-rl'` compone el texto de arriba abajo, las líneas de derecha a izquierda y los caracteres de pie: una cabecera por el margen exterior, un título vertical junto a un capítulo horizontal. Ver [Elementos de texto verticales](https://postext.dev/es/docs/configuration-page-layout.md#elementos-de-texto-verticales). |
| `reserve` | `boolean` | `true` | Solo en diseños de encabezado: si el elemento cuenta para la altura que el encabezado reserva en el flujo del texto. `false` para la decoración que puede quedar bajo el texto (un sello al pie de la página, un marco, una banda lateral). Ver [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada). Las cabeceras y pies de página y los diseños de parte lo ignoran. |
| `marginFromBody` | `Dimension` | `6 pt` | Distancia absoluta entre el borde del elemento que mira al cuerpo y el borde del cuerpo. Independiente de otros elementos. Migrado a `placement.offset.y`. |
| `marginFromEdge` | `Dimension` | `0 pt` | Desplazamiento horizontal respecto al borde al que está alineado. Solo aplica cuando `align` es `'left'` o `'right'`. Migrado a `placement.offset.x`. |
| `placement` | `ElementPlacement` | derivado de `align` + `marginFromBody` + `marginFromEdge` | Posicionamiento avanzado (ver más abajo). Cuando se define, prevalece sobre los campos planos heredados. |

Marcadores disponibles:

- `{pageNumber}` — número de página actual (1-indexed).
- `{totalPages}` — total de páginas del documento. En un libro compuesto capítulo a capítulo (el Sandbox, `buildBundle`) cada capítulo es un documento, así que es el recuento del propio capítulo.
- `{bookTotalPages}` — total de páginas del libro entero: todos los capítulos, páginas en blanco incluidas. En un documento compuesto por sí solo coincide con `{totalPages}`. Consulta [Recuento de páginas del libro](https://postext.dev/es/docs/configuration-page-layout.md#recuento-de-páginas-del-libro) más abajo.
- `{title}`, `{subtitle}`, `{author}`, `{publishDate}` — valores leídos desde `content.metadata`. Los metadatos desconocidos o vacíos se renderizan como cadena vacía (y generan un aviso en el sandbox).
- `{chapterTitle}` — texto del H1 más reciente en o antes de la página actual. Se salta un H1 cuyo [estilo de encabezado](https://postext.dev/es/docs/configuration-styles.md#estilos-de-encabezado) fija `runningChapter: false` (una lámina, un mapa).
- `{chapterTitleAtTop}`, `{chapterNumberAtTop}` — título y número del capítulo vigente en la cabeza de la página, que no coinciden con `{chapterTitle}` y `{chapterNumber}` en una página donde un capítulo nuevo empieza debajo de otro texto. Consulta [Capítulo en cabeza de página](https://postext.dev/es/docs/configuration-page-layout.md#capítulo-en-cabeza-de-página) más abajo.
- `{partTitle}`, `{partNumber}` — título y número de la parte actual (la página `:::part` más reciente en o antes de la página actual; las páginas en blanco de paridad justo antes de una página de parte ya pertenecen a ella). Vacíos antes de la primera parte.
- `{firstMark.<clave>}`, `{lastMark.<clave>}` — la primera y la última palabra guía de la página: un título de un nivel (`h1`–`h6`) o una entrada de un estilo de párrafo. Consulta [Palabras guía](https://postext.dev/es/docs/configuration-page-layout.md#palabras-guía-primera-y-última-marca) más abajo.

#### Recuento de páginas del libro

`{bookTotalPages}` imprime el número de páginas del libro entero, el que el lector ve en «página 12 de 348». Cuenta páginas físicas, las blancas incluidas, como `{totalPages}`, pero a lo largo de todos los capítulos:

- **Un documento compuesto por sí solo** (`buildDocument` sin `continuation`) es el libro entero: `{bookTotalPages}` coincide con `{totalPages}`.
- **`buildBundle`** compone el libro, suma las páginas de todos los capítulos y lo compone una vez más con ese total, de modo que todos los capítulos imprimen el mismo número. El recuento nunca mueve un salto de página, así que basta una vuelta más; una configuración que no imprime `{bookTotalPages}` no paga nada.
- **El Sandbox** entrega el total a todos los capítulos en cuanto conoce las páginas de cada uno. Hasta entonces, un capítulo imprime las páginas hasta su propio final. La exportación del libro entero en la pestaña PDF cuenta las páginas que maqueta: si un capítulo imprimió otro recuento, porque aún no se conocían sus páginas, vuelve a maquetar el libro con el total al que llegaron los capítulos.
- **Un anfitrión que compone los capítulos por su cuenta** pasa el total como `continuation.bookPageCount` (también al primer capítulo). Sin él, `{bookTotalPages}` cuenta las páginas hasta el final del documento (`continuation.pageIndexOffset` más las suyas), lo que solo es exacto para el último capítulo.

```ts
footer: {
  elements: [{
    kind: 'text', id: 'folio', content: '{pageNumber} / {bookTotalPages}',
    fontSize: { value: 8, unit: 'pt' },
    placement: { anchor: { to: 'container', edge: 'top' }, size: { width: 'auto', height: 'auto' } },
  }],
}
```

`configUsesPlaceholder(config, 'bookTotalPages')` le dice a un anfitrión si merece la pena calcular el recuento.

#### Palabras guía: primera y última marca

Un diccionario imprime en la cabecera el primer y el último lema de cada página («Abacá – Ancla»); una obra de consulta, la primera y la última sección. `{firstMark.<clave>}` y `{lastMark.<clave>}` los imprimen. La clave dice qué marca una página:

- **De `h1` a `h6`**: un título de ese nivel. La marca es su texto, sin el número.
- **El id de un estilo de párrafo** (`entry`): un párrafo de un contenedor `:::paragraphs{style="entry"}`. La marca es el tramo en negrita con que abre el párrafo, el lema, sin su puntuación final: `**Abacá.** Planta de…` marca `Abacá`. Un párrafo que no abre en negrita no pone marca.

`{firstMark.<clave>}` es la primera marca que empieza en la página y `{lastMark.<clave>}` la última. Una página en la que no empieza ninguna (una entrada larga que continúa) imprime en ambos la marca vigente, la última anterior. Las páginas anteriores a la primera marca no imprimen nada; en un libro maquetado capítulo a capítulo es la primera marca del capítulo, porque las marcas no pasan de un capítulo al siguiente. Un título o un párrafo partido entre páginas marca solo la página en la que empieza. La clave se escribe tras el punto con letras, dígitos, `_` y `-`, empezando por una letra o `_`; una clave desconocida no imprime nada.

```md
:::paragraphs{style="entry"}
**Abacá.** Planta de las Filipinas de cuya fibra se hacen cabos.

**Abarloar.** Situar un buque junto a otro o junto a un muelle.
:::
```

```ts
header: {
  elements: [{
    kind: 'text', id: 'guia', content: '{firstMark.entry} – {lastMark.entry}',
    fontSize: { value: 8, unit: 'pt' },
    placement: { anchor: { to: 'container', edge: 'bottom' }, size: { width: 'auto', height: 'auto' } },
  }],
}
```

Las palabras guía son cabeceras: se resuelven en las ranuras de cabecera y pie (también en el `header` y el `footer` de un estilo de título) y no imprimen nada en los diseños de título, de parte y del índice; en los de título y de parte, el panel Revisión los señala como marcadores desconocidos. Para mostrar el primer lema en los versos y el último en los rectos, usa dos elementos con `parity: 'even'` y `parity: 'odd'`. Un H1 cuyo estilo de encabezado fija `runningChapter: false` no pone marca `h1`.

#### Capítulo en cabeza de página

`{chapterTitle}` y `{chapterNumber}` nombran el último capítulo empezado en la página o antes. En un libro cuyos capítulos van seguidos, sin salto de página entre ellos, una página que cierra un capítulo y empieza el siguiente cerca del pie lleva entonces el título del capítulo nuevo sobre un texto que aún pertenece al anterior. `{chapterTitleAtTop}` y `{chapterNumberAtTop}` nombran en cambio el capítulo vigente en la cabeza de la página, como hacen las novelas de capítulos seguidos y muchas obras de consulta:

- una página cuyo primer bloque es el H1 de un capítulo nombra ese capítulo;
- cualquier otra página nombra el capítulo que continúa, aunque más abajo empiece uno nuevo;
- una página en blanco añadida por paridad va con la página que la sigue, y la separadora de los modos `always-*` con la que la precede (consulta [Pertenencia de las páginas en blanco](https://postext.dev/es/docs/configuration-text.md#pertenencia-de-las-páginas-en-blanco)); si la página que sigue a una blanca de paridad empieza con el final de un capítulo y no con su H1, la blanca también se queda con ese capítulo;
- se salta un H1 con `runningChapter: false`.

```ts
header: {
  elements: [{
    kind: 'text', id: 'chapter', content: '{chapterTitleAtTop}', parity: 'odd', pages: 'body',
    fontSize: { value: 8, unit: 'pt' },
    placement: { anchor: { to: 'container', edge: 'bottom-right' }, size: { width: 'auto', height: 'auto' } },
  }],
}
```

Como las palabras guía, los dos son cabeceras: se resuelven en las ranuras de cabecera y pie y no imprimen nada en los diseños de título, de parte y del índice. `{attr.<clave>}` lee siempre el último capítulo empezado.

#### Alineación implícita por borde

Cuando un elemento de texto tiene `placement.anchor.to` apuntando a otro elemento mediante `#id`, el borde del anclaje implica una alineación por defecto para las líneas envueltas:

- `right-of` y `align-left` implican `align: 'left'` — las líneas envueltas fluyen hacia la derecha desde el anclaje.
- `left-of` y `align-right` implican `align: 'right'` — las líneas envueltas se pegan al lado más cercano al elemento de referencia.

El editor de encabezados del sandbox aplica estas alineaciones implícitas automáticamente al cambiar el borde o el destino del anclaje. Mantienen el texto envuelto visualmente atado al elemento al que se relaciona (de modo que, p. ej., la "P" de un "Postext" envuelto queda verticalmente bajo la "I" de "Introducción").

#### Marcas en línea y contornos

Un elemento de texto compone su texto en una sola fuente por defecto: `**`, `^` y los demás signos de marca de Markdown se imprimen tal cual. Con `inlineMarks: true` el texto resuelto se lee como Markdown en línea, con las mismas marcas que admite el texto de cuerpo (ver **Formato del documento → Formato en línea**):

- `**negrita**` compone con peso 700 (o con el `fontWeight` del elemento si es más grueso); `*cursiva*` invierte la inclinación del elemento, de modo que el énfasis dentro de un elemento en cursiva sale en redonda; `***ambas***` hace las dos cosas. También valen las formas con guion bajo (`__negrita__`, `_cursiva_`).
- `^superíndice^` y `~subíndice~` se componen al 58 % del tamaño, el superíndice elevado un tercio de él y el subíndice bajado 0,15; un subíndice y un superíndice que se tocan (`T~0~^2^`) se apilan, como en el cuerpo.
- Una barra invertida compone el propio signo de marca (`\*`, `\_`, `\^`, `\~`). Un enlace conserva su texto; las comillas invertidas de código desaparecen.

Las marcas se leen después de sustituir los marcadores, así que un valor puede llevarlas: la línea de autores de un atributo del encabezado recibe sus números de filiación como superíndices. El ajuste de línea, la justificación, los modos de elipsis, `dropCap` y `paragraphIndent` funcionan con texto marcado; todos los tramos conservan el color del elemento.

```json
{ "kind": "text", "id": "authors", "content": "{attr.authors}", "inlineMarks": true, "overflow": "wrap",
  "fontSize": { "value": 11, "unit": "pt" },
  "placement": { "anchor": { "to": "#title", "edge": "below" }, "offset": { "y": { "value": 6, "unit": "pt" } } } }
```

```md
# Innivación y caudal de los ríos {authors="Ana Ruiz^1^, Luis Gil^2^ y Marta Sanz^1,3^"}
```

`stroke` traza un contorno alrededor de las letras: `width` es el grosor de la línea, centrada en los bordes de los glifos (la mitad cae dentro de las letras y la mitad fuera; el ancho medido del texto no cambia), `color` es por defecto el del texto y `hollow: true` deja las letras sin relleno, de modo que solo se ve el contorno: una cifra de titular perfilada, un título que se despega de una fotografía. El contorno se pinta sobre el relleno, igual en el lienzo, en HTML (`-webkit-text-stroke`) y en el PDF (modo de renderizado de texto 2, o 1 si es hueco).

```json
{ "kind": "text", "id": "year", "content": "1863", "fontFamily": "Bitter", "fontSize": { "value": 120, "unit": "pt" }, "fontWeight": 700,
  "color": { "hex": "#1d3557", "model": "hex" },
  "stroke": { "width": { "value": 1.5, "unit": "pt" }, "hollow": true },
  "placement": { "anchor": { "to": "page", "edge": "bottom-right" }, "offset": { "x": { "value": -15, "unit": "mm" }, "y": { "value": -20, "unit": "mm" } } } }
```

En el PDF, los tramos en negrita y en cursiva incrustan las variantes correspondientes de la familia del elemento, así que el proveedor de fuentes debe suministrarlas.

#### Valores por defecto del texto y trampas del anclaje

Un elemento de texto que escribes tú parte de estos valores, y alguno sorprende:

- **`overflow` depende del hueco.** En un diseño de título o en una página de parte, un título largo pasa a más líneas; en un encabezado, un folio o una fila de parte del índice, un texto demasiado ancho para su hueco se corta en una línea con `…`. Usa `overflow: 'wrap'` en un encabezado que pueda alargarse (una dirección, una firma) y revisa los avisos `designTextTruncated` de los textos cortados. Un salto de línea en el contenido (un salto real, o `\n` en la plantilla o en el valor de un atributo) empieza una línea nueva en todos los modos; los modos de elipsis cortan cada línea por separado.
- **`align` vale `'center'` y `verticalAlign` vale `'middle'`.** Un elemento de ancho automático se ajusta a su línea más larga, así que sus líneas quedan centradas entre sí; usa `align: 'left'` para un bloque alineado a la izquierda (un elemento de ancho automático anclado a otro elemento alinea sus líneas por sí solo del lado de su anclaje, ver arriba).
- **La fuente es EB Garamond de 8 pt, en negro, con `lineHeight` de `1.2`**, sea cual sea la del texto de cuerpo. A diferencia de los demás interlineados de la configuración, el `lineHeight` de un texto de diseño suele ser un múltiplo sin unidad (`1.2`); un `Dimension` también vale (véase más arriba).

Un elemento sin `placement.size.width` (o con `'auto'`) toma el tamaño de su texto, pero solo dentro del hueco que va de su punto de anclaje al borde del contenedor hacia el que crece; para un anclaje `top` o `bottom`, el doble de la distancia al borde más cercano. Su `offset` cuenta. Un desplazamiento que lo aleja de ese borde no le quita nada: una cabecera corriente anclada a `top-left` con una `x` negativa (que cuelga en el margen izquierdo) no pierde hueco, porque crece hacia la derecha. Un desplazamiento hacia ese borde le quita otro tanto (el doble en un anclaje `top` o `bottom`), y uno que empuja el punto de anclaje más allá del borde lo deja sin hueco: un anclaje `top-right` con una `x` menor que menos el ancho del contenedor, o un anclaje `top` desplazado de lado más de la mitad de ese ancho. Sin hueco, un modo de elipsis no imprime nada y `'wrap'` apila un carácter por línea. Hay tres salidas:

- dar al elemento un `size.width` fijo: los anchos fijos nunca se recortan;
- anclarlo a `'page'` o a `'bleed'`, que convierte el marco de la página (o del sangrado) en su hueco;
- anclarlo al borde opuesto del contenedor.

El contenedor de la cabecera va del borde superior de corte al cuerpo, y el del pie, del cuerpo al borde inferior de corte: en la cabecera, los anclajes `top-*` se miden desde el borde de corte y los `bottom-*` desde el cuerpo, y al revés en el pie (ver **Marco del contenedor** más arriba). Una cabecera o un pie nunca desplazan el texto de cuerpo y se pintan encima de él, así que un elemento empujado al área del cuerpo tapa el texto. Una banda de apertura, en cambio, se pinta debajo del texto de cuerpo; el espacio que ocupa en el flujo se describe en [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada).

### Elementos de texto verticales

Un elemento de texto con `writingMode: 'vertical-rl'` se compone en vertical en un bloque cuyo texto es horizontal: las cabeceras y los folios de cualquier libro, que se quedan en el pliego, y cualquier diseño de una página horizontal. Se compone como un texto horizontal en un marco propio girado un cuarto de vuelta en el sentido de las agujas del reloj, y se devuelve girado a la página:

- Su caja queda donde la pone la colocación. Su alto es el largo de una línea: lo fija `size.height` (o `'auto'`, lo que mide el texto; `'fill'`, hasta el borde del contenedor), `size.width` fija cuántas líneas caben a lo ancho y `size.maxWidth` limita el largo de una línea.
- `align` coloca las líneas a lo largo de la caja (`'left'` arriba), `verticalAlign` a lo ancho (`'top'` a la derecha, donde va la primera línea), y el relleno de una caja se queda en el lado para el que está escrito.
- Los caracteres se miden y se pintan como en una página vertical: los hanzi de pie, a un cuadratín cada uno; la puntuación, en su forma vertical; las palabras latinas, tumbadas; los números cortos, en una casilla (`cjk.uprightDigits`). El canvas, el PDF y el HTML lo ponen en el mismo rectángulo.
- Con `inlineMarks: true` las marcas de orientación separan un tramo como en el cuerpo: `第:tcy[3.0]回` pone 3.0 en una casilla, `:upright[GDP]` pone las letras de pie una bajo otra, `:sideways[…]` tumba un tramo; una línea nunca se corta dentro de una de ellas. Un elemento horizontal las ignora.
- Un elemento vertical no lleva letra capital.
- En el flujo de una página vertical (una apertura, una página de parte, el título de un recuadro) el texto ya va hacia abajo y `writingMode` no cambia nada.

Los libros chinos verticales ponen cabeceras y folios en uno de tres sitios ([clreq §7.2](https://www.w3.org/TR/clreq/#x7-2-page-headers-footers-etc); para el japonés, [JLREQ §2.6](https://www.w3.org/TR/jlreq/#running_heads_and_page_numbers)):

| Convención | Dónde | Cómo se configura |
| --- | --- | --- |
| Cabecera y pie horizontales | Encima y debajo de la caja de texto, como en los libros horizontales; es lo más habitual. | La cabecera y el pie tal como están. |
| Margen exterior (estilo 中缝; 邊峰 en Taiwán) | A lo largo del margen exterior: el título del capítulo o del libro desde unos cuatro caracteres por debajo de la cabeza de la caja, y el folio hasta unos cinco por encima del pie, en números chinos, a un 80 % del cuerpo del texto. | Dos elementos verticales anclados a `'outer'`, abajo. |
| Esquina exterior del pie | El folio al pie de la página, en la esquina exterior (las normas de Taiwán para libros 中式). | Un elemento horizontal en el pie en `'bottom-left'` con `parity: 'odd'` y otro en `'bottom-right'` con `parity: 'even'` en un libro encuadernado por la derecha (al revés en uno por la izquierda). |

Las cabeceras del margen exterior, tal como las añade el Sandbox (**Encabezado › Cabeceras en el margen exterior (vertical)**), aquí para un cuerpo de 10 pt (el Sandbox las pone al 80 % del cuerpo del texto):

```json
{
  "page": { "pageNumbering": { "format": "trad-chinese-informal" } },
  "header": { "elements": [
    { "kind": "text", "id": "head", "content": "{chapterTitle}", "writingMode": "vertical-rl",
      "fontSize": { "value": 8, "unit": "pt" }, "overflow": "clip", "align": "left",
      "placement": { "anchor": { "to": "outer", "edge": "top" }, "offset": { "y": { "value": 4, "unit": "em" } } } },
    { "kind": "text", "id": "folio", "content": "{pageNumber}", "writingMode": "vertical-rl",
      "fontSize": { "value": 8, "unit": "pt" }, "overflow": "clip", "align": "left",
      "placement": { "anchor": { "to": "outer", "edge": "bottom" }, "offset": { "y": { "value": -5, "unit": "em" } } } }
  ] }
}
```

`anchor.to: 'outer'` (ver [Posicionamiento de elementos](https://postext.dev/es/docs/configuration-page-layout.md#posicionamiento-de-elementos)) es el margen exterior de cada página, así que los dos elementos bajan por el borde izquierdo de una página impar y por el derecho de una par en un libro encuadernado por la derecha (`page.binding`). `{pageNumber}` sale en el formato de la numeración: `trad-chinese-informal` da 一百零三 en la página 103, y `cjk-decimal`, 一〇三. Las reglas de cada bloque siguen valiendo: `pages: 'body'` quita una cabecera de las aperturas de capítulo. Un adorno corto entre cabecera y folio (una cola de pez ︻, un filete) es un elemento más anclado al mismo marco.

En el VDT un bloque vertical lleva `vertical` (`VDTDesignTextBlock.vertical`: la región, las cifras de pie y el eje central de cada familia); sus líneas están en el marco girado del propio bloque: `xOffset` hacia abajo desde el borde superior de la caja y `baselineY` hacia la izquierda desde su borde derecho. Un tramo de una línea con marcas lleva `tcy` u `orientation`, como un segmento del cuerpo.

### Elementos de línea

Los elementos de línea dibujan una línea: horizontal a lo ancho del bloque, o vertical a lo alto.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `kind` | `'rule'` | — | Discriminador. |
| `id` | `string` | — | Id estable, único dentro del bloque, para referencias `anchor.to: '#id'`. |
| `direction` | `'horizontal' \| 'vertical'` | `'horizontal'` | Una línea horizontal recorre `placement.size.width` (`'fill'` = hasta el borde del contenedor) y mide `thickness` de alto. Una vertical recorre `placement.size.height` (`'fill'` o sin definir = hasta el borde del contenedor) y mide `thickness` de ancho — un separador entre el titulillo y el folio. |
| `color` | `ColorValue` | `#000000` | Color del trazo. |
| `thickness` | `Dimension` | `0.5 pt` | Grosor de la línea. Una línea que lo omite se dibuja con el valor por defecto (hasta postext 1.4 no pintaba nada). |
| `width` | `Dimension \| 'full'` | `'full'` | `'full'` abarca el área de contenido; una `Dimension` restringe la línea a un largo fijo posicionado por `align`. |
| `align` | `'left' \| 'center' \| 'right'` | `'center'` | Alineación cuando `width` no es `'full'`. |
| `marginFromBody` | `Dimension` | `6 pt` | Distancia absoluta entre el borde de la línea que mira al cuerpo y el borde del cuerpo. Independiente de otros elementos. |
| `marginFromEdge` | `Dimension` | `0 pt` | Desplazamiento horizontal respecto al borde alineado. Solo aplica cuando `width` es una `Dimension` fija y `align` es `'left'` o `'right'`. |
| `parity` | `'all' \| 'odd' \| 'even'` | `'all'` | En qué páginas aparece la línea. |
| `pages` | `'all' \| 'body' \| 'opener' \| 'part' \| 'blank'` | `'all'` | Roles de página en los que aparece la línea (ver el campo `pages` de los elementos de texto). |
| `reserve` | `boolean` | `true` | Solo en diseños de encabezado: si la línea cuenta para la altura que el encabezado reserva en el flujo del texto (ver [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada)). |
| `placement` | `ElementPlacement` | derivado de `align` + `marginFromBody` + `marginFromEdge` | Posicionamiento avanzado (ver [Posicionamiento de elementos](https://postext.dev/es/docs/configuration-page-layout.md#posicionamiento-de-elementos)). `size.width` / `size.height` fijan la longitud de la línea; `width: 'fill'` es el antiguo `'full'`. |

### Elementos de caja

Los elementos de caja pintan un rectángulo redondeado dentro del bloque — útiles como fondo tras un texto en aperturas de capítulo, columnas laterales o pies. Las cajas se posicionan exclusivamente mediante el campo `placement`; no tienen variante plana heredada. El relleno, el trazo y el radio de esquina viven en el objeto anidado `style` (`ElementBoxStyle`), como en el ejemplo JSON de «Posicionamiento de elementos».

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `kind` | `'box'` | — | Discriminador. |
| `id` | `string` | — | Id estable, único dentro del bloque. Los elementos hermanos se anclan a él con `anchor.to: '#id'`. El sandbox asigna uno al crear el elemento. |
| `style.backgroundColor` | `ColorValue` | `transparent` | Color de relleno. Pon `transparent` para una caja solo de borde. |
| `style.borderColor` | `ColorValue` | `transparent` | Color del trazo. |
| `style.borderWidth` | `Dimension` | `0 pt` | Grosor del trazo. El trazo se pinta hacia el interior del rectángulo de la caja, así las dimensiones exteriores no varían: el borde exterior del trazo va por el borde de la caja, y una caja redondeada conserva su radio exterior. Un trazo tan ancho como la caja la rellena. Canvas, HTML y PDF lo dibujan igual (hasta postext 1.4 el canvas y el PDF centraban el trazo en el borde, con la mitad fuera de la caja). |
| `style.borderRadius` | `Dimension` | `0 pt` | Radio de esquina. Se acota a la mitad del lado más corto en tiempo de renderizado. |
| `placement` | `ElementPlacement` | — | Obligatorio. Ver «Posicionamiento de elementos» más abajo. |
| `parity` | `'all' \| 'odd' \| 'even'` | `'all'` | En qué páginas aparece la caja. |
| `pages` | `'all' \| 'body' \| 'opener' \| 'part' \| 'blank'` | `'all'` | Roles de página en los que aparece la caja (ver el campo `pages` de los elementos de texto). |
| `reserve` | `boolean` | `true` | Solo en diseños de encabezado: si la caja cuenta para la altura que el encabezado reserva en el flujo del texto (ver [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada)). |

### Elementos de imagen

Un elemento `image` dibuja un recurso de mapa de bits o SVG del documento — el logotipo de la editorial en la portada, una marca en una cabecera. Su tamaño lo fija `placement.size`: si uno de los lados `width` / `height` queda en `'auto'` (el valor por defecto), el otro sigue la proporción de la imagen; con ambos fijados, la imagen se ajusta dentro de la caja, centrada. Un recurso inexistente o que no sea una imagen no dibuja nada.

```ts
{
  kind: 'image', id: 'logo', resourceId: 'logo-editorial',
  placement: { anchor: { to: 'page', edge: 'top-left' }, offset: { x: { value: 64, unit: 'mm' }, y: { value: 233, unit: 'mm' } }, size: { width: { value: 83, unit: 'mm' }, height: 'auto' } },
}
```

`resourceId` admite los mismos marcadores que el `content` de un elemento de texto, así que un mismo diseño puede dibujar una imagen distinta en cada encabezado. Con `resourceId: '{attr.vineta}'` en un estilo de encabezado, `# Capítulo I {style="apertura" vineta="tronco"}` dibuja el recurso `tronco` y `# Capítulo II {style="apertura" vineta="peluca"}` dibuja `peluca`: los capítulos comparten el estilo en lugar de clonarlo para cada imagen. Una cabecera o un pie leen los atributos del capítulo de la página, como `{attr.<clave>}` en un titulillo, y sirven también los demás marcadores (`'mapa-{chapterNumber}'`). Un id que queda vacío, como el de un encabezado sin el atributo, no dibuja nada. Desde postext 1.8.

| Propiedad | Tipo | Por defecto | Descripción |
| --- | --- | --- | --- |
| `id` | `string` | — | Identificador estable; otros elementos pueden anclarse a él como `#id`. |
| `resourceId` | `string` | — | Id de un `Resource` de mapa de bits o SVG del documento. Puede llevar marcadores, entre ellos `{attr.<clave>}`, que se rellenan en cada encabezado, parte o página. |
| `decorative` | `boolean` | `false` | La imagen es solo adorno (un ornamento, una banda): no aporta texto alternativo a la salida aunque su recurso lo tenga (ver más abajo). |
| `placement` | `ElementPlacement` | — | Anclaje, desplazamiento y tamaño (ver [Posicionamiento de elementos](https://postext.dev/es/docs/configuration-page-layout.md#posicionamiento-de-elementos)). Un lado `'fill'` llega hasta el borde del contenedor. |
| `parity`, `pages` | como arriba | `'all'` | En qué páginas aparece la imagen. |
| `reserve` | `boolean` | `true` | Solo en diseños de encabezado: si la imagen cuenta para la altura que el encabezado reserva en el flujo del texto (ver [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada)). |

El backend PDF incrusta el recurso como una figura (un SVG con máster de impresión lo usa); el visor HTML lo resuelve mediante `resourceImageUrl`.

Una imagen que dibuja un diseño es contenido cuando su recurso la describe: el `altText` del recurso, o su pie como texto sin formato cuando no lo tiene (una etiqueta `:chip` se lee por su texto y una `:ref` por su `text` si lo lleva), pasa al VDT (`VDTDesignImageBlock.altText`), es el `alt` de su `<img>` en HTML y una `Figure` con `/Alt` en un PDF etiquetado, que se lee justo después del texto de su diseño (la lámina de un capítulo, después del título del capítulo). Una imagen cuyo recurso no tiene ni lo uno ni lo otro, y una marcada como `decorative`, es adorno: `alt=""` con `role="presentation"`, y un artefacto en el PDF. La imagen de una cabecera o un pie se repite en todas las páginas, así que se trata como un elemento de paginación diga lo que diga su recurso: sin `altText` en el VDT, `alt=""` con `role="presentation"` en HTML y un artefacto de la página en el PDF.

### Posicionamiento de elementos

`ElementPlacement` es el modelo unificado de posicionamiento que utilizan todos los tipos de elementos (texto, línea, caja) dentro de cualquier ranura de diseño — encabezado de página, pie de página o ranura de diseño avanzado a nivel de encabezado. Tres campos describen un placement:

```ts
interface ElementPlacement {
  /** A qué ancla este elemento y a qué borde de ese destino. */
  anchor: {
    to: 'container' | 'page' | 'bleed' | 'outer' | `#${string}`; // container = el bloque; page = caja de corte; bleed = caja de corte + sangre; outer = el margen exterior (cabecera, pie); #id = otro elemento
    edge: AnchorEdge;
  };
  /** Distancia desde el punto de anclaje. */
  offset?: { x?: Dimension; y?: Dimension };
  /** Ancho / alto opcional. El ancho admite también 'fill' (extender a lo largo del bloque).
   *  `maxWidth` limita un ancho 'auto' (texto): el elemento sigue ajustándose a su
   *  contenido, así que los elementos anclados a él no se despegan, pero un texto largo
   *  se corta o se pliega ahí — una cabecera puede reservar sitio para la etiqueta que
   *  cuelga de ella en vez de expulsarla. */
  size?: { width?: Dimension | 'fill' | 'auto'; height?: Dimension | 'fill' | 'auto'; maxWidth?: Dimension };
}
```

`AnchorEdge` admite:

- **Bordes del contenedor** (cuando `anchor.to` es `'container'`, `'page'` o `'bleed'`): `top`, `top-left`, `top-right`, `bottom`, `bottom-left`, `bottom-right`, `left`, `right`.
- **Bordes relativos a otro elemento** (cuando `anchor.to === '#someId'`): `right-of`, `left-of`, `below`, `above`, `align-top`, `align-bottom`, `align-left`, `align-right`.

Cada borde relativo a otro elemento pone una esquina del elemento sobre una esquina del elemento al que se ancla, y `offset` lo desplaza desde ahí:

- `right-of`: su esquina superior izquierda sobre la superior derecha del de referencia (al lado, con las partes superiores a la misma altura); `left-of`: su esquina superior derecha sobre la superior izquierda del de referencia;
- `below`: su esquina superior izquierda sobre la inferior izquierda del de referencia (debajo, con los bordes izquierdos alineados); `above`: su esquina inferior izquierda sobre la superior izquierda del de referencia;
- `align-top` y `align-left`: su esquina superior izquierda sobre la superior izquierda del de referencia. Los dos nombres dan la misma colocación: se alinean a la vez los bordes superiores y los izquierdos;
- `align-bottom`: su esquina inferior izquierda sobre la inferior izquierda del de referencia;
- `align-right`: su esquina superior derecha sobre la superior derecha del de referencia.

Un borde relativo a otro elemento usado con `'container'`, `'page'` o `'bleed'`, y un borde de contenedor usado con `'#id'`, se leen como la esquina superior izquierda.

`anchor.to: 'page'` ancla el elemento a la **caja de corte** (la página física una vez cortada) y `'bleed'` a la caja de corte ampliada por `cutLines.bleed` en todos los lados (idéntica a la caja de corte mientras las marcas de corte estén desactivadas). Ambos marcos pasan a ser también la referencia de `size: 'fill'` y del recorte automático de anchura, de modo que una banda de color puede ir de borde a borde independientemente de los márgenes de página:

```json
{ "kind": "box", "id": "band", "placement": { "anchor": { "to": "bleed", "edge": "top-left" }, "size": { "width": "fill", "height": { "value": 6, "unit": "cm" } } }, "style": { "backgroundColor": { "hex": "#1d3557", "model": "hex" } } }
```

Con las marcas de corte activadas, lo que un elemento pinta fuera de la caja de sangrado se recorta (véase [Marcas de corte](https://postext.dev/es/docs/configuration-page-layout.md#marcas-de-corte)).

`anchor.to: 'outer'` (bloques de cabecera y pie) ancla el elemento al **margen exterior** de la página: del borde de la caja de texto al borde de corte en el lado contrario al lomo, y de la cabeza de la caja de texto a su pie. Queda a la derecha de una página impar y a la izquierda de una par en un libro encuadernado por la izquierda, y al revés en uno encuadernado por la derecha (`page.binding`), de modo que un solo elemento sirve para las dos páginas de un pliego: una cabecera por el margen exterior (ver [Elementos de texto verticales](https://postext.dev/es/docs/configuration-page-layout.md#elementos-de-texto-verticales)). En cualquier otro bloque se lee como `'container'`. El `offset` de un elemento de texto puede ir en `em`, cuadratines de su propio `fontSize`: cuatro caracteres por debajo de la cabeza de la caja de texto es `{ "y": { "value": 4, "unit": "em" } }`.

Dentro de la ranura de diseño avanzado de un encabezado, los elementos anclados a la página o a la sangre no aumentan la altura reservada para el encabezado salvo que se extiendan por debajo de su borde superior (una banda en la parte superior de la página queda detrás de la apertura; una banda que baje más allá del encabezado empuja el cuerpo hacia abajo). Usa `advancedDesign.minHeight` para reservar una altura fija de apertura en cualquier caso, y `reserve: false` en un elemento que no deba empujar el texto en absoluto. Las reglas completas están en [Altura reservada](https://postext.dev/es/docs/configuration-text.md#altura-reservada).

Cada elemento tiene un `id` estable (que asigna automáticamente el sandbox; también puedes establecerlo a mano). Los elementos anclados a otros elementos forman un pequeño grafo de dependencias que el motor resuelve antes de medir, así un elemento puede encadenarse a otro sin coordenadas manuales.

La forma heredada `align` + `marginFromBody` + `marginFromEdge` se interpreta a la entrada y se reescribe a un placement en el momento de resolver la configuración, así que las configuraciones existentes siguen funcionando sin cambios.
