改造 Microsoft YaHei Mono
上一篇文提到了可以用 Microsoft YaHei Mono 做等宽字体,装上乍一看效果很不错,cjk 字符以外用的是 consolas,也和我个人习惯一致。但仔细看有问题,主要有俩:
- 相同字号下,字符比 consalas 字体要小,比如 consolas 用 16 号字,这个等宽雅黑要用 18 号字才能差不多大;
- 中英文混排时,字符对不齐。
这第二点很要命,本来用等宽字体就为了码代码能字符对齐。用 FontCreator 打开看,发现 consolas 部分的字体被缩小了,但依然在宽度上不是雅黑 cjk 字符的 1/2,不知道做这个等宽雅黑字体的人是如何考虑的。
那就自己改吧。
首先拿下载的这个等宽雅黑来改,把英文部分改成 cjk 字符的一半。虽然这个等宽字体减小了 consolas 字符大小,但依然需要再压瘦一点才能达到雅黑 cjk 字符的一半。但是很奇怪的失败了,生成的字体安装后居然在控制台的字体选择里看不到,咦?
在没有搞明白失败原因的情况下,又开始了新的尝试,自己组装一个等宽雅黑。之前把下载的等宽雅黑 consolas 字体压瘦显然不是个好办法,看起来不舒服,所以自己组装时保留了原始 consolas 字体的尺寸,而是采用把雅黑 cjk 字符宽度扩大的办法。注意不是把字符拉宽,而是把字符两边的空白变大。然后把雅黑的字符度量尺寸都改成 consolas 的,把字体类型改成等宽,完工。但是安装后依然在控制台字体列表里看不到,咦?
失败两次发现事情不简单,里头有玄机,用于控制台的字体如果是TrueType,需要是等宽的,FF_MODERN 的,且包含 Windows 语言对应 code page。微软雅黑本身就有 cp936,这么看貌似我就漏了那个 FF_MODERN。FF_MODERN 要求字体笔画等宽度,奇怪的要求…不过这不是个事,字体长啥样和这些设置无关。不过把字体改成 MODERN 类型后依然没法用于控制台,咦?
仔细看了下生成字体的 code page ,发现不知为啥变成了 932(日语),难怪安装过后字体查看器会在字体图标上用假名而不是汉字。仿照雅黑的设置改掉,导出,安装,但还是失败了,咦?
再仔细看了一遍字体设置对话框,发现 code page 下面有一个复选框“导出时自动计算”…顿时很无语,不知为啥自动计算会算成 932,明明大量字符都是 936 的。这应该就是第一次尝试即失败的原因了。把复选框去掉,导出,安装,然后没有悬念的成功了。
总结一下,用 FontCreator(版本 9.1)导出字体时默认会自动计算 code page,会把中文的算成日语的,有谁用这个工具改字体,要留意这个坑。
不知为啥,我自己折腾时并不需要照之前知乎链接里说的要修改注册表,反而是能够像上篇文里那个 Microsoft YaHei Mono 一样即装即用。前面知乎链接里提供了另外一种等宽雅黑下载,不过那个虽然字符倒是能对齐了(用的是压缩 Consolas 字符间距的办法,个人觉得太紧凑不好看),但是依然没有解决在控制台里比其他字体小一圈的问题。
无图无真相。
后记
合并字体我用的是 FontForge。FontCreator 咋批量合并我没摸索出来,只能先把需要的代码点加上排好序,然后复制粘贴,过于麻烦。至于为啥不用 FontForge 改字体,主要是我用 FontForge 改会把字符撑的特别宽,不知为啥…可能 FontForge 我用的不对。相比之下 FontCreator 的字形变换功能也要好用不少,特别是本文里头用来给字形左右加空白的工作,FontCreator 能够自动将宽度增量平分到字形两边,FontForge 貌似要自己算。是否一定要平分没试过,我觉得还是平分的好。
是否一定要把字体类型设成 MODERN 没有广泛验证过,好像设不设都行?
谢谢评论里 chen 的提醒:调整宽度时会把 hinting 数据给删掉。我不知道为啥,也不知道用什么软件能避免这个问题,所以改出来的字体只在 Win10 系统以及不需要 hinting 的系统上才能保证有比较好的效果。