Typst: eine leicht zu lernende Alternative zu LaTeX
(github.com/typst)- Typst ist ein markupbasiertes Satzsystem, das die Leistungsfähigkeit von LaTeX anstrebt, dabei aber leichter zu lernen und zu verwenden sein soll; dieses Repository enthält den Compiler und die CLI, die zum lokalen Kompilieren von Dokumenten benötigt werden
- Es bietet integriertes Markup für grundlegende Formatierungsaufgaben, flexible Funktionen, integriertes Scripting, Formelsatz, Literaturverwaltung und hilfreiche Fehlermeldungen
- Mit inkrementeller Kompilierung zielt Typst auf kurze Compile-Zeiten ab;
typst watchüberwacht Änderungen am Quelltext und kompiliert schneller neu, als jedes Mal von vorn zu beginnen - Die CLI kann über Release-Binaries, Paketmanager,
cargo, Nix und Docker installiert werden; mittypst compile file.typwird ein PDF erzeugt, zudem lassen sich benutzerdefinierte Font-Pfade angeben - Die Designprinzipien sind Einfachheit durch Konsistenz, Leistungsfähigkeit durch Kombinierbarkeit und Performance durch Inkrementalität; Ziel ist eine Geschwindigkeit, die eine sofortige Vorschau ermöglicht
Was Typst bietet
- Typst ist ein markupbasiertes Satzsystem, das so leistungsfähig wie LaTeX sein soll, aber leichter zu lernen und zu verwenden ist
- Die wichtigsten Funktionen sind:
- Integriertes Markup für häufige Formatierungsaufgaben
- Flexible Funktionen für alles Weitere
- Ein eng integriertes Scripting-System
- Formelsatz, Literaturverwaltung und mehr
- Kurze Compile-Zeiten durch inkrementelle Kompilierung
- Hilfreiche Fehlermeldungen, wenn etwas schiefläuft
- Dieses Repository enthält den Typst-Compiler und die CLI, die zum lokalen Kompilieren von Typst-Dokumenten benötigt werden
- Für eine bessere Schreibumgebung kann der kostenlose kollaborative Online-Editor verwendet werden
Syntax und Schreibmodell
- Typst verwendet set rules wie
#set, um Eigenschaften von Elementen festzulegen, etwa Seitengröße oder Nummerierung von Überschriften- Wenn die Höhe von
pageaufautogesetzt wird, passt sich die Größe an den Inhalt an - Für vollständigere Kontrolle lässt sich das Erscheinungsbild eines Elements mit show rules komplett neu definieren
- Wenn die Höhe von
- Überschriften werden mit der Syntax
= Headinggeschrieben- Ein einzelnes
=erzeugt eine Überschrift oberster Ebene,==eine Unterüberschrift - Die vollständige Liste des leichtgewichtigen Markups ist in der syntax-Dokumentation zu finden
- Ein einzelnes
- Formeln werden in Dollarzeichen eingeschlossen
- Fügt man um den Formelinhalt zusätzliche Leerzeichen ein, kann er als eigener Block gesetzt werden
- Bezeichner mit mehreren Buchstaben werden als Typst-Definitionen und Funktionen interpretiert, wenn sie nicht in Anführungszeichen stehen
- Für Einträge wie
floorodersqrtist kein Backslash nötig phi.altwendet den Modifikatoraltaufphian und wählt damit eine bestimmte Symbolvariante aus
- Scripting erfolgt, indem nach einem Hash-Zeichen (
#) ein Ausdruck in das Dokument geschrieben wird- Das Beispiel berechnet mit zwei Variablen und einer rekursiven Funktion die n-te Fibonacci-Zahl
- Die Funktion
tablenimmt Zellen zeilenweise entgegen - Der Spread-Operator
..wird verwendet, um Array-Elemente als einzelne Argumente zu übergeben
Installation und Nutzung der CLI
- Die Typst-CLI kann auf mehreren Wegen installiert werden
- Quellcode und vorgebaute Binaries der neuesten Version sind auf der releases page verfügbar
- Das Binary wird in einem Verzeichnis abgelegt, das in
PATHenthalten ist, und kann anschließend mittypst updateaktualisiert werden - Versionen aus Paketmanagern können hinter dem neuesten Release zurückliegen
- Beispiele für die Installation über Paketmanager:
- Linux: Typst on Repology, Typst's Snap
- macOS:
brew install typst - Windows:
winget install --id Typst.Typst
- Wenn eine Rust-Toolchain vorhanden ist, ist die Installation mit
cargomöglich- Neueste Version:
cargo install --locked typst-cli - Entwicklungsversion:
cargo install --git https://github.com/typst/typst --locked typst-cli
- Neueste Version:
- Nix und Docker werden ebenfalls unterstützt
- Nix:
nix-shell -p typst - Typst-Flake:
nix run github:typst/typst-flake -- --version - Docker:
docker run ghcr.io/typst/typst:latest --help
- Nix:
- Der grundlegende Compile-Befehl lautet:
typst compile file.typ: erzeugtfile.pdfim Arbeitsverzeichnistypst compile path/to/source.typ path/to/output.pdf: erzeugt ein PDF im angegebenen Pfad
- Die Überwachung von Änderungen wird mit
typst watch file.typgestartet- Typst nutzt inkrementelle Kompilierung und ist daher schneller, als jedes Mal von vorn zu kompilieren
- Es gibt auch fontbezogene Befehle
typst compile --font-path path/to/fonts file.typ: gibt ein zusätzliches Suchverzeichnis für Fonts antypst fonts --font-path path/to/fonts: gibt die Liste der Fonts aus, die im System und im angegebenen Verzeichnis gefunden wurdenTYPST_FONT_PATHS=path/to/fonts typst fonts: Umgebungsvariablen-Variante in Linux-Syntax
- Weitere Unterbefehle und Optionen sind mit
typst helpzu finden, Hilfe zu einem bestimmten Befehl mittypst help watch
Editor-Umgebung und Community
- Wer eine IDE-ähnliche integrierte Umgebung, Autovervollständigung und sofortige Vorschau benötigt, kann die kostenlose Typst-Web-App nutzen
- Der von der Community entwickelte Language Server Tinymist ist in mehrere Editor-Erweiterungen integriert
- Zentrale Community-Orte sind das Forum und der Discord server
- Das Forum eignet sich für Fragen, Hilfe für andere Nutzer und das Teilen von Ergebnissen, die mit Typst erstellt wurden
- Discord eignet sich eher für kurze Fragen, Diskussionen rund um Beiträge und Chats
- Typst Universe ist ein Ort, an dem die Community Vorlagen und Pakete teilt
- Eigene Pakete können im package repository eingereicht werden
Beiträge und Build
- Bei Bugs kann ein Issue eröffnet werden; wer neue Funktionen oder Bugfixes implementieren möchte, folgt dem contribution guide
- Für einen eigenen Build wird zunächst die aktuelle stabile Rust-Version installiert, anschließend werden folgende Befehle ausgeführt:
git clone https://github.com/typst/typstcd typstcargo build --release
- Das optimierte Binary wird unter
target/release/abgelegt - Auch das Teilen von Paketen mit der Community ist eine Möglichkeit beizutragen
Aussprache und Schreibweise des Namens
- Die IPA-Aussprache von Typst ist
/taɪpst/ "Ty"wird wie dasTyin Typesetting ausgesprochen,"pst"wie daspstin Hipster- Bei der Schreibweise von Typst wird der Name als Eigenname behandelt und mit großem
Tgeschrieben
Designprinzipien
- Typst ist um die drei Ziele Power, simplicity, performance herum entworfen
- Ziel ist ein System, das an die Leistungsfähigkeit von LaTeX heranreicht, leicht zu lernen und zu verwenden ist und schnell genug für eine sofortige Vorschau arbeitet
-
Einfachheit durch Konsistenz
- Wer in Typst weiß, wie man eine Sache erledigt, sollte dieses Wissen auf andere Aufgaben übertragen können
- Wenn es mehrere Wege gibt, dasselbe zu tun, sollten sie auf unterschiedlichen Abstraktionsebenen liegen
= Introductionund#heading[Introduction]sind ein zulässiges Beispiel dafür, dass zwei Varianten dasselbe tun, weil Erstere syntaktischer Zucker für Letztere ist
-
Leistungsfähigkeit durch Kombinierbarkeit
- Statt für alles Einstellungen vorzusehen, setzt Typst auf wenige Bausteine, die sich auf verschiedene Weise kombinieren lassen
- Auch TeX ist ein kombinierbares Low-Level-System, doch Menschen verwenden stattdessen LaTeX
- Bei LaTeX ist man in vielen Fällen auf Pakete in der Art von
\usepackage{knob}angewiesen
-
Performance durch Inkrementalität
- Alle Sprachfunktionen von Typst müssen zur inkrementellen Kompilierung passen
comemoübernimmt im Hintergrund einen großen Teil der Arbeit rund um inkrementelle Kompilierung
Sponsoring und Unterstützung
- Als wichtige Unterstützung für die Open-Source-Arbeit an Typst werden folgende Punkte aufgeführt:
- Posit: Finanzierung eines Vollzeit-Compiler-Engineers
- NLnet: Unterstützung der Arbeit an Typst durch mehrere Förderungen über den NGI Zero Core-Fonds
- Arbeit an HTML export
- Arbeit an PDF accessibility
- Science & Startups: Finanzierung der Typst-Entwicklung von Januar bis Juni 2023 über das Berlin Startup Scholarship
- Zerodha: einmaliges Sponsoring
- Diese Liste enthält nur Beiträge zur Open-Source-Arbeit, die 10.000 € überschritten haben oder voraussichtlich überschreiten werden
2 Kommentare
Liest man
LeTeXals „Latex“? Ich hätte gedacht, man spricht es als „Laytech“ aus.Hacker-News-Meinungen
Typst war ziemlich großartig, und auch unsere Organisation ist sehr zufrieden damit.
Wir müssen jede Nacht mehr als 1,5 Millionen PDFs erzeugen und haben dafür verschiedene Lösungen ausprobiert, darunter Puppeteer für HTML→PDF-Konvertierung, pdflatex und lualatex. Typst war um Größenordnungen schneller und zugleich ressourcenschonender.
Die Developer Experience beim Erstellen von PDF-Templates in LaTeX war nicht gut, aber Typst-Templates waren ziemlich intuitiv.
Über diesen Stack zur PDF-Erzeugung in großem Maßstab habe ich ausführlicher im Blog geschrieben: https://zerodha.tech/blog/1-5-million-pdfs-in-25-minutes
Ich baue ein Puppeteer-basiertes Produkt für Massen-PDF-Reporting, und mit nächtlichen Jobs, Caching und Parallelisierung ist die Performance ganz ordentlich.
https://www.cx-reports.com
Als ich vor langer Zeit ein ähnliches Problem lösen musste, war es eine gute Lösung.
Der Maßstab war zwar nicht so groß, aber trotzdem brauchbar.
Ich habe viele Hausarbeiten mit Typst geschrieben, und akademisches Schreiben wird dadurch knapper, immersiver und, ich wage es zu sagen, unterhaltsamer.
Durch den funktionalen Charakter der Typst-Syntax muss man sich nicht mit dem sprunghaften Verhalten herumschlagen, das man heutzutage in Microsoft Word und manchmal auch in Google Docs sieht.
Mit einer lokalen IDE wie VSCode bekommt man nahezu alle gewünschten Funktionen.
Verglichen mit LaTeX ist der Schriftsatz ganzer Dokumente deutlich intuitiver, aber wenn ich längere Herleitungen von Gleichungen über mehrere Seiten hinweg schreibe, fühlt sich LaTeX leichter zu tippen an.
Die LaTeX-Syntax ist eher Markdown als einer funktionalen Programmiersprache ähnlich, sodass man beim Setzen von Formeln mit vielen Funktionen, Hoch- und Tiefstellungen weniger im Voraus nachdenken muss.
Im Moment würde ich eine wissenschaftliche Arbeit wohl nicht in Typst schreiben.
Sobald sie die eigene Institution verlässt, muss man sie fast zwangsläufig konvertieren, und auch arXiv verlangt LaTeX-Quellcode.
Die Tools rund um LaTeX sind heute ziemlich gut, und es gibt viele hilfreiche IDEs.
Persönlich nutze ich Org-Mode in Emacs, der nach LaTeX kompiliert.
https://github.com/mitex-rs/mitex
Es gibt mehrere frühere Diskussionen und verwandte Materialien: https://hn.algolia.com/?q=typst
Vor 1 Jahr, 146 Kommentare: https://news.ycombinator.com/item?id=35250210
Vor 8 Monaten, 34 Kommentare: https://news.ycombinator.com/item?id=38354422
Vor 2 Jahren, 53 Kommentare: https://news.ycombinator.com/item?id=34423590
Vor 2 Jahren, 30 Kommentare: https://news.ycombinator.com/item?id=32209794
Es überrascht mich, dass HTML-Ausgabe nicht von Anfang an eine Kernfunktion war, sondern derzeit noch in Arbeit ist.
Dass LaTeX ein schwieriges Verhältnis zum Web hat, wirkt wie ein Punkt, den ein neu gestartetes Konkurrenzprojekt schon früh richtig hätte lösen wollen.
[0] https://github.com/typst/typst/issues/721
Beide stehen vor demselben Problem: Web und Papier funktionieren völlig unterschiedlich, und es gibt Konzepte, die sich nicht ineinander übersetzen lassen.
Deshalb muss definiert werden, wie sich gesetzte Ergebnisse in einer anderen Umgebung natürlich einfügen.
Wenn Typst von Anfang an HTML zum Ziel gehabt hätte, wäre die Entwicklung viel einfacher gewesen; dann wäre es aber kaum mehr gewesen als ein übermäßig komplexer Site-Generator.
Dass zuerst PDF anvisiert wurde, zeigt meiner Ansicht nach, dass es tatsächlich mit LaTeX konkurrieren soll.
Wenn man ein neues Markup-System startet und keinen Plan hat, barrierefreie Dokumente zu erstellen, halte ich das für eine sehr schlechte Entscheidung.
Bis Typst barrierefreie Dokumente erzeugen kann, werde ich es nicht verwenden.
Ich mag PDFs nicht.
Ich warte darauf, dass LaTeX verschwindet und Typst an seine Stelle tritt.
Die Nutzungserfahrung ist völlig anders, und die Ergebnisse sind sehr beeindruckend.
Bisher habe ich TeX-Dateien mit Jinja2-Templates erzeugt, aber Typst kann JSON über die Kommandozeile entgegennehmen, ist einfach zu verwenden und leistungsfähig genug, sodass ich den Python-Schritt komplett entfernen kann.
Ganz zu schweigen davon, dass die Kompilierzeit im Millisekundenbereich liegt.
Anfangs habe ich, weil ich an die Arbeitsweise mit LaTeX gewöhnt war, versucht, Typst-Templates mit Go-Templates zu erzeugen.
Dann habe ich erfreut festgestellt, dass Typst in seiner eigenen Scripting-Engine JSON direkt und einfach verwenden kann.
1999 arbeitete ich als Praktikant und war damit betraut, ein Standarddokument für die VoIP-Telefonie-Standardarbeitsgruppe der TIA zu schreiben.
Die Standardisierungsorganisation hatte eine Word-Vorlage, die alle verwendeten, aber als Ingenieurstudent hatte ich schon eine Weile LaTeX benutzt und mochte es. Also dachte ich: „Am Ende ist die Ausgabe sowieso PDF, und die Formatierung wäre auch besser – warum also nicht LaTeX verwenden?“
Tatsächlich sah die LaTeX-Ausgabe besser aus, und mein Chef mochte das Ergebnis, ohne überhaupt zu wissen, dass ich kein Word verwendet hatte.
Auch die Mitglieder der Arbeitsgruppe reagierten positiv; die Stimmung war ungefähr: „Der Junge hat wirklich Talent.“
Für ein Startup war es enorm wichtig für die Zukunft des Unternehmens, vielleicht sogar für sein Überleben, bei den in der Arbeitsgruppe vertretenen Großunternehmen einen guten Eindruck zu hinterlassen.
Eines Tages sagte mein Chef jedoch: „Kannst du dieses Word-Dokument an einen hohen Herrn bei einem Großunternehmen schicken, das uns vielleicht übernimmt? Er möchte es als neue Dokumentvorlage verwenden.“ Da bekam ich dieses absackende Gefühl, wie damals mit vier Jahren, als ich mit einem Freund aus Experimentierfreude in den Kleiderschrank gepinkelt hatte und meine Mutter uns erwischte.
Am Ende engagierte ich einen Freund, der es das ganze Wochenende über mühsam in Word neu erstellte, und mein Chef bekam das Dokument.
18 Monate später wurde das Unternehmen für 100 Millionen Dollar übernommen.
Wie auch immer: LaTeX sieht immer noch 1000-mal besser aus als Word.
Das wirkt wie ein Konkurrent zu Diensten wie Overleaf oder CodiMD.
Es ist zwar wieder eine andere Syntax, aber pandoc scheint sie zu unterstützen.
In letzter Zeit programmiere ich viel in R und nutze daher immer häufiger Quarto, das insbesondere recht gute Ausgaben wie HTML erzeugt.
Aber auch solche Tools lösen zwei in der Wissenschaft wichtige Probleme nicht: Reviewern einen guten Diff zu liefern und Dokumente leicht mit nichttechnischen Mitwirkenden teilen und kommentieren zu können.
Deshalb wird Word, zumindest beim wissenschaftlichen Schreiben in meinem Bereich, wohl noch viele Jahre schwer zu ersetzen sein.
[1] https://github.com/overleaf/overleaf
[2] https://github.com/hackmdio/codimd
[3] https://pandoc.org/typst-property-output.html
[4] https://quarto.org/
Beim Einsatz von GT wirkte die Typst-PDF-Ausgabe etwas weniger ausgereift als LaTeX-PDF.
Ich hoffe, das wird behoben.
Was mich bei Typst im Vergleich zu LaTeX am meisten stört, ist, dass es mit grundlegenden fortgeschrittenen Typografie-Funktionen nicht gut umgeht.
Zum Beispiel fehlen im Mathematikmodus Dinge wie die Behandlung von Abstandsarten (mathop, mathbin, mathrel usw.) oder Trennzeichengrößen (big, bigg usw.).
Die Abstände zwischen Symbolen und Operatoren im Mathematikmodus kann man über https://typst.app/docs/reference/math/class/ ändern, und Trennzeichengrößen lassen sich über https://typst.app/docs/reference/math/lr#functions-lr ändern oder automatisch behandeln.
Allerdings scheint das bei LaTeX genauso zu sein.
Es sieht wirklich gut aus, und ich werde es ausprobieren.
Allerdings denke ich immer wieder daran:
Meine geschätzte Wahrscheinlichkeit, dass LaTeX auch in 15 Jahren noch kostenlos und gepflegt sein wird: 99,9999 %
Meine geschätzte Wahrscheinlichkeit, dass ein anderes neues Tool auch in 15 Jahren noch kostenlos und gepflegt sein wird: 5 %
Bei bash und einigen anderen Dingen ist es genauso.
Es gibt viele bessere Alternativen, aber die Schmerzpunkte sind nicht groß genug, um sie zu ersetzen.
Ich mag Typst.
Besonders gut ist es beim Umgang mit programmatisch erzeugten Eingaben, und das Flag
--inputkann JSON entgegennehmen.Innerhalb der Datei kann man JSON mit der speziellen Funktion
json.decode()leicht einlesen.Damit lassen sich sehr einfach stabile Ergebnisse erzeugen, deshalb bin ich auch in meinem Projekt von LaTeX auf Typst umgestiegen.
[0] https://typst.app/docs/reference/foundations/sys/
[1] https://resgen.app