如何找出 fc-match 匹配的方式?

fra*_*ank 19 linux fonts

当我运行时fc-mach Sans,它返回DejaVuSans.ttf: "DejaVu Sans" "Book"但如果它像运行一样fc-match "Sans "fc-match "Sans 9"返回unifont.ttf: "unifont" "Medium"。我更喜欢总是使用 DejaVu Sans,但我不明白为什么 fontconfig 选择 unifont。全局和本地配置似乎都没有提到 unifont (不grep -ri unifont /etc/fonts/ ~/.fonts.conf返回任何内容)。玩 LC_DEBUG 也没有帮助我。有没有办法获得为什么 fontconfig 表现得像这样的信息?

lyn*_*ynx 12

乍一看,它对我来说似乎是一个真正的 fontconfig 错误,因为它在这里工作正常,而且我确实安装了 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"
Run Code Online (Sandbox Code Playgroud)

但是,仔细观察,我们可以看到更多细节。某处可能仍然存在 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"
Run Code Online (Sandbox Code Playgroud)

手册页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"
Run Code Online (Sandbox Code Playgroud)

对此,您可以简单地说“去你的”并在其上添加另一个搜索以匹配您期望的方式:

$ fc-match -s uni | grep -i uni
Unifont.ttf: "unifont" "Medium"
Run Code Online (Sandbox Code Playgroud)

但是,您的问题是关于它究竟如何进行匹配。FcFontMatch(3)并进一步粗略确认它使用默认/配置值,并明确确认它首先修改了您传递给它的搜索词。对于更深入的内容,您必须检查代码(从上述函数开始)。


小智 7

FontConfig 根据与匹配标准的“距离”匹配属性。如果您想查看幕后发生的事情,请设置环境变量FC_DEBUG=3 并重新运行搜索。这将显示可能有用的调试信息。您不需要阅读 FontConfig 代码。