Que faire lorsqu'une police ne supporte pas certaines diacritiques en petites majuscules?

Malheureusement, il se peut que certaines fontes ne fournissent pas une version en petites majuscules pour tous les caractères qu'elle supporte en bas de casse et en majuscule. Dans ce cas, la version en bas de casse est utilisée :

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Libertinus Serif}
 
\begin{document}
AḤMAD B. FAŻLĀN B. AL-ʿABBĀS B. RAŠĪD
 
Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd
 
\textsc{Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd}
\end{document}

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Libertinus Serif}
\pagestyle{empty}

\begin{document}
AḤMAD B. FAŻLĀN B. AL-ʿABBĀS B. RAŠĪD

Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd

\textsc{Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd}
\end{document}
En principe, la version de Libertinus Serif que vous avez installée sur votre ordinateur doit comprendre le ā en petites majuscules. La version utilisée pour générer ce document est un peu ancienne.

Dans le cas d'une police libre, vous pouvez bien entendu envoyer un rapport de bug. Mais dans l'intervalle, comment obtenir un et un ā en petites majuscules ?

Nous traitons ici le cas des fichiers OpenType (OTF).

Principes généraux

Le code source des polices OpenType comprend une série de fichiers .fea, qui définissent différentes fonctionnalités (features) de la fonte. La commande \textsc active la fonctionnalité smcp (pour small-caps). Pour obtenir un et un ā en petites capitales, nous allons donc intégrer à notre fichier .tex des instructions pour compléter le fichier .fea correspondant de Libertinus.

Les caractères dotés de diacritiques peuvent être obtenus de deux manières. Si les concepteurs de la fonte ont dessiné un glyphe correspondant au caractère unicode de (i.e. U+1E25), on peut l'obtenir en indiquant que, quand on utilise la fonctionnalité smcp, il faut remplacer le caractère par ḥ.sc (version en petites majuscules de ). Comme ce n'est pas le cas ici, on indiquera plutôt qu'il faut remplacer le par h.sc suivi d'un point en-dessous en combinaison (caractère U+1E25). Dans ce cas, le rendu final dépendra du moteur utilisé.

Avec Lua(La)Tex

Jusqu'en 2016, il était possible de charger un fichier .fea complémentaire avec l'option FeatureFile de fontspec. Depuis 2017, cette option n'est plus supportée, et Lua(La)TeX propose à la place un autre mécanisme reposant sur des scripts Lua. Ce nouveau mécanisme est plus rapide que le précédent et utilise moins de mémoire, mais il est malheureusement très mal documenté (voir les sources en bas de la page).

Pour les petites capitales, on s'inspirera du code suivant :

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Libertinus Serif}
 
\directlua{
fonts.handlers.otf.addfeature {
    name = "smcp",
    type = "multiple",
    data = {
            ['ḥ'] = { "h.sc", 0x0323 },
 	    ['ā'] = { "a.sc", 0x0304 }, 
    },
  }
}
 
\begin{document}
\textsc{Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd}
\end{document}

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Libertinus Serif}
\pagestyle{empty}
\directlua{
fonts.handlers.otf.addfeature {
    name = "smcp",
    type = "multiple",
    data = {
            ['ḥ'] = { "h.sc", 0x0323 },
 	    ['ā'] = { "a.sc", 0x0304 }, 
    },
  }
}

\begin{document}
\textsc{Aḥmad b. Fażlān b. al-ʿAbbās b. Rašīd}
\end{document}

Le script Lua interprétée par Lua(La)TeX est inséré grâce à la commande \directlua. La commande fonts.handlers.otf.addfeature utilisée dans ce script est passée à luaotfload, appelé automatiquement par Lua(La)TeX pour gérer l'importation des polices. À l'intérieur de la commande, on ajoute les propriétés de la fonctionnalité que l'on ajoute :

  • D'abord le nom de la fonctionnalité que l'on définit dans le fichier .fea de la police (introduit dans ce fichier par le mot-clef feature, voir ici pour Libertinus) ;
  • Ensuite, comme argument de type, la manière dont il faut interpréter les remplacements que nous allons renseigner (ici, “multiple” signifie que les caractères qui composent les remplacements doivent être additionnés) ;
  • Enfin, une table de remplacements donnée comme arguments de data, où il faut respecter scrupuleusement l'usage des crochets, des accolades, des guillemets et des virgules. La première ligne peut se lire comme suit : dans le mode smcp, à chaque fois que l'on rencontre un , il faut le remplacer par l'addition de la lettre h en petites majuscules et de la diacritique U+0323.

Pour éviter de surcharger votre préambule et faciliter la réutilisation du code dans plusieurs fichiers, vous pouvez enregistrer le script Lua dans un fichier appelé, par exemple, libertinus-sc.lua, que vous appellerez avec la commande :

\directlua{ require("libertinus-sc.lua") }
Pour que le fichier de script soit trouvé automatiquement depuis n'importe quel document sans que vous n'ayez besoin de spécifier le chemin complet, vous pouvez l'enregistrer dans $HOME/texmf/scripts/lua ou dans /usr/share/texmf/scripts/lua, conformément à la TDS.
Si vous utilisez polyglossia, il faut respecter l'ordre suivant dans le préambule, sans quoi votre script sera ignoré :
  1. Définition des polices avec les commandes de fontspec et chargement du script ;
  2. polyglossia ;
  3. Définition des langues du document.

De manière générale, comme le précise le manuel de polyglossia p. 5, « il est conseillé d'activer les langues après avoir chargé toutes les extensions ».


Sources :

3_composition/texte/symboles/polices/petites_majuscules_diacritiques.txt · Dernière modification: 2021/02/15 22:32 par bdumont
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0