一个字体如何告诉操作系统“我是一个等宽字体”?

7
首先,我想知道为什么在Windows 10上的PYCHARM IDE中,当勾选“仅显示等宽字体”时,编辑器的字体选择对话框[设置/编辑器/颜色和字体/字体]中会有很多字体没有被列出,而在mintty中也是如此。
我不知道pycharm是如何做到的,但mintty使用win32 API“LOGFONT”。
那么,Windows操作系统如何知道字体是等宽(固定宽度)的呢?
例如: “source code pro”被列出,“source code pro black / extralight / light ... ”没有列出; “fira code”被列出,但“fira code light/medium/retina”没有列出; 如果“仅显示等宽字体”,还有其他一些等宽字体没有列出。
看起来,pycharm只有在勾选“仅显示等宽字体”时才能识别字体族名称。
在OSX(Mavericks)中,情况有点复杂:如果勾选了“仅显示等宽字体”,pycharm仍然可以获取字族名称,但是如果安装了常规加粗字重的字体版本,则无法确定默认的字重。
然后,我尝试修改一些字体,并顺便浏览字体forge中原始字体的“文件信息”,但我不知道哪个部分真正影响WINDOWS或PYCHARM(实际上是IDEA/INTELIJ/通过JDK?)知道哪个字体是等宽的。
在“OS/2”部分中,任何提到的固定宽度/等宽/等宽的参数都已经被检查过了,但没有帮助,而在Windows pycharm中仍然无法检测到它们。
因此,最后我真的很想知道,TTF文件或任何其他字体文件类型使用哪个参数告诉[windows/osx/mac os/linux]操作系统‘我是等宽的’?
2个回答

5
PyCharm和所有JetBrains IDEA套件都不使用字体标志来识别等宽字体。相反,它们使用以下算法确定字体是否等宽:
  • 在大小为12时,常规变量的字符“l”、“W”和“ ”的宽度是否相同?
  • 在大小为12时,粗体变量的字符“l”、“W”和“ ”的宽度是否与常规变量相同?
  • 在大小为12时,斜体变量的字符“l”、“W”和“ ”的宽度是否与常规变量相同?
  • 在大小为12时,粗斜体变量的字符“l”、“W”和“ ”的宽度是否与常规变量相同?

如果上述任何宽度计算返回不一致的答案,则该字体将被列为非等宽字体。

为了解决这个问题,您需要安装所需字体的粗体变体。如果没有粗体字体可用,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;

4
一个 TrueType 字体可以含有一个 post 表,post 表中包含一个名为 isFixedPitch 的 32 位字段。如果该字段值为 0,则表示为比例字体。等宽字体应该将其设置为 1 (但通常建议字体引擎接受任何非零值作为等宽字体的指示,因为早期版本的 TT 规范要求如此)。

等宽字体还应该将 hheahmtx 表中的 numberOfHMetrics 设置为 3

在 panose 字体匹配数据(在 OS/2 表中)中还有数据可用于指定字体是否为等宽字体。

如果我必须猜测,我会说 Apple 更可能使用 post 表,而 Microsoft 更可能使用 Panose 数据(但我可能会对其中一个或两个都错)。


参考资料:

  1. Apple documentation of 'post' table
  2. Microsoft OpenType Recommendations
  3. Panose Classification Metrics Guide

1
非常感谢,这是一个获取有价值答案的神奇世界。看起来我使用Panose位“9”对等宽字体进行修改是成功的,并且被OSX成功识别。根据您提供的reflink#2,微软建议使用Panose数据,但是Pycharm无法识别它,可能是Pycharm或JDK的问题。 - Puter.B166ER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接