Réglages de Fontconfig

Aperçu de Fontconfig

Si vous lisez des textes seulement en anglais et êtes contents avec les polices libres génériques listés dans la page suivante, vous pourriez n'avoir jamais besoin de vous occuper des détails de fonctionnement de fontconfig. Mais il y a plein de choses qui peuvent être modifiées si elles ne vous conviennent pas.

Bien que cette page soit longue, elle ne fait qu'effleurer la surface et vous pourrez trouver plein d'alternatives sur le web (mais rappelez-vous que certaines choses changent au fil des ans, par exemple l'autohinter n'est plus utilisé par défaut). Le but est ici de vous donner assez d'information pour comprendre les changements que vous faîtes.

Le Protocole de Police Xft

Le protocole de police Xft fournit un rendu de polices anti-crénelé à travers freetype et les polices sont contrôlées depuis le côté client avec fontconfig (sauf pour rxvt-unicode-9.31 qui peut utiliser les polices listées dans ~/.Xresources et AbiWord-3.0.5 qui n'utilise que les polices spécifiées). Le chemin de recherche par défaut est /usr/share/fonts et ~/.local/share/fonts bien que pour le moment le vieil emplacement obsolète ~/.fonts fonctionne toujours. Fontconfig recherche récursivement dans ces répertoires et maintient un cache des caractéristiques des polices dans chaque répertoire. Si le cache a l'air périmé, il est ignoré et les informations sont retrouvées depuis les polices elles-mêmes (ce qui peut prendre quelques secondes si vous avez installé beaucoup de polices).

Si vous avez installé Xorg dans un autre préfixe que /usr, les polices X n'ont pas été installées dans un répertoire connu de Fontconfig. Des liens symboliques ont été créés entre les répertoires de polices OTF et TTF de X et /usr/share/fonts/X11-{OTF,TTF}. Cela permet à Fontconfig d'utiliser les polices OpenType et TrueType fournies par X, même si beaucoup de monde préférera utiliser des polices plus modernes.

Fontconfig utilise les noms pour définir les polices. Les applications utilisent en général des noms de polices génériques comme « Monospace », « Sans » et « Serif ». Fontconfig résout ces noms en une police dont les caractères couvrent toutes les possibilités de la langue indiquée par les paramètres régionaux.

Commandes utiles

Les commandes suivantes peuvent être utiles lorsque vous travaillez avec fontconfig :

fc-list | less : montre la liste des polices disponible (/chemin/vers/fichier : Nom de la police:style). Si vous avez installé une police il y a plus de 30 secondes mais qu'elle n'apparaît pas, alors elle ou l'un de ses répertoires n'est pas lisible par votre utilisateur.

fc-match 'Font Name' : indique quelle police sera utilisée si la police de ce nom est demandée. Généralement vous l'utiliserez pour voir ce qui arrive si une police non-installée est demandée, mais vous pouvez aussi l'utiliser si le système utilise une police différente de ce à quoi vous vous attendiez (peut-être parce que fontconfig ne pense pas que la police supporte votre langue).

fc-match -a 'Type' | less : fournit une liste de toutes les polices qui peuvent être utilisée pour ce type (Monospace, Sans, Serif). Remarquez que parfois fontconfig prendra un glyphe d'une autre police disponible, même si elle n'est pas du type spécifiée, et à moins qu'il ne connaisse le type de la police, il supposera que c'est Sans.

Si vous souhaitez connaître quelle police sera utilisée pour une chaîne de caractères (c'est-à-dire un ou plusieurs glyphes, séparés par un espace), copiez la commande suivante et remplacez xyz par le texte qui vous préoccupe.

FC_DEBUG=4 pango-view --font=monospace -t xyz | grep family : ceci requiert Pango-1.50.14 et ImageMagick-7.1.1-15 - qui va invoquer display pour afficher le texte dans une petite fenêtre, et à la fermeture, la dernière ligne de la sortie montrera quelle police d'écriture a été utilisée. C'est particulièrement pratique pour les langues CJK, et vous pouvez également passer un langage, ex: PANGO_LANGUAGE=en;ja (Anglais, puis présume Japonais) ou simplement zh-cn (ou d'autres variantes - 'zh' seul n'est pas valide).

Les divers fichiers

Les fichiers principaux sont dans /etc/fonts/conf.d/. C'est un répertoire prévu pour être rempli de liens symboliques vers des fichiers dans /usr/share/fontconfig/conf.avail/, mais de nombreuses personnes, et quelques paquets, créent les fichiers directement. Chaque fichier doit être nommé comme suit : deux chiffres, un tiret, nom.conf et ils sont lus séquentiellement.

Par convention, les nombres sont assignés comme suit :

  • 00-09 répertoires de polices supplémentaires

  • 10-19 rendus systèmes par défaut (comme l'anti-crénelage)

  • 20-29 options de rendu des polices

  • 30-39 substitution par famille

  • 40-49 correspondance entre famille et type générique

  • 50-59 chargement des fichiers de configuration alternatifs

  • 60-69 alias génériques, fait correspondre les noms générique à la famille

  • 70-79 adapte quelles polices sont disponibles

  • 80-89 correspond aux numérisations (modification des modèles numérisés)

  • 90-99 synthèse de police

Vous pouvez avoir aussi un fichier fonts.conf personnel dans $XDG_CONFIG_HOME (c'est-à-dire ~/.config/fontconfig/).

Les règles de choix d'une police

Si la police demandée est installée, et à condition qu'elle contienne le point de code requis pour la langue actuelle (dans les sources, voir les fichiers .orth dans le répertoire fc-lang/), elle sera utilisée.

Cependant, si le document ou la page demande une police qui n'est pas installée (ou, parfois, ne contient pas tous les points de codes requis) les règles suivantes sont appliquées : en premier, 30-metric-aliases.conf est utilisé pour assigner des alias à certaines polices avec la même métrique (même taille, etc). Après cela, une police inconnue sera recherchée dans 45-latin.conf – si elle est trouvée elle sera assignée en tant que Serif ou Monospace ou Sans, sinon elle sera considérée comme étant Sans. Ensuite 50-latin.conf fournit les listes ordonnées des solutions de repli – Polices DejaVu seront utilisées si vous les avez installées. Le cyrillique et le grec semblent être traités de la même manière. Il y a des fichiers similaires avec un préfixe 65- pour le persan et d'autres systèmes d'écriture non latines. Tous ces fichiers préfèrent les polices commerciales si elles sont présentes, bien que les polices libres modernes soient souvent au moins égales.

Depuis fontconfig-2.12.5, il y a aussi des règles de familles génériques pour certaines polices d'emoji et de maths, consultez {45,60}-generic.conf.

Dans les rares cas ou une police ne contient pas tous les points de codes attendus, voir 'Essayez en premier :' dans I stared into the fontconfig pour plus de détails.

Hinting et Anticrénelage

Il est possible de changer la façon dont, ou si, les polices sont hintées. L'exemple de fichier suivant contient les paramètres par défaut, mais avec des commentaires. Les paramètres sont laissées aux préférences de l'utilisateur et au choix de police, de sorte qu'un changement qui améliore certaines pages peut en aggraver d'autres. L'endroit préférable pour ce fichier est : ~/.config/fontconfig/fonts.conf

Pour tester différents paramétrages, vous aurez peut être besoin de sortir de Xorg et ensuite relancer startx pour que toutes les applications utilisent le nouveau paramétrage. Si vous utilisez GNOME, KDE ou LXQt, leurs bureaux peuvent écraser ces modifications. Pour explorer les possibilités, créez un fichier pour votre utilisateur :

mkdir -pv ~/.config/fontconfig &&
cat > ~/.config/fontconfig/fonts.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

  <match target="font" >
    <!-- autohint was the old automatic hinter when hinting was patent
    protected, so turn it off to ensure any hinting information in the font
    itself is used, this is the default -->
    <edit mode="assign" name="autohint">  <bool>false</bool></edit>

    <!-- hinting is enabled by default -->
    <edit mode="assign" name="hinting">   <bool>true</bool></edit>

    <!-- for the lcdfilter see https://www.spasche.net/files/lcdfiltering/ -->
    <edit mode="assign" name="lcdfilter"> <const>lcddefault</const></edit>

    <!-- options for hintstyle:
    hintfull: is supposed to give a crisp font that aligns well to the
    character-cell grid but at the cost of its proper shape.

    hintmedium: poorly documented, maybe a synonym for hintfull.
    hintslight is the default: - supposed to be more fuzzy but retains shape.

    hintnone: seems to turn hinting off.
    The variations are marginal and results vary with different fonts -->
    <edit mode="assign" name="hintstyle"> <const>hintslight</const></edit>

    <!-- antialiasing is on by default and really helps for faint characters
    and also for 'xft:' fonts used in rxvt-unicode -->
    <edit mode="assign" name="antialias"> <bool>true</bool></edit>

    <!-- subpixels are usually rgb, see
    http://www.lagom.nl/lcd-test/subpixel.php -->
    <edit mode="assign" name="rgba">      <const>rgb</const></edit>

    <!-- thanks to the Arch wiki for the lcd and subpixel links -->
  </match>

</fontconfig>
EOF

Vous devrez maintenant éditer le fichier avec votre éditeur préféré.

Pour plus d'exemples, voir les fils de discussion de blfs-support qui ont débuté le 2016-09/00128, en particulier 2016-09/00137, et la solution préférée de l'auteur du message initial 2016-09/00147. Il y a d'autres exemples dans Fontconfig dans le wiki Arch et Fontconfig dans le wiki Gentoo.

Désactivation des polices Bitmaps

Dans les versions précédentes de BLFS, les vieilles polices laides de Xorg étaient installées. Maintenant, beaucoup de personnes n'ont plus besoin d'installer aucune d'entre elles. Mais si pour une raison ou une autre vous avez installé une ou plusieurs polices bitmap, vous pouvez empêcher leur utilisation par fontconfig en créant le fichier suivant en tant qu'utilisateur root :

cat > /etc/fonts/conf.d/70-no-bitmaps.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- Reject bitmap fonts -->
 <selectfont>
  <rejectfont>
   <pattern>
     <patelt name="scalable"><bool>false</bool></patelt>
   </pattern>
  </rejectfont>
 </selectfont>
</fontconfig>
EOF

Ajout des répertoires de polices supplémentaires

Normalement, les polices du système et les polices de l'utilisateur sont installées dans les répertoires spécifiés dans Le Protocole de Police Xft et il n'y a pas de raison de les mettre ailleurs. Cependant, une installation BLFS complète de texlive-20230313 place beaucoup de polices dans /opt/texlive/2023/texmf-dist/fonts/ dans les sous-répertoires opentype/ et truetype/. Bien que l'extraction de tous ces fichiers puisse sembler utile (cela permet de les utiliser dans des programmes non TeX), il y a plusieurs problèmes avec une telle approche :

  1. Il y a des centaines de fichiers, ce qui complexifie la sélection d'une police.

  2. Certains des fichiers font des choses bizarres, comme l'affichage de drapeaux sémaphore au lieu de lettres ASCII, ou le mappage de codes cyrilliques vers des formes de caractères appropriés à la vieille église slave au lieu des formes actuelles attendues : bien si c'est ce dont vous avez besoin, mais pénible pour une utilisation normale .

  3. De nombreuses polices ont des tailles multiples et des noms courts obscurs, qui rendent la sélection de la bonne police encore plus difficile.

  4. Quand une police est ajoutée à CTAN, elle est accompagnée par un paquet TeX à utiliser dans les anciens moteurs (xelatex n'a normalement pas besoin de cela), et ensuite la version est souvent gelée tandis que la police est maintenue séparément. Certaines de ces polices comme Polices DejaVu sont déjà probablement installées dans votre système BLFS dans une version plus récente, et si vous avez plusieurs versions d'une police on ne sait pas laquelle sera utilisée par fontconfig.

Cependant, il est parfois utile de regarder ces polices dans des applications non-TeX, seulement pour voir si vous voulez installer une version récente. Si vous avez tout installé de texlive, l'exemple suivant rendra une des polices OpenType Arkandis disponible pour d'autres applications, ainsi que les trois polices TrueType de ParaType. Modifiez ou répétez les lignes comme vous le souhaitez, pour soit rendre toutes les polices opentype/ ou truetype disponibles, ou pour sélectionner différents répertoires de polices. En tant qu'utilisateur root :

cat > /etc/fonts/conf.d/09-texlive.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <dir>/opt/texlive/2023/texmf-dist/fonts/opentype/arkandis/berenisadf</dir>
  <dir>/opt/texlive/2023/texmf-dist/fonts/truetype/paratype</dir>
</fontconfig>
EOF

SI vous faites cela, pensez à changer toutes les instances de l'année dans ce fichier quand vous mettez à jour texlive à la dernière version.

Choix de certaines polices

Il y a beaucoup de raisons pour qu'une personne veuille avoir des pages qui spécifient une police particulière et qui utilisent une police différente, ou préfèrent des polices spécifiques dans Monospace ou Sans ou Serif. Comme vous pouvez vous y attendre, il y a de nombreuses façons de faire cela.

Documentation utilisateur de Fontconfig

Fontconfig installe une documentation utilisateur contenant un exemple de « fichier de configuration utilisateur » qui, entre autres, préfère WenQuanYi ZenHei (une police Sans) si une police Serif est demandée pour le chinois (cette partie pourrait être anachronique à moins que vous ayez des polices chinoises non-libres, car dans 65-nonlatin.conf cette police est déjà parmi les polices préférées lorsque Serif est spécifiée pour le chinois) et préfère la police moderne VL Gothic si une police Sans est spécifiée dans une page japonaise (cependant quelques autres polices pourront être préférées si elles ont été installées).

Si vous avez installé la dernière version, la documentation utilisateur est disponible en HTML, PDF et texte dans /usr/share/doc/fontconfig-2.14.2/ : changez la version si vous en avez installée une autre.

Choisissez une police spécifique

Par exemple, si pour une raison ou une autre vous souhaitiez utiliser la police Nimbus Roman No9 L alors que Times New Roman est référencée (elles ont des métriques identiques, et préférable pour Times Roman, mais la police Serif de Polices Liberation sera préférable pour la police Times New Roman si elle est installée), en tant qu'utilisateur individuel vous pouvez installer la police et ensuite créer le fichier suivant :

mkdir -pv ~/.config/fontconfig/conf.d &&
cat >  ~/.config/fontconfig/conf.d/35-prefer-nimbus-for-timesnew.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- prefer Nimbus Roman No9 L for Times New Roman as well as for Times,
 without this Tinos and Liberation Serif take precedence for Times New Roman
 before fontconfig falls back to whatever matches Times -->
    <alias binding="same">
        <family>Times New Roman</family>
        <accept>
            <family>Nimbus Roman No9 L</family>
        </accept>
    </alias>
</fontconfig>
EOF

C'est quelque chose que vous feriez normalement pour les paramètres d'un utilisateur individuel, mais le dossier dans ce cas aura été préfixé '35 - ' alors qu'il peut, si vous le souhaitez, être utilisé à l'échelle du système dans /etc/fonts/conf.d/.

Choisissez les polices CJK préférées

L'exemple suivant d'une configuration locale (c'est-à-dire applicable à tous les utilisateurs de la machine) fait plusieurs choses :

  1. Si une police Serif est spécifiée, elle préférera les variantes UMing, pour que dans les langues zh-cn, zh-hk et zh-tw les choses semblent correctes (aussi pour zh-sq qui utilise en fait le même paramétrage que zh-cn) sans affecter le japonais.

  2. Il préfère le japonais Polices IPAex s'il a été installé (bien que VL Gothic aura la priorité sur Sans (japonais) s'il a été aussi installé).

  3. Comme WenQuanYi ZenHei couvre les glyphes coréens Hangul et est également préféré pour Serif dans 65-nonlatin.conf, s'il est installé, il sera utilisé par défaut pour le Serif coréen. Pour obtenir une police Serif appropriée, la police UnBatang est spécifiée ici – changez cette ligne si vous avez installé une police Serif différente dans le choix de Polices coréennes.

  4. Les polices Monospace sont forcées par rapport aux polices Sans préférées. Si le texte est en Coréen alors WenQuanYi ZenHei sera utilisée.

Dans une locale non-CJK, le résultat est que les polices appropriées seront utilisées pour toutes les variantes de chinois, japonais et coréen Hangul. Toutes les autres langues doivent déjà fonctionner si une police est présente. En tant qu'utilisateur root :

cat > /etc/fonts/local.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
    <alias>
        <family>serif</family>
        <prefer>
            <family>AR PL UMing</family>
            <family>IPAexMincho</family>
            <!-- WenQuanYi is preferred as Serif in 65-nonlatin.conf,
            override that so a real Korean font can be used for Serif -->
            <family>UnBatang</family>
        </prefer>
    </alias>
    <alias>
         <family>sans-serif</family>
         <prefer>
             <family>WenQuanYi Zen Hei</family>
             <family>VL Gothic</family>
             <family>IPAexGothic</family>
         </prefer>
    </alias>
    <alias>
         <family>monospace</family>
         <prefer>
             <family>VL Gothic</family>
             <family>IPAexGothic</family>
             <family>WenQuanYi Zen Hei</family>
         </prefer>
    </alias>
</fontconfig>
EOF

Modification des fichiers de configuration de style ancien

Certaines polices, particulièrement les polices chinoises, viennent avec des fichiers de configuration qui peuvent être installés dans /etc/fonts/conf.d. Cependant, si vous faites cela et ensuite utilisez un terminal pour lancer n'importe quelle commande qui utilise fontconfig, vous devrez voir des messages d'erreurs comme :

Fontconfig warning: "/etc/fonts/conf.d/69-odofonts.conf", line 14: Having multiple <family> in <alias> isn't supported and may not work as expected.

En pratique, ces anciennes règles ne fonctionnent pas. Pour les utilisateurs non-CJK, fontconfig fonctionnera bien sans ces règles. Leur origine remonte à l'époque où les utilisateurs de CJK avaient besoin de bitmaps fabriqués à la main pour être lisibles dans les petites tailles, et ils semblaient laids à côté des glyphes latins anti-crénelés - ils ont préféré utiliser la même police CJK pour les glyphes latins. Il y a un effet secondaire à faire cela : la police (Serif) est souvent aussi utilisée pour Sans, et dans une telle situation le texte (anglais) dans les menus de Gtk utilisera cette police - par rapport aux polices du système, en plus d'être serif, elle est à la fois pâle et plutôt petite. Cela peut rendre la lecture inconfortable.

Néanmoins, ces anciens fichiers de configuration peuvent être corrigés si vous souhaitez les utiliser. L'exemple suivant est la première partie de 64-arphic-uming.conf de UMing – il y a beaucoup plus d'éléments similaires qui ont aussi besoin d'être changés :


   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-cn</string>
           <string>zh-sg</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>

Le processus pour corriger cela est simple mais fastidieux – pour chaque élément qui produit un message d'erreur, à l'aide de votre éditeur (en tant qu'utilisateur root) éditez le fichier installé pour répéter le bloc entier autant de fois qu'il y a de variables, puis réduire chaque exemple pour n'en avoir qu'un seul. Vous pouvez travailler sur une erreur à la fois, enregistrer le fichier après chaque correction et, à partir d'un terminal séparé, exécuter une commande telle que fc-list 2>&1 | less pour voir si le correctif a fonctionné. Pour le bloc ci-dessus, la version corrigée sera :


   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-cn</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>
   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-sg</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>

Voir également

I stared into the fontconfig ...

Les entrées du blog d'Eevee sont particulièrement utiles si fontconfig ne pense pas que votre police choisie prenne en charge votre langue, et pour préférer certaines polices japonaises non-MS quand une police laide MS est déjà installée.

Fontconfig dans le wiki Arch

Arch a beaucoup d'informations sur leur wiki dans font_configuration.

Fontconfig dans le wiki Gentoo

Gentoo a quelques informations dans son wiki à Fontconfig bien que beaucoup des détails (quoi activer et Infinality) sont spécifiques à Gentoo.