Comment puis-je ajouter des polices supplémentaires à la console Windows ?

J’ai trouvé un guide en ligne indiquant que vous devez modifier le registre pour ajouter de nouvelles polices à la liste des polices disponibles dans l’invite de commandes : plus précisément, vous devez modifier la clé :

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont

en ajoutant des valeurs de chaîne avec les clés 00, 000, 0000, et ainsi de suite, avec leurs valeurs étant les noms des polices. J’ai déjà fait cela. J’ai ajouté les noms de polices au registre, comme vous pouvez le voir dans la capture d’écran ci-dessous, et j’ai redémarré l’ordinateur :

Cependant, les polices que j’ai ajoutées n’apparaissent pas dans la liste. Plus précisément, j’ai ajouté Inconsolata et Source Code Pro. Mais je ne les vois pas dans la liste des polices disponibles :

Que me manque-t-il ? J’utilise Windows 10 version 1803, build 17134.165.

Comment ajouter de nouvelles polices aux paramètres de votre console Powershell (ou CMD) ?

La première chose à savoir est que, malheureusement (!) :

Seules les polices remplissant certains critères peuvent être installées dans la console !

(Voir : ici, ici et ici.)

Les critères de police + explication

(Le statut actuel de ceci est inconnu.)

Pour qu’une police soit supportée dans la console, elle doit :

  • La police doit être une police à pas fixe.

  • La police ne peut pas être en italique.

  • Si c’est une police TrueType, elle doit être FF_MODERN.

  • Si ce n’est pas une police TrueType, elle doit contenir le OEM_CHARSET.

  • La police ne peut pas avoir un espace A ou C négatif.

Que signifie tout cela ?
La plupart de ces métriques sont définies ici, qui décrit la structure suivante décrivant une police en C++ :

typedef struct tagLOGFONTA {
  LONG lfHeight;
  LONG lfWidth;
  LONG lfEscapement;
  LONG lfOrientation;
  LONG lfWeight;
  BYTE lfItalic;
  BYTE lfUnderline;
  BYTE lfStrikeOut;
  BYTE lfCharSet;
  BYTE lfOutPrecision;
  BYTE lfClipPrecision;
  BYTE lfQuality;
  BYTE lfPitchAndFamily;
  CHAR lfFaceName[LF_FACESIZE];
} LOGFONTA, *PLOGFONTA, *NPLOGFONTA, *LPLOGFONTA;

La police doit être à pas fixe. Le pas et la famille de la police sont décrits par le champ lfPitchAndFamily. Les deux bits de poids faible spécifient le pas de la police et peuvent être l’une des valeurs suivantes :

  • DEFAULT_PITCH

  • FIXED_PITCH

  • VARIABLE_PITCH

La police ne peut pas être en italique. En d’autres termes, le champ lfItalic doit être défini à false.

Si c’est une police TrueType, le champ lfPitchAndFamily doit contenir le code pour la famille FF_MODERN, dans les bits 4 à 7. FF_MODERN décrit les polices avec une largeur de trait constante (c’est-à-dire les polices à chasse fixe), avec ou sans empattements. Les polices à chasse fixe sont généralement modernes. Pica, Elite et CourierNew en sont des exemples.

Si ce n’est pas une police TrueType, son jeu de caractères doit inclure OEM_CHARSET, tel que défini par le champ lfCharSet dans la structure tagLOGFONTA. C’est-à-dire que la police doit être plus que simplement à chasse fixe. Elle doit également supporter tous les caractères de la page de codes OEM, les 437 caractères “OEM” du jeu de caractères IBM437 (OEM United States) tel que décrit ici.

La police ne peut pas avoir un espace A ou C négatif. La largeur d’un caractère est décrite par une structure ABC. L’espacement B est la largeur du caractère. L’espacement A est l’espace à laisser à gauche du caractère, et l’espacement C est la marge à laisser à droite.

Tout caractère avec une marge négative à gauche ou à droite est surdimensionné par rapport à la grille/trame désignée. Par exemple, une police avec un W surdimensionné a besoin de plus d’espace que la largeur de caractère de X pixels désignée pour dessiner correctement le caractère. Évidemment, les polices avec des caractères surdimensionnés ne sont pas à largeur fixe.

Cependant, une police connue pour fonctionner et qui a été suggérée car elle supporte beaucoup de glyphes utiles et de caractères mathématiques, est DejaVu. Malheureusement, elle ne fait pas partie de la sélection de polices standard de Windows et doit être installée manuellement.

Si la police dont vous avez besoin n’a pas déjà un fichier de police TrueType (*.ttf) ou OpenType (*.otf), vous devrez convertir les fichiers SFD en TTF (ou OTF). Pour ce faire, vous pouvez utiliser FontForge pour importer le SFD puis générer le TTF.

Étapes pour installer un fichier TTF avec FontForge

  • Installer FontForge (ci-après “FF”)

  • Exécuter FF en tant qu’administrateur

  • Télécharger le(s) fichier(s) de police SFD (par exemple : DejaVuSansMono.sfd.)

  • Ouvrir le fichier avec : File > Open et cliquer sur OK.

  • Générer un TTF avec : File > Generate Fonts..., puis

  • Sélectionner True Type dans le menu déroulant, puis

  • Décocher l’option Validate Before Saving et cliquer sur Generate.

  • Glisser le fichier *.ttf résultant dans le Panneau de configuration des Polices situé à :

(Panneau de configuration\Apparence et personnalisation\Polices) ou via :
WIN+R et tapez : %windir%\fonts.

Terminé. La nouvelle police est maintenant immédiatement disponible dans votre registre.

Charger la/les nouvelle(s) police(s) dans le registre de la Console

Ouvrez une console Powershell en tant qu’Administrateur pour cela.

# All your available fonts are located here:
$T1key = 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts'

# But your Console fonts are located here:
$T2key = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont'

# Check the correct name:
Get-ItemProperty -Path $T1key | grep "DejaVu"
DejaVu Sans Mono (TrueType)     : DejaVuSansMono.ttf
# Note the correct spacing of the name and ignore the "(TrueType)" part

# Check what's already there:
Get-ItemProperty -Path $T2key

# To add more fonts, just add the new name like this:
# - Add another 0 (zero) to the -Name parameter, for each new font
# So since there is already an item with two zeros, so we need 3 and 4 zeros...
#Set-ItemProperty -Path $key -Name '000' -Value 'Arial'     # Doesn't work!
#Set-ItemProperty -Path $key -Name '0000' -Value 'Calibri'  # Doesn't work!
Set-ItemProperty -Path $key -Name '00000' -Value 'DejaVu Sans Mono'

Cependant, vous ne verrez pas les nouveaux éléments de police tant que :

  • le registre n’a pas été rechargé en mémoire, donc la seule façon est soit de :

  • redémarrer l’ordinateur, ou

  • redémarrer l'Explorateur Windows.

  • Redémarrer votre console Powershell

  • Déposer un rapport de bug au dépôt Windows Powershell / dépôt Console et leur demander de :

supporter des polices appropriées avec des glyphes Unicode corrects.

Profitez des nombreux nouveaux glyphes corrects !

Par exemple, essayez le PH39 :

[char]0x2585 # (U+2585)

Addendum :

WindowsConsoleFonts - Un module PS pour travailler avec les polices de console dans Windows qui vous permet d’installer facilement toute (?) police.

Voir également comment fusionner deux polices.

Un article informatif de Microsoft sur leur technologie de polices et comment le Font Linking fonctionne.

Le Google Noto Project (Police) Noto Tools pour le script Python merge_fonts.py.

L’un des critères mentionne avoir une largeur de trait constante, cela signifie que la largeur du stylo (pseudo-horizontal) est constante comme montré ici :

La boîte de dialogue Expand Stroke vous donne le contrôle sur divers aspects du
processus d’expansion. Premièrement, vous pouvez spécifier trois types de plumes :

  • Une plume ronde, qui est circulaire par défaut mais peut être transformée en ellipse

  • Une plume rectangulaire, qui est carrée par défaut mais peut être transformée en formes de plume calligraphique plus traditionnelles

  • Une plume polygonale — vous pouvez dessiner presque n’importe quel polygone convexe.

Pour les plumes circulaires et calligraphiques, vous pouvez choisir une largeur de trait, comment
les extrémités d’un chemin ouvert doivent être dessinées, et comment le chemin devrait apparaître
quand deux splines (ou lignes) se rejoignent sans avoir la même pente (c.-à-d.
à un point d’angle).