Profitez des offres Memoirevive.ch!
LuaLaTeX, le futur de LaTeX ?

Le court article d'aujourd'hui est la suite logique de celui consacré à XeLaTeX il y a deux mois, et suppose que vous êtes un tant soit peu initié au petit monde de TeX et LaTeX. Sinon, il est fortement conseillé de lire au moins le premier chapitre de cet excellent ouvrage… ;-)

Avec la dernière version de TeX Live, est apparue la première version stable de LuaTeX, un nouveau « moteur » TeX, créé par la petite équipe qui avaient déjà créée ConTeXt. Ce nouveau moteur TeX est destiné à remplacer à terme pdfTeX, qui est lui-même depuis une décennie le moteur standard. Du reste, ConTeXt utilise déjà LuaTeX comme moteur de base depuis quelques années déjà, et maintenant c'est autour de LaTeX, avec LuaLaTeX…

Alors, quelles sont les particularités de ce nouveau moteur ? Comment se positionne-t-il par rapport à XeTeX, l'autre moteur TeX récemment introduit, que j'ai présenté dans mon article précédent ?

Comme XeTeX, LuaTeX utilise Unicode comme encodage de caractères, et permet de faire usage des polices du système. Comme pour XeLaTeX, c'est le paquet fontspec qui permet à LuaLaTeX d'utiliser cette dernière propriété. En témoigne ce petit programme minimal, qui est l'équivalent de celui présenté dans l'article sur XeLaTeX :

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LuaLaTeX
\documentclass{article}
\usepackage{luatextra}
\usepackage[frenchb]{babel}
\setmainfont{Zapfino}
\begin{document}
Zapfino, c'est chouette !
\end{document}

Le résultat est naturellement le même qu'avec XeLaTeX :

image

Dans ce code, le paquet luatextra est l'équivalent du paquet xltxtra pour XeLaTeX : il charge la version Opentype des polices Latin Modern, le paquet fontspec ainsi que d'autres paquets très utiles, à commencer par le paquet metalogo fournissant les commandes permettant de composer les logos de LuaTeX et LuaLaTeX : \LuaTeX et \LuaLaTeX.

Sans fontspec, LuaLaTeX fonctionnera plus ou moins comme le pdfLaTeX standard, la différence la plus immédiate étant l'encodage de caractères, toujours Unicode avec LuaLaTeX. Un paquet est alors indispensable : luainputenc, qui s'utilise de la même façon que le bon vieux paquet inputenc de pdfLaTeX. luainputenc permet de récupérer les fichiers créés avec pdfLaTeX sous un des encodages d'entrée 8 bits propres aux anciennes versions (Latin 1, Mac OS Roman…), et de les convertir à la volée en UTF-8 Unicode pour les rendre utilisables par LuaLaTeX.

De plus, ce paquet est nécessaire pour permettre à LuaLaTeX de fonctionner correctement avec les polices de caractères traditionnelles de LaTeX, celles encodées en 7 ou 8 bits (les encodages de sortie « OT1 » et « T1 » par exemple). Et ce y compris si l'encodage de caractères du fichier (l'encodage d'entrée) est UTF-8 Unicode, pourtant l'encodage par défaut de LuaLaTeX ! On prendra donc soin de toujours charger luainputenc — avec l'option idoine, utf8 le cas échéant — chaque fois que le fichier fait appel à une police spécifique à LaTeX.

Mais la plus grande caractéristique de LuaTeX est l'incorporation d'un langage de script appelé Lua au code source de TeX, d'où le nom LuaTeX. Ce qui est censé rendre TeX bien plus aisément reprogrammable et reconfigurable qu'avant, et lui donner des facilités de calcul qu'il n'avait jamais eues jusque-là. C'est le paquet luacode qui permet d'utiliser cette propriété avec LuaLaTeX. Il est lui aussi appelé par le paquet luatextra. Et c'est la commande \directlua, fournie par luacode donc, qui permet d'introduire directement du code Lua dans le code LaTeX.

Si cette incorporation du langage Lua ne sera peut-être pas très utile à l'utilisateur lambda, c'est en revanche une bénédiction pour l'utilisateur bricoleur-programmeur enthousiaste car cela lui ouvre des perspectives particulièrement alléchantes ! Ne serait-ce que pour faire des calculs mathématiques ! En témoigne ce petit exemple :

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LuaLaTeX
\documentclass{article}
\usepackage{luatextra}
\usepackage[frenchb]{babel}
\begin{document}
Approximation de $\pi$ :
$\directlua{tex.sprint(math.pi)}$
\end{document}

Résultat :

image

Sympa, non ? Je vous invite à lire l'excellent tutoriel de Manuel Pégourié-Gonnard sur LuaLaTeX, duquel j'ai tiré l'exemple précédent, pour avoir d'autres aperçus plus conséquents !

Une autre nouveauté de LuaTeX est l'incorporation, rendue possible grâce à Lua et par le biais d'une librairie C appelée mplib, du langage de programmation de dessin scientifique MetaPost. En tant qu'utilisateur régulier et passionné de ce langage, c'est pour ma part la nouveauté de LuaTeX qui m'intéresse le plus (il faudra que je fasse un jour un article sur MetaPost, d'ailleurs)… Sur LuaLaTeX, c'est le paquet luamplib qui permet d'incorporer du code MetaPost au code LaTex. Voici un exemple (à faire tourner sur un MacTeX récemment mis à jour via le TeX Live Utility), faisant usage de l'environnement mplibcode mis à disposition par luamplib :

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LuaLaTeX
\documentclass{article}
\usepackage{luatextra}
\usepackage{luamplib}
\usepackage[frenchb]{babel}
\begin{document}
Un cercle plein :
\begin{mplibcode}
beginfig(1);
   fill fullcircle scaled 20;
endfig;
\end{mplibcode}
\end{document}

Copie d'écran du résultat dans le PDF obtenu :

image

Hélas, trois fois hélas, mplib ne permet pas encore d'incorporer du texte élaboré dans les schémas : les commandes verbatimtex … etex et btex … etex ne sont pas reconnues. En conséquence, cette inclusion directe de MetaPost dans LuaTeX m'est pour le moment presque complètement inutile, ainsi qu'à beaucoup d'autres personnes, et il faut espérer qu'une mise à jour prochaine de mplib corrige cette lacune !

Également intéressant, et un gros avantage sur XeLaTeX, la possibilité d'utiliser le paquet microtype qui donne accès au traitement microtypographique du texte. LuaTeX ne permet pas encore toutes les propriétés accessibles via pdfTeX, mais ce n'est paraît-il qu'une question de temps avant que ce soit le cas. Voir la documention de microtype pour les détails.

Bref, LuaTeX et LuaLaTeX sont particulièrement prometteurs. Selon les développeurs eux-mêmes, ils ne sont pas encore en état de remplacer complètement pdfTeX et pdfLaTeX, et les rivaux directs XeTeX-XeLaTeX sont déjà bien implantés, s'agissant de l'utilisation des polices du système d'exploitation. Mais avec sa facilité de configuration (due à l'incorporation de Lua) et l'incorporation de MetaPost, ils disposent de deux atouts supplémentaires considérables, et le plus grand avenir leur semble promis !

15 commentaires
1)
JPO1
, le 08.06.2011 à 09:17

Merci à Franck Pastor dont les articles m’ont incité à sortir de mes habitudes LaTeX pour essayer XeLaTeX et ensuite LuaLaTeX.

LuaLaTex me semble beaucoup plus rapide en compilation que LaTeX et XeLaTeX, sur de gros fichiers (250 pages avec images, graphiques, tableaux), mais je n’ai pas pris la peine de faire des mesures.

Par contre le package microtype a des effets étonnants sur l’alignement optique. Ils dépendent fortement de la fonte utilisée, le résultat n’est jamais bon et il peut-être catastrophique avec des retraits en fin de lignes terminées par un signe de ponctuation. L’aspect est parfois étrangement sinueux.

Je n’ai pas encore essayé la programmation en Lua.

LuaLaTeX est certainement un programme à suivre de près.

2)
Franck Pastor
, le 08.06.2011 à 09:52

Il semblerait que Microtype, sous pdfLaTeX et LuaLaTeX, ne soit pour le moment vraiment efficace qu’avec les polices spécifiquement créées à l’origine pour LaTeX, et non avec les polices du système. Et encore, pas toutes les polices de LaTeX. Rien que pour la protrusion, pour chaque police il faut une configuration spéciale. Voir les pages 20 et 21 de la documentation. Voir également la section 9, la page 25 (Hints and caveats).

3)
Guillôme
, le 08.06.2011 à 10:52

Approximation de pi : 3,141 592 653 589 8

Tout le monde sait que la 13ème décimale de pi est un 7 et pas un 8 !

Le calcul mathématique est donc un arrondi plus qu’une approximation :p

Bon, je plaisante bien sûr, merci pour l’article mais je vais déjà essayer de maitriser LaTeX tout court ^^

4)
Caplan
, le 08.06.2011 à 13:35

je vais déjà essayer de maitriser LaTeX

Moi, quand j’étais gamin, je maîtrisais déjà très bien mon Gaston Latex!

5)
Inconnu
, le 08.06.2011 à 13:40

Je ne connais pas Latex mais j’ai dû programmer en Lua pour faire des galeries web dans Lightroom et c’est assez simple (le Lua, pas les $&§ de galeries LR !)

6)
Franck Pastor
, le 08.06.2011 à 15:06

Dès on parle de LaTeX, toi, Capan, tu deviens rigide ! :-)

7)
JPO1
, le 08.06.2011 à 15:53

Évidemment après avoir lu Franck Pastor dès que j’ai eu un moment j’ai essayé de rentrer du code lua dans LuaLaTeX en utilisant le package luacode, un morceau de code classique, une fonction qui calcule le n-ième nombre de Fibonacci, récursivement, placé dans l’environnement luacode, puis pour afficher un résultat appel de la fonction dans la macro \directlua en utilisant tex.sprint.

Jusqu’à 35 les temps de compilation sont inférieurs à 3 s, après c’est nettement plus long.

Cet essai pompeux n’est rien en lui-même mais comme Lua est un langage proche de ceux que je connais (essentiellement des lisp, plus spécialement Scheme) alors que j’ai toujours eu du mal avec la programmation en TeX, par manque de temps pour en apprendre les concepts, j’ai déjà des idées sur ce que je vais tenter avec LuaTeX.

Dans une utilisation de tous les jours on n’a évidemment pas besoin de tout cela.

\begin{luacode}
   function fib(number)
      if number <= 1 then
            return 1
      end
      return ((fib(number-2))+fib((number-1)))
   end

\end{luacode}

\directlua{
tex.sprint(fib(35))
}

Edit de Franck : je me suis permis d’éditer ton commentaire en ajoutant les commandes textile nécessaires pour mieux faire apparaître ton code ci-dessus. Merci pour cet exemple !

8)
Radagast
, le 08.06.2011 à 18:31

Bonjour et merci : cette série d’article est toujours très intéressante.

9)
jpg
, le 08.06.2011 à 23:56

Je dirais même plus, elle est très intéressante.

10)
flup
, le 09.06.2011 à 14:09

Très intéressant comme d’habitude.

J’en suis encore avec un LaTeX de base, espérant que les évolutions futures ne me feront pas changer tous mes documents ;)

L’idéal serait que les nouveautés soient accessibles en ajoutant quelques (rares) lignes, mais sans devoir éditer plein de commandes ou de packages (mon package en cours de développement touchant justement aux polices, ça me fait un peu peur).

11)
Franck Pastor
, le 09.06.2011 à 19:30

J’en suis encore avec un LaTeX de base, espérant que les évolutions futures ne me feront pas changer tous mes documents ;)

La seule chose que j’ai modifiée dans mes anciens fichiers pdfLaTeX pour qu’ils soient compatibles avec LuaLaTeX, c’est le paquet inputenc qui doit être remplacé par luainputenc. Tout fonctionne alors étonnamment bien, y compris les vieilles fontes LaTeX. À ce sujet, je viens d’introduire une précision supplémentaire dans mon article : il faut également charger luainputenc avec l’option idoine si on veut que LuaLaTeX fonctionne correctement avec une vielle police spécifique LaTeX. Même si l’encodage de caractères du fichier est UTF-8 Unicode !

Apparemment, si on veut être sûr qu’un fichier créé avec pdfLaTeX fonctionne correctement avec LuaLaTeX, l’erreur à ne pas faire est d’y introduire un appel à fontspec. Ce dernier doit impérativement être réservé aux nouveaux fichiers créés avec LuaLaTeX (ou avec XeLaTeX, mais c’est une autre histoire).

12)
pat3
, le 09.06.2011 à 22:07

Franck: tu penses vraiment que tu pourras un jour nous faire venir à LaTeX avec un article comme ça ?

Je crois plutôt que le wysywyg a encore de beaux jours devant lui :)

13)
Franck Pastor
, le 09.06.2011 à 22:35

Franck: tu penses vraiment que tu pourras un jour nous faire venir à LaTeX avec un article comme ça ?

Je crois plutôt que le wysywyg a encore de beaux jours devant lui :)

Apparemment tu as pris le train en marche avec quelque retard :-)

Cet article-là est destiné à ceux qui sont déjà venus à LaTeX, comme d’ailleurs j’ai pris soin de l’indiquer dès son début. Donc, non, je n’imaginais pas que j’allais faire venir de nouveaux adeptes, au contraire je prêche ici des convertis, et volontairement.

LaTeX et cuk.ch, c’est une longue histoire commencée en 2004 par Fabien Conus. Fabien, puis moi-même, avons rédigé toute une série d’articles sur Cuk pour présenter LaTeX à ceux qui n’en avait jamais entendu parler. Cette séries d’articles est reprise dans un fichier PDF intitulé « Introduction à LaTeX sous Mac OS X », au format PDF dont voici la dernière version (j’ai déjà placé le lien dans cet article d’ailleurs). C’est sorti en mars 2009. Ça peut-être plus de chances de te convaincre, si tu ne connais pas LaTeX toi-même.

En tout cas, ça en a convaincu plusieurs « cukiens », qui ont suivi par la suite et accueilli avec intérêt tous les article que nous avons publiés sur LaTeX, avec la bénédiction du patron des lieux, François, pourtant lui-même non convaincu.

Et si toi aussi tu demeures sceptique, ce n’est pas grave, notre petit monde en LaTeX ne s’arrêtera pas de tourner :-)

14)
Guillôme
, le 10.06.2011 à 15:12

Je crois plutôt que le wysywyg a encore de beaux jours devant lui :)

Toute personne capable de commenter en Textile sur Cuk.ch est capable d’écrire en LaTeX.

D’ailleurs, LaTeX est beaucoup plus facile à maitriser que les commentaires avec Cuk (cf ma signature) :p

15)
Inconnu
, le 10.06.2011 à 15:50

Toute personne capable de commenter en Textile sur Cuk.ch est capable d’écrire en LaTeX

Je ne suis pas près de maîtriser Latex… ;-)