# Metafont

Metafont ist eine abstrakte Beschreibungssprache zur Definition von Vektorschriften. Es ist auch der Name des zugehörigen Interpreters, der den Metafont-Code ausführt und Bitmap-Schriften bestimmter Auflösung erzeugt. Es wurde von Donald E. Knuth als Begleiter von TeX entwickelt, um den zweiten Band von The Art of Computer Programming zu setzen, da er mit dem Resultat des Fotosatzes des ersten Bandes unzufrieden war. Metafont ist speziell entworfen, um TeX zu unterstützen, und ist deshalb auch Teil vieler TeX-Distributionen.
Knuth begann seine Arbeit an der Fonterstellungssoftware 1977 und brachte 1979 die erste Version von Metafont heraus. Wegen Unzulänglichkeiten der originalen Metafont-Sprache entwickelte Knuth 1984 ein komplett neues Metafont-System, dieses überarbeitete System ist heute in Benutzung. Die Versionsnummer nähert sich in Analogie zu TeX der Eulerschen Zahl an und soll nach Knuths Tod zu e geändert werden.

## Allgemeines

Die Form der Buchstaben wird in Metafont über geometrische Gleichungen definiert, die durchaus komplex sein können. Anders als die verbreiteteren Outline-Schriften (wie TrueType oder PostScript-Type-1-Fonts), besteht ein Metafont-Font hauptsächlich aus Strichen von „Stiften“ bestimmter Breite, zusammen mit gefüllten Flächen. Daher beschreibt eine Metafont-Datei nicht die Umrisse der Zeichen, sondern den Weg des Stiftes und die jeweilige Breite des Striches beim Zeichnen. Ein schönes Beispiel dazu findet sich im weiter unten genannten Metafont-Tutorial in Kapitel 0.5.
Einige einfachere Metafont-Fonts, wie z. B. die kalligraphischen Mathematikfonts der Computer-Modern-Familie, verwenden einen einzigen Strich eines relativ großen Stifts, um jeden sichtbaren „Strich“ eines Zeichens zu definieren. Komplexere Schriften wie die Roman-Textschriften der Computer-Modern-Familie verwenden in der Regel einen schmalen Stift, um die Umrisse der sichtbaren „Striche“ zu zeichnen, die dann gefüllt werden. Bei einem Standard-Outline-Font dagegen sind die Umrisse stets dimensionslos.
Das Verwenden von nicht-dimensionslosen Stiften zur Umrandung von Flächen führt in der Regel zu rationalen Kurven höherer Ordnung für die tatsächliche Umrisslinie, wodurch eine Konversion von Metafont-Schriften nach TrueType oder PostScript oftmals äußerst schwierig ist und in der Regel nur angenähert werden kann – TrueType verwendet nur Kurven stückweise zweiten Grades, PostScript nur Kurven dritten Grades.
Metafont unterscheidet sich von anderen Systemen durch die Variabilität der Fonts, die durch wenige Parameter wie Seitenverhältnis, Neigung, Strichstärke oder Serifengröße spezifiziert werden (deswegen auch das Meta im Namen); so kann durch Veränderung von relativ abstrakten Parametern an einer Stelle in der Metafont-Datei eine in der ganzen Schrift konsistente Änderung im Aussehen erreicht werden. Über „Breite eines schmalen Striches“, „Größe von Serifen“, „Neigung der Ellipse in Rundungen“ kann z. B. eine klassizistische Antiqua zu einer modernen Grotesk-Schrift geändert werden.
Computer Modern Roman illustriert viele Verwendungen dieser Möglichkeiten; eine typische TeX-Installation beinhaltet für einen bestimmten Font Schriftschnitte in Größen von 5 bis 17 Punkt, mit der gleichen (statt durch die Hochskalierung zunehmenden) Strichstärke in allen Größen und größenabhängigen Zeichenbreiten für bessere Lesbarkeit. Andere Fonts von Computer Modern, im Speziellen Typewriter und die Sans-Serif-Schnitte, sind, wie schon weiter oben erwähnt, im Wesentlichen über die gleiche Metafont-Datei definiert, jedoch mit unterschiedlichen globalen Parametern.
Andere Parameter wie die O-Korrektur (der Betrag, den eine Rundung größer gezeichnet wird) oder der Blackness-Parameter (Linien werden etwas dicker) dienen zur Anpassung an verschiedene Ausgabegeräte. Daneben sind in Metafont die Definition von Ligaturen und die Beeinflussung des Kernings möglich.
Vor einiger Zeit ist ein Abkömmling von Metafont entstanden, der eine PostScript-Datei ausgibt: MetaPost. Aus diesem wurde später METATYPE1 entwickelt, das einen Postscript-Type-1-Font mit den für TeX nötigen Metrikdateien erzeugt. Beide können jedoch keine Stifte verwenden, sondern beschreiben den Umriss des Bildes bzw. Zeichens.
Die wichtigste in Metafont entwickelte Schrift ist die Computer Modern von Knuth, die von TeX als Standardschrift benutzt wird.
Der Metafont-Interpreter kann auch interaktiv ausgeführt werden und kennt Kommandos, um die produzierten Bilder am Bildschirm auszugeben. Knuth sagte, er benutzt Metafont als eine Art Tischrechner zur Lösung komplizierter Gleichungen, obwohl er mittlerweile MetaPost für mathematische Illustrationen verwendet.

## Unterschied zwischen Metafont- und Type-1-Schriften bzw. DVI- und PDF-Dateien

Bei Metafont-Schriften muss für jedes Gerät ein angepasster Satz an Bitmap-Schriften erstellt werden. Die Idee von Metafont entspricht der von DVI-Dateien, bei denen keine Schriften, sondern nur Verweise darauf eingebunden werden. Nicht der Dokumentersteller liefert die Schriften, sondern derjenige, der das Dokument verarbeitet (liest bzw. ausdruckt), indem der DVI-Treiber die für dieses Gerät optimal erstellten Bitmap-Fonts lädt. Allerdings müssen auf dem Gerät die entsprechenden Schriften überhaupt verfügbar sein.
Hingegen verfolgt man bei PDF-Dateien den Ansatz, dass alle Schriften in die PDF-Datei eingebunden werden. Zwar kann man verschiedene Bitmap-Fonts einbinden, jedoch werden diese für unterschiedlichste Geräte nicht optimal angepasst sein. Daher werden für portable PDF-Dateien ausschließlich Vektorschriften (z. B. Type 1 Fonts) empfohlen. Beim Drucken hingegen liefern Metafont-Schriften, die auf den speziellen Drucker angepasst sind, Qualitätsvorteile gegenüber Type-1-Schriften.

## Beschreibungssprache

Hier ein kleines Beispiel aus dem Metafont-Logo-font, einer sehr einfachen Schriftart. Jeder Punkt hat eine X- und eine Y-Koordinate, die mit x1, y1, x2 etc. bezeichnet werden. Der Ausdruck z4 ist eine Abkürzung für (x4,y4).
| Quelltext eines Metafont-Buchstabens | Ausgabe im Proof-Modus |
| 1: beginlogochar("F", 14); 2: x1 = x2 = x3 = leftstemloc; 3: x4 = w - x1 + ho; 4: x5 = x4 - xgap; 5: y2 = y5; 6: y3 = y4; 7: bot y1 = -o; 8: top y3 = h; 9: y2 = barheight; 10: draw z1 11: -- z3 12: -- z4; 13: draw z2 14: -- z5; 15: labels(1, 2, 3, 4, 5); 16: endchar; | |
Die Zeile 1 definiert ein neues Zeichen mit dem Namen F und dem Zeichenkode 14.
In Zeile 2 werden die x-Positionen der Punkte 1, 2 und 3 auf leftstemloc gesetzt, einen Wert, der die Position des linken Striches angibt.
Die Zeile 3 definiert x4 so, dass er, abgesehen vom over-shot ho, den gleichen Abstand vom rechten Rand (spezifiziert durch w) hat, wie ihn Punkt 1 vom linken Rand hat.
In Zeilen 10 bis 14 werden letztendlich die Punkte 1, 3 und 4 durch gerade Linien (der linke und obere Strich vom F) verbunden und der kleine waagerechte Strich in der Mitte durch Verbinden der Punkte 2 und 5 gezeichnet.