Motor de layout de código aberto · v1.22.1
O compositor programável para a web
O Postext parte de markdown semântico e aplica regras editoriais com séculos de história (justificação Knuth-Plass, colunas equilibradas, flutuantes que sabem o seu lugar) para produzir páginas com qualidade editorial em HTML, canvas ou PDF pronto para impressão.
Cada página é calculada no seu navegador
Postext
Em poucas palavras
O Postext é um software livre e gratuito que diagrama as páginas de livros, revistas e relatórios. Você escreve o texto com algumas marcações simples, e o Postext o transforma em páginas prontas, como as de um livro impresso. Ele segue regras que os impressores usam há séculos, para que o texto seja fácil de ler. As páginas podem ir para um site, para um aplicativo ou para um PDF pronto para a gráfica. Foi feito para quem escreve, edita, projeta ou programa.
Transcrição
Tudo o que o narrador diz, com uma descrição do que aparece na tela.
- 0:00
Na telaSobre fundo escuro, “MOGÚNCIA · 1455” acima de um fio dourado. Atrás da manchete “Durante cinco séculos, a imprensa aprendeu a compor a página.”, o ano avança de 1455 a 2026 em grandes algarismos vazados, e termos do ofício vão caindo em volta: Justificação, Kerning, Viúvas, órfãs, Colunas equilibradas, Entrelinha, Grade de base, hi·fe·ni·za·ção, Medida, Flutuantes, Cabeços, Rios. A câmera entra no ponto final, que enche a tela de dourado.
NarraçãoDurante cinco séculos, a imprensa aprendeu a compor a página.
- 0:06
Na telaManchete: “A web aprendeu a diagramar interfaces. Nunca aprendeu a compor uma página.” Uma janela de navegador em example.com/longform/article mostra um artigo justificado em três colunas, “Por que a web falha”; etiquetas vermelhas apontam rios de branco, uma órfã, uma viúva, uma imagem que cai sobre o texto e uma última coluna desequilibrada. Ao lado, um chip de código diz “column-count: 3;”, seguido de “…e pouco mais.” e de uma lista riscada com os mesmos cinco defeitos: Rios de branco, Órfãs, Viúvas, Colisões, Colunas desequilibradas. A janela se distorce e desaba.
NarraçãoA web aprendeu a diagramar as interfaces. Nunca as páginas. Por isso o texto longo continua se quebrando: rios, viúvas, órfãs, colisões.
- 0:20
Na telaDepois de um clarão branco e de uma varredura de faixas azul, dourada e vermelha, o logotipo do Postext sobe até o seu lugar com o lema “O tipógrafo programável para a web”. Embaixo: CÓDIGO ABERTO · LICENÇA MIT · v1.20.3 · FUNCIONA NO SEU NAVEGADOR.
NarraçãoEste é o Postext: o tipógrafo programável para a web.
- 0:26
Na telaSeção 01 de 07, “Entra o conteúdo”: “O Markdown diz o que é cada coisa.” Um arquivo Markdown, 03-por-que-postext.md, se digita sozinho: uma diretiva de parte, o título “Por que Postext” com um lead, um parágrafo que cita a figura fig-flow com :ref, uma linha ::resource e um bloco :::callout. Ao lado, config.ts chama buildDocument com diagramação em duas colunas, texto justificado e hifenização para “pt-BR”, sob a frase “A configuração decide como fica. O texto não contém nenhuma decisão de diagramação.”
NarraçãoVocê escreve Markdown semântico, que diz o que é cada coisa. A configuração decide como fica.
- 0:34
Na telaSeção 02, “O Pretext mede”: “Medido sem tocar no DOM.” Um título, um parágrafo e um boxe são escaneados um depois do outro, e linhas de cota dão a altura de cada um em pontos; um painel de código mostra prepare(text, '25px Lora') e layout(prepared, width, 38), que devolve uma altura e um número de linhas. Duas barras disputam 10.000 parágrafos: “Reflow do navegador · DOM” mal sai do lugar e “Pretext · canvas + aritmética” se enche na hora, e um contador sobe até 600× acima de “mais rápido que o DOM para medir texto, para que um livro inteiro se recomponha enquanto você digita” e “Baseado em @chenglou/pretext”.
NarraçãoCada parágrafo se mede sem tocar o DOM, até seiscentas vezes mais rápido, graças ao Pretext, a biblioteca que o tornou possível.
- 0:44
Na telaSeção 03, “O Postext decide”: “Cada linha no lugar antes de pintar um pixel.” Um anel de sete segmentos se acende por turnos, Estrutura, Medição, Disposição, Flutuantes, Refino, Equilíbrio e Ritmo, cada um com uma linha de explicação, enquanto ao lado se monta uma página em duas colunas do guia do Postext: os blocos etiquetados voam para as suas colunas, uma figura desliza até o lugar com a nota “:ref{id="fig-flow"} → pé da coluna”, a faixa de abertura desce, as linhas aparecem, as colunas se nivelam e a grade de base desce pela página. O anel percorre as iterações 1 a 3 e mostra “Estável em 3 iterações” com um visto; um boxe dá a caixa e a linha de base de uma linha.
NarraçãoDepois, o Postext decide. Sete passadas posicionam cada linha, levam cada figura ao seu lugar e equilibram as colunas, até que nada se mova.
- 0:57
Na telaSeção 04, “O documento virtual”: “Mude uma palavra. Só se recompõe o que muda.”, com a nota “Como o virtual DOM do React, mas para páginas: o VDT, uma árvore de documento virtual.” Sete páginas, da p. 7 à p. 13, em fila; um cursor marca uma edição na p. 11, o resto dessa coluna fica dourado como SUJO e uma faixa passa para a p. 12, que recebe um visto e ESTÁVEL, enquanto as anteriores dizem PULADA e as seguintes INTACTA. Três marcadores explicam a regra, e um painel com o título renderToHtmlIndexed() marca como ATUALIZADO os nós da árvore que mudaram.
NarraçãoTudo vive num documento virtual, como o virtual DOM do React. Você muda uma palavra, e só o que mudou é recomposto.
- 1:07
Na tela“Um documento longo? Só se pinta o que está na tela.” Uma coluna de páginas passa por uma moldura dourada chamada VIEWPORT, com uma margem de 200 pixels acima e abaixo: as páginas de dentro são desenhadas inteiras e as de fora são contornos tracejados. Um contador grande indica quantas das 51 páginas estão pintadas a cada momento (IntersectionObserver · +200 px), ao lado de “Geometria: todas as páginas. Pixels: só o que você vê.”
NarraçãoE num livro longo, só são pintadas as páginas que estão visíveis na tela.
- 1:14
Na telaSeção 05, “Justificação Knuth–Plass”: “Todas as formas de quebrar o parágrafo. Ao mesmo tempo.” À esquerda, sob “Gulosa · o navegador”, um parágrafo sobre a quebra de linhas é composto de forma gulosa, como faz o navegador, com as linhas mais frouxas em vermelho. Embaixo, cada palavra é um ponto sobre uma reta: arcos vermelhos para as quebras gulosas, arcos azuis tênues que testam todas as quebras possíveis e um caminho dourado com a melhor combinação. À direita, a versão “Knuth–Plass · Postext”, de espaçamento uniforme, com os deméritos de cada linha, a fórmula “(1 + feiura + penalidade)²” e uma soma de deméritos menor.
NarraçãoUm navegador quebra as linhas de forma gulosa, uma a uma. O Postext usa Knuth-Plass, o algoritmo do TeX: pesa todas as formas de quebrar o parágrafo inteiro e fica com a mais uniforme.
- 1:29
Na telaSeção 06, “Uma diagramação, cinco saídas”: “O que você vê é o que vai para a gráfica.” Sob a linha de código const vdt = buildDocument(content, config); uma página se divide em cinco. Canvas (renderToCanvas(), bitmaps exatos ao pixel) ganha uma lupa sobre a sua grade de pixels; HTML (renderToHtml(), selecionável e responsivo) contorna cada bloco com a sua etiqueta <h1>, <p>, <figure> etc.; em PDF (renderToPdf(), para impressão, PDF/UA, CMYK) quatro chapas de cor entram em registro e aparecem marcas de corte e uma barra de cor. Em EPUB 3 (renderToEpub(), livro digital, fixo ou refluível) a página aparece num leitor de livros digitais com a etiqueta “Layout fixo”; a tela se estreita até o tamanho de um celular, o texto se redistribui e a etiqueta passa a “Refluível”. Em Folio (postext-folio, um livro em 3D que vira as páginas) a página se abre numa página dupla e uma folha gira sobre a lombada.
NarraçãoUma diagramação, cinco saídas: canvas, HTML, PDF para impressão, EPUB 3, fixo ou refluível, e um livro em 3D. O que você vê é o que vai para a gráfica.
- 1:45
Na telaSeção 07, “Por que um padrão aberto”: “LaTeX definiu o padrão do papel. Hoje a edição vive também em cada tela.” Dois cartões: LaTeX, 1984, com xis ao lado de “Pensado para a página impressa”, “Preso às fontes e pacotes de uma máquina”, “Compilar, esperar, repetir” e “Sem diagramação editorial na web responsiva”; Postext, 2026, com vistos ao lado de “Web, PDF para gráfica e EPUB 3, uma diagramação”, “Um só arquivo .postext leva tudo”, “Recompõe ao vivo enquanto você digita” e “Em qualquer navegador · sem servidores · MIT”. O cartão do Postext se acende.
NarraçãoO LaTeX definiu o padrão do papel. Mas hoje a edição vive em todas as telas.
- 1:52
Na telaChamada “Um arquivo, o livro inteiro” e manchete “Um padrão aberto para a edição, além de onde o LaTeX chega.” Um ícone de arquivo .postext se abre em cinco peças: preset.json (configuração e design), chapters/*.md (um Markdown por capítulo), fonts/*.woff2 (as próprias fontes), images/ · SVG (cada imagem, incluída) e resources (tabelas, figuras e legendas). Rodapé: “Um ZIP comum: aberto, documentado e com licença MIT. Qualquer ferramenta pode lê-lo e escrevê-lo.”
NarraçãoO Postext é um padrão aberto: um único arquivo portátil, documentado e com licença MIT, que qualquer ferramenta pode ler e escrever.
- 2:03
Na tela“A amostra · composta pelo motor real”: um mural de páginas da edição brasileira do guia se afasta em perspectiva enquanto um contador chega a 51 páginas. Texto: “11 capítulos, 3 partes e as capas, diagramados em cerca de meio segundo. Cada página do guia do Postext, calculada em um navegador pelo postext v1.20.3 para esta peça. Nada posto à mão.” Depois, as etiquetas Livros didáticos, Revistas, Edições literárias, Catálogos.
NarraçãoPor isso ele consegue diagramar livros de centenas de páginas em décimos de segundo.
- 2:10
Na telaFechamento: o logotipo do Postext com o lema “O tipógrafo programável para a web”, o endereço postext.dev, uma linha de terminal que digita “$ pnpm add postext” e o rodapé “Código aberto · MIT · github.com/drnachio/postext”.
NarraçãoPostext. Código aberto, em postext.dev.
Capítulo 1 · Por que o Postext
Diagramação editorial, calculada para a web
A tipografia impressa passou cinco séculos aprendendo a compor uma página; os navegadores aprenderam a dispor uma interface. O Postext leva esse saber da página impressa para o navegador.
O CSS oferece layout responsivo (flexbox, grid, colunas), mas não sabe equilibrar colunas, manter um título junto ao seu parágrafo, evitar viúvas e órfãs nem levar uma figura ao topo da coluna seguinte. São decisões editoriais, refinadas ao longo de séculos de impressão.
O Postext preenche essa lacuna. Você fornece markdown semântico e um objeto de configuração. Ele mede o texto de 300 a 600 vezes mais rápido que o DOM usando @chenglou/pretext (abre em uma nova aba), depois calcula a geometria completa da página (cada linha, flutuante e legenda) e a renderiza pelos renderizadores de HTML, canvas ou PDF pronto para impressão.
Entra markdown
:::part{number="I" title="Fundamentos"
palette="band=#2b4acb"}
:::
# Por que Postext {lead="A tipografia
impressa passou cinco séculos…"}
O Postext é um **motor de layout
de código aberto** que leva à web
o ofício da tipografia impressa,
como mostra :ref{id="fig-fluxo"}.
:::callout{type="try"}
Mude uma palavra: a página
se compõe de novo.
:::Saem páginas
Em números
- mais rápido que o DOM para medir texto, de modo que um livro inteiro se recompõe enquanto você digita
- 300–600×mais rápido que o DOM para medir texto, de modo que um livro inteiro se recompõe enquanto você digita
- saídas a partir de uma única diagramação: HTML, canvas, PDF pronto para impressão e EPUB 3
- 4saídas a partir de uma única diagramação: HTML, canvas, PDF pronto para impressão e EPUB 3
- PDF etiquetado e acessível, com marcadores e cor CMYK
- PDF/UAPDF etiquetado e acessível, com marcadores e cor CMYK
- servidores: o motor roda inteiramente no navegador, sob licença MIT
- 0servidores: o motor roda inteiramente no navegador, sob licença MIT
Capítulo 2 · Capacidades
O que os tipógrafos sempre souberam
Seis coisas de que uma página precisa e que o CSS nunca foi feito para decidir, calculadas pelo motor sempre da mesma maneira.
- 2.1
Justificação Knuth-Plass
O mesmo algoritmo ótimo de quebra de linhas que o TeX usa, com hifenização por padrões do TeX e controle de órfãs: blocos de texto uniformes, sem rios de branco, além do que o CSS consegue expressar.
Ler na documentação - 2.2
Recursos e referências cruzadas
Figuras, diagramas SVG e tabelas flutuam para o topo ou o pé de colunas e páginas, como os flutuantes na impressão, com numeração por tipo e referências cruzadas :ref sempre sincronizadas.
Ler na documentação - 2.3
Tabelas e legendas
Tabelas com tipografia independente para o corpo e o cabeçalho, divididas entre páginas com o cabeçalho repetido, e legendas que seguem a sua configuração, numeradas e posicionadas junto ao recurso que descrevem.
Ler na documentação - 2.4
Diagramas em uma só tinta
Recolore diagramas SVG em tons de uma única tinta segundo a luminância, para que cada ilustração combine com o seu design e fique pronta para impressão em cor especial.
Ler na documentação - 2.5
Matemática em LaTeX
Equações no texto e em destaque escritas em LaTeX, medidas e compostas pelo motor para assentar na grade de linhas de base junto ao texto.
Ler na documentação - 2.6
Web, PDF pronto para impressão e EPUB
Um motor de layout, quatro saídas. As mesmas páginas calculadas são renderizadas em HTML, canvas ou PDF pronto para impressão (com marcadores, cor CMYK e saída PDF/UA etiquetada e acessível) e saem como e-book EPUB 3, página a página ou refluível.
Ler na documentação
Cada página do guia do Postext (capa, sumário, aberturas de parte e tudo mais) é composta pelo Postext, no seu navegador, enquanto você lê.
Vitrine
Livros de verdade, compostos no seu navegador
Um livro didático, uma revista, um poema épico anotado, um catálogo de exposição, um clássico chinês em 120 capítulos, As mil e uma noites em árabe, um romance japonês composto na vertical, um quadrinho em sete idiomas. Abra qualquer um deles no Sandbox, mude uma regra e veja todas as páginas se recomporem.
- Motor de layout de código abertoPostextCada página é calculada no seu navegador
O guia do Postext
O guia incluído: 13 capítulos, três partes e uma capa

Bioquímica Feduchi · Capítulo 1
Livro didático de bioquímica em coluna e meia: a coluna principal junto à lombada e uma coluna externa com figuras, conceitos-chave e atividades

Céu profundo
Revista de astronomia em duas colunas com aberturas sangradas, boxes e olhos

Dom Quixote · Gustave Doré
Edição literária em coluna e meia com glosas na margem e as pranchas de Doré

Física (OpenStax)
Livro didático em coluna e meia com exemplos resolvidos, verificações, tabelas e fórmulas

O paraíso perdido · Gustave Doré
Edição anotada do poema de Milton em doze livros: as notas de Verity no pé da página e as cinquenta pranchas de Doré. Somente em inglês

Pintura espanhola
Catálogo de exposição em uma coluna, com verbete e comentário diante da prancha de página inteira

Sinais 2020
Revista da Agência Europeia do Ambiente em duas colunas com aberturas fotográficas, boxes, olhos e painéis de dados

As mil e uma noites · ألف ليلة وليلة
As mil e uma noites completas em árabe, no texto de Bulaq: um livro clássico egípcio encadernado à direita, cada página num quadro de fio duplo, as noites nomeadas por extenso e as aquarelas de Sani ol-Molk. Somente em árabe

O sonho da câmara vermelha · 紅樓夢
Romance clássico chinês em 120 capítulos, com as pranchas de 1884: o texto de 1792 em chinês tradicional, composto na vertical e encadernado à direita, o mesmo texto em chinês simplificado e a tradução inglesa de Joly dos 56 primeiros capítulos

Kokoro · こころ
O romance de Natsume Sōseki (1914) em japonês, composto na vertical e encadernado à direita segundo a primeira edição da Iwanami, com a capa, as guardas e a folha de rosto desenhadas por Sōseki, três de suas pinturas e furigana sobre as palavras mais difíceis. Somente em japonês

Pepper&Carrot · O aniversário da Pepper
O episódio 8 do webcomic de David Revoy em oito idiomas: os quadros originais sem texto, com os balões e o letreiramento que o motor compõe a partir de cada tradução oficial. A edição japonesa é letreirada em colunas e, como a árabe, se lê da direita para a esquerda e abre pela direita
Capítulo 3 · Fluxo de trabalho
Diagramação editorial em três passos
O conteúdo em markdown, o design num objeto de configuração e as páginas numa única chamada de função.
- 3.1
Escreva markdown semântico
Escreva o conteúdo em markdown enriquecido: títulos, listas, tabelas, fórmulas, boxes e referências cruzadas :ref às suas figuras. Nada de diagramação nesta etapa, só conteúdo.
- 3.2
Configure as regras de diagramação
Defina o tamanho da página, as colunas, a tipografia, o design dos títulos, os cabeços e o posicionamento dos flutuantes num objeto PostextConfig, ou desenhe tudo visualmente no Sandbox.
- 3.3
Renderize em HTML, canvas ou PDF
Chame buildDocument e receba a geometria completa da diagramação; depois renderize-a com o renderizador de HTML, canvas ou PDF pronto para impressão.
API
Uma função, controle total
Chame buildDocument com o seu conteúdo e um objeto de configuração. Você recebe a geometria completa das páginas: desenhe qualquer página como imagem com renderPage ou componha o livro inteiro como PDF pronto para impressão com renderToPdf.
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 como imagem…
const cover = renderPage(doc.pages[0], doc);
cover.toBlob((png) => save(png, "cover.png"));
// …ou o livro inteiro como PDF pronto para impressão
// fontProvider: bytes TTF por família e peso (veja a documentação)
const pdf = await renderToPdf(doc, { fontProvider });Capítulo 4 · Formato aberto
Um arquivo, o livro inteiro
Um arquivo .postext leva tudo de que um documento precisa para ser composto de novo, em qualquer máquina: um formato aberto e editável que qualquer um pode adotar.
A maioria dos formatos editoriais espalha um projeto. Uma compilação LaTeX depende das fontes e dos pacotes instalados numa máquina, e os arquivos nativos dos grandes programas de diagramação fazem link para imagens e fontes guardadas fora deles. Ao mover o projeto, algo se perde. Nós mesmos esbarramos nesses limites com o LaTeX.
Um .postext é um arquivo ZIP comum que qualquer pessoa pode abrir, ler e editar: um manifesto JSON, um arquivo Markdown por capítulo e os próprios arquivos de fontes e imagens. O Sandbox o exporta, a skill para agentes postext-port o escreve e postext/bundle o abre em qualquer programa para compor de novo as mesmas páginas. O formato é documentado e tem licença MIT, pronto para qualquer ferramenta ler e escrever.
- 4.1
preset.jsonConfiguração. Página, grade, famílias tipográficas, estilos de título e de parágrafo, cores e cabeços, em JSON legível.
- 4.2
chapters/<lang>/*.mdCapítulos. Um arquivo Markdown por capítulo: aqui, 14 capítulos em 2 idiomas.
- 4.3
fonts/*.woff2Famílias tipográficas. Os próprios arquivos de fonte, não só os nomes: 18 arquivos de Lora, Fraunces, Geist e Bricolage Grotesque.
- 4.4
preset.json › resourcesRecursos. Legendas, numeração, posicionamento e conteúdo das tabelas para as 26 figuras e tabelas a que o texto remete.
- 4.5
resources/*.svgImagens. As próprias ilustrações, em SVG ou bitmap, com a versão de cada idioma: 38 arquivos.
Experimente
Abra o guia, obtenha as suas páginas
O primeiro exemplo do Sandbox, o guia do Postext, é um único arquivo .postext. Abra-o no navegador e transforme cada página numa imagem: as fontes, figuras e tabelas vêm do próprio arquivo.
Baixar o guiapostext-guide.postext · 847 KBimport { openBundle, loadBundleFonts, registerBundleImages,
buildBundle, renderPageToCanvas } from "postext";
// O guia do Sandbox: configuração, capítulos, fontes e imagens
const file = await fetch("postext-guide.postext").then((r) => r.blob());
const book = await openBundle(file, { locale: "en" });
await loadBundleFonts(book); // as fontes do próprio guia
await registerBundleImages(book); // as figuras do próprio guia
// Cada página de cada capítulo como imagem
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);
}Instalação
Comece em menos de um minuto
Um pacote, sem servidor, sem dependências nativas. Adicione o postext-pdf quando precisar imprimir.
// Início rápido
import { buildDocument, renderPage } from "postext";
import { renderToPdf } from "postext-pdf";
const doc = buildDocument({
markdown: "# Hello World\n\nYour content here.",
});
// A primeira página, desenhada num canvas
document.body.append(renderPage(doc.pages[0], doc));
// O documento inteiro como PDF
const pdf = await renderToPdf(doc, { fontProvider });