Posicionamiento con valores numéricos

Tutorial
by Rainer Erich Scheichelbauer
en es fr

3 agosto 2022

Ahora puedes definir valores numéricos en los másteres de las fuentes. Estos se interpolan y pueden utilizarse como variables en el código de funciones OpenType.

Supongamos que quieres resolver el problema de los paréntesis para la composición tipográfica en mayúsculas. Fácil, lo colocarías en la función case. Sin embargo, no es conveniente hacer esto con glifos alternativos como parenleft.case y parenright.case, porque las formas de los paréntesis están bien para la composición tipográfica normal en mayúsculas y minúsculas. Sólo hay que desplazar los paréntesis al lugar correcto. La solución: hacer un ajuste de posicionamiento. Ya puedo oírte decir: ‘Espera un momento, ¿qué es exactamente un ajuste de posicionamiento?’

Sustitución vs. posicionamiento

En principio, hay dos tipos de reglas posibles en una función OpenType, sustitución y posicionamiento. En cada caso, las definirás en una función en Archivo > Información de la fuente > Funciones. Cuando se compila la fuente, las reglas de sustitución acaban en una tabla OpenType llamada GSUB, que es la abreviatura de sustitución de glifos, y el código de posicionamiento va en GPOS, abreviatura de posicionamiento de glifos.

En código de función, una regla de sustitución se vería así:

sub parenleft by parenleft.case;

…que sustituye un glifo llamado parenleft por un glifo alternativo llamado parenleft.case. Normalmente, el sufijo representa la función OpenType a la que hace referencia. En este caso, case se refiere a la función que distingue entre mayúsculas y minúsculas, que ‘desplaza varios signos de puntuación a una posición que funciona mejor con oraciones en mayúsculas o grupos de números de caja alta o alineados.’ En el ejemplo anterior, el desplazamiento se realiza sustituyendo una versión del paréntesis por otra.

En cambio, una regla de posicionamiento de glifos en la misma función se vería así:

pos parenleft <10 40 20 0>;

Desplaza el glifo parenleft 40 unidades hacia arriba, y le agrega 10 unidades extra a cada lado.

Para explicarlo: según la especificación AFDKO (donde se define la sintaxis de este tipo de código de función), se denomina ajuste único de posicionamiento. La estructura entre < y > se denomina registro de valor y consta de cuatro números. Los dos primeros son el ajuste de posición x e y, lo que significa mover la figura del paréntesis izquierdo. En nuestro caso, el paréntesis se desplaza 10 unidades a la derecha y 40 unidades hacia arriba.

Mover el paréntesis a la derecha significa que también necesitamos más espacio en el lado derecho, porque de lo contrario podría haber una colisión con el glifo que viene a continuación. Es por esta razón que hay un tercer y cuarto número: el ajuste de avance x e y, que se refiere a la posición del cursor después del paréntesis, o el lugar donde se conectará el siguiente glifo. Si queremos agregar espacio alrededor de los paréntesis con 10 unidades extra a la izquierda y 10 unidades extra a la derecha, el cursor después del paréntesis y por lo tanto los siguientes glifos deben moverse a la derecha en (10+10=) 20 unidades. O en otras palabras, el avance se incrementa en 20 unidades. El cuarto número es cero porque queremos que los glifos que siguen permanezcan en la misma línea, por supuesto.

La ventaja de la solución de posicionamiento es evidente: no es necesario gestionar glifos adicionales, que de otro modo podrían no estar sincronizados. Una posible fuente de error menos. Por supuesto, la desventaja también es evidente: sólo puedes utilizar la solución pos si el diseño lo permite en primer lugar. En pocas palabras, sólo puedes mover la posición del paréntesis, pero no puedes modificar sus contornos con este método.

Clases

No hace falta decir que haremos esto no solo para el paréntesis izquierdo, sino también para el paréntesis derecho, así como para las llaves y los corchetes. Por lo tanto, la línea de código se vería así:

pos [parenleft parenright bracketleft bracketright braceleft braceright] <10 40 20 0>;

Cuando colocas varios nombres de glifos entre corchetes de esta forma, se denomina ‘clase OpenType’. También puedes definir una clase y darle un nombre, sobre todo si quieres reutilizarla más adelante, en otra función:

@brackets = [parenleft parenright bracketleft bracketright braceleft braceright];
pos @brackets <10 40 20 0>;

Verás, para diferenciarlos de los simples nombres de glifos, los nombres de clase empiezan con un signo de arroba (@). Ahora, una vuelta de tuerca más: puedes definir la misma clase en la interfaz de usuario de la ventana Información de la fuente > Funciones:

... y añade allí el código de tu clase:

Esto significa que sólo la línea pos debe permanecer en la función case:

Para comprobar si lo has hecho todo bien, haz clic en el botón Compilar. Si no aparece ningún mensaje de error, todo está funcionando. Si recibes un mensaje de error, intenta entender lo que dice. El editor de código te ayudará a corregir cualquier error que pueda estar oculto en el código.

Valores numéricos

Digamos que tienes un diseño donde la solución de posicionamiento es una opción, pero resulta que necesitarías desplazarlo hacia arriba 40 unidades en el máster de la ligera, pero sólo necesitas un desplazamiento de 20 unidades en el máster de la negrita. Eso significa que el código que introdujimos aquí sería bueno para los estilos ligeros, pero no lo suficientemente bueno para los estilos en el extremo opuesto del espectro de peso.

Introduce números: en Archivo > Información de la fuente > Másteres > Valores numéricos, puedes definir variables y darles un nombre. ¿Lo bueno? Una vez que definas esos números, aparecerán en todos los másteres. No hace falta decir que puedes darles diferentes valores en cada máster. Además, los valores están muy bien interpolados en lo que queremos obtener.

Así que añadamos un número, llamémoslo parenthesisshift, y démosle un valor de 40 en el máster de la ligera:

... y cambia su valor a 20 en el máster de la negrita.

Hasta aquí todo bien. Pero, ¿cómo introducimos ese número en nuestro código de función? Fácil: ¡con un prefijo $! Nuestro código de función case ahora se verá así:

pos @brackets <10 $parenthesisshift 20 0>;

Así, nuestra ventana Información de la fuente > Funciones tendrá más o menos este aspecto:

Ahora, cuando exportemos nuestros estilos de fuente, el código se escribirá con la interpolación numérica adecuada, y los paréntesis se desplazarán siempre al lugar correcto en cada estilo. Genial.

Cálculos con valores numéricos

Hasta aquí, todo bien. ¿Pero qué pasa con la posición horizontal y los números avanzados? Podemos introducir fácilmente un nuevo número en Información de la fuente > Másteres > Valores numéricos y llamarlo cappadding. Así, en los másteres de la negrita, escribimos, por ejemplo:

Por lo general, ese número será menor en los pesos en negrita y mayor en los pesos ligeros. Esto se debe a que un poco más de blanco es mucho en un peso en negrita, porque ya hay muy poco blanco para empezar. La misma cantidad de blanco extra sería insignificante en un peso ligero, que ya tiene mucho blanco. Por lo tanto, establecemos un valor más alto en los másteres ligeros:

Recuerda que el avance tiene que ser el doble que el valor de posicionamiento si quieres agregar espacio uniformemente a izquierda y derecha. Así que no podemos simplemente (re)utilizar el número, sino que necesitamos multiplicarlo por dos. ¿Cómo lo hacemos? Fácil, con un cálculo:

pos @brackets <$cappadding $parenthesisshift ${cappadding*2} 0>;

Para un cálculo dentro de la sintaxis de la función OpenType, comenzamos con un signo de dólar $ y escribimos el cálculo entre llaves: ${...}. Si queremos un cappadding doble, simplemente escribimos ${cappadding*2}:

Eso es todo. Todos los nombres de números están disponibles, al igual que cualquier número y las operaciones matemáticas básicas: +y - para sumar y restar, * y / para multiplicar y dividir. Todo lo que esté entre llaves se calculará para cada estilo individual según su interpolación.


Actualización 08-03-06: pequeños cambios de formato.
Traducción al español de Sol Matas.