Linux字体美化

字体

安装字体

查看已安装中文字体: fc-list :lang=zh

ttf-roboto ttf-hack ttf-dejavu
noto-fonts noto-fonts-cjk noto-fonts-emoji
wqy-microhei wqy-zenhei wqy-bitmapfont ttf-symbola otf-font-awesome pango

  • ttf-roboto : roboto 无衬线字体(英文)
  • ttf-dejavu : DejaVu 字体(英文)
  • ttf-hack : hack等宽(英文)
  • noto-fonts : Noto字体
  • noto-fonts-cjk : Noto中日韩字体
  • noto-fonts-emoji : Noto符号字体
  • wqy-microhei : 文泉驿微米黑,无衬线形式字体(中日韩)
  • wqy-zenhei : 文泉驿正黑体,黑体 (无衬线) 的中文轮廓字体,附带文泉驿点阵宋体 (也支持部分日韩字符)
  • wqy-bitmapfont : 文泉驿点阵宋体 (衬线) 中文字体
  • ttf-symbola : 提供许多 Unicode 符号,包括 Emoji
  • otf-font-awesome : 字体图标库
  • pango : 一个开放源的自由文本布局库

我的配置

~/.config/fontconfig/fonts.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

<!-- 显示器使用的像素排列方式 -->
<match target="font">
<edit mode="assign" name="rgba">
<const>rgb</const>
</edit>
</match>

<!-- 字体微调的程度, 可选 hintnone, hintslight (默认), hintmedium, hintfull. -->
<!-- 更高的 hinting 等级可使字体更锐利,同时也会损失更多的细节 -->
<!-- 如果显示器的 DPI 高得不像话 (>=300), 可关闭 hinting, 字体会自然对齐像素 -->
<match target="font">
<edit mode="assign" name="hintstyle">
<const>hintslight</const>
</edit>
</match>

<!-- 抗锯齿. 除非屏幕DPI奇高否则建议开启 -->
<match target="font">
<edit mode="assign" name="antialias">
<bool>true</bool>
</edit>
</match>


<!-- 全局默认字体 -->
<match>
<edit mode="prepend" name="family">
<string>Noto Sans</string>
</edit>
</match>

<!-- 全局默认英文字体 -->
<match>
<test compare="contains" name="lang">
<string>en</string>
</test>
<edit mode="prepend" name="family">
<string>Bitstream Vera Sans</string>
</edit>
</match>

<!-- 全局默认中文字体 -->
<match>
<test compare="contains" name="lang">
<string>zh</string>
</test>
<edit mode="prepend" name="family">
<string>Noto Sans CJK SC</string>
</edit>
</match>

<!-- 默认无衬线字体 -->
<match target="pattern">
<test qual="any" name="family">
<string>sans-serif</string></test>
<edit name="family" mode="prepend" binding="same">
<string>DeiaVu Sans</string>
<string>Roboto</string>
</edit>
</match>

<!-- 默认衬线字体 -->
<match target="pattern">
<test qual="any" name="family">
<string>serif</string>
</test>
<edit name="family" mode="prepend" binding="same">
<string>DejaVu Serif</string>
</edit>
</match>

<!-- 默认等宽字体 -->
<match target="pattern">
<test qual="any" name="family">
<string>monospace</string>
</test>
<edit name="family" mode="prepend" binding="same">
<string>Hack</string>
</edit>
</match>

<!-- 字体替换 -->
<!--SimSun, Microsoft YaHei, SimHei -> WenQuanYi Micro Hei -->
<match target="pattern">
<test name="family">
<string>宋体</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>WenQuanYi Bitmap Song</string>
<string>Noto Serif CJK SC</string>
</edit>
</match>
<match target="pattern">
<test name="family">
<string>SimSun</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>WenQuanYi Bitmap Song</string>
<string>Noto Serif CJK SC</string>
</edit>
</match>
<match target="pattern">
<test qual="any" name="family">
<string>SimSun-18030</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>WenQuanYi Bitmap Song</string>
<string>Noto Serif CJK SC</string>
</edit>
</match>

<match target="pattern">
<test qual="any" name="family">
<string>Microsoft YaHei</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>WenQuanYi Micro Hei</string>
</edit>
</match>

<match target="pattern">
<test qual="any" name="family">
<string>SimHei</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>WenQuanYi Micro Hei</string>
</edit>
</match>

<match target="pattern">
<test name="family">
<string>Times New Roman</string>
</test>
<edit name="family" mode="append" binding="strong">
<string>Noto Serif CJK SC</string>
</edit>
</match>
<match target="pattern">
<test name="family">
<string>Georgia</string>
</test>
<edit name="family" mode="append" binding="strong">
<string>Noto Serif CJK SC</string>
</edit>
</match>




<!-- 备用字体优先顺序 -->
<alias>
<family>sans-serif</family>
<prefer>
<family>WenQuanYi Micro Hei</family>
<family>DejaVu Sans</family>
<family>Roboto</family>
<family>Noto Sans</family>
<family>Noto Sans CJK SC</family>
<family>Noto Sans CJK TC</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans CJK KR</family>
<family>Noto Color Emoji</family>
<family>Noto Emoji</family>
<family>Font Awesome 5 Free</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>DejaVu Serif</family>
<family>Noto Serif</family>
<family>Noto Serif CJK SC</family>
<family>Noto Serif CJK TC</family>
<family>Noto Serif CJK JP</family>
<family>Noto Serif CJK KR</family>
<family>Noto Color Emoji</family>
<family>Noto Emoji</family>
<family>Font Awesome 5 Free</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Hack</family>
<family>DejaVu Sans Mono</family>
<family>Noto Sans CJK SC</family>
<family>Noto Sans CJK TC</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans CJK KR</family>
<family>Noto Color Emoji</family>
<family>Noto Emoji</family>
<family>Font Awesome 5 Free</family>
</prefer>
</alias>

</fontconfig>

命令

1
2
xdpyinfo |grep dimensions  # 分辨率和屏幕大小
xdpyinfo |grep resolution # dpi
1
2
3
4
5
6
7
fc-match serif-12 family autohint hinting hintstyle dpi pixelsize antialias rgba lcdfilter

fc-match georgia-12 family autohint hinting hintstyle dpi pixelsize antialias rgba lcdfilter

fc-match sans-serif-12 family autohint hinting hintstyle dpi pixelsize antialias rgba lcdfilter

fc-match verdana-12 family autohint hinting hintstyle dpi pixelsize antialias rgba lcdfilter

字体显示测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<!DOCTYPE html>
<html lang="zh-cn">
<h2 id="字体效果预览">字体效果预览</h2>
<p>
<font style="font-family: 宋体; font-size: 12pt">宋体12pt:这里是中文,以及标点符号“,。!?:;”This is English. </font>
<font style="font-family: 宋体; font-size: 6pt">这里是6pt。</font>
<font style="font-family: 宋体; font-size: 7pt">这里是7pt。</font>
<font style="font-family: 宋体; font-size: 8pt">这里是8pt。</font>
<font style="font-family: 宋体; font-size: 9pt">这里是9pt。</font>
<font style="font-family: 宋体; font-size: 10pt">这里是10pt。</font>
<font style="font-family: 宋体; font-size: 11pt">这里是11pt。</font><br>

<font style="font-family: 黑体; font-size: 12pt">黑体12pt:这里是中文,以及标点符号“,。!?:;”This is English. </font>
<font style="font-family: 黑体; font-size: 6pt">这里是6pt。</font>
<font style="font-family: 黑体; font-size: 7pt">这里是7pt。</font>
<font style="font-family: 黑体; font-size: 8pt">这里是8pt。</font>
<font style="font-family: 黑体; font-size: 9pt">这里是9pt。</font>
<font style="font-family: 黑体; font-size: 10pt">这里是10pt。</font>
<font style="font-family: 黑体; font-size: 11pt">这里是11pt。</font><br>

<font style="font-family: 微软雅黑; font-size: 12pt">微软雅黑12pt:这里是中文,以及标点符号“,。!?:;”This is English. </font>
<font style="font-family: 微软雅黑; font-size: 6pt">这里是6pt。</font>
<font style="font-family: 微软雅黑; font-size: 7pt">这里是7pt。</font>
<font style="font-family: 微软雅黑; font-size: 8pt">这里是8pt。</font>
<font style="font-family: 微软雅黑; font-size: 9pt">这里是9pt。</font>
<font style="font-family: 微软雅黑; font-size: 10pt">这里是10pt。</font>
<font style="font-family: 微软雅黑; font-size: 11pt">这里是11pt。</font><br>

<font style="font-family: serif; font-size: 12pt">serif: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: serif; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: serif; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: serif; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: serif; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: serif; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: serif; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: Times New Roman; font-size: 12pt">Times New Roman: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: Times New Roman; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: Times New Roman; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: Times New Roman; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: Times New Roman; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: Times New Roman; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: Times New Roman; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: Georgia; font-size: 12pt">Georgia: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: Georgia; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: Georgia; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: Georgia; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: Georgia; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: Georgia; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: Georgia; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: sans-serif; font-size: 12pt">sans-serif: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: sans-serif; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: sans-serif; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: sans-serif; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: sans-serif; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: sans-serif; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: sans-serif; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: verdana; font-size: 12pt">verdana: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: verdana; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: verdana; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: verdana; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: verdana; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: verdana; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: verdana; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: Arial; font-size: 12pt">Arial: This is English, 这是英文中夹杂的中文。</font>
<font style="font-family: Arial; font-size: 6pt">Here is 6pt. </font>
<font style="font-family: Arial; font-size: 7pt">Here is 7pt. </font>
<font style="font-family: Arial; font-size: 8pt">Here is 8pt. </font>
<font style="font-family: Arial; font-size: 9pt">Here is 9pt. </font>
<font style="font-family: Arial; font-size: 10pt">Here is 10pt. </font>
<font style="font-family: Arial; font-size: 11pt">Here is 11pt.</font><br>

<font style="font-family: monospace; font-size: 12pt">程序代码:<br>
  #include &lt;stdio.h&gt;<br>
  int main(){<br>
    return 0;//很显然这是为了测试等宽字体<br>
  }
</font>
</p>

</html>

以下为效果:

字体效果预览

宋体12pt:这里是中文,以及标点符号“,。!?:;”This is English. 这里是6pt。 这里是7pt。 这里是8pt。 这里是9pt。 这里是10pt。 这里是11pt。
黑体12pt:这里是中文,以及标点符号“,。!?:;”This is English. 这里是6pt。 这里是7pt。 这里是8pt。 这里是9pt。 这里是10pt。 这里是11pt。
微软雅黑12pt:这里是中文,以及标点符号“,。!?:;”This is English. 这里是6pt。 这里是7pt。 这里是8pt。 这里是9pt。 这里是10pt。 这里是11pt。
serif: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
Times New Roman: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
Georgia: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
sans-serif: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
verdana: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
Arial: This is English, 这是英文中夹杂的中文。 Here is 6pt. Here is 7pt. Here is 8pt. Here is 9pt. Here is 10pt. Here is 11pt.
程序代码:
  #include <stdio.h>
  int main(){
    return 0;//很显然这是为了测试等宽字体
  }

fonts.conf 手册

配置例解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<match target="font">
# 抗锯齿
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>

# 微调
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>

# 自动微调器
<edit name="autohint" mode="assign">
<bool>true</bool>
</edit>

# 微调样式
<edit name="hintstyle" mode="assign">
<const>hintfull</const>
</edit>

# 亚像素渲染

<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>

# LCD过滤器
<edit mode="assign" name="lcdfilter">
<const>lcddefault</const>
</edit>
</match>

# 取消粗体字的自动微调功能

<match target="font">
<test name="weight" compare="more">
<const>medium</const>
</test>
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
</match>


# 只对较大的字体打开反锯齿功能

<match target="font">
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>

<match target="font" >
<test name="size" qual="any" compare="more">
<double>12</double>
</test>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
</match>

<match target="font" >
<test name="pixelsize" qual="any" compare="more">
<double>16</double>
</test>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
</match>


#字体替换

# 替换字体但并不改变字体的属性,Georgia被Ubuntu字体替换

<match target="pattern">
<test qual="any" name="family"><string>georgia</string></test>
<edit name="family" mode="assign" binding="same"><string>Ubuntu</string></edit>
</matc>


<!-- # 设置“优先”字体,缺失的情况下用设定的字体替换-->

< !-- 用Bitstream Vera Sans Mono替换Helvetica -->
< !-- 注意,默认配置文件中应该已经存在Helvetica的别名 -->
<alias>
<family>Helvetica</family>
<prefer><family>Bitstream Vera Sans Mono</family></prefer>
<default><family>fixed</family></default>
</alias>

<alias>
<family>serif</family>
<prefer>
<family>你喜欢的拉丁衬线字体名称</family>
<family>你的中文衬线字体名称</family>
</prefer>
</alias>

最常见的别名有:
serif 代表衬线体(例如 DejaVu Serif、宋体)
sans-serif 代表无衬线体(例如 DejaVu Sans 和各种黑体)
monospace 则代表等宽字体(例如 DejaVu Sans Mono)
然而,这些别名所代表的字体有可能会变化,而且通常 KDE 和其他桌面环境中的字体管理工具不会显示其内在联系

描述

Fontconfig 是一个字体配置函数库,它既提供全局范围的配置,也允许每个用户进行个性化的配置,应用程序可以通过它访问字体。

功能概览

Fontconfig 由两个模块组成:
(1)配置模块,用于解析XML格式的配置文件;
(2)匹配模块,根据应用程序请求的字体模式(pattern),返回最匹配的字体。

配置文件标签

<fontconfig>

这是字体配置的顶层单元,可以包含0或1个 <config>, <selectfont> 单元,
以及任意数的 <dir>, <cachedir>, <include>, <match>, <alias> 单元。

<dir prefix="default">

包含一个目录名,Fontconfig 将会扫描其中的字体文件,将找到的字体添加到系统的可用字体列表中。

如果将prefix设为xdg,那么环境变量 XDG_DATA_HOME 的值将会被作为前缀添加到路径的头部

$XDG_DATA_HOME 参考

<cachedir prefix="default">

包含一个目录名称('~'表示用户家目录),用于保存字体属性的缓存(为了加速之后的读取)。
默认值是"$XDG_CACHE_HOME/fontconfig"。

配置文件含多个<cachedir>单元,读取缓存时会按顺序依次搜索,而在写入缓存时仅写入第一个有写入权限的目录。
缓存文件的名字遵循"<hash value>-<architecture>.cache-<version>"格式,其中的<version>是字体配置文件的版本号(目前是"3")。

<include ignore_missing="no" prefix="default">

包含一个额外的配置文件或目录('~'表用户家目录)。
如果是目录,那么该目录中所有文件名符合"[0-9]*.conf"格式的文件(以数字开头并以'.conf'结尾),都将被按照文件名的ASCII顺序依次处理。
注意,这些文件本身必须是具有完整XML结构的字体配置文件(包含完整的DOCTYPE声明),而不是用于插入此处的配置片段。
当配置文件的XML数据被 FcConfigParse 函数解析之后,包含的文件(或目录中文件名符合"[0-9]*.conf"格式的文件)也会被传递给 FcConfigLoadAndParse 函数进行处理,从而将这些文件的内容也整合到配置中。
如果将'ignore_missing'设为"yes"(默认的"no"),那么将不会对丢失的文件或目录发出警告。

<config>

提供了一个整合附加配置信息的地方。<config>可以包含0或1个 <blank>, <rescan> 单元。

<blank>

在编码中存在但字体中缺少的字形(glyph),只能在屏幕上绘制成空白。通过<blank>单元中放置原本就应该绘制成空白的 Unicode 字符(例如空格),就可以推断出:
没在<blank>中但被绘制为空白的字符是该字体所不支持的字符。不被支持的字符将会从该字体支持的字符集中剔除。
<blank>可以包含任意数量的<int>和<range>单元,用于指定这些空白字符的Unicode码位(code point)。

<rescan>

<rescan>仅容纳一个<int>单元,表示每隔多少秒自动扫描一次字体配置文件。
每次扫描,Fontconfig 都会验证所有的配置文件和目录,并自动重建内部的数据结构。

<selectfont>

<selectfont>通过包含0或1个 <rejectfont>, <acceptfont> 单元来设置字体黑名单与白名单。
通过包含一个<rejectfont>单元,将某些字体排除在可用字体列表之外;
同样,通过包含一个<acceptfont>单元,将某些字体包含在可用字体列表之内。

<acceptfont>

<acceptfont>通过包含任意数量的<glob>和<pattern>单元来匹配"白名单"字体。
匹配字体列入"白名单",被明确包含在可用字体列表之内,它们可以用于字体匹配和被列出给应用程序。
注意,"白名单"中的字体永远不会被<rejectfont>列入"黑名单"。

<rejectfont>

<rejectfont>通过包含任意数量的<glob>和<pattern>单元来匹配"黑名单"字体。
匹配字体列入"黑名单"(注:"白名单"字体永不被列入"黑名单"),被明确排除在可用字体列表之外:
不会被用于字体匹配,也不会被列出给应用程序,就好象系统中更本不存在这些字体一样。

<glob>

容纳一个含通配符("?"和"*")的文件名进行匹配。
不过,基于后缀名的匹配并不总是那么可靠,因为并非所有字体文件的命名都十分规范。
注意,<glob>单元仅用于目录,不作用于单个字体。

<pattern>

<pattern>通过包含任意数量的<patelt>单元,将字体的属性值与<patelt>单元列出的属性值列表进行比较,如果<patelt>单元列出的属性值列表中至少有一项与输入字体对应的属性值相符,就表示该字体与整个<pattern>单元的要求相符合。这样就可以基于字体的属性(缩放,粗细等)来匹配字体,比根据字体文件的后缀名匹配要可靠。

<patelt name="属性">

必须指定"property",表明该<patelt>单元要比较字体的哪个属性。<patelt>又通过包含一系列常量单元,来指定可与该属性匹配的值列表。"常量单元"指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <const>

<match target="目标">

<match>必须首先包含一系列<test>组成的列表(可以为空),然后再包含一系列<edit>组成的列表(可以为空),也就是<test>列表必须位于<edit>列表之前。注意:虽然两个列表都可以为空,但是不可以同时为空。
如果"目标"满足<test>列表的所有测试条件,那么将被按照<edit>列表中的指令序列进行修改。
target 的默认值是"pattern",表示此<match>单元针对的是用于匹配的字体模板(第一次修改)。
如果"目标"是"font",那么就表示此<match>单元针对的是已被选定的字体(第二次修改)。
如果"目标"是"scan",那么就表示此<match>单元针对的是扫描字体以创建内部配置数据的初始化阶段(FcConfigParse)。

<test qual="品质" name="属性" target="目标" compare="比较" ignore-blanks="false">

<test>必须包含一个单独的表达式单元(其值将在运行时实时计算),用于和"目标"的"属性"(参见前面"字体属性"小节)值列表进行"比较"。
"compare"的默认值是"eq"[等于],"比较"有:"not_eq"[不等于], "less"[小于], "less_eq"[小于等于],"more"[大于], "more_eq"[大于等于], "contains"[包含(字符串)], "not_contains"[不包含(字符串)]。
"qual"的默认值是"any",表示只要"属性"值列表中有任意一项"比较"成功,就算测试成功。
如果"品质"是"all",那么只有"属性"值列表中的所有项全都"比较"成功,才能算测试成功。
如果"品质"是"first",那么"属性"值列表中的第一项必须"比较"成功,才能算测试成功。
如果"品质"是"not_first",那么"属性"值列表中的第一项必须"比较"失败,同时后继项中又有至少一项"比较"成功,才能算测试成功。
"目标"的默认值是"default",表示继承外层<match>单元的值。当外层是<match target="font">时,可将"目标"设为"pattern",以强迫此<test>作用于原始的字体模板,而不是选中的字体。
'ignore-blanks'仅在 compare="eq" 或 compare="not_eq" 的情况下才有意义,默认是"false",表示任何字符串中的空白在"比较"时都会被保留,如果设为"true",则表示在"比较"时忽略字符串中的空白。

<edit name="属性" mode="修改方式" binding="绑定">

<edit>包含一系列特定顺序的表达式单元(其值将在运行时实时计算),用于修改"目标"(来自外层<match>单元)的"属性"值列表。
"表达式单元"是指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <name>, <const>,<or>, <and>, <eq>, <not_eq>, <less>, <less_eq>, <more>, <more_eq>, <contains>, <not_contains>,<plus>, <minus>, <times>, <divide>, <not>, <if>,<floor>, <ceil>, <round>, <trunc>
"绑定"仅在 name="family" 的情况下才有意义(参见前面的字体匹配规则特例)。
其默认值是"weak",表示弱绑定;若设为"strong",则表示强绑定;而设为"same",则表示不改变当前的绑定。
至于如何修改,则与两个因素有关:(1)"修改方式",(2)此<edit>的"属性"是否与同<match>内某个<test>的"属性"相同。
具体如下表所示:

      "修改方式"              有相同"属性"              无相同"属性"
      ---------------------------------------------------------------------
      "assign"(默认值)        替换第一个匹配的值        替换全部值
      "assign_replace"        替换全部值                替换全部值
      "prepend"               在第一个匹配的值之前插入  在值列表的首部插入
      "prepend_first"         在值列表的首部插入        在值列表的首部插入
      "append"                在第一个匹配的值之后添加  在值列表的尾部添加
      "append_last"           在值列表的尾部添加        在值列表的尾部添加
      "delete"                删除第一个匹配的值        删除全部值
      "delete_all"            删除全部值                删除全部值

<alias binding="绑定">

<alias>单元为修改字族名称提供了一种专门的速记法(有画蛇添足之嫌)。
"绑定"的默认值是"weak",表示弱绑定;若设为"strong",则表示强绑定;而设为"same",则表示不改变当前的绑定。
<alias>必须首先包含一个单独的<family>单元,然后再依次包含:0或1个<prefer>单元、0或1个<accept>单元、0或1个<default>单元。
这种标记法等价于如下结构:
      <match>
        <test name="family" ignore-blanks="true"><string value=[family]/></test>
        <edit name="family" binding="绑定" mode="prepend"> <string value=[prefer]/> ... </edit>
        <edit name="family" binding="绑定" mode="append"> <string value=[accept]/> ... </edit>
        <edit name="family" binding="绑定" mode="append_last"> <string value=[default]/> ... </edit>
      </match>

<family>

用于容纳一个单独的字族名称。

<prefer>, <accept>, <default>

这些单元可以容纳一系列特定顺序的<family>单元。

<int>, <double>, <string>, <bool>

这些单元必须按照其声明的类型容纳一个单独的常量值。<bool>只能容纳 true 或者 false 。
此外,浮点数必须以数字开头,而不能以小数点开头(例如:必须使用 0.5 而不是 .5 ,而对于负数,则必须使用 -0.5 而不是 -.5 )。

<matrix>

<matrix>必须包含4个<double>单元,以指定仿射变换的四个系数(用于合成斜体)。
此外,也可以用表达式单元(参见前面的解释)来替换<double>单元,但是每个表达式单元的计算结果都必须是数值。

<range>

<range>通过包含两个<int>单元界定一个整数范围(包括两端的整数)。

<charset>

<charset>可以包含任意数量的 <int>, <range> 单元,用于表示一组Unicode码位(code point)。
由于每个码位都是一个正整数,都对应着一个Unicode字符,所以<charset>单元相当于定于了一个字符集。

<langset>

<langset>必须包含至少一个<string>单元,而每个<string>单元必须包含一个符合RFC-3066规范的语言标记(语言[-国家])。

<name target="目标">

<name>必须包含一个字体属性的名称,而单元的值则等于"目标"的该属性值列表中的第一个值。
"目标"的默认值是"default",表示继承外层<match>单元的值。唯一的例外是:
当外层是<match target="font">时,可将"目标"设为"pattern",以强迫此<name>作用于原始的字体模板,而不是选中的字体。

<const>

<const>必须包含一个下表中的常量名称。表中的数值总是整数,并且这些常量只能作为对应属性值的字符记号使用。

      常量            属性            数值  [译者注]
      ----------------------------------------------------
      thin            weight          0
      extralight      weight          40
      ultralight      weight          40
      light           weight          50
      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
      roman           slant           0     [正体]
      italic          slant           100   [斜体]
      oblique         slant           110   [合成斜体]
      ultracondensed  width           50
      extracondensed  width           63
      condensed       width           75
      semicondensed   width           87
      normal          width           100
      semiexpanded    width           113
      expanded        width           125
      extraexpanded   width           150
      ultraexpanded   width           200
      proportional    spacing         0    [比例,也就是非等宽,也就是没有统一的宽度,每个字符的宽度都不同]
      dual            spacing         90   [双宽,只有两个固定的宽度,通常是一个全角=两个半角,例如"SimHei"与"幼圆"]
      mono            spacing         100  [等宽,只有一个固定的宽度,也就是每个字符的宽度都完全相同,例如"Courier"]
      charcell        spacing         110  [字符单元,仅用于纯点阵字体,例如"Unifont"]
      unknown         rgba            0    [未知]
      rgb             rgba            1    [横向(水平)"Red Green Blue",这是最常见的LCD]
      bgr             rgba            2    [横向(水平)"Blue Green Red"]
      vrgb            rgba            3    [纵向(垂直)"Red Green Blue"]
      vbgr            rgba            4    [纵向(垂直)"Blue Green Red"]
      none            rgba            5    [无子像素,也就是非LCD屏,例如传统的CRT显示器]
      lcdnone         lcdfilter       0    [彻底关闭 LCD filter,不推荐,它会导致笔画边缘出现彩色边纹]
      lcddefault      lcdfilter       1    [最大限度的消除彩色边纹,但是可能会增加笔画的模糊程度。多数场合这是最佳选择]
      lcdlight        lcdfilter       2    [减轻笔画的模糊程度,但不能最大限度的消除彩色边纹。少数场合也许效果更好]
      lcdlegacy       lcdfilter       3    [为了与传统的"libXft color filter"兼容而设置,未来会被删除]
      hintnone        hintstyle       0    [禁用微调(包括自动微调与内嵌微调)]
      hintslight      hintstyle       1    [优先保持字符的形态,但是可能会降低笔画的锐利度]
      hintmedium      hintstyle       2    [在字符形态与笔画锐利度之间进行折中,实际效果通常相当于"hintfull"]
      hintfull        hintstyle       3    [优先提高笔画的锐利度,但是可能破坏字符的形态]

<or>, <and>, <plus>, <minus>, <times>, <divide>

这些单元都必须包含至少两个表达式单元(参见前面的解释),然后对它们进行相应的运算:
<or>(或);<and>(与);<plus>(加);<minus>(减);<times>(乘);<divide>(除)。
注意,<or>与<and>执行的是逻辑运算(而不是位运算)。

<eq>, <not_eq>, <less>, <less_eq>, <more>, <more_eq>, <contains>, <not_contains>

这些单元都必须包含恰好两个表达式单元(参见前面的解释),然后对它们进行相应的运算:
<eq>(等于);<not_eq>(不等于);<less>(小于);<less_eq>(小于等于);<more>(大于);
<more_eq>(大于等于);<contains>(包含);<not_contains>(不包含)。
他们都会得到一个逻辑结果(true 或 false)。

<not>, <floor>, <ceil>, <round>, <trunc>

这些单元都必须包含恰好一个表达式单元(参见前面的解释),然后对它们进行相应的运算。
<not>执行的是逻辑运算(而不是位运算),会得到一个逻辑结果(true 或 false)。
其他都是算术运算,都会得到一个整数:
<floor>表示向下取整;<ceil>表示向上取整;<round>表示四舍五入;<trunc>表示去掉小数部分。

<if>

<if>必须包含恰好三个表达式单元(参见前面的解释)。
如果第一个表达式的值是真,那么整个单元的值就取第二个表达式的值,否则就取第三个表达式的值。

参考:

https://wiki.archlinux.org/index.php/Fonts
https://wiki.archlinux.org/index.php/Font_configuration
http://www.jinbuguo.com/gui/linux_fontconfig.html
http://www.jinbuguo.com/gui/fonts.conf.html

-------------本文结束感谢阅读-------------

欢迎关注我的其它发布渠道