TeX se diseñó en torno a fuentes de 256 caracteres. El chino necesita decenas de miles. La respuesta que dio el paquete CJK en 1994 fue de una franqueza brutal: trocear la fuente en piezas de 256 glifos y cargar solo la pieza en la que cae el siguiente carácter. Ejecute hoy pdfLaTeX sobre un párrafo en chino y eso es literalmente lo que sale: un PDF con gbsnu4e, gbsnu5b, gbsnu65, una subfuente por bloque Unicode. Esta página trata el CJK en LaTeX fuera del mundo pTeX: CJK/CJKutf8 con pdfLaTeX, xeCJK con XeLaTeX, ctex para chino y kotex para coreano. Todas esas rutas fallan primero en la fuente, así que también se detalla qué fuentes CJK entrega realmente una instalación TeX Live 2024 sin retocar.
Chino y coreano en pdfLaTeX: CJKutf8 sigue funcionando
Estar atado a pdfLaTeX no impide componer chino ni coreano. En TeX Live 2024 basta con añadir \usepackage{CJKutf8} y envolver el texto en un entorno CJK*, sin instalar fuente alguna. Lo medido aquí: chino simplificado (gbsn), chino tradicional (bsmi), coreano (mj) y japonés (min) compilaron a la primera e incrustaron subfuentes Type 1 en el PDF. El paquete es de Werner Lemberg, su cabecera de copyright dice 1994–2021 y la versión incluida en TeX Live es la 4.8.5 del 16 de octubre de 2021. Está congelado, no roto. El precio: CJK solo lee fuentes convertidas de antemano para TeX; una fuente OpenType instalada en el sistema operativo queda fuera de su alcance. Esa única limitación es la que lo separa 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}El primer argumento del entorno es la codificación; el segundo es la familia de fuente, y lo que puede escribirse ahí depende por completo de qué fuentes preconvertidas haya. Ocho familias compilaron sin retoques en TeX Live 2024, listadas abajo. Solo falló song, con Font cyberb30 at 600 not found: presupone Cyberbit, una fuente que hay que conseguir aparte. El otro tropiezo que todo el mundo sufre una vez es escribir caracteres CJK fuera del entorno. Eso da ! LaTeX Error: Unicode character 日 (U+65E5) not set up for use with LaTeX., un error por carácter, así que un párrafo despistado produce decenas. Lea el primer error del registro, no cuántos hay.
| Familia | Idioma | Fuente subyacente | TeX Live 2024 |
|---|---|---|---|
gbsn | Chino simplificado | Arphic GB Song (arphic) | incluido, compila sin más |
gkai | Chino simplificado | Arphic GB Kai (arphic) | incluido, compila sin más |
bsmi | Chino tradicional | Arphic Big5 Ming (arphic) | incluido, compila sin más |
bkai | Chino tradicional | Arphic Big5 Kai (arphic) | incluido, compila sin más |
mj | Coreano | UHC Myeongjo (uhc) | incluido; kotex es mejor ruta |
min | Japonés | Wadalab Mincho (wadalab) | incluido; upLaTeX es mejor ruta |
goth | Japonés | Wadalab Gothic (wadalab) | incluido, compila sin más |
maru | Japonés | Wadalab Maru Gothic (wadalab) | incluido, compila sin más |
song | Chino | Cyberbit (aparte) | falla con Font cyberb30 at 600 not found |
La diferencia entre CJK y CJK* no es cosmética. Un comentario de CJK.sty lo dice sin rodeos: CJK* se traga el espacio que sigue a un carácter CJK, CJK no. En un manuscrito real una frase china se parte en varias líneas de la fuente, y ese salto de línea vale un espacio para TeX. Dentro de CJK el resultado fue 汉字之间不应该 出现空格。, con un hueco en mitad de la frase; dentro de CJK* salió correctamente cerrado: 汉字之间不应该出现空格。 Para chino y japonés, CJK* es la elección por defecto. Por la misma razón, conviene saltar de línea justo después de \begin{CJK*}{UTF8}{gbsn}: lo que quede en esa línea se lee antes de que rijan los significados CJK. Para cambiar de fuente a mitad de texto basta \CJKfamily{gkai}, sin anidar entornos.
Si le imponen componer japonés con pdfLaTeX, bxcjkjatype (de ZR; v0.5 del 23 de julio de 2023 en TeX Live 2024), construido sobre CJK, resulta bastante más llevadero. Escribir \usepackage[whole]{bxcjkjatype} envuelve todo el documento automáticamente, así que nunca hace falta escribir un entorno CJK* a mano, y se encarga tanto del espacio del salto de línea como del espaciado entre japonés y alfabeto latino. Lo medido: la composición cerró correctamente e incrustó ipaex-type1, IPAex Mincho convertido a Type 1. Sigue siendo un rodeo para quien está clavado a pdfLaTeX; si el motor es de libre elección, siga leyendo.
CJK en XeLaTeX: dónde se tuerce la configuración de fuentes de xeCJK
xeCJK solo va con XeLaTeX, y que compile o reviente depende de cómo se escriba el nombre de la fuente. Escribir únicamente \usepackage{xeCJK} produce un PDF sin un solo error, porque por defecto se carga Fandol Song. Pero Fandol Song es una fuente china. Mezcle coreano en el mismo documento y el registro se llena de Missing character: There is no 한 (U+D55C) in font [FandolSong-Regular.otf] mientras el código de salida sigue siendo 0 y el hangul desaparece del PDF sin más. La extracción de texto lo confirmó: la frase coreana no estaba. Si usa xeCJK para un documento con varias escrituras, nombrar una fuente por escritura no es opcional.
% 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}Lo que muerde aquí es que XeTeX pide sus fuentes al sistema operativo. \setCJKmainfont{FandolSong-Regular.otf} es un nombre de archivo, se resuelve dentro del árbol de TeX y funciona. Escriba la misma fuente por su nombre de familia, \setCJKmainfont{Fandol Song}, y muere con ! Package fontspec Error: The font "Fandol Song" cannot be found., aunque venga con TeX Live. A la inversa, las fuentes que el sistema conoce —Songti SC, PingFang SC, Hiragino Sans en macOS— se resolvieron por nombre de familia sin protestar. El muy copiado \setCJKmainfont{Noto Sans CJK SC} falla igual, porque Noto CJK no viene con TeX Live; si no lo instaló usted, obtiene The font "Noto Sans CJK SC" cannot be found. La regla es simple: fuentes del árbol de TeX por nombre de archivo con extensión, fuentes del sistema por nombre de familia. El comportamiento de fondo se trata a fondo en la página de XeTeX.
Resueltas las fuentes, tocan los espaciados. xeCJK expone sus espacios entre caracteres mediante \xeCJKsetup{...}: CJKglue es el espacio entre caracteres CJK y CJKecglue el que va entre CJK y alfabeto latino. En TeX Live 2024 los valores por defecto son 0pt plus 0.08\baselineskip para CJKglue y ~ para CJKecglue, es decir, se inserta un espacio interpalabra completo entre un carácter chino y una palabra inglesa. Para quien conozca pTeX: misma idea que \kanjiskip y \xkanjiskip, con otros valores por defecto; aquellos los cubre la página de detalles de composición japonesa. La compresión de la puntuación se ajusta con PunctStyle y el corte de línea entre signos con AllowBreakBetweenPuncts. Ojo: cargar xeCJK bajo LuaLaTeX se detiene con ! Critical Package xeCJK Error: The xeCJK package requires XeTeX to function. El nombre no es decorativo.
Para chino, ctex: y fije siempre el fontset
Para un documento en chino, echar mano de ctex sale más rápido que configurar xeCJK a mano. Con \documentclass{ctexart} (también existen ctexrep, ctexbook y ctexbeamer) o con \usepackage[UTF8]{ctex} sobre una clase existente se obtienen de una vez los tipos, el interlineado, la presentación china de los títulos, la compresión de la puntuación y los números de capítulo en cifras chinas. ctex detecta el motor automáticamente, con un mecanismo de lo más llano: comprueba si existe un archivo llamado ctex-engine-<motor>.def. Los motores admitidos son xelatex, lualatex, pdflatex, uplatex y aplatex; cualquier otro se detiene con Engine '...' is not yet supported, ctex will abort! La versión incluida en TeX Live 2024 es 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}El problema no es el motor sino el juego de fuentes. ctex intenta además detectar el sistema operativo: windows en Windows, mac en macOS, fandol en lo demás. La prueba de macOS es deliciosa: comprueba si existe el archivo /System/Library/Fonts/Menlo.ttc. Un paquete de composición que identifica el sistema por la presencia de una fuente monoespaciada de programador. Mientras la conjetura acierta resulta cómodo; cuando falla, rompe con estrépito. Lo medido: ctexart sin fontset, XeLaTeX salió adelante, pero LuaLaTeX murió con ! Package fontspec Error: The font "STHeiti" cannot be found. y pdfLaTeX con ! Critical Class ctexart Error: CTeX fontset 'mac' is unavailable in current mode. La conclusión es una: escriba siempre fontset= usted mismo. Fandol es la única familia china que TeX Live garantiza, así que fontset=fandol es la opción segura para un documento que vaya a circular. Aun así pdfLaTeX informa CTeX fontset 'fandol' is unavailable in current mode., porque fandol vale solo para motores Unicode. Bajo pdfLaTeX, ctex carga internamente CJKutf8 junto con CJKpunct/CJKspace y presupone fuentes de Windows. Si hay que componer chino con pdfLaTeX, bajar a CJKutf8 con gbsn es más realista que pelear con ctex.
Coreano con kotex: una línea, cualquier motor
El coreano necesita una línea —\usepackage{kotex}— y funciona igual en pdfLaTeX, XeLaTeX y LuaLaTeX. Es la situación más amable de las tres lenguas CJK, y abrir kotex.sty explica por qué: el archivo es menos un paquete que un repartidor. Busca \directlua y \XeTeXrevision y luego carga uno de tres paquetes por dentro completamente distintos: kotexutf (cjk-ko) bajo pdfTeX, xetexko bajo XeTeX, luatexko bajo LuaTeX. Las opciones se reenvían aguas abajo sin cambios, de modo que quien escribe nunca ha de pensar en qué ruta está activa. Las fuentes vienen de verdad: lo medido, la ruta pdfLaTeX incrustó subfuentes Type 1 de Nanum Myeongjo (nanumtype1) y la ruta XeLaTeX incrustó UnBatang (unfonts-core). La extracción de texto salió correcta en ambos casos.
% pdflatex, xelatex or lualatex — all three work unchanged
\documentclass{article}
\usepackage[hangul]{kotex}
\begin{document}
\section{한국어 시험}
오늘은 \today 입니다.
\end{document}Añadir [hangul] pasa al coreano también las cadenas del documento y la fecha: lo medido, \today quedó en 2026년 8월 13일 y los pies de figura en 그림 1: (sin esa opción siguen siendo August 13, 2026). Cambiar de fuente devuelve a escena la manía de resolución de nombres de XeLaTeX: \setmainhangulfont{UnBatang} murió con ! Package fontspec Error: The font "UnBatang" cannot be found., mientras que \setmainhangulfont{UnBatang.ttf} funcionó. UnBatang.ttf está dentro del árbol de TeX y aun así el nombre de familia no la encuentra. Se puede cargar xetexko directamente, pero pasar por kotex evita fijar un motor en la fuente, lo que facilita la coautoría y los envíos a revistas.
Qué fuentes CJK hay realmente en TeX Live
No hay ningún Noto CJK en el árbol de fuentes de TeX Live 2024. No existe un solo archivo llamado NotoSansCJK ni NotoSerifCJK, y lo que el paquete noto de TeX Live entrega realmente son NotoSerif, NotoSans y NotoSansMono, familias latinas. El \setCJKmainfont{Noto Sans CJK SC} que se ve por la web funciona solo porque quien lo escribió tenía Noto CJK instalado en su sistema. Ponga esa línea en un documento que vaya a distribuir, o en una imagen de contenedor, y fallará en la máquina de otro. Lo que sí viene está en la tabla de abajo, y muestra lo delgado que es el lado chino: Fandol es la única familia OpenType y Arphic solo existe preconvertida para el paquete CJK. El japonés (Harano Aji, IPAex) y el coreano (fuentes Un, Baekmuk, Nanum) dejan bastante más margen.
| Paquete de TeX Live | Idioma | Formato | Ruta que la usa |
|---|---|---|---|
fandol | Chino | OpenType | valor por defecto de xeCJK y fontset=fandol de ctex |
arphic | Chino | subfuentes Type 1 | familias gbsn/gkai/bsmi/bkai de CJKutf8 |
arphic-ttf | Chino | TrueType | motores Unicode, por nombre de archivo |
haranoaji | Japonés | OpenType | valor por defecto de LuaTeX-ja, zxjatype y afines |
ipaex | Japonés | TrueType | motores Unicode, por nombre de archivo |
wadalab | Japonés | subfuentes Type 1 | familias min/goth/maru de CJKutf8 |
unfonts-core | Coreano | TrueType | valor por defecto de xetexko y luatexko |
nanumtype1 | Coreano | subfuentes Type 1 | kotex en pdfLaTeX (cjk-ko) |
uhc | Coreano | subfuentes Type 1 | familia mj de CJKutf8 |
Qué ruta elegir
Cuando el motor es de libre elección: ctex con XeLaTeX o LuaLaTeX para chino, kotex para coreano, y upLaTeX o LuaTeX-ja para japonés. Solo se baja a CJK/CJKutf8 cuando una clase o plantilla obliga a pdfLaTeX, típicamente las normas de envío de una revista. El japonés es la única lengua donde el cálculo cambia: en cuanto entran kinsoku, JFM, ruby y escritura vertical, xeCJK no alcanza lo que la familia pTeX y LuaTeX-ja han acumulado. La comparación de rutas japonesas corresponde a la página de métodos de composición japonesa, y el ajuste fino de espaciados a la de detalles. Para documentos que cruzan lenguas —un texto alemán que cita chino, por ejemplo— el asunto pasa a ser babel, polyglossia y el cambio de fuente: de eso se ocupa la página multilingüe.
- Chino →
\documentclass[fontset=fandol]{ctexart}en XeLaTeX o LuaLaTeX; indique siemprefontsetde forma explícita. - Coreano →
\usepackage{kotex}, en cualquier motor; añada[hangul]para pasar también al coreano las cadenas del documento. - No se puede salir de pdfLaTeX →
CJKutf8con un entornoCJK*;gbsn/bsmipara chino,kotexpara coreano (cae en cjk-ko). - Varias escrituras bajo XeLaTeX →
xeCJKmás un\newCJKfontfamilypor escritura. Sin eso, los caracteres ausentes desaparecen en silencio. - Japonés → fuera del alcance de esta página; elija upLaTeX o LuaTeX-ja.