Schriftsystem (NFSS / Codierung)

Was geschieht darunter, wenn du mit \textbf oder \sffamily die Schrift wechselst? Diese Seite behandelt die Mechanik hinter den Schriftbefehlen. LaTeX bestimmt eine einzelne Schrift durch fünf unabhängige Attribute (NFSS) und setzt über eine Kodierung, die Eingabezeichen tatsächlichen Glyphen zuordnet. Die Befehlsliste bleibt einer eigenen Seite vorbehalten; hier gehen wir tiefer: Low-Level-Selektoren, die mit \selectfont bestätigt werden, Unterschiede zwischen Kodierungen wie OT1 / T1 / TU und der Grund, warum man unter pdfLaTeX \usepackage[T1]{fontenc} schreibt.

NFSS: Eine Schrift besteht aus fünf Attributen

Die Schriftauswahl in LaTeX2e beruht auf dem NFSS (New Font Selection Scheme). Im Kern steht die Idee, dass jede Textschrift vollständig durch fünf Attribute bestimmt ist. Der fntguide, der Leitfaden zur Schriftauswahl in LaTeX2e, nennt sie: encoding, family, series, shape und size.

  • Encoding — die Reihenfolge der Zeichen in der Schrift, also die Zuordnung von Eingabezeichen zu Glyphenslots. Für Text sind OT1 (TeX text) und T1 (TeX extended text, das sogenannte Cork) üblich. Details folgen im nächsten Abschnitt.
  • Family — eine Sammlung von Schriften mit gemeinsamer Buchstabenform. Die Codes lauten cmr für Computer Modern Roman, cmss für dessen Sans, cmtt für Typewriter; bei kommerziellen Schriften ptm (Times), phv (Helvetica), pcr (Courier).
  • Series — eine Achse, die Stärke und Breite kombiniert: m (medium = Standard), b (bold), bx (bold extended), c (condensed), sb (semi-bold) usw.
  • Shape — die Form der Buchstaben: n (aufrecht/roman), it (italic), sl (slanted/oblique), sc (Groß- und Kapitälchen). Seltener ist ui, eine künstlich aufgerichtete Italic.
  • Size — die Entwurfsgröße, eine Dimension wie 10pt; ohne Einheit wird pt angenommen.

Die wichtige Feinheit ist, dass series eine Achse ist, die Gewicht und Breite zusammenführt. Im Standardschema reichen Gewichte von ul bis ub (ultra light bis ultra bold), Breiten von uc bis ux (ultra condensed bis ultra expanded). Beide werden zu einem Wert verkettet, nur m entfällt, außer wenn Gewicht und Breite beide medium sind; dann bleibt ein einzelnes m. Daher heißt “fett, mittlere Breite” b, “bold extended” bx und “mittleres Gewicht, schmal” c.

Diese fünf Attribute, geschrieben als encoding/family/series/shape/size, bilden den formalen Schriftnamen in LaTeX. OT1/cmr/m/n/10 bedeutet zum Beispiel “Computer Modern Roman in der OT1-Kodierung, medium aufrecht, 10 Punkt”. Die Zeichenfolge \OT1/cmr/m/n/10, die in einer Overfull-Box-Warnung erscheint, sind genau diese fünf Attribute. Die High-Level-Befehle, die du normalerweise verwendest, etwa \textbf, ändern lediglich eines davon.

Low-Level-Selektoren und \selectfont

Unter den High-Level-Befehlen liegen Low-Level-Selektoren, die je ein Attribut setzen: \fontencoding{T1}, \fontfamily{ptm}, \fontseries{b}, \fontshape{it}, \fontsize{12}{14}. Es gibt aber eine entscheidende Regel: Das Setzen allein bewirkt nichts, bis \selectfont aufgerufen wird. Der fntguide warnt, dass unmittelbar nach jeder Einstellung von Schriftparametern, vor folgendem Text, ein \selectfont-Befehl stehen muss.

latex
% 正しい:設定 → \selectfont → テキスト / Correct: set, then \selectfont, then text
\fontfamily{ptm}\fontseries{b}\selectfont Some text.

% 誤り:設定とテキストの間に文字を挟んではいけない / Wrong: no text between a setting and \selectfont
\fontfamily{ptm} Some \fontseries{b}\selectfont text.

Eine Abkürzung, die mehrere Attribute auf einmal setzt, ist \usefont{encoding}{family}{series}{shape}. Das entspricht den passenden \font...-Befehlen gefolgt von \selectfont; die Größe wird aus dem aktuellen Wert übernommen. Das ist praktisch, wenn eine bestimmte benannte Schrift einmalig aufgerufen werden soll. Auch eine Änderung von \fontencoding benötigt anschließend \selectfont, um wirksam zu werden.

Diese Attribute schreibt man nur selten direkt: \textbf ruft intern \fontseries auf, \sffamily ruft \fontfamily auf usw. Die Befehlsliste und die Wahl zwischen Befehls- und Deklarationsform stehen auf der Seite “Font style commands”. Auf die Low-Level-Ebene greift man nur zurück, um eine bestimmte Schrift zu benennen oder eine neue Schrift in eine Klasse oder ein Paket einzubinden.

Standardmakros: \rmdefault und Verwandte

Welche Familie \textrm oder \rmfamily auswählt, ist nicht fest verdrahtet, sondern in einem Makro gespeichert. Es gibt drei: \rmdefault (Roman), \sfdefault (Sans), \ttdefault (Typewriter), mit den Standardwerten cmr, cmss, cmtt in der article-Klasse. Wer den Text in Times, Helvetica und Courier setzen will, tauscht daher diese Makros aus, statt Befehle umzuschreiben.

latex
% 文書全体の3ファミリを差し替える / Re-point the three families for the whole document
\renewcommand{\rmdefault}{ptm}  % roman   → Times
\renewcommand{\sfdefault}{phv}  % sans    → Helvetica
\renewcommand{\ttdefault}{pcr}  % mono    → Courier

Die Grundschrift selbst wird durch \encodingdefault / \familydefault / \seriesdefault / \shapedefault bestimmt, standardmäßig OT1, \rmdefault, m, n. Da \familydefault auf \rmdefault zeigt, ändert eine Änderung von \rmdefault die Grundschrift. Das fette Gewicht liegt in \bfdefault (Standard bx); bei Schriften ohne bx-Fettschnitt, etwa vielen PostScript-Schriften, muss es eventuell auf b abgesenkt werden.

Schriftkodierungen: Von Eingabe zu Glyphe

Eine Schriftkodierung ist die Reihenfolge der Glyphen in einer Schrift, also die Vereinbarung, welchem Slot (Glyphen) jedes Eingabezeichen zugeordnet wird. Sie ist das erste der fünf Attribute und zugleich das einzige ohne Autorenbefehl wie \textbf. Wie der fntguide erklärt, wird das Umschalten von Kodierungen von einem Paket wie fontenc bereitgestellt.

Für Text sind die Kernpunkte diese: OT1 ist Knuths ursprüngliche 7-Bit-“TeX text”-Kodierung (der Standard). Da nur 128 Zeichen Platz haben, werden akzentuierte Buchstaben wie é oder ñ durch Zusammensetzen eines Grundbuchstabens mit einem Akzent (\accent) gebaut. Genau das ist das Problem: Akzentuierte Wörter werden nicht getrennt, und beim Kopieren aus dem PDF entstehen Fehler. T1 (“TeX extended text”, von der TUG-Konferenz 1990 in Cork, daher Cork-Kodierung) ist eine 8-Bit-Kodierung mit 256 Glyphen, die jeden akzentuierten Buchstaben als einzelnen Glyphen enthält. Dadurch lassen sich west- und einige osteuropäische Sprachen korrekt trennen und sauber kopieren.

TU (TeX Unicode) ermöglicht die direkte Nutzung systeminstallierter OpenType-Schriften über Unicode-Codepunkte und ist der Standard für XeLaTeX und LuaLaTeX. Da fontspec dies automatisch einrichtet, schreibt man TU auf Unicode-Engines kaum von Hand. Daneben gibt es Spezialkodierungen: T2A (Kyrillisch), LGR (Griechisch, derzeit die wichtigste Kodierung für die Sprache) und TS1 (die Text-Companion-Kodierung, mit Textsymbolen wie Copyright- und Währungszeichen, verarbeitet von textcomp). Für Mathematik sind OML (Mathematikkursiv), OMS (Mathematiksymbole) und OMX (große Mathematiksymbole) vorgesehen.

KodierungAbdeckungBreite / Hinweise
OT1Knuths ursprüngliches “TeX text” (Standard)7 Bit; Akzente zusammengesetzt → keine Trennung
T1TeX extended text (Cork); westliche Sprachen8 Bit, 256 Glyphen; Akzente einzeln → Trennung möglich
TUTeX Unicode; OpenType-Schriften direktStandard für Xe/LuaLaTeX; von fontspec eingerichtet
T2AKyrillisch8 Bit (auch T2B / T2C)
LGRGriechischDie heute für Griechisch übliche 256-Glyphen-Kodierung
TS1Text Companion (Textsymbole)Copyright, Währungen usw.; von textcomp behandelt

Eingabekodierung und Schriftkodierung

Zwei leicht verwechselbare Dinge sollten getrennt werden. Die Eingabekodierung bestimmt, wie die Bytes der .tex-Quelle als Zeichen gelesen werden (UTF-8 und Ähnliches); historisch war das Aufgabe des Pakets inputenc. Die Schriftkodierung bestimmt, in welchen Glyphen der Ausgabeschrift diese Zeichen landen, und ist Aufgabe von fontenc. Es ist der Unterschied zwischen Weg hinein (inputenc) und Weg hinaus (fontenc).

Modernes pdfLaTeX liest die Quelle standardmäßig als UTF-8, daher muss inputenc fast nie ausdrücklich geladen werden. Die Schriftkodierung zu setzen lohnt sich jedoch weiterhin. fontenc ist ein Paket für pdfLaTeX; mit XeLaTeX oder LuaLaTeX nutzt man stattdessen fontspec (und da dort TU Standard ist, tritt das Problem weitgehend nicht auf).

Unter pdfLaTeX T1 laden

Wenn du mit pdfLaTeX setzt, ist es üblich, \usepackage[T1]{fontenc} in die Präambel zu schreiben. Das stellt die Schriftkodierung des Dokuments auf T1 um und beseitigt die Nachteile der OT1-Vorgabe: akzentuierte Wörter werden nicht getrennt, und aus dem PDF kopierter Text wird beschädigt. Die fontenc-Dokumentation beschreibt genau das: Sie unterstützt verbreitete westliche Sprachen wie Französisch, Deutsch, Italienisch und Polnisch, und Wörter mit Akzentbuchstaben können getrennt sowie aus der Ausgabe kopiert werden.

Wenn mehrere Kodierungen als Optionen von fontenc aufgeführt werden, wird die zuletzt genannte zur Voreinstellung (\encodingdefault wird darauf gesetzt). Für ein Dokument mit griechischen Einschüben schreibt man etwa \usepackage[LGR,T1]{fontenc}, sodass die Grundschrift bei T1 bleibt und bei Bedarf zu LGR gewechselt wird.

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}   % フォントエンコーディングを T1 に / font encoding -> T1
% pdfLaTeX では入力は UTF-8 が既定(inputenc は通常不要)
% Input is UTF-8 by default on pdfLaTeX (inputenc usually unneeded)
\begin{document}
% T1 ならアクセント付きの語も正しくハイフネーションされる
% With T1, accented words hyphenate correctly
Na\"ive r\"esum\"e, \"uberfl\"ussig, Stra\ss{}e.
\end{document}

Low-Level-Selektoren in der Praxis

Zum Schluss zeigt ein einzelnes Dokument, wie Low-Level-Selektoren und \usefont verwendet werden. \usefont gibt vier der fünf Attribute auf einmal an (encoding, family, series, shape) und bestätigt sofort; \fontfamily plus \selectfont setzt Attribute einzeln und bestätigt dann. In einer Gruppe { } bleibt die Wirkung jeweils auf diesen Bereich beschränkt.

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
% \usefont で 4 属性を一括指定 / \usefont sets four attributes at once
{\usefont{T1}{ptm}{b}{it} Bold italic Times}

% 低水準セレクタを個別に設定し \selectfont で確定
% Set selectors individually, then commit with \selectfont
{\fontfamily{phv}\fontseries{b}\selectfont Bold Helvetica}

% サイズだけ変える(baselineskip は現在値を流用)
% Change only the size (reuse the current baselineskip)
{\fontsize{14}{\f@baselineskip}\selectfont Fourteen point}
\end{document}

Hier wählt {\usefont{T1}{ptm}{b}{it} ...} “Times in T1-Kodierung, fett kursiv”; nach Verlassen der Gruppe wird die vorherige Schrift wiederhergestellt. Das interne Makro \f@baselineskip als zweites Argument von \fontsize zu übergeben, ist das Idiom, um nur die Schriftgröße zu ändern und den Zeilenabstand beizubehalten (interne Makros darf man nicht direkt umschreiben, aber ihren Wert auszulesen und weiterzureichen ist in Ordnung).