Capítulo 3.7 · Parte II · El oficio
Configuración: listas y matemáticas
Las listas con viñetas y las numeradas, sus marcas, sangrías y anidamiento, las listas de tareas, y el cuerpo, el color y el espaciado de las fórmulas matemáticas
En pocas palabras
Esta página reúne las listas y las fórmulas. Una lista con viñetas marca cada elemento con un símbolo, y una lista numerada cuenta sus elementos con números o letras. Fijas la marca, la sangría y el espacio de cada lista, y los cambias para las listas que van dentro de otras. Las listas de tareas dibujan una casilla que se puede marcar. La última sección fija el tamaño, el color y el espacio alrededor de las fórmulas matemáticas.
#Listas no ordenadas
La propiedad unorderedLists controla cómo se renderizan las listas con viñetas (-, *, +) y las listas de tareas estilo GFM (- [ ], - [x]). Se admiten hasta cinco niveles de anidamiento.
#Valores por defecto de listas no ordenadas
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
fontFamily | string | hereda bodyText.fontFamily | Fuente del texto de los elementos. |
color | ColorValue | Color principal (#295AA3) | Color del texto y de las viñetas de los elementos. Enlazado a la entrada main-color de la paleta por defecto. |
fontWeight | number | 700 | Peso del texto de los elementos (100–900). Las viñetas heredan este peso salvo que se sobrescriba por nivel. |
italic | boolean | false | Renderiza el texto de los elementos en cursiva. |
bulletChar | string | '•' | Glifo utilizado como viñeta. |
bulletFontSize | Dimension | 1 em | Tamaño del glifo de la viñeta. Las unidades relativas escalan con el tamaño del cuerpo de texto. |
gap | Dimension | 0.5 em | Espacio horizontal entre la viñeta y el texto del elemento. |
indent | Dimension | 0 em | Sangría base para el nivel 1. Los niveles más profundos se encadenan desde el inicio del texto del nivel anterior salvo que se especifique (ver más abajo). |
bulletVerticalOffset | Dimension | 0 em | Ajuste fino vertical de la viñeta. Valores negativos la suben; positivos la bajan. |
marginTop / marginBottom | Dimension | 1.5 em | Espacio antes y después del bloque de lista. |
itemSpacing | Dimension | 0 em | Espacio vertical extra entre elementos, añadido sobre la altura de línea. Alrededor de una lista anidada en un elemento de otra se aplica, a ambos lados, el de la lista exterior: antes del primer elemento de la lista anidada y después del último (hasta postext 1.4, el elemento que seguía a una lista anidada tomaba el espacio de esta). |
snapTopToGrid | boolean | false | Redondea hacia arriba el espacio sobre la lista para que su primer elemento quede en la rejilla base, como el texto bajo un encabezado; marginTop pasa a ser un mínimo. El final de la lista devuelve el flujo a la rejilla en cualquier caso, así que con itemSpacing a 0 todos los elementos quedan alineados con el texto de la columna contigua. Desactivado por defecto, como hasta postext 1.4: un marginTop que no es un número entero de líneas deja los elementos fuera de la rejilla hasta que termina la lista. No afecta a las listas dentro de recuadros, cuyo interior queda fuera de la rejilla. |
hangingIndent | boolean | true | Cuando está activo, las líneas envueltas se alinean con el primer carácter de texto en lugar de hacerlo bajo la viñeta (sangría francesa). |
levels | UnorderedListLevelConfig[] | — | Sobrescrituras por profundidad para los niveles 1–5. Ver más abajo. |
#Extensiones para listas de tareas
Los elementos de tarea GFM (- [ ] …, - [x] …) se renderizan como elementos de lista no ordenada con una casilla en lugar de la viñeta. El motor dibuja la casilla él mismo, un cuadrado en contorno con una marca cuando la tarea está hecha: no se pide a ninguna fuente, así que es igual en todas las máquinas, en el canvas, en el PDF, en el HTML y en el EPUB, y las tecnologías de apoyo leen ☐ o ☑. Su lado mide 0,6 em del tamaño del marcador (bulletFontSize, o el fontSize del nivel), y ese es el espacio que ocupa antes del gap; al tamaño del texto se apoya en la línea base de la primera línea del elemento. Su trazo sigue el fontWeight del marcador y su color, el color del marcador. Los siguientes campos solo aplican a las tareas:
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
taskCheckboxChar | string | '☐' | Carácter de una tarea no marcada. El predeterminado no se compone como texto: el motor dibuja la casilla. Cualquier otro carácter se compone como texto en la fuente de la lista, que entonces debe contenerlo. |
taskCheckedChar | string | '☑' | Carácter de una tarea completada. El predeterminado también se dibuja, como casilla con marca; cualquier otro carácter se compone como texto en la fuente de la lista. |
taskBox | 'drawn' | 'character' | 'drawn' | Cómo se componen los dos caracteres predeterminados. 'drawn': el motor dibuja la casilla. 'character': ☐ y ☑ son texto en la fuente de la lista, como hasta postext 1.28; en una fuente que no los tiene, el navegador elige una fuente del sistema, y el texto del elemento empieza tras el ancho que esa fuente da. Una configuración guardada antes de la versión 13 se lee con 'character', así que sus líneas siguen donde estaban. |
taskCompletedStrikethrough | boolean | true | Dibuja una línea tachando el texto de las tareas completadas. |
taskCompletedColor | ColorValue | hereda el color del elemento | Color opcional aplicado al texto de las tareas completadas. Cuando se omite, se usa el color habitual del elemento. |
#Sobrescrituras por nivel (listas no ordenadas)
Cada entrada de levels apunta a una profundidad (1–5) y puede sobrescribir cualquiera de las siguientes propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
bulletChar | string | Glifo de viñeta para esta profundidad. |
fontFamily | string | Fuente del texto en esta profundidad. |
fontSize | Dimension | Tamaño del glifo de viñeta en esta profundidad. |
color | ColorValue | Color del texto del elemento. |
fontWeight | number | Peso del texto del elemento. |
italic | boolean | Activa la cursiva. |
indent | Dimension | Sangría explícita de la viñeta en esta profundidad. Ver la regla de encadenamiento a continuación. |
verticalOffset | Dimension | Ajuste fino vertical de la viñeta en esta profundidad. |
Encadenamiento de sangrías. El nivel 1 arranca siempre con el indent general (por defecto 0 em — las viñetas quedan pegadas al borde de la columna). Para los niveles 2–5, si dejas indent sin definir el motor coloca la viñeta en el inicio de texto del nivel anterior (sangría del padre + ancho de viñeta + gap). Define un indent explícito en un nivel para romper el encadenamiento y fijar esa profundidad donde prefieras.
unorderedLists: {
bulletChar: '—',
gap: { value: 0.4, unit: 'em' },
hangingIndent: true,
levels: [
{ level: 2, bulletChar: '·' },
{ level: 3, bulletChar: '◦', color: { hex: '#666666', model: 'hex' } },
],
}#Listas ordenadas
La propiedad orderedLists controla las listas numeradas (1., 2), etc.). Se admiten hasta cinco niveles de anidamiento y cada profundidad puede usar un formato de numeración distinto.
#Valores por defecto de listas ordenadas
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
fontFamily | string | hereda bodyText.fontFamily | Fuente del texto y del marcador numérico. |
color | ColorValue | Color principal (#295AA3) | Color del texto y del marcador numérico. Enlazado a la entrada main-color de la paleta por defecto. |
fontWeight | number | 700 | Peso del texto y del marcador numérico (100–900). |
italic | boolean | false | Renderiza el texto en cursiva. |
numberFormat | OrderedListNumberFormat | 'arabic' | Estilo de numeración: 'arabic', 'lower-alpha', 'upper-alpha', 'lower-roman', 'upper-roman'. También valen las grafías de los otros ajustes ('decimal', 'roman-lower', 'i'…; ver Grafías de los formatos de numeración); un valor desconocido numera en arábigos y se notifica. |
prefix | string | '' | Texto que precede al número, con el estilo del separador: con '(' aquí y ')' como separador, una lista china se numera (一), (二). Cuando el separador se dibuja como un tramo propio, el prefijo también, justo antes del número. |
separator | string | '.' | Carácter situado entre el número y el texto — normalmente '.' o ')'. |
separatorFontFamily | string | hereda fontFamily | Fuente del separador. Cuando algún estilo del separador difiere del número, el separador se dibuja como una tirada propia tras el número (alineado a la derecha) — p. ej. 1 en Optima Bold negro seguido de • en DIN Pro Bold azul. |
separatorFontWeight | number | hereda fontWeight | Peso del separador (100–900). |
separatorItalic | boolean | hereda italic | Renderiza el separador en cursiva. |
separatorColor | ColorValue | hereda color | Color del separador. Se respetan las referencias a la paleta. |
separatorGap | Dimension | 0 em | Espacio entre el número y el separador. El texto del elemento sigue empezando gap después del separador. |
numberFontSize | Dimension | 1 em | Tamaño del marcador numérico. |
gap | Dimension | 0.5 em | Espacio horizontal entre el número y el texto del elemento. |
indent | Dimension | 0 em | Sangría base para el nivel 1; los niveles más profundos se encadenan desde el inicio del texto del nivel anterior salvo que se especifique. |
numberVerticalOffset | Dimension | 0 em | Ajuste fino vertical del marcador numérico. |
marginTop / marginBottom | Dimension | 1.5 em | Espacio antes y después del bloque de lista. |
itemSpacing | Dimension | 0 em | Espacio vertical extra entre elementos. Alrededor de una lista anidada en un elemento de otra se aplica, a ambos lados, el de la lista exterior: antes del primer elemento de la lista anidada y después del último (hasta postext 1.4, el elemento que seguía a una lista anidada tomaba el espacio de esta). |
snapTopToGrid | boolean | false | Redondea hacia arriba el espacio sobre la lista para que su primer número quede en la rejilla base, como el texto bajo un encabezado; marginTop pasa a ser un mínimo. El final de la lista devuelve el flujo a la rejilla en cualquier caso, así que con itemSpacing a 0 todos los elementos quedan alineados con el texto de la columna contigua. Desactivado por defecto, como hasta postext 1.4: un marginTop que no es un número entero de líneas deja los elementos fuera de la rejilla hasta que termina la lista. No afecta a las listas dentro de recuadros, cuyo interior queda fuera de la rejilla. |
numberWidth | 'run' | 'level' | 'item' | 'run' | El ancho de la columna de números de un elemento, que fija dónde empieza su texto; los números se alinean a la derecha dentro de ella. 'run': el número más ancho del propio tramo del elemento, los elementos de una misma profundidad sin nada más que elementos más profundos entre ellos. Una figura, un párrafo o un recuadro entre dos elementos abre un tramo nuevo, así que ii) tras una tabla puede empezar su texto algo más a la derecha que i) antes de ella, y una lista de nueve elementos compone su texto a la izquierda de una de doce. 'level': el número más ancho de esa profundidad en todo el documento (el capítulo, en un libro), así que todas las listas, y cada parte de una lista interrumpida, empiezan su texto en el mismo sitio, como ya hacen las sangrías de los niveles más profundos. 'item': el número del propio elemento, así que el texto de cada elemento empieza un gap después de su propia etiqueta: 第九條 y 第十一條 llevan detrás el mismo espacio y sus textos empiezan en sitios distintos, como imprime el Boletín Oficial japonés los artículos de una ley. Las líneas siguientes obedecen a hangingIndent: con false vuelven a la sangría de la lista, con true cuelgan bajo el texto del propio elemento. La sangría de un nivel más profundo sigue siendo un solo valor por nivel. Desde postext 1.28. |
numberAlign | 'end' | 'start' | 'end' | Cómo se coloca un número en su columna. 'end': junto al texto, así que los números de un tramo terminan a la misma altura y 9. y 10. alinean sus puntos. 'start': al principio de la columna (la izquierda en una página de izquierda a derecha, la derecha en una de derecha a izquierda, la cabeza de la línea en texto vertical), así que las etiquetas de distinta longitud empiezan a la misma altura, como los artículos de una ley (第九條, 第十一條). La columna conserva el ancho que le da numberWidth, de modo que el texto de los elementos empieza en el mismo sitio en los dos casos; con un separador de estilo propio, el separador sigue a su número. Desde postext 1.26. Con numberWidth: 'item' la columna es el propio número, así que los dos valores componen la misma lista. |
hangingIndent | boolean | true | Las líneas envueltas se alinean con el primer carácter de texto, no bajo el número. |
levels | OrderedListLevelConfig[] | — | Sobrescrituras por profundidad para los niveles 1–5. |
#Sobrescrituras por nivel (listas ordenadas)
Cada entrada de levels puede sobrescribir numberFormat, prefix, separator, fontFamily, fontSize, color, fontWeight, italic, indent, verticalOffset y el estilo del separador (separatorFontFamily, separatorFontWeight, separatorItalic, separatorColor, separatorGap) — se aplica el mismo encadenamiento de sangrías que en las listas no ordenadas. El estilo del separador de un nivel hereda el estilo de su propio número salvo que se indique el ajuste general del separador.
Alineación a la derecha. El pipeline mide el número formateado más ancho dentro de cada recorrido e indenta todos los elementos de ese recorrido para que los marcadores queden alineados por su borde derecho. Una lista de diez elementos renderizada como 1. – 10. desplaza los números de un dígito a la derecha para que el separador caiga siempre en la misma columna.
orderedLists: {
numberFormat: 'arabic',
separator: '.',
levels: [
{ level: 2, numberFormat: 'lower-alpha' },
{ level: 3, numberFormat: 'lower-roman', separator: ')' },
],
}Esto produce la clásica combinación anidada:
1. Primer elemento
a. Subelemento
i) Nota profunda
b. Subelemento
2. Segundo elemento
La jerarquía de los documentos chinos (GB/T 15834—2011, anexo B.3) tiene cinco niveles: 一、, luego (一), luego 1., luego (1) y luego ①:
orderedLists: {
levels: [
{ level: 1, numberFormat: 'simp-chinese-informal', separator: '、' },
{ level: 2, numberFormat: 'simp-chinese-informal', prefix: '(', separator: ')' },
{ level: 3, numberFormat: 'arabic', separator: '.' },
{ level: 4, numberFormat: 'arabic', prefix: '(', separator: ')' },
{ level: 5, numberFormat: 'circled-decimal', separator: '' },
],
}#Matemáticas
La propiedad math controla cómo se analizan y se renderizan las fórmulas LaTeX escritas entre delimitadores $...$ (en línea) y $$...$$ (en bloque). El motor subyacente es MathJax (el paquete mathjax-full) en modo de salida SVG, rasterizado en el canvas e incrustado como glifos escalables en el PDF.
interface MathConfig {
enabled?: boolean; // Renderizar LaTeX. Si es false, los spans salen como TeX literal.
fontSizeScale?: number; // × el tamaño del texto que rodea la fórmula (el del cuerpo en las fórmulas en bloque).
color?: ColorValue; // Color de la fórmula; hereda del cuerpo si se omite.
marginTop?: Dimension; // Espacio encima de las fórmulas en bloque.
marginBottom?: Dimension; // Espacio mínimo debajo; el snap a rejilla puede aumentarlo.
indentAfterDisplay?: boolean; // Sangrar el párrafo que sigue a una fórmula en bloque.
keepWithLeadIn?: boolean; // Mantener una fórmula en bloque con la línea que la introduce.
equationNumbering?: { // Numerar las fórmulas en bloque que llevan un \label.
enabled?: boolean; // por defecto true
numberingTemplate?: string; // '{n}'; '{h1}.{n}' numera por capítulo
resetOn?: ResourceCounterReset; // 'never' | 'h1' … 'h6'
counterFormat?: ResourceCounterFormat; // 'decimal'
format?: string; // '({n})': lo que imprimen la fórmula y \eqref
};
}| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
enabled | boolean | true | Cuando es false, los spans $...$ y $$...$$ siguen analizándose (los avisos por delimitadores sin cerrar siguen disparándose), pero se renderizan como su código TeX literal. Útil cuando el contenido contiene signos de dólar a propósito o cuando quieres desactivar por completo el renderizado matemático. |
fontSizeScale | number | 1.0 | Multiplicador aplicado al tamaño del texto que rodea la fórmula antes del renderizado: un em de la fuente TeX de la fórmula mide ese tamaño × fontSizeScale — bodyText.fontSize para una fórmula en bloque y para las fórmulas en línea del texto de cuerpo, el tamaño del bloque que la contiene para una fórmula en línea en un encabezado, un estilo de párrafo, un pie o el cuerpo de un recuadro. 1.0 iguala al texto que la rodea; valores en el rango 0.9–1.1 son habituales cuando la fuente matemática parece ligeramente más grande o más pequeña que la fuente de prosa. Cambia en postext 1.5: hasta la 1.4 las fórmulas salían en torno a un 13 % más grandes (ver más abajo). |
color | ColorValue | hereda del cuerpo | Color de la fórmula renderizada. Omítelo para heredar bodyText.color. Fíjalo explícitamente cuando quieras tintar las fórmulas de forma distinta a la prosa — por ejemplo para que coincidan con el acento de los encabezados. |
marginTop | Dimension | 0.8em | Espacio por encima de una fórmula en bloque. Se ignora para fórmulas en línea. |
marginBottom | Dimension | 0.8em | Espacio por debajo de una fórmula en bloque. Es un mínimo: el ajuste a la rejilla puede ampliarlo para que la siguiente línea base caiga en una línea de la rejilla (tanto si page.baselineGrid dibuja la rejilla como si no). |
indentAfterDisplay | boolean | true | Sangra la primera línea del párrafo que sigue a una fórmula en bloque, como cualquier otro párrafo. Con false, todo párrafo justo después de una fórmula en bloque se compone sin sangría, como continuación de la frase que la fórmula interrumpió («donde L es…»). Tras una fórmula escrita dentro de un párrafo —sin línea en blanco ni encima ni debajo— el texto nunca se sangra: lo escrito bajo su $$ de cierre continúa ese párrafo (consulta Fórmulas matemáticas). |
keepWithLeadIn | boolean | false | Mantiene una fórmula en bloque en la columna de la línea que la introduce, como la penalización \predisplaypenalty de TeX. Cuando la fórmula no cabe bajo la última línea del párrafo anterior, esa línea pasa con la fórmula a la columna o página siguiente; cuando las líneas que quedarían atrás son menos de bodyText.widowMinLines (menos de una si bodyText.avoidWidows está desactivado), un párrafo que empieza en esa columna pasa entero (con los encabezados que cierran la columna por encima, según headings.keepWithNext). La línea que pasa queda sola en lo alto de la columna siguiente, diga lo que diga la regla de las huérfanas. Con false, la fórmula pasa sola, y la línea que la introduce puede cerrar la columna de arriba o quedar sobre una figura que encabeza la siguiente. |
equationNumbering | { enabled, numberingTemplate, resetOn, counterFormat, format } | true, '{n}', 'never', 'decimal', '({n})' | Cómo se numeran las fórmulas en bloque que llevan un \label (ver Ecuaciones numeradas más abajo). numberingTemplate, resetOn y counterFormat funcionan como los de un tipo de recurso: '{h1}.{n}' con resetOn: 'h1' numera (2.1), (2.2)… por capítulo, y '{h1}.{h2}.{n}' con 'h2', por sección. format es el número tal como lo imprimen la fórmula y \eqref, con {n} en el lugar del número: '[{n}]' compone [3]. enabled: false no numera nada: un \label se descarta y una referencia a él imprime su página. Un token admite también un estilo tras dos puntos ('{h1:A}.{n}': (A.1) en un apéndice con letra). |
math: {
enabled: true,
fontSizeScale: 1.0,
color: { hex: '#295AA3', model: 'hex' },
marginTop: { value: 1, unit: 'em' },
marginBottom: { value: 1, unit: 'em' },
}Tamaño de las fórmulas, cambia en postext 1.5. MathJax da la caja de cada fórmula en ex, y un ex de su fuente TeX mide 0,442 em. Hasta postext 1.4 el motor lo tomaba por medio em, así que cada fórmula se componía en torno a un 13 % más grande que bodyText.fontSize × fontSizeScale. Ahora las fórmulas salen del tamaño documentado, y las líneas y páginas con matemáticas se recomponen. Una configuración escrita en código para la 1.4 conserva el tamaño de sus fórmulas de la 1.4 si pasa por pinLegacyMathSize, de postext/bundle, una sola vez y tal como está escrita:
import { pinLegacyMathSize } from 'postext/bundle';
config = pinLegacyMathSize(config); // fórmulas, y el espacio alrededor de las fórmulas en bloque, como las componía la 1.4Hay otros cambios de reglas en la 1.5 que también pueden mover sus páginas: los saltos de los encabezados, el espacio en torno a una figura en línea (en el texto corrido y en los recuadros), las marcas en línea de sus encabezados, el tamaño de sus letras capitales, el sitio que se deja bajo una línea de dos puntos para la lista que introduce, las líneas que deja de un párrafo o de un elemento de lista el corte de una caja, los cortes de línea tras una raya, la composición del texto en bandera, la división de un párrafo bajo un encabezado, los cortes de línea tras el guion de un compuesto y el espacio bajo un contenedor :::paragraphs. migrateConfig, aplicada una sola vez con el markdown que compone la configuración, fija los que ese texto necesita, también el tamaño de las fórmulas (ver Paquetes escritos por postext 1.4 o anterior):
import { migrateConfig } from 'postext/bundle';
config = migrateConfig(config, undefined, { content: markdown }); // saltos de encabezado, fórmulas, huecos en línea, marcas de los encabezados, capitales, dos puntos, cortes de las cajas, rayas, compuestos, texto en bandera, divisiones bajo un encabezado y espacio bajo los contenedores como los componía la 1.4Así se evita lo que moverían esos cambios de reglas, pero no se conservan todas las páginas de la 1.4. La 1.5 corrige además errores de composición, y una corrección no tiene fijación: una configuración antigua la recibe igual que una nueva, así que una página a la que afecte aún puede moverse. Entre ellas: un encabezado a toda la página sin diseño propio se mide a lo ancho de la página y se compone con el interlineado de su nivel; en un diseño de encabezado no se reserva nada bajo la línea base de una letra capital; una capital toma el color de la paleta de la sección y se compone también en un texto de diseño cuyo overflow no es 'wrap', que entonces pasa de línea; un párrafo dentro de una caja pinta el tracking con el que se midió; una caja partida conserva la columna del icono en cada fragmento; una línea de una caja que estiraría sus espacios más de 3× se compone en bandera, como en el texto corrido; la palanca de los párrafos flojos nunca deja una línea justificada más ancha de lo que permite maxWordSpacing; una caja flotante conserva un marginBottom (en una banda superior) o un marginTop (en una banda inferior) mayor que el hueco de los flotantes; un texto de diseño centrado o alineado a la derecha con tracking (un titulillo, el título de una apertura) se coloca por sus letras, sin el tracking que sigue a la última; bajo una apertura a toda la página, el texto que abre la segunda columna empieza donde empezaría el texto justo debajo de la apertura, también cuando a la apertura le sigue un encabezado; la línea de puntos del índice se detiene antes del número de página en una fuente cuyo kerning separa una serie de puntos; un titulillo lee el encabezado tal como está escrito, sin espacio donde una de sus líneas termina tras un guion o una raya o dentro de una palabra cortada por su ancho (MEDIOAMBIENTALES, no MEDIOAMBIENTALE S), y el {titleText} del diseño de un encabezado lo lee igual (thousand-colour, no thousand- colour); un texto anclado al pie o al centro de la franja de un diseño de encabezado mantiene la franja lo bastante alta para contenerlo, así que ya no sube sobre el texto que precede al encabezado; una palabra más ancha que su línea, cortada junto a un guion que ya lleva, se corta detrás de ese guion y no recibe otro; el elemento que sigue a una lista anidada en otra toma el itemSpacing de su propia lista, no el de la anidada; y el resto de una palabra cortada por ser más ancha que su línea conserva sus propios puntos de corte, de modo que una dirección web sigue cortándose por sus junturas y un compuesto por sus guiones en lugar de por las sílabas del diccionario.
pinLegacyMathSize multiplica la escala por 1,1312 (0,5 ÷ 0,442) y divide por el mismo factor los márgenes de las fórmulas en bloque en em. La escala sola no basta en un libro con fórmulas en bloque: sus márgenes son medidas del tamaño de la propia fórmula, así que crecerían el mismo 13 % y empujarían hacia abajo el texto que las sigue. Escritos para los márgenes por defecto, los tres valores son:
math: {
fontSizeScale: 1.131,
marginTop: { value: 0.7072, unit: 'em' },
marginBottom: { value: 0.7072, unit: 'em' },
} // fórmulas tan grandes como las componía la 1.4, con el espacio que les dejaba alrededorDonde la configuración estaba guardada, el motor puede saberlo y lo hace por ti: openBundle / readBundle con un paquete .postext escrito antes de la 1.5 (ver Paquetes escritos por postext 1.4 o anterior), y el Sandbox con los libros, la configuración de trabajo y los archivos postext-config.json que guardó entonces (ver Sandbox → Persistencia). Se leen a través de migrateConfig, que fija el tamaño (pinLegacyMathSize): fontSizeScale pasa a ser la escala guardada (1 si no había) × 1,1312, y un margen de las fórmulas en bloque en em o rem — una medida del tamaño de la propia fórmula — se divide por el mismo factor, de modo que el espacio alrededor de una fórmula en bloque queda como lo dejaba la 1.4 (los 0,8 em por defecto pasan a 0,7072 em). Un margen en una unidad de página (pt, mm…) se queda como está, y también una configuración con enabled: false o una cuyo libro no tiene ningún $. El libro antiguo se compone entonces como lo componía la 1.4, y su sección math muestra el tamaño con el que se compone. Para componer ese libro al tamaño actual, restablece esos valores: Fórmulas → Escala de tamaño, Margen superior de las fórmulas en bloque y Margen inferior de las fórmulas en bloque en el Sandbox, o en código:
math: { ...config.math, fontSizeScale: 1, marginTop: undefined, marginBottom: undefined } // tamaño y márgenes actualesEcuaciones numeradas. Una fórmula en bloque con número ocupa toda su medida (la columna, o el ancho interior del recuadro que la contiene): la ecuación va centrada y su número alineado a la derecha, en la línea de la ecuación, en cada fila numerada de un align. El número sale de un \label{eq:x} (desde postext 1.19): las fórmulas con etiqueta, y las filas con etiqueta de un align, gather, alignat, flalign o eqnarray, se numeran en orden de lectura según equationNumbering, salvo que una fila diga \nonumber o \notag. Entornos como equation no se numeran por sí solos: una fórmula sin etiqueta no lleva número. \tag{…} imprime el texto que le des, entre paréntesis, y \tag*{…}, tal cual; ninguno de los dos cuenta, y un \label a su lado le da nombre. Una ecuación numerada más ancha que su medida desborda por la derecha, como cualquier fórmula en bloque. (Hasta postext 1.4, una fórmula con \tag no llegaba a dibujarse; hasta la 1.18, solo \tag numeraba una fórmula.)
\eqref{eq:x} en el texto imprime el número en su format, (3), y \ref{eq:x}, el número solo; lo mismo hacen :ref{id="eq:x"} y @eq:x (ver Referencias cruzadas), y dentro de una fórmula \eqref lo imprime como texto. En un libro compuesto capítulo a capítulo, el contador sigue desde el capítulo anterior: continuationAfter lo lleva en LayoutContinuation.statementCounters (equation), y el esquema del libro da a cada etiqueta su número (OutlineEntry.numberLabel), de modo que una referencia a una ecuación de otro capítulo lo imprime.
math: {
equationNumbering: { numberingTemplate: '{h1}.{n}', resetOn: 'h1' }, // (1.1), (1.2)… (2.1)
}El resolver y el stripper siguen el mismo patrón que las otras secciones:
import {
DEFAULT_MATH_CONFIG,
resolveMathConfig,
stripMathDefaults,
} from 'postext';
const resolved = resolveMathConfig(config.math);
const minimal = stripMathDefaults(config.math);#Arrancar el motor de fórmulas
MathJax se carga bajo demanda, no con el resto del motor. Cuando compones en el hilo principal, arráncalo antes de construir un documento con fórmulas:
import { buildDocument, initMathEngine, renderPage } from 'postext';
await initMathEngine(); // carga MathJax una vez; las llamadas siguientes se resuelven al instante
const doc = buildDocument({ markdown: 'Euler: $e^{i\\pi}+1=0$.' }, config);
document.body.append(renderPage(doc.pages[0], doc));- Hasta que el motor arranca, las fórmulas son provisionales. Cada una se compone como una caja gris de tamaño estimado. Si un documento con fórmulas se compone sin haber llamado nunca a
initMathEngine(), la consola muestra un aviso, una sola vez. - El worker de composición lo arranca por ti. Un build en
postext/workerllama ainitMathEngine()por su cuenta cuando el markdown contiene un$. - Componer ya, y otra vez cuando esté listo.
isMathReady()indica si el motor está en marcha.onMathReady(fn)llama afnen cuanto lo está (al instante si ya lo estaba) y devuelve una función que cancela la llamada. Un editor puede mostrar las cajas provisionales enseguida y volver a componer cuando llega MathJax; mientrasinitMathEngine()está en curso no se imprime ningún aviso. - Fallos.
initMathEngine()se rechaza si MathJax no puede cargarse, y una llamada posterior lo vuelve a intentar. - Con cualquier bundler, en Node o desde una CDN. MathJax viaja dentro del paquete como un único módulo preempaquetado (unos 1,8 MB sin comprimir, que solo descarga
initMathEngine). Elimport { initMathEngine } from 'https://esm.sh/postext'de siempre funciona; no hace falta?bundle. El paquetemathjax-fullsolo hace falta para compilar postext, así que instalar postext no lo instala. MathJax y el analizador mhchem que incluye tienen licencia Apache-2.0: sus avisos y el texto de la licencia viajan junto al módulo, endist/math/THIRD_PARTY_LICENSES.txt. - Un motor por página. El motor y su caché de fórmulas renderizadas son compartidos por todo lo que importa
postexten el mismo contexto de JavaScript (consulta Estado global compartido en una página).
Para la gramática del documento ($...$, $$...$$, cómo escapar un dólar literal), consulta Formato del documento.