Führt man unter TeX Live 2024 which context aus und schaut den ausgegebenen Pfad mit ls -l an, erscheint context -> luametatex. Der Befehl, der ConTeXt aufruft, ist also luametatex selbst – die Engine, die die ConTeXt-Entwickler für sich gebaut haben. Diese eine Zeile fasst das ganze Vorhaben zusammen: ConTeXt ist kein Paket, das man zu LaTeX hinzufügt, sondern ein Dokumentensystem, das man statt LaTeX benutzt – und es bringt seine eigene Engine mit. Diese Seite arbeitet die auf \setup... zentrierte Schreibweise durch, die drei Generationen MkII / MkIV / LMTX, den Grund für den langsamen ersten Lauf und – anhand echter Logdateien – wer ConTeXt wirklich in Betracht ziehen sollte.
ConTeXt ist kein LaTeX-Paket
Einen Befehl \usepackage{context} gibt es nicht, und wer \usepackage in ein ConTeXt-Dokument schreibt, bricht den Lauf mit Undefined control sequence ab. LaTeX und ConTeXt sind Geschwisterformate auf derselben TeX-Grundlage, und keines versteht ein Wort des anderen. Die Datei endet weiterhin auf .tex, verarbeitet wird sie aber vom Befehl context, nicht von pdflatex und nicht von lualatex. Mitarbeitende und CI-Pipelines greifen regelmäßig zum LaTeX-Befehl und scheitern; eine Zeile in der README – „dieses Dokument mit context main.tex bauen“ – zahlt sich daher aus.
$ cat up.tex
\usepackage{amsmath}
\starttext
Hi
\stoptext
$ context up.tex
tex error > tex error on line 1 in file ./up.tex: Undefined control sequence
mtx-context | fatal error: return code: 1Geschrieben wurde ConTeXt von Hans Hagen aus den Niederlanden und seiner Firma PRAGMA ADE (Advanced Document Engineering). Der Name kommt von „text with TeX“ – con-tex-t. Es wuchs nicht als akademisches Nebenprodukt heran, sondern als Produktionswerkzeug für die eigenen Auftragsarbeiten der Firma, und das prägt seinen Charakter: Es passt zu Aufgaben, bei denen man den Satzspiegel selbst entwirft – Lehrmaterial, Handbücher, Kataloge. Sein Alter sieht man auch im Quelltext: Der Kopf von cont-nl.mkxl lautet in TeX Live 2024 unverändert version=1997.08.19, author=Hans Hagen, copyright={PRAGMA ADE & ConTeXt Development Team}.
ConTeXt gegen LaTeX: \setup... und \start…/\stop…
Der größte Unterschied: Sämtliche Gestaltungseinstellungen fallen in eine einzige Befehlsfamilie zusammen. In LaTeX kommen Ränder von geometry, Farbe von xcolor, das Aussehen der Fußnoten von noch etwas anderem – jedes mit eigener Syntax. In ConTeXt heißt das Papier \setuppapersize, die Grundschrift \setupbodyfont, der Absatzabstand \setupwhitespace – alles beginnt mit \setup, alles nimmt key=value. Ob es viele sind? Durchaus: Ein Durchlauf durch die LMTX-Quellen von TeX Live 2024 (tex/context/base/mkxl) findet 498 verschiedene mit \setup beginnende Befehle. Der Entwurf verlangt, die Benennungsregel zu lernen, nicht die Namen.
Auch das Markup ist regelmäßig. Wo LaTeX eine Umgebung als \begin{env}…\end{env} schreibt, benutzt ConTeXt zusammengehörige Paare \start… und \stop…: Der Textkörper ist \starttext … \stoptext, ein Abschnitt \startsection … \stopsection, eine abgesetzte Formel \startformula … \stopformula. Und eine verpflichtende Deklaration entsprechend \documentclass gibt es nicht. Man beginnt die Datei mit \setuppapersize[A4] und geht direkt in den Text. Die LaTeX-Gewohnheit, erst eine Klasse zu wählen und dann passende Pakete zu suchen, entfällt schlicht.
% first-context.tex -- compile with: context first-context.tex
\setuppapersize[A4]
\setupbodyfont[12pt]
\starttext
\startsection[title=Introduction]
Hello, \ConTeXt!
\startformula
E = mc^2
\stopformula
\stopsection
\stoptext| LaTeX | ConTeXt | Was man will |
|---|---|---|
\documentclass{article} | (entfällt) | keine Klassendeklaration nötig; Gestaltung steht in \setup... |
\begin{document} | \starttext | Beginn des Textkörpers; Ende mit \stoptext |
\section{...} | \startsection[title=...] | ein Abschnitt; für die Überschrift allein gibt es auch \section |
\[ ... \] | \startformula … \stopformula | eine abgesetzte Formel |
\usepackage{geometry} | \setuppapersize und die übrigen \setup... | Papier, Ränder, Satzspiegel; ein Paket wird nicht hinzugefügt |
pdflatex | context | der Verarbeitungsbefehl; ein LaTeX-Befehl hilft auch bei .tex nicht |
Was LMTX ist: die Generationen MkII, MkIV und LMTX
LMTX ist die aktuelle Generation. ConTeXt teilt sich nach der Generation der darunterliegenden Engine in drei Linien: MkII, die älteste, läuft auf pdfTeX (und XeTeX); MkIV ist die Neufassung der Lua-Ära auf LuaTeX; LMTX – intern MkXL – läuft auf LuaMetaTeX. context --version meldet unter TeX Live 2024 sowohl context.mkiv als auch context.mkxl mit demselben Datum, MkIV wird also weiterhin mitgeliefert. Der Befehl context ist jedoch selbst ein Symlink auf luametatex, weshalb ein Aufruf ohne weitere Angaben LMTX startet. Die erste Zeile des Laufprotokolls sagt es unmissverständlich: ConTeXt ver: 2024.02.27 09:18 LMTX.
$ ls -l $(which context)
context -> luametatex
$ luametatex --version
This is LuaMetaTeX, Version 2.11.02
Functionality : level 20240226
$ context --version
mtx-context | ConTeXt Process Management 1.06
mtx-context | main context file: .../tex/context/base/mkiv/context.mkiv
mtx-context | current version: 2024.02.27 09:18
mtx-context | main context file: .../tex/context/base/mkxl/context.mkxl
mtx-context | current version: 2024.02.27 09:18Das Kernstück ist LuaMetaTeX. Hans Hagen und die ConTeXt-Entwickler haben es als schlanke, für ConTeXt gemachte Engine und Nachfolgerin von LuaTeX neu gebaut, und das Kühne daran ist nicht das Hinzugefügte, sondern das Weggenommene: Das PDF-Backend, die Schriftverarbeitung und viele Primitive wurden bewusst aus LuaTeX entfernt und auf der ConTeXt-Seite in Lua neu implementiert. Das Ergebnis hängt von keiner externen Bibliothek ab, braucht kein aufwendiges Build-Ökosystem und lässt sich leicht auf andere Betriebssysteme bringen. Das LMTX-Log gibt zwar used backend: pdf aus – doch dieses PDF schreibt die Lua-seitige Implementierung. Eines sollte hier offen gesagt werden: ConTeXt ist praktisch das Einzige, was LuaMetaTeX ernsthaft nutzt. Es der Wahrheit näher, es als Teil von ConTeXt zu betrachten denn als Allzweck-Engine.
Wo die älteren Generationen fortleben, verrät ebenfalls die Konfiguration. In fmtutil.cnf von TeX Live stehen zwei Zeilen, cont-en pdftex - -8bit *cont-en.mkii und cont-en xetex - -8bit *cont-en.mkii – das sind die Formatdefinitionen für MkII. MkII lässt sich also weiterhin auf pdfTeX und XeTeX erzeugen. LMTX nutzt diesen Mechanismus gar nicht; es legt sein Format, wie unten beschrieben, in einem eigenen Cache an. Wer neu beginnt, nimmt ohne Zögern LMTX und betrachtet MkII und MkIV als das, was bleibt, weil alte Dokumente bleiben.
Warum nur der erste Lauf langsam ist: mtxrun --generate und der Cache
ConTeXt erzeugt sein Format selbst in einem Cache, deshalb kostet nur der erste Lauf Zeit. Gemessen aus dem Ausgangszustand meldet der erste Lauf total runtime: 3.559 seconds, der zweite auf derselben Datei 0.248 seconds – Faktor vierzehn. Im ersten Lauf entstand im Cache eine rund 19 MB große cont-en.fmt; danach wird sie nur noch gelesen. Einen Schritt davor liegt die Dateidatenbank, die mtxrun --generate anlegt. Ruft man context --version in einer Umgebung auf, in der das nicht geschehen ist, erscheint eine auf den ersten Blick rätselhafte Fehlermeldung.
# before the file database exists
$ context --version
mtxrun | unknown script 'mtx-context.lua' or 'mtx-mtx-context.lua'
$ mtxrun --generate # builds the file database
mtxrun | elapsed lua time: 3.034 seconds
$ context first.tex # run 1: also dumps ~19 MB cont-en.fmt
system | total runtime: 3.559 seconds
$ context first.tex # run 2: format is cached
system | total runtime: 0.248 secondsDie Meldung besagt nicht, dass mtx-context.lua fehlt, sondern dass die Dateiliste noch nicht angelegt ist und die Datei deshalb nicht gefunden wird. Ein Lauf von mtxrun --generate behebt das. Danach hat ConTeXt eine weitere Eigenheit, die LaTeX-Anwender überrascht: Es läuft von sich aus so oft, wie Querverweise und Inhaltsverzeichnis es verlangen. Ein einziges context toc.tex auf ein Dokument mit Inhaltsverzeichnis hinterlässt im Log zwei interne Aufrufe, --c:currentrun=1 und --c:currentrun=2, samt Obergrenze --c:maxnofruns=9. Was in LaTeX heißt, an den zweiten Durchlauf zu denken oder latexmk zu bemühen, ist hier Standardverhalten. Die Hilfsdatei heißt zudem .tuc statt .aux.
MetaPost läuft im selben Durchlauf mit
Zu den Aushängeschildern von ConTeXt gehört, dass die Zeichensprache MetaPost fest eingebaut ist und Abbildungen an Ort und Stelle erzeugt, ohne ein externes Programm zu starten. Man schreibt \startMPcode … \stopMPcode in das Dokument, und die Grafik entsteht während des Laufs. Im Log stehen This is MPLIB for LuaMetaTeX, version 3.14, running in double mode und loading metafun for lmtx nebeneinander – Beleg dafür, dass MetaPost als Bibliothek MPlib in der Engine wohnt, die Taco Hoekwater und Hans Hagen 2007 aus MetaPost herauslösten. Da MetaPost seine Beschreibungsweise von Knuths METAFONT erbt, lassen sich Linien und Kurven als Bedingungen statt als Koordinaten formulieren.
\starttext
\startMPcode
fill fullcircle scaled 3cm withcolor .6red;
draw fullcircle scaled 3cm withpen pencircle scaled 1mm;
\stopMPcode
\stoptext
% one run of `context` produces the PDF; no external MetaPost binary is calledDer Unterschied ist größer, als er wirkt. Weil die Grafik Teil desselben Laufs ist und kein eigener Prozess, kann sie die Maße des Textes lesen: eine Abbildung exakt in Satzspiegelbreite, Zierrat, der sich nach der Abschnittsnummer richtet, aus Daten erzeugte Linien und Hintergründe – alles ohne Nachbearbeitungsschritt. Deshalb zeichnen ConTeXt-Anwender selbst Linien und Seitenhintergründe in MetaPost. Das ist nicht ganz die TikZ-Gewohnheit aus LaTeX; hier dient MetaPost als Werkzeug, um die Seitenelemente selbst zu zeichnen.
Wer ConTeXt wirklich wählen sollte – ehrlich gesagt
Die Antwort lautet: wer die Seitengestaltung selbst verantwortet. Lehrmaterial, Handbücher, Kataloge, hausinterne Publikationen, Satz, der in großer Zahl aus XML oder einer Datenbank erzeugt wird – überall dort, wo die Layoutentscheidungen bei einem selbst liegen, zahlt sich das integrierte Modell von ConTeXt mit seinen in \setup... gebündelten Einstellungen aus. Umgekehrt eignet es sich nicht für eine Arbeit, deren Ziel eine LaTeX-Vorlage vorschreibt. Konferenzvorlagen, Klassen wie revtex, die Installationen der Mitautoren, die Verarbeitungskette bei arXiv: Alles setzt LaTeX voraus, und kein Gewinn wiegt den Portierungsaufwand auf. Die Grenze verläuft nicht zwischen besser und schlechter, sondern danach, wer über die Seite entscheidet.
- Passt gut: Broschüren, Lehrmaterial, Kataloge, Handbücher – alles, dessen Seitengestaltung einem selbst gehört. Die Einstellungen sammeln sich in
\setup..., eine spätere Änderung des Layouts heißt also, an einer Stelle nachzusehen. - Passt gut: Satz, der automatisch aus XML oder Daten entsteht. ConTeXt kann XML direkt lesen und setzen, die Verarbeitung lässt sich in Lua schreiben.
- Passt gut: Dokumente, in denen Abbildungen und Text in einer Quelle liegen sollen. MetaPost steckt im selben Lauf, also gibt es weder Nachbearbeitung noch Bilddateien zu verwalten.
- Passt gut: Folien. TeX Live 2024 liefert über zwanzig Präsentationsstile mit –
s-present-boring,s-present-dark,s-present-punkund weitere –, und die Verzierung lässt sich mit MetaPost bauen. - Passt schlecht: Arbeiten und Abschlussarbeiten, deren Ziel eine LaTeX-Klasse vorschreibt. Der Vorlage zu folgen ist schneller und sicherer.
- Passt schlecht: Manuskripte, deren Mitautoren ausschließlich LaTeX benutzen. Über ConTeXt ist weit weniger geschrieben als über LaTeX, und es gibt weniger Leute zu fragen, wenn es klemmt.
Auch die Dokumentation sammelt sich anders. LaTeX-Wissen liegt verstreut in Büchern, Frage-und-Antwort-Seiten und Pakethandbüchern weltweit, während ConTeXt vergleichsweise konzentriert ist – im offiziellen Wiki contextgarden und in Einführungen wie ConTeXt: an excursion, dazu ein jährliches ConTeXt Meeting, das Entwickelnde und Anwendende zusammenbringt. Weniger Material, aber eine deutlichere Mitte – das trifft es ungefähr. Noch ein bezeichnendes Detail: Das System bietet Schnittstellen, in denen die Befehlsnamen selbst übersetzt sind. Neben Englisch enthalten die LMTX-Quellen in TeX Live 2024 Formatdefinitionen für Tschechisch, Deutsch, Französisch, Italienisch, Niederländisch, Persisch, Rumänisch und britisches Englisch. Dass das niederländische cont-nl noch da ist, liest sich wie ein Denkmal für den Ort, an dem dieses System entstand.
Zum Schluss der praktische Einstieg. ConTeXt liegt TeX Live bei, auf einer gewöhnlichen Installation genügt also context first.tex. Wer die neuesten Fassungen verfolgen will, greift üblicherweise zur LMTX-Distribution der Gruppe – früher ConTeXt Standalone genannt –, einem leichten Bündel nur mit ConTeXt, das häufig aktualisiert wird. Die eine Gewohnheit, die man beim Schreiben ablegen sollte, ist der LaTeX-Reflex, bei jeder Lücke nach einem Paket zu suchen. Bauen Sie zuerst das Gerüst mit \starttext, \startsection und \startitemize und sammeln Sie Ränder und Schriften oben in \setup...-Befehlen. Mit dem wachsenden Kapitel kommt die Gestaltung hinzu: Die Einstellungen bleiben aus dem Text heraus, und wer den Satzspiegel ändern will, hat genau eine Stelle nachzusehen.