So setzen Sie ein 'Ignorieren' für ein Muster für die kontextbezogene Ersetzung in FontForge

Ich arbeite an der Codierung einer benutzerdefinierten Schriftart in FontForge für einige Positionsalternativen von Buchstaben . Ich arbeite nicht mit Feature-Dateien für Alternativen, sondern verwende die FontForge-Schnittstelle zum Erstellen von Lookups (ich bin nicht völlig gegen eine Dateilösung, aber basierend auf dem, was ich über einen exportierten Lookup in einer Datei von FontForge gesehen habe, die .feafile Syntax scheint nicht ganz mit dem übereinzustimmen, worüber dieser Link spricht, also bin ich mir selbst über eine Datei nicht sicher, wie ich das implementieren soll).

In diesem Link oben wird darauf hingewiesen, dass man beim Arbeiten mit diesem Dateityp ein Muster "ignorieren" kann. Unter der Annahme, dass man hier eine mediale Form eines Buchstabens und eine Anfangsform hat, wird jede mediale Form, der ein anderer Buchstabe vorangestellt ist, nicht auf die Anfangsform umgestellt:

ignore sub @AllLetters @Medial';
sub @Medial' by @Initial;

Mit anderen Worten, es gibt eine Möglichkeit, ein Muster (oder Muster) festzulegen, um das Ausführen einer Suche vor dem eigentlichen Suchaufruf zu ignorieren, um zu begrenzen, wann die Suche abgeschlossen ist.

Ich kann jedoch keine Dokumentation finden, die angibt, wie dieselbe Art von ignoreAnweisung codiert wird, wenn die Nachschlagedialogfelder zum Erstellen von Nachschlagemustern verwendet werden. In meiner Nachschlage-Untertabelle für kontextbezogene Verkettungssubstitutionen habe ich dies bisher erstellt (mit Dummy-Namen hier):

| className @<mySubstitutionLookup> |

Aber wenn ich welche einfüge ignore, heißt es, dass "Ignorieren kein Klassenname für die übereinstimmenden Klassen ist" (was ich verstehe, warum es das sagt, da ich keine "Ignorieren" -Klasse definiert habe, aber ich sollte es auch nicht müssen wenn es ein Schlüsselwort wäre).

Also anscheinend im Suchdialog ...

Geben Sie hier die Bildbeschreibung ein

... ignoreAnweisungen müssen anders codiert werden, aber auch hier kann ich keine Dokumentation darüber finden, wie (oder sogar wenn , obwohl ich denke, dass sie es könnten) diese Dialogfelder das codieren können.

Wie bekommt man also eine ignoreAnweisung zum Coden in eine kontextabhängige Verkettungsersetzung, indem man die Dialogfelder des Programms verwendet? Und wenn eine FontForge- .feaDatei das kann, wie genau wird das mit der Variation der Syntax gemacht?

Antworten (2)

FontForge ist wahnsinnig verwirrend, also hier ist die allgemeine "Wie man das macht"-Antwort, falls es für irgendjemanden hilfreich sein sollte. Verstehen Sie zunächst, dass jede Regel in Ihrer Verkettungsersetzungsliste diese Form hat:

backClass | matchClass @<Lookup Table> | forwardClass

Eine Regel funktioniert folgendermaßen: Sie überprüft jede Regel der Reihe nach und sucht nach einer Übereinstimmung. Wenn es eine Übereinstimmung findet, hört es auf zu suchen und übersetzt dann die übereinstimmenden Zeichen durch die ausgewählte Lookup-Tabelle. backClass und forwardClass sind optional, aber matchClass stellt die Zeichen dar, die sich ändern werden , wobei die angegebene Nachschlagetabelle verwendet wird , um zu bestimmen, wodurch sie ersetzt werden sollen.

Im Allgemeinen ist die Art und Weise, wie Sie das tun, was Sie beschreiben, dass Sie ZWEI Nachschlagetabellen (Untertabellen) benötigen. Stellen Sie sich in allen folgenden Beispielen vor, dass dies adas reguläre Zeichen und Adie ausgefallene ursprüngliche Version ist.

Zuerst haben Sie in Ihrer Liste der Nachschlagetabellen die Nachschlagefunktion „Zusammensetzung“:

a -> A
b -> B
c -> C

Dann definieren Sie auch eine Lookup-Tabelle, Ihren "Decomposition"-Lookup:

A -> a
B -> b
C -> c

(In Ihrem Fall sind beide nur Ersatztabellen; wenn Sie Ligaturen machen, könnte es sich um ein mehrfaches Substitutionszeichen handeln.)

Als letztes kommt Ihre Contextual Chaining-Tabelle. Sie würden Ihre Regel wie folgt definieren:

Rule: letters | initialLetters @<Decomposition Lookup> |

      ^ back    ^ matching     ^ lookup                  ^ forward

Class: letters        = a b c d e f ....
Class: initialLetters = A B C D E F G

Diese Regel teilt der Schriftart mit, "wenn Sie eine Glyphe in {Buchstaben} sehen, gefolgt von einer Glyphe in {initialLetters}, transformieren Sie die Glyphe in {initialLetters} - auch bekannt als die übereinstimmende Glyphe - unter Verwendung der Nachschlagetabelle Decomposition Lookup". So wird beispielsweise aAzu aa, weil die Dekompositionssuche angibt A -> a.

Schließlich, sehr wichtig, müssen Sie Ihre Nachschlagetabellen in Ihrer Schriftart wie folgt anordnen:

Decomposition Lookup (A -> a)
Composition Lookup (a -> A)
Contextual Chaining

Warum? Während der Glyphenstrom verarbeitet wird, werden zunächst alle potenziellen alternativen Glyphen zurückgesetzt (durch Anwendung der Zerlegung)*. Als nächstes wendet es einseitig alle alternativen Glyphen an (durch Anwenden einer Komposition). Zuletzt werden die alternativen Glyphen selektiv "rückgängig" gemacht (unter Verwendung der kontextabhängigen Verkettungssuche), indem die Dekompositionssuche nur dort erneut angewendet wird, wo Ihre Übereinstimmungsregeln gelten.

*In Wirklichkeit wird die Dekompositionssuche nichts bewirken, da Ihre "alternativen" oder "Ligatur"-Formen normalerweise nicht im eingehenden Glyphenstrom vorhanden sein können. Es ist immer noch wichtig, dass es vor der Kompositionssuche steht, da es sonst sofort alle von Ihnen angegebenen alternativen Glyphen rückgängig macht.

Hoffe das hilft...

UPDATE: Ich habe vergessen zu erwähnen, dass das obige eine Möglichkeit ist, das Verhalten "Diese Ersetzungen anwenden, es sei denn, diese Regeln gelten" zu erreichen. Es kann etwas einfacher sein, die Ersetzung stattdessen nur dann anzuwenden, wenn Sie möchten ... Ich glaube , Sie können dies tun, indem Sie die Funktion Ihrer Kompositions-Nachschlagetabelle auf "leer" ändern (deaktivieren) und Ihre Regeln festlegen, wann die Suche angewendet werden soll. Dieser Ansatz erfordert keine Dekompositions-Nachschlagetabelle.

Danke für die Antwort. Lassen Sie mich sicher sein, dass ich es verstehe. Erstens gibt es dazu keine direkte "Ignorieren" -Anweisung (was in erster Linie die Frage war). Aber zweitens muss es durch richtige Codierung der Lookups erreicht werden. In Ihrem Beispiel würden die Großbuchstaben meiner "ursprünglichen" Version und die Kleinbuchstaben meiner "mittleren" Version entsprechen, richtig? Sie machen also alles medial (was normalerweise nichts tun würde, wie Sie es angeben), dann alles initial (groß), und wenn ein Buchstabe davor steht, konvertieren Sie es wieder in medial (niedriger).
Das ist der Ansatz, ja. Oder zumindest mache ich es so mit Ligaturen - wenn es einen einfacheren Weg gibt, habe ich ihn noch nicht entdeckt!

Weisen Sie in Ihrer Back|Match|Ahead-Regel bei Fontforge Lookup nicht der Match-Klasse zu. Dadurch wird eine Ignore-Anweisung erstellt.