Accents

Avec n'importe quel LaTeX depuis 2018, le é de café, le ñ de señor et le ß de Gauß se tapent directement dans la source et se composent sans plus. Ouvrez pourtant le PDF obtenu, cherchez « café », et vous pouvez n'obtenir aucun résultat. La cause n'est pas l'accent mais une seule ligne du préambule — le réglage de fontenc. Cette page suit le texte occidental accentué comme une chaîne continue, de ce que l'on tape à ce qui finit dans le PDF : encodage d'entrée, déclaration de la langue avec babel, noms d'auteurs dans le .bib, signets sous hyperref. Les accidents arrivent toujours aux extrémités. L'inventaire des commandes d'accentuation elles-mêmes est laissé à la page connexe.

Vous n'avez plus besoin de \usepackage[utf8]{inputenc}

UTF-8 est l'encodage d'entrée par défaut de LaTeX depuis 2018. Un document qui écrit Un café à Montréal, señor Gauß, Kovář, Łódź. sans charger inputenc du tout se compile sous le pdfLaTeX de TeX Live 2024 sans le moindre avertissement. LaTeX News 28 (2018) consigne le passage du réglage par défaut d'un schéma « transmis brut » à UTF-8, et précise que \usepackage[utf8]{inputenc} n'est donc plus nécessaire, sans nuire pour autant s'il est présent. La plupart des conseils anciens que l'on trouve en cherchant inputenc utf8 décrivent donc un problème qui n'existe plus.

XeLaTeX et LuaLaTeX ont toujours eu UTF-8 comme unique encodage d'entrée : inputenc n'y a donc rien à faire dès le départ. Ce n'est pourtant pas une erreur. Passez inputenc à l'un de ces moteurs avec le inputenc.sty livré dans TeX Live 2024 (2021/02/14 v1.3d) et vous obtenez un avertissementPackage inputenc Warning: inputenc package ignored with utf8 based engines. — après quoi la compilation se termine normalement. C'est pourquoi un vieux préambule repris sous LuaLaTeX ne s'arrête pas ; ce qui signifie aussi que « pas d'erreur » ne prouve pas que la ligne soit juste. Le plus propre est de la supprimer au prochain nettoyage du préambule.

Une parenthèse. Le schéma d'encodage UTF-8 lui-même a été conçu en 1992 par Ken Thompson et Rob Pike, histoire que LaTeX News 28 rappelle également. Quand TeX est né, à la fin des années 1970, il n'y avait que l'ASCII 7 bits, et le seul moyen d'obtenir un é était d'écrire une commande. Pouvoir aujourd'hui taper é directement, c'est la fin d'un détour de quarante ans.

Sous pdfLaTeX, chargez toujours \usepackage[T1]{fontenc}

Là où inputenc décide comment sont lus les octets de la source, fontenc décide quelle glyphe occupe quelle position dans la fonte. L'OT1 par défaut n'a que 128 places et ne contient aucune lettre accentuée comme glyphe unique. Un é est donc produit par composition : un accent aigu dessiné sur un e. L'apparence est presque identique, mais pour TeX ce n'est pas une lettre, c'est une lettre surmontée d'un signe — et le mot concerné sort entièrement de la césure (quelle commande existe dans quel encodage est tabulé sur la page connexe). T1 dispose de 256 places et contient é, ř et ł comme glyphes uniques.

Si vous croisez le conseil selon lequel « T1 transforme Computer Modern en bitmaps et abîme le PDF », c'est périmé. Passez pdffonts sur un PDF produit sous TeX Live 2024 en n'ajoutant que \usepackage[T1]{fontenc} : la fonte incorporée est SFRM1000, issue de cm-super, de type Type 1 — pas un bitmap Type 3. Ajouter lmodern reste utile : la fonte incorporée devient LMRoman10-Regular, et Latin Modern est le dessin de Computer Modern redessiné pour l'ère Unicode, avec une couverture de caractères et une provenance de fichier plus nettes.

Sous XeLaTeX et LuaLaTeX, fontenc n'a aucun rôle. Ils traitent les fontes du système en Unicode de bout en bout : une fois la police choisie avec fontspec, les lettres accentuées apparaissent d'elles-mêmes. La décision est donc binaire : T1 (et de préférence lmodern) avec pdfLaTeX, fontspec avec Xe/LuaLaTeX. Notons aussi que les noyaux LaTeX récents embarquent une table de correspondance Unicode assez large, si bien que même pdfLaTeX avec T1 compose sans avertissement , , et “ ” tapés directement. Les signes pleine chasse sont une autre affaire et relèvent de la page sur la composition du texte occidental.

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

Compilez deux fois la même source, Un café à Montréal, señor Gauß, Kovář, Łódź. — une fois sans fontenc (l'OT1 par défaut), une fois avec [T1]{fontenc} —, extrayez le texte avec pdftotext et regardez les points de code : la différence est décisive. Dans la version OT1, le é est stocké en deux caractères : un « e » suivi de U+0301, un accent aigu combinant. Tapez « café » dans la recherche d'un lecteur PDF, où le é vaut U+00E9, et rien ne correspond. Chercher café, Montréal et Łódź dans ce fichier donne zéro résultat pour les trois. Dans la version T1, les mêmes places contiennent des caractères précomposés — U+00E9, U+00E1, U+0159, U+0141, U+017A — et les trois mots sont trouvés.

Il existe une avarie plus grossière encore. Le Ł polonais, le L barré, n'a pas de glyphe dans OT1 : LaTeX trace donc une barre en travers d'un L. À l'œil c'est un Ł ; mais la chaîne extraite du PDF n'est pas Łódź, c'est Lódź — la barre a disparu et il reste un L ordinaire. Publiez un nom d'auteur ou de lieu dans cet état et la page imprimée paraît correcte tandis que la recherche, et toute copie vers un gestionnaire bibliographique, voient silencieusement une autre orthographe. Pour la même raison, OT1 empêche aussi la césure des mots accentués (cette mesure figure sur la page connexe consacrée aux signes d'accentuation).

bash
# 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.pdf

Déclarer la langue avec babel ou polyglossia change aussi la saisie

Donnez une langue à babel et ses raccourcis de saisie s'activent. Dans un document avec \usepackage[ngerman]{babel}, "a, "o, "u et "s donnent ä, ö, ü et ß, tandis que les deux formes du raccourci de guillemet produisent les guillemets allemands bas et haut, „ et “. "- va plus loin : il ajoute un point de césure autorisé, si bien que Zucker"-dose s'imprime toujours Zuckerdosela marque elle-même n'atteint jamais la page. Cela vaut son pesant d'or quand on écrit en allemand sans clavier allemand, ou que l'on veut garder le manuscrit en ASCII pur.

Sous XeLaTeX et LuaLaTeX, ce rôle revient à polyglossia, déclaré par exemple \setmainlanguage{german}. Avec l'un comme l'autre, il faut surveiller que les raccourcis réécrivent le sens de " : un " nu hors de verbatim — dans une URL, un fragment de code, un nom de fichier — peut produire un caractère non voulu. Dans une section pleine de citations ou de noms de fichiers externes, les désactiver le temps voulu avec \shorthandoff{"} est la manœuvre sûre. babel modifie aussi la césure et les usages typographiques propres à chaque langue, mais cela relève de la page sur la composition du texte occidental.

latex
\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 code

Les noms d'auteurs dans le .bib : BibTeX classe É après Z

Les ennuis d'accent se voient le mieux non pas dans le corps du texte mais dans la bibliographie. À l'essai : quatre entrées — Alpha, Ore, Zola, Zulu — dans un .bib, avec Émile Zola et Øystein Ore écrits en UTF-8 brut. Lancez BibTeX avec plain.bst et l'ordre obtenu est Alpha, Zulu, Zola, Ore : les deux noms commençant par É et Ø passent après Z. BibTeX compare les noms comme des suites d'octets, et l'octet de tête d'un É en UTF-8 se classe simplement au-dessus de z. Ni avertissement ni erreur. Réécrivez seulement ces champs d'auteur en notation de commande, {\'E}mile et {\O}ystein, et l'ordre devient le bon : Alpha, Ore, Zola, Zulu.

Ce travers a une raison. Le BibTeX de TeX Live 2024 s'annonce encore comme Version 0.99d — un programme écrit par Oren Patashnik dans les années 1980, en service depuis près de quarante ans sans jamais atteindre la 1.0. Il porte intacte sa conception de l'ère 7 bits et ignore toute collation Unicode. biblatex avec biber, à l'inverse, comprend l'Unicode et trie correctement le même .bib en UTF-8 sans en changer un caractère (vérifié avec biber 2.19). La décision pratique a donc deux branches : si la revue autorise biber, gardez le fichier en UTF-8 ; si BibTeX est imposé, uniformisez le seul .bib en notation de commande. Dans les deux cas, l'essentiel est de ne pas mélanger. Dans un .bib mixte, ni la détection de doublons ni le tri ne sont fiables.

bibtex
% 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}

Signets et chaînes PDF : hyperref laisse passer les accents

Les signets PDF et les informations de document s'écrivent comme des « chaînes PDF », à part du corps du texte. Y perdre les accents était autrefois un accident de routine ; aujourd'hui l'Unicode est le réglage par défaut. Composez \section{Le café de Montréal} avec hyperref 7.01h de TeX Live 2024 : le fichier .out engendré contient une marque d'ordre des octets UTF-16 suivie du é sous forme U+00E9, qui s'affiche correctement dans le volet des signets. Il n'est plus nécessaire d'ajouter l'option unicode à la main.

Les chaînes PDF, en revanche, n'acceptent pas toutes les commandes utilisables dans le corps du texte. Mettez une formule dans un titre et le journal se remplit de Package hyperref Warning: Token not allowed in a PDF string (Unicode): removing 'math shift', les jetons fautifs étant discrètement retirés du signet. Voilà comment on obtient un titre correct et un signet incompréhensible. Le remède est \texorpdfstring{}{} : le premier argument est composé, le second est le texte brut du signet. Les mots accentués peuvent aller tels quels dans ce second argument — puisque les chaînes PDF sont en Unicode, café passe en café.

latex
\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}}

Ce qu'il faut trancher avant d'écrire à plusieurs

La manière de saisir le texte accentué relève des décisions qu'il devient malaisé de renverser une fois le manuscrit gros. Un brouillon où le même nom figure à la fois en Gödel et en G\"{o}del se compose correctement dans les deux cas, mais chaque recherche, chaque remplacement global et chaque contrôle de doublons doit être fait deux fois. Et l'on repère l'incohérence en général en parcourant la bibliographie juste avant de soumettre. Trancher trois choses dès le premier commit — le moteur, la ligne fontenc et la notation du .bib — est de loin la voie la moins coûteuse.

  • Uniformisez le corps du texte en UTF-8 direct. N'écrivez pas inputenc. Une ligne suffit : fontspec sous Xe/LuaLaTeX, \usepackage[T1]{fontenc} sous pdfLaTeX.
  • Passez le test de recette une fois. Cherchez café et un nom d'auteur dans le PDF construit et vérifiez qu'ils sont trouvés. Sinon, la ligne fontenc manque.
  • Accordez le .bib à la chaîne d'outils de la revue. UTF-8 tel quel si biber est autorisé ; si BibTeX est imposé, mettez tous les noms d'auteurs sous la forme {\'E} — et ne mélangez jamais les deux.
  • Toute formule dans un titre reçoit un \texorpdfstring. L'avertissement Token not allowed in a PDF string signale un signet abîmé.
  • Si vous employez les raccourcis de babel, entourez URLs et code de \shorthandoff{"}. On oublie aisément que le sens du guillemet a été réécrit.