Le conseil le plus répandu au sujet des documents multilingues en LaTeX est « babel pour pdfLaTeX, polyglossia pour XeLaTeX ». Il a vieilli. Le babel de TeX Live 2024 date de février 2024, prend en charge pdfTeX, XeTeX et LuaTeX indifféremment, attribue des polices système par langue via \babelfont et embarque, sur LuaTeX, sa propre mise en œuvre de l’algorithme bidirectionnel Unicode. Comptez les données de locale sur votre disque : babel propose 297 répertoires de langues et 387 fichiers .ini. polyglossia, lui, dépend de fontspec et ne démarre même pas sous pdfLaTeX. Cette page parcourt ce qu’il faut pour composer un document mêlant plusieurs écritures : lequel des deux choisir, comment changer de langue, et où la césure et les fontes échouent en silence — avec les messages que chaque défaillance produit réellement.
babel ou polyglossia : lequel utiliser
Utilisez babel, sauf raison précise de faire autrement. Il fonctionne sur tous les moteurs, livre davantage de données de locale et se développe le plus activement des deux. Le babel de TeX Live 2024 porte 2024/02/07 v24.2 — le numéro de version est une année parce qu’il en paraît plusieurs par an. Il a été écrit par Johannes Braams et est aujourd’hui maintenu par Javier Bezos. polyglossia en est à 2024/03/07 v2.1, se décrit dans sa propre ligne de package comme une composition multilingue moderne avec XeLaTeX et LuaLaTeX, et se présente dans son README comme une solution de remplacement de babel pour les utilisateurs de ces deux moteurs. Les deux ne sont donc pas des choix équivalents mais emboîtés : babel couvre tout le champ, polyglossia les seuls moteurs Unicode. Chargez polyglossia sous pdfLaTeX et l’arrêt ne vient pas de lui mais de sa dépendance : ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX.
| Aspect | babel | polyglossia |
|---|---|---|
engines | pdfTeX, XeTeX et LuaTeX indifféremment | XeTeX et LuaTeX seulement (fontspec requis) |
locale data | 297 répertoires de langues et 387 fichiers .ini (mesuré sous TeX Live 2024) | 242 fichiers gloss, annoncés pour plus de 80 langues |
declaring | \usepackage[french,english]{babel} ; la dernière est la langue principale | \setmainlanguage{...} et \setotherlanguage{...} ; les langues secondaires doivent être explicites |
switching | \selectlanguage{...} pour un bloc et \foreignlanguage{...}{...} en ligne | les deux mêmes, plus \text suivi du nom de langue, comme \textgreek{...} |
fonts | \babelfont{rm}{...} attribue par langue ou par écriture (moteurs Unicode uniquement) | des commandes fontspec telles que \newfontfamily\greekfont{...} |
bidi | Sur LuaTeX, bidi=basic est la mise en œuvre Unicode propre à babel ; sur XeTeX, il délègue au package bidi | délègue entièrement la direction à bidi (XeTeX) et luabidi (LuaTeX) |
license | LPPL, statut de maintenance maintained, Current Maintainer Javier Bezos | licence MIT |
Changer de langue avec selectlanguage et foreignlanguage
Employez \selectlanguage{french} pour un passage entier et \foreignlanguage{french}{...} pour une locution au fil de la phrase. Le premier reste en vigueur à partir de là, le second n’agit que dans son argument. Ce qui change n’est pas seulement la césure. \tableofcontents devient « Table des matières » et le mot précédant un numéro de chapitre devient « Chapitre » : c’est la traduction des chaînes du document, et c’est là que babel se rend le plus utile en pratique. Plus frappant encore : le texte composé lui-même change. Comme le mesure la page consacrée à la composition du texte occidental, Bonjour: oui! occupe 58,48572pt tel quel mais s’étire à 62,37366pt sous [french]{babel}, et l’extraction par pdftotext renvoie Bonjour : oui !. La règle française de l’espace fine devant la ponctuation haute a été appliquée comme un blanc réel devant le deux-points et le point d’exclamation. Voyez donc babel non comme un outil pour étiqueter une langue, mais pour appliquer ses usages typographiques.
% babel: the LAST option is the main language of the document
\usepackage[russian,french,english]{babel}
...
\foreignlanguage{french}{Bonjour : oui !} % inline, one phrase
\selectlanguage{french} % from here on
\tableofcontents % now "Table des matieres"
% polyglossia (XeLaTeX / LuaLaTeX only)
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{greek} % secondary languages must be declared
\textgreek{...} % \text + language nameQue se passe-t-il quand une langue n’a pas de motifs de césure
On obtient un avertissement, pas une erreur, et le texte est coupé selon les règles anglaises. La raison tient à une contrainte de TeX : les motifs de césure ne peuvent pas être chargés à l’exécution, ils sont gravés dans le format au moment de sa construction. Le language.dat de TeX Live 2024 recense 87 langues une fois les lignes d’alias écartées, tandis que babel livre des fichiers .ldf pour davantage : les deux ensembles ne coïncident donc pas. Choisissez l’albanais avec \usepackage[albanian,english]{babel} et vous verrez Package babel Warning: No hyphenation patterns were preloaded for the language 'Albanian' into the format. suivi de Now I will use the patterns preloaded for \language=0 instead. Or \language=0 est le hyphen.tex d’origine de Knuth, c’est-à-dire l’anglais américain. Le PDF est produit sans broncher et le code de retour vaut 0 ; les mots albanais sont simplement coupés à l’anglaise. Rien ne vous en avertit si vous ne lisez pas le journal. Les remèdes : installer le package contenant les motifs de cette langue et reconstruire le format avec fmtutil, ou, sur un moteur Unicode, utiliser \babelprovide[import]{...}.
Changer de fonte selon l’écriture : l’échec le plus fréquent
Déclarer une langue n’apporte pas la fonte avec elle. C’est de loin l’accident le plus fréquent dans les documents multilingues. Déclarez \setotherlanguage{russian} sous XeLaTeX, écrivez \textrussian{Русский} : comme le Latin Modern par défaut n’a pas de cyrillique, ce passage disparaît de la page. Aucune erreur n’est levée. Seul le journal porte, caractère par caractère, une ligne du type Missing character: There is no Р (U+0420) in font [lmroman10-regular]. Le code de retour vaut 0, le PDF existe, et seul le russe est blanc — nul échec n’est plus facile à manquer. Le remède consiste à attribuer une fonte par écriture : \babelfont[russian]{rm}{...} avec babel, ou le \newfontfamily\russianfont{...} de fontspec avec polyglossia. Attention toutefois : \babelfont est réservé aux moteurs Unicode ; appelé sous pdfLaTeX, il donne une séquence de contrôle indéfinie, \babelfont ->\bbl@error@ {only-lua-xe}. Pour traiter des écritures non latines sous pdfLaTeX, la voie passe non par les fontes mais par les codages de fontenc : T2A pour le cyrillique, LGR pour le grec.
% XeLaTeX / LuaLaTeX: give each script a font that actually has it
\usepackage[russian,greek,english]{babel}
\babelfont{rm}{Latin Modern Roman}
\babelfont[russian]{rm}{Times New Roman}
\babelfont[greek]{rm}{Times New Roman}
% pdfLaTeX has no \babelfont: match the encoding instead
% \usepackage[T2A,LGR,T1]{fontenc} % Cyrillic, Greek, Latin
% Without this the text is simply absent and the log says:
% Missing character: There is no Р (U+0420) in font [lmroman10-regular]Écriture de droite à gauche : LuaLaTeX pour l’arabe et l’hébreu
Pour de la composition bidirectionnelle sérieuse, LuaLaTeX est le seul choix. Ce n’est pas affaire de goût mais de localisation de la fonctionnalité. babel choisit son traitement bidirectionnel par l’option bidi=, et bidi=basic — le mode où babel implémente lui-même l’algorithme bidirectionnel Unicode — ne fonctionne que sur LuaTeX. Demandez-le sous XeLaTeX et on vous prévient sans détour que les résultats seront faux : ! Package babel Error: The bidi method 'basic' is available only in luatex. I'll continue with 'bidi=default', so expect wrong results. L’option côté XeLaTeX est bidi=bidi, qui délègue au package externe bidi — mais son simple chargement produit Package babel Warning: Some functions for 'bidi=bidi' are tentative. They might not work as expected and their behavior could change in the future. polyglossia est dans la même situation, puisqu’il confie lui aussi la direction à bidi et luabidi. Sur LuaLaTeX, en combinant \babelprovide[import, main]{arabic} et \babelfont{rm}{...}, un document mêlant arabe et anglais compile sans le moindre avertissement.
On peut aussi employer directement le package bidi : \setRTL (alias \setRL) fait passer le flux de droite à gauche à partir de là, et \setLTR (alias \setLR) le ramène. Sous XeTeX, la direction ne peut pas être déduite automatiquement : chaque endroit où LR et RL se rencontrent réclame un balisage explicite — et c’est la quantité de ce marquage manuel qui pèse. Le bidi=basic de LuaTeX tranche ces frontières selon les règles Unicode et retourne également la mise en page, tableaux et marges compris. Pour une langue comme le persan, de droite à gauche mais avec ses propres usages pour les chiffres, babel propose des réglages plus fins comme bidi.mapdigits. Le résumé est simple : pour tout document contenant de l’arabe, de l’hébreu ou du persan, commencer sur LuaLaTeX est finalement le chemin le plus rapide.
% LuaLaTeX: babel handles direction with its own Unicode implementation
\usepackage[bidi=basic]{babel}
\babelprovide[import, main]{arabic}
\babelfont{rm}{Geeza Pro}
% mixed Arabic and English needs no manual direction marks here
% XeLaTeX must delegate to the bidi package, which babel calls tentative
% \usepackage[bidi=bidi]{babel}
% \setRTL % or \setRL -- switch the flow right-to-left
% \setLTR % or \setLR -- switch it backComment choisir, finalement ?
La décision ne part pas de « quelles langues vais-je mêler ? » mais de « avec quel moteur vais-je composer ? » Un mélange de latin avec un peu de cyrillique et de grec passe parfaitement par pdfLaTeX, babel et fontenc ; mais si vous voulez des polices système, ou s’il y a de l’arabe, de l’hébreu ou une écriture indienne, il faut un moteur Unicode. Ce n’est qu’une fois ce point réglé que se pose la question babel ou polyglossia. Le CJK relève d’une autre histoire : le japonais est l’affaire des moteurs de la famille pTeX et de leurs classes, tandis que le chinois, le coréen et le japonais hors du monde pTeX appartiennent à CJKutf8, xeCJK, ctex et kotex — les deux ont leurs pages propres.
- Surtout du latin avec un peu de cyrillique ou de grec → pdfLaTeX avec
babeletfontenc(T2A/LGR). Inutile de bouleverser un flux de travail existant. - Vous voulez des polices système, ou plusieurs écritures se mêlent → XeLaTeX ou LuaLaTeX avec
babelet\babelfont. - De l’arabe, de l’hébreu ou du persan (RTL) est en jeu → LuaLaTeX avec le
bidi=basicde babel. Ce mode n’existe pas sous XeLaTeX. - Raisons de choisir polyglossia → vous avez déjà des documents écrits pour lui, ou la langue voulue n’est prise en charge que là. Pour un nouveau projet, babel est plus sûr.
- Japonais, chinois ou coréen → les voies dédiées (les pages de composition japonaise et la page CJK).