gpt4 book ai didi

linux - 如何在 fontconfig 中设置每个 Unicode 范围/代码点的字体?

转载 作者:IT王子 更新时间:2023-10-29 00:57:24 25 4
gpt4 key购买 nike

我最近想出了如何使用 fontconfig在 Linux 上为衬线、无衬线和等宽字体设置系统默认字体;基本上,您将 XML 配置文件保存到 ~/.config/fontconfig/fonts.conf内容如下:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

<match>
<test qual="any" name="family"><string>serif</string></test>
<edit name="family" binding="strong" mode="prepend_first">
<string>Gentium</string>
<string>Sun-ExtA</string>
<string>HanaMinA</string>
<string>HanaMinB</string>
</edit>
</match>

</fontconfig>

binding="strong" mode="prepend_first"属性确保匹配规则优先于其他设置,字体名称的顺序确保在字体不包含给定代码点/字符的情况下,尝试列表中的下一个字体(此列表适用于从上到下底部;恕我直言,它确实应该是一个后来绑定(bind)更强的逻辑,但无论如何)。

此配置的优点在于它适用于文本编辑器和终端仿真器。

但是,仍然有一个问题:在许多情况下,给定的字体确实包含给定的字形,但对于该代码点,另一种字体更可取;例如,Sun-ExtA是 CJK 字符的默认字体,但它也涵盖了很多非 CJK 字符,并且有一些有问题的字形。

假设我不喜欢 〇 U+3007 IDEOGRAPHIC NUMBER ZERO 的外观在 Sun-ExtA宁愿使用 HanaMinA为此,我怎么能用 fontconfig 做到这一点? ?显然我不能只优先考虑 HanaMinA 的条目在 Sun-ExtA ,因为这会影响两种字体中包含的所有字形。

我的直觉是,应该有一个涉及元素 <charset> 的解决方案(根据 fontconfig user documentation , "此元素至少包含 Unicode 代码点的一个元素或更多") 和/或 <range> (“此元素包含范围表示的两个元素”——大概表示 Unicode 代码点的范围)。不过,我找不到如何使用这些元素的单个示例。

是否可以将 fontconfig 配置为对单个 Unicode 代码点或一系列代码点使用特定字体?

最佳答案

在扫描模式中,包括 <minus>你的 <edit> 中的元素标记允许您从字符集中减去。

这主要是为了从字体中删除“坏”或有问题的字符而设计的,但更进一步,您可以编写 <test>匹配除您要使用的字体之外的所有字体:

<match target="scan">
<test name="family" compare="not_eq">
<string>VL Gothic</string>
</test>
<edit name="charset" mode="assign">
<minus>
<name>charset</name>
<range>
<int>0x0021</int>
<int>0x00FF</int>
</range>
</minus>
</edit>
</match>

类似的配置也可以用来删除整个lang s 来自字体。

据我所知,这在之前的任何地方都没有真正的记录,我发现了它 from a redhat bug

关于linux - 如何在 fontconfig 中设置每个 Unicode 范围/代码点的字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47501411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com