TeX a été conçu autour de polices de 256 caractères. Le chinois en demande des dizaines de milliers. La réponse donnée par le paquet CJK en 1994 fut d'une franchise brutale : découper la police en morceaux de 256 glyphes et ne charger que le morceau dans lequel tombe le caractère suivant. Passez aujourd'hui pdfLaTeX sur un paragraphe chinois et c'est encore littéralement ce qui en sort : un PDF portant gbsnu4e, gbsnu5b, gbsnu65, une sous-police par bloc Unicode. Cette page traite du CJK en LaTeX hors du monde pTeX : CJK/CJKutf8 avec pdfLaTeX, xeCJK avec XeLaTeX, ctex pour le chinois et kotex pour le coréen. Chacune de ces voies échoue d'abord sur la police, aussi y est-il précisé quelles polices CJK une installation TeX Live 2024 d'origine fournit réellement.
Chinois et coréen avec pdfLaTeX : CJKutf8 fonctionne encore
Être coincé sur pdfLaTeX n'empêche pas de composer du chinois ou du coréen. Sous TeX Live 2024, il suffit d'ajouter \usepackage{CJKutf8} et d'entourer le texte d'un environnement CJK* — sans installer la moindre police. Mesuré ici : chinois simplifié (gbsn), chinois traditionnel (bsmi), coréen (mj) et japonais (min) ont compilé du premier coup, en incorporant des sous-polices Type 1 dans le PDF. Le paquet est de Werner Lemberg, son en-tête de copyright indique 1994–2021, et la version présente dans TeX Live est la 4.8.5 du 16 octobre 2021. Il est gelé, non cassé. Le prix à payer : CJK ne lit que des polices converties à l'avance pour TeX ; une police OpenType installée dans le système d'exploitation lui reste inaccessible. C'est précisément cette limite qui le sépare de XeLaTeX.
% pdflatex — simplified Chinese, no extra fonts needed
\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK*}{UTF8}{gbsn}
这是一段中文,混排 English words 也没问题。
\CJKfamily{gkai}换成楷体。
\end{CJK*}
\end{document}Le premier argument de l'environnement est l'encodage ; le second est la famille de police, et ce qu'on peut y écrire dépend entièrement des polices déjà converties dont on dispose. Huit familles ont compilé telles quelles sous TeX Live 2024, listées ci-dessous. Seule song a échoué, avec Font cyberb30 at 600 not found : elle suppose Cyberbit, une police à se procurer à part. L'autre écueil que tout le monde rencontre une fois, c'est d'écrire des caractères CJK hors de l'environnement. On obtient alors ! LaTeX Error: Unicode character 日 (U+65E5) not set up for use with LaTeX., une erreur par caractère : un paragraphe égaré en produit des dizaines. Lisez la première erreur du journal, pas leur nombre.
| Famille | Langue | Police sous-jacente | TeX Live 2024 |
|---|---|---|---|
gbsn | Chinois simplifié | Arphic GB Song (arphic) | fourni, compile tel quel |
gkai | Chinois simplifié | Arphic GB Kai (arphic) | fourni, compile tel quel |
bsmi | Chinois traditionnel | Arphic Big5 Ming (arphic) | fourni, compile tel quel |
bkai | Chinois traditionnel | Arphic Big5 Kai (arphic) | fourni, compile tel quel |
mj | Coréen | UHC Myeongjo (uhc) | fourni ; kotex est préférable |
min | Japonais | Wadalab Mincho (wadalab) | fourni ; upLaTeX est préférable |
goth | Japonais | Wadalab Gothic (wadalab) | fourni, compile tel quel |
maru | Japonais | Wadalab Maru Gothic (wadalab) | fourni, compile tel quel |
song | Chinois | Cyberbit (à se procurer) | échoue avec Font cyberb30 at 600 not found |
La différence entre CJK et CJK* n'est pas cosmétique. Un commentaire de CJK.sty le dit sans détour : CJK* avale l'espace qui suit un caractère CJK, CJK non. Dans un vrai manuscrit, une phrase chinoise est coupée sur plusieurs lignes source, et ce saut de ligne vaut une espace pour TeX. Dans CJK, le résultat était 汉字之间不应该 出现空格。, avec un trou au milieu de la phrase ; dans CJK*, il est sorti correctement resserré : 汉字之间不应该出现空格。 Pour le chinois et le japonais, CJK* est le choix par défaut. Pour la même raison, il faut toujours passer à la ligne juste après \begin{CJK*}{UTF8}{gbsn} : ce qui reste sur cette ligne est lu avant que les significations CJK ne s'appliquent. Pour changer de police en cours de texte, \CJKfamily{gkai} suffit, sans imbriquer d'environnements.
Si le japonais sous pdfLaTeX vous est imposé, bxcjkjatype (par ZR ; v0.5 du 23 juillet 2023 dans TeX Live 2024), bâti au-dessus de CJK, est nettement plus confortable. Écrire \usepackage[whole]{bxcjkjatype} enveloppe automatiquement tout le document : plus besoin d'écrire soi-même un environnement CJK*, et l'espace issue du saut de ligne comme l'espacement entre japonais et alphabet latin sont pris en charge. Mesuré ici, la composition s'est correctement resserrée et ipaex-type1, IPAex Mincho converti en Type 1, a été incorporé. Cela reste un contournement pour qui est cloué à pdfLaTeX ; si le moteur se choisit, lisez la suite.
CJK avec XeLaTeX : où le réglage des polices xeCJK dérape
xeCJK ne fonctionne qu'avec XeLaTeX, et tout se joue sur la façon d'écrire le nom de la police. Écrire seulement \usepackage{xeCJK} produit un PDF sans la moindre erreur, car Fandol Song est chargée par défaut. Or Fandol Song est une police chinoise. Mêlez du coréen au même document et le journal se remplit de Missing character: There is no 한 (U+D55C) in font [FandolSong-Regular.otf] alors que le code de sortie reste 0 et que le hangul disparaît purement et simplement du PDF. L'extraction du texte l'a confirmé : la phrase coréenne n'y figurait pas du tout. Utiliser xeCJK pour un document plurigraphique impose de nommer une police par écriture.
% xelatex — one font per script; file names, not family names
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{FandolSong-Regular.otf}[
BoldFont = FandolSong-Bold.otf,
ItalicFont = FandolKai-Regular.otf]
\setCJKsansfont{FandolHei-Regular.otf}
\newCJKfontfamily\korean{UnBatang.ttf}
\begin{document}
这是一段中文。{\korean 한국어 문장입니다.}
\end{document}Ce qui pique ici, c'est que XeTeX demande ses polices au système d'exploitation. \setCJKmainfont{FandolSong-Regular.otf} est un nom de fichier, se résout dans l'arborescence TeX et fonctionne. Écrivez la même police sous son nom de famille, \setCJKmainfont{Fandol Song}, et cela meurt sur ! Package fontspec Error: The font "Fandol Song" cannot be found. — alors qu'elle est livrée avec TeX Live. À l'inverse, les polices connues du système — Songti SC, PingFang SC, Hiragino Sans sous macOS — se sont résolues par nom de famille sans broncher. Le très recopié \setCJKmainfont{Noto Sans CJK SC} échoue de la même manière, car Noto CJK n'est pas fourni avec TeX Live ; faute de l'avoir installé soi-même, on obtient The font "Noto Sans CJK SC" cannot be found. La règle est simple : polices de l'arborescence TeX par nom de fichier, extension comprise ; polices du système par nom de famille. Ce comportement est détaillé sur la page XeTeX.
Une fois les polices réglées, viennent les espacements. xeCJK expose ses espacements entre caractères via \xeCJKsetup{...} : CJKglue est l'espace entre caractères CJK, CJKecglue celui entre CJK et alphabet latin. Sous TeX Live 2024, les valeurs par défaut sont 0pt plus 0.08\baselineskip pour CJKglue et ~ pour CJKecglue — autrement dit, une espace-mot entière est insérée entre un caractère chinois et un mot anglais. Pour qui connaît pTeX : même idée que \kanjiskip et \xkanjiskip, avec d'autres valeurs par défaut ; ces derniers relèvent de la page sur les détails de la composition japonaise. La compression de la ponctuation passe par PunctStyle, la coupure entre signes par AllowBreakBetweenPuncts. À noter : charger xeCJK sous LuaLaTeX s'arrête sur ! Critical Package xeCJK Error: The xeCJK package requires XeTeX to function. Le nom n'est pas décoratif.
Pour le chinois, ctex — et toujours fixer le fontset
Pour un document en chinois, recourir à ctex va plus vite que de configurer xeCJK à la main. Soit \documentclass{ctexart} (il existe aussi ctexrep, ctexbook et ctexbeamer), soit \usepackage[UTF8]{ctex} par-dessus une classe existante : caractères, interlignage, présentation chinoise des titres, compression de la ponctuation et numéros de chapitre en chiffres chinois arrivent d'un seul coup. ctex détecte le moteur automatiquement, par un mécanisme des plus simples : il vérifie l'existence d'un fichier nommé ctex-engine-<moteur>.def. Les moteurs pris en charge sont xelatex, lualatex, pdflatex, uplatex et aplatex ; tout autre s'arrête sur Engine '...' is not yet supported, ctex will abort! La version présente dans TeX Live 2024 est la 2.5.10.
% xelatex or lualatex — fandol is the only fontset TeX Live guarantees
\documentclass[fontset=fandol]{ctexart}
\begin{document}
\section{中文标题}
这是一段中文,混排 English words。今天是\today。
\end{document}L'ennui ne vient pas du moteur mais du jeu de polices. ctex tente aussi de détecter le système d'exploitation : windows sous Windows, mac sous macOS, fandol sinon. Le test macOS est savoureux : il vérifie l'existence du fichier /System/Library/Fonts/Menlo.ttc. Un paquet de composition qui identifie le système à la présence d'une police à chasse fixe pour programmeurs. Tant que la devinette tombe juste, c'est agréable ; quand elle rate, cela casse bruyamment. Mesuré ici : ctexart lancé sans fontset a réussi sous XeLaTeX, mais LuaLaTeX est mort sur ! Package fontspec Error: The font "STHeiti" cannot be found. et pdfLaTeX sur ! Critical Class ctexart Error: CTeX fontset 'mac' is unavailable in current mode. La conclusion est unique : écrivez toujours fontset= vous-même. Fandol est la seule famille chinoise que TeX Live garantit, donc fontset=fandol est le choix sûr pour un document destiné à circuler. Même ainsi, pdfLaTeX signale CTeX fontset 'fandol' is unavailable in current mode., car fandol ne vaut que pour les moteurs Unicode. Sous pdfLaTeX, ctex charge en interne CJKutf8 ainsi que CJKpunct/CJKspace et présuppose des polices Windows. S'il faut absolument composer du chinois avec pdfLaTeX, redescendre vers CJKutf8 et gbsn est plus réaliste que de se battre avec ctex.
Le coréen avec kotex : une ligne, n'importe quel moteur
Le coréen ne demande qu'une ligne — \usepackage{kotex} — et fonctionne aussi bien sous pdfLaTeX que sous XeLaTeX ou LuaLaTeX. C'est la situation la plus accueillante des trois langues CJK, et ouvrir kotex.sty explique pourquoi : le fichier est moins un paquet qu'un aiguilleur. Il cherche \directlua et \XeTeXrevision, puis charge l'un de trois paquets entièrement différents : kotexutf (cjk-ko) sous pdfTeX, xetexko sous XeTeX, luatexko sous LuaTeX. Les options sont transmises telles quelles en aval, si bien qu'on n'a jamais à se demander quelle voie est active. Les polices sont bien fournies elles aussi : mesuré ici, la voie pdfLaTeX a incorporé des sous-polices Type 1 de Nanum Myeongjo (nanumtype1) et la voie XeLaTeX a incorporé UnBatang (unfonts-core). L'extraction du texte était correcte dans les deux cas.
% pdflatex, xelatex or lualatex — all three work unchanged
\documentclass{article}
\usepackage[hangul]{kotex}
\begin{document}
\section{한국어 시험}
오늘은 \today 입니다.
\end{document}Ajouter [hangul] fait passer au coréen les chaînes du document et la date : mesuré, \today est devenu 2026년 8월 13일 et les légendes de figure 그림 1: (sans cette option, on reste sur August 13, 2026). Changer de police ramène la particularité de résolution des noms de XeLaTeX : \setmainhangulfont{UnBatang} est mort sur ! Package fontspec Error: The font "UnBatang" cannot be found., tandis que \setmainhangulfont{UnBatang.ttf} a fonctionné. UnBatang.ttf est pourtant dans l'arborescence TeX, et le nom de famille ne la trouve pas. On peut charger xetexko directement, mais passer par kotex évite d'inscrire un moteur dans la source, ce qui simplifie l'écriture à plusieurs et les soumissions.
Quelles polices CJK sont réellement dans TeX Live
Il n'y a aucun Noto CJK dans l'arborescence de polices de TeX Live 2024. Pas un fichier nommé NotoSansCJK ou NotoSerifCJK, et ce que le paquet noto de TeX Live fournit réellement, ce sont NotoSerif, NotoSans et NotoSansMono, familles latines. Le \setCJKmainfont{Noto Sans CJK SC} que l'on croise sur le web ne fonctionne que parce que son auteur avait installé Noto CJK dans son système. Mettez cette ligne dans un document que vous diffusez, ou dans une image de conteneur, et elle échouera sur la machine d'autrui. Ce qui est réellement livré figure dans le tableau ci-dessous, et l'on y voit combien le versant chinois est maigre : Fandol est la seule famille OpenType, Arphic n'existant que préconvertie pour le paquet CJK. Le japonais (Harano Aji, IPAex) et le coréen (polices Un, Baekmuk, Nanum) laissent bien plus de choix.
| Paquet TeX Live | Langue | Format | Utilisé par |
|---|---|---|---|
fandol | Chinois | OpenType | défaut de xeCJK et fontset=fandol de ctex |
arphic | Chinois | sous-polices Type 1 | familles gbsn/gkai/bsmi/bkai de CJKutf8 |
arphic-ttf | Chinois | TrueType | moteurs Unicode, par nom de fichier |
haranoaji | Japonais | OpenType | défaut de LuaTeX-ja, zxjatype et compagnie |
ipaex | Japonais | TrueType | moteurs Unicode, par nom de fichier |
wadalab | Japonais | sous-polices Type 1 | familles min/goth/maru de CJKutf8 |
unfonts-core | Coréen | TrueType | défaut de xetexko et luatexko |
nanumtype1 | Coréen | sous-polices Type 1 | kotex sous pdfLaTeX (cjk-ko) |
uhc | Coréen | sous-polices Type 1 | famille mj de CJKutf8 |
Quelle voie choisir
Quand le moteur se choisit librement : ctex sous XeLaTeX ou LuaLaTeX pour le chinois, kotex pour le coréen, upLaTeX ou LuaTeX-ja pour le japonais. On ne redescend vers CJK/CJKutf8 que si une classe ou un modèle impose pdfLaTeX — typiquement les règles de soumission d'une revue. Le japonais est la seule langue où le calcul change : dès que kinsoku, JFM, ruby et composition verticale entrent en jeu, xeCJK n'atteint pas ce que la famille pTeX et LuaTeX-ja ont accumulé. La comparaison des voies japonaises revient à la page des méthodes de composition japonaise, et le réglage fin des espacements à la page des détails. Pour les documents qui traversent les langues — un texte allemand citant du chinois, par exemple — le sujet devient babel, polyglossia et le changement de police : c'est la page multilingue qui s'en charge.
- Chinois →
\documentclass[fontset=fandol]{ctexart}sous XeLaTeX ou LuaLaTeX ; indiquez toujoursfontsetexplicitement. - Coréen →
\usepackage{kotex}, sur n'importe quel moteur ; ajoutez[hangul]pour passer aussi les chaînes du document en coréen. - Impossible de quitter pdfLaTeX →
CJKutf8avec un environnementCJK*;gbsn/bsmipour le chinois,kotexpour le coréen (il retombe sur cjk-ko). - Plusieurs écritures sous XeLaTeX →
xeCJKet un\newCJKfontfamilypar écriture. Sans cela, les caractères manquants disparaissent en silence. - Japonais → hors de portée de cette page ; choisissez plutôt upLaTeX ou LuaTeX-ja.