Comment configurer de manière robuste le repli des polices?

16

TL; DR: Comment dire de manière fiable: utiliser Consolas comme police par défaut, FreeMono pour les caractères non pris en charge par Consolas et Symbola pour les caractères non pris en charge par les deux?

Étant donné que ma police de programmation principale ne couvre pas tous les symboles mathématiques dont j'ai besoin, j'ai d'abord configuré le remplacement de police comme indiqué ci-dessous:

(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

Malheureusement, cela a également changé la police de certains caractères pris en charge par ma police principale, donc je l'ai changé en

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

Si ma compréhension est correcte, cela devrait garantir que les caractères que Consolas ne peut pas gérer sont gérés par FreeMono, à moins que FreeMono ne les ait pas, auquel cas ils doivent être affichés à l'aide de Symbola. C'est aussi ma compréhension qui tfait la même chose que "fontset-default"ci-dessus.

Malheureusement, il y avait encore des cas où la bonne police n'était pas sélectionnée; J'ai trouvé que changer pour

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Symbola") nil 'append)

fonctionnait mieux, mais pas toujours: changer la taille de la police à l'aide

(set-face-attribute 'default nil :height some-size)

a entraîné l'ignorance des solutions de repli, en raison de la création de nouveaux jeux de polices.

Ma solution actuelle est de faire

(set-fontset-font fontset 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font fontset 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font fontset 'unicode (font-spec :name "Symbola") nil 'append)

sur chaque jeu de polices ( fontset-list), après chaque changement de taille de police.

Quelle est la bonne façon de définir le remplacement des polices?

Remarque : à des fins de test, voici quelques caractères mathématiques: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Références : Manuel Emacs sur les jeux de polices et sur la modification des jeux de polices

Clément
la source
2
J'ai une pensée qui ne résout pas vraiment votre problème, mais –– si vous avez besoin des symboles mathématiques etc. pour les théorèmes et les documents scientifiques, pourquoi n'utilisez-vous pas TeX et AucTeX pour cela? Cela rendrait inutile le remplacement de polices X (ou Mac ou Windows, selon ce que vous exécutez) et vous fournirait des documents et des extraits de haute qualité (par exemple, pour le mode org).
après coup: une police UTF-8 avec un jeu de caractères complet devrait supprimer complètement votre problème (par exemple GNU Unifont), et quand il y a le choix entre la police de fantaisie et les glyphes requis, je choisirais ce dernier.
2
@kuli Vous êtes trop pessimiste. Voir github.com/cpitclaudel/monospacifier
Ista
Je ne me souviens pas où je l'ai lu, mais je pense qu'Eli Zaretskii a répondu quelque part à une question similaire. Vous pensez de fontsetla mauvaise façon. Emacs ne vérifie pas réellement pour chaque caractère affiché si une police sait comment l'afficher ou non. Ce serait trop de calculs. Il n'y a donc pas de mécanisme de «repli» en soi. Vous devez définir votre police par défaut, puis modifier manuellement le jeu de polices par défaut dans certaines plages pour l'afficher à l'aide de polices différentes. Cette procédure est manuelle ou peut-être que le package unicodepeut vous aider.
GenaU
@GenaU Je peux me méprendre, mais Emacs vérifie; juste pas toutes les polices, seulement celles qui apparaissent dans un jeu de polices.
Clément

Réponses:

0

Pour ceux qui ne peuvent pas lire la documentation d'Emacs.

Sélection de police

Avant qu'Emacs puisse dessiner un caractère sur un affichage graphique, il doit sélectionner une «police» pour ce caractère. Normalement, Emacs choisit automatiquement une police en fonction des faces affectées à ce caractère - en particulier, les attributs de face ': famille', ': poids', ': oblique' et ': largeur'. Le choix de la police dépend également du caractère à afficher; certaines polices ne peuvent afficher qu'un ensemble limité de caractères. Si aucune police disponible ne correspond exactement aux exigences, Emacs recherche la «police correspondante la plus proche». Les variables de cette section contrôlent comment Emacs effectue cette sélection.

face-font-family-alternatives

Testé spécifiquement à l'aide des caractères de la question, en vérifiant les caractères avec
describe-character. Chaque personnage utilise l'une des polices gratuites: Consolas, FreeMono, Symbola. Définition de la police du cadre sur Consola par set-frame-font.

Jusqu'à présent, 14 votes positifs, réponse négative, et la science de l'UE ne peut toujours pas résoudre ce mystère.

Alexandr Karbivnichiy
la source
Merci! Avez-vous envisagé de publier ceci en réponse à mon commentaire ci-dessus, plutôt qu'en tant que réponse distincte?
Clément
1
(Je dois préciser que j'ai également testé, sur Emacs 26, et votre réponse ne semble pas fonctionner: j'ai utilisé (setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola"))), alors M-x set-frame-font RET Consolas RET; les personnages utilisent un mélange de Consolas et de Segoe UI Symbol)
Clément
J'ai testé sur Manjaro Arch Linux cette séquence: ℕ𝓟⧺ × ≠ ≥≤ ± ¬∨∧∃∀λ⟿⟹⊥⊤⊢; Je n'ai pas testé ce qui se passe si une police n'est pas installée. Cela peut être possible. Parce que les noms de police sont saisis manuellement, pas à partir d'une liste de noms existants.
Alexandr Karbivnichiy
J'ai testé avec toutes les polices de la liste installées, dans emacs -Q.
Clément
@ Clément emacs -Q option empile beaucoup: --no-x-resources. Peut-être que le problème réside en elle. Pour moi, Consolas ne part que de ce caractère: "×". Et les deux premiers FreeMono "ℕ𝓟" et Symbola.
Alexandr Karbivnichiy
-1

M-x customize-variable face-font-family-alternatives

Il y a une liste qui ressemble à ceci:

(("Monospace" "courier" "fixed")
 ("Monospace Serif" "Courier 10 Pitch" "Consolas" "Courier Std" "FreeMono" "courier" "fixed")
 ("courier" "CMU Typewriter Text" "fixed")
 ("Sans Serif" "helv" "helvetica" "arial" "fixed")
 ("helv" "helvetica" "arial" "fixed"))

Ajoutez votre séquence dans l' customizeinterface tampon:

("Consolas" "FreeMono" "Symbola")

Si une famille donnée est spécifiée mais n'existe pas, cette variable spécifie d'autres familles de polices à essayer. Chaque élément doit avoir cette forme:

 (FAMILY ALTERNATE-FAMILIES...)

Si FAMILY est spécifié mais n'est pas disponible, Emacs essaiera les autres familles données dans ALTERNATE-FAMILIES, une par une, jusqu'à ce qu'il trouve une famille qui existe.

Comment utiliser face-font-family-alternatives:

Dans votre tampon: M-x set-frame-font

Choisissez une police dans la liste. La police choisie définira la séquence de recherche de police face-font-family-alternativesà utiliser. Dans cet exemple, Consolas .

Pour vérifier quelle famille de polices a été utilisée pour afficher un caractère: M-x describe-char

Alexandr Karbivnichiy
la source
Merci! Mais je ne pense pas que cela réponde à la question. AFAICT, la configuration que vous avez suggérée utilisera FreeMono si la police Consolas n'est pas disponible, mais elle ne reviendra pas à FreeMono pour les caractères non pris en charge par Consolas.
Clément