À la racine de chaque moteur TeX-based se trouvent le TeX original de Knuth et son sur-ensemble strict, e-TeX. Cette page explique ce qu'est réellement « le programme TeX », ce qu'est plain TeX, pourquoi presque personne ne l'écrit directement aujourd'hui et pourtant cela compte toujours, et les extensions e-TeX – ajoutées dans les années 1990 – qui sont maintenant la base sur laquelle tout moteur moderne s'appuie.
Qu'est-ce que « le programme TeX »
De manière confuse, le mot TeX désigne deux choses. L'un est le programme de composition lui-même, écrit par Donald Knuth. L'autre est le système de commandes que le programme interprète. Le programme proprement dit est un moteur implacable de bas niveau : il regroupe les caractères et les cases en lignes et en paragraphes, optimise les sauts de ligne et écrit le résultat dans un fichier de sortie - et rien d'autre.
Insatisfait de la qualité typographique disponible pour son livre *The Art of Computer Programming*, Knuth commença le premier TeX en 1978. Cette version initiale était un prototype exploratoire ; il a été complètement réécrit en 1982, et cette réécriture est connue sous le nom de TeX82. « TeX » désigne aujourd'hui effectivement cette lignée TeX82. L'ensemble minimal de commandes intégrées par Knuth est appelé primitives — \def, \hbox, \vbox, etc.
Écrire un document avec des primitives nues n'est pas pratique, vous utilisez donc normalement un format - une couche de macros construite sur celles-ci. Le chargement de plain.tex vous donne plain TeX ; le chargement d'un ensemble de macros beaucoup plus grand vous donne LaTeX. Les formats sont pré-développés et enregistrés sous forme de fichier .fmt au moment de la construction afin que le moteur n'ait pas besoin de les relire à partir de zéro à chaque exécution.
Plain TeX
Plain TeX est le format standard présenté par Knuth dans *The TeXbook*. Il rassemble une boîte à outils minimale (configuration des polices, symboles mathématiques de base, macros pratiques telles que \bye) dans plain.tex, fourni avec TeX lui-même. Avant LaTeX, c'était le seul moyen pratique d'utiliser TeX.
La notation diffère sensiblement de LaTeX. Les mathématiques en ligne sont $...$ (identiques à LaTeX). Une boîte horizontale est \hbox{...}, une boîte verticale \vbox{...}, l'alignement tabulaire se fait avec \halign, une commande est définie avec \def, la largeur du texte est \hsize et un document se termine par \bye. Il n'y a pas de \documentclass ni de \begin{document} - ce sont toutes des choses que LaTeX construit à partir de macros.
% plain TeX — tex hello.tex で処理 / process with: tex hello.tex
\hsize=10cm
\font\big=cmr10 at 17pt
{\big Hello, plain \TeX!}
\medskip
This paragraph is set in the default font.
Inline math works too: $E = mc^2$.
\byeLe traitement de l'exemple avec tex hello.tex produit un fichier DVI (pas un PDF — voir ci-dessous). Les macros de logo comme \TeX et les macros d'espacement comme \medskip (un saut vertical moyen) sont également définies par plain TeX. Placé à côté d'un document LaTeX \documentclass, il montre à quel point la peau du plain TeX est fine sur le moteur nu.
Programmation alphabétisée et WEB
TeX lui-même est écrit en WEB, le propre système de Knuth et la pratique fondatrice de la programmation alphabétisée. Une source WEB est un document unique dans lequel une explication destinée à l'homme et le code Pascal sont tissés ensemble ; deux outils en extraient ensuite des dérivés - tangle produit un Pascal compilable et weave produit le commentaire composé (le livre *TeX: The Program*).
La langue cible d'origine était Pascal ; dans les distributions modernes, un outil appelé web2c traduit le WEB (via Pascal) en C pour la construction. Ainsi, le pdfTeX ou le LuaTeX exécuté sur votre machine aujourd'hui remonte toujours, en fin de compte, à cette seule source instruite.
Un numéro de version convergeant vers π
La numérotation des versions de TeX est idiosyncrasique. Depuis la version 3, chaque mise à jour ajoute un chiffre supplémentaire, de sorte que le nombre s'approche asymptotiquement de π. La version actuelle est 3.141592653, définie par la mise au point 2021 en février de la même année et inchangée depuis — un symbole que le programme est essentiellement terminé et exceptionnellement stable.
Knuth a déclaré que le « changement final », effectué à titre posthume, définira la version exactement sur π — à quel point tous les bogues restants deviendront des fonctionnalités permanentes. En effet, TeX n'a acquis aucune nouvelle fonctionnalité depuis des années et les problèmes signalés ne se résument qu'à de minuscules correctifs. Cette stabilité gelée est précisément la raison pour laquelle un fichier .tex d'il y a des décennies produit toujours le même résultat aujourd'hui.
METAFONT et DVI
TeX a un compagnon jumeau, METAFONT (mf) : un système qui décrit une police non pas comme des formes fixes mais comme un *programme pour dessiner* les glyphes. Knuth a conçu toute la famille de caractères Computer Modern pour TeX avec. La division du travail est que TeX décide où vont les personnages, tandis que METAFONT produit lui-même les formes des personnages.
Ce que le TeX de Knuth émet directement n'est pas PDF mais un fichier DVI (DeVice Independent). Un DVI ne contient que des instructions indépendantes du périphérique — « placer ce caractère à cette position » — qui sont ensuite converties en PostScript par dvips ou en PDF par dvipdfmx. Une différence majeure entre les pdfTeX, XeTeX et LuaTeX, largement utilisés aujourd'hui, est qu'ils sautent cette étape et produisent directement PDF.
Pourquoi c'est toujours important
En pratique, presque personne n'écrit plain TeX brut pour un nouveau travail : les mécanismes pratiques - numérotation, références croisées, fichiers de classe - résident tous dans la couche LaTeX au-dessus, et l'écriture quotidienne se déroule dans ce confort. Pourtant, il est vraiment utile de connaître les primitives décrites ici.
- La base de chaque format. LaTeX et ConTeXt sont finalement construits sur ces primitives.
- Vous pouvez voir jusqu'au fond des erreurs. Les erreurs enchevêtrées et les ajustements de bas niveau deviennent lisibles une fois que vous connaissez le vocabulaire de
\hboxet\vbox. - La vision du monde des boîtes et de la colle. L'idée de TeX de créer une page à partir de *boxes* et de *glue* extensible est le langage partagé pour utiliser LaTeX en profondeur.
- Universalité et reproductibilité. Parce que le moteur est figé, les documents passés continuent de produire le même résultat dans le futur.
Qu'est-ce que e-TeX
Parce que Knuth a gelé TeX, les nouvelles fonctionnalités ont dû venir d'autres mains. Ainsi, dans les années 1990, du projet européen NTS (New Typesetting System) est né e-TeX, Peter Breitenlohner réalisant le développement principal. e-TeX ne remplace pas TeX ; il est conçu comme un sur-ensemble strict de celui-ci : l'entrée existante fonctionne inchangée, avec une sortie identique.
e-TeX a deux modes. En mode de compatibilité, il se comporte exactement comme le TeX classique ; ce n'est qu'en mode étendu — entré en le démarrant avec un * — que les primitives ajoutées deviennent disponibles. Lorsqu'un format est construit en mode étendu, l'utilisateur n'a pas besoin d'y penser du tout.
Maintenant la ligne de base
Aujourd'hui, les extensions e-TeX sont simplement supposées être présentes. TeX Live est par défaut e-TeX depuis 2003, et LaTeX a officiellement requis les primitives e-TeX depuis 2017. Plus important encore, chaque moteur actuel regroupe e-TeX : pdfTeX, XeTeX et LuaTeX intègrent tous les extensions e-TeX et ajoutent leurs propres fonctionnalités en plus.
En d’autres termes, lorsque vous tapez avec pdfLaTeX ou LuaLaTeX, vous utilisez e-TeX sans vous en rendre compte. De nombreux packages modernes — à commencer par expl3, la couche de programmation LaTeX3 — ne pourraient tout simplement pas exister sans les primitives e-TeX.
Les primitives e-TeX ajoutent
Les ajouts de e-TeX sont particulièrement importants pour les personnes qui écrivent des macros. Le plus grand est l'arithmétique sur les entiers, les dimensions et la colle. Dans TeX nu, vous deviez mélanger les registres de travail pour calculer ; e-TeX fournit \numexpr, \dimexpr et \glueexpr, qui évaluent des expressions comme (a+b)*c/d sur place, sous une forme extensible.
% 拡張モードの e-TeX 系エンジンで / on any e-TeX engine in extended mode
\count0=\numexpr (3+4)*2/7 \relax % 2 が入る / yields 2
% プリミティブが「定義済みか」を安全に分岐 / branch safely on whether a name is defined
\ifdefined\foo \message{foo exists}\else \message{no foo}\fi
% 制御綴を作らずに名前の存在を確かめる / test a control sequence without creating it
\ifcsname chapter\endcsname \message{chapter is defined}\fi
% \unless で「if の否定」を直接書く / negate a conditional directly
\unless\ifnum\count0>10 \message{count0 is not greater than 10}\fiUn deuxième pilier concerne les conditions et la manipulation de jetons. \ifdefined teste si une séquence de contrôle est définie, et \ifcsname...\endcsname teste l'existence d'une séquence assemblée à partir d'un nom - les deux sans effets secondaires (l'ancienne astuce \ifx dans TeX nu pourrait transformer silencieusement une séquence non définie en \relax). \unless inverse toute condition et \detokenize transforme une liste de jetons en sa forme de chaîne (caractères du code de catégorie 12).
Le contrôle de l'expansion est également renforcé. \unexpanded laisse son contenu en place sans le développer, et \protected crée une macro définie qui ne se développera *pas* de son propre chef dans des contextes d'expansion tels que \edef et \write - la clé pour implémenter correctement le \protect de LaTeX à un niveau bas.
| Primitif | Ce que ça fait |
|---|---|
\numexpr / \dimexpr / \glueexpr | Évaluer les expressions entières/dimensions/colles en place (extensible) |
\ifdefined / \ifcsname | Testez si une séquence de contrôle est définie/existe, sans effets secondaires |
\unless | Inverser le sens du conditionnel suivant |
\protected | Définir une macro qui ne se développera pas dans les contextes d'expansion |
\detokenize / \unexpanded | Transformez les jetons en chaîne / gardez les jetons non développés |
\scantokens / \readline | Relisez une chaîne sous forme de jetons / lisez une ligne d'entrée textuellement |
\middle | Placez un délimiteur extensible au milieu de \left … \right |
\currentgrouplevel / \interactionmode | Inspecter la profondeur actuelle du groupe / obtenir et définir le mode d'interaction |
Au-delà de ceux-ci, il y a \middle pour un délimiteur extensible au milieu des mathématiques comme \left( … \middle| … \right) ; \scantokens pour relire une chaîne sous forme de jetons ; \readline pour lire textuellement une ligne de saisie ; \currentgrouplevel renvoyant la profondeur actuelle du groupe ; et \interactionmode pour lire et modifier le mode d'interaction. e-TeX a également introduit des crochets pour la composition bidirectionnelle (de droite à gauche), qui ont alimenté des travaux ultérieurs sur XeTeX, LuaTeX et le traitement japonais.
Une extension discrète mais conséquente est une forte augmentation des registres. Le TeX nu n'avait que 256 chacun des \count, \dimen, \skip, \toks, et ainsi de suite ; e-TeX a augmenté ce chiffre à 32768 (alloué sous forme de tableaux clairsemés). Les registres ne s'épuisent plus aussi facilement, même lorsque de nombreuses classes et packages volumineux sont chargés - un support méconnu sous les configurations lourdes LaTeX d'aujourd'hui.
Comment cela aide dans les documents LaTeX
Vous n'avez pas besoin de rédiger une thèse ou un document technique dans plain TeX. Néanmoins, connaître le vocabulaire \hbox, \vbox, \count, \dimen et \def vous permet de lire la couche inférieure des messages d'erreur. Overfull \hbox, par exemple, indique que du matériel dépasse d'une boîte de ligne ; Missing number, treated as zero dit que TeX s'attendait à quelque chose de lisible sous forme de nombre ou de dimension et ne l'a pas trouvé.
Comprendre la couche est différent d'écrire de la prose directement dedans. Laissez les commandes structurelles de LaTeX gérer les en-têtes, les listes, les références croisées et les environnements de théorèmes ; conservez les commandes de bas niveau pour lire pourquoi quelque chose s'est cassé ou pour réparer de manière précise une classe. Même lors de la définition d'une nouvelle commande, les documents ordinaires sont mieux servis par \newcommand ou \NewDocumentCommand que par \def brut, car LaTeX peut vérifier le nombre d'arguments et les collisions avec les commandes existantes.
- Lorsque vous écrivez de la prose, utilisez les commandes structurelles LaTeX et gardez les primitives de bas niveau rares.
- Lors de la correction d'une classe ou d'un package, les outils e-TeX tels que
\ifdefinedet\numexprsont plus sûrs que les anciennes astuces TeX. - Lors de la lecture des journaux, traduisez les avertissements dans le langage des boîtes, de la colle et des registres de TeX ; la cause devient visible.