>

This is part of the old website. New website begins at fontforge.github.io

Are you a web developer? Help us migrate this page on Github

Tutorial #7

Bedingte Eigenschaften

Sowohl OpenType als auch Apple-Schriften unterstützen kontextbezogene Eingeschaften. Dies sind Eigenschaften, die nur in einem bestimmten Kontext auftreten und sind notwendig für das Setzen von indischer und arabischer Schreibschrift. In OpenType wird ein Kontext durch eine Menge von Mustern spezifiziert, die gegen den Zeichenstrom des Dokuments getestet werden. Wenn ein Muster erkannt wird, werden die auf ihm definierten Ersetzungen angewendet. In einer Apple-Schriftart wird der Kontext mit Hilfe eines Zustandsautomaten definiert, ein Miniprogramm, welches den Zeichenstrom analysiert und transformiert.

Bedingte Eigenschaften können Ersetzungen, Ligaturen oder Unterschneidung (und einige andere obskure Verhaltensweisen) einbeziehen. Im folgenden wird ein Beispiel einer kontextbezogenen Ersetzung demonstriert.

Anstelle eines indischen oder arabischen Beispiels wird hier ein lateinisches verwendet, mit dem die meisten westlichen Anwender (wie auch der Autor) vertrauter sind. Das Problem beim Setzen lateinischer Schreibschriftsätze ist, daß die Buchstaben "b", "o", "v" und "w" an den darauffolgenden Buchstaben nahe der x-Höhe anschliessen, während alle anderen Buchstaben nahe der Grundlinie anschliessen. Aus diesem Grunde werden für jedes Zeichen zwei Varianten benötigt, eine die an der Grundlinie ansetzt (die links gezeigte, Grundeinstellung) und eine, die an der x-Höhe ansetzt. Diese zweite Variante wird im folgenden "high" Buchstaben genannt: "a.high", "b.high" usw.

OpenType Beispiel

Die Menge der möglichen Zeichen wird in drei Klassen aufgeteilt: die Buchstaben "bovw", alle anderen Buchstaben und alle anderen Zeichen. Es werden zwei Muster benötigt, das erste erkennt ein Zeichen in der "bovw"-Klasse gefolgt von einem Zeichen in der "bovw"- Klasse, während das andere ein Zeichen in der "bovw"-Klasse gefolgt von irgendeinem anderen Zeichen erkennt. Wenn eines dieser Muster auf das zweite Zeichen passt, sollte dieses in seine "high"-Variante transformiert werden.

Das erste Schritt ist es, eine einfache Ersetzung zu erzeugen, die jeden "low"-Buchstaben durch seine "high"-Variante ersetzt. Diese Ersetzung wird im folgenden mit dem OpenType-Tag "high" bezeichnet. Um diese zu definieren wird der Befehl Element ->Zeicheninformation wie bereits verwendet, ausser daß hier die Option "--- verschachtelt ---" aus "Schreibschrift/Sprache" aus dem Pulldown-Menü benutzt wird.

Der knifflige Teil ist die Definition des Kontexts. Dies wird im Reiter "Kontextuell" aus dem Dialog für Element ->Zeichensatzinformation gemacht, in dem fünf verschiedene Typen kontextbezogenen Verhaltens zur Auswahl stehen, in diesem Beispiel interessieren die kontextbezogen verketteten Ersetzungen.

Ein neuer Eintrag wird mit dem Knopf "Neu" angelegt, woraufhin eine Reihe von Dialogen erscheinen. Der erste erwartet die Vergabe eines OpenType-Tags der Länge von vier Zeichen und eine Schreibschrift/Sprache Selektion (wie bereits vorher gesehen).

In diesem Beispiel wird "calt" als Tagname vergeben. Dies scheint ein geeignetes Tag zu sein, leider ist es nicht für die lateinische Schreibschrift implementiert. Das Beispiel erzeugt eine Schriftart, die zwar syntaktisch korrekt ist, aber keinen Effekt hat. Es ist frustrierend, daß OpenType die Möglichkeiten bietet, wundervolle Dinge zu tun, um dann herauszufinden, daß Microsoft diese nicht für Latein ermöglicht.

Im nächsten Dialogfenster wird das generelle Format der Ersetzung festgelegt. Es soll ein klassenbasiertes System verwendet werden - es wurde oben bereits erwähnt welche Klassen definiert werden.

Im nächsten Dialog werden oben eine Reihe von Mustern und Ersetzungen angezeigt, die angewendet werden, wenn eine Zeichenkette erkannt wurde. Darunter befinden sich die Zeichenklassen, die diese Ersetzung verwendet. Ein Dialog für kontextbezogene Verkettung teilt den Zeichenstrom in drei Kategorien ein. Bildzeichen vor dem aktuellen Zeichen (diese werden Rückverfolgungszeichen genannt), das aktuelle Bildzeichen (es können mehr als eine spezifiziert werden), auf welche(s) möglicherweise einfache Ersetzungen angewendet wurden und zuletzt Bildzeichen, die nach dem aktuellen Zeichen auftreten (sog. "Vorschau"- oder "Lookahead"-Zeichen).

Jede Kategorie von Bildzeichen kann verschiedene Mengen von Klassen besitzen, in diesem Beispiel werden die selben Klassen für alle Kategorien verwendet (was die Konvertierung der Ersetzungen in das Apple-Format vereinfacht). Die erste Zeile (in dem "Liste von Listen"-Feld) liest sich folglich: wenn ein Rückverfolgungszeichen (das Zeichen vor dem aktuellen) in Klasse 1 gefolgt wird vom aktuellen Zeichen in Klasse 2, dann wird die einfache Ersetzung "high" auf die Position 0 - die einzige Position - in der zu durchsuchenden Zeichenkette (d.h. das aktuelle Zeichen) angewendet.

Bei Betrachtung der Zeichenklassendefinitionen fällt auf, daß in Klasse 1 die Zeichen enthalten sind, die von einer "high"- Variante gefolgt werden müssen, so daß die Definition dieser Regel nachvollziehbar ist.

Die zweite Zeile ist der ersten ähnlich, nur daß hier Zeichen in Klasse 1 erkannt werden. Bei Betrachtung der Klassendefinitionen ist zu sehen, daß die Klassen 1 und 2 alle Buchstaben enthalten, also bedeuten diese zwei Zeilen: wenn irgendein Buchstabe auf "b", "o", "v" oder "w" folgt, dann wird dieser Buchstabe in seine "high"-Variante umgewandelt.

Um, eine Zeichenklasse zu bearbeiten, wird ein Doppelklick darauf ausgeführt. Für das Hinzufügen einer neuen wird der Knopf "Neu" direkt unter der Klassenliste gedrückt. Daraufhin wird ein neuer Dialog angezeigt, der die Namen aller Zeichen in der aktuellen Klasse anzeigt. Wenn der Knopf "Auswählen" gedrückt wird, werden im Zeichensatzfenster die Zeichen ausgewählt, die in der Klasse enthalten sind, während "Setzen" das Umgekehrte macht und die Zeichen in der Klasse and die Auswahl im Zeichensatzfenster anpasst. Dies ist als Eingabehilfe gedacht, um die Eingabe einer Menge von Zeichennamen zu sparen.

Ein Druck auf den "Weiter"-Knopf legt die Klassendefinition fest und kehrt zum Übersichtsdialog zurück.

Um ein Muster zu bearbeiten, wird auf dessen Eintrag ein Doppelklick ausgeführt, oder um einen neuen Eintrag zu erstellen, der "Neu"-Knopf gedrückt (direkt unter der Liste von Listen). Wieder wird das Muster in drei Kategorien eingeteilt, die Zeichen, die vor dem aktuellen auftreten, das aktuelle Zeichen selbst und Zeichen, die nach dem aktuellen auftreten können. Mit Hilfe der Reiter oben im Dialog kann ausgewählt werden, welche Kategorie des Musters bearbeitet werden soll.

Darunter wird die Untermenge des Musters angezeigt, die für die aktuelle Kategorie gültig ist, die für diese Kategorie definierten Klassen und die Ersetzungen für das (die) aktuelle(n) Zeichen. Mit einem Klick auf eine der Klassen wird die Klassennummer zum Muster hinzugefügt.

Um eine Erzetzung zu bearbeiten, wird ein Doppelklick auf deren Eintrag durchgeführt, für einen neuen Eintrag der Knopf "Neu" (unter "Eine sortierte Liste...") gedrückt. Die Sequenznummer spezifiziert welches Zeichen von den aktuellen Zeichen geändert wird und das Tag spezifiziert den Namen der Ersetzung mit einer Länge von vier Zeichen.

Eine Warnung zu kontextbezogenen Verhalten: Es wird nicht von jeder Software unterstützt oder könnte sie evtl. nur für gewisse Schreibschriften unterstützen.

Apple fortgeschrittene Typographie

Apple spezifiziert einen Kontext mit Hilfe eines endlichen Zustandsautomaten. Dies ist grob gesagt ein kleines Programm, daß den Zeichenstrom analysiert und entscheidet, welche Ersetzungen angewendet werden. Jeder Zustandsautomat hat eine Menge von Zeichenklassendefinitionen (genau so wie im OpenType-Beispiel) und eine Menge von Zuständen. Die Verarbeitung startet in Zustand 0 am Beginn des Eingabestroms. Der Computer ermittelt, in welcher Klasse das aktuelle Zeichen ist und bestimmt mit Hilfe des aktuellen Zustands die Aktion, die für diesen Zustand und diese Klasse auszuführen ist. Die Aktion beinhaltet den Wechsel in einen anderen Zustand, das Inkrementieren der Eingabeposition und die Anwendung einer Ersetzung auf entweder das aktuelle oder ein vorheriges Zeichen (das "markierte" Zeichen).

Es wird im folgenden wieder das Beispiel eines lateinischen Schreibschrift- Zeichensatzes bemüht und es wird wieder eine einfache Ersetzung benötigt, um jeden Buchstaben in seine "high"-Variante zu konvertieren. Der Vorgang ist der gleiche wie für OpenType und es kann die selbe Ersetzung verwendet werden. Erneut werden die Zeichen in drei Klassen aufgeteilt (Apple definiert einige zusätzliche Klassen, aber grundsätzlich werden die gleichen Klassen wie bei OpenType verwendet). Es wird ein Zustandsautomat mit zwei Zuständen definiert (Apple definiert einen zusätzlichen, im Beispiel wird dies ignoriert): der Startzustand (der Grundzustand in dem sich nichts ändert), der andere Zustand wird erreicht, wenn vorher ein Zeichen aus der "bovw"-Klasse gelesen wurde.

Auch hier wird der Dialog des Befehls Element->Zeichensatzinformation verwendet (bei selektierter "Mac SM"-Option), um die verfügbaren kontextbezogenen Ersetzungen zu betrachten. Wieder stehen eine Anzahl verschiedener Typen kontextbezogenen Verhaltens zur Auswahl, es werden natürlich kontextbezogene Ersetzungen ausgewählt. Ein Doppelklick auf den Eintrag eines existierenden Zustandsautomaten oder ein Druck auf den Knopf "Neu" führt zu einer Übersicht des Zustandsautomaten.

Oben im Dialog ist ein Auswahlfeld für die Eigenschaft / Einstellung des Automaten, dies ist Apples Gegenstück zu dem 4-Zeichen Eigenschaftstag von OpenType. Darunter befindet sich eine Menge von Klassendefinitionen und ganz unten die Repräsentation des Zustandsautomaten selbst.

Ein Doppelklick auf einen Klasseneintrag öffnet einen Dialog, der dem in OpenType verwendeten ähnlich ist.

Ein Klick auf einen Zustandsübergang im Automaten (für jede Zustand/Klassen-Kombination gibt es einen Übergang) öffnet den Zustandsübergangsdialog. Dieser kontrolliert wie sich der Automat in einem bestimmten Zustand verhält, wenn eine Eingabe eines Zeichens in einer bestimmten Klasse gelesen wird. In diesem Beispiel wird Zustand 2 gezeigt (es wurde bereits ein "bovw"-Zeichen gelesen) und es wurde ein Zeichen aus Klasse 4 gelesen (ein anderes "bovw"-Zeichen). In diesem Fall ist wird wieder nach Zustand 2 gewechselt (weil wieder "bovw" gelesen wurde), das nächste Zeichen gelesen und die "high"-Ersetzung auf das aktuelle Zeichen angewendet.

Am unteren Ende des Fensters befinden sich einige Knöpfe für die Navigation durch die Zustände des Zustandsautomaten.

Mehrfacher Druck auf "Ok" verlässt diese Kette von Dialogen und fügt dem Zeichensatz einen neuen Zustandsautomaten hinzu.

-- Vorherige Seite -- Inhalt -- Nächste Seite --