Sonderzeichen

LaTeX reserviert genau zehn Sonderzeichen – # $ % & ~ _ ^ \ { } –, und diese Liste hat niemand ausgewählt. TeX weist jedem Zeichen einen Kategoriecode zu; gewöhnliche Zeichen sind „Buchstabe“ (11) oder „Sonstiges“ (12). Genau zehn druckbare ASCII-Zeichen tragen eine andere Zahl, und eben diese zehn sind die reservierten. Die Antwort auf „warum gerade diese zehn?“ liegt also weder in der Geschichte noch im Geschmack, sondern in der Einstellungstabelle von TeX’ Eingabeverarbeitung. Diese Seite zeigt, wie sich jedes davon buchstäblich drucken lässt, wie Akzente gesetzt werden und wie sich Nicht-ASCII eingeben lässt, seit UTF-8 die Vorgabe in LaTeX ist.

Die zehn reservierten Zeichen und ihre Kategoriecodes

Ein reserviertes Zeichen ist eines, das LaTeX als Teil der eigenen Syntax verwendet; es zu tippen druckt es nicht, sondern löst ein Verhalten aus. Ein % lässt den Rest der Zeile verschwinden, ein $ schaltet in den Mathematikmodus, ein & trennt eine Tabellenspalte. In Kategoriecodes ausgedrückt: \ ist 0 (Befehlsbeginn), { ist 1 und } ist 2 (Gruppe öffnen und schließen), $ ist 3 (Mathematikumschaltung), & ist 4 (Ausrichtungstabulator), # ist 6 (Parameternummer), ^ ist 7 (hochgestellt), _ ist 8 (tiefgestellt), ~ ist 13 (aktives Zeichen) und % ist 14 (Kommentar). a ist 11, 1 oder + sind 12 – Zeichen, die nichts tun außer gedruckt zu werden.

Was beim rohen Tippen geschieht, ist von Zeichen zu Zeichen verschieden. Am gefährlichsten ist %: Es erzeugt überhaupt keine Fehlermeldung und verschluckt still den Rest der Zeile. & liefert ! Misplaced alignment tab character &.; _ und ^ im Fließtext liefern ! Missing $ inserted.; } liefert ! Too many }'s.; und \ liest das Folgende als Befehlsnamen und erzeugt ! Undefined control sequence. Nur # hat eine ungewöhnliche Meldung: Sie beginnt mit ! You can't use und setzt fort mit macro parameter character #' in horizontal mode. Allein ~ löst weder Fehler noch Warnung aus – es wird stillschweigend als geschütztes Leerzeichen gesetzt.

ZeichenKategoriecodeAufgabeRoh getippt
\0Beginn eines Befehls! Undefined control sequence.
{1Öffnet Gruppe oder ArgumentUngeschlossen führt es am Dateiende zum Fehler
}2Schließt Gruppe oder Argument! Too many }'s.
$3Beginnt und beendet den MathematikmodusUnpaarig ergibt es ! Missing $ inserted.
&4Spaltentrenner in Tabellen und Ausrichtungen! Misplaced alignment tab character &.
#6Argumentnummer in einer Makrodefinition (#1, #2, …)! You can't usein horizontal mode.
^7Hochstellung im MathematikmodusIm Text ergibt es ! Missing $ inserted.
_8Tiefstellung im MathematikmodusIm Text ergibt es ! Missing $ inserted.
~13Aktives Zeichen; geschütztes LeerzeichenKein Fehler; es wird still zum geschützten Leerzeichen
%14Kommentar; der Rest der Zeile wird ignoriertKein Fehler; der Zeilenrest verschwindet still

Buchstäblich drucken: sieben brauchen nur ein Fluchtzeichen

Sieben der zehn sind unkompliziert: ein einzelner Backslash davor genügt – \#, \$, \%, \&, \_, \{, \}. \$1.23 ergibt $1.23. Der Backslash signalisiert: „Das nächste Zeichen ist es selbst und nicht der Anfang eines Befehls.“ Auch die Mechanik ist schlicht: Im Kernel stehen \%, \& und \# als \chardef – eine Definition, die nichts weiter sagt als „drucke das Zeichen an dieser Position“. Nur \$, \{ und \} prüfen, ob gerade Mathematikmodus herrscht, und passen sich an; deshalb funktioniert dieselbe Schreibweise auch innerhalb einer Formel.

EingabeAusgabeHinweis
\##Ein einzelner Backslash davor
\$$Funktioniert auch im Mathematikmodus
\%%Für Prozentangaben wie 50\%
\&&Für das Und-Zeichen in Firmen- und Titelnamen
\__In der Standardkodierung als Linie gezeichnet, nicht als Glyphe
\{{Funktioniert auch im Mathematikmodus
\}}Funktioniert auch im Mathematikmodus
\textasciitilde~\~{} bewirkt dasselbe; ein blankes \~ ist ein Akzentbefehl
\textasciicircum^\^{} bewirkt dasselbe; ein blankes \^ ist ein Akzentbefehl
\textbackslash\\\ ist der Zeilenumbruchbefehl und druckt nichts

Die drei schwierigen: Tilde, Zirkumflex und Backslash

Nur ~, ^ und \ brauchen mehr als ein Fluchtzeichen, und der Grund ist einfach: Die gefluchtete Form bedeutet bereits etwas anderes. \~ und \^ sind Akzentbefehle, die eine Tilde oder ein Dach über den nächsten Buchstaben setzen – \~n ergibt ñ, \^o ergibt ô. Soll das Zeichen für sich stehen, bekommt der Akzent ein leeres Argument und damit keine Unterlage: \~{} und \^{}. Tatsächlich lauten die Standarddefinitionen des Kernels für \textasciitilde und \textasciicircum genau so. Die benannten Formen lassen die Absicht besser erkennen; im Manuskript sind \textasciitilde{} und \textasciicircum{} vorzuziehen.

Für den Backslash selbst dient \textbackslash. \\ ist dafür untauglich – es sind keine zwei Backslashes, sondern der Zeilenumbruchbefehl, und er druckt nichts. Interessant ist, dass die Standard-Textschrift überhaupt keinen Backslash enthält. Der Kernel erklärt, \textbackslash sei der Mathematiksymbol-Kodierung zu entnehmen, und tatsächlich bettet ein einseitiges PDF, dessen einziger Inhalt \textbackslash ist, CMSY10 ein – die Mathematiksymbolschrift. Aus demselben Grund ist das voreingestellte \_ kein Zeichen, sondern eine selbst gezeichnete dünne Linie: Eine Seite, die nur \_ enthält, bettet keine einzige Schrift ein. Mit \usepackage[T1]{fontenc} wechseln beide zu regulären Glyphen der Textschrift. Nebenbei: <, > und | sind gar keine reservierten Zeichen und erscheinen in der Standardkodierung dennoch als ¡ ¿ — . Auch das behebt fontenc.

latex
\usepackage[T1]{fontenc}   % real glyphs for \, _, < > |

100\% \& \$5 cost \#1

A Windows path: C:\textbackslash Users\textbackslash doc

Standalone marks: \textasciitilde{} and \textasciicircum{}

Akzente setzen

Frühes TeX konnte nur 7-Bit-ASCII lesen. Für ein é musste man ihm auftragen, einen Akut über ein e zu setzen, und diese Anweisungen gibt es bis heute. Das Muster lautet Akzentbefehl plus Buchstabe: \'e ergibt é, \"o ergibt ö, \^e ergibt ê, \~n ergibt ñ, \c{c} ergibt ç, \v{s} ergibt š, \r{a} ergibt å. Eine Falle sei erwähnt: Beim Akzentuieren von i und j stört der Punkt, deshalb nimmt man die punktlosen \i und \j und schreibt \'{\i}.

BefehlBeispielBezeichnung
\'éAkut
\`èGravis
\^êZirkumflex
\"öUmlaut bzw. Trema
\~ñTilde
\=ōMakron
\.żPunkt darüber
\uğBreve
\všHatschek bzw. Caron
\HőDoppelakut
\cçCedille
\råRing darüber
\dPunkt darunter
\bStrich darunter
\to͡oBogen über zwei Buchstaben

Manche Buchstaben lassen sich gar nicht aus einem Akzent bauen. Das deutsche Eszett \ss (ß), das nordische \aa (å) und \o (ø), das polnische \l (ł) sowie die Ligaturen \ae (æ) und \oe (œ) sind eigenständige Buchstaben und haben deshalb eigene Befehle. Die Großbuchstaben entstehen durch Großschreibung des Namens: \AA, \O, \L, \AE, \OE. All das gehört zum Standard-LaTeX und braucht kein zusätzliches Paket.

Nicht-ASCII direkt in UTF-8 eingeben

Im heutigen LaTeX lassen sich café, Grüße und naïve schlicht eintippen. Seit der Ausgabe vom April 2018 – LaTeX News 28 enthält den Abschnitt „UTF-8: the new default input encoding“ – ist UTF-8 die voreingestellte Eingabekodierung des Kernels, \usepackage[utf8]{inputenc} also überflüssig (es schadet nicht, alte Dokumente laufen weiter). \usepackage[T1]{fontenc} lohnt sich dennoch: Es stellt die Ausgabeseite auf eine 8-Bit-Fontkodierung um, sodass akzentuierte Wörter korrekt getrennt werden und aus dem PDF kopierter Text unversehrt zurückkommt. Mit XeLaTeX und LuaLaTeX ist es noch einfacher – eine OpenType-Schrift über fontspec gewählt, und Ein- wie Ausgabe sind von Anfang an Unicode.

latex
% pdfLaTeX: UTF-8 input is the default; T1 fixes output and hyphenation
\usepackage[T1]{fontenc}

café, Gr\"u\ss e, na\"{\i}ve, \AA ngstr\"om, \oe uvre, a\~no

% XeLaTeX / LuaLaTeX: Unicode all the way through
% \usepackage{fontspec}
% \setmainfont{TeX Gyre Pagella}

Bei vielen Sonderzeichen: \verb und \url

Ein zeichenreiches Fragment Zeichen für Zeichen zu maskieren ist mühsam, und die Wahrscheinlichkeit, eines zu übersehen, steigt rasch. Dafür gibt es den verbatim-Mechanismus. Im Fließtext schreibt man \verb|...| und zäunt den Text mit einem beliebigen Zeichen ein, das darin nicht vorkommt (hier |); innerhalb des Zauns verlieren alle reservierten Zeichen ihre Sonderbedeutung, und der Text wird in Schreibmaschinenschrift gesetzt. Für mehrere Zeilen dient die Umgebung verbatim. Eine Einschränkung: \verb darf nicht in einem Argument stehen – \section{... \verb|x| ...} liefert ! LaTeX Error: \verb illegal in argument. Für Zeichenketten, die gern ~, #, % oder _ enthalten – allen voran URLs –, ist \url{...} aus dem Paket url oder hyperref die beste Antwort: Es behandelt die reservierten Zeichen darin automatisch, setzt sie dicktengleich und bricht lange Adressen an sinnvollen Stellen um.

latex
\usepackage{hyperref}   % provides \url as well

Use \verb|a_b^c & d%| to show specials literally.

\begin{verbatim}
foo_bar = 100% & #1   % every character printed as-is
\end{verbatim}

See \url{https://example.com/path?id=1#sec_2~ok}

Wenn eingefügte Daten eine Tabelle zerlegen

In einem echten Manuskript geraten Sonderzeichen selten durch eigenes Tippen hinein. Sie kommen eingefügt – aus einer CSV-Datei, einer Webseite, einer E-Mail, einem PDF. Am schmerzhaftesten ist das in Tabellen. Da & Spalten trennt, bringt ein einziges blankes Kaufmanns-Und in einem Firmennamen oder Aufsatztitel die Spaltenzahl durcheinander und erzeugt ! Misplaced alignment tab character &. oder verschluckt stillschweigend die zweite Hälfte der Zeile. Die schnellste Abwehr besteht darin, das eintreffende Material vor dem Einfügen in drei Arten zu sortieren: Text, der als Prosa gelesen wird, Code, der unverändert gezeigt wird, und URLs, die als Links verarbeitet werden. Danach ergibt sich die Maskierungsstrategie von selbst.

latex
% before pasting into a table, search the pasted region for & % _ #
\begin{tabular}{ll}
  Smith \& Wesson & company name \\
  95\%            & reported rate \\
\end{tabular}

% do not escape URLs by hand; hand them to \url
\url{https://example.com/report?id=95#table_1}

Zusammengefasst verläuft die Entscheidung in etwa drei Schritten. Ein oder zwei Zeichen mitten in der Prosa: wie in der Tabelle maskieren. Ein Block Code oder Terminalausgabe: an \verb oder verbatim übergeben. Eine URL: \url{} überlassen. Zeigen sich dann die Symptome – eine Tabelle um eine Spalte verschoben, die zweite Hälfte einer Zeile verschwunden, ein plötzliches ! Missing $ inserted. –, durchsucht man nur den eingefügten Bereich und ordnet jedes &, %, _ und # als „Prosa“ oder „LaTeX-Syntax“ ein. Dort sitzt die Ursache fast immer.