Estoy trabajando en la codificación de una fuente personalizada en FontForge para algunas alternativas posicionales de letras . No estoy trabajando con archivos de funciones para alternativas, sino que uso la interfaz de FontForge para crear búsquedas (no me opongo totalmente a una solución de archivo, pero basándome en lo que he visto a través de una búsqueda exportada a un archivo de FontForge, el .fea
archivo la sintaxis no parece coincidir con lo que dice ese enlace, por lo que incluso a través de un archivo, no estoy seguro de cómo implementar esto).
En ese enlace de arriba, se nota que cuando se trabaja con ese tipo de archivo, se puede hacer un "ignorar" para un patrón. Suponiendo aquí que uno tiene una forma medial de una letra y una forma inicial, cualquier forma medial que esté precedida por otra letra no se cambia a la forma inicial:
ignore sub @AllLetters @Medial';
sub @Medial' by @Initial;
En otras palabras, hay una manera de establecer un patrón (o patrones) para ignorar la realización de una búsqueda, antes de la llamada de búsqueda real, para limitar cuándo se realiza la búsqueda.
Sin embargo, no puedo encontrar ninguna documentación que indique cómo codificar ese mismo tipo de ignore
declaración al usar los cuadros de diálogo de búsqueda para crear patrones de búsqueda. Entonces, en mi subtabla de búsqueda para sustituciones de encadenamiento contextual, tengo esto hasta ahora que está construido (con nombres ficticios aquí):
| className @<mySubstitutionLookup> |
Pero si pongo algo ignore
, entonces dice que "ignorar no es un nombre de clase para las clases coincidentes" (que entiendo por qué dice eso, ya que no he definido una clase "ignorar", pero tampoco debería necesitar si fuera una palabra clave).
Aparentemente, en el cuadro de diálogo de búsqueda...
... ignore
las declaraciones deben codificarse de manera diferente, pero nuevamente, no puedo encontrar documentación de cómo (o incluso si , aunque creo que podrían) esos cuadros de diálogo pueden codificar eso.
Entonces, ¿cómo se ignore
codifica una declaración en una sustitución de encadenamiento contextual utilizando los cuadros de diálogo del programa? Y si un .fea
archivo FontForge puede hacerlo, ¿cómo se hace exactamente con la variación de la sintaxis?
FontForge es muy confuso, así que aquí está la respuesta general de "cómo hacer esto" en caso de que sea útil para alguien. Primero, comprenda que cada regla en su lista de sustitución de encadenamiento tiene esta forma:
backClass | matchClass @<Lookup Table> | forwardClass
La forma en que funciona una regla es la siguiente: verifica cada regla en secuencia, buscando una coincidencia. Si encuentra una coincidencia, deja de buscar y luego traduce los caracteres coincidentes a través de la tabla de búsqueda seleccionada. backClass y forwardClass son opcionales, pero matchClass representa los caracteres que cambiarán , utilizando la tabla de búsqueda especificada para determinar con qué reemplazarlos.
En general, la forma en que hace lo que está describiendo es que necesita tener DOS (sub) tablas de búsqueda. En todos los ejemplos a continuación, finja que a
es el personaje normal y A
es la versión inicial elegante.
Primero, en su lista de tablas de búsqueda, tendrá la búsqueda "Composición":
a -> A
b -> B
c -> C
Luego, también define una tabla de búsqueda, su búsqueda de "Descomposición":
A -> a
B -> b
C -> c
(En su caso, ambos son solo tablas de sustitución; si estuviera haciendo ligaduras, podría ser un carácter de sustitución múltiple).
Por último, viene su tabla de encadenamiento contextual. Usted definiría su regla así:
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
Esta regla le dice a la fuente "si ve un glifo en {letras}, seguido de un glifo en {letras iniciales}, transforme el glifo en {letras iniciales}, también conocido como el glifo coincidente, usando la tabla de búsqueda Búsqueda de descomposición". Entonces, por ejemplo, aA
se convierte en aa
, porque la búsqueda de descomposición especifica A -> a
.
Finalmente, muy importante, debe ordenar sus tablas de búsqueda en su fuente de la siguiente manera:
Decomposition Lookup (A -> a)
Composition Lookup (a -> A)
Contextual Chaining
¿Por qué? A medida que se procesa el flujo de glifos, primero restablecerá todos los glifos alternativos potenciales (aplicando descomposición)*. A continuación, aplica unilateralmente todos los glifos alternativos (aplicando composición). Por último, "deshace" selectivamente los glifos alternativos (usando la búsqueda de encadenamiento contextual), al volver a aplicar la Búsqueda de descomposición solo donde se aplican sus reglas de coincidencia.
*
En realidad, la búsqueda de descomposición no hará nada porque, por lo general, sus formas "alternativas" o "ligadas" no pueden existir en el flujo de glifos entrante. Todavía es importante que vaya antes de la búsqueda de composición, de lo contrario, deshará inmediatamente todos los glifos alternativos que especificó.
Espero que esto ayude...
ACTUALIZACIÓN: olvidé mencionar que lo anterior es una forma de obtener el comportamiento "aplicar estas sustituciones a menos que se apliquen estas reglas". En su lugar, puede ser un poco más simple aplicar la sustitución solo cuando lo desee ... Creo que puede hacer esto cambiando la función de la tabla de búsqueda de composición a "en blanco" (deshabilitarla), y hacer que sus reglas especifiquen cuándo aplicar la búsqueda. Este enfoque no requiere la tabla de búsqueda de descomposición.
En su regla Atrás|Coincidencia|Adelante en Fontforge, no asigne la búsqueda a la clase de coincidencia. Esto creará la declaración Ignorar.
ScottS
eliot nelson