1 points par GN⁺ 2023-11-10 | 1 commentaires | Partager sur WhatsApp
  • Monaspace est un nouveau système de polices conçu pour apporter une expression typographique plus riche à l’affichage du code tout en conservant une grille à chasse fixe
  • Sa fonctionnalité clé, Texture Healing, corrige les déséquilibres d’espacement entre paires de caractères adjacents à l’aide de glyphes alternatifs, afin de réduire les écarts de densité dans le texte à chasse fixe
  • Cette approche applique les contextual alternates d’OpenType aux polices de code, ce qui permet de l’utiliser dans la plupart des éditeurs sans plugin dédié, avec aussi une configuration fournie pour Visual Studio Code
  • Monaspace propose un axe de graisse de 200 à 800, un axe d’inclinaison de 0 à -11°, et un axe de largeur de 100 à 125, tout en permettant d’activer ou désactiver les ligatures de code par langue via des jeux de styles
  • GitHub Next développe cette police avec Lettermatic depuis 2022, avec l’ambition d’élargir les moyens d’expression de l’affichage du code pour les outils de développement

Un système de polices qui étend l’affichage du code à chasse fixe

  • Monaspace est une « superfamily » de polices pour le code, pensée pour faire évoluer la manière dont le code s’affiche à l’écran
  • Le code est affiché en police à chasse fixe depuis les débuts du téléscripteur, et Monaspace cherche à conserver cette grille tout en y injectant davantage de sens
  • Les éditeurs existants transmettent souvent des informations qui vont au-delà de la coloration syntaxique, via des éléments d’interface comme le survol, le soulignement ou des ornements graphiques
  • Monaspace fournit, au niveau de la police elle-même, une palette plus expressive que le code et les outils de développement peuvent exploiter

Les suggestions de Copilot et la typographie

  • Les suggestions de code comme celles de Copilot peuvent disposer, avec Monaspace, d’une voix typographique distincte
  • Le ghost text peut rendre plus difficile l’analyse et l’évaluation du code proposé
  • Si l’expression de la police elle-même indique quelles parties relèvent d’un code suggéré, il devient plus facile d’identifier ces fragments plus tard

Les limites des polices à chasse fixe visées par Texture Healing

  • Les polices à chasse fixe placent tous les caractères dans des boîtes de même largeur, ce qui crée une densité de texte irrégulière
  • Les caractères étroits comme l et i ont besoin d’empattements exagérés pour remplir leur boîte, et malgré cela, trop d’espace vide subsiste encore
  • Les caractères larges comme m et w sont compressés dans leur boîte, ce qui déforme leur forme, affine leurs traits et limite aussi l’espace intérieur
  • Ces contraintes constituent un problème structurel des polices à chasse fixe qui remonte à l’époque des téléscripteurs des années 1960

Fonctionnement de Texture Healing

  • Texture Healing repère les paires de caractères adjacents où l’un manque d’espace et l’autre en a en trop, puis remplace leurs glyphes
  • Les caractères étroits sont remplacés par des glyphes alternatifs qui cèdent une partie de leur espace à leur voisin, tandis que les caractères larges sont remplacés par des glyphes alternatifs qui s’étendent jusqu’au bord de leur boîte
  • Cette fonctionnalité est implémentée via les contextual alternates d’OpenType
    • Les contextual alternates sont généralement utilisés dans les écritures arabes ou les polices cursives, où la forme d’un glyphe varie selon les caractères environnants
    • Monaspace applique cette technique aux polices de code à chasse fixe
  • Le texte obtenu respecte toujours une grille à chasse fixe
  • La manière d’activer Texture Healing dans Visual Studio Code est détaillée dans la documentation Monaspace

Axes de la police et styles

  • L’axe de graisse de Monaspace va de 200 à 800
    • 200 : Extra Light
    • 300 : Light
    • 400 : Regular
    • 500 : Medium
    • 600 : Semibold
    • 700 : Bold
    • 800 : ExtraBold
  • L’axe d’inclinaison va de 0 à -11°
    • 0 : Normal
    • -5.5° : point intermédiaire où certains caractères passent d’une forme oblique à une forme italique
    • -11° : Italic
  • L’axe de largeur va de 100 à 125
    • 100 : Normal
    • 112.5 : Semiwide
    • 125 : Wide
  • Monaspace comprend des familles comme Neon, Argon, Xenon, Radon et Krypton

Ligatures de code et réglages OpenType

  • Monaspace inclut des ligatures de code pour divers langages de programmation
  • Les ligatures sont organisées en jeux de styles, ce qui permet à l’utilisateur d’activer ou désactiver uniquement ceux qu’il souhaite
  • Chaque jeu de styles est conçu de manière approximative selon les besoins d’un langage donné
    • ss01 : inclut des ligatures pour des séquences de caractères courantes en JavaScript
    • ss05 : fournit des ligatures pour les opérateurs F#
  • Des fonctionnalités OpenType supplémentaires sont également proposées
    • calt : active Texture Healing
    • liga : ajuste l’espacement de caractères répétés comme /// ou ||, et est conçu pour ne pas s’activer à l’intérieur de séquences plus longues comme ////
  • Dans Visual Studio Code, on active les fonctionnalités et jeux de styles souhaités via editor.fontLigatures dans settings.json

Conception et distribution

  • Monaspace a été créé avec l’objectif d’améliorer l’affichage du code pour tous les développeurs
  • GitHub Next a lancé ce travail en 2022 et a conçu la police avec Lettermatic
  • La liste des contributeurs, la documentation et les fichiers de police sont disponibles dans le repo Monaspace
  • Le téléchargement est proposé dans le dépôt GitHub

1 commentaires

 
GN⁺ 2023-11-10
Avis sur Hacker News
  • La fonction Texture Healing utilise très intelligemment les fonctionnalités OpenType pour rendre les combinaisons problématiques de polices à chasse fixe bien plus agréables à lire, sans casser du tout la grille
    Une approche simple consisterait à créer des ligatures pour des paires de lettres délicates comme mi ou lm, mais ici, on dirait qu’elle choisit des glyphes de substitution qui remplissent différemment l’espace à largeur fixe selon les lettres voisines

    • Commit Mono fait quelque chose de similaire et appelle cela le Smart kerning. Pour plus de détails, voir l’onglet « 04 Intelligent » sur https://commitmono.com/
      En pratique, c’est difficile à utiliser. La largeur des lettres varie selon la lettre qui suit, ce qui fait sauter le texte pendant la saisie. C’est superbe à la lecture, mais horrible à l’écriture
    • C’est une technique vraiment ingénieuse. Le plus surprenant, c’est qu’elle était possible depuis très longtemps et que personne n’y avait pensé
      Bravo à Riley Cran, qui a conçu cette technique dans le cadre de ce projet, ainsi qu’à toute l’équipe de https://lettermatic.com
    • Je ne suis pas vraiment convaincu. Après avoir activé et désactivé quelques cases à cocher, on commence à voir les incohérences
      Par exemple, dans time_limit, dans l’exemple par défaut, le second m a un i de chaque côté et donc plus d’espace pour « grandir » ; il paraît clairement plus large que le premier m. Je ne sais pas trop si c’est une bonne chose
    • Beaucoup de gens ici font l’éloge du texture healing, mais pour moi cela ressemble à une demi-mesure. Pourquoi sommes-nous, en tant que communauté, si réticents à adopter des polices à chasse variable ?
      Ce texture healing casse déjà la grille parfaite des cellules de caractères ; d’une certaine manière, on a l’impression qu’il cumule les inconvénients des deux approches
      Je vois les ligatures sophistiquées un peu de la même façon. On peut utiliser les vrais caractères dans le code source, et Unicode est largement pris en charge. Raku fait cela, mais pour que ça brille vraiment, il faut une meilleure composition typographique, y compris des polices à chasse variable
  • Au début, je me suis dit « encore une autre famille de polices à chasse fixe, sympa », mais après avoir vu le texture healing, j’ai vraiment envie de l’essayer
    J’aime beaucoup l’idée d’utiliser différents styles de police selon les usages. Cela dit, comme j’utilise surtout le terminal, je ne sais pas quels terminaux prennent ça en charge, et les éditeurs de texte en ligne de commande devront probablement le faire aussi. Cela reste une excellente idée à mes yeux

    • En théorie, ce devrait être possible avec les terminaux basés sur xterm. ESC[<10-19>m est la séquence d’échappement qui choisit les polices 0 à 9
      Que cela fonctionne réellement est une autre question. J’utilise Alacritty et je n’ai pas trouvé s’il le prend en charge ; en essayant moi-même, je n’ai rien obtenu
  • Je me demande quoi penser des exemples Mix & Match
    Radon, le style manuscrit, ressemble pratiquement à de l’italique et s’accorde bien avec les autres polices. Mais les autres ont des métriques, etc. trop similaires, si bien que les exemples de « chaînes de documentation faisant autorité » ou de « voix de Copilot » sont assez difficiles à distinguer

    • C’est à cause de Mix & Match que j’ai décidé d’essayer cette police. J’utilise Operator Mono depuis des années pour ses vraies italiques
      Je cherchais depuis longtemps une alternative ouverte à Operator Mono, et grâce à Mix & Match, je me dis enfin que celle-ci pourrait être cette alternative
    • C’est exactement ce qui m’est venu à l’esprit avant même de faire défiler la page. Les commentaires manuscrits sont superbes et ajoutent un autre élément de distinction qui réduit la charge quand on parcourt du code
      Certaines personnes détesteront sans doute, mais personnellement j’ai envie d’essayer
    • En parcourant les échantillons, je n’ai pas remarqué ce qui changeait dans les blocs d’exemples de code avant d’arriver à la variante Radon
      Les autres variantes ne sont pas assez différentes pour transmettre de l’information
    • Je ne sais pas comment configurer les différentes polices. C’est la première chose que je voulais essayer, mais je n’ai pas trouvé comment faire. Est-ce que je passe à côté de quelque chose d’évident ?
    • J’aime vraiment cette idée. Est-elle déjà prise en charge quelque part, ou est-ce prévu pour l’avenir ?
  • Il y a pas mal de ligatures, mais pour moi ce n’est toujours pas suffisant. Aujourd’hui, != et <= sont des basiques, et je remarque sans cesse à quel point il est agréable que Fira Code aligne la hauteur de * dans *ptr, centre : dans X:Y, ou remonte le x dans 0xFF
    J’aurais presque aimé l’aspect de la variante Krypton, mais la barre horizontale du t minuscule est trop basse par rapport à la hauteur de lettres comme le c minuscule. Je pense donc continuer à utiliser Fira Code pour l’instant, et je reviendrai voir dans environ un an ce qui aura changé après les retours utilisateurs

    • Pour une page de démonstration, c’est gênant que, dans les exemples du site lié, les deux * de /** ne soient pas alignés
      Cela se voit particulièrement dans des exemples comme // What if tentative ideas looked handwritten? et /** * What if docstrings looked authoritative? */
  • L’idée est bonne, mais je me demande pourquoi on ne voit pas davantage de polices étroites comme PragmataPro
    Je l’utilise depuis presque dix ans, et j’aimerais avoir plus de choix dans ce domaine, mais personne ne semble vouloir aller aussi loin dans l’étroitesse. Berkeley Graphics annonce depuis presque un an une version étroite de Berkeley Mono, mais il ne s’est toujours rien passé
    Ici, Monaspace a aussi un curseur de largeur, mais j’ai l’impression que le point de départ est « plus large que PragmataPro » et que l’arrivée va vers « absurdement large ». Je me demande pourquoi ils ne l’ont pas aussi fait descendre vers des versions plus étroites

    • Tout à fait d’accord. J’utilise PragmataPro tous les jours, et tout le reste me paraît trop large
      Iosevka par défaut s’en rapproche, mais l’interligne est beaucoup plus grand. Heureusement, on peut la personnaliser pour obtenir quelque chose de presque identique en réglant leading = 1110 dans la configuration. J’ai trouvé cette valeur par tâtonnements
    • Tu as essayé Quinze ? https://www.programmingfonts.org/#quinze
      En cherchant la police la plus étroite, j’ai découvert que Quinze était la réponse. Elle est environ 20 % plus étroite qu’Iosevka ou M+. Je n’ai pas trouvé de comparaison facile avec PragmataPro, mais si Iosevka est une interprétation gratuite de PragmataPro, alors Quinze devrait être encore plus étroite
      En pratique, Quinze est tellement étroite que, quand je l’ai forcée pour tout le texte à chasse fixe du navigateur, la lisibilité s’est dégradée au lieu de s’améliorer. À hauteur égale, elle paraît beaucoup plus petite qu’une police « normale ». Dans un environnement de code, je l’utilise avec une taille de police plus grande, ce qui va bien avec sa faible largeur
      L’inconvénient est que Quinze est très minimaliste. Il n’y a presque que l’ASCII, pas de ligatures ni de personnalisation. Personnellement, ça ne me gêne pas
    • Iosevka est aussi assez étroite et populaire. Je ne sais pas si elle correspondra à tes critères, mais elle mérite d’être regardée
    • Je viens de découvrir M+, et la variante « 60 » me plaît bien. La largeur par défaut, 50, est trop étroite pour moi, et j’ai l’impression que la lisibilité baisse dans la variante 50 à mon goût
      Cela dit, elle peut être aussi étroite que souhaité
      https://mplusfonts.github.io/
    • Puisqu’on parle de polices étroites, quelqu’un aurait-il de bonnes recommandations de polices serif étroites ? Payantes ou gratuites, peu importe
      Dans le navigateur, j’utilise « Bell MT » à la place de Times, et je l’utilise aussi comme police à largeur variable dans le mode Org d’emacs. Elle est bien, mais j’aimerais qu’il existe une version plus grande et plus étroite
      Une autre bonne police étroite à chasse fixe est « The Sans Mono Condensed », devenue célèbre grâce aux premiers livres d’O’Reilly. O’Reilly est ensuite passé à une autre police à chasse fixe. Son défaut est de ne couvrir que le jeu de caractères occidental, mais je l’aimais beaucoup
  • Ça me dérange que le symbole du radon sur la page soit Rd. Pour le radon, ce devrait être Rn
    Le radium est Ra, le radon est Rn, et ça m’a même fait revérifier s’il existait un autre élément commençant par R et contenant un d dans son nom

    • Je l’ai vu aussi, et ça a été corrigé depuis
    • Il y a bien le rhodium, mais son symbole est Rh
  • Comme le mono flag n’est pas défini, j’ai dû essayer avec GTK2 gvim pour charger la police
    Le résultat de % ttfmono MonaspaceArgon-Regular.otf donne monospaced flag = 0, avec 0 = variable-width, otherwise = monospaced
    Malheureusement, il semble que ce flag empêche l’activation des ligatures
    Cela dit, dans vim lancé avec st patché, j’ai pu voir les ligatures et le texture healing, et j’aime vraiment beaucoup. Les lignes ne bougent que de façon très subtile pendant la saisie, et quand le curseur passe dessus, il ne laisse pas de rémanence due, par exemple, à un m élargi. C’est bien conçu pour le code
    Si je pouvais demander une fonctionnalité, ce serait de pouvoir choisir certaines variantes, comme un 0 anguleux avec une barre oblique inverse, ou garder le ! dans la ligature !=. On voit ce que je veux dire ici : https://github.com/be5invis/Iosevka/blob/main/doc/stylistic-...
    https://st.suckless.org/patches/ligatures/

    • Tu es sûr ? Sur macOS, elle apparaît sous les polices « Fixed Width » dans Font Book
      J’utilise la version publiée aujourd’hui, donc ça a peut-être été corrigé récemment
    • Même problème dans KDE Konsole : https://imgur.com/a/Dj1HZiu
      Il faut activer explicitement la case « Show all fonts » pour voir aussi les polices « non monospace »
  • Sur les systèmes modernes, les polices pour le code pourraient désormais aller au-delà des polices à chasse fixe
    Je l’ai déjà recommandé plusieurs fois ici, mais j’utilise Input Sans, une police de codage proportionnelle
    https://input.djr.com

    • Je serais curieux de savoir pourquoi tu la recommandes
      Avec cette police, il semble qu’il pourrait être plus difficile de repérer les fautes de frappe
    • J’aimerais utiliser une police proportionnelle pour coder, mais je ne connais pas vraiment de frontend Vim qui le prenne proprement en charge
      Quand j’utilise Vim en SSH, ça ne me dérange pas de continuer avec une chasse fixe, mais même si Neovim a fait apparaître beaucoup de frontends, il semble que très peu prennent en charge les polices proportionnelles. Et ceux qui le font sont souvent péniblement lents à utiliser
    • Est-ce qu’elle prend en charge les ligatures qui remplacent >= par ? J’ai essayé l’aperçu web sur téléphone, mais c’est peut-être une limitation de Firefox sur Android
      Pour référence, les ligatures, c’est ça : https://fonts.google.com/knowledge/glossary/ligature
  • Je ne comprends toujours pas comment, dans ce genre de polices, le 0 pointé est devenu une sorte de standard. Personnellement, je le confonds toujours avec le 8, et je préfère de loin le 0 barré
    S’il existe une variante comme ça, j’aimerais vraiment essayer cette police

    • Comme certaines langues ont une lettre qui est un cercle barré, le 0 barré peut créer de la confusion. Le 0 pointé présente beaucoup moins de risque de confusion de ce type
      Le concepteur de la police pourrait aussi accentuer les côtés convexes du 0 pointé et les côtés concaves du 8 pour les distinguer visuellement, mais je ne sais pas si cette police le fait
    • J’ai proposé un 0 barré dans une issue, et quelqu’un m’a répondu que le 0 pointé remplissait le même rôle. Vraiment agaçant
  • Le texture healing est une idée vraiment astucieuse et élégante
    J’aimerais l’essayer aussi pour l’écriture manuscrite chinoise, qui est souvent utilisée en chasse fixe. Des caractères courants mais très denses, en particulier des caractères traditionnels comme 邊鐵餐廳臺藥機麵顧露樓幫讓, gagneraient beaucoup à recevoir de l’espace supplémentaire pour pouvoir s’étaler