fontconfig 覆盖字体的正常粗细和样式

fontconfig 覆盖字体的正常粗细和样式

我想覆盖字体的粗细或普通样式。通过以下配置,我可以将常规粗细/样式覆盖为“中”,但“普通”样式(也与“常规”具有相同的粗细)仍然固定为“常规”而不是“中”。

<fontconfig>
  <alias>
    <family>sans</family>
    <prefer><family>Roboto</family>
    </prefer>
  </alias>

  <match target="pattern">
    <test name="style" qual="any" compare="eq"><string>normal</string></test>
    <edit name="style" mode="assign" binding="strong"><string>medium</string></edit>
  </match>

  <match target="pattern">
    <test name="weight" qual="any" compare="eq"><int>80</int></test>
    <edit name="weight" mode="assign" binding="strong"><int>100</int></edit>
  </match>
</fontconfig>

这是结果:

$ fc-match "Roboto: normal"
Roboto-Regular.ttf: "Roboto" "Regular"
$ fc-match "Roboto: regular"
Roboto-Medium.ttf: "Roboto" "Medium"

我希望用中等覆盖“正常”风格。为什么这不起作用以及如何做到这一点?

答案1

原因是,这normal不是样式/粗细而是宽度定义。

[root@ArchTestVM ~]# fc-pattern "Roboto: normal"
Pattern has 2 elts (size 16)
        family: "Roboto"(s)
        width: 100(i)(s)
[root@ArchTestVM ~]# fc-pattern "Roboto: regular"
Pattern has 2 elts (size 16)
        family: "Roboto"(s)
        weight: 80(i)(s)
[root@ArchTestVM ~]# fc-pattern "Roboto: medium"
Pattern has 2 elts (size 16)
        family: "Roboto"(s)
        weight: 100(i)(s)
[root@ArchTestVM ~]# fc-pattern "Roboto: normal:medium"
Pattern has 3 elts (size 16)
        family: "Roboto"(s)
        weight: 100(i)(s)
        width: 100(i)(s)

模式“Roboto:正常”不包含体重或族的定义,因此映射到常规。
可以匹配宽度并改变重量,但这可能不是您想要的:

<match target="pattern">
    <test name="width" qual="any" compare="eq"><int>100</int></test>
    <edit name="weight" mode="assign" binding="strong"><int>100</int></edit>
</match>
<match target="pattern">
    <test name="weight" qual="any" compare="eq"><int>80</int></test>
    <edit name="weight" mode="assign" binding="strong"><int>100</int></edit>
</match>
[root@ArchTestVM ~]# fc-match "Roboto: normal"
SourceCodePro-Medium.otf: "Source Code Pro" "Medium"
[root@ArchTestVM ~]# fc-match "Roboto: normal:bold"
SourceCodePro-Medium.otf: "Source Code Pro" "Medium"
[root@ArchTestVM ~]# fc-pattern "Roboto: normal"
Pattern has 2 elts (size 16)
        family: "Roboto"(s)
        width: 100(i)(s)
[root@ArchTestVM ~]# fc-pattern "Roboto: normal:bold"
Pattern has 3 elts (size 16)
        family: "Roboto"(s)
        weight: 200(i)(s)
        width: 100(i)(s)

您可以将粗体更改为中等,因为它定义的宽度为 100。

或者您是否正在寻找一种方法来更改默认权重(如果模式中没有权重定义为 100)?


编辑。即使明确指定为重量而不是宽度,它也不起作用:

[root@ArchTestVM ~]# fc-match "Roboto: weight=normal"
Fontconfig error: Unexpected constant name `normal' used for object `weight': should be `width'
Unable to parse the pattern

这是有道理的,因为宽度 80 有正则,但宽度 100 没有其他单词,而且可以区分关键字就可以了。只是问题是为什么他们<const>根据文档允许标签中的“正常”别名为“常规”。

相关内容