我在使用 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-monospace</string>
(and -
),但这些都不起作用。
如何配置 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'
。