Dokumente, die man
nachbauen kann
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).
Die Kapitel bauen aufeinander auf, lassen sich aber auch einzeln nachschlagen. Die Praxis-Exkurse zeigen echte Befehle mit echter Ausgabe.
- Kapitel 01Warum TypstEinstieg
- Kapitel 02Vom Datensatz zum geprüften ArchivÜberblick
- Kapitel 03Werkzeuge und VorlagenErstellen
- Kapitel 04Daten, Quelle, PDF – getrennt ablegenVerwalten
- Kapitel 05Seminararbeit mit LiteraturverzeichnisWissenschaftlich arbeiten
- Kapitel 06Rechnungen mit ZUGFeRDUnternehmen
- Kapitel 07Aufbewahren und nachweisenArchivieren
- Kapitel 08Prüfen vor jedem PushAutomatisieren
- Kapitel 09Ein Agent, der seine Fehler selbst findetKI einbinden
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.
Ein Brief in zwanzig Zeilen
ZielEine Datei schreiben, übersetzen und sehen, wie typstgen einen Fehler meldet.
- 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
Übersetzen
typstgen schreibt das PDF neben die Quelle und gibt seinen Pfad aus.
$ typstgen compile brief.typ brief.pdf - 3
Ein Tippfehler
Aus
table.headerwirdtable.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`
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
Quelle: typstgen 0.4 (Branch-Stand 11.10.2026)
Diagrammdaten anzeigen
| Schritt | Art | Bahn | Gruppe | Führt zu |
|---|---|---|---|---|
| Daten | Start | Erstellen | Dokument | |
| Dokument | Schritt | Erstellen | check | |
| check | Schritt | Prüfen | auch per MCP (KI-Agent) | Fehlerfrei? |
| Fehlerfrei? | Entscheidung | Prüfen | auch per MCP (KI-Agent) | Dokument (nein), preview (ja) |
| preview | Schritt | Prüfen | auch per MCP (KI-Agent) | compile |
| compile | Schritt | Ablegen | Manifest | |
| Manifest | Schritt | Ablegen | verify (später, in CI) | |
| verify | Ende | Ablegen |
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.
Drei Dokumente aus business-templates
Erzeugt mit typstgen 0.4.1 aus den Beispieldaten im Repository typst-business-templates, 12.10.2026.
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.
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.
Eine Arbeit offline und reproduzierbar bauen
ZielDie Seminararbeit als PDF/A-2b übersetzen, ohne dass etwas aus dem Netz nachgeladen wird.
- 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
Ü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
Wenn ein Paket fehlt
Mit
download_packages = falsebricht der Build ab, statt etwas nachzuladen:Ausgabeerror: typst compilation failed: paper.typ:1:9: error: package not found (searched for @preview/oxifmt:0.2.1)
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.
Quelle: § 27 Abs. 38 UStG; BMF-Schreiben vom 15.10.2024 und 15.10.2025 (Stand 11.10.2026)
Diagrammdaten anzeigen
| Eintrag | Art | Beginn | Ende | Nach |
|---|---|---|---|---|
| Empfang Pflicht | Meilenstein | 01.01.2025 | ||
| Papier und andere Formate erlaubt | Phase | 01.01.2025 | 31.12.2026 | |
| nur bis 800.000 € Vorjahresumsatz | Phase | 01.01.2027 | 31.12.2027 | Papier und andere Formate erlaubt |
| EDI-Verfahren zulässig | Phase | 01.01.2025 | 31.12.2027 | |
| E-Rechnung allgemein Pflicht | Meilenstein | 01.01.2028 | nur bis 800.000 € Vorjahresumsatz, EDI-Verfahren zulässig |
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
Dokument
Zwei Zeilen: Vorlage laden, Daten übergeben. Das Paket liegt im Repository typst-business-templates unter
packages/local/business-templates/0.1.0,package_pathintypstgen.tomlzeigt darauf.#import "@local/business-templates:0.1.0": invoice #invoice(data: json("/rechnung.json"), company: json("/company.json")) - 2
Übersetzen
--zugferdund--companyerzeugen das XML aus denselben Daten und betten es alsfactur-x.xmlein.$ typstgen compile rechnung.typ --pdf-standard a-3b \ --creation-timestamp 1737500000 \ --zugferd rechnung.json --company company.json rechnung.pdf - 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
Wenn die Daten nicht stimmen
Alle Probleme auf einmal, jeweils mit dem Feld, das sie behebt:
Ausgabeerror: 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
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.
Quelle: § 147 Abs. 3 AO, § 257 Abs. 4 HGB, § 14b UStG (Stand 11.10.2026)
Diagrammdaten anzeigen
| Kategorie | Wert |
|---|---|
| Bücher, Jahresabschlüsse | 10 |
| Rechnungen, Buchungsbelege | 8 |
| Handels- und Geschäftsbriefe | 6 |
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
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
Die Quelle ändert sich
Ein Preis in
brief.typwird geändert, ohne neu zu protokollieren.verifynennt 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
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“.
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.
verify als Release-Prüfung
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-onlyEin 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.
Eine MCP-Sitzung: prüfen, korrigieren, übersetzen
Zieltypstgen in Claude Code einbinden und verfolgen, wie ein Agent ein fehlerhaftes Angebot repariert.
- 1
Einrichten
Für das aktuelle Projekt; andere MCP-Clients starten denselben Befehl.
$ claude mcp add typstgen -- typstgen mcp --root . - 2
Fehler finden
Der Agent ruft
checkauf und bekommt die Fehlermeldung als Werkzeugergebnis.Ausgabecheck angebot.typ → typst compilation failed: angebot.typ:14:9: error: function `table` does not contain field `heder` - 3
Korrigieren und übersetzen
Nach der Korrektur in Zeile 14: erneut prüfen, Seite 1 ansehen, als PDF/A-2b übersetzen.
Ausgabecheck 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
Die Sitzung lief über das echte Protokoll (JSON-RPC über stdio); die Ausgaben oben sind die Werkzeugergebnisse, gekürzt auf das Wesentliche.
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.



