Kapitel 22 · Teil III · In der Praxis
Kommandozeile: postext im Terminal, in einem Skript oder einem Agenten
Eine eigenständige ausführbare Datei für macOS, Linux und Windows, die ein .postext-Buch, einen Buchordner oder lose Markdown-Dateien in PDF, HTML, EPUB, Seitenbilder und Word umwandelt, Pakete packt und Bücher prüft, mit JSON-Ausgabe für Skripte und Agenten
Kurz gesagt
Diese Seite richtet sich an alle, die Bücher mit Postext im Terminal statt auf der Website machen wollen. Sie laden eine einzige Datei für Ihren Computer herunter und führen sie aus, ohne etwas zu installieren. Sie geben ihr Ihr Buch oder ein paar Textdateien, und sie erzeugt ein PDF, eine Webseite, ein E-Book, Bilder der Seiten oder ein Word-Dokument. Sie kann ein Buch auch auf Probleme prüfen und seine Dateien zu einer einzigen packen. Auch Programme und KI-Assistenten können sie nutzen, denn sie kann in einem Format antworten, das diese leicht lesen.
postext setzt Ihr Buch aus einem Terminal, einem Skript oder einem Agenten heraus.
In der Sandbox schreiben und gestalten Sie ein Buch nach Augenmaß. Die
Kommandozeile nimmt dasselbe Buch und erzeugt seine Dateien ohne Browser:
ein druckfertiges PDF, die Seiten als HTML, ein EPUB, ein Bild einer Seite oder aller
Seiten, ein Word-Dokument. Außerdem packt und entpackt sie .postext-Pakete, importiert
Word-Dokumente, beschreibt ein Buch und prüft es auf Probleme.
Sie ist eine eigenständige ausführbare Datei pro System. Die Postext-Engine, die Writer für PDF, EPUB, HTML und Word, der Seitenmaler (Skia), HarfBuzz für Arabisch und andere komplexe Schriftsysteme, die ICC-Druckprofile und die Standardschriften (EB Garamond und Open Sans) stecken alle darin. Es gibt keine Laufzeitumgebung, kein Paket und keine Bibliothek zu installieren, und das Layout ist das der Sandbox: Dasselbe Buch bricht in dieselben Seiten um.
#Herunterladen
Jedes Release von Postext veröffentlicht die ausführbaren Dateien in seinem
GitHub Release, zusammen mit
ihren Prüfsummen (SHA256SUMS) und einer readme.txt:
| Datei | System |
|---|---|
postext-macos-arm64 | macOS auf Apple Silicon (M1 und neuer) |
postext-macos-x64 | macOS auf Intel |
postext-linux-x64 | Linux x86-64 mit glibc (Debian, Ubuntu, Fedora …) |
postext-linux-arm64 | Linux ARM64 mit glibc (Raspberry Pi OS 64 Bit, ARM-Server in der Cloud) |
postext-linux-x64-musl | Linux x86-64 mit musl (Alpine; vorher apk add libstdc++ libgcc ausführen) |
postext-windows-x64.exe | Windows x64 |
Jede Datei ist zwischen 115 und 140 MB groß. Der Link
https://github.com/drnachio/postext/releases/latest/download/<file> liefert
immer die neueste.
Unter Linux oder macOS:
curl -fL -o postext https://github.com/drnachio/postext/releases/latest/download/postext-linux-x64
chmod +x postext
./postextVerschieben Sie sie in einen Ordner in Ihrem PATH (/usr/local/bin, ~/.local/bin), um sie
von überall als postext aufzurufen. macOS stellt eine mit einem Browser heruntergeladene
Datei unter Quarantäne; entfernen Sie die Markierung einmal:
xattr -d com.apple.quarantine postext-macos-arm64Unter Windows in PowerShell:
Invoke-WebRequest https://github.com/drnachio/postext/releases/latest/download/postext-windows-x64.exe -OutFile postext.exe
.\postext.exeIst Node.js installiert, lädt npx postext-cli die ausführbare Datei für Ihr
System von npm herunter und führt sie aus, und npm install -g postext-cli behält sie als
Befehl postext.
Ohne Argumente aufgerufen, gibt postext seine Hilfe aus; postext help <command>
listet die Optionen eines Befehls auf.
#Ein erstes Buch
Drei Markdown-Dateien in einem Ordner sind ein Buch, je ein Kapitel, in der Reihenfolge der Namen:
postext pdf chapters/ --name "Field notes" -o field-notes.pdfDie Front Matter des ersten Kapitels gibt dem Buch Titel und Autor, und die Standardwerte der Engine erledigen den Rest: zwei Spalten, ein Grundlinienraster, Text im Blocksatz mit Silbentrennung, Kolumnentitel. Fügen Sie eine Konfiguration und Bilder hinzu, wenn Sie sie brauchen:
postext pdf chapters/ --config design.json --resources pictures/ -o field-notes.pdfEin in der Sandbox erstelltes Buch (Bücher → .postext exportieren) funktioniert so, wie es ist:
postext pdf my-book.postext -o my-book.pdf
postext image my-book.postext --page 1 -o cover.png#Was ein Buch sein kann
Jeder Befehl, der ein Buch liest, nimmt eine dieser Formen an:
- Eine
.postext-Datei: das Paket, das die Sandbox exportiert und öffnet (siehe Pakete). - Ein Buchordner: ein entpacktes Paket mit seiner
preset.json, seinen Kapiteln, Ressourcen und Schriften. Der Agent-Skill liefert so etwas, undpostext unpackschreibt einen. - Lose Markdown-Dateien: eine oder mehrere
.md-Dateien, je ein Kapitel in der angegebenen Reihenfolge, oder ein Ordner, dessen.md-Dateien nach Namen sortiert genommen werden (01-intro.md,02-method.md…). Dazu:--config design.json: die Konfiguration, entweder ein bloßes Konfigurationsobjekt oder eine ganzepreset.json;--resources pictures/: die Bilder, jedes eine Abbildung, benannt nach seinem Dateinamen ohne Endung (map.pngist::resource{id="map"}); eineresources.jsonim Ordner beschreibt sie stattdessen (IDs, Typen, Legenden, Alternativtext), in derselben Form wie dieresourceseinerpreset.json;--fonts fonts/: Schriftdateien, die das Buch mitbringt (TTF, OTF, WOFF2), benannt nach der Familie, die ihre Tabellen angeben;--name "Title": der Name des Buchs.
--config funktioniert auch bei einem Paket oder einem Ordner: Es wird über die eigene
Konfiguration des Buchs gelegt. Ein mehrsprachiges Paket wird in seiner eigenen Sprache gelesen, es sei denn,
--locale verlangt eine andere (--locale en).
#Befehle
| Befehl | Was er tut |
|---|---|
pdf | Das PDF, mit Lesezeichen, Links, eingebetteten Schriften und standardmäßig für Barrierefreiheit getaggt (PDF/UA); PDF/X und CMYK für den Druck. |
html | Die Seiten als HTML mit echtem Text: eine eigenständige Datei oder ein Ordner mit index.html und assets/. |
epub | Ein EPUB-3-Buch, mit festen Seiten wie gedruckt oder umfließendem Text. |
image | Eine Seite als PNG-, JPEG- oder WebP-Bild. |
images | Alle Seiten oder einen Bereich als Bilder in einem Ordner. |
docx | Die Kapitel als Word-Dokument, das sich unverändert wieder importieren lässt. |
import-docx | Ein Word-Dokument als Postext-Buch (ein Ordner oder eine .postext-Datei). |
pack | Einen Buchordner oder lose Markdown-Dateien als eine einzige .postext-Datei. |
unpack | Eine .postext-Datei als Ordner. |
info | Kapitel, Sprachen, Ressourcen und Schriften des Buchs, mit --pages auch seine Seitenzahl. |
check | Umbricht das Buch und meldet jedes Problem; für den Druck den Preflight. |
build | Umbricht das Buch einmal und schreibt mehrere der obigen Ausgaben; --watch läuft weiter und baut bei jedem Speichern neu. |
Jeder Befehl schreibt in das Verzeichnis, in dem Sie ihn aufrufen, benannt nach der Eingabe, es sei denn,
-o gibt den Pfad an. -o - schreibt eine einzelne Ausgabe auf die Standardausgabe.
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-outlinesDas PDF folgt den eigenen Einstellungen des Buchs (siehe PDF-Erzeugung und Druckvorstufe); diese Optionen ändern sie für einen Lauf:
--pdfx none|x1a|x4: der PDF/X-Standard für eine Druckerei.--profile NAME|FILE: das ICC-Ausgabeprofil, über seinen Namen (fogra39,fogra51,fogra52,swop5,gracol2006,snap2007,ifra26und die übrigen Profile der Druckeinstellungen) oder eine.icc-Datei.--color-space rgb|cmyk|grayscale.--accessible/--no-accessible: die getaggte Struktur für Screenreader.--no-outlines: die Lesezeichen weglassen.--page-negative: negative Seiten, für manche Druckabläufe.
#html
postext html book.postext -o book.html
postext html book.postext -o site/ --mode singleEin Pfad, der auf .html endet, ergibt eine einzige Datei mit den Bildern und Schriften darin,
leicht zu verschicken. Jeder andere Pfad ist ein Ordner: index.html neben assets/, das
die Bilder, die Schriften und selbst gehostete Videos enthält. --assets embed|folder
wählt für jeden Pfad die eine oder andere Variante. Die Seiten sind das Drucklayout, in
Bildschirmgröße gezeigt: nebeneinander (--mode multi, Standard) oder untereinander
(--mode single). Schriften mit der Markierung redistributable: false werden genannt, aber nicht
kopiert.
#epub
postext epub book.postext -o book.epub
postext epub book.postext --layout reflowable --cover cover.jpg--layout fixed (Standard) behält jede Seite wie gedruckt, mit markierbarem
Text; --layout reflowable lässt das Lesesystem den Text für seinen Bildschirm
neu setzen (siehe EPUB-Bücher). Das
Cover ist das Vorschaubild des Buchs, es sei denn, --cover gibt ein Bild an. Die
Metadaten des Pakets (Titel, Autoren, Sprache, Kennung) kommen aus der Front Matter
des ersten Kapitels, wie in der Sandbox.
#image und 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}"Seiten werden wie gedruckt benannt (12, iv, ein Bereich 7-9) oder nach ihrer Position
im Buch mit # (#1 ist die erste Seite, egal was sie druckt, #10-#20,
#30- bis zum Ende). --pages nimmt eine kommagetrennte Liste an. Der Maler ist die
Canvas-Ansicht der Sandbox, ein Bild zeigt die Seite also genau wie umbrochen, ohne
den Umweg über ein PDF.
--format png|jpeg|webp(oder die Endung von-o),--quality 1-100für JPEG und WebP.--dpi: Auflösung, standardmäßig 150; 72–100 genügen, um eine Seite zu lesen, 300 für den Druck.--pattern: die Dateinamen vonimages, aus{n}(die Position,{n:03}auf drei Ziffern aufgefüllt),{label}(die gedruckte Nummer) und{chapter}; standardmäßigpage-{n:03}.--print-preview: die Seite so, wie die Druckerei sie wiedergeben wird, über das Ausgabeprofil, mit eingezeichnetem Endformat und Anschnitt.--jobs N: wie viele Bilder gleichzeitig kodiert werden.
#docx und 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 schreibt die Kapitel mit Word-Formatvorlagen für Überschriften, Absätze, Kästen,
Zitate, Listen und Anmerkungen. Was Word nicht ausdrücken kann, bleibt wörtlich in den
Formatvorlagen Postext Markup erhalten, und die Importvorlage reist in der Datei mit, sodass
sich das Dokument unverändert wieder importieren lässt, nachdem ein Lektorat daran gearbeitet hat.
import-docx macht aus einem Word-Dokument ein Buch: ein Kapitel an jeder Überschrift
der Ebene 1 (--no-split behält eines), Bilder und Tabellen als Ressourcen, und
--report gibt den Qualitätsbericht aus, den die Sandbox zeigt (verwendete Formatvorlagen, direkte
Formatierung, getippte Nummerierung …). --template nimmt eine Importvorlage an (eine
aus der Sandbox gespeicherte .json-Datei oder eine .docx-Datei, die eine enthält).
#pack und 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 packt einen Buchordner so, wie er ist, als ZIP oder baut ein Paket aus losen Markdown-Dateien.
Dieselbe Eingabe ergibt immer dieselben Bytes, sodass sich ein Paket vergleichen oder
hashen lässt. unpack weigert sich, in einen Ordner zu schreiben, der nicht leer ist, es sei denn,
--force ist angegeben.
#info und check
postext info book.postext --pages
postext check book.postext
postext check chapters/ --strict --jsoninfo listet die Kapitel auf (Titel, Wörter, Datei und mit --pages ihre
Seiten), die Ressourcen und jede Schriftfamilie mit ihrer Herkunft (das
Buch, ein Ordner, die ausführbare Datei, der Download-Cache oder die Ersatzschrift). Bei einem Buch, das angibt, wo es beginnt (start in preset.json: ein Auszug, der auf Seite 58 in Kapitel 4 einsetzt), gibt es auch das aus, und jeder Befehl umbricht das Buch ab dort.
check umbricht das Buch und meldet, was das Bedienfeld Prüfungen der Sandbox zeigt:
Markdown, das nicht geschlossen wird, unbekannte Ressourcen, Direktiven und Formate, Kästen,
die das Layout erzwingen musste, fehlende Schriften, Einstellungen, die die Engine
ersetzen musste, und bei einem für den Druck eingerichteten Buch (oder mit --preflight) den
Preflight: Bilder mit geringer Auflösung, Haarlinien, kleinen Text in mehreren Druckfarben, Farbauftrag
über dem Grenzwert, Text nahe am Endformat. Außerdem listet er den Text auf, der sich auf seinem
Grund nicht lesen lässt (contrast), einmal pro Farbpaar, mit dem Kontrastverhältnis auf dem Bildschirm
und für den Druck auf dem Papier des Ausgabeprofils. Jedes Problem nennt die
Kapiteldatei, die Zeile und die Seite. Der Exit-Code ist 3, wenn ein Fehler gefunden wird, oder mit --strict
bei jeder Warnung.
#build und --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 umbricht das Buch einmal und schreibt jede Ausgabe, die Sie nennen (--pdf,
--html, --epub, --images, --docx), mit den Optionen des jeweiligen Befehls.
--watch bleibt aktiv: Wenn sich ein Kapitel, die Konfiguration oder ein Bild
ändert, wird das Buch neu umbrochen, mit weiterhin geladenen Schriften und Engine,
für ein Kapitel typischerweise in einem Bruchteil einer Sekunde, und die Ausgaben werden
neu geschrieben. Ein Speichern, das das Buch kaputt macht, gibt den Fehler aus und behält die letzten
fehlerfreien Dateien.
#Optionen für jedes Buch
| Option | Was sie tut |
|---|---|
--locale TAG | Die Sprache, in der ein mehrsprachiges Buch gelesen wird (es, en, pt-BR …). |
--chapters LIST | Umbricht nur einige Kapitel: 2, 1,3-5, 4-. Schneller bei einem langen Buch; ihre Seiten werden ab ihrer eigenen ersten Seite nummeriert. |
--set PATH=VALUE | Ändert eine Einstellung für diesen Lauf, als Pfad mit Punkten: --set page.dpi=150, --set bodyText.fontFamily=Lora, --set headings.levels.0.italic=true. Der Wert wird als JSON gelesen, wenn das geht (Zahlen, true und false, Objekte), sonst als Text. Wiederholbar. |
--config FILE | Eine Konfiguration (oder eine preset.json) für lose Markdown-Dateien, oder über die eigene eines Buchs gelegt. |
--resources DIR, --fonts DIR, --name TEXT | Bilder, Schriften und Titel für lose Markdown-Dateien. |
--font-dir DIR | Ein Ordner, in dem nach Schriften gesucht wird, die das Buch nicht mitbringt. Wiederholbar. |
--offline | Nie Schriften herunterladen. |
--cache-dir DIR | Wo heruntergeladene Schriften aufbewahrt werden. |
Und für jeden Befehl: --json, --quiet (-q, nur Fehler), --verbose
(Fortschritt und jede Warnung), --no-color, --help.
#Schriften
Ein Buch, das seine Schriften mitbringt (ein Paket oder --fonts bei losen Markdown-Dateien), wird
mit ihnen gesetzt und mit nichts anderem. Für jede Familie, die die Konfiguration nennt und
die das Buch nicht mitbringt, sucht postext der Reihe nach:
- in den mit
--font-dirangegebenen Ordnern; - unter den in die ausführbare Datei kompilierten Schriften: EB Garamond und Open Sans, die Standardschriften der Engine;
- im Download-Cache;
- bei Google Fonts, das ganze statische TrueType-Dateien liefert, oder bei Fontsource für eine Familie, die Google Fonts nicht hat (Commit Mono, FiraGO); sie werden im Cache aufbewahrt, sodass eine Familie nur einmal heruntergeladen wird.
Eine Schriftstärke, die eine Familie nicht mitliefert, wird in dem Schnitt gesetzt, den ein Browser dafür wählen würde (CSS-Font-Matching: über 500 zuerst die schwereren Schnitte, unter 400 zuerst die leichteren, sodass eine 600 einer Familie mit 400 und 700 deren 700 ist, ebenso eine 550), und eine Neigung, die sie nicht mitliefert, in ihrem aufrechten Schnitt, jeweils so, wie er ist, in den Seitenbildern wie im PDF: Eine Displayschrift mit nur einer Schriftstärke behält ihre eigenen Buchstaben für fett, und eine aufrechte Familie für kursiv.
Geholt werden die Schriftstärken, die die Konfiguration nennt: normal, fett und
deren Kursive für jede Familie sowie jede andere Schriftstärke, die eine Einstellung angibt, die
fette eingeschlossen (bodyText.boldFontWeight: 600 verlangt den Schnitt 600). Wenn sich eine
Schriftstärke, die die Familie mitliefert, nicht laden ließ (offline ohne Datei im Cache, ein
fehlgeschlagener Download, ein Schriftordner ohne die Datei), wird der Text in dem
Schnitt der Familie gesetzt, der nach derselben Regel dafür einspringt, und postext check
listet das als Warnung fontFallback auf: Seine Zeilen können anders umbrechen als in der Sandbox.
Der Cache liegt in ~/.cache/postext (%LOCALAPPDATA%\postext\cache unter Windows);
POSTEXT_CACHE_DIR oder --cache-dir verlegt ihn. --offline überspringt den Download.
Eine nirgends gefundene Familie wird unter ihrem eigenen Namen in EB Garamond gesetzt, sodass Layout
und PDF weiterhin übereinstimmen, und eine Warnung missingFont nennt sie. postext info
zeigt, woher jede Familie stammt.
#Für Skripte und Agenten
Die Kommandozeile ist dafür gebaut, von anderen Programmen gesteuert zu werden, auch von Coding-Agenten.
--jsongibt am Ende des Befehls ein JSON-Objekt auf der Standardausgabe aus; jede Meldung geht auf die Standardfehlerausgabe. Der Bericht listet auf, was geschrieben wurde, die Seiten, jede Warnung mit ihrer Quelle und wie lange jeder Schritt gedauert hat (in Millisekunden):
{
"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
}- Exit-Codes:
0erledigt,1fehlgeschlagen,2falsche Verwendung (eine unbekannte Option, eine fehlende Eingabe),3checkhat Fehler gefunden (oder mit--strictWarnungen). - Keine Rückfragen. Sie wartet nie auf eine Eingabe; ein Ordner, der nicht leer ist, wird abgelehnt, statt nachzufragen.
- Standardausgabe:
-o -schreibt ein PDF, ein Bild oder ein Paket dorthin, um es per Pipe weiterzureichen. - Geschwindigkeit. Die ausführbare Datei startet in wenigen Hundertstelsekunden. Ein kurzes
Buch wird in deutlich unter einer Sekunde zu einem PDF oder einem Seitenbild; ein langes braucht
so lange, wie sein Layout braucht (ein illustrierter Roman mit 140 Seiten etwa zehn Sekunden). Um
ein paar Seiten eines langen Buchs anzusehen, kombinieren Sie
--chaptersmitimageoderimages --pages. Um über viele Änderungen hinweg an einem Buch zu arbeiten, lassen Siepostext build --watchlaufen und lesen seine Ausgaben.
Der Agent-Skill verwendet die Kommandozeile, um die Seiten zu rendern, an denen er arbeitet, und um eine Portierung zu prüfen.
#Wie sie gebaut ist
Die Kommandozeile ist das Paket postext-cli im
Repository.
Bun kompiliert sie mit der Engine und ihren Writern zu einer
ausführbaren Datei pro System, und Skia (über @napi-rs/canvas)
misst und malt den Text, so wie das Canvas des Browsers in der Sandbox. Ein SVG-Bild, das ein Rasterbild enthält (ein als Data-URI eingebettetes PNG oder JPEG, wie es pdftocairo -svg für aus einem PDF ausgeschnittene Grafiken schreibt), wird stattdessen von resvg gezeichnet, weil der SVG-Renderer von Skia solche Bilder weglässt. Bei
jedem Release werden die ausführbaren Dateien gebaut, unter Linux, Alpine, macOS und
Windows ausgeführt und an das GitHub Release angehängt; npm erhält postext-cli und
ein Paket postext-cli-<system> pro ausführbarer Datei.
So führen Sie sie aus einer Kopie des Repositorys aus:
pnpm install
pnpm --filter postext-cli start pdf book.postext
pnpm --filter postext-cli build:bin --currentDer erste Befehl führt sie aus ihren Quellen aus; der zweite schreibt die ausführbare Datei für diesen
Computer nach packages/postext-cli/bin/.
#Unterschiede zur Sandbox
- HTML ist das Drucklayout in Bildschirmgröße. Der HTML-Tab der Sandbox umbricht den Text für das Fenster neu.
--chaptersumbricht die Kapitel für sich: Ihre Seitenzahlen beginnen neu, während die Sandbox die Nummerierung des Buchs fortführt.- Schriften kommen aus dem Buch, Ihren Ordnern, der ausführbaren Datei, Google Fonts oder Fontsource (für eine Familie, die Google Fonts nicht hat), nie aus den auf dem Computer installierten Schriften, sodass ein Buch auf jedem Rechner gleich herauskommt.
- Die Sprache des Texts ist in einem Browser die eigene des Dokuments
(
bodyText.shapingLanguage: 'document', der Standard seit postext 1.30). Das Canvas von Skia nimmt eine Sprache entgegen und formt ohne sie; die Kommandozeile misst daher die Formen der Standardsprache jeder Schrift und umbricht ihre Bücher immer mitshapingLanguage: 'host', was auch immer die Konfiguration angibt; ihr PDF und ihre Bilder malen dieselben Formen. Ein Buch, dessen Schrift Formen für eine Sprache hat (ein katalanischesl·l, ein türkischesfi, die Ziffern einer chinesischen Schrift in einem englischen Buch), wird hier in den Standardformen gesetzt. Was'document'sonst misst (die an einem Zeilenende getrennten Teile eines Worts, ein Wort von rechts nach links, ein Gestaltungstext), wird hier so gemessen, wie'host'es misst, sodass eine Zeile an einem anderen Wort umbrechen kann als in der Sandbox.