Profitez des offres Memoirevive.ch!
LuaLaTeX : le futur de LaTeX répond présent !

Hé oui, je reviens aujourd'hui à LaTeX ! Que les adeptes du WYSIWYG façon Word, Open Office, Nisus, etc. veuille bien m'en pardonner et si possible jeter quand même un œil à l'article. La seule condition pour cela est d'avoir lu au moins l'introduction et les deux premiers chapitres de cet excellent cours publié ici-même, que je ne me lasserai jamais de vanter :-)

Cet article est destiné à détailler et actualiser la brève présentation précédente de LuaLaTeX et celle des polices OpenType à complément mathématique qu'il permet d'utiliser. Je suis en effet actuellement en train de passer avec armes et bagages de PDFLaTeX à LuaLaTeX, les récentes évolutions de ce dernier ayant achevé de me convaincre de le faire. En effet, comme vous le savez déjà si vous avez lu les articles précités, deux des intérêts majeurs de LuaTeX et de XeTeX, les « moteurs » à la base respectivement de LuaLaTeX et XeLaTeX, sont

  • de résoudre une fois pour toutes le problème du traitement des caractères accentués et des écritures non latines grâce au choix de l'encodage UTF8-Unicode par défaut ;
  • de permettre l'utilisation des polices TrueType et OpenType, que celles-ci soient contenues dans la distribution LaTeX ou dans les dossiers habituels du système d'exploitation.

Je rappelle le petit bout de programme LuaLaTeX minimaliste défini dans l'article précédent et illustrant ces propriétés :

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

Le résultat, pour mémoire : Zapfino Si vous vous souvenez bien, les deux premières lignes du programme, des commentaires dits « spéciaux », forcent en fait TeXShop à le coder en UTF8-Unicode et à l'exécuter avec LuaLaTeX.

Pour vos nouveaux fichiers il est plus que recommandé de profiter des facilités qu'offre le package fontspec, comme nous le faisons dans ce programme dès sa quatrième ligne. C'est en effet fontspec qui s'occupe de charger les polices TrueType et OpenType de la distribution LaTeX ou du système d'exploitation que vous voulez utiliser dans votre document. On verra plus bas d'autres exemples plus concrets que la belle mais peu courante police Zapfino utilisée ici.

NB : le programme équivalent de l'article précédent chargeait le package luatextra, qui charge à son tour fontspec mais aussi d'autres packages intéressants. Le problème étant qu'alors on ne peut passer d'options de chargement à fontspec.

À toutes fins utiles, je (re)signale que pour recycler vos anciens fichiers (PDF)LaTeX avec leurs encodages anciens (sur 8 bits), il suffit de remplacer le package inputenc par luainputenc. Par contre il est hors de question d'utiliser fontspec sur ces anciens fichiers, cela bloquerait tout de suite.

Revenons au traitement des polices TrueType et OpenType par LuaLaTeX. Ces polices sont chargées grâce à un package que fontspec appelle en sous-main : luaotfload (inutile donc de le charger soi-même). Ce paquet maintient entre autres une liste des différentes polices installées dans votre distribution et sur votre système. Pour établir cette liste et rendre ces fontes accessibles à l'utilisateur, il est fort probable que la toute première compilation que vous ferez avec LuaLaTeX et fontspec prenne un certain temps. Prenez patience, ça ira beaucoup plus vite pour toutes les compilations suivantes.

Aussi, lorsque vous installez une nouvelle police, il est essentiel de mettre à jour la liste établie par luaotfload, sinon ce sera comme si cette police n'existait pas pour LuaLaTeX. Ce dernier devrait se charger lui-même de la mise à jour de cette base de données, mais si pour une raison ou une autre il ne le fait pas, il faut utiliser le Terminal (ne fuyez pas, c'est simple !) et y entrer la ligne de commande

luaotfload-tool --update

Un autre paquet, capital pour les scientifiques, disponible pour LuaLaTeX (et XeLaTeX) qui sert à charger les fontes mathématiques OpenType, c'est unicode-math. Pour rappel, ce paquet charge également automatiquement fontspec. L'article précédent listait et illustrait les polices OpenType et leur complément mathématique qui étaient disponibles à l'époque et qu'unicode-math pouvait déjà charger :

  • XITS et XITS Math, un portage compatible unicode-math des polices STIX basées sur Times ;
  • Asana Math (complément mathématique libre de la police texte Palatino) ;
  • Cambria et Cambria Math (propriété de Microsoft, disponible sur votre ordi si vous y avez installé Microsoft Office 2011).

Sont venues s'ajouter trois autres polices à compléments mathématiques :

  • Latin Modern et Latin Modern Math : Latin Modern était déjà la fonte texte chargée par défaut par fontspec, mais elle ne disposait pas alors d'une version OpenType de sa partie mathématique, ce qui est le cas maintenant ;
  • TeX Gyre Termes (une version libre de la police Times) et TeX Gyre Termes Math ;
  • TeX Gyre Pagella (Palatino-like, libre également) et TeX Gyre Pagella Math.

Je reprends ici le programme test utilisé dans l'article précédent. Tout d'abord avec Latin Modern, il n'y a rien d'autre à charger que le paquet unicode-math, Latin Modern et Latin Modern Math sont alors les fontes texte et mathématique par défaut.

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LuaLaTeX
\documentclass[12pt]{article}
\usepackage[frenchb]{babel}
\usepackage{unicode-math}
\begin{document}
Un calcul de série entière :
\[
      ∑_{n=0}^\frac{α^n}{n!} = e^α
\]
\end{document}

Résultat :

latinmodern

Avec TeX Gyre Termes :

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LuaLaTeX
\documentclass[12pt]{article}
\usepackage[frenchb]{babel}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Termes}
\setmathfont{TeX Gyre Termes Math}
\begin{document}
Un calcul de série entière :
\[
      ∑_{n=0}^\frac{α^n}{n!} = e^α
\]
\end{document}

Résultat : Termes
Maintenant, avec TeX Gyre Pagella (remplacer simplement Termes par Pagella dans le programme précédent puis recompiler) : Pagella Vous aurez peut-être noté que j'ai chargé le paquet de francisation babel option frenchb avant unicode-math. C'est nécessaire sous peine de plantage de la compilation. Il faut savoir que babel n'a pas été prévu pour coexister avec Unicode et OpenType. Si la cohabitation se passe sereinement avec les langues à alphabet latin, elle est problématique avec les autres. Si bien qu'un nouveau package est en train d'être développé pour remplacer babel sur XeLaTeX et LuaLaTeX : polyglossia. Lui peut être chargé avant ou après unicode-math, sans problème. Il suffit de remplacer la ligne

\usepackage[frenchb]{babel}

par les deux lignes suivantes

\usepackage{polyglossia}
\setmainlanguage{french}

Seul problème, la francisation de polyglossia est beaucoup moins étendue que celle de l'option frenchb de babel. Si les étiquettes de sectionnement et l'algorithme de coupure des lignes sont effectivement francisées, en revanche la maquette reste à l'américaine : la présentation des listes et la gestion des flottants, notamment, sans parler des possibilités de personnalisation de celles-ci. Si bien que pour le moment, j'en suis resté à babel.

Rappelons que la principale caractéristique de LuaTeX par rapport à XeTeX est l'incorporation du langage de script Lua. Cette possibilité ouvre des voies infinies de configuration et reconfiguration de LuaTeX aux programmeurs en herbe (c'est ainsi que sont programmés des paquets essentiels comme luaotfload, par exemple !).mais j'avoue ne pas l'avoir utilisée directement moi-même pour le moment. Je vous renvoie à nouveau à l'article précédent pour un exemple d'utilisation du paquet luacode, qui permet de faire de la programmation Lua dans LuaLaTeX.

La principale raison qui m'a fait switcher de PDFLaTeX à LuaLaTeX, en fait, outre la plus grande offre en matière de polices, c'est le programme-langage de dessin scientifique MetaPost, présenté ici-même, et qui est en fait inclus dans LuaTeX sous forme d'une librairie en langage C appelée mplib. Cette librairie nous est rendue accessible par le package luamplib, lui-même écrit essentiellement en langage Lua avec une interface TeX. Ce paquet, dont j'avais déploré dans l'article précédent le manque de fonctionnalités, est beaucoup plus développé dans ses versions les plus récentes, et je peux aujourd'hui m'en servir couramment pour mes dessins. En voici un exemple non élémentaire mais que je trouve assez esthétique, destiné à démontrer la puissance de cet outil : la spirale des racines carrées, ou spirale des irrationnels, que certains d'entre vous ont peut-être vue pendant leurs études secondaires :

% !TEX TS-program = LuaLaTeX
% !TEX encoding = UTF-8 Unicode
\documentclass[12pt]{scrartcl}
\usepackage[frenchb]{babel}
\usepackage{unicode-math}
\usepackage{luamplib}
\everymplib{
  verbatimtex
    \leavevmode
  etex;
  mark_size := 2mm;
% taille des marques d'angle droit
  u = 2.5cm;
% unité de longueur
  pair v;
% pour les étiquettes
  % Macro MetaPost pour dessiner une marque d'angle droit
  % prise dans le "Tutorial in MetaPost" d'André Heck
  vardef right_angle(expr endofa, common, endofb) =
    save tn; tn := turningnumber(common--endofa--endofb--cycle);
    ((1, 0)--(1,1)--(0,1))
      zscaled (mark_size * unitvector((1+tn)*endofa+(1-tn)*endofb-2*common))
      shifted common
  enddef;
 % Macro MetaPost dessinant la spirale
  vardef spirale (expr start, n) =
    save v; pair v; clearxy;
    image(z1 = start; draw origin -- z1;
    labeloffset:=3bp; label.top(textext("$1$"), 0.5z1);
    for i = 2 upto n:
      if i=n: drawoptions(withcolor red) fi;
      z[i] = z[i-1] + u*unitvector(z[i-1] rotated 90);
      draw z[i-1] -- z[i] -- origin;
      draw right_angle(origin, z[i-1] , z[i]);
        v := 0.5[z[i-1], z[i]];
      labeloffset := 6bp;
      label(textext("$1$"), origin) shifted (v + labeloffset*unitvector(v));
      labeloffset := 11bp;
      if (i < n):
        label(textext("$\sqrt{"& decimal(i) & "}$"), origin)
        shifted (0.5z[i] + labeloffset*unitvector(z[i]) rotated 90)
      else:
        label(textext("$\sqrt x$"), origin)
          shifted (0.5z[i] + labeloffset*unitvector(z[i]) rotated 90)
      fi;
    endfor;
    drawoptions();)
  enddef;
  beginfig(1);}
\everyendmplib{endfig;}
\begin{document}
La spirale des racines carrée, une construction géométrique pour obtenir des longueurs égales à des racines carrées d'entiers consécutifs.
\begin{center}
  \begin{mplibcode}
    draw spirale((u, 0), 13) ;
  \end{mplibcode}
\end{center}
\end{document}

spirale

Les polices de caractères utilisées dans le dessin sont les mêmes que celles du corps du texte (à savoir Latin Modern ici), ce qui est un plus considérable pour l'esthétique du document. Cela permet en outre d'utiliser des polices OpenType dans un dessin MetaPost, chose que le programme MetaPost utilisé indépendamment de LuaLaTeX ne permet malheureusement pas.

Voilà, voilà, c'est terminé ! J'espère que ce petit bout d'article aura convaincu certain TeXniciens parmi vous d'envisager de migrer vers LuaLaTeX. Après tout le moteur LuaTeX est destiné à remplacer complètement PDFTeX à terme, alors ce faisant vous ne feriez que prendre de l'avance sur l'horaire ! :-)

16 commentaires
1)
ToTheEnd
, le 19.02.2014 à 00:18

Zut, faut demander a Neo de venir jeter un œil a cette page car ça merde totalement… Plein de codes moisis au milieu d’une page web;-)

T

2)
Franck Pastor
, le 19.02.2014 à 06:24

Et encore je t’ai épargné du code Lua ! Pour une prochaine fois sans doute.

3)
jpg
, le 19.02.2014 à 07:38

Ceci paraît très intéressant, en particulier le graphisme. Quelle est la manière la plus simple de décharger/installer LuaTeX sous OS.8 ?

4)
Caplan
, le 19.02.2014 à 07:44

Zut, faut demander a Neo de venir jeter un œil a cette page

Ah non! S’il y a un problème avec Neo, c’est plutôt François qu’il faut appeler! ;-)

5)
ToTheEnd
, le 19.02.2014 à 08:41

Caplan: sans vouloir rentrer dans les détails, je plains tous les gens qui dépendent des outils informatiques du canton de Vaud…

T

6)
zawyat
, le 19.02.2014 à 10:41

Caplan et TTE : Rassurez-vous, ce n’est pas mieux à Fribourg…

7)
Franck Pastor
, le 19.02.2014 à 10:48

Ceci paraît très intéressant, en particulier le graphisme. Quelle est la manière la plus simple de décharger/installer LuaTeX sous OS.8 ?

Il est déjà installé avec tout le reste si tu as téléchargé et installé une distribution TeX classique comme MacTeX. Si ce n’est pas le cas, tu peux suivre les instructions que j’ai détaillées ici.

Notez que pour pouvoir compiler l’exemple avec le dessin scientifique, il faut disposer de la dernière version de luamplib, et donc mettre à jour l’exemplaire plus ancien disponible dans MacTeX. Ça peut se faire de façon simple via la TeX Live Utility.

8)
JPO
, le 19.02.2014 à 11:40

Bonjour, et merci pour cet article.
Je viens de compiler l’exemple de l’article sans souci, compilation très rapide (système 10.9.1 sur MacBook Pro i7).

J’ai rédigé, il y a un peu plus d’un an, un rapport en utilisant LuaLatex, après avoir lu un précédent article de Pastor, et dix routines Lua. J’ai un peu de mal à écrire en langage Lua mais j’ai pu faire ce que je voulais, bien en plus.

Depuis j’étais passé à XeLaTeX. Après avoir lu cet article j’ai essayé de compiler un de ces derniers documents en LuaLaTeX et je n’ai eu que trois lignes à changer. La compilation m’a semblé plus rapide.

La gestion des fontes système me paraît compliquée. Où se situe la liste des fontes utilisées par LuaLaTeX ? J’ai essayé luaotfload-tool –update après avoir installé la fonte « DejaVu LGC Sans Mono » après la première compilation et compilé un document contenant

\setmonofont[Mapping=tex-text,Scale=MatchLowercase]{DejaVu LGC Sans Mono}

et j’ai eu droit au message d’erreur

The font "DejaVuLGCSansMono" cannot be found

Le passage de pdfTeX à XeTeX a été un peu douloureux parce que le package microtype y est inactif, mais les avantages apportés par le second l’ont emporté sur cet inconvénient, qui je dois le dire ne gênait que mes yeux, mon petit club de lecteurs prisonnier n’y a vu aucune différence.

Je vais essayer de résoudre le problème d’ajout d’une fonte à la liste des fontes acceptées par LuaLaTeX, et je vais l’utiliser à nouveau pendant quelque temps.

Merci Franck, chacun de tes articles me fait évoluer.

9)
Franck Pastor
, le 19.02.2014 à 12:33

@JPO : merci pour ton appréciation !

J’ai téléchargé ici puis installé cette fonte DejaVuLGCSansMono dans ma bibliothèque de fontes personnelle, procédé à la mise à jour de la base de données de luaotfload, et tout fonctionne nickel avec ce programme :

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmonofont{DejaVuLGCSansMono}
\begin{document}
\texttt{Je n'avais jamais vu cette fonte DejaVu…}
\end{document}

Résultat :

Peut-être une question d’espace dans le nom donné en argument de \setmonofont ? J’ai donné directement le nom du fichier contenant la fonte, donc sans espace. 

10)
Franck Pastor
, le 19.02.2014 à 13:04

@JPO (suite) : il semble que la base de données soit située dans les fichiers de ce répertoire :

~/Library/texlive/2013/texmf-var/luatex-cache/generic/names

Il ne doit pas être recommandé d’éditer ces fichiers soi-même, j’imagine. En tout cas, on trouve trace de mon utilisation des DejaVuLGCSansMono dans le fichier luaotfload-lookup-cache.lua de ce dossier.

11)
JPO
, le 19.02.2014 à 19:22

Je viens d’essayer, mais ça n’a pas marché. Peut-être parce l’os est Mavericks ?
Seules les fontes qui étaient activées avant la première compilation sont fonctionnelles, par exemple :

\setmainfont[Mapping=tex-text,Numbers=OldStyle]{Bembo MT Std}
\setsansfont[Mapping=tex-text,Numbers=OldStyle,Scale=MatchLowercase]{Gill Sans}

fonctionnent sans problème.

Ces fontes, avec « DejaVu LGC Sans Mono », sont utilisées par Tufte.

12)
Franck Pastor
, le 19.02.2014 à 19:48

Pour ma part, je suis encore sur Mountain Lion, donc ton problème pourrait venir effectivement d’un rapport problématique entre luaotfload et Mavericks.

Au sujet de Mavericks et luaotfload, peut-être une piste dans ce sujet de discussion sur TeX Stackexchange. Il semblerait qu’il faille au minimum la version 2.4 de luaotfload pour que ce dernier fonctionne correctement avec Mavericks. Ça semble valoir le coup de mettre à jour luaotfload, en tout cas.

Note qu’après cette mise à jour, lors de la première compilation avec LuaLaTeX, luaotfload va reconstruire automatiquement toute sa base de données, ce qui va prendre pas mal de temps…

Si ça ne marche toujours pas, il faudrait idéalement faire un rapport de bug à Élie Roux, qui maintient ce package.

Ces fontes, avec « DejaVu LGC Sans Mono », sont utilisées par Tufte.

Je me disais aussi qu’elle étaient très élégantes, ces fontes DejaVu !

13)
François Cuneo
, le 20.02.2014 à 14:01

Quoi Neo…?

D’abord c’est NEO.

Et puis on a fini par pouvoir les faire, ces moyennes, ou bien?:-)

Bon.

Un vrai problème maintenant: j’ai essayé de faire un pas vers ce LaTeX: j’ai regardé comment fonctionne le Markdown.

Je progresse vers les balises donc!

14)
ToTheEnd
, le 20.02.2014 à 14:37

Un vrai problème maintenant: j’ai essayé de faire un pas vers ce LaTeX: j’ai regardé comment fonctionne le Markdown.
Je progresse vers les balises donc!

Traitre!

T

15)
Franck Pastor
, le 20.02.2014 à 15:11

Toujours prompt à dramatiser, hein TTE ? :-)

16)
ToTheEnd
, le 20.02.2014 à 23:11

Non, je ne suis pas journaliste! Je me permets simplement une remarque personnelle;-)

T