Motor de maquetació de codi obert · v1.15.0

El tipògraf programable per al web

Postext parteix de markdown semàntic i aplica regles editorials amb segles d'història — justificació Knuth-Plass, columnes equilibrades, flotants que saben quin és el seu lloc — per produir pàgines de qualitat editorial en HTML, canvas o PDF a punt per a impremta.

Cada pàgina es calcula al teu navegador

Postext

En poques paraules

Postext és un programa lliure i gratuït que compon les pàgines de llibres, revistes i informes. Escrius el text amb unes quantes marques senzilles i Postext el converteix en pàgines acabades, com les d'un llibre imprès. Segueix regles que els impressors fan servir des de fa segles, perquè el text es llegeixi bé. Les pàgines poden anar a un web, a una aplicació o a un PDF a punt per a impremta. Està pensat per a qui escriu, edita, dissenya o programa.

Transcripció

Tot el que diu el narrador, amb una descripció del que apareix a la pantalla.

  1. 0:00

    A la pantallaSobre fons fosc, «MAGÚNCIA · 1455» damunt d'un filet daurat. Darrere del titular «Durant cinc segles, la impremta va aprendre a compondre la pàgina.», l'any avança de 1455 a 2026 en grans xifres perfilades i al voltant cauen termes de l'ofici: Justificació, Kerning, Vídues, òrfenes, Columnes equilibrades, Interlineat, Retícula de base, par·ti·ció, Mesura, Flotants, Capçaleres, Rius. La càmera s'endinsa en el punt final, que omple la pantalla de daurat.

    NarracióDurant cinc segles, la impremta va aprendre a compondre la pàgina.

  2. 0:06

    A la pantallaTitular: «La web va aprendre a maquetar interfícies. Mai no va aprendre a compondre una pàgina.» Una finestra de navegador a example.com/longform/article mostra un article justificat a tres columnes, «Per què falla la web»; unes etiquetes vermelles assenyalen rius de blanc, una òrfena, una vídua, una imatge que cau sobre el text i una última columna desequilibrada. Al costat, una pastilla de codi diu «column-count: 3;», seguida de «…i poca cosa més.» i d'una llista ratllada amb els mateixos cinc defectes. La finestra es distorsiona i s'esfondra.

    NarracióLa web va aprendre a maquetar interfícies. Mai pàgines. Per això el text llarg encara es trenca: rius, vídues, òrfenes, col·lisions.

  3. 0:19

    A la pantallaDesprés d'un esclat blanc i una escombrada de franges blava, daurada i vermella, el logotip de Postext puja al seu lloc amb el lema «El tipògraf programable per a la web». A sota: CODI OBERT · LLICÈNCIA MIT · v1.7.0 · FUNCIONA AL TEU NAVEGADOR.

    NarracióAixò és Postext: el tipògraf programable per a la web.

  4. 0:25

    A la pantallaSecció 01 de 07, «Entra el contingut»: «El Markdown diu què és cada cosa.» Un fitxer Markdown, 03-por-que-postext.md, s'escriu sol: una directiva de part, el títol «Per què Postext» amb entradeta, un paràgraf que cita la figura fig-flow amb :ref, una línia ::resource i un bloc :::callout. Al costat, config.ts crida buildDocument amb maquetació a dues columnes, text justificat i partició de mots per a «es», sota la frase «La configuració decideix com es veu. El text no conté ni una sola decisió de maquetació.»

    NarracióEscrius Markdown semàntic, que diu què és cada cosa. La configuració decideix com es veu.

  5. 0:33

    A la pantallaSecció 02, «Pretext mesura»: «Mesurat sense tocar el DOM.» Un títol, un paràgraf i un requadre s'escanegen l'un rere l'altre i unes cotes en donen l'alçada en punts; un tauler de codi mostra prepare(text, '25px Lora') i layout(prepared, width, 38), que retorna una alçada i un nombre de línies. Dues barres competeixen amb 10.000 paràgrafs: «Reflow del navegador · DOM» amb prou feines avança i «Pretext · canvas + aritmètica» s'omple a l'instant, i un comptador puja fins a 600× sobre «més ràpid que el DOM mesurant text, perquè un llibre sencer es recompongui mentre escrius» i «Impulsat per @chenglou/pretext».

    NarracióCada paràgraf es mesura sense tocar el DOM, fins a sis-centes vegades més de pressa, gràcies a Pretext, la biblioteca que ho ha fet possible.

  6. 0:43

    A la pantallaSecció 03, «Postext decideix»: «Cada línia col·locada abans de pintar un píxel.» Un anell de set segments s'il·lumina per torns, Estructura, Mesura, Col·locació, Flotants, Refinament, Equilibri i Ritme, cadascun amb una línia d'explicació, mentre al costat es munta una pàgina a dues columnes de la guia de Postext: els blocs etiquetats volen a les seves columnes, una figura es desplaça al seu lloc amb la nota «:ref{id="fig-flow"} → peu de columna», cau la banda d'obertura, apareixen les línies, les columnes s'anivellen i baixa la retícula de base. L'anell recorre les iteracions 1 a 3 i mostra «Estable en 3 iteracions» amb una marca; un requadre dona la caixa i la línia de base d'una línia.

    NarracióDesprés, Postext decideix. Set passades col·loquen cada línia, porten cada figura al seu lloc i equilibren les columnes, fins que res no es mou.

  7. 0:55

    A la pantallaSecció 04, «El document virtual»: «Canvia una paraula. Només es recompon allò que canvia.», amb la nota «Com el virtual DOM de React, però per a pàgines: el VDT, un arbre de document virtual.» Set pàgines, de la p. 7 a la p. 13, en fila; un cursor marca una edició a la p. 11, la resta d'aquella columna es torna daurada com a BRUT i una franja passa a la p. 12, que rep una marca i ESTABLE, mentre les anteriors diuen ES SALTA i les següents INTACTA. Tres vinyetes expliquen la regla i un tauler titulat renderToHtmlIndexed() marca com a APEDAÇAT els nodes de l'arbre que han canviat.

    NarracióTot viu en un document virtual, com el virtual DOM de React. Canvies una paraula, i només es recompon allò que canvia.

  8. 1:05

    A la pantalla«Un document llarg? Només es pinta el que hi ha a la pantalla.» Una columna de pàgines passa per un marc daurat retolat VIEWPORT, amb un marge de 200 píxels a dalt i a baix: les pàgines de dins es dibuixen senceres i les de fora són contorns discontinus. Un comptador gran indica quantes de les 48 pàgines estan pintades en cada moment (IntersectionObserver · +200 px), al costat de «Geometria: totes les pàgines. Píxels: només el que veus.»

    NarracióI en un llibre llarg, només es pinten les pàgines que són a la pantalla.

  9. 1:12

    A la pantallaSecció 05, «Justificació Knuth–Plass»: «Totes les maneres de tallar el paràgraf. Alhora.» A l'esquerra, un paràgraf sobre el tall de línies compost de manera voraç, com ho fa el navegador, amb les línies més obertes en vermell. A sota, cada paraula és un punt sobre una recta: arcs vermells per als talls voraços, arcs blaus tènues que proven tots els talls possibles i un camí daurat amb la millor combinació. A la dreta, la versió Knuth–Plass, d'espaiat uniforme, amb la lletjor de cada línia, la fórmula «(1 + lletjor + penalització)²» i una suma de demèrits menor.

    NarracióUn navegador talla les línies de manera voraç, una a una. Postext fa servir Knuth-Plass, l'algorisme de TeX: sospesa totes les maneres de tallar el paràgraf sencer i es queda amb la més uniforme.

  10. 1:27

    A la pantallaSecció 06, «Una maquetació, tres renderitzadors»: «El que veus és el que va a impremta.» Sota la línia de codi const vdt = buildDocument(content, config); una pàgina es divideix en tres. Canvas (renderToCanvas(), mapes de bits exactes al píxel) porta una lupa sobre la seva graella de píxels; HTML (renderToHtml(), seleccionable i adaptable) emmarca cada bloc amb la seva etiqueta <h1>, <p>, <figure>, etc.; en PDF (renderToPdf(), per a impremta, PDF/UA, CMYK) quatre planxes de color entren en registre i apareixen marques de tall i una tira de color.

    NarracióUna maquetació, tres renderitzadors: canvas, HTML i PDF per a impremta. El que veus és el que s'imprimeix.

  11. 1:38

    A la pantallaSecció 07, «Per què un estàndard obert»: «LaTeX va marcar el llistó del paper. Avui l'edició també viu a cada pantalla.» Dues targetes: LaTeX, 1984, amb creus al costat de «Pensat per a la pàgina impresa», «Lligat a les fonts i els paquets d'una màquina», «Compilar, esperar, repetir» i «Sense maquetació editorial a la web adaptable»; Postext, 2026, amb marques al costat de «Web, canvas i PDF d'impremta, una maquetació», «Un sol fitxer .postext ho porta tot», «Es recompon en directe mentre escrius» i «En qualsevol navegador · sense servidors · MIT». La targeta de Postext s'il·lumina.

    NarracióLaTeX va marcar l'estàndard del paper. Però avui l'edició viu a totes les pantalles.

  12. 1:46

    A la pantallaRètol «Un fitxer, el llibre sencer» i titular «Un estàndard obert per a l'edició, més enllà d'on arriba LaTeX». Una icona de fitxer .postext s'obre en cinc peces: preset.json (configuració i disseny), chapters/*.md (un Markdown per capítol), fonts/*.woff2 (les tipografies pròpies), images/ · SVG (cada imatge, inclosa) i resources (taules, figures i peus). Peu: «Un ZIP corrent: obert, documentat i amb llicència MIT. Qualsevol eina el pot llegir i escriure.»

    NarracióPostext és un estàndard obert: un únic fitxer portàtil, documentat i amb llicència MIT, que qualsevol eina pot llegir i escriure.

  13. 1:58

    A la pantalla«La mostra · composta pel motor real»: un mur de pàgines de l'edició espanyola de la guia s'allunya en perspectiva mentre un comptador arriba a 48 pàgines. Text: «12 capítols, 3 parts i una portada, maquetats en més o menys mig segon. Cada pàgina de la guia de Postext, calculada en un navegador per postext v1.7.0 per a aquesta peça. Res col·locat a mà.» Després, etiquetes: Llibres de text, Revistes, Edicions literàries, Catàlegs.

    NarracióPer això és capaç de maquetar llibres de centenars de pàgines en dècimes de segon.

  14. 2:06

    A la pantallaTancament: el logotip de Postext amb el lema «El tipògraf programable per a la web», l'adreça postext.dev, una línia de terminal que escriu «$ pnpm add postext» i el peu «Codi obert · MIT · github.com/drnachio/postext».

    NarracióPostext. Codi obert, a postext.dev.

Capítol 1 · Per què Postext

Maquetació editorial, calculada per al web

La tipografia impresa va passar cinc segles aprenent a compondre una pàgina; els navegadors van aprendre a maquetar una interfície. Postext porta el primer al segon.

CSS ofereix maquetació responsiva — flexbox, grid, columnes. Però no sap equilibrar columnes, mantenir un títol amb el seu paràgraf, evitar vídues i òrfenes ni portar una figura al capdamunt de la columna següent. Són decisions editorials, depurades durant segles d'impremta.

Postext cobreix aquest buit. Passa-li markdown semàntic i un objecte de configuració. Mesura text entre 300 i 600 vegades més de pressa que el DOM gràcies a @chenglou/pretext (s'obre en una pestanya nova), calcula la geometria completa de cada pàgina — cada línia, flotant i peu — i la renderitza mitjançant els backends d'HTML, canvas o PDF a punt per a impremta.

Entra markdown

:::part{number="I" title="Fonaments"
  palette="band=#2b4acb"}
:::

# Per què Postext {lead="La tipografia
impresa va passar cinc segles…"}

Postext és un **motor de maquetació
de codi obert** que porta al web
l'ofici de la tipografia impresa,
com mostra :ref{id="fig-flux"}.

:::callout{type="try"}
Canvia una paraula: la pàgina
es torna a compondre.
:::

Surten pàgines

Figura 1.1 El mateix markdown, abans i després del motor: una obertura de capítol, dues columnes equilibrades i una figura portada al capdamunt d'una columna.

En xifres

més ràpid que el DOM en mesurar text: un llibre sencer es recompon mentre escrius
300–600×més ràpid que el DOM en mesurar text: un llibre sencer es recompon mentre escrius
sortides d'una sola maquetació: HTML, canvas, PDF a punt per a impremta i EPUB 3
4sortides d'una sola maquetació: HTML, canvas, PDF a punt per a impremta i EPUB 3
PDF etiquetat i accessible, amb marcadors i color CMYK
PDF/UAPDF etiquetat i accessible, amb marcadors i color CMYK
servidors: el motor funciona íntegrament al navegador, amb llicència MIT
0servidors: el motor funciona íntegrament al navegador, amb llicència MIT

Capítol 2 · Capacitats

El que els tipògrafs sempre han sabut

Sis coses que una pàgina necessita i que CSS mai no es va dissenyar per decidir — calculades pel motor, igual cada vegada.

  1. 2.1

    Justificació Knuth-Plass

    El mateix algorisme òptim de partició de línies que fa servir TeX, amb partició de mots per patrons de TeX i control d'òrfenes — blocs de text homogenis sense rius de blanc, més enllà del que CSS pot expressar.

    Llegir a la documentació
  2. 2.2

    Recursos i referències creuades

    Figures, diagrames SVG i taules que floten a l'inici o al final de columnes i pàgines — com els flotants a impremta — amb numeració tipada i referències :ref que sempre es mantenen sincronitzades.

    Llegir a la documentació
  3. 2.3

    Taules i peus

    Taules amb tipografia independent per al cos i la capçalera, dividides entre pàgines amb la capçalera repetida, i peus que segueixen la teva configuració — numerats i col·locats al costat del recurs que descriuen.

    Llegir a la documentació
  4. 2.4

    Diagrames a una tinta

    Recoloreja els diagrames SVG amb matisos d'una sola tinta segons la seva luminància, perquè cada il·lustració encaixi amb el teu disseny — a punt per a impressió amb tinta directa.

    Llegir a la documentació
  5. 2.5

    Matemàtiques en LaTeX

    Equacions en línia i en bloc escrites en LaTeX, mesurades i compostes pel motor perquè s'assentin a la retícula de base al costat del text.

    Llegir a la documentació
  6. 2.6

    Web, PDF per a impremta i EPUB

    Un motor de maquetació, quatre sortides. Les mateixes pàgines calculades es renderitzen a HTML, canvas o PDF a punt per a impremta — amb marcadors, color CMYK i PDF etiquetat i accessible (PDF/UA) — i surten com a llibre electrònic EPUB 3, pàgina a pàgina o amb maquetació fluida.

    Llegir a la documentació
Cada pàgina de la guia de Postext — coberta, índex, portadelles i tota la resta — la compon Postext, al teu navegador, mentre la llegeixes.
— Colofó de la guia inclosa

Aparador

Llibres de debò, compostos al teu navegador

Un llibre de text, una revista, un poema èpic anotat, un catàleg d'exposició, un clàssic xinès en 120 capítols, Les mil i una nits en àrab. Obre'ls al Sandbox, canvia una regla i mira com es recompon cada pàgina.

Capítol 3 · Flux de treball

Maquetació editorial en tres passos

El contingut en markdown, el disseny en un objecte de configuració i les pàgines en una sola crida.

  1. 3.1

    Escriu markdown semàntic

    Escriu el teu contingut en markdown enriquit: títols, llistes, taules, fórmules, requadres i referències :ref a les teves figures. Sense pensar en maquetació — només contingut.

  2. 3.2

    Configura les regles de maquetació

    Defineix la mida de pàgina, les columnes, la tipografia, el disseny dels títols, els titolets i la col·locació de flotants en un objecte PostextConfig — o dissenya-ho visualment al Sandbox.

  3. 3.3

    Renderitza a HTML, canvas o PDF

    Crida buildDocument i obtén la geometria completa de la maquetació — i renderitza-la amb el backend d'HTML, canvas o PDF a punt per a impremta.

API

Una funció, control total

Crida buildDocument amb el teu contingut i un objecte de configuració. Reps la geometria completa de les pàgines: dibuixa qualsevol pàgina com a imatge amb renderPage o compon el llibre sencer com a PDF a punt per a impremta amb renderToPdf.

book.ts
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";

const doc = buildDocument(
  { markdown },
  {
    page: { sizePreset: "21x28" },
    layout: { layoutType: "double" },
    bodyText: {
      fontSize: { value: 12, unit: "pt" },
      textAlign: "justify",
      hyphenation: { enabled: true, locale: "en-us" },
    },
  }
);

// Cada pàgina, com a imatge…
const cover = renderPage(doc.pages[0], doc);
cover.toBlob((png) => save(png, "cover.png"));

// …o el llibre sencer, com a PDF a punt per a impremta
// fontProvider: bytes TTF per família i pes (vegeu la documentació)
const pdf = await renderToPdf(doc, { fontProvider });

Capítol 4 · Format obert

Un fitxer, el llibre sencer

Un fitxer .postext porta tot el que un document necessita per tornar-se a compondre en qualsevol màquina: un format obert i editable que qualsevol pot adoptar.

La majoria dels formats editorials dispersen un projecte. Una compilació de LaTeX depèn de les fonts i els paquets instal·lats en una màquina, i els fitxers nadius dels grans editors de maquetació enllacen imatges i tipografies que en queden fora. En moure el projecte, alguna cosa es perd. Nosaltres mateixos vam topar amb aquests límits a LaTeX.

Un .postext és un fitxer ZIP corrent que qualsevol pot obrir, llegir i editar: un manifest JSON, un fitxer Markdown per capítol i els mateixos fitxers de fonts i imatges. El Sandbox l'exporta, l'skill d'agent postext-port l'escriu i postext/bundle l'obre en qualsevol programa per compondre de nou les mateixes pàgines. El format està documentat i té llicència MIT, a punt perquè qualsevol eina el llegeixi i l'escrigui.

Dins de postext-guide.postext
  1. 4.1preset.json

    Configuració. Pàgina, retícula, tipografies, estils de títols i paràgrafs, colors i titolets, en JSON llegible.

  2. 4.2chapters/<lang>/*.md

    Capítols. Un fitxer Markdown per capítol: aquí, 14 capítols en 2 llengües.

  3. 4.3fonts/*.woff2

    Tipografies. Els mateixos fitxers de fonts, no només els seus noms: 18 fitxers de Lora, Fraunces, Geist i Bricolage Grotesque.

  4. 4.4preset.json › resources

    Recursos. Peus, numeració, col·locació i contingut de les 23 figures i taules a què remet el text.

  5. 4.5resources/*.svg

    Imatges. Les mateixes il·lustracions, SVG o mapa de bits, amb la versió de cada llengua: 32 fitxers.

Figura 4.1 El .postext de la guia, 511 KB: tot el que el llibre necessita i res que hagi d'anar a buscar.

Prova-ho

Obre la guia, obtén-ne les pàgines

El primer exemple del Sandbox, la guia de Postext, és un únic fitxer .postext. Obre'l al navegador i converteix cada pàgina en una imatge: les tipografies, figures i taules surten del mateix fitxer.

Baixar la guiapostext-guide.postext · 511 KB
open-guide.js
import { openBundle, loadBundleFonts, registerBundleImages,
  buildBundle, renderPageToCanvas } from "postext";

// La guia del Sandbox: configuració, capítols, fonts i imatges
const file = await fetch("postext-guide.postext").then((r) => r.blob());
const book = await openBundle(file, { locale: "en" });

await loadBundleFonts(book);      // les seves pròpies tipografies
await registerBundleImages(book); // les seves pròpies figures

// Cada pàgina de cada capítol, com a imatge
for (const doc of buildBundle(book))
  for (const page of doc.pages) {
    const canvas = document.createElement("canvas");
    renderPageToCanvas(page, doc, canvas, { scale: 0.5 });
    document.body.append(canvas);
  }

Instal·lació

Comença en menys d'un minut

Un paquet, sense servidor i sense dependències natives. Afegeix postext-pdf quan necessitis imprimir.

quick-start.ts
// Inici ràpid
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";

const doc = buildDocument({
  markdown: "# Hello World\n\nYour content here.",
});

// La primera pàgina, dibuixada en un canvas
document.body.append(renderPage(doc.pages[0], doc));

// El document sencer, com a PDF
const pdf = await renderToPdf(doc, { fontProvider });