当我运行时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)并进一步粗略确认它使用默认/配置值,并明确确认它首先修改了您传递给它的搜索词。对于更深入的内容,您必须检查代码(从上述函数开始)。