TeX/LaTeX et le japonais

Dès qu’on se met à composer du japonais avec LaTeX, on s’entend dire de lancer platex ou uplatex. Or aucun exécutable ne porte ces noms. Ce sont là des noms de formats chargés par un unique moteur, euptex : tapez platex et la première ligne affichée est « This is e-upTeX ». Une fois ce seul fait digéré, la moitié environ de l’opacité du TeX japonais se dissipe. Cette page explique pourquoi le japonais a réclamé une mécanique propre, en quoi diffèrent les trois voies encore vivantes (pLaTeX/upLaTeX avec dvipdfmx, LuaLaTeX avec LuaTeX-ja, et XeLaTeX), et par laquelle commencer son premier document.

Pourquoi le japonais a eu besoin de moteurs propres

La première raison est brutale : le TeX d’origine ne pouvait adresser que 256 caractères par police (128 à ses débuts). Y loger quelques milliers de kanji courants — sans parler des dizaines de milliers des jeux JIS — exigeait des artifices comme le découpage d’une police en sous-polices de 256 glyphes. La seconde raison est plus profonde : les règles de composition elles-mêmes diffèrent. La composition occidentale repose sur l’idée qu’on coupe entre les mots et que l’espace intermot s’étire et se comprime. Le japonais n’a pas de frontière de mot. La ligne peut se couper presque partout ; il faut donc, à l’inverse, indiquer au système, sous forme de règle, où la coupure est interdite.

Ces positions interdites forment les règles kinsoku : pas de ponctuation, de parenthèse fermante, de signe d’allongement ni de petit kana en début de ligne ; pas de parenthèse ouvrante en fin de ligne. S’y ajoutent l’espace d’un quart de cadratin inséré au contact du japonais et de l’occidental (\xkanjiskip), l’espacement entre les caractères japonais eux-mêmes (\kanjiskip), le resserrement de la ponctuation, et la composition verticale. La famille pTeX résout le tout en attribuant à chaque coupure candidate une pénalité — tant de points si ce caractère se retrouve en début de ligne — puis en retenant le découpage du paragraphe entier dont la somme est minimale. Les règles japonaises ont donc été coulées, sous forme de pénalités, dans le mécanisme dont TeX disposait déjà : embrasser tout le paragraphe, puis choisir les meilleures coupures.

La différence entre platex et uplatex — et pourquoi ce sont un seul moteur

La différence tient à l’étendue des caractères : platex reste dans les limites de JIS X 0208, uplatex couvre tout Unicode. Et ce ne sont pas deux programmes, mais deux formats chargés par le même moteur euptex. En ouvrant texmf-dist/web2c/fmtutil.cnf dans une arborescence TeX Live, on lit la relation en deux lignes : la première colonne donne le nom du format, la seconde le moteur qui le construit. Dans les deux lignes, la seconde colonne indique euptex. La distinction entre moteur et format se voit ici plus nettement que partout ailleurs.

fmtutil.cnf
# texmf-dist/web2c/fmtutil.cnf -- format, engine, hyphenation, ini file
platex   euptex language.dat *platex.ini
uplatex  euptex language.dat *uplatex.ini

# and so the banner names the engine, not the command you typed:
$ platex  ... This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-... (utf8.euc)   (preloaded format=platex)
$ uplatex ... This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-... (utf8.uptex) (preloaded format=uplatex)

Cette bannière mérite une lecture attentive. 3.141592653 est le numéro de version du TeX gelé de Knuth lui-même ; p4.1.1 est le niveau de l’extension pTeX, u1.30 celui d’upTeX — trois générations empilées sur une seule ligne. La parenthèse finale compte aussi : platex annonce (utf8.euc), uplatex annonce (utf8.uptex). La source s’écrit en UTF-8 dans les deux cas, mais les deux formats conservent les kanji dans des codages internes différents. Ce n’est pas une abstraction, cela mord. Donnez à platex un caractère hors de JIS X 0208 — 髙, 𠮷 ou 鷗 par exemple — et il s’arrête sur cette erreur :

log
! LaTeX Error: Unicode character ^^e9^^ab^^99 (U+9AD9)
               not set up for use with LaTeX.

# same file, same class, run through uplatex instead: compiles silently.

La conclusion pratique est simple. Il n’y a presque aucune raison de commencer un nouveau document sous pLaTeX ; utilisez uplatex. Formes variantes dans les noms propres, kanji anciens, caractères supplémentaires, une citation en coréen ou en chinois : rien de tout cela n’est exotique, et chacun arrête net platex. Les raisons de choisir platex sont étroites : le fichier de classe exigé par la revue n’est écrit que pour pLaTeX, ou l’on reprend une source existante. Les moteurs et macros de la famille pTeX sont aujourd’hui entretenus par la communauté japonaise de développement TeX.

Les trois voies encore vivantes aujourd’hui

En pratique, il y en a trois. upLaTeX produit un fichier DVI que dvipdfmx convertit en PDF — la voie traditionnelle ; LuaLaTeX avec luatexja, qui émet directement du PDF ; et XeLaTeX avec xeCJK. Une quatrième, pdfLaTeX avec CJKutf8, existe mais impose d’envelopper le texte dans \begin{CJK}{UTF8}{min} et n’offre pas de kinsoku sérieux : elle ne convient qu’à glisser quelques mots japonais dans un article en anglais. Ce qui sépare les trois, c’est la manière d’accéder aux polices et la longueur du chemin jusqu’au PDF.

VoieClasse et packagesCaractère et usages
uplatex + dvipdfmxjlreq, jsarticle (jsclasses)Rapide ; le plus d’expérience en composition verticale ; souvent imposé par les revues. Deux étapes jusqu’au PDF
lualatex + luatexjajlreq, ltjsarticle (ltjsclasses)Emploie telles quelles les polices OpenType du système et écrit directement le PDF ; le plus solide en Unicode. Compilation lente
xelatex + xeCJKbxjsarticle (bxjscls), etc.Choix de polices commode ; bon pour mêler chinois et coréen. Moins fin que luatexja sur les règles japonaises
pdflatex + CJKutf8article plus le package CJKQuelques mots dans un texte anglais. Exige \begin{CJK}{UTF8}{min} autour du texte ; inadapté à tout un document

Pourquoi la voie japonaise passe encore par DVI

Parce que les moteurs de la famille pTeX ne savent pas écrire directement du PDF. Là où pdfTeX a intégré la sortie PDF, pTeX achève son travail sur le format de sortie originel de TeX, le DVI. Convertir ce DVI en PDF revient à dvipdfmx, qui prend en charge l’incorporation des polices japonaises et les transformations de coordonnées du texte vertical. La voie japonaise traditionnelle répartit donc la composition et la génération du PDF entre deux programmes. En lançant localement uplatex puis dvipdfmx, un .dvi de quelques centaines d’octets devient un PDF de quelques kilo-octets ; un coup d’œil avec pdffonts montre HaranoAjiMincho incorporé comme police CID Type 0C.

shell
$ uplatex doc.tex      # typeset -> doc.dvi
$ dvipdfmx doc.dvi     # convert  -> doc.pdf
$ pdffonts doc.pdf
# HaranoAjiMincho-Regular   CID Type 0C   Identity-H   emb yes

# dvipdfmx is a symlink to xdvipdfmx: one binary serves both
# the Japanese .dvi route and XeTeX's .xdv output.

Au passage, dvipdfmx sur le disque est un lien symbolique vers xdvipdfmx. Un seul binaire dessert à la fois la voie japonaise du .dvi et le .xdv que produit XeTeX. Un convertisseur affiné pour le japonais est ainsi devenu l’étage de sortie de XeTeX dans le monde entier — un cas où un outil né au Japon a rejoint le courant principal de TeX. Il en va de même des polices Harano Aji incorporées, livrées avec TeX Live : le premier PDF japonais sort sans avoir à acheter de fonte.

Par laquelle écrire son premier document

Écrire \documentclass{jlreq} et compiler avec lualatex. Ce n’est pas qu’une question de qualité. La classe jlreq de Noriyuki Abe suit les « Requirements for Japanese Text Layout » du W3C, mais ce qu’elle a de plus précieux en pratique, c’est que la même source tourne sans retouche sur LuaLaTeX, upLaTeX et pLaTeX. Le moteur est détecté automatiquement et l’on peut, au besoin, nommer platex, uplatex ou lualatex en option de classe. Le premier choix n’est donc pas irréversible. Passé par uplatex puis par lualatex, un même .tex produit dans les deux cas un PDF où Harano Aji Mincho est incorporée.

latex
% runs unchanged under lualatex, uplatex and platex
\documentclass{jlreq}
\begin{document}
こんにちは、\LaTeX。日本語の組版です。
\end{document}

Pour changer de polices, on charge luatexja-fontspec sous LuaLaTeX et l’on désigne le mincho avec \setmainjfont, le gothique avec \setsansjfont. Du côté traditionnel, les valeurs sûres sont jsclasses (jsarticle, jsbook) pour pLaTeX et upLaTeX, et ltjsclasses (ltjsarticle et consorts) pour LuaLaTeX. Mais si l’on retient ltjsarticle, le compilateur doit lui aussi être LuaLaTeX : le décalage entre la classe et le moteur est l’accident le plus fréquent dans les configurations japonaises.

Là où la première tentative achoppe

Quand le japonais ne sort pas, ou sort en mojibake, la cause est presque toujours l’une de deux : le codage de la source ou un décalage entre la classe et le moteur. Enregistrez la source en UTF-8. EUC-JP, Shift_JIS et ISO-2022-JP ont coexisté et un convertisseur comme nkf faisait partie de l’équipement de base ; ce n’est plus le cas. upTeX et LuaTeX sont natifs Unicode, et le pLaTeX actuel suppose lui aussi une entrée UTF-8. La conversion ne sert plus qu’à reprendre une source ancienne. L’autre piège tient aux fins de ligne : LF et CRLF mêlés dans un même fichier produisent parfois des ruptures dont la cause se laisse mal voir.

  • Ne pas composer de corps de texte japonais avec pdflatex. Devant une erreur ou du mojibake, soupçonner d’abord le réglage du compilateur ; même avec CJKutf8, le texte doit être enveloppé dans \begin{CJK}{UTF8}{min}.
  • Si l’on charge ltjsarticle ou luatexja, compiler avec lualatex ; pour jsarticle, employer uplatex. C’est la classe qui décide du moteur : ajuster aussi le réglage de compilation de l’éditeur.
  • Si platex signale ! LaTeX Error: Unicode character ... not set up for use with LaTeX., le caractère est hors de JIS X 0208 ; passer à uplatex règle le plus souvent l’affaire.
  • En coécriture, consigner trois choses sur une ligne du README : moteur, codage, classe. Sans ces trois-là, la compilation ne se reproduit pas ailleurs.
  • Si la revue diffuse un fichier de classe écrit pour platex, l’utiliser sans discuter — mais vérifier avant l’envoi qu’aucun caractère variant ne s’est glissé dans le texte.