Mit jedem LaTeX ab 2018 lassen sich das é von café, das ñ von señor und das ß von Gauß direkt in die Quelle tippen und werden einfach gesetzt. Öffnet man das entstandene PDF aber und sucht nach „café“, kommt womöglich kein einziger Treffer. Ursache ist nicht der Akzent, sondern eine einzige Zeile in der Präambel – die fontenc-Einstellung. Diese Seite verfolgt akzentuierten westlichen Text als durchgehende Kette, von der Eingabe bis zum Inhalt des PDF: Eingabekodierung, Sprachdeklaration mit babel, Autorennamen in .bib und Lesezeichen unter hyperref. Die Unfälle passieren immer an den Enden. Das Verzeichnis der Akzentbefehle selbst bleibt der verwandten Seite überlassen.
\usepackage[utf8]{inputenc} braucht man nicht mehr
UTF-8 ist seit 2018 die voreingestellte Eingabekodierung von LaTeX. Ein Dokument, das Un café à Montréal, señor Gauß, Kovář, Łódź. schreibt, ohne inputenc überhaupt zu laden, übersetzt unter dem pdfLaTeX von TeX Live 2024 ohne eine einzige Warnung. LaTeX News 28 (2018) hält die Umstellung der Voreinstellung von einem „roh durchgereichten“ Schema auf UTF-8 fest und stellt klar, dass \usepackage[utf8]{inputenc} deshalb nicht mehr nötig ist, aber auch nicht schadet. Die meisten älteren Ratschläge, die eine Suche nach inputenc utf8 zutage fördert, beschreiben damit ein Problem, das nicht mehr besteht.
XeLaTeX und LuaLaTeX hatten UTF-8 stets als einzige Eingabekodierung, inputenc hat dort also von vornherein nichts zu tun. Ein Fehler ist es allerdings nicht. Übergibt man inputenc einer dieser Engines mit dem in TeX Live 2024 enthaltenen inputenc.sty (2021/02/14 v1.3d), kommt eine Warnung zurück – Package inputenc Warning: inputenc package ignored with utf8 based engines. –, und der Lauf endet normal. Deshalb bleibt eine alte Präambel unter LuaLaTeX nicht stehen; umgekehrt heißt „kein Fehler“ nicht, dass die Zeile richtig ist. Beim nächsten Aufräumen der Präambel streicht man sie.
Eine Randbemerkung. Das Kodierungsschema UTF-8 selbst entwarfen 1992 Ken Thompson und Rob Pike; auch LaTeX News 28 erzählt diese Geschichte. Als TeX Ende der 1970er entstand, gab es nur 7-Bit-ASCII, und ein é bekam man ausschließlich über einen Befehl. Dass man é heute einfach tippen kann, ist das Ende eines vierzigjährigen Umwegs.
Unter pdfLaTeX immer \usepackage[T1]{fontenc} laden
Während inputenc festlegt, wie die Bytes der Quelle gelesen werden, bestimmt fontenc, welche Glyphe an welcher Position der Schrift steht. Das voreingestellte OT1 hat nur Platz für 128 Zeichen und enthält keine akzentuierten Buchstaben als einzelne Glyphen. Ein é entsteht daher als Zusammensetzung: ein Akut über ein e gezeichnet. Es sieht fast gleich aus, doch für TeX ist es kein Buchstabe, sondern ein Buchstabe mit aufgesetztem Zeichen – und das betreffende Wort fällt ganz aus der Silbentrennung heraus (welcher Befehl in welcher Kodierung existiert, steht tabelliert auf der verwandten Seite). T1 hat 256 Positionen und führt é, ř und ł als einzelne Glyphen.
Begegnet einem der Rat, „T1 macht aus Computer Modern Bitmaps und verdirbt das PDF“, so ist das veraltet. Lässt man pdffonts über ein PDF aus TeX Live 2024 laufen, dem nichts weiter als \usepackage[T1]{fontenc} hinzugefügt wurde, ist eingebettet SFRM1000 aus cm-super, Typ Type 1 – kein Type-3-Bitmap. lmodern zusätzlich zu laden lohnt trotzdem: Eingebettet wird dann LMRoman10-Regular, und Latin Modern ist die für das Unicode-Zeitalter neu gezeichnete Fassung des Computer-Modern-Entwurfs, mit sauberer Zeichenabdeckung und sauberer Herkunft der Fontdatei.
Unter XeLaTeX und LuaLaTeX spielt fontenc keine Rolle. Sie behandeln Systemschriften durchgehend als Unicode; wählt man mit fontspec eine Schrift, erscheinen akzentuierte Buchstaben einfach. Die Entscheidung ist damit binär: T1 (und möglichst lmodern) bei pdfLaTeX, fontspec bei Xe/LuaLaTeX. Zudem führen neuere LaTeX-Kerne eine recht breite Unicode-Zuordnungstabelle, sodass selbst pdfLaTeX mit T1 direkt getippte €, →, – und “ ” warnungsfrei setzt. Bei Vollbreitenzeichen sieht es anders aus; sie gehören auf die Seite über westliche Texte.
% 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}Wenn „café“ im PDF nicht gefunden wird: der Buchstabe steht als zwei Zeichen
Übersetzt man dieselbe Quelle, Un café à Montréal, señor Gauß, Kovář, Łódź., zweimal – einmal ohne fontenc (das voreingestellte OT1), einmal mit [T1]{fontenc} –, zieht den Text mit pdftotext heraus und schaut auf die Codepunkte, ist der Unterschied entscheidend. In der OT1-Fassung steht das é als zwei Zeichen: „e“ gefolgt von U+0301, einem kombinierenden Akut. Tippt man „café“ in das Suchfeld eines PDF-Betrachters, wo das é U+00E9 ist, passt nichts. Die Suche nach café, Montréal und Łódź liefert in dieser Datei für alle drei null Treffer. In der T1-Fassung stehen an denselben Stellen vorkomponierte Einzelzeichen – U+00E9, U+00E1, U+0159, U+0141, U+017A –, und alle drei Wörter werden gefunden.
Es gibt noch ein gröberes Versagen. Das polnische Ł, das durchgestrichene L, hat in OT1 keine Glyphe, also zeichnet LaTeX stattdessen einen Strich durch ein L. Fürs Auge ist es ein Ł; die aus dem PDF gezogene Zeichenkette lautet aber nicht Łódź, sondern Lódź – der Strich ist fort, ein schlichtes L bleibt. Erscheint ein Autoren- oder Ortsname in diesem Zustand, sieht die gedruckte Seite richtig aus, während Suche und jedes Kopieren in eine Literaturverwaltung stillschweigend eine andere Schreibung sehen. Aus demselben Grund verhindert OT1 auch die Silbentrennung akzentuierter Wörter (diese Messung steht auf der verwandten Seite zu den Akzentzeichen).
# 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.pdfDie Sprachdeklaration mit babel oder polyglossia ändert auch die Eingabe
Übergibt man babel eine Sprache, werden deren Eingabekürzel aktiv. In einem Dokument mit \usepackage[ngerman]{babel} werden "a, "o, "u und "s zu ä, ö, ü und ß, während die beiden Formen des Anführungskürzels die deutschen unteren und oberen Anführungszeichen „ und “ liefern. "- geht weiter: Es fügt eine erlaubte Trennstelle hinzu, sodass Zucker"-dose weiterhin als Zuckerdose erscheint – das Zeichen selbst gelangt nie aufs Papier. Das zahlt sich aus, wenn ohne deutsche Tastatur Deutsch geschrieben wird oder das Manuskript in reinem ASCII bleiben soll.
Unter XeLaTeX und LuaLaTeX übernimmt polyglossia dieselbe Rolle, deklariert etwa als \setmainlanguage{german}. Bei beiden Paketen gilt es im Auge zu behalten, dass die Kürzel die Bedeutung von " umschreiben: Ein blankes " außerhalb von verbatim – in einer URL, einem Codeschnipsel, einem Dateinamen – kann ein unbeabsichtigtes Zeichen erzeugen. In einem Abschnitt voller Zitate oder externer Dateinamen schaltet man sie mit \shorthandoff{"} verlässlich vorübergehend ab. babel ändert außerdem Silbentrennung und sprachspezifische Satzkonventionen, doch das gehört auf die Seite über westliche Texte.
\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 codeAutorennamen im .bib: BibTeX sortiert É hinter Z
Akzentprobleme zeigen sich am deutlichsten nicht im Fließtext, sondern im Literaturverzeichnis. Ein Versuch: Vier Einträge – Alpha, Ore, Zola, Zulu – ins .bib, wobei Émile Zola und Øystein Ore als schlichtes UTF-8 stehen. Läuft BibTeX mit plain.bst, lautet die Reihenfolge Alpha, Zulu, Zola, Ore: Die beiden Namen mit É und Ø rutschen hinter Z. BibTeX vergleicht Namen als Bytefolgen, und das führende Byte eines UTF-8-É sortiert schlicht über z. Es gibt weder Warnung noch Fehler. Schreibt man nur diese Autorenfelder in Befehlsnotation, {\'E}mile und {\O}ystein, ergibt sich die richtige Folge Alpha, Ore, Zola, Zulu.
Die Marotte hat einen Grund. Das BibTeX in TeX Live 2024 meldet sich noch immer als Version 0.99d – ein Programm, das Oren Patashnik in den 1980ern schrieb und das seit fast vierzig Jahren im Dienst ist, ohne je 1.0 zu erreichen. Es trägt seinen Entwurf aus der 7-Bit-Zeit unverändert weiter und kennt keine Unicode-Sortierung. biblatex mit biber dagegen versteht Unicode und ordnet dasselbe UTF-8-.bib korrekt, ohne ein Zeichen daran zu ändern (geprüft mit biber 2.19). Die praktische Entscheidung hat also zwei Zweige: Erlaubt der Verlag biber, bleibt die Datei in UTF-8; wird BibTeX vorgeschrieben, vereinheitlicht man allein das .bib auf Befehlsnotation. So oder so gilt: nicht mischen. In einem gemischten .bib ist weder der Dublettenabgleich noch die Sortierung verlässlich.
% 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}Lesezeichen und PDF-Strings: hyperref lässt Akzente durch
PDF-Lesezeichen und Dokumentinformationen werden als „PDF-Strings“ geschrieben, getrennt vom Fließtext. Früher gingen dort Akzente routinemäßig verloren; heute ist Unicode die Voreinstellung. Setzt man \section{Le café de Montréal} mit hyperref 7.01h aus TeX Live 2024, enthält die erzeugte .out-Datei eine UTF-16-Bytereihenfolgemarke und darauf das é als U+00E9, das dann korrekt im Lesezeichenbereich erscheint. Die Option unicode muss nicht mehr von Hand ergänzt werden.
PDF-Strings akzeptieren allerdings nicht jeden Befehl, den man im Fließtext verwenden kann. Setzt man eine Formel in eine Überschrift, füllt sich das Log mit Package hyperref Warning: Token not allowed in a PDF string (Unicode): removing 'math shift', und die betreffenden Token werden still aus dem Lesezeichen entfernt. So kommt es zu einer korrekten Überschrift bei unverständlichem Lesezeichen. Abhilfe schafft \texorpdfstring{}{}: Das erste Argument wird gesetzt, das zweite ist der Klartext fürs Lesezeichen. Akzentuierte Wörter dürfen direkt ins zweite Argument – da PDF-Strings Unicode sind, geht café als café durch.
\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}}Was vor Beginn der gemeinsamen Arbeit zu klären ist
Wie akzentuierter Text eingegeben wird, gehört zu den Entscheidungen, die sich mit wachsendem Manuskript kaum noch umkehren lassen. Ein Entwurf, in dem derselbe Name als Gödel und als G\"{o}del erscheint, wird in beiden Fällen korrekt gesetzt, doch jede Suche, jedes globale Ersetzen und jeder Dublettenabgleich muss zweimal laufen. Und die Inkonsistenz bemerkt man meist erst beim Durchsehen des Literaturverzeichnisses kurz vor der Abgabe. Drei Dinge im ersten Commit festzulegen – Engine, fontenc-Zeile und Notation im .bib – ist mit Abstand der günstigste Weg.
- Im Fließtext einheitlich direktes UTF-8. Kein
inputencschreiben. Eine Zeile genügt:fontspecunter Xe/LuaLaTeX,\usepackage[T1]{fontenc}unter pdfLaTeX. - Den Abnahmetest einmal durchführen. Im gebauten PDF nach
caféund nach einem Autorennamen suchen und prüfen, ob sie gefunden werden. Wenn nicht, fehlt diefontenc-Zeile. - Das
.biban die Werkzeugkette des Verlags anpassen. UTF-8 unverändert, wenn biber erlaubt ist; wird BibTeX vorgeschrieben, alle Autorennamen in die Form{\'E}bringen – und beides nie mischen. - Jede Formel in einer Überschrift erhält ein
\texorpdfstring. Die WarnungToken not allowed in a PDF stringsignalisiert ein verstümmeltes Lesezeichen. - Bei
babel-Kürzeln URLs und Code in\shorthandoff{"}einfassen. Dass die Bedeutung des Anführungszeichens umgeschrieben wurde, vergisst man leicht.