6

首先,我只想知道,为什么在Windows 10上的IDE Pycharm中进行了“仅显示单调字体”检查,将不会在编辑器的字体中列出许多字体,从而选择对话框框[settings/editors/editor/editor/colors and colors and colors and colors and Fonts /font],也是薄荷味的。

我不知道pycharm是怎么做的,但是mintty使用的是win32 API“L​​OGFONT”。

那么,windows 操作系统如何知道字体是否为等宽(固定宽度)?

即:“source code pro”被列出,“source code pro black/extralight/light...都没有;

列出了“fira 代码”,但未列出 fira 代码 light/medium/retina;

并且,如果“仅显示等宽字体”,则不会在此处列出其他一些等宽字体。

似乎 pycharm 仅在选中“仅显示单色字体”时识别字体系列名称

在 OSX(Mavericks) 中有点复杂:如果选中了“仅显示等宽字体”,pycharm 仍然可以获得家族名称,但如果安装了 rugular 加权字体版本,它无法知道默认的字体粗细。


然后,我尝试修改一些字体,顺便看看字体伪造中原始字体的“文件信息”,但我不知道哪个部分真正影响了 WINDOWS 或 PYCHARM(IDEA/INTELIJ/JDK事实上?)知道哪种字体是等宽的。

在“OS/2”部分,任何提到的固定宽度/等宽/等宽参数都会被检查,但没有任何帮助,并且在 windows pycharm 中仍然无法检测到它们。

所以,最后,我真的很想知道,TTF 文件或任何其他字体文件类型使用哪个参数来告诉 [windows/osx/mac os/linux] 操作系统“我是等宽的”?

4

2 回答 2

5

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;
于 2018-03-15T12:16:53.763 回答
4

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

等宽字体还应将numberOfHMetricsinhheahmtx表中的 设置为3

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

如果我不得不猜测,我会说 Apple 更有可能使用该post表,而 Microsoft 更有可能使用 Panose 数据(但我很容易对其中一个或两个都错)。


参考:

  1. 'post' 表的 Apple 文档
  2. Microsoft OpenType 建议
  3. Panose 分类指标指南
于 2017-04-03T07:15:55.617 回答