Lancez which context sur TeX Live 2024, puis un ls -l sur le chemin renvoyé : vous obtenez context -> luametatex. La commande qui invoque ConTeXt se révèle être luametatex en personne, le moteur que les développeurs de ConTeXt ont bâti pour eux-mêmes. Cette seule ligne résume toute l'entreprise : ConTeXt n'est pas un package que l'on ajoute à LaTeX mais un système de préparation de documents que l'on emploie à la place de LaTeX, et il embarque son propre moteur. Cette page parcourt sa syntaxe centrée sur \setup..., les trois générations MkII / MkIV / LMTX, la raison de la lenteur du tout premier passage et — journaux à l'appui — qui devrait sérieusement l'envisager.
ConTeXt n’est pas un package LaTeX
Il n'existe aucune commande \usepackage{context}, et écrire \usepackage dans un document ConTeXt arrête la compilation sur Undefined control sequence. LaTeX et ConTeXt sont des formats frères posés sur le même TeX, et aucun ne comprend un mot de l'autre. Le fichier se termine toujours par .tex, mais ce qui le traite est la commande context, ni pdflatex ni lualatex. Collaborateurs et chaînes d'intégration continue attrapent régulièrement une commande LaTeX et échouent : une ligne dans le README — « compiler ce document avec context main.tex » — est vite rentabilisée.
$ 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: 1ConTeXt est l'œuvre du Néerlandais Hans Hagen et de sa société PRAGMA ADE (Advanced Document Engineering). Le nom vient de « text with TeX » — con-tex-t. Il n'a pas grandi comme sous-produit universitaire mais comme outil de production pour les travaux commandés à la société, ce qui façonne son caractère : il convient aux tâches où l'on conçoit soi-même la page — supports pédagogiques, manuels, catalogues. Son ancienneté se lit aussi dans les sources : l'en-tête de cont-nl.mkxl livré avec TeX Live 2024 porte toujours version=1997.08.19, author=Hans Hagen, copyright={PRAGMA ADE & ConTeXt Development Team}.
ConTeXt face à LaTeX : \setup... et \start…/\stop…
La plus grande différence : tous les réglages d'apparence se rassemblent dans une seule famille de commandes. En LaTeX, les marges viennent de geometry, la couleur de xcolor, l'habillage des notes d'encore autre chose, chacun avec sa syntaxe. En ConTeXt le papier est \setuppapersize, la fonte de labeur \setupbodyfont, l'espacement des paragraphes \setupwhitespace — tout commence par \setup et tout prend des key=value. Y en a-t-il beaucoup ? Assurément : un balayage des sources LMTX de TeX Live 2024 (tex/context/base/mkxl) donne 498 commandes distinctes commençant par \setup. La conception demande d'apprendre la règle de nommage, pas les noms.
Le balisage est régulier lui aussi. Là où LaTeX écrit un environnement \begin{env}…\end{env}, ConTeXt emploie des paires appariées \start… et \stop… : le corps est \starttext … \stoptext, une section \startsection … \stopsection, une formule hors texte \startformula … \stopformula. Et il n'existe aucune déclaration obligatoire correspondant au \documentclass de LaTeX. On ouvre le fichier par \setuppapersize[A4] et l'on entre dans le texte. L'habitude LaTeX de choisir d'abord une classe puis de chercher les packages qui vont avec disparaît purement et simplement.
% 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 | Ce que l’on veut |
|---|---|---|
\documentclass{article} | (rien) | aucune déclaration de classe requise ; l’apparence passe par \setup... |
\begin{document} | \starttext | début du corps ; il se termine par \stoptext |
\section{...} | \startsection[title=...] | une section ; \section seul existe aussi pour le titre |
\[ ... \] | \startformula … \stopformula | une formule hors texte |
\usepackage{geometry} | \setuppapersize et les autres \setup... | papier, marges, mise en page ; aucun package à ajouter |
pdflatex | context | la commande de traitement ; une commande LaTeX ne fera pas l’affaire, même pour un .tex |
Ce qu’est LMTX : les générations MkII, MkIV et LMTX
LMTX est la génération courante. ConTeXt se divise en trois lignes selon la génération du moteur sous-jacent : MkII, la plus ancienne, tourne sur pdfTeX (et XeTeX) ; MkIV est la réécriture de l'ère Lua sur LuaTeX ; LMTX — MkXL en interne — tourne sur LuaMetaTeX. Sur TeX Live 2024, context --version signale context.mkiv et context.mkxl à la même date : MkIV est donc toujours livré. Mais la commande context est elle-même un lien symbolique vers luametatex, si bien qu'un appel sans précision lance LMTX. La première ligne du journal l'affirme sans ambiguïté : 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:18La pièce maîtresse est LuaMetaTeX. Hans Hagen et les développeurs de ConTeXt l'ont rebâti comme un moteur allégé fait pour ConTeXt, successeur de LuaTeX, et l'audace tient non à ce qui a été ajouté mais à ce qui a été retiré : le moteur de sortie PDF, la gestion des fontes et de nombreuses primitives ont été délibérément ôtés de LuaTeX puis réimplémentés en Lua du côté ConTeXt. Le résultat ne dépend d'aucune bibliothèque externe, n'exige pas d'écosystème de compilation compliqué et se porte aisément d'un système à l'autre. Le journal LMTX affiche bien used backend: pdf — mais ce PDF est écrit par l'implémentation en Lua. Une chose mérite ici d'être dite franchement : ConTeXt est en pratique la seule chose qui exploite sérieusement LuaMetaTeX. Il est plus juste d'y voir une partie de ConTeXt qu'un moteur généraliste.
Là où survivent les générations anciennes, la configuration le dit aussi. Le fmtutil.cnf de TeX Live contient deux lignes, cont-en pdftex - -8bit *cont-en.mkii et cont-en xetex - -8bit *cont-en.mkii, qui sont les définitions de format pour MkII. MkII peut donc encore être gravé sur pdfTeX et sur XeTeX. LMTX n'emprunte pas du tout ce mécanisme : comme on le verra, il construit son format dans un cache qui lui est propre. Si vous démarrez, prenez LMTX sans hésiter, et considérez MkII et MkIV comme ce qui subsiste parce que d'anciens documents subsistent.
Pourquoi seule la première passe est lente : mtxrun --generate et le cache
ConTeXt grave lui-même son format dans un cache : seule la première passe coûte du temps. À la mesure, depuis un état vierge, la première passe annonce total runtime: 3.559 seconds et la seconde, sur le même fichier, 0.248 seconds — un facteur quatorze. Ce qui est apparu dans le cache pendant cette première passe, c'est un cont-en.fmt d'environ 19 Mo ; ensuite il n'est plus que lu. Un cran plus tôt vient la base de données de fichiers, construite par mtxrun --generate. Lancez context --version dans un environnement où cela n'a pas été fait et vous obtenez une erreur déroutante au premier regard.
# 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 secondsLe message ne dit pas que mtx-context.lua manque, mais que la liste des fichiers n'a pas encore été construite et qu'il est donc introuvable. Un passage de mtxrun --generate suffit. Ensuite, ConTeXt a une autre habitude qui étonne les utilisateurs de LaTeX : il se relance autant de fois que les renvois et la table des matières l'exigent. Tapez context toc.tex une seule fois sur un document à table des matières et le journal consigne deux appels internes, --c:currentrun=1 et --c:currentrun=2, avec le plafond --c:maxnofruns=9. Ce qui, en LaTeX, oblige à penser au second passage ou à recourir à latexmk est ici le comportement par défaut. Le fichier auxiliaire s'appelle d'ailleurs .tuc et non .aux.
MetaPost tourne dans la même compilation
L'un des atouts phares de ConTeXt est que le langage de dessin MetaPost est intégré au système et produit les figures sur place, sans lancer de programme externe. Écrivez \startMPcode … \stopMPcode dans le document et la figure naît pendant la compilation. Le journal affiche côte à côte This is MPLIB for LuaMetaTeX, version 3.14, running in double mode et loading metafun for lmtx — preuve que MetaPost habite le moteur sous forme de bibliothèque MPlib, que Taco Hoekwater et Hans Hagen ont extraite de MetaPost en 2007. Comme MetaPost hérite du mode de description du METAFONT de Knuth, lignes et courbes s'énoncent comme des contraintes plutôt que comme des coordonnées.
\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 calledLa différence est plus grande qu'il n'y paraît. Parce que la figure appartient à la même exécution et non à un processus séparé, elle peut lire les dimensions du texte : une figure exactement à la largeur du bloc de texte, des ornements calés sur le numéro de section, des filets et des fonds produits à partir de données — le tout sans étape de post-traitement. Voilà pourquoi les utilisateurs de ConTeXt dessinent jusqu'aux filets et aux fonds de page en MetaPost. Ce n'est pas tout à fait l'habitude TikZ venue de LaTeX ; ici MetaPost sert d'outil pour dessiner les éléments de page eux-mêmes.
Qui devrait réellement choisir ConTeXt — réponse honnête
La réponse : ceux qui maîtrisent eux-mêmes la conception de la page. Supports pédagogiques, manuels, catalogues, publications internes, composition produite en masse à partir de XML ou d'une base de données — partout où les décisions de mise en page vous appartiennent, le modèle intégré de ConTeXt, réglages rassemblés dans \setup..., porte ses fruits. À l'inverse, il ne convient pas à un article ou une thèse dont la destination impose un modèle LaTeX. Modèles de conférence, classes comme revtex, installations des coauteurs, chaîne de traitement d'arXiv : tout présuppose LaTeX, et aucun gain ne rembourse l'effort de portage. La ligne de partage ne tient pas à la supériorité d'un système mais à qui décide de la page.
- Bien adapté : livrets, supports pédagogiques, catalogues, manuels — tout ce dont la mise en page vous appartient. Les réglages se rassemblent dans
\setup..., donc changer la maquette plus tard revient à regarder à un seul endroit. - Bien adapté : composition produite automatiquement à partir de XML ou de données. ConTeXt sait lire et composer XML directement, et le traitement s'écrit en Lua.
- Bien adapté : documents où figures et texte doivent tenir dans une seule source. MetaPost est dans la même exécution : ni post-traitement, ni fichiers d'images à gérer.
- Bien adapté : les diapositives. TeX Live 2024 livre plus de vingt styles de présentation —
s-present-boring,s-present-dark,s-present-punket d'autres — et MetaPost peut en composer l'ornementation. - Mal adapté : articles et thèses dont la destination impose une classe LaTeX. Suivre le modèle est plus rapide et plus sûr.
- Mal adapté : manuscrits dont les coauteurs n'utilisent que LaTeX. On a bien moins écrit sur ConTeXt que sur LaTeX, et il y a moins de monde à qui demander en cas de blocage.
La documentation se rassemble elle aussi autrement. Le savoir LaTeX est éparpillé dans des livres, des sites de questions-réponses et des manuels de packages du monde entier, tandis que ConTeXt est relativement concentré : le wiki officiel contextgarden et des introductions comme ConTeXt: an excursion, avec une rencontre annuelle ConTeXt qui réunit développeurs et utilisateurs. Moins de matière, mais un centre plus net — l'image est assez juste. Un dernier détail typique : le système propose des interfaces où les noms de commandes eux-mêmes sont traduits. Outre l'anglais, les sources LMTX de TeX Live 2024 comportent des définitions de format pour le tchèque, l'allemand, le français, l'italien, le néerlandais, le persan, le roumain et l'anglais britannique. Que le cont-nl néerlandais soit toujours là se lit comme un monument au lieu de naissance du système.
Pour finir, le démarrage concret. ConTeXt est livré avec TeX Live : sur une installation ordinaire, context first.tex suffit. Pour suivre les toutes dernières versions, la voie habituelle est la distribution LMTX du groupe — anciennement ConTeXt Standalone —, un ensemble léger, purement ConTeXt, mis à jour fréquemment. L'habitude à laisser au vestiaire quand on commence à écrire, c'est le réflexe LaTeX qui consiste à chercher un package dès qu'il manque quelque chose. Montez d'abord la charpente avec \starttext, \startsection et \startitemize, puis rassemblez marges et fontes dans des \setup... en tête. Ajoutez le style à mesure que le chapitre grandit : les réglages restent hors du texte, et le jour où vous voudrez changer la maquette, il n'y aura qu'un seul endroit à consulter.