Con cualquier LaTeX de 2018 en adelante, la é de café, la ñ de señor y la ß de Gauß se teclean directamente en la fuente y se componen sin más. Pero abra el PDF resultante, busque «café» y puede que no obtenga ni un solo resultado. La causa no es el acento sino una única línea del preámbulo: el ajuste de fontenc. Esta página sigue el texto occidental acentuado como una cadena completa, de lo que se teclea a lo que acaba dentro del PDF: codificación de entrada, declaración del idioma con babel, nombres de autor en el .bib y marcadores bajo hyperref. Los accidentes siempre ocurren en los extremos. El inventario de los comandos de acentuación en sí queda para la página relacionada.
Ya no hace falta \usepackage[utf8]{inputenc}
UTF-8 es la codificación de entrada por defecto de LaTeX desde 2018. Un documento que escribe Un café à Montréal, señor Gauß, Kovář, Łódź. sin cargar inputenc en absoluto compila bajo el pdfLaTeX de TeX Live 2024 sin un solo aviso. LaTeX News 28 (2018) registra el cambio del valor por defecto de un esquema «pasar en bruto» a UTF-8, y señala que \usepackage[utf8]{inputenc} ya no es necesario, aunque no perjudica si está presente. La mayoría de los consejos antiguos que aparecen al buscar inputenc utf8 describen, pues, un problema que ya no existe.
XeLaTeX y LuaLaTeX siempre han tenido UTF-8 como única codificación de entrada, así que inputenc no tiene nada que hacer allí desde el principio. Sin embargo no es un error. Pase inputenc a cualquiera de esos motores con el inputenc.sty que trae TeX Live 2024 (2021/02/14 v1.3d) y lo que devuelve es un aviso —Package inputenc Warning: inputenc package ignored with utf8 based engines.— tras el cual la compilación termina con normalidad. Por eso un preámbulo antiguo llevado a LuaLaTeX no se detiene; lo que también significa que «no hay error» no demuestra que la línea sea correcta. Lo limpio es borrarla en la próxima revisión del preámbulo.
Un inciso. El propio esquema de codificación UTF-8 lo idearon en 1992 Ken Thompson y Rob Pike, historia que LaTeX News 28 también recoge. Cuando TeX nació, a finales de los setenta, solo existía el ASCII de 7 bits y la única forma de obtener una é era escribir un comando. Que hoy se pueda teclear é directamente es el final de un rodeo de cuarenta años.
Con pdfLaTeX, cargue siempre \usepackage[T1]{fontenc}
Mientras inputenc decide cómo se leen los bytes de la fuente, fontenc decide qué glifo ocupa cada posición de la tipografía. La OT1 por defecto solo tiene 128 posiciones y no contiene letras acentuadas como glifos únicos. Así que una é se produce por composición: un acento agudo dibujado sobre una e. El aspecto es casi idéntico, pero para TeX no es una letra sino una letra con un signo encima, y la palabra que la contiene queda fuera por completo de la separación silábica (qué comando existe en qué codificación está tabulado en la página relacionada). T1 tiene 256 posiciones y contiene é, ř y ł como glifos únicos.
Si se topa con el consejo de que «T1 convierte Computer Modern en mapas de bits y estropea el PDF», está desfasado. Pase pdffonts sobre un PDF hecho con TeX Live 2024 al que solo se ha añadido \usepackage[T1]{fontenc}: la tipografía incrustada es SFRM1000, de cm-super, de tipo Type 1, no un mapa de bits Type 3. Añadir lmodern sigue mereciendo la pena: la tipografía incrustada pasa a ser LMRoman10-Regular, y Latin Modern es el diseño de Computer Modern redibujado para la era Unicode, con una cobertura de caracteres y una procedencia de archivo más limpias.
Bajo XeLaTeX y LuaLaTeX, fontenc no tiene papel alguno. Tratan las tipografías del sistema como Unicode de principio a fin, así que basta elegir una con fontspec para que las letras acentuadas aparezcan solas. La decisión es, pues, binaria: T1 (y a ser posible lmodern) con pdfLaTeX, fontspec con Xe/LuaLaTeX. Añádase que los núcleos recientes de LaTeX llevan una tabla de correspondencias Unicode bastante amplia, de modo que incluso pdfLaTeX con T1 compone sin aviso €, →, – y “ ” tecleados directamente. Los signos de ancho completo son otra historia y corresponden a la página sobre componer texto occidental.
% pdfLaTeX: the two lines that matter
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern} % optional, but cleaner glyph coverage
% (no inputenc: UTF-8 has been the default since 2018)
\begin{document}
Un café à Montréal, señor Gauß, Kovář, Łódź.
\end{document}
% XeLaTeX / LuaLaTeX: no fontenc at all
% \usepackage{fontspec}
% \setmainfont{Latin Modern Roman}Cuando «café» no aparece en el PDF: la letra está guardada como dos caracteres
Compile dos veces la misma fuente, Un café à Montréal, señor Gauß, Kovář, Łódź. —una sin fontenc (la OT1 por defecto) y otra con [T1]{fontenc}—, extraiga el texto con pdftotext y mire los puntos de código: la diferencia es decisiva. En la versión OT1 la é se almacena como dos caracteres: una «e» seguida de U+0301, un acento agudo combinante. Teclee «café» en la búsqueda de un lector de PDF, donde la é es U+00E9, y no coincide nada. Buscar café, Montréal y Łódź en ese archivo devuelve cero resultados para las tres. En la versión T1 esas mismas posiciones llevan caracteres precompuestos —U+00E9, U+00E1, U+0159, U+0141, U+017A— y las tres palabras aparecen.
Hay un fallo aún más burdo. La Ł polaca, la L barrada, no tiene glifo en OT1, así que LaTeX traza un rasgo sobre una L. A la vista es una Ł; pero la cadena extraída del PDF no es Łódź, es Lódź: la barra ha desaparecido y queda una L corriente. Publique un nombre de autor o de lugar en ese estado y la página impresa parecerá correcta mientras la búsqueda, y cualquier copia a un gestor bibliográfico, ven en silencio otra ortografía. Por la misma razón, OT1 impide además que las palabras acentuadas se separen con guion (esa medición está en la página relacionada sobre los signos de acentuación).
# extract the text layer and inspect the code points
pdftotext paper.pdf - | head -1
# default OT1 -> e is followed by U+0301, a separate combining acute,
# and the bar of L is lost entirely:
# searching for "café" / "Montréal" / "Łódź" gives 0 hits
# with T1 -> precomposed U+00E9 U+00E1 U+0159 U+0141 U+017A:
# all three words are found
# and check what font actually got embedded
pdffonts paper.pdfDeclarar el idioma con babel o polyglossia cambia también la entrada
Dele un idioma a babel y sus atajos de entrada cobran vida. En un documento con \usepackage[ngerman]{babel}, "a, "o, "u y "s dan ä, ö, ü y ß, mientras que las dos formas del atajo de comilla producen las comillas alemanas baja y alta, „ y “. "- va más lejos: añade un punto de división permitido, de modo que Zucker"-dose sigue imprimiéndose como Zuckerdose; la marca en sí nunca llega a la página. Esto rinde cuando se escribe en alemán sin teclado alemán, o cuando se quiere mantener el manuscrito en ASCII puro.
Bajo XeLaTeX y LuaLaTeX ese papel recae en polyglossia, declarado como \setmainlanguage{german} y similares. Con cualquiera de los dos hay que vigilar que los atajos reescriben el significado de ": teclear un " desnudo fuera de verbatim —en una URL, un fragmento de código, un nombre de archivo— puede producir un carácter no deseado. En una sección llena de citas o de nombres de archivo externos, desactivarlos temporalmente con \shorthandoff{"} es la maniobra segura. babel cambia además la separación silábica y las convenciones tipográficas de cada idioma, pero eso pertenece a la página sobre componer texto occidental.
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
% "a "o "u "s -> a-umlaut, o-umlaut, u-umlaut, eszett
% "- -> an extra hyphenation point, invisible in the output
% Zucker"-dose still prints as one word
\shorthandoff{"} % turn the shorthands off around URLs and codeNombres de autor en .bib: BibTeX ordena É después de la Z
Los problemas de acento se ven mejor no en el cuerpo del texto sino en la bibliografía. Pruébelo: cuatro entradas —Alpha, Ore, Zola, Zulu— en un .bib, con Émile Zola y Øystein Ore escritos en UTF-8 llano. Ejecute BibTeX con plain.bst y el orden que sale es Alpha, Zulu, Zola, Ore: los dos nombres que empiezan por É y Ø caen detrás de la Z. BibTeX compara los nombres como cadenas de bytes, y el byte inicial de una É en UTF-8 sencillamente ordena por encima de z. No hay aviso ni error. Reescriba solo esos campos de autor en notación de comando, {\'E}mile y {\O}ystein, y el orden pasa a ser el correcto: Alpha, Ore, Zola, Zulu.
La manía tiene explicación. El BibTeX de TeX Live 2024 sigue anunciándose como Version 0.99d: un programa que Oren Patashnik escribió en los años ochenta, en servicio desde hace casi cuarenta años sin llegar nunca a la 1.0. Arrastra intacto su diseño de la era de 7 bits y no conoce ninguna colación Unicode. biblatex con biber, en cambio, entiende Unicode y ordena correctamente el mismo .bib en UTF-8 sin cambiarle un carácter (verificado con biber 2.19). La decisión práctica tiene, pues, dos ramas: si el destino permite biber, mantenga el archivo en UTF-8; si se impone BibTeX, uniforme solo el .bib en notación de comando. En cualquier caso, lo esencial es no mezclar. En un .bib mixto ni la detección de duplicados ni la ordenación son de fiar.
% BibTeX 0.99d + plain.bst sorts these as Alpha, Zulu, Zola, Ore
@article{a1, author = {Émile Zola}, title = {Un titre}, journal = {J}, year = {2001}}
@article{a3, author = {Øystein Ore}, title = {Another}, journal = {J}, year = {2003}}
% ...and these as Alpha, Ore, Zola, Zulu -- correct
@article{a1, author = {{\'E}mile Zola}, title = {Un titre}, journal = {J}, year = {2001}}
@article{a3, author = {{\O}ystein Ore}, title = {Another}, journal = {J}, year = {2003}}
% biblatex + biber sorts the UTF-8 form correctly with no rewriting:
% \usepackage[backend=biber]{biblatex}Marcadores y cadenas PDF: hyperref deja pasar los acentos
Los marcadores del PDF y la información del documento se escriben como «cadenas PDF», aparte del cuerpo del texto. Perder ahí los acentos era antes un accidente rutinario; hoy Unicode es el valor por defecto. Componga \section{Le café de Montréal} con hyperref 7.01h de TeX Live 2024 y el archivo .out generado contiene una marca de orden de bytes UTF-16 seguida de la é como U+00E9, que aparece correctamente en el panel de marcadores. Ya no hace falta añadir a mano la opción unicode.
Las cadenas PDF, sin embargo, no aceptan todos los comandos que se pueden usar en el cuerpo. Ponga una fórmula en un título y el registro se llena de Package hyperref Warning: Token not allowed in a PDF string (Unicode): removing 'math shift', y los tokens implicados se retiran calladamente del marcador. Así es como se acaba con un título correcto y un marcador ininteligible. El remedio es \texorpdfstring{}{}: el primer argumento se compone, el segundo es el texto llano del marcador. Las palabras acentuadas pueden ir tal cual en ese segundo argumento: como las cadenas PDF son Unicode, café pasa como café.
\usepackage{hyperref}
% the log fills with "Token not allowed in a PDF string"
\section{Le café de Montréal $x^2$}
% typeset form on the left, bookmark text on the right
\section{Le café de Montréal \texorpdfstring{$x^2$}{x2}}Qué acordar antes de escribir en equipo
Cómo se introduce el texto acentuado es de esas decisiones que cuesta revertir cuando el manuscrito ha crecido. Un borrador en el que el mismo nombre aparece como Gödel y como G\"{o}del se compone correctamente en ambos casos, pero cada búsqueda, cada reemplazo global y cada control de duplicados hay que hacerlo dos veces. Y la incoherencia suele detectarse al repasar la bibliografía justo antes de enviar. Fijar tres cosas en el primer commit —el motor, la línea fontenc y la notación del .bib— es con mucho la vía más barata.
- Uniforme el cuerpo en UTF-8 directo. No escriba
inputenc. Basta una línea:fontspecbajo Xe/LuaLaTeX,\usepackage[T1]{fontenc}bajo pdfLaTeX. - Pase la prueba de aceptación una vez. Busque
caféy un nombre de autor en el PDF generado y confirme que aparecen. Si no, falta la líneafontenc. - Ajuste el
.biba la cadena de herramientas del destino. UTF-8 tal cual si se permite biber; si se impone BibTeX, ponga todos los nombres de autor en la forma{\'E}y no mezcle nunca ambas. - Toda fórmula en un título lleva un
\texorpdfstring. El avisoToken not allowed in a PDF stringes la señal de un marcador estropeado. - Si usa los atajos de
babel, rodee URL y código con\shorthandoff{"}. Es fácil olvidar que el significado de la comilla ha sido reescrito.