为什么 fc-match 尊重 Consolas 的匹配和编辑规则,却不尊重 Courier 的匹配和编辑规则?

为什么 fc-match 尊重 Consolas 的匹配和编辑规则,却不尊重 Courier 的匹配和编辑规则?

我正在使用带有 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 别名。

相关内容