Wer in Markdown schreibt, landet früher oder später bei pandoc. Es ist das Werkzeug, mit dem aus einer Textdatei ein DOCX für das Lektorat wird, ein EPUB für den Reader, eine HTML-Seite oder über LaTeX ein PDF. Es kennt Dutzende Formate in beide Richtungen, es löst Zitate auf, es baut Inhaltsverzeichnisse, und es ist seit fünfzehn Jahren zuverlässig. Auch meine Schreibprojekte gehen für Markdown diesen Weg: pandoc macht aus der Datei LaTeX, latexmk macht daraus das PDF.

Das Problem war nie pandoc. Das Problem war, wie ich mit ihm gesprochen habe.

Die Befehlszeile, die man aus der History fischt

Ein pandoc-Aufruf, der mehr tut als „Datei rein, Datei raus“, sieht in etwa so aus:

pandoc --to docx --standalone --table-of-contents --number-sections --citeproc --bibliography=literatur.bib --reference-doc=vorlage.docx --metadata lang=de --output kapitel.docx kapitel.md

Jeder einzelne Schalter ist sinnvoll. Zusammen sind sie eine Zeile, die ich mir nie gemerkt habe. Ich habe sie mir jedes Mal aus der Shell-History gefischt, nachgeschlagen, ob es --toc oder --table-of-contents heißt, und mich gefragt, ob das Referenzdokument nun --reference-doc oder --reference-docx will. Das hängt von der pandoc-Version ab, und die Antwort aus dem Forum ist von 2017.

Und dann waren es fünf Kapitel. Also fünfmal die Zeile, fünfmal den Dateinamen an zwei Stellen ändern, einmal vertippt, ein Kapitel überschreibt das andere.

Was ich vorher probiert habe

Shell-Skripte und Aliase. Das hält, bis man etwas anderes will als beim letzten Mal. Ein zweites Skript für die Fassung mit Zitaten, ein drittes für HTML, und nach einem halben Jahr weiß ich nicht mehr, welches davon das aktuelle ist. Dieselbe Geschichte wie bei den Vorlagen für meine Schreibprojekte, nur eine Ebene tiefer.

Online-Konverter. Die gibt es, sie sind bequem, und sie haben zwei Haken. Der erste: Meine Texte liegen dann auf einem fremden Server, und ich weiß nicht, wie lange. Der zweite: Sie können genau das, was ihre Oberfläche anbietet. Ein eigener Zitierstil, ein Referenzdokument mit den Formatvorlagen des Verlags, ein Ressourcenordner für die Bilder: Fehlanzeige.

Was ich wollte, war beides zugleich. Die ganze Breite von pandoc, aber ohne die Zeile tippen zu müssen. Und wenn ich sie doch einmal sehen will, weil etwas nicht stimmt oder weil ich sie auf dem Server wiederholen möchte, dann soll sie da sein.

Die Optionen sind der Zustand, die Befehlszeile ist eine Sicht darauf

Das ist die eine Entscheidung, aus der alles andere folgt. Die App hält nicht eine Befehlszeile, die man zusammenklickt. Sie hält die Optionen: Zielformat, Schalter, Referenzdokument, Literaturdateien, Metadaten. Daraus entsteht die Befehlszeile, jederzeit, für jede Datei in der Liste. Sie steht unten in der Optionsspalte, lesbar und mit einem Knopf zum Kopieren.

Die Optionsspalte mit Metadaten, zusätzlichen Argumenten und der vollständigen pandoc-Befehlszeile zum Kopieren
Was oben eingestellt ist, steht unten als Befehlszeile. Kopieren, im Terminal einfügen, dasselbe Ergebnis.

Der eigentliche Aufruf geht trotzdem nie über eine Shell. pandoc bekommt seine Argumente als Liste, und ein Dateiname mit Leerzeichen oder Semikolon bleibt ein Argument. Die angezeigte Zeile ist für Menschen, mit Anführungszeichen dort, wo ein Mensch sie bräuchte. Das ist die einzige Stelle in der App, an der überhaupt etwas quotiert wird.

Was sich bewährt hat, wird zum Profil: „Manuskript → DOCX“, „Handout → HTML“, einmal eingerichtet, mit einem Klick zurück. Und wer einen Schalter braucht, den die Oberfläche nicht kennt, tippt ihn in das Feld für zusätzliche Argumente. Er wird unverändert angehängt. Ich wollte keine Oberfläche bauen, die weniger kann als das Programm darunter.

Die Vorschau war ein Nebeneffekt

Wenn die App die Optionen ohnehin kennt und pandoc ohnehin dabei ist, dann kann sie auch beim Schreiben zeigen, was daraus wird. Das war zunächst ein Gedanke für später und ist inzwischen der Grund, warum ich die App öfter offen habe als das Terminal.

Links der Markdown-Text, rechts das gerenderte Dokument, und zwar mit denselben Einstellungen, die auch für den Stapel gelten. Der Text geht über die Standardeingabe an pandoc, das Ergebnis kommt über die Standardausgabe zurück, mit eingebetteten Bildern. Keine temporären Dateien, keine Pfade, die irgendwo nicht stimmen. Was im Editor steht, ist genau das, was gerendert wird.

Editor und Vorschau im Dunkelmodus: links der Zitatschlüssel im Markdown, rechts das aufgelöste Zitat und das Literaturverzeichnis
Aus dem Schlüssel wird beim Tippen ein Zitat, das Literaturverzeichnis wächst mit.

Am deutlichsten merkt man das bei Zitaten. Ein [@macfarlane2024] im Text ist in der Vorschau schon „(MacFarlane 2024)“, und unten steht das Literaturverzeichnis, im eingestellten Zitierstil. Ob der Schlüssel stimmt, sehe ich beim Tippen und nicht erst, wenn das DOCX beim Lektorat liegt.

Warum pandoc mitgeliefert wird

Die App bringt pandoc mit. Das war keine Selbstverständlichkeit, denn pandoc ist rund 190 Megabyte groß und steht unter der GPL. Es wird deshalb unverändert und als eigenständiges Programm beigelegt, der Quellcode liegt bei github.com/jgm/pandoc, und die Einstellungen sagen es auch so.

Der Grund ist einfach: Eine Oberfläche, die als erstes verlangt, dass man im Terminal etwas installiert, hat ihren Zweck verfehlt. Wer pandoc schon hat und lieber die eigene Version nutzt, trägt den Pfad ein. Die App prüft dann, ob unter diesem Pfad wirklich ein pandoc läuft und ob es neu genug ist. Ein Pfad, der bloß existiert, beweist nichts.

Was nicht mitkommt, ist eine PDF-Engine. LaTeX, Typst oder wkhtmltopdf sind noch einmal eine andere Größenordnung, und wer sie hat, hat sie meistens aus einem anderen Grund. Die App erkennt, was da ist, und sagt verständlich, was fehlt, statt pandocs Fehlermeldung durchzureichen.

Was daraus geworden ist

Eine Desktop-App für macOS und Windows, aus einer Codebasis, in Flutter. Die Schicht, die mit pandoc spricht, kennt kein einziges Widget und lässt sich ohne installiertes pandoc testen. Die Oberfläche ist auf Deutsch, die Befehlszeile bleibt sichtbar, und das Terminal habe ich seither für pandoc nicht mehr aufgemacht.

Was die App im Einzelnen kann, steht auf der Produktseite.