Positionner avec des valeurs numériques

Tutoriel
by Rainer Erich Scheichelbauer
en fr

31 mai 2020

Vous pouvez définir des valeurs numériques dans les masters de police. Elles s’interpolent et peuvent être utilisées en tant que variables dans le code de fonction OpenType.

Disons que vous voulez résoudre le problème des parenthèses pour la composition toutes en capitales. Facile, vous le placeriez dans la fonction case. Cependant, vous ne voulez pas le faire avec des glyphes alternates comme parenleft.case et parenright.case, car les formes de vos parenthèses sont parfaites pour la composition normale en minuscules ponctuée de majuscules. Il faut simplement déplacer les parenthèses à la bonne place. La solution: faire un ajustement de positionnement. Je vous entends déjà dire: ‘calmez-vous, c’est quoi au juste un ajustement de positionnement?’

Substitution vs positionner

En principe, il y a deux types possibles de règles dans une fonction OpenType, substitution et positionnement. Dans chacun des cas, vous les définissez dans une fonction en allant à Fichier > Informations de police > Fonctions. Lorsque la police est compilée, les règles de substitution se retrouvent dans une table OpenType nommée GSUB, qui signifie substitution de glyphes, et le code de positionnement est placé dans GPOS, qui signifie positionnement de glyphes.

Dans le code de fonction, une règle de substitution ressemble à ceci:

sub parenleft by parenleft.case;

…qui substitue un glyphe nommé parenleft par un glyphe alternate nommé parenleft.case. Typiquement, le suffixe représente une fonction OpenType à laquelle il s’adresse. Dans ce cas, case réfère à la fonction des formes sensibles à la casse, qui ‘déplace vers le haut diverses marques de ponctuation vers un positionnement qui fonctionne mieux avec des phrases toutes en capitales ou des groupes de chiffres alignés.’ Dans l’exemple précédent, le changement de position est fait en remplaçant une version de la parenthèse avec une autre.

Quant à une règle de positionnement de glyphes pour la même fonction, elle ressemblerait à ceci:

pos parenleft <10 40 20 0>;

Elle déplace le glyphe parenleft de 40 unités vers le haut, et lui ajoute 10 unités d’espace additionnel de chaque côté.

Pour expliquer davantage: selon les spécifications AFDKO (dans lesquelles la syntaxe pour ce genre de code de fonction est définie), cela s’appelle un ajustement unique de positionnement. La structure entre < et > se nomme un enregistrement de valeur et consiste en quatre nombres. Les deux premiers sont les ajustement de positions x et y, ce qui veut dire le déplacement de l’image de la parenthèse de gauche. Dans notre cas, la parenthèse est déplacée de 10 unités vers la droite et de 40 unités vers le haut.

Déplacer la parenthèse vers la droite signifie que nous avons également besoin de plus d’espace sur le côté droit car autrement il pourrait y avoir une collision avec la capitale qui vient ensuite. C’est pour cette raison qu’il y a un troisième et quatrième nombres: l’ajustement d'avance x et y, qui réfère à la position du curseur après la parenthèse, ou encore l'emplacement où le glyphe suivant connectera. Si nous voulons ajouter de l’espace autour des parenthèses avec 10 unités supplémentaires sur la gauche et 10 unités supplémentaires sur la droite, le curseur après la parenthèse et par le fait même le glyphes qui suivent doivent être déplacés vers la droite de (10 + 10 =) 20 unités. Ou en d’autres mots, l’avance est augmentée de 20 unités. Le quatrième nombre est zéro car nous voulons que les glyphes qui suivent demeurent sur la même ligne (de toute évidence).

L’avantage du positionnement comme solution est clair: vous n’avez pas besoin de gérer des glyphes additionnels, qui pourraient éventuellement causer le problème de ne plus être synchronisés. Voilà une source possible d’erreur en moins. Bien entendu, le désavantage est également clair: vous pouvez utiliser la solution pos seulement si le design le permet en tout premier lieu. Bref, vous ne pouvez déplacer la parenthèse mais vous ne pouvez pas modifier son dessin avec cette méthode.

Classes

Inutile de dire que vous feriez cela non seulement pour la parenthèse de gauche, mais également pour la parenthèse de droite, ainsi que pour les accolades et les crochets. La ligne de code aurait donc l’air de ceci:

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

Lorsque vous placez comme cela plusieurs noms de glyphes entre des crochets, cela s’appelle une ‘ classe OpenType’. Vous pouvez aussi définir une classe et lui donner un nom, en particulier si vous souhaitez l’utiliser à nouveau plus tard, dans une autre fonction:

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

Voyez-vous, afin de les différencier avec de simples noms de glyphes, les noms de classes débutent avec une arobase (@). Dernier détail: vous pouvez définir la même classe dans l’interface utilisateur de la fenêtre Informations de police > Fonctions:

…et ajouter votre code de classe à cet endroit:

Cela signifie que seulement la ligne pos doit demeurer dans la fonction case:

Pour vérifier que vous avez tout fait correctement, cliquez sur le bouton Compiler. Si aucun message d’erreur n’apparaît, c’est que tout fonctionne. S’il y a un message d’erreur, faites de votre mieux pour le comprendre. L’éditeur de code vous assistera dans la correction d’erreurs qui pourraient se cacher dans le code.

Valeurs numériques

Disons que vous avez un design où le positionnement est une bonne solution, mais il s’avère que vous auriez besoin d’un déplacement de 40 unités vers le haut dans le master maigre et de 20 unités seulement dans le master gras. Ce qui signifie que le code que nous avons placé ici sera bon pour les styles maigres, mais ne fonctionnera pas pour les styles à l’autre extrémité de la gamme des graisses.

Entrer des nombres. Dans Fichier > Informations de police > Masters > Nombres, vous pouvez définir des variables et leur donner un nom. La bonne chose? Une fois que vous définissez un tel nombre, il apparaît dans tous les masters. Il va sans dire, que vous pouvez leur donner des valeurs différentes dans chaque master. De plus, les valeurs sont joliment interpolées en ce que nous voulons obtenir.

Ajoutez donc un nombre, appelez-le parenthesisshift, et donnez-lui une valeur de 40 dans le master maigre:

…puis changez sa valeur pour and change à 20 dans le master gras.

Jusqu’ici tout va bien. Mais comment obtenons-nous ce nombre dans notre code de fonction? Facile: avec un préfixe$! Notre code de fonction case est maintenant comme ceci:

pos @brackets <10 $parenthesisshift 20 0>;

Donc, votre fenêtre Informations de police > Fonctions ressemblera à ceci:

Maintenant, lorsque nous exportons nos styles de police, le code est écrit avec l’interpolation appropriée du nombre, et la parenthèse est déplacée au bon endroit dans chaque style. Génial.

Calculs avec des valeurs numériques

Très bien. Et maintenant discutons du placement horizontal et des chiffres avancés. Nous pouvons facilement introduire un nouveau nombre dans Informations de police > Masters > Valeurs numériques et le nommer cappadding. Donc, dans le master gras, nous pouvons écrire, par exemple:

Typiquement, ce nombre sera plus petit dans les instances plus grasses et plus important dans les instances plus maigres. C’est qu’un peu plus de blanc est beaucoup pour une forte graisse car il y en a déjà très peu pour commencer. La même quantité de blanc est négligeable dans une variante maigre, qui en a abondamment. Définissons donc une valeur plus grande dans le master maigre:

Souvenez-vous que l’avance nécessite d’être deux fois la valeur de l’emplacement si vous voulez ajouter de l’espace également sur la gauche et la droite. Nous ne pouvons donc nous contenter de (ré)utiliser le nombre, mais nous avons plutôt besoin de le multiplier par deux. Comment pouvons-nous faire cela? Facile, avec un calcul:

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

Pour un calcul dans la syntaxe d’une fonction OpenType, nous commençons avec un signe de dollar $ et rédigeons le calcul entre des accolades: ${...}. Si nous voulons un double cappadding, nous écrivons simplement ${cappadding*2}:

C’est aussi simple que cela. Tous les noms numériques sont disponibles, tout comme n’importe quel nombre et les opérations mathématiques de base: +and - pour l’addition et la soustraction, * et / pour la multiplication et la division. Tout ce qui se trouve entre les accolades sera calculé pour chaque style individuel selon son interpolation.


Traduction française de Nathalie Dumont.