[已解决]请问下系统默认的字体优先级是在哪里配置的呢?

比如 openSUSE 42.2 版本里面,系统默认优先的中文字体是 Noto DemiLight,但是我看了家目录只有个定义路径的 conf 文件,在诸如 etc 那些目录下的 xx-xxx.conf 里面的 prefer 下面都没有写 noto 这个字体,那么系统定义的优先字体是在哪里配置的呢?

我找到了,好像是 59 那个…

在哪里?

就在 fonts 目录下那一堆 xx-xxx.conf 里面,老实说我也没搞清楚结构,得去看文档才行,里面好多文件都可以改识别优先级

论坛里之前不是有人做了一个修改系统字体的软件吗?直接用不就好了吗?对这块不了解,自己乱改字体有时会出现一些搞不清楚的问题

中文是在 /etc/fonts/conf.d/59-family-prefer-lang-specific.conf,默认字体设置的是 Noto Sans CJK SC.只有没有这个文件的情况下才会用 65-nonlatin.conf.

你要想替代系统默认字体,最好是自己写一份 ~/.config/fontconfig/fonts.conf.把 /etc/fonts/local.conf 复制过去写就可以了.

2赞

哦… 我也知道直接在那里改不是好习惯
但是还有个疑问,那个文件只定义了字体,没有标具体的字重,虽然我觉得直接在里面改成

<string>Noto Sans Mono CJK SC Regular</string>

这样子也有效,但我在想应该还有一个文件在定义字重的吧?我没找到那个文件,只看到有个 80-delicious.conf,里面定义的是 “heavy” , 但 “heavy” 这个对应过来应该是 Noto xxx Medium 这个啊, 请问这个文件在哪里呢?

然后这里又产生了另外一个疑问,系统里的 conf 文件对于字重可以使用两种值类型:字符和数字,我去对比看了下 freedeshtop 网站上的定义,如果要定义一个 Medium 字重的字体,可以写为

<string>Heavy</string>

或者

<int>100</int>

那定义成 heavy 的字体对应的字符值又是哪个呢? “heavy”被占了,哪里能看到字符定义的所有值呢? freedeshtop 上面的好像不全…

目前没有定义字重. 因为默认就是 Regular. 适用于大多数人. 你可以用

FC_DEBUG=1 kwrite > 1.txt

看到. 如果想要自定义字重, 就在你的 ~/.config/fontconfig/fonts.conf 里面写上 (我省略了一些东西, 假设你的 fonts.conf 是从 /etc/fonts/local.conf 复制过来的)

<match target="font">
  <test name="family">
    <string>Noto Sans CJK SC</string>
  </test>
  <edit name="weight">
    <const>Medium</const>
  </edit>
</match>

注意, 不是全部字体都提供了全部 const 字重, 比如 Noto Sans CJK SC 就没有 heavy(但是有 black, 和 heavy 是一个 weight 值), 你可以用

FC_DEBUG=8 kwrite > 2.txt

然后搜索 Noto Sans CJK SC 看到全部字重.

有些字体的 heavy/bold/italic 之类的是拆开打包的, 在没安装对应的包的时候也是没有某些字重的. 这都需要你自己去发现. 所以全局定义字重而不是针对个别字体定义, 个人认为是不可取的.

weight 是 Int 型. 只是定义了以下的 const 方便使用:

 thin            weight          0
  extralight      weight          40
  ultralight      weight          40
  light           weight          50
  demilight       weight          55
  semilight       weight          55
  book            weight          75
  regular         weight          80
  normal          weight          80
  medium          weight          100
  demibold        weight          180
  semibold        weight          180
  bold            weight          200
  extrabold       weight          205
  black           weight          210
  heavy           weight          210

heavy 是 210. 我不知道你是在哪儿看的, 那个 heavy 明显用错了, 100 对应的就是 medium.

我是在这里: freedesktop.org/software/fontconfig/fontconfig-user.html

1赞

嗯 非常感谢你的帮助 感觉自己又多了解一些东西。

PS: 看了几天才明白,貌似 fontconfig 的一个 bug ,导致系统默认识别成 DemiLight 而不是 Regular,我还以为哪里有个定义字重的配置呢 升级 fontconfig 立马就正常了。

那个 “heavy” 的问题,我看的 80-delicious.conf 这个文件,它那里面的注释是这样写的:

<!-- Delicious 'heavy' variant says its Medium weight -->
<match target="scan">
	<test name="family" compare="eq" ignore-blanks="true">
		<string>Delicious</string>
	</test>
	<test name="style">
		<string>Heavy</string>
	</test>
	<edit name="weight">
		<const>heavy</const>
	</edit>
</match>

那这样看起来这个文件没有起作用样子…

要查看自己设置的优先级有没有成效,可以采用 fc-match 命令,比如
fc-match -s “Sans:Bold”

会按照 Fallback 的优先级列出“无衬线粗体”使用的字体。fc-match 的 man page 写得很不详细,有人写了一篇很好的博客可供参考: blog.mozcp.com/fc-match-usage/

此外,可以直接用 pango-view 预览字体效果,比如

pango-view --hinting=none --waterfall --font="Sans Bold" -t " 中文字体测试"

注意 pango-view 的 font_desc 格式和 fc-match 的 pattern 格式又不一样。