相同的字体,相同的名称,两种不同的文件格式。 Fontconfig 使用哪一种?

相同的字体,相同的名称,两种不同的文件格式。 Fontconfig 使用哪一种?

原问题

我下载了科泽特字体,其中包括CozetteVector.ttfCozetteVector.otf。我将这两个文件复制到~/.local/share/fonts并运行fc-cache -v ~/.local/share/fonts。现在,当我运行 时fc-list | grep -i cozette,我可以看到 TTF 和 OTF 版本均已列出,并且具有相同的名称CozetteVector:style=Regular

CozetteVector当我在图形程序中选择字体时,将使用哪种字体?

Fontconfig 如何处理这种情况?

同时拥有两个版本会导致问题或产生冲突吗?


关于为什么会发生这种情况以及为什么有人可能会关心的其他背景信息

在 Fedora 35 上,字体包通常包含同一字体的 OTF 和 TTF 格式。例如,redhat-text-fonts包包含/usr/share/fonts/redhat/RedHatText-LightItalic.otf/usr/share/fonts/redhat/RedHatText-LightItalic.ttf

~/.local/share/fonts我还遇到过一种情况,我通过将字体复制到并运行来手动“安装”字体fc-cache -f,但后来我使用系统提供的软件包安装了相同的字体。现在我有相同的字体文件,在两个完全不同的目录中定义相同的字体系列。文件名可能完全相同,也可能有一些变化。

通常,重复项实际上是重复项,差异并不重要。但有时这些冲突并不重要,例如,一个版本是可变字体,而另一个版本不是,或者一个版本包含多个样式集,而另一个版本则不包含。

答案1

哪个?

可能是按照扫描字体的顺序。尝试检查文档属性。

您也可以尝试类似的操作,看看订单是否不稳定:fc-match -f '%{fullname} %{file}\n' CozetteVector

问题?

不,只要它们是单独的文件,字体配置就会将它们作为单独的字体处理。

该顺序可以取决于进行查询的应用程序。这是参考:font-config 用户配置(FreeDesktop项目)

用于更改字体优先级的 Fontconfig 规则示例

:) 我错过了赏金,无论如何,它一直在追捕我深入检查。

这是一个操纵两种类型相同字体之间的优先级的示例:

~/.config/fontconfig/conf.d/00-custom.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

 <!-- this drop a font from matching, also allow matching with font type
 <selectfont>
  <rejectfont>
   <pattern>
     <patelt name="family"><string>CozetteVector</string></patelt>
   </pattern>
  </rejectfont>
 </selectfont>
 -->

 <!-- this forces a type
 <match>
  <test name="family">
   <string>CozetteVector</string>
  </test>
  <edit mode="prepend" name="fontformat">
   <string>TrueType</string>
  </edit>
 </match>
 -->

 <!-- this prioritize the last one which appended, this is for TTF then OTF --> 
 <match>
  <test name="family">
   <string>CozetteVector</string>
  </test>
  <edit mode="prepend" name="fontformat">
   <string>CFF</string>
  </edit>
 </match>

<match>
  <test name="family">
   <string>CozetteVector</string>
  </test>
  <edit mode="prepend" name="fontformat">
   <string>TrueType</string>
  </edit>
 </match>

</fontconfig>

调试 fontconfig 匹配并检查字体属性

您可以查看高级匹配的联机帮助页。还使用fc-match -av ...FC_DEBUG=1 fc-match ...了解每种字体的可用属性及其值。

笔记

  • OTF 比 TTF 更高级,如果 fontconfig 优先考虑 OTF 而不是 TTF,我不会感到惊讶。然而,我没有证明支持我的主张,但我怀疑是在上游 fontconfig 配置中的某个地方,类似于我在 Ubuntu 中找到的禁用位图字体类型。

  • Arch Wiki 列出了用于激活风格集的良好 fontconfig 示例(我还没测试)

  • 顺便说一句,alias对于高级规则来说,这是一个非常强大的功能,相同的字体可以有多个别名,每个别名都有自己的设置。 (我还没测试)

答案2

我在今年年初的邮件列表主题中找到了答案:https://lists.freedesktop.org/archives/fontconfig/2022-January/006860.html

最新的有优先权。它是通过 测量的FC_FONTVERSION。如果两者相同,则取决于元素的顺序。第一个有优先权。

似乎顺序是由用户配置文件中的目录顺序定义的。除此之外,它完全是任意的,并且可能取决于用户的文件系统。我查看了源代码,但无法弄清楚字体文件列表到底是在哪里生成的。

相关内容