Multilingüe

El consejo que más se repite sobre los documentos multilingües en LaTeX es «babel para pdfLaTeX, polyglossia para XeLaTeX». Ha quedado desfasado. El babel de TeX Live 2024 lleva fecha de febrero de 2024, admite por igual pdfTeX, XeTeX y LuaTeX, asigna fuentes del sistema por lengua mediante \babelfont y trae, sobre LuaTeX, su propia implementación del algoritmo bidireccional de Unicode. Cuente los datos de configuración regional en su disco: babel ofrece 297 directorios de lenguas y 387 archivos .ini. polyglossia, en cambio, depende de fontspec y ni siquiera arranca bajo pdfLaTeX. Esta página recorre lo que hace falta para componer un documento que mezcla escrituras: cuál de los dos elegir, cómo cambiar de lengua y dónde fallan en silencio la separación silábica y las fuentes — con los mensajes que cada fallo produce realmente.

babel frente a polyglossia: cuál usar

Use babel salvo que tenga una razón concreta para no hacerlo. Funciona en todos los motores, trae más datos de configuración regional y es el más activamente desarrollado de los dos. El babel de TeX Live 2024 lleva 2024/02/07 v24.2 — el número de versión es un año porque salen varias al año. Lo escribió Johannes Braams y hoy lo mantiene Javier Bezos. polyglossia va por 2024/03/07 v2.1, se describe en su propia línea de paquete como composición multilingüe moderna con XeLaTeX y LuaLaTeX, y se presenta en su README como alternativa a babel para los usuarios de esos dos motores. Los dos no son, pues, opciones equivalentes sino anidadas: babel cubre todo el campo, polyglossia solo los motores Unicode. Cargue polyglossia bajo pdfLaTeX y la parada no viene de él sino de su dependencia: ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX.

Aspectobabelpolyglossia
enginespdfTeX, XeTeX y LuaTeX por igualsolo XeTeX y LuaTeX (fontspec obligatorio)
locale data297 directorios de lenguas y 387 archivos .ini (medido en TeX Live 2024)242 archivos gloss, anunciados para más de 80 lenguas
declaring\usepackage[french,english]{babel}; la última es la lengua principal\setmainlanguage{...} y \setotherlanguage{...}; las secundarias deben ser explícitas
switching\selectlanguage{...} para un bloque y \foreignlanguage{...}{...} en línealos dos mismos, más \text seguido del nombre de lengua, como \textgreek{...}
fonts\babelfont{rm}{...} asigna por lengua o escritura (solo motores Unicode)comandos de fontspec como \newfontfamily\greekfont{...}
bidiEn LuaTeX, bidi=basic es la implementación Unicode propia de babel; en XeTeX delega en el paquete bididelega la dirección por completo en bidi (XeTeX) y luabidi (LuaTeX)
licenseLPPL, estado de mantenimiento maintained, Current Maintainer Javier Bezoslicencia MIT

Cambiar de lengua con selectlanguage y foreignlanguage

Use \selectlanguage{french} para un tramo de texto y \foreignlanguage{french}{...} para una expresión dentro de la frase. El primero queda en vigor desde ese punto; el segundo solo actúa dentro de su argumento. Lo que cambia no son únicamente las reglas de partición. \tableofcontents pasa a ser «Table des matières» y la palabra ante un número de capítulo se convierte en «Chapitre»: esa es la traducción de las cadenas del documento, y ahí es donde babel resulta más útil en la práctica. Más llamativo aún: el propio texto compuesto cambia. Según la medición de la página sobre composición de texto occidental, Bonjour: oui! ocupa 58,48572pt sin más, pero se estira a 62,37366pt bajo [french]{babel}, y al extraerlo con pdftotext devuelve Bonjour : oui !. La regla francesa del espacio fino ante la puntuación alta se ha aplicado como blanco real delante de los dos puntos y del signo de exclamación. Vea babel, pues, no como una herramienta para etiquetar una lengua, sino para aplicar sus usos tipográficos.

latex
% 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 name

Qué ocurre cuando una lengua no tiene patrones de partición

Se obtiene un aviso, no un error, y el texto se parte con reglas inglesas. La razón es una restricción de TeX: los patrones de partición no pueden cargarse en tiempo de ejecución, sino que se graban en el formato al construirlo. El language.dat de TeX Live 2024 enumera 87 lenguas una vez descontadas las líneas de alias, mientras que babel trae archivos .ldf para más, de modo que ambos conjuntos no coinciden. Elija el albanés con \usepackage[albanian,english]{babel} y verá Package babel Warning: No hyphenation patterns were preloaded for the language 'Albanian' into the format. seguido de Now I will use the patterns preloaded for \language=0 instead. Y \language=0 es el hyphen.tex original de Knuth, es decir, inglés americano. El PDF se produce sin queja y el código de salida es 0; las palabras albanesas simplemente se cortan a la inglesa. Nada se lo advierte si no lee el registro. Los remedios: instalar el paquete con los patrones de esa lengua y reconstruir el formato con fmtutil, o, en un motor Unicode, usar \babelprovide[import]{...}.

Cambiar de fuente según la escritura: el fallo más habitual

Declarar una lengua no trae consigo una fuente. Es con diferencia el accidente más frecuente en documentos multilingües. Declare \setotherlanguage{russian} bajo XeLaTeX, escriba \textrussian{Русский} y, como el Latin Modern por defecto no tiene cirílico, ese pasaje desaparece de la página. No se lanza ningún error. Solo el registro lleva, carácter a carácter, una línea del tipo Missing character: There is no Р (U+0420) in font [lmroman10-regular]. El código de salida es 0, el PDF existe y solo el ruso queda en blanco: ningún fallo es más fácil de pasar por alto. El remedio es asignar una fuente por escritura: \babelfont[russian]{rm}{...} con babel, o el \newfontfamily\russianfont{...} de fontspec con polyglossia. Ojo, eso sí: \babelfont es solo para motores Unicode; invocado bajo pdfLaTeX da una secuencia de control indefinida, \babelfont ->\bbl@error@ {only-lua-xe}. Para manejar escrituras no latinas en pdfLaTeX el camino no pasa por las fuentes sino por las codificaciones de fontenc: T2A para el cirílico, LGR para el griego.

latex
% 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]

Escritura de derecha a izquierda: LuaLaTeX para árabe y hebreo

Si va en serio con la composición bidireccional, LuaLaTeX es la única opción. No es cuestión de gusto sino de dónde reside la función. babel elige su tratamiento bidireccional con la opción bidi=, y bidi=basic —el modo en que babel implementa por sí mismo el algoritmo bidireccional de Unicode— solo funciona en LuaTeX. Pídalo bajo XeLaTeX y se le advierte sin rodeos de que los resultados serán erróneos: ! Package babel Error: The bidi method 'basic' is available only in luatex. I'll continue with 'bidi=default', so expect wrong results. La opción del lado de XeLaTeX es bidi=bidi, que delega en el paquete externo bidi — pero su simple carga produce 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á en la misma situación, puesto que también cede la dirección a bidi y luabidi. En LuaLaTeX, combinando \babelprovide[import, main]{arabic} con \babelfont{rm}{...}, un documento que mezcla árabe e inglés compila sin un solo aviso.

También puede usarse directamente el paquete bidi: \setRTL (alias \setRL) hace que el flujo pase a derecha-izquierda desde ese punto, y \setLTR (alias \setLR) lo devuelve. Bajo XeTeX la dirección no puede inferirse automáticamente, así que cada punto donde LR y RL se encuentran exige marcado explícito — y es la cantidad de ese marcado manual lo que pesa. El bidi=basic de LuaTeX resuelve esas fronteras según las reglas de Unicode y además invierte la maquetación, tablas y márgenes incluidos. Para una lengua como el persa, de derecha a izquierda pero con usos propios para las cifras, babel ofrece ajustes más finos como bidi.mapdigits. El resumen es simple: para cualquier documento que contenga árabe, hebreo o persa, empezar en LuaLaTeX resulta al final el camino más rápido.

latex
% 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 back

Entonces, ¿cómo elegir?

La decisión no arranca de «¿qué lenguas voy a mezclar?» sino de «¿con qué motor voy a componer?» Una mezcla de latín con algo de cirílico y griego pasa perfectamente por pdfLaTeX con babel y fontenc; pero si quiere fuentes del sistema, o si aparecen árabe, hebreo o una escritura índica, necesita un motor Unicode. Solo una vez resuelto eso se plantea siquiera la cuestión de babel frente a polyglossia. El CJK es otra historia: el japonés es cosa de los motores de la familia pTeX y sus clases, mientras que chino, coreano y japonés fuera del mundo pTeX pertenecen a CJKutf8, xeCJK, ctex y kotex — ambos tienen páginas propias.

  • Sobre todo latín con algo de cirílico o griego → pdfLaTeX con babel y fontenc (T2A / LGR). No hace falta alterar un flujo de trabajo existente.
  • Quiere fuentes del sistema, o se mezclan varias escrituras → XeLaTeX o LuaLaTeX con babel y \babelfont.
  • Hay árabe, hebreo o persa (RTL) de por medio → LuaLaTeX con el bidi=basic de babel. Ese modo no existe en XeLaTeX.
  • Razones para elegir polyglossia → ya tiene documentos escritos para él, o la lengua que necesita solo está soportada ahí. Para algo nuevo, babel es la apuesta más segura.
  • Japonés, chino o coreano → las rutas dedicadas (las páginas de composición japonesa y la página de CJK).