如何向 Windows 控制台添加其他字体?

soa*_*gem 7 windows windows-registry fonts command-line

我在网上找到了一个指南,说明您需要编辑注册表才能将新字体添加到命令提示符中的可用字体列表中:具体来说,您必须编辑密钥:

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
Run Code Online (Sandbox Code Playgroud)

通过使用键00000、 等添加字符串值0000,它们的值是字体的名称。我已经这样做了。我将字体名称添加到注册表中,如下面的屏幕截图所示,然后重新启动计算机:

注册表编辑器

但是,我添加的字体没有显示在列表中。更具体地说,我添加了 Inconsolata 和 Source Code Pro。但我在可用字体列表中没有看到它们:

控制台字体

我错过了什么?我使用的是 Windows 10 版本 1803,内部版本 17134.165。

not*_*bit 14

如何将新字体添加到Powershell(或CMD)控制台设置中?

首先要知道的是,不幸的是(!):

只有满足特定条件的字体才能安装到控制台中!

(见:这里这里这里。)


字体标准 + 说明
(当前状态未知。)

要在控制台中支持字体,他们必须:

  1. 字体必须是固定间距字体。
  2. 字体不能是斜体。
  3. 如果是 TrueType 字体,则必须是FF_MODERN.
  4. 如果它不是 TrueType 字体,则它必须包含OEM_CHARSET.
  5. 字体不能有负号 AC空格

这一切意味着什么? 这些指标中的大部分都在此处定义,它概述了以下描述 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;
Run Code Online (Sandbox Code Playgroud)
  1. 字体必须是固定间距。字体的间距和系列由字段描述lfPitchAndFamily。两个低位指定字体的间距,可以是以下值之一:

    • DEFAULT_PITCH
    • FIXED_PITCH
    • VARIABLE_PITCH
  2. 字体不能为斜体。换句话说,该lfItalic字段必须设置为 false。

  3. 如果它是一个TrueType字体,该 lfPitchAndFamily 字段必须包含的代码FF_MODERN系列,在比特4至7FF_MODERN描述的字体具有恒定笔划宽度(即宽字体),具有或不具有衬线。等宽字体通常是现代的。Pica、EliteCourierNew就是例子。

  4. 如果不是TrueType字体,它的字符集必须包括OEM_CHARSET由定义lfCharSet在该领域tagLOGFONTA的结构。也就是说,字体需要不仅仅是等宽。它还需要支持OEM代码页中的所有字符的的437“OEM”字符的IBM437 (OEM United States)字符集的描述在这里

  5. 字体不能有负数AC空格。字符的宽度由ABC 结构描述。的B间距是字符的宽度。该A间距是多少空间,对离开左边的字符,而C间距是多少保证金在离开正确的

    任何在左侧或右侧具有负边距的字符都会超出指定的网格/栅格。例如,重载的字体W需要比指定的 X 像素字符宽度更多的空间才能正确绘制字符。显然,超大字符的字体不是固定宽度的。


然而,一种已知的可用字体是DejaVu,因为它支持许多有用的字形和数学,因此被建议使用。不幸的是,它不是 Windows标准字体选择的一部分 ,需要手动安装。

如果您需要的字体还没有TrueType字体文件 ( *.ttf) 或 OpenType ( *.otf),您需要将 SFD 文件转换为 TTF(或 OTF)。为此,您可以使用FontForge导入 SFD,然后生成 TTF。


使用FontForge安装 TTF 文件的步骤

  1. 安装FontForge(以下简称“FF”)
  2. 以管理员身份运行 FF
  3. 下载 SFD 字体文件(例如: DejaVuSansMono.sfd。)
  4. 打开文件:File > Open并点击确定。
  5. 生成一个TTF:File > Generate Fonts...,然后
  6. True Type在下拉菜单中选择,然后
  7. 取消选择该Validate Before Saving选项并点击Generate
  8. 将生成的*.ttf文件拖到 Windows控制面板中找到的字体:
    ( Control Panel\Appearance and Personalisation\Fonts) 或通过: WIN+R并键入:%windir%\fonts

完毕。新字体现在可以立即在您的注册表中使用。


将新字体加载到控制台注册表中

Administrator为此,请打开 Powershell 控制台。

# 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'
Run Code Online (Sandbox Code Playgroud)

但是,您将不会看到新的字体项目,直到

  1. 注册表已重新加载到内存中,因此唯一的方法是:
    • 重新启动计算机或
    • 重新启动Windows Explorer
  2. 重启你的 Powershell 控制台
  3. 向 Windows Powershell 存储库 控制台存储库提交错误报告,并要求他们:
    支持具有正确 unicode 字形的正确字体。

享受许多新的和正确的字形!

例如,尝试5/8th box
[char]0x2585 # (U+2585)


附录:

笔画宽度

“展开笔触”对话框可让您控制展开过程的各个方面。首先,您可以指定三种类型的笔尖:

  • 圆笔,默认情况下是圆形的,但可以转换为椭圆
  • 矩形笔,默认情况下为方形,但可以转换为更传统的书法笔尖形状
  • 多边形笔 – 您几乎可以绘制任何凸多边形。

对于圆形和书法笔,您可以选择笔画宽度、如何绘制开放路径的末端,以及当两条不具有相同斜率的样条(或线)连接时路径的外观(即在拐角处)观点)。