![为什么 fc-match 尊重 Consolas 的匹配和编辑规则,却不尊重 Courier 的匹配和编辑规则?](https://linux22.com/image/1454720/%E4%B8%BA%E4%BB%80%E4%B9%88%20fc-match%20%E5%B0%8A%E9%87%8D%20Consolas%20%E7%9A%84%E5%8C%B9%E9%85%8D%E5%92%8C%E7%BC%96%E8%BE%91%E8%A7%84%E5%88%99%EF%BC%8C%E5%8D%B4%E4%B8%8D%E5%B0%8A%E9%87%8D%20Courier%20%E7%9A%84%E5%8C%B9%E9%85%8D%E5%92%8C%E7%BC%96%E8%BE%91%E8%A7%84%E5%88%99%EF%BC%9F.png)
我正在使用带有 XFCE 的 Debian。
默认行为:无匹配或别名
首先,让我展示一下当 ~/.config/fontconfig/fonts.conf 没有匹配或别名标签时系统的默认行为。
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
</fontconfig>
在这种情况下,fc-match 为 Courier 和 Consolas 输出以下内容。
lone@debian:~$ fc-match Courier
n022003l.pfb: "Nimbus Mono L" "Regular"
lone@debian:~$ fc-match Consolas
DejaVuSans.ttf: "DejaVu Sans" "Book"
自定义行为:定义匹配时
现在我在 ~/.config/fontconfig/fonts.conf 中有以下内容。
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Courier => DejaVu Sans Mono -->
<match>
<test name="family"><string>Courier</string></test>
<edit name="family"><string>Deja Vu Sans Mono</string></edit>
</match>
<!-- Consolas => DejaVu Sans Mono -->
<match>
<test name="family"><string>Consolas</string></test>
<edit name="family"><string>Deja Vu Sans Mono</string></edit>
</match>
</fontconfig>
在这种情况下,fc-match 输出以下内容。
lone@debian:~$ fc-match Courier
n022003l.pfb: "Nimbus Mono L" "Regular"
lone@debian:~$ fc-match Consolas
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
这里我们看到系统遵守了我对 Consolas 的替换规则,但没有遵守我对 Courier 的替换规则。为什么输出fc-match Courier
仍然是“Nimbus Mono L”而不是“DejaVu Sans Mono”?
答案1
我知道这个问题可能已经过时了,但是我在自己寻找解决方案以覆盖系统用 Liberation Sans 替换 Arial 时遇到了它,因为我在全新的 Kubuntu Xenial 16.04 桌面上不喜欢这个字体。
如果您想要为用户覆盖 fontconfig 的默认替换,也许您有兴趣阅读我在 Askubuntu 上的帖子:https://askubuntu.com/a/793363/306420
简短的摘要
在现代系统上,fontconfig 从~/.config/fontconfig/fonts.conf
或(更有利于分离)中提取用户配置~/.config/fontconfig/conf.d
。
就我而言,我希望 Firefox 能够使用 CSS 字体系列设置来渲染文本,以便优先使用 Noto Sans 的 Arial。Fontconfig 默认配置为使用 Liberation Sans 作为 Arial 的韵律插件 ( /etc/fonts/conf.avail/30-metric-aliases.conf
),乍一看,如果不更改 fontconfig 的主配置文件,似乎无法覆盖该设置。
经过长时间的搜索和反复试验,解决方案非常简单:在提到的用户目录中,覆盖会被尊重,并且会根据 fontconfig 的期望以表单形式命名[0-9][0-9]*.conf
(参见/etc/fonts/conf.avail/50-user.conf和/etc/fonts/conf.d/README)。
我的工作配置覆盖了Arial:
~/.config/fontconfig/conf.d/00-arial-noto.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Map Arial to Noto Sans instead of Liberation Sans
(overrides /etc/fonts/conf.d/30-metric-aliases.conf) -->
<alias binding="same">
<family>Arial</family>
<accept>
<family>Noto Sans</family>
</accept>
</alias>
</fontconfig>
fc-match Arial
以您的用户身份在控制台上进行检查,它应该输出“Noto Sans”(或任何您的新配置),而无需额外努力。
在我花了半天时间弄清楚这一切之后,包括阅读了关于 fontconfig 领域英勇战斗的高度冒险故事,我希望这对其他人有所帮助。
答案2
如果您没有在默认配置中更改任何内容,则字体配置文件不/etc/fonts/conf.d/
包含对 Consolas 的引用,因此您的设置将用于该设置。
但是,它们已经包含 Courier 的条目,并将它们别名为 Nimbus Mono L。
因此,当您的 fonts.conf 被解析时,Courier 已经被处理了,并且不再有 Courier 可以使用,只有 Nimbus Mono L。
解决方案:
在你的 fonts.conf 中使用 Nimbus Mono L 字体。
如果你写
<match>
<test name="family"><string>Nimbus Mono L</string></test>
<edit name="family"><string>DejaVu Sans Mono</string></edit>
</match>
然后fc-match Courier
将输出 DejaVu Sans Mono。
或者,从 /etc/fonts/conf.d 中的所有 .conf 文件中删除 Courier 别名。