Capítulo 22 · Parte III · La práctica
Línea de comandos: postext en una terminal, un script o un agente
Un ejecutable autónomo para macOS, Linux y Windows que convierte un libro .postext, una carpeta de libro o Markdown suelto en PDF, HTML, EPUB, imágenes de página y Word, crea paquetes y revisa libros, con salida JSON para scripts y agentes
En pocas palabras
Esta página es para quien quiere hacer libros con Postext desde una terminal en lugar de desde la web. Descargas un único archivo para tu ordenador y lo ejecutas, sin instalar nada más. Le das tu libro, o unos cuantos archivos de texto, y te hace un PDF, una página web, un libro electrónico, imágenes de las páginas o un documento de Word. También puede revisar un libro en busca de problemas y juntar todos sus archivos en uno. Otros programas y los asistentes de inteligencia artificial también pueden usarlo, porque sabe responder en un formato que leen con facilidad.
postext compone tu libro desde una terminal, un script o un agente.
El Sandbox es donde escribes y diseñas un libro viéndolo. La
línea de comandos toma el mismo libro y produce sus archivos sin navegador:
un PDF listo para imprenta, las páginas en HTML, un EPUB, la imagen de una
página o de todas, un documento de Word. También empaqueta y desempaqueta
archivos .postext, importa documentos de Word, describe un libro y lo revisa
en busca de problemas.
Es un ejecutable autónomo por sistema. Lleva dentro el motor de postext, los generadores de PDF, EPUB, HTML y Word, el pintor de páginas (Skia), HarfBuzz para el árabe y otras escrituras complejas, los perfiles ICC de imprenta y las fuentes por defecto (EB Garamond y Open Sans). No hay que instalar ningún entorno de ejecución, paquete ni biblioteca, y la maquetación es la del Sandbox: el mismo libro se parte en las mismas páginas.
#Cómo conseguirlo
Cada versión de Postext publica los ejecutables en su
GitHub Release, con
sus sumas de verificación (SHA256SUMS) y un readme.txt:
| Archivo | Sistema |
|---|---|
postext-macos-arm64 | macOS en Apple silicon (M1 y posteriores) |
postext-macos-x64 | macOS en Intel |
postext-linux-x64 | Linux x86-64 con glibc (Debian, Ubuntu, Fedora…) |
postext-linux-arm64 | Linux ARM64 con glibc (Raspberry Pi OS de 64 bits, servidores ARM en la nube) |
postext-linux-x64-musl | Linux x86-64 con musl (Alpine; ejecuta antes apk add libstdc++ libgcc) |
postext-windows-x64.exe | Windows x64 |
Cada archivo pesa entre 115 y 140 MB. El enlace
https://github.com/drnachio/postext/releases/latest/download/<file> da
siempre el más reciente.
En Linux o macOS:
curl -fL -o postext https://github.com/drnachio/postext/releases/latest/download/postext-linux-x64
chmod +x postext
./postextMuévelo a una carpeta de tu PATH (/usr/local/bin, ~/.local/bin) para
ejecutarlo como postext desde cualquier sitio. macOS pone en cuarentena un
archivo descargado con el navegador; quita la marca una vez:
xattr -d com.apple.quarantine postext-macos-arm64En Windows, en PowerShell:
Invoke-WebRequest https://github.com/drnachio/postext/releases/latest/download/postext-windows-x64.exe -OutFile postext.exe
.\postext.exeCon Node.js instalado, npx postext-cli descarga de npm el ejecutable de tu
sistema y lo ejecuta, y npm install -g postext-cli lo deja instalado como
comando postext.
Sin argumentos, postext muestra su ayuda; postext help <command> enumera
las opciones de un comando.
#Un primer libro
Tres archivos Markdown en una carpeta son un libro, un capítulo cada uno, por orden de nombre:
postext pdf chapters/ --name "Field notes" -o field-notes.pdfEl front matter del primer capítulo da al libro su título y su autor, y los valores por defecto del motor hacen el resto: dos columnas, una retícula de líneas base, texto justificado y con separación silábica, cornisas. Añade una configuración e imágenes cuando las necesites:
postext pdf chapters/ --config design.json --resources pictures/ -o field-notes.pdfUn libro hecho en el Sandbox (Libros → Descargar (.postext)) funciona tal cual:
postext pdf my-book.postext -o my-book.pdf
postext image my-book.postext --page 1 -o cover.png#Qué puede ser un libro
Todos los comandos que leen un libro aceptan cualquiera de estas formas:
- Un archivo
.postext: el paquete que el Sandbox exporta y abre (consulta Paquetes). - Una carpeta de libro: un paquete desempaquetado, con su
preset.json, sus capítulos, sus recursos y sus fuentes. Es lo que entrega la skill para agentes, ypostext unpackescribe una. - Markdown suelto: uno o varios archivos
.md, un capítulo cada uno en el orden en que se dan, o una carpeta cuyos archivos.mdse toman por orden de nombre (01-intro.md,02-method.md…). Con ellos:--config design.json: la configuración, ya sea un objeto de configuración suelto o unpreset.jsoncompleto;--resources pictures/: las imágenes, cada una como una figura con el nombre de su archivo sin la extensión (map.pnges::resource{id="map"}); si la carpeta tiene unresources.json, este las describe (ids, tipos, pies, texto alternativo), con la misma forma que losresourcesde unpreset.json;--fonts fonts/: los archivos de fuente que lleva el libro (TTF, OTF, WOFF2), con el nombre de familia que dan sus tablas;--name "Title": el nombre del libro.
--config funciona también con un paquete o una carpeta: se fusiona sobre la
configuración propia del libro. Un paquete multilingüe se lee en su propio
idioma, salvo que --locale pida otro (--locale en).
#Comandos
| Comando | Qué hace |
|---|---|
pdf | El PDF, con marcadores, enlaces, fuentes incrustadas y, por defecto, etiquetado para la accesibilidad (PDF/UA); PDF/X y CMYK para imprenta. |
html | Las páginas en HTML con texto real: un único archivo autónomo, o una carpeta con index.html y assets/. |
epub | Un libro EPUB 3, con páginas fijas como las impresas o con texto adaptable. |
image | Una página como imagen PNG, JPEG o WebP. |
images | Todas las páginas, o un intervalo, como imágenes en una carpeta. |
docx | Los capítulos como un documento de Word que se vuelve a importar sin cambios. |
import-docx | Un documento de Word como libro de Postext (una carpeta o un .postext). |
pack | Una carpeta de libro o Markdown suelto como un único archivo .postext. |
unpack | Un archivo .postext como carpeta. |
info | Los capítulos, idiomas, recursos y fuentes del libro y, con --pages, su número de páginas. |
check | Compone el libro e informa de cada problema; para imprenta, el preflight. |
build | Compone el libro una vez y escribe varias de las salidas anteriores; --watch sigue en marcha y vuelve a componerlo cada vez que guardas. |
Cada comando escribe en la carpeta desde la que lo ejecutas, con el nombre de
la entrada, salvo que -o indique la ruta. -o - escribe una única salida en
la salida estándar.
postext pdf book.postext -o book.pdf
postext pdf book/ --pdfx x4 --profile fogra51 -o book-print.pdf
postext pdf book/ --color-space grayscale --no-outlinesEl PDF sigue los ajustes del propio libro (consulta Generación de PDF y Producción para imprenta); estas opciones los cambian para una sola ejecución:
--pdfx none|x1a|x4: la norma PDF/X para una imprenta.--profile NAME|FILE: el perfil ICC de salida, por nombre (fogra39,fogra51,fogra52,swop5,gracol2006,snap2007,ifra26y los demás perfiles de los ajustes de imprenta) o un archivo.icc.--color-space rgb|cmyk|grayscale.--accessible/--no-accessible: la estructura etiquetada para lectores de pantalla.--no-outlines: deja fuera los marcadores.--page-negative: páginas en negativo, para algunos flujos de imprenta.
#html
postext html book.postext -o book.html
postext html book.postext -o site/ --mode singleUna ruta que termina en .html da un único archivo con las imágenes y las
fuentes dentro, fácil de enviar. Cualquier otra ruta es una carpeta:
index.html junto a assets/, que guarda las imágenes, las fuentes y los
vídeos alojados en el propio libro. --assets embed|folder elige una u otra
forma para cualquier ruta. Las páginas son las de la maquetación impresa,
mostradas a tamaño de pantalla: una al lado de otra (--mode multi, el valor
por defecto) o una debajo de otra (--mode single). Las fuentes marcadas
redistributable: false se nombran pero no se copian.
#epub
postext epub book.postext -o book.epub
postext epub book.postext --layout reflowable --cover cover.jpg--layout fixed (el valor por defecto) conserva cada página tal como se
imprime, con el texto seleccionable; --layout reflowable deja que el sistema
de lectura vuelva a componer el texto para su pantalla (consulta
Libros EPUB). La cubierta es
la miniatura del libro, salvo que --cover indique una imagen. Los metadatos
del paquete (título, autores, idioma, identificador) salen del front matter
del primer capítulo, como en el Sandbox.
#image e images
postext image book.postext --page 12 -o page-12.png
postext image book.postext --page "#1" --dpi 300 -f jpeg -o cover.jpg
postext images book.postext -o pages/ --dpi 100
postext images book.postext --pages 1-10,iv -f webp --pattern "{chapter}-{label}"Las páginas se indican tal como se imprimen (12, iv, un intervalo
7-9) o por su posición en el libro con # (#1 es la primera página,
imprima el número que imprima, #10-#20, #30- hasta el final). --pages
acepta una lista separada por comas. El pintor es el de la vista Canvas del
Sandbox, así que una imagen muestra la página exactamente como se maquetó, sin
pasar por un PDF.
--format png|jpeg|webp(o la extensión de-o),--quality 1-100para JPEG y WebP.--dpi: la resolución, 150 por defecto; de 72 a 100 basta para leer una página, 300 para imprenta.--pattern: los nombres de archivo deimages, a partir de{n}(la posición,{n:03}rellenada a tres cifras),{label}(el número impreso) y{chapter};page-{n:03}por defecto.--print-preview: la página tal como la reproducirá la imprenta, a través del perfil de salida, con el corte y el sangrado dibujados.--jobs N: cuántas imágenes se codifican a la vez.
#docx e import-docx
postext docx book.postext -o book.docx
postext import-docx manuscript.docx -o manuscript/ --locale es --report
postext import-docx manuscript.docx -o manuscript.postextdocx escribe los capítulos con estilos de Word para los títulos, los
párrafos, los recuadros, las citas, las listas y las notas. Lo que Word no
puede expresar se conserva tal como está escrito en los estilos Postext
Markup, y la plantilla de importación viaja dentro del archivo, así que el
documento se vuelve a importar sin cambios después de que un editor haya
trabajado en él. import-docx convierte un documento de Word en un libro: un
capítulo en cada título de nivel 1 (--no-split deja uno solo), las imágenes
y las tablas como recursos, y --report imprime el informe de calidad que
muestra el Sandbox (estilos en uso, formato directo, numeración escrita a
mano…). --template toma una plantilla de importación (un .json guardado
desde el Sandbox o un .docx que la lleve).
#pack y unpack
postext pack my-book/ -o my-book.postext
postext pack 01.md 02.md --name "Notes" --config design.json --resources img/ -o notes.postext
postext unpack my-book.postext -o my-book/pack comprime en zip una carpeta de libro tal como está, o construye un
paquete a partir de Markdown suelto. La misma entrada da siempre los mismos
bytes, así que un paquete se puede comparar o calcular su hash. unpack se
niega a escribir en una carpeta que no está vacía, salvo que se indique
--force.
#info y check
postext info book.postext --pages
postext check book.postext
postext check chapters/ --strict --jsoninfo enumera los capítulos (título, palabras, archivo y, con --pages, sus
páginas), los recursos y cada familia de fuentes con su procedencia (el libro,
una carpeta, el ejecutable, la caché de descargas o la fuente de reserva). Si el libro dice dónde empieza (start en preset.json: un extracto que abre en la página 58, en el capítulo 4), también lo muestra, y todos los comandos componen el libro desde ahí.
check compone el libro e informa de lo mismo que muestra el panel Revisión
del Sandbox: Markdown que no se cierra, recursos, directivas y estilos
desconocidos, cajas que la maquetación tuvo que forzar, fuentes que faltan,
ajustes que el motor tuvo que sustituir y, en un libro preparado para imprenta
(o con --preflight), el preflight: imágenes de baja resolución, filetes
finos, texto pequeño en varias tintas, tinta por encima del límite, texto
cerca del corte. Cada problema indica el archivo del capítulo, la línea y la
página. El código de salida es 3 cuando se encuentra un error, o cualquier
aviso con --strict.
#build y --watch
postext build book/ --pdf out/book.pdf --html out/book.html --images out/pages --pages 1-4
postext build chapters/ --pdf book.pdf --watchbuild compone el libro una vez y escribe todas las salidas que nombres
(--pdf, --html, --epub, --images, --docx), con las opciones de cada
comando. --watch sigue en marcha: cuando cambia un capítulo, la
configuración o una imagen, el libro se vuelve a componer con las fuentes y el
motor ya cargados, normalmente en una fracción de segundo para un capítulo, y
las salidas se reescriben. Si al guardar el libro queda roto, imprime el error
y conserva los últimos archivos buenos.
#Opciones para cualquier libro
| Opción | Qué hace |
|---|---|
--locale TAG | El idioma en que se lee un libro multilingüe (es, en, pt-BR…). |
--chapters LIST | Compone solo algunos capítulos: 2, 1,3-5, 4-. Es más rápido en un libro largo; sus páginas se numeran desde su propia primera página. |
--set PATH=VALUE | Cambia un ajuste para esta ejecución, como ruta con puntos: --set page.dpi=150, --set bodyText.fontFamily=Lora, --set headings.levels.0.italic=true. El valor se lee como JSON cuando se puede (números, true y false, objetos) y, si no, como texto. Se puede repetir. |
--config FILE | Una configuración (o un preset.json) para Markdown suelto, o que se fusiona sobre la del propio libro. |
--resources DIR, --fonts DIR, --name TEXT | Imágenes, fuentes y título para Markdown suelto. |
--font-dir DIR | Una carpeta en la que buscar las fuentes que el libro no lleva. Se puede repetir. |
--offline | No descarga nunca fuentes. |
--cache-dir DIR | Dónde se guardan las fuentes descargadas. |
Y para todos los comandos: --json, --quiet (-q, solo errores),
--verbose (el progreso y todos los avisos), --no-color, --help.
#Fuentes
Un libro que lleva sus fuentes (un paquete, o --fonts con Markdown suelto)
se compone con ellas y con ninguna otra. Para cada familia que nombra la
configuración y que el libro no lleva, postext busca, por este orden:
- en las carpetas indicadas con
--font-dir; - entre las fuentes compiladas en el ejecutable: EB Garamond y Open Sans, las de por defecto del motor;
- en la caché de descargas;
- en Google Fonts, que da archivos TrueType estáticos completos, o en Fontsource si Google Fonts no tiene la familia (Commit Mono, FiraGO); se guardan en la caché, así que cada familia se descarga una sola vez.
Un peso o una inclinación que la familia no trae se compone con su fuente más cercana tal cual, en las imágenes de página igual que en el PDF: una familia de rotulación con un solo peso conserva sus letras en la negrita, y una familia sin cursiva, las redondas.
La caché está en ~/.cache/postext (%LOCALAPPDATA%\postext\cache en
Windows); POSTEXT_CACHE_DIR o --cache-dir la cambian de sitio.
--offline se salta la descarga. Una familia que no aparece en ningún sitio
se compone en EB Garamond con su propio nombre, para que la maquetación y el
PDF sigan coincidiendo, y un aviso missingFont la nombra. postext info
muestra de dónde salió cada familia.
#Para scripts y agentes
La línea de comandos está hecha para que la manejen otros programas, también los agentes de programación.
--jsonimprime un objeto JSON en la salida estándar cuando el comando termina; todos los mensajes van a la salida de errores. El informe enumera lo que se escribió, las páginas, cada aviso con su origen y cuánto tardó cada paso (en milisegundos):
{
"ok": true,
"command": "pdf",
"version": "1.22.1",
"book": { "name": "notes", "id": "notes", "locale": "en", "chapters": 2 },
"pages": 3,
"outputs": [{ "kind": "pdf", "path": "notes.pdf", "bytes": 29746, "pages": 3 }],
"warnings": [
{
"kind": "unknownResourceId",
"severity": "warning",
"message": "Unknown resource id \"map\" in ::resource — nothing is embedded (offset 26)",
"at": "notes/02-more.md:5"
}
],
"timings": { "read": 13, "fonts": 8.4, "math": 28.2, "layout": 51.6, "pdf": 132.1, "total": 1638 },
"exitCode": 0
}- Códigos de salida:
0terminado,1fallido,2uso incorrecto (una opción desconocida, una entrada que falta),3checkencontró errores (o avisos, con--strict). - Sin preguntas. Nunca espera una respuesta; una carpeta que no está vacía se rechaza en lugar de preguntar qué hacer con ella.
- Salida estándar:
-o -escribe ahí un PDF, una imagen o un paquete, para pasarlo por una tubería a otro programa. - Velocidad. El ejecutable arranca en unas centésimas de segundo. Un libro
corto pasa a PDF o a imagen de página en bastante menos de un segundo; uno
largo tarda lo que tarde su maquetación (una novela ilustrada de 140
páginas, unos diez segundos). Para ver unas pocas páginas de un libro largo,
combina
--chaptersconimageo conimages --pages. Para trabajar en un libro a lo largo de muchos cambios, dejapostext build --watchen marcha y lee sus salidas.
La skill para agentes usa la línea de comandos para pintar las páginas en las que está trabajando y para revisar un porte.
#Cómo está hecho
La línea de comandos es el paquete postext-cli del
repositorio.
Bun lo compila, junto con el motor y sus generadores, en un
ejecutable por sistema, y Skia (a través de
@napi-rs/canvas) mide y pinta el texto, como hace el canvas del navegador en
el Sandbox. En cada versión los ejecutables se construyen, se ejecutan en
Linux, Alpine, macOS y Windows y se adjuntan a la GitHub Release; npm recibe
postext-cli y un paquete postext-cli-<system> por ejecutable.
Para ejecutarlo desde una copia del repositorio:
pnpm install
pnpm --filter postext-cli start pdf book.postext
pnpm --filter postext-cli build:bin --currentEl primero lo ejecuta desde sus fuentes; el segundo escribe el ejecutable de
este ordenador en packages/postext-cli/bin/.
#Diferencias con el Sandbox
- HTML es la maquetación impresa mostrada a tamaño de pantalla. La pestaña HTML del Sandbox vuelve a componer el texto para la ventana.
--chapterscompone los capítulos por separado: sus números de página empiezan de nuevo, mientras que el Sandbox continúa la numeración del libro.- Las fuentes salen del libro, de tus carpetas, del ejecutable o de Google Fonts, nunca de las fuentes instaladas en el ordenador, así que un libro sale igual en cualquier máquina.