Zum Inhalt springen
Typst-Leitfaden
typstgen
01 / Produkt
LeitfadenLeitfaden · Typst · Open Source

Dokumente, die man
nachbauen kann

02 / Kern

Vom ersten Brief bis zur archivierten E-Rechnung: wie man mit Typst Dokumente aus Daten erzeugt, prüft, ablegt und später belegt, dass sie unverändert sind – auch mit einem KI-Agenten.

Alle Befehle und Ausgaben auf dieser Seite sind echt, ausgeführt mit typstgen 0.4 und Typst 0.15.1 (Stand: 12.10.2026).

03 / Fakten
typstgen 0.4 · Typst 0.15
PDF/A, PDF/UA, ZUGFeRD
MCP für KI-Agenten
01 — Einstieg

Warum Typst

Typst ist ein Satzsystem: Man schreibt Text mit wenigen Auszeichnungen in eine Datei, Typst setzt daraus ein PDF.

Gegenüber einer Textverarbeitung liegt alles in einer lesbaren Textdatei. Sie lässt sich versionieren, vergleichen und automatisch übersetzen – dieselbe Quelle ergibt dasselbe PDF. Gegenüber LaTeX ist die Syntax knapper, Fehlermeldungen nennen Datei, Zeile und Spalte, und Vorlagen sind Funktionen in einer richtigen Programmiersprache.

Überschriften beginnen mit =, Fettdruck steht zwischen Sternchen (*fett*), Funktionen beginnen mit #: #table(…), #image(…), #bibliography(…). Formeln stehen zwischen Dollarzeichen. Daten kommen per json(…), csv(…) oder yaml(…) direkt in das Dokument.

Dieser Leitfaden nutzt typstgen: ein kleines Werkzeug, das .typ-Dateien mit eingebetteter Typst-Engine zu PDF übersetzt – als Kommandozeile, als Rust-Bibliothek, als WebAssembly und als MCP-Server für KI-Agenten. Ein installiertes typst braucht es nicht.

Praxis-ExkursErstes Dokument

Ein Brief in zwanzig Zeilen

ZielEine Datei schreiben, übersetzen und sehen, wie typstgen einen Fehler meldet.

  1. 1

    Quelltext

    Seitenformat und Schrift setzen, dann normaler Text, eine Überschrift und eine Tabelle.

    #set page(paper: "a4", margin: 2.5cm)
    #set text(lang: "de", font: "Libertinus Serif", size: 11pt)
    
    #align(right)[Musterstadt, #datetime.today().display("[day].[month].[year]")]
    
    = Angebot für die Dokumentenstrecke
    
    Sehr geehrte Frau Beispiel,
    
    vielen Dank für Ihre Anfrage. Wir schlagen vor:
    
    #table(
      columns: (1fr, auto),
      table.header([*Leistung*], [*Preis*]),
      [Vorlagen für Brief und Rechnung], [1.200 €],
      [PDF-Erzeugung in der CI], [600 €],
    )
  2. 2

    Übersetzen

    typstgen schreibt das PDF neben die Quelle und gibt seinen Pfad aus.

    $ typstgen compile brief.typ
    brief.pdf
  3. 3

    Ein Tippfehler

    Aus table.header wird table.heder. typstgen bricht ab, nennt Datei, Zeile und Spalte und endet mit Exit-Code 1 – das brauchen später Skripte, CI und KI-Agenten.

    $ typstgen compile brief-fehler.typ
    error: typst compilation failed:
    brief-fehler.typ:14:9: error: function `table` does not contain field `heder`
Ergebnis

Ein PDF mit Datum, Überschrift und Tabelle. Das Datum kommt aus datetime.today(); wie man es für reproduzierbare Dateien festlegt, zeigt das Kapitel zum Archiv.

Erste Seite des Briefs: Ort und Datum rechts oben, Überschrift „Angebot für die Dokumentenstrecke“, Anrede und eine Tabelle mit zwei Leistungen und Preisen
brief.pdf, übersetzt mit typstgen.
02 — Überblick

Vom Datensatz zum geprüften Archiv

Ein Dokument entsteht aus Daten und einer Vorlage. Was danach passiert, entscheidet, ob man ihm in acht Jahren noch trauen kann.

check meldet Fehler mit Datei, Zeile und Spalte, preview zeigt eine Seite als Bild, compile schreibt das PDF – auf Wunsch als PDF/A und bei Rechnungen mit eingebettetem ZUGFeRD-XML.

Ein Manifest hält fest, woraus jedes PDF entstanden ist. verify baut es später neu und vergleicht Byte für Byte. Die drei Prüfschritte stehen auch einem KI-Agenten über MCP zur Verfügung.

Fokus
Ablauf mit typstgen
Ablauf mit typstgenDaten und Vorlage ergeben den Quelltext; check und preview zeigen Fehler und Layout, compile erzeugt das PDF/A (bei Rechnungen mit ZUGFeRD-XML) und protokolliert es im Manifest; verify belegt später, dass nichts verändert wurde.ErstellenPrüfenAblegenauch per MCP (KI-Agent)Daten → DokumentDokument → checkcheck → Fehlerfrei?Fehlerfrei? → Dokument: neinFehlerfrei? → preview: japreview → compilecompile → ManifestManifest → verify: später, in CIneinjaspäter, in CIDaten – JSON, BibTeXDatenJSON, BibTeXDokument – .typ + VorlageDokument.typ + Vorlagecheck – Fehler mit ZeilecheckFehler mit ZeileFehlerfrei?Fehlerfrei?preview – Seite als BildpreviewSeite als Bildcompile – PDF/A, ZUGFeRDcompilePDF/A, ZUGFeRDManifest – SHA-256ManifestSHA-256verify – Neubau identischverifyNeubau identisch

Quelle: typstgen 0.4 (Branch-Stand 11.10.2026)

Diagrammdaten anzeigen
Daten zu Ablauf mit typstgen
SchrittArtBahnGruppeFührt zu
DatenStartErstellenDokument
DokumentSchrittErstellencheck
checkSchrittPrüfenauch per MCP (KI-Agent)Fehlerfrei?
Fehlerfrei?EntscheidungPrüfenauch per MCP (KI-Agent)Dokument (nein), preview (ja)
previewSchrittPrüfenauch per MCP (KI-Agent)compile
compileSchrittAblegenManifest
ManifestSchrittAblegenverify (später, in CI)
verifyEndeAblegen
03 — Erstellen

Werkzeuge und Vorlagen

Für die meisten Dokumente reicht typstgen mit einer Vorlage. Wer Berichte aus Programmcode erzeugt, nimmt eine Bibliothek.

typstgen übersetzt beliebige .typ-Dateien. Vorlagen findet es über template_paths in typstgen.toml, Typst-Pakete wie @preview/… lädt es aus denselben Ordnern wie die Typst-CLI – oder gar nicht, wenn man es so einstellt.

business-templates bringt 19 Geschäftsdokumente als Typst-Paket mit: Rechnung, Angebot, Gutschrift, Mahnung, Lieferschein, Auftragsbestätigung, Brief, Zugangsdaten, Konzept, Vertrag, Dokumentation, Projektvorschlag, Protokoll, SLA, Spezifikation, Aufgabenliste, Stundenzettel und Handout. Buchhaltungsdokumente nehmen JSON-Daten, die übrigen benannte Parameter und den Text als Inhalt.

RenderReport ist eine Rust-Bibliothek für datengetriebene Berichte aus Komponenten (Kennzahlen, Befunde, Tabellen, Diagramme), mit Typst als eingebetteter Engine; jedes PDF entsteht als PDF/UA-1.

Vorlagen

Drei Dokumente aus business-templates

Angebot – Beispieldaten „it-consultant“.
Angebot mit Briefkopf, Empfängeradresse, Positionstabelle und Summen

Angebot – Beispieldaten „it-consultant“.

Projektvorschlag, Titelseite.
Titelseite eines Projektvorschlags mit Projektdaten in einem gerahmten Kasten und Schlagwörtern am unteren Rand

Projektvorschlag, Titelseite.

Besprechungsprotokoll, Titelseite.
Titelseite eines Besprechungsprotokolls mit Datum, Ort, Moderation, Teilnehmenden und Entschuldigten

Besprechungsprotokoll, Titelseite.

Erzeugt mit typstgen 0.4.1 aus den Beispieldaten im Repository typst-business-templates, 12.10.2026.

04 — Verwalten

Daten, Quelle, PDF – getrennt ablegen

Was sich ändert, sind die Daten. Was gleich bleibt, ist die Vorlage. Das PDF ist nur das Ergebnis.

Bewährt hat sich ein Ordner je Dokumentart und Jahr, der Dateiname ist die Dokumentnummer: invoices/2026/RE-2026-001.json enthält die Daten, RE-2026-001.typ daneben ist ein dünner Wrapper, der Vorlage und Daten zusammenführt. Stammdaten wie company.json liegen einmal zentral.

Daten, Wrapper und Manifest sind kleine Textdateien und gehören in die Versionsverwaltung; die Historie zeigt, wer was wann geändert hat. Die PDFs gehören ins Archiv, nicht ins Git – das Manifest verbindet beide.

Wer eine Wissensbasis für KI-Systeme pflegt, hält dort eine kompakte Zusammenfassung jedes Vorgangs und verweist mit document_id und typst_source auf die Quelle. Das System liest den Eintrag, der Kunde bekommt das PDF; PDFs gehören nicht in den Suchindex.

05 — Wissenschaftlich arbeiten

Seminararbeit mit Literaturverzeichnis

Titelblatt, Verzeichnisse, Formeln, Zitate und Anhang kommen aus einem Paket – die Arbeit selbst ist nur Text.

Die Vorlage @local/thesis liegt im Beispielordner von typstgen. Sie setzt Titelblatt, Zusammenfassung, Inhalts-, Abbildungs- und Tabellenverzeichnis, römische und arabische Seitenzahlen, nummerierte Formeln, Literaturverzeichnis, Anhang und Eigenständigkeitserklärung – auf Deutsch oder Englisch.

Zitiert wird mit @schlüssel aus einer BibTeX- oder Hayagriva-Datei; Typst bringt die Stile mit, etwa APA, IEEE, Chicago oder DIN ISO 690. Abbildungen wie Ablaufdiagramme kommen als SVG, zum Beispiel aus Chartlet.

Seite einer Seminararbeit mit nummerierten Kapiteln, einer Formel, Zitaten im APA-Stil und einer Tabelle
examples/thesis.pdf, Seite 4 – PDF/A-2b.
Praxis-ExkursWissenschaft

Eine Arbeit offline und reproduzierbar bauen

ZielDie Seminararbeit als PDF/A-2b übersetzen, ohne dass etwas aus dem Netz nachgeladen wird.

  1. 1

    Konfiguration

    Die Vorlage liegt als Paket im Projekt; Downloads und Systemschriften sind aus.

    # typstgen.toml
    template_paths = ["templates"]
    package_path = "packages"      # enthält local/thesis/0.1.0
    download_packages = false      # nichts nachladen
    use_system_fonts = false
  2. 2

    Übersetzen

    Norm und Zeitstempel festlegen – zwei Läufe ergeben byte-gleiche Dateien.

    $ typstgen compile thesis.typ --config typstgen.toml \
        --pdf-standard a-2b --creation-timestamp 1759276800
    thesis.pdf
  3. 3

    Wenn ein Paket fehlt

    Mit download_packages = false bricht der Build ab, statt etwas nachzuladen:

    Ausgabe
    error: typst compilation failed:
    paper.typ:1:9: error: package not found (searched for @preview/oxifmt:0.2.1)
Ergebnis

Sieben Seiten mit Verzeichnissen, einer Chartlet-Abbildung, Formel, Tabelle und fünf echten Quellen im APA-Stil; veraPDF meldet PDF/A-2b-konform.

Seite der Seminararbeit mit einem Ablaufdiagramm in drei Spalten (Quellen, Übersetzung, Archiv), darunter eine Tabelle und ein Codeblock
Abbildung 1, erstellt mit Chartlet, Seite 5.
06 — Unternehmen

Rechnungen mit ZUGFeRD

Seit 2025 müssen Unternehmen E-Rechnungen empfangen können; ausstellen müssen sie sie spätestens ab 2028.

Eine ZUGFeRD-Rechnung ist ein PDF/A-3, das dieselben Angaben zusätzlich als XML trägt (UN/CEFACT CII, Profil EN 16931). Umsatzsteuerlich ist das XML der führende Teil.

typstgen erzeugt das XML aus denselben JSON-Daten, aus denen die Rechnungsvorlage das PDF setzt. Vorher rechnet es Positionen, Steuer je Kategorie und Summen nach; weichen die Zahlen im JSON ab, bricht der Build ab – sonst zeigte das PDF etwas anderes als das XML. Abgedeckt sind Normal- und ermäßigter Satz, 0 %, steuerbefreit mit Begründung und Reverse Charge.

E-Rechnungspflicht im inländischen B2B-Verkehr
E-Rechnungspflicht im inländischen B2B-VerkehrSeit 2025 müssen Unternehmen E-Rechnungen empfangen können. Papier- und andere Rechnungen sind beim Ausstellen bis Ende 2026 erlaubt, 2027 nur noch bei höchstens 800.000 Euro Vorjahresumsatz; ab 2028 ist die E-Rechnung allgemein Pflicht.01.202507.202501.202607.202601.202707.202701.2028Empfang Pflicht: 01.01.202501.01.2025Empfang PflichtPapier und andere Formate erlaubt: 01.01.2025 – 31.12.202601.01.2025 – 31.12.2026Papier und andere Formate erlaubtnur bis 800.000 € Vorjahresumsatz: 01.01.2027 – 31.12.202701.01.2027 – 31.12.2027nur bis 800.000 € VorjahresumsatzEDI-Verfahren zulässig: 01.01.2025 – 31.12.202701.01.2025 – 31.12.2027EDI-Verfahren zulässigE-Rechnung allgemein Pflicht: 01.01.202801.01.2028E-Rechnung allgemein Pflicht

Quelle: § 27 Abs. 38 UStG; BMF-Schreiben vom 15.10.2024 und 15.10.2025 (Stand 11.10.2026)

Diagrammdaten anzeigen
Daten zu E-Rechnungspflicht im inländischen B2B-Verkehr
EintragArtBeginnEndeNach
Empfang PflichtMeilenstein01.01.2025
Papier und andere Formate erlaubtPhase01.01.202531.12.2026
nur bis 800.000 € VorjahresumsatzPhase01.01.202731.12.2027Papier und andere Formate erlaubt
EDI-Verfahren zulässigPhase01.01.202531.12.2027
E-Rechnung allgemein PflichtMeilenstein01.01.2028nur bis 800.000 € Vorjahresumsatz, EDI-Verfahren zulässig
Praxis-ExkursE-Rechnung

Eine Rechnung als ZUGFeRD erzeugen und prüfen

ZielAus rechnung.json und company.json ein PDF/A-3 mit eingebettetem XML erzeugen und mit dem Mustang-Validator prüfen.

  1. 1

    Dokument

    Zwei Zeilen: Vorlage laden, Daten übergeben. Das Paket liegt im Repository typst-business-templates unter packages/local/business-templates/0.1.0, package_path in typstgen.toml zeigt darauf.

    #import "@local/business-templates:0.1.0": invoice
    #invoice(data: json("/rechnung.json"), company: json("/company.json"))
  2. 2

    Übersetzen

    --zugferd und --company erzeugen das XML aus denselben Daten und betten es als factur-x.xml ein.

    $ typstgen compile rechnung.typ --pdf-standard a-3b \
        --creation-timestamp 1737500000 \
        --zugferd rechnung.json --company company.json
    rechnung.pdf
  3. 3

    Prüfen

    Mustang prüft das PDF/A-3 und das XML gegen EN 16931.

    $ java -jar Mustang-CLI-2.26.0.jar --action validate --source rechnung.pdf
    … Parsed PDF:valid XML:valid … Profile:urn:cen.eu:en16931:2017 Version:2 … Errors:[]
  4. 4

    Wenn die Daten nicht stimmen

    Alle Probleme auf einmal, jeweils mit dem Feld, das sie behebt:

    Ausgabe
    error: ZUGFeRD invoice:
    recipient.address.country: unknown country, set recipient.address.country_code (ISO 3166-1, e.g. "DE")
    items[0]: unit "Kisten" has no UN/ECE code, set items[0].unit_code (e.g. "C62")
    items[1]: total 1.00 does not match quantity × unit price = 11200.00
Ergebnis

Ein gültiges ZUGFeRD-PDF im Profil EN 16931; veraPDF meldet PDF/A-3b-konform. Geprüft wurden außerdem gemischte Steuersätze, Reverse Charge und eine steuerbefreite Rechnung.

Erste Seite einer Rechnung mit Absender, Empfänger, Positionstabelle und Summen; oben rechts ein Platzhalter für das Logo
Rechnung aus dem Beispiel „it-consultant“; die Beispielfirma hat kein Logo.
07 — Archivieren

Aufbewahren und nachweisen

PDF/A sorgt dafür, dass eine Datei lesbar bleibt. Dass sie unverändert ist, muss man zusätzlich belegen.

typstgen compile --manifest archive.json schreibt zu jedem PDF auf, aus welcher Quelle, mit welchen Optionen und aus welchen Dateien es entstand – mit SHA-256 von PDF, Vorlagen, Daten, Bildern, Paketdateien und Schriften.

typstgen verify prüft später drei Dinge: Das abgelegte PDF ist unverändert, ein Neubau liest dieselben Dateien, und er ergibt dieselben Bytes. Damit das gelingt, braucht jedes Dokument einen festen Zeitstempel und festgelegte Schriften und Pakete.

Aufbewahrungsfristen seit 1. Januar 2025
Aufbewahrungsfristen seit 1. Januar 2025Bücher und Jahresabschlüsse zehn Jahre, Rechnungen und andere Buchungsbelege acht Jahre, Handels- und Geschäftsbriefe sechs Jahre.0246810JahreBücher, Jahresabschlüsse: 1010Bücher, JahresabschlüsseRechnungen, Buchungsbelege: 88Rechnungen, BuchungsbelegeHandels- und Geschäftsbriefe: 66Handels- und Geschäftsbriefe

Quelle: § 147 Abs. 3 AO, § 257 Abs. 4 HGB, § 14b UStG (Stand 11.10.2026)

Diagrammdaten anzeigen
Daten zu Aufbewahrungsfristen seit 1. Januar 2025
KategorieWert
Bücher, Jahresabschlüsse10
Rechnungen, Buchungsbelege8
Handels- und Geschäftsbriefe6
Praxis-ExkursArchiv

Einen Build protokollieren und prüfen

ZielEin PDF mit Manifest erzeugen, prüfen, eine Änderung an der Quelle vornehmen und sehen, was verify meldet.

  1. 1

    Protokollieren und prüfen

    $ typstgen compile brief.typ --pdf-standard a-2b \
        --creation-timestamp 1790000000 --manifest archive.json
    brief.pdf
    $ typstgen verify
    ok      brief.pdf
    1 of 1 documents verified
  2. 2

    Die Quelle ändert sich

    Ein Preis in brief.typ wird geändert, ohne neu zu protokollieren. verify nennt die Datei und endet mit Exit-Code 1.

    $ typstgen verify
    FAILED  brief.pdf
            changed: brief.typ
            the rebuild differs from the recorded PDF
    0 of 1 documents verified
Ergebnis

Jede Änderung an Quelle, Daten, Vorlage, Paket oder Schrift fällt auf – ebenso ein verändertes PDF. Wird die Änderung zurückgenommen, meldet verify wieder „1 of 1 documents verified“.

08 — Automatisieren

Prüfen vor jedem Push

Lokal ist die Prüfung verbindlich, in der CI ist sie der Nachweis beim Release.

Vor jedem Push läuft typstgen verify – als Skript oder als pre-push-Hook. In der CI fehlen die PDFs, weil sie im Archiv liegen; dort prüft verify --rebuild-only nur, ob jede Quelle die protokollierten Bytes ergibt.

Damit ein Neubau auf einem anderen Rechner gleich ausfällt, gehören Schriften und Pakete ins Repository: use_system_fonts = false, font_paths = ["fonts"], package_path mit download_packages = false. Eine Vorlage, die eine Systemschrift wie Helvetica anfordert, sieht unter Linux sonst anders aus.

GitHub Actions

verify als Release-Prüfung

.github/workflows/verify.ymlYAML
on:
  push:
    tags: ["v*"]
  workflow_dispatch:

jobs:
  verify:
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - run: cargo install typstgen --version 0.4.1 --locked
      - run: typstgen verify archive.json --rebuild-only
09 — KI einbinden

Ein Agent, der seine Fehler selbst findet

Ein KI-Agent schreibt Typst schnell – und macht Fehler. Über MCP kann er sie selbst finden und beheben.

typstgen mcp ist ein Model-Context-Protocol-Server auf stdin/stdout. Er stellt vier Werkzeuge bereit: check (Fehler mit Zeile und Spalte, schreibt nichts), preview (eine Seite als Bild), compile (PDF, auf Wunsch als PDF/A oder ZUGFeRD) und list_templates. Alle Pfade sind auf das Arbeitsverzeichnis beschränkt.

Bewährt hat sich eine Arbeitsteilung: Der Agent schreibt Daten (JSON) und Text, die Vorlage sorgt für das Layout, ein Mensch prüft das Ergebnis vor dem Versand. Für E-Rechnungen kommen die Daten aus der Buchhaltung, nicht aus dem Sprachmodell.

Praxis-ExkursKI & MCP

Eine MCP-Sitzung: prüfen, korrigieren, übersetzen

Zieltypstgen in Claude Code einbinden und verfolgen, wie ein Agent ein fehlerhaftes Angebot repariert.

  1. 1

    Einrichten

    Für das aktuelle Projekt; andere MCP-Clients starten denselben Befehl.

    $ claude mcp add typstgen -- typstgen mcp --root .
  2. 2

    Fehler finden

    Der Agent ruft check auf und bekommt die Fehlermeldung als Werkzeugergebnis.

    Ausgabe
    check  angebot.typ
    → typst compilation failed:
      angebot.typ:14:9: error: function `table` does not contain field `heder`
  3. 3

    Korrigieren und übersetzen

    Nach der Korrektur in Zeile 14: erneut prüfen, Seite 1 ansehen, als PDF/A-2b übersetzen.

    Ausgabe
    check    angebot.typ   → ok, 1 page
    preview  angebot.typ   → image/png (Seite 1)
    compile  angebot.typ, pdf_standards ["a-2b"]
             → wrote angebot.pdf (21090 bytes), 1 page
Ergebnis

Die Sitzung lief über das echte Protokoll (JSON-RPC über stdio); die Ausgaben oben sind die Werkzeugergebnisse, gekürzt auf das Wesentliche.

Nachschlagen

Häufige Fragen

Muss Typst installiert sein?

Nein. typstgen bringt Typst als Bibliothek mit. Für eigene Experimente lohnt sich trotzdem der Editor auf typst.app.

Ist PDF/A Pflicht?

Gesetzlich nicht (Stand 11.10.2026). PDF/A ist der Container von ZUGFeRD und für die Langzeitarchivierung üblich.

Kann ich meine LaTeX-Arbeit übernehmen?

BibTeX-Dateien lassen sich direkt weiterverwenden. Den Text überträgt man von Hand oder mit Konvertern; Formeln sind in Typst kürzer, aber anders geschrieben.

Warum gehören PDFs nicht ins Git?

Sie sind Ergebnisse. Ins Git gehören Daten, Quellen und das Manifest; aus ihnen entsteht das PDF jederzeit neu, und verify belegt, dass es dasselbe ist.

Was passiert mit einem Typst-Update?

Eine neue Typst-Version kann anders setzen. verify nennt dann beide Versionen; archivierte PDFs bleiben gültig, ein Neubau sollte mit der protokollierten Version laufen.