配置 Fontconfig 使用 Variable Font
我在 Linux 系统中安装了可变字体 vivo Sans SC VF,但在 Firefox 里默认调用的并不是可变字体,而是可变字体中预定义的具体实例,比如 weight 400 的版本。
你可以在 Firefox 的开发者工具中查看字体,如果字体是可变字体,应该会显示其所有可变轴:
实际上问题出在 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
根据 Reddit 和 QTBUG 的描述,QT 调用可变字体的 bold 版本时可能会错误地再次加粗一遍字体,导致字体过粗。这个问题直到这篇文章写作时仍然存在(Arch Linux,qt6-base 6.9.0-1)。目前的解决方法是设置环境变量:
bash
export QT_NO_SYNTHESIZED_BOLD=1