Befehle für Schriftschnitte

Schreibt man in LaTeX {\bf\it x}, erhält man keine fette Kursive, sondern Kursive. Vertauscht man die Reihenfolge zu {\it\bf x}, verschwindet stattdessen die Kursive und übrig bleibt aufrechtes Fett. Die alten zweibuchstabigen Befehle lassen sich schlicht nicht addieren, und der Grund steht als ein einziges Wort in Zeile 493 von article.cls. Wer diese Zeile liest, versteht in einem Zug, warum modernes LaTeX jeden Schriftwechsel in zwei Formen liefert. Diese Seite zeigt, wie jene Befehle auf drei unabhängigen Achsen – Familie, Serie und Form – angeordnet sind, wann das Argument nehmende \textbf{...} und wann die gruppenweit wirkende Deklaration \bfseries angebracht ist und was das Protokoll mitteilt, wenn man fette Kapitälchen anfordert und gewöhnliches Fett herauskommt. Durchgehend mit Messwerten.

Der Unterschied zwischen \textbf{...} und \bfseries

Jeder Wechsel kommt in zwei Formen. Die Befehlsform, beginnend mit \text…, nimmt ein Argument und wirkt nur auf das, was in ihren Klammern steht. Die Deklarationsform, endend auf …family / …series / …shape, nimmt kein Argument und gilt von dieser Stelle bis zum Ende der umschließenden Gruppe oder Umgebung. Die Wahl richtet sich nach der Länge des Bereichs: für ein paar Wörter \textbf{nur dies}, für einen ganzen Absatz oder eine Umgebung {\bfseries …} oder \begin{quote}\itshape …\end{quote}. Vergisst man die Gruppe um eine Deklaration, wirkt sie bis zum Dokumentende – die Paarung von { und } also stets prüfen. Klassen- und Paketcode bevorzugt ebenfalls Deklarationen, weil sie nichts Eigenes hinzufügen und die Bereichsverwaltung dem Aufrufenden überlassen.

latex
% command form: for a short span
This is \textbf{bold} and this is \textit{italic}.

% declaration form: a group limits the scope
Normal here. {\bfseries Bold from here on.} Back to normal.

% declaration applied to a whole environment
\begin{quote}
  \itshape The whole quotation is set in italic.
\end{quote}

Über den Geltungsbereich hinaus unterscheiden sich die beiden Formen praktisch in einem Punkt: Die Befehlsform fügt die Kursivkorrektur automatisch ein, die Deklarationsform nicht. Eine geneigte Glyphe ragt nach rechts oben hinaus, ihre Satzbreite enthält diesen Überstand aber nicht, sodass ein folgender aufrechter Buchstabe kollidiert. Gemessen ergibt \textit{f}h 10,74167 pt und {\itshape f}h 8,62222 pt; die vollen 2,11945 pt Differenz sind fehlender Zwischenraum. Bei einer Deklaration schreibt man das abschließende \/ selbst – {\itshape f\/}h misst 10,74167 pt und stimmt damit exakt mit der Befehlsform überein. Was diese Korrektur genau tut, behandelt die Seite zur Hervorhebung ausführlich.

Familie, Serie, Form: die drei Achsen, die eine Schrift bestimmen

Eine Schrift in LaTeX2e ist die Kombination dreier wechselseitig unabhängiger Attribute: Familie ist die zugrunde liegende Buchstabenform, Serie umfasst Stärke und Breite, Form meint Neigung oder Gestalt. Wird eine Achse gewechselt, bleiben die beiden anderen unberührt – diese Orthogonalität ist der Kern des Entwurfs und der Grund, warum „fett und trotzdem serifenlos“ oder „kursiv und trotzdem fett“ geradlinig zu schreiben sind. Das Schema kam 1989 als NFSS (New Font Selection Scheme) auf, erreichte 1993 die zweite Fassung und wurde 1994 mit LaTeX2e Standard; das ältere LaTeX 2.09 kannte den Begriff des Schriftattributs überhaupt nicht. Merkenswert ist, dass die Serie eine einzige Achse für Stärke und Breite ist. Deshalb schreibt sich das Fett von Computer Modern bx – bold extended, fett und breit.

  • Familie – Antiqua, also mit Serifen, \textrm / \rmfamily; serifenlos \textsf / \sffamily; Schreibmaschine, also dicktengleich, \texttt / \ttfamily.
  • Serie – mittel, die Standardstärke, \textmd / \mdseries; fett \textbf / \bfseries. Der Attributwert ist eine Zeichenkette von höchstens zwei Buchstaben, die Stärke und Breite vereint: m (medium), b (bold), bx (bold extended), c (condensed) und weitere.
  • Form – aufrecht, die Voreinstellung, \textup / \upshape; kursiv \textit / \itshape; geneigt \textsl / \slshape; Kapitälchen \textsc / \scshape. Die Attributwerte lauten der Reihe nach n, it, sl und sc.
  • Kursiv und geneigt sind nicht dasselbe. \itshape ruft eine eigens gezeichnete Schrift auf – in Computer Modern cmti10 –, \slshape dagegen die mechanisch geneigte aufrechte Schrift (cmsl10). Schon die Buchstabenformen unterscheiden sich; das kursive a etwa ist einstöckig.
SchlüsselAchse und WirkungBefehlsform (kurzer Bereich)Deklarationsform (durch Gruppe begrenzt)
romanFamilie: Antiqua (mit Serifen)\textrm{...}{\rmfamily ...}
sansFamilie: serifenlos\textsf{...}{\sffamily ...}
typewriterFamilie: Schreibmaschine (dicktengleich)\texttt{...}{\ttfamily ...}
boldSerie: fett (Attributwert etwa bx)\textbf{...}{\bfseries ...}
mediumSerie: mittel (Voreinstellung, Attributwert m)\textmd{...}{\mdseries ...}
italicForm: kursiv (Attributwert it)\textit{...}{\itshape ...}
slantedForm: geneigt (Attributwert sl)\textsl{...}{\slshape ...}
small capsForm: Kapitälchen (Attributwert sc)\textsc{...}{\scshape ...}
uprightForm: zurück zu aufrecht (Attributwert n)\textup{...}{\upshape ...}
reset allAlle drei Achsen auf die Dokumentvorgabe zurücksetzen\textnormal{...}{\normalfont ...}

Fett und kursiv gleichzeitig anwenden

Schreibt man \textbf{\textit{...}}, erhält man fette Kursive. Die Reihenfolge ist gleichgültig, und bei Deklarationen listet man sie einfach auf: {\bfseries\itshape ...}. Weil die Achsen unabhängig sind, löscht der zweite Wechsel nie den ersten. Gemessen bleibt innerhalb von \textbf{\textit{Y}} die Serie bx, nur die Form wird it, sodass die fette Kursive von Computer Modern, cmbxti10, geladen wird. Mit allen drei Achsen liefert \textsf{\textbf{\textit{...}}} fette serifenlose Kursive. Eine Kombination schreiben zu können heißt allerdings nicht, dass die Schrift sie besitzt: Fehlt der angeforderte Schnitt, ersetzt LaTeX ihn durch etwas Naheliegendes – Thema des nächsten Abschnitts.

latex
% nest the command forms
\textsf{\textbf{\textit{Bold sans-serif italic}}}

% or list the declarations in one group (equivalent)
{\sffamily\bfseries\itshape Bold sans-serif italic\/}

% one word back to the document default inside a sans-serif run
{\sffamily A heading-like line with one \textnormal{normal} word}

Um alle drei Achsen auf einmal auf die Dokumentvorgabe zurückzusetzen, dienen \textnormal{...} (Befehlsform) und \normalfont (Deklarationsform) – praktisch, wenn in einer serifenlosen Überschrift ein Wort in der gewöhnlichen Textschrift stehen soll. Für eine einzelne Achse ruft man den Befehl auf, der deren Vorgabe benennt: \rmfamily, \mdseries, \upshape. Nebenbei lohnenswert: Die Zeilen 11158 bis 11170 von latex.ltx sind eine Folge von \DeclareTextFontCommand-Aufrufen, jedes hier genannte \text… wird also maschinell aus der zugehörigen Deklaration erzeugt. Dieselbe Folge definiert auch \textulc (zurück zu Groß- und Kleinschreibung) und \textsw (Schwungschrift), doch nur sehr wenige Schriften führen diese Formen tatsächlich.

Warum sich \bf und \it nicht kombinieren lassen

Weil in der Definition von \bf ein \normalfont steckt. Die Zeilen 490 bis 496 von article.cls führen die alten zweibuchstabigen Befehle so auf: \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}, \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}, und ebenso für \rm, \sf, \tt, \sl und \sc. \bf heißt also nicht „setze dies fett“, sondern „setze alle drei Achsen auf die Vorgabe zurück und dann fett“. Setzt man {\bf\it x}, wirft das in \it verborgene \normalfont das vorangegangene \bfseries komplett weg: Gemessen fällt die Serie von bx auf m zurück, allein die Form it überlebt. In umgekehrter Reihenfolge, {\it\bf x}, kehrt die Form zu n zurück und nur die Serie bx bleibt. Alt und neu gemischt verhält sich genauso: \textbf{\tt x} endet mit der Familie cmtt, aber der Serie m – das \textbf wird stillschweigend verworfen.

latex
% the old two-letter commands do not stack
{\bf\it x}          % italic only  -- the bold is thrown away
{\it\bf x}          % upright bold -- the italic is thrown away
\textbf{\tt x}      % typewriter, medium weight -- \textbf silently lost

% the modern commands do stack
{\bfseries\itshape x}
\textbf{\ttfamily x}

Diese Nichtorthogonalität ist kein Mangel, sondern die getreue Bewahrung des Schriftmodells von LaTeX 2.09 aus der Zeit vor 1994: Damals war „die aktuelle Schrift“ ein einzelner Name und kein Satz von Attributen, jeder Wechsel also ein vollständiger Austausch. LaTeX2e führte 1994 die pro Achse stapelbaren Befehle ein und behielt die alten über \DeclareOldFontCommand als Kompatibilitätsschicht, damit vorhandene Dokumente weiter übersetzen. Sie funktionieren bis heute fehlerfrei – und genau das ist das Problem: Wer {\bf\it wichtig} schreibt, meint fette Kursive und merkt das Gegenteil erst im PDF. Zudem ist das dritte Argument von \DeclareOldFontCommand die Bedeutung im Mathematikmodus, \bf verhält sich in einer Formel also wie \mathbf. Ein Befehl, der im Text etwas anderes bedeutet als in der Formel, ist ein weiterer Grund, ihn zu meiden. In neuem Code stets die Familie \textbf / \bfseries verwenden.

Wenn das Protokoll Font shape ... undefined meldet

Das ist keine Meldung über einen Tippfehler, sondern die Auskunft, dass die Schrift den angeforderten Schnitt nicht besitzt. Der klassische Fall sind fette Kapitälchen: Computer Modern in der voreingestellten OT1-Kodierung kennt keinen Schnitt, der zugleich bx und sc ist. Setzt man \textsc{\textbf{...}}, erscheint im Protokoll das Paar aus einer Font shape-Zeile und einer using ... instead-Zeile, wie unten gezeigt. LaTeX bricht nicht mit einem Fehler ab, sondern verwirft die Kapitälchen und setzt in gewöhnlichem Fett weiter. Man erfährt davon also erst, wenn das PDF die gewünschten Kapitälchen nicht zeigt. Aus demselben Grund warnt \textsw{...}, dass OT1/cmr/m/sw undefiniert sei.

log
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font)              using `OT1/cmr/bx/n' instead on input line 8.

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

Für genau diese Warnung gibt es eine einzeilige Lösung: \usepackage[T1]{fontenc} hinzufügen. Das T1-kodierte Computer Modern (die EC-Schriften) besitzt fette Kapitälchen, dasselbe \textsc{\textbf{...}} übersetzt also ohne Warnung; mit geladenem [T1]{fontenc} verschwand die Schriftwarnung im erneuten Lauf vollständig aus dem Protokoll. T1 verbessert außerdem den Umgang mit akzentuierten Buchstaben und der Silbentrennung, ist für solche Dokumente also ohnehin fällig. Nennt die Warnung eine andere Kombination, liest man den vierteiligen Namen im Protokoll – OT1/cmr/bx/sc, also Kodierung / Familie / Serie / Form – und bestimmt daran, welche Achse fehlt. Dann entscheidet man: zu einer Schrift wechseln, die sie hat, die Anforderung um eine Stufe vereinfachen oder die Ersetzung hinnehmen – und hält die Entscheidung fest.

latex
% OT1 Computer Modern has no bold small caps -> warning + silent fallback
% T1 (the EC fonts) does have it
\usepackage[T1]{fontenc}

\textsc{\textbf{Bold Small Capitals}}

% low-level NFSS: name the four attributes, then commit with \selectfont
{\fontfamily{cmr}\fontseries{bx}\fontshape{sc}\selectfont Explicit}

Wie die letzten beiden Zeilen zeigen, expandiert ein Befehl der oberen Ebene wie \textbf intern zu den NFSS-Befehlen der unteren Ebene. \fontfamily{...}, \fontseries{...} und \fontshape{...} schreiben die Attribute um, und \selectfont wählt tatsächlich eine Schrift aus dem, was die vier Attribute in diesem Moment enthalten. Das bloße Setzen der Attribute bewirkt nichts; die Schrift ändert sich erst mit dem Aufruf von \selectfont. Diese Ebene braucht man selten unmittelbar, doch sie ist der Griff, wenn ein bestimmter Schnitt namentlich gerufen werden soll oder wenn zu prüfen ist, worauf der vierteilige Name in einer Warnung verweist. Was die Kodierung bedeutet und wie sich echte Schriftdateien laden lassen, gehört auf die Seite zum Schriftsystem.

Japanische Schriftwechsel: Mincho und Gothic

In pLaTeX und upLaTeX besitzt japanischer Text eigene Achsen, und die Familienachse hat zwei Mitglieder: Mincho \textmc / \mcfamily und Gothic \textgt / \gtfamily. Definiert werden sie ab Zeile 1471 von plcore.ltx und schalten \kanjifamily, ein Attribut allein der japanischen Seite. Interessant wird es unter \bfseries. Gemessen bleibt die japanische Familie mc (Mincho), nur die Serie wird bx. Zeile 25 von jy1mc.fd lautet dann \DeclareFontShape{JY1}{mc}{bx}{n}{<->ssub*gt/m/n}{}: Die Anforderung „fettes Mincho“ wird definitionsgemäß von Gothic in normaler Stärke bedient. „Ich habe es fett gesetzt und es wurde Gothic“ ist somit weder Zufall noch Notbehelf, sondern eine ausdrücklich in der Schriftdefinitionsdatei festgeschriebene Ersetzung – ein Abbild der Tradition, japanische Hervorhebung über den Schriftwechsel statt über die Stärke zu markieren.

Eine Arbeitsregel für Manuskripte

Die Schriftbefehle, die unmittelbar im Text stehen, sollten auf jene beschränkt bleiben, die Bedeutung tragen. In einer Abschlussarbeit oder einem technischen Dokument wird das Manuskript umso schwerer pflegbar, je mehr Schriftwechsel als kleine optische Korrekturen verstreut werden. Regeln wie „Überschriften sind fett“, „Bildunterschriften sind kleiner“, „definierte Begriffe stehen durchgängig serifenlos“ gehören in die Klasse, in ein Paket oder in ein eigenes semantisches Makro, nicht in ein jedes Mal neu getipptes \textbf. Eine Zwischenschicht – \newcommand{\term}[1]{\textsf{#1}} – macht aus einem Richtungswechsel eine einzeilige Änderung. Umgekehrt ist bei Dingen, deren Aussehen die Bedeutung ist, etwa dem Namen einer Schaltfläche oder einer Taste, ein \textsf oder \texttt mitten im Text völlig in Ordnung. Der Prüfstein lautet schlicht: Ist das Aussehen das Ziel oder der Stellvertreter einer Bedeutung?

  • Hervorhebung \emph überlassen. Eine im Text festgeschriebene optische Entscheidung nimmt die Möglichkeit, das Aussehen der Hervorhebung später zu ändern.
  • Für lange Bereiche Deklarationen nehmen. Bei einem ganzen Zitat oder einer Randnotiz \itshape am Anfang der Umgebung deklarieren und die Gruppe von der Umgebung schließen lassen.
  • Kombinationen zuerst in einer Minimaldatei prüfen. \textsf{\textbf{...}} oder \textsc{...} einmal in einem kurzen Dokument setzen und sicherstellen, dass das Protokoll keine Schriftwarnung enthält, bevor sie im Manuskript verteilt werden.
  • Ersetzungen nicht auf sich beruhen lassen. Werden die Warnungen ignoriert, kann dieselbe Auszeichnung von Kapitel zu Kapitel anders aussehen. Schrift wechseln oder Anforderung vereinfachen.
  • Keine alten zweibuchstabigen Befehle einmischen. Findet sich \bf oder \it in einem gemeinsam verfassten Manuskript, durch \bfseries / \itshape oder \textbf / \textit ersetzen. Sie scheinen zu funktionieren, kombinieren sich aber nicht.