Pandoc ist ein quelloffener, universaler Dokument-Konverter, geschrieben in Haskell von John MacFarlane. Pandoc parst sein Input-Format in einen internen abstrakten Syntaxbaum (AST) und rendert daraus eines der vielen Output-Formate. Diese Architektur ist der Grund, warum Pandoc fast jedes Quell-/Ziel-Paar unterstützt — und warum sich der Output über Templates und Lua-Filter sehr fein steuern lässt.

Pandoc ist seit 2006 aktiv und das Standard-Werkzeug, wenn ein Markdown-Dokument zu LaTeX, ein DOCX zu Markdown oder ein RST zu HTML konvertiert werden soll.

Wichtige Eingabe- und Ausgabeformate

EingabeAusgabe
Markdown (CommonMark, GFM, Pandoc-Markdown)dito plus alle Output-Formate
LaTeXHTML, PDF (via LaTeX/Typst/Wkhtmltopdf), DOCX, EPUB
DOCX, ODT, RTFMarkdown, HTML, LaTeX, …
HTMLMarkdown, DOCX, EPUB, JATS, …
MediaWiki, DokuWiki, Textile, Org-mode, RSTMarkdown, HTML, …
JATS, BITS, TEI LiteMarkdown, HTML, DOCX, EPUB
Jupyter Notebook (.ipynb)Markdown, HTML, LaTeX

Vollständige Liste: pandoc --list-input-formats und --list-output-formats.

Grundbenutzung

# Format-Erkennung über Datei-Endung
pandoc paper.md -o paper.docx

# explizit
pandoc -f markdown -t latex paper.md -o paper.tex

# PDF (benötigt LaTeX-Distribution wie TeX Live oder MacTeX)
pandoc paper.md -o paper.pdf

# PDF über Typst (ab Pandoc 3.x)
pandoc paper.md -o paper.pdf --pdf-engine=typst

# Mehrere Quellen zu einem Dokument zusammenfassen
pandoc kap1.md kap2.md kap3.md -o buch.docx

# Standalone-Output mit eigenem Template
pandoc paper.md --template=mein.tex -o paper.tex --standalone

Pandoc-Markdown-Erweiterungen

Pandoc kennt einen reichen Markdown-Dialekt mit nützlichen Ergänzungen über CommonMark hinaus:

  • YAML-Header für Metadaten (Titel, Autor, Datum, etc.)
  • Definition Lists (Begriff\n: Definition)
  • Fussnoten mit [^1]
  • Citations mit [@key2024] (gegen --bibliography=ref.bib)
  • Tabellen in mehreren Stilen (Pipe, Grid, Multiline)
  • Math in $inline$ und $$display$$ (LaTeX-Syntax)
  • Raw-HTML / -LaTeX Blöcke (z. B. \begin{equation})
  • Smart-Punctuation (--smart macht aus -- Gedankenstriche, etc.)
  • Header-Identifier # Titel {#mein-anchor} und Cross-Refs

Templates

Templates steuern die finale Ausgabe (Standalone-Mode) — etwa eine LaTeX-Präambel oder ein HTML-Gerüst. Default-Templates anzeigen:

pandoc -D html       # Default-HTML-Template
pandoc -D latex      # Default-LaTeX-Template

Eigene Templates platziert man unter ~/.local/share/pandoc/templates/ oder gibt sie per --template=… an. Variablen referenziert man mit $variable$, Schleifen mit $for(authors)$ … $endfor$, Conditionals mit $if(toc)$ … $endif$.

CSL-Bibliographien

Pandoc nutzt CSL (Citation Style Language) für formatierte Zitationen:

pandoc paper.md \
  --bibliography=lit.bib \
  --csl=chicago-author-date.csl \
  --citeproc \
  -o paper.pdf

Die .bib kann BibTeX, BibLaTeX, CSL-JSON oder CSL-YAML sein. Tausende fertige .csl-Stile gibt es im Zotero Style Repository.

Lua-Filter

Lua-Filter manipulieren den AST zwischen Parsing und Rendering — z. B. um alle Bilder mit Captions zu versehen, Custom-Blocks in HTML-Klassen zu übersetzen oder externe Daten einzufügen:

pandoc paper.md --lua-filter=meine.lua -o paper.html

Ein minimales Filter, das alle Strong-Elemente in Caps verwandelt:

function Strong(el)
  return pandoc.SmallCaps(el.content)
end

Es gibt eine wachsende Sammlung fertiger Filter — z. B. pandoc-include-code, pandoc-crossref, diagram-generator.