Skip to content

配置 Fontconfig 使用 Variable Font

我在 Linux 系统中安装了可变字体 vivo Sans SC VF,但在 Firefox 里默认调用的并不是可变字体,而是可变字体中预定义的具体实例,比如 weight 400 的版本。

你可以在 Firefox 的开发者工具中查看字体,如果字体是可变字体,应该会显示其所有可变轴:

Firefox Variable Font

实际上问题出在 Fontconfig 返回的字体列表的顺序上。可以用这几个指令来检查一下 match 到的第一个字体是不是可变字体:

bash
fc-list :variable=true
fc-list "vivo Sans SC VF"
fc-match "vivo Sans SC VF" -b

最后一个指令的输出应该是类似于以下的内容:

Pattern has 43 elts (size 48)
    family: "vivo Sans SC VF"(s)
    familylang: "en"(s)
    style: "Regular"(s)
    ...
    postscriptname: "vivoSansSCVF"(s)
    ...
    variable: True(w)
    ...

注意到 variable: True(w) 说明 match 到的确实是可变字体。如果你得到的是 variable: False(w),那么说明 match 到的不是可变版本,而是字体内预定义的某个组参数下的具体实例。我这里观察到的行为是,Fontconfig 会优先返回可变字体的实例,而不是可变字体本身。

要解决这个问题,可以在 ~/.config/fontconfig/fonts.conf 中添加以下配置:

xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="font">
    <test name="family">
      <string>vivo Sans SC VF</string>
    </test>
    <edit name="variable" mode="assign">
      <bool>true</bool>
    </edit>
  </match>
</fontconfig>

这段配置的意思是:当 Fontconfig 匹配到 vivo Sans SC VF 字体时,强制将其 variable 属性设置为 true。这样就可以确保 Firefox 等应用程序能够正确识别并使用可变字体。

QT 下可变字体过粗的 bug

根据 RedditQTBUG 的描述,QT 调用可变字体的 bold 版本时可能会错误地再次加粗一遍字体,导致字体过粗。这个问题直到这篇文章写作时仍然存在(Arch Linux,qt6-base 6.9.0-1)。目前的解决方法是设置环境变量:

bash
export QT_NO_SYNTHESIZED_BOLD=1