# Configuración: encabezados y pies de página

> Lo que se imprime arriba y al pie de cada página: texto con marcadores, líneas, cajas e imágenes, según la paridad de la página, y dónde va cada elemento

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

## En pocas palabras

Esta página reúne lo que se imprime arriba y abajo de cada página. Un encabezado o un pie puede llevar el número de página, el título del libro o del capítulo, una línea, una caja o una imagen pequeña. Las páginas de la izquierda y las de la derecha pueden mostrar cosas distintas. Cada elemento puede ir a la izquierda, en el centro o a la derecha, o en el margen, junto al texto. El encabezado y el pie van dentro de los márgenes, así que nunca le quitan espacio al texto.

## 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-language.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. Nunca cambia los glifos: las ligaduras del tipo se conservan en canvas, HTML, EPUB y PDF (hasta postext 1.27 canvas y HTML las perdían en el texto de diseño con tracking, que quedaba más ancho de lo medido). Un tramo en hebreo lleva tracking como el texto latino; solo un texto con letras árabes no lo lleva. 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-headers-footers.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-bundles.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-headers-footers.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-headers-footers.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-headers-footers.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-headings.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-headers-footers.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-headers-footers.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-headers-footers.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-headings.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-headings.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-headers-footers.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-headings.md#altura-reservada)). |
| `placement` | `ElementPlacement` | derivado de `align` + `marginFromBody` + `marginFromEdge` | Posicionamiento avanzado (ver [Posicionamiento de elementos](https://postext.dev/es/docs/configuration-headers-footers.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-headings.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-headers-footers.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-headings.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-headers-footers.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-headings.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.
