LuaTeX est un moteur TeX qui étend pdfTeX et intègre le langage de script Lua. Vous pouvez appeler les programmes Lua en cours de composition et accéder directement au matériel que TeX a construit - et c'est cette ouverture qui le rend largement considéré comme l'avenir de TeX. Vous l'invoquez sous le nom lualatex et il gère les polices Unicode et OpenType de manière native.
Qu'est-ce que LuaTeX
LuaTeX a été développé par Taco Hoekwater, Hartmut Henkel, Hans Hagen et d'autres. Il est né du monde ConTeXt et Oriental TeX, dans le but de créer un TeX « ouvert et configurable », construit sur pdfTeX tout en préservant la compatibilité descendante. Parce que pdfTeX est sa base, il génère PDF directement et hérite des extensions e-TeX et de la plupart des machines de composition de pdfTeX.
Une grande partie de l'héritage de pdfTeX est désormais accessible via trois primitives d'interface — \pdfextension, \pdfvariable et \pdffeedback — qui prennent des mots-clés et des arguments afin que les fonctionnalités puissent être étendues sans adapter le moteur principal. Dans l'utilisation quotidienne, les packages LaTeX atténuent cette différence, vous écrivez donc rarement ces primitives à la main.
L'autre pilier est un interpréteur Lua 5.3 intégré. Écrivez \directlua{...} dans votre fichier .tex et le code Lua à l'intérieur s'exécute sur place. L'entrée est UTF-8 nativement. Pour les polices, vous sélectionnez les faces système ou OpenType directement avec fontspec, tout comme dans XeTeX — mais le chargement est effectué par le propre chargeur basé sur Lua de LuaTeX (luaotfload).
Incorporer Lua dans un document
\directlua{...} exécute le code Lua immédiatement. À partir de Lua, vous appelez tex.print(...) et sa sortie est réinjectée dans le flux d'entrée et composée de TeX comme d'habitude. Voici un document minimal que vous pouvez compiler avec lualatex : il demande à Lua de calculer deux à la puissance dixième et de déposer le résultat dans le texte.
\documentclass{article}
\begin{document}
Two to the tenth power is
\directlua{tex.print(2^10)}.
\end{document}En compilant ces ensembles, « Deux à la puissance dixième font 1024. » Une commande sœur, \latelua{...}, s'exécute à la place lorsque la page sur laquelle elle se trouve est expédiée. Cela convient aux travaux qui doivent attendre que les numéros de page et les coordonnées finales soient fixés – dessiner sur le PDF ou joindre des annotations, par exemple.
Parce que \directlua brut est pointilleux sur les accolades et les caractères spéciaux, en pratique, le package luacode et son environnement luacode vous permettent d'écrire du code Lua plus long textuellement et en toute sécurité.
Rappels - connexion à la composition
Le véritable pouvoir de LuaTeX réside dans ses rappels. TeX construit votre texte à partir de nœuds — caractères, cases et colle (espace extensible) enchaînés dans des listes chaînées — et en enregistrant un rappel, vous avez votre propre fonction Lua invoquée à chacun de ces moments, libre d'inspecter et de réécrire cette liste de nœuds. En effet, vous accédez en toute sécurité aux composants internes du moteur.
Les rappels couramment utilisés sont les suivants. process_input_buffer se déclenche à chaque fois que TeX lit une ligne d'entrée, reçoit une chaîne et en renvoie une. pre_linebreak_filter vous remet la liste de nœuds juste avant qu'un paragraphe soit divisé en lignes, et post_linebreak_filter la liste juste après. ligaturing et kerning correspondent aux étapes de construction de la ligature et du crénage.
| Rappel | Quand il tire |
|---|---|
process_input_buffer | Au fur et à mesure que chaque ligne d'entrée est lue ; pour le prétraitement |
pre_linebreak_filter | La liste des nœuds juste avant qu'un paragraphe soit rompu |
post_linebreak_filter | La liste des nœuds juste après le saut de ligne |
ligaturing / kerning | Les étapes de construction de la ligature et du crénage |
Vous conduisez ces opérations via un ensemble de tables visibles depuis Lua. tex est la fenêtre sur l'état interne de TeX (registres et dimensions), node crée, parcourt et libère les nœuds, token traite les jetons (les plus petites unités de signification de TeX), font avec les données de police et status avec les informations d'exécution. Même les machines de polices avancées comme luaotfload sont écrites en Lua par-dessus.
Polices - en les sélectionnant avec fontspec
Comme dans XeTeX, le chargement du package fontspec dans LuaTeX vous permet de nommer les polices OpenType / TrueType installées directement sur votre système. \setmainfont choisit la police du corps, avec \setsansfont et \setmonofont pour les faces sans empattement et à espacement fixe.
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
This text is set in an OpenType font, with ligatures like ffi.
\end{document}Dans les coulisses, luaotfload effectue le chargement. Il s'agit d'une adaptation du chargeur de polices de ConTeXt pour Plain TeX et LaTeX, exposant les fonctionnalités de OpenType telles que les ligatures, les figures à l'ancienne et les petites majuscules ; il vise la compatibilité avec XeTeX et est maintenu par le groupe latex3 de l'équipe LaTeX.
Dans les distributions actuelles, la commande lualatex appelle en fait LuaHBTeX, une variante de LuaTeX avec HarfBuzz intégré (fournie depuis TeX Live 2020). Cela place la machinerie de mise en forme nécessaire aux scripts complexes (arabe, indien, etc.) à l'intérieur du moteur lui-même.
MetaPost intégré
LuaTeX intègre MPlib – le moteur de dessin MetaPost présenté sous forme de bibliothèque – afin qu'il puisse générer des figures MetaPost dans le même processus que la compilation, sans appeler un programme externe. À partir de LaTeX, le package luamplib expose cela, vous permettant d'écrire du code MetaPost directement dans un environnement mplibcode.
Japonais — LuaTeX-ja
La composition japonaise est gérée par LuaTeX-ja (package luatexja). Il réimplémente, du côté de Lua via des rappels, le savoir-faire en matière de composition japonaise que possédait pTeX : écriture verticale, l'espacement entre les caractères et la gestion de la ponctuation pilotés par JFM (Japanese Font Metrics), et l'espacement entre le texte japonais et occidental. Cela ouvre une route moderne vers le japonais LaTeX distincte de pLaTeX/upLaTeX.
Avec luatexja-fontspec, vous pouvez également sélectionner des polices japonaises dans le style de fontspec. LuaTeX-ja nécessite LuaTeX 1.10.0 ou version ultérieure et un luaotfload raisonnablement récent. Si upLaTeX du côté pdfLaTeX est le « standard mature », alors LuaLaTeX avec LuaTeX-ja est le choix idéal pour repartir à zéro aujourd'hui.
Une mise en garde : la mise en forme HarfBuzz de LuaHBTeX et la machinerie d'écriture verticale / CID de LuaTeX-ja doivent être combinées avec soin. Le manuel LuaTeX-ja prévient que les polices japonaises définies via HarfBuzz peuvent produire des résultats indésirables. Pour la prose japonaise, créez d’abord le PDF avec les polices Harano Aji fournies avec TeX Live et les paramètres standard ; introduisez les fonctionnalités OpenType ou les options HarfBuzz uniquement dans de petits tests avant de les utiliser dans le manuscrit.
LuaJITTeX et LuaMetaTeX
LuaJITTeX est une variante qui relie LuaJIT — un compilateur juste à temps qui transforme le code en code machine au moment de l'exécution — au lieu du stock Lua. Lua s'exécute plus rapidement, mais LuaJIT reste épinglé au niveau de langage Lua 5.1 (la ligne principale LuaTeX est à 5.3) et est moins activement maintenu. En dehors des cas particuliers où l'exécution de Lua est extrêmement lourde, la plupart des utilisateurs sont bien servis par LuaTeX ordinaire.
L'autre successeur est LuaMetaTeX, une refonte plus légère de LuaTeX — « simple et méchant » — qui sous-tend le ConTeXt moderne (LMTX / MkXL). Il apporte une nouvelle composition mathématique et de nombreuses nouvelles primitives, adopte la ligne Lua 5.4 et est livré dans TeX Live depuis 2023. La division du travail : LuaTeX pour le travail LaTeX, LuaMetaTeX pour le dernier ConTeXt.
Compromis
XeTeX et LuaTeX gèrent tous deux Unicode et OpenType, mais leur caractère diffère. Là où XeTeX s'appuie sur la machinerie de mise en page de texte du système d'exploitation pour plus de commodité, LuaTeX est plus flexible précisément parce que tout est contrôlable depuis Lua. Le coût est qu'il a toujours été un peu plus lent que XeTeX (l'écart s'est réduit ces dernières années).
- Unicode / OpenType en premier. L'entrée UTF-8 et
fontspecsont la norme. - Programmable. Avec Lua et les rappels, vous pouvez accéder à la composition elle-même.
- Autonome. MetaPost (MPlib) est intégré, les chiffres ne nécessitent donc aucun appel externe.
- Compatible avec le japonais. LuaTeX-ja offre une composition japonaise complète, une écriture verticale et JFM inclus.
- Prospectif. L'équipe LaTeX cible LuaTeX pour de nouveaux développements.
Dans l'ensemble, LuaLaTeX devient la valeur par défaut pour les nouveaux workflows Unicode / OpenType où la programmabilité est importante. L'ancienne division est toujours valable : XeLaTeX si vous voulez simplement des polices simples, pdfLaTeX pour un travail rapide principalement en anglais. Le moteur à choisir est indiqué sur la page « Choisir un moteur ».
Démarrer un document LuaLaTeX
Si vous choisissez LuaLaTeX, commencez à partir de Unicode source, fontspec et, pour le japonais, luatexja. La migration tout en laissant pdfLaTeX-era inputenc / fontenc en place crée des avertissements et une configuration de polices en double. Créez d’abord un petit échantillon qui exerce les polices de corps, les polices japonaises, les mathématiques et la bibliographie, puis utilisez-le comme modèle de manuscrit.
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Harano Aji Mincho}
\setsansjfont{Harano Aji Gothic}
\begin{document}
LuaLaTeX で日本語の本文と数式 $E=mc^2$ を同じ経路で組みます。
\end{document}L'exemple utilise les polices Harano Aji incluses avec TeX Live, il ne dépend donc pas des polices spécifiques à OS. Pour la collaboration et CI, assurez-vous d'abord qu'un PDF est construit avec des polices groupées comme celles-ci, puis passez aux polices requises par le laboratoire ou l'éditeur uniquement lorsque cela est nécessaire.