如何配置 fontconfig 来映射带有连字符的字体名称?

如何配置 fontconfig 来映射带有连字符的字体名称?

我在使用 fontconfig 识别一些网站(包括 Github 和 Stack Exchange 网站)最近开始使用的字体时遇到了麻烦ui-monospace。Firefox 还没有对系统字体的特殊 CSS 引用(请参阅FF 错误 1226042, 这草稿规范,以及它的我可以使用条目吗),并且 FF 也会被 fontconfig 欺骗,它会用其对 sans-serif 的默认分配来满足任何字体。

作为一种解决方法,我想明确将此字体名称别名为我喜欢的等宽字体(即恐慌无,这是经过调整的 DejaVu Sans Mono 变体,将下划线稍微向上推了一点),但由于这太模糊了,这个问题使用DejaVu Sans Mono

我第一次尝试这个解决方法,但没有成功:

  <alias>
    <family>ui-monospace</family>
    <prefer><family>DejaVu Sans Mono</family></prefer>
  </alias>

另一种对其他字体更成功的尝试:

  <match>
    <test name="family"><string>ui-monospace</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>DejaVu Sans Mono</string>
    </edit>
  </match>

当我保存它并刷新缓存时,它不起作用:

$ grep ui.monospace ~/.config/fontconfig/fonts.conf
    <test name="family"><string>ui-monospace</string></test>
$ fc-cache -f
$ fc-match 'ui-monospace'
Carlito-Regular.ttf: "Carlito" "Regular"
$ fc-match sans-serif
Carlito-Regular.ttf: "Carlito" "Regular"

所以这不起作用。这是令人好奇的部分:当我使用空格而不是连字符时,它起作用:

$ sed -i 's/ui-monospace/ui monospace/' ~/.config/fontconfig/fonts.conf
$ grep ui.monospace ~/.config/fontconfig/fonts.conf
    <test name="family"><string>ui monospace</string></test>
$ fc-cache -f
$ fc-match 'ui monospace'
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"

所以问题似乎出在连字符上。我没有看到任何文档(或错误报告)表明这个问题;fontconfig 文档<string>不要记录非法字符或如何转义它们。我尝试将其定义为<string>ui\-monospace</string>and <string>ui&#45;monospace</string>(and &#x2d;),但这些都不起作用。

如何配置 fontconfig 来映射带有连字符的字体名称?

答案1

我把这段代码放到我的顶部~/.config/fontconfig/fonts.conf并且它有效:

  <match target="pattern">
    <test qual="any" name="family">
      <string>ui-monospace</string>
    </test>
    <edit name="family" mode="assign" binding="same">
      <string>monospace</string>
    </edit>
  </match>

它必须位于顶部,在指定我喜欢的等宽字体的部分之前。

已在 GitHub 上和 上验证fc-match 'ui\-monospace'

相关内容