当我运行时fc-mach Sans
,它会返回DejaVuSans.ttf: "DejaVu Sans" "Book"
,但如果它像fc-match "Sans "
or那样运行,fc-match "Sans 9"
它就会返回unifont.ttf: "unifont" "Medium"
。我更喜欢始终使用 DejaVu Sans,但我不明白为什么 fontconfig 选择 unifont。全局配置和本地配置似乎都没有提到 unifont (grep -ri unifont /etc/fonts/ ~/.fonts.conf
不返回任何内容)。使用 LC_DEBUG 也没有帮助我。有没有办法获取 fontconfig 为何如此行为的信息?
答案1
快速浏览一下,对我来说,它看起来像是一个真正的 fontconfig bug,因为它在这里工作正常,而且我确实安装了 DejaVu 和 Unifont:
$ fc-match Sans
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans"
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans "
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans 9"
DejaVuSans.ttf: "DejaVu Sans" "Book"
但是,仔细观察,我们可以看到更多细节。某处仍然可能存在 fontconfig 错误,但fc-match
显然当找不到任何内容时会返回默认值。我的系统上默认是 DejaVu:
$ fc-match uni
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match unifont
Unifont.ttf: "unifont" "Medium"
$ fc-match 4e5zedrkbxp
DejaVuSans.ttf: "DejaVu Sans" "Book"
手册页fc-match(1)
确认该命令不执行精确匹配,而是返回它认为的最佳匹配。您可以使用以下-a
命令或更简洁地查看它们-s
:
$ fc-match -s uni # now it also finds unifont
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
n019003l.pfb: "Nimbus Sans L" "Regular"
helvR12-ISO8859-1.pcf.gz: "Helvetica" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
KanjiStrokeOrders.ttf: "KanjiStrokeOrders" "Medium"
Eadui.ttf: "Eadui" "Medium"
Unifont.ttf: "unifont" "Medium"
FreeSerif.ttf: "FreeSerif" "нормален"
cu12.pcf.gz: "ClearlyU" "Regular"
cu-pua12.pcf.gz: "ClearlyU PUA" "Regular"
10x20.pcf.gz: "Fixed" "Regular"
您可以简单地说“管你的”,然后在其上添加另一个搜索,以按照您期望的方式进行匹配:
$ fc-match -s uni | grep -i uni
Unifont.ttf: "unifont" "Medium"
但是,您的问题是它到底如何进行匹配。FcFontMatch(3)
并进一步粗略地确认它使用默认/配置的值,并明确确认它首先修改您传递给它的搜索词。对于更深层次的东西,你必须检查代码(从上面提到的函数开始)。
答案2
FontConfig 根据与匹配标准的“距离”来匹配属性。如果你想看看幕后发生了什么,那么设置环境变量FC_DEBUG=3 并重新运行搜索。这将显示可能有用的调试信息。您不需要阅读 FontConfig 代码。