首先,我只想知道,为什么在Windows 10上的IDE PYCHARM中,在选中"仅显示等宽字体"的同时,许多字体将不会在编辑器的字体选择对话框中列出[设置/编辑器/颜色和字体/字体],也是Mintty。
我不知道pycharm是怎么做的,但薄荷糖使用win32 API"LOGFONT"。
那么,Windows操作系统如何知道字体是否为等宽(固定宽度)?
即: "源代码专业版"列出,"源代码专业版黑色/超轻/轻...不是;
列出了"Fira代码",但没有列出Fira代码浅色/中/视网膜;
而且,如果"仅显示等宽",则不会在此处列出其他一些等宽字体。
似乎 Pycharm 仅在选中"仅显示单色字体"时识别字体系列名称
在OSX(Mavericks)中,这有点复杂:如果选中"仅显示等宽字体",pycharm仍然可以获取姓氏,但如果安装了rugular加权字体版本,它无法知道默认的字体权重。
然后,我尝试修改一些字体,顺便看了一眼字体锻造中原始字体的"文件信息",但我不知道哪个部分真正影响了WINDOWS或PYCHARM(IDEA/INTELIJ/实际上由JDK?)知道哪种字体是等宽的。
在"OS/2"部分中,检查了任何提到的固定宽度/等宽/等宽参数,但没有帮助,并且在Windows pycharm中仍然无法检测到它们。
所以,最后,我真的想知道,TTF 文件或任何其他字体文件类型使用哪个参数来告诉 [Windows/OSX/Mac OS/Linux] 操作系统"我是等宽的"?
PyCharm 以及就此而言,所有 JetBrains IDEA 套件都不使用字体标志来识别等宽字体。相反,它们使用以下算法确定字体是否为等宽字体:
- 常规变体的
'l'
、'W'
和' '
字符在大小为 12 时宽度是否相同? - 粗体变体的
'l'
、'W'
和' '
字符的宽度是否相同 作为 12 号的常规变体? - 斜体变体的
'l'
、'W'
和' '
字符是否相同 宽度作为 12 码的常规变体? - 粗斜体变体的
'l'
、'W'
和' '
字符是 宽度与 12 码的常规变体相同?
如果上述任何宽度计算返回不一致的答案,则该字体将被列为非等宽字体。
要解决此问题,您应该安装您尝试使用的字体的粗体变体。如果字体的粗体版本不可用,IntelliJ 的字体渲染器将自动生成一个影响字符宽度的字体渲染器,从而导致等宽检查失败。
来源:IntelliJ社区版源代码(为简洁起见,摘录缩短,并在Apache 2.0许可证下获得许可,而不是StackOverflow的CC-BY-SA许可证。
private static int getFontWidth(Font font, int mask) {
int width = getCharWidth(font, ' ');
return width == getCharWidth(font, 'l')
&& width == getCharWidth(font, 'W') ? width : 0;
}
在FontInfo
构造函数中。
int width = getFontWidth(font, Font.PLAIN);
if (!plainOnly) {
if (width != 0 && width != getFontWidth(font, Font.BOLD)) width = 0;
if (width != 0 && width != getFontWidth(font, Font.ITALIC)) width = 0;
if (width != 0 && width != getFontWidth(font, Font.BOLD | Font.ITALIC)) width = 0;
}
boolean isMonospaced = width > 0;
TrueType 字体可以包含post
表。post
表包含一个名为isFixedPitch
的 32 位字段。如果它包含一个0
,则表示比例字体。等宽字体应将此设置为1
(但通常建议字体引擎应接受任何非零值作为指示等宽字体,因为这是 TT 规范的早期版本所要求的)。
等宽字体还应将hhea
和hmtx
表中的numberOfHMetrics
设置为3
。
panose字体中还有与数据匹配的数据(在OS/2表中),用于指定字体是否为等宽字体。
如果我不得不猜测,我会说苹果更有可能使用post
表,而Microsoft更有可能使用Panose数据(但我很容易错其中一个或两个)。
引用:
- 苹果文档的"发布"表
- Microsoft开放类型建议
- 帕诺斯分类指标指南