FONTS-CONF(5) FONTS-CONF(5)
名称
fonts.conf -- 字体配置文件
文件概要
/etc/fonts/fonts.conf
/etc/fonts/fonts.dtd
/etc/fonts/conf.d/
$XDG_CONFIG_HOME/fontconfig/conf.d/
$XDG_CONFIG_HOME/fontconfig/fonts.conf
~/.fonts.conf.d/
~/.fonts.conf
描述
Fontconfig 是一个字体配置函数库,它既提供全局范围的配置,也允许每个用户进行个性化的配置,应用程序可以通过它访问字体。
功能概览
Fontconfig 由两个模块组成:
(1)配置模块,用于解析XML格式的配置文件;
(2)匹配模块,根据应用程序请求的字体模式(pattern),返回最匹配的字体。
字体配置
配置模块由以下三部分组成:
(1)保存配置信息的 FcConfig 数据类型、(2)解析XML文本的 libexpat 库、(3)提取配置信息的 FcConfigParse 函数。
其中,FcConfigParse 函数的作用是将XML格式的配置文件中的数据提取出来,填充到数据类型为 FcConfig 的变量中。
从外部来看,配置 Fontconfig 库,就是编写一个有效的XML配置文件并将其交给 FcConfigParse 函数处理。
这样做的目的是为了让字体的配置变得相对静态,并且尽可能广泛地在多个应用程序之间共享。
这样,在应用程序之间传递字体名称(见后文的"Font Name")时,可以获得一致的字体选择。
而选用XML作为配置文件的格式,是因为它既便于外部程序编辑、又有严谨的结构和语法。
字体的配置(其实就是<match target="scan">)与字体的匹配(matching)是两个相互独立的部分。
因为某些应用程序希望使用其自身特有的字体匹配方式,它们只需要通过 Fontconfig 库获得已有的字体列表,即可执行独立的匹配操作。
这种将配置与匹配分离的做法可以将所有应用程序的字体配置集中到一处。集中的字体配置可以简化和标准化字体的安装和个性化设置。
字体属性
虽然字体模式(pattern)理论上可以包含任意属性,但还是有一些约定俗成的属性及其类型。
Fontconfig 利用其中的一些属性来做字体匹配与补全。其他的属性则被用于为应用程序的渲染机制提供辅助信息。
[说明]所谓"补全"是指:当应用程序提交的字体模式缺少某些属性时,Fontconfig 会通过其内置的推测规则"补全"这些属性。
属性(Property) 类型 描述[以"微软雅黑粗体"为例,将其对应的属性值放于{}中]
--------------------------------------------------------------
family String 字族名称{"Microsoft YaHei" "微软雅黑"}
familylang String 每个字族名称所对应的语言{"en" "zh-cn"}
style String 字体风格名称(会覆盖slant与weight){"Bold" "Félkövér" "Полужирный" ...}
stylelang String 每个字体风格名称所对应的语言{"en" "hu" "ru" ...}
fullname String 字体全名(通常包含style){"Microsoft YaHei Bold" "微软雅黑 Bold" ...}
fullnamelang String 每个字体全名所对应的语言{"en" "zh-cn" ...}
slant Int 倾斜度{0}。分为:Italic(100,斜体), oblique(110,合成斜体), roman(0,正体)
weight Int 粗细程度{200},从0-210,由最细到最粗。例如:light(50,细), regular(80,一般), medium(100,中等), bold(200,粗)
width Int 宽度{100},从50-200,由最窄到最宽。例如:condensed(75,压缩), normal(100,正常), expanded(125,加宽)
size Double 磅大小(point size),单位是绝对大小的"磅"(=1/72英尺)。[默认值是"12"]
pixelsize Double 像素大小(pixel size),单位是显示屏上的"像素"。[pixelsize = (size*scale*dpi)/72]
aspect Double 在微调(hinting)前将字形(glyph)水平拉宽的倍数。
spacing Int 字符间距。分为:proportional(0,变宽), dual(90,双宽), mono(100,等宽), charcell(110,字符单元)
foundry String 字体制造商名称{"microsoft"}
antialias Bool 渲染字形(glyph)时是否开启抗锯齿功能[建议对矢量字体设为"true"]
hinting Bool 渲染字形(glyph)时是否开启微调功能(包括内嵌微调与自动微调)[建议对矢量字体设为"true"]
autohint Bool "true"表示只使用自动微调;"false"表示优先使用内嵌微调,但对于没有内嵌微调的字体仍会使用自动微调。[建议设为"false"]
hintstyle Int 微调的程度(同时作用于内嵌微调与自动微调)。分为:none(0,关闭), slight(1,轻度), medium(2,中度), full(3,完全)
verticallayout Bool 是否采用竖直排版
globaladvance Bool 是否使用字体提供的全局间距值(即将被废弃)
file String 字体文件的名称
index Int 字体文件内该字体的索引号,由"0"开始计数。
ftface FT_Face 使用指定的 Freetype face 对象
rasterizer String 使用哪种渲染引擎(rasterizer)(即将被废弃)
outline Bool 字形(glyph)是否具有轮廓线{True}
scalable Bool 字形(glyph)是否可以缩放{True}
scale Double 磅->像素(point->pixel)的缩放系数[默认值是"1"]
dpi Double 目标dpi(像素/英寸)值
rgba Int LCD子像素的排列顺序。分为:unknown(0,未知), rgb(1), bgr(2), vrgb(3), vbgr(4), none(5,无子像素)。
lcdfilter Int LCD filter 的风格
minspace Bool 是否消除行间距(也就是使用最小行间距)
charset CharSet 字体所支持的Unicode字符的列表{太长,省略}
lang String 字体所支持的RFC-3066语言的列表{"aa|af|av|ay|...|zh-cn|zh-sg|zu|..."}
fontversion Int 字体的版本号{401080}
capability String 字体的排版功能列表{"otlayout:hani"}
embeddedbitmap Bool 是否使用字体中内嵌的点阵字形
embolden Bool 字形渲染引擎(rasterizer)是否应该以合成的方式加粗[例如在偏移1像素的地方重绘一次,造成粗体的假象]
fontfeatures String 要开启的OpenType特性标记(feature tag)列表
prgname String 正在运行的程序的名称
[提示1]有关 Int 类型的详细说明,可以参考下面对<const>单元的说明。
[提示2]可以用 fc-query /path/to/foo.ttf 查看字体的属性
字体匹配
Fontconfig 将接收到的字体模板(pattern)和系统中所有可用字体逐一对比,计算两者的差距(distance),差距最小的字体将被选中。
这样可以确保在任何时候都能返回一个字体,但无法保证所返回的字体一定与模板的要求完全吻合。
要进行字体匹配,应用程序必须首先创建一个字体模板,并在其中包含所期望的字体的所有属性。
模板中的每个属性都可以包含按照优先级排列的多个值:越靠前的值,优先级越高。
也就是说,如果现有字体中有两个字体分别匹配同一个属性的两个值,那么匹配较前的值的字体被认为"差距更小",或者说"更为接近"。
在真正开始匹配字体之前,Fontconfig 会首先按照配置文件的要求(一系列<match target="pattern">配置块),
对应用程序创建的字体模板进行第一次修改。修改的过程包括<test>与<edit>两个步骤:
首先用一系列<test>指令进行匹配,然后再用一系列<edit>指令进行修改,而<test>与<edit>的执行顺序就是它们在配置文件中出现的顺序。
同样,每个<match target="pattern">配置块也会按照它们在配置文件中出现的顺序依次执行。
完成对字体模板的第一次修改之后,Fontconfig 将会继续对其执行一系列默认的替换操作,从而得到一组规范化的属性(包含了全部要素)。
这样就可以避免底层的渲染程序一直为各种未指定的属性提供默认值。
字体模板经过第一次修改与规范化两个步骤之后,现在终于可以用来和系统中的字体进行匹配了。
模板和系统中每个字体的差距(distance)通过以下属性进行计算(按照优先级排序,属性越靠前,优先级越高):
foundry, charset, family, lang, spacing, pixelsize, style, slant, weight, antialias, rasterizer, outline
上述规则中有一个特例需要特别注意:字族名称(family)分为强(strong)和弱(weak)两种不同的绑定(binding)。
强字族名称比语言属性(lang)的优先级要高,而弱字族名称则比语言属性(lang)的优先级要低。
[译者注]强绑定(s)与弱绑定(w)可以看成是涂在family列表中每个字族名称上的颜色。在 Fontconfig 最初接收到的字体模板中,
family列表中的每一项初始颜色大多是(s)[也可能有少部分(w)],但是经过第一次修改(也就是一系列<edit>与<alias>)之后,
family列表的不同位置可能会被插入不同颜色的项(默认为'w'),同时原有的项也可能在替换时被改变颜色(默认为'w'),
甚至某些项还可能会被删除,最后就变成了一个两种颜色混杂的family列表。
举例来说,假定原始的family列表是:A(s),B(s),C(s),D(s),E(s),F(s),G(s),H(w);经过第一次修改之后,
可能会变成(大小写变化表示替换):1(w),A(s),2(w),b(w),3(s),4(s),5(w),D(w),6(s),e(s),7(w),F(s),8(w),G(s),H(w),9(s);
其中(s)颜色的字族名称的优先级高于语言属性(lang),而(w)颜色的字族名称的优先级则低于语言属性(lang)。
如果假定"lang=xx",并且仅有 b,G,H,4,5,8 项的lang属性中含有"xx",而其他项的lang属性中都不含有"xx",
那么综合"lang=xx"因素之后,family列表中每一项的实际优先级将变成:
A(s),3(s),4(s),6(s),e(s),F(s),G(s),9(s), b(w),5(w),8(w),H(w), 1(w),2(w),D(w),7(w)
如果字体模板中出现字体本身所没有的属性,那么这些属性将会被按原样保留。
这样就可以确保向字体渲染引擎传递的渲染指令和其它数据,不会受到前述的修改与规范化两个步骤的干扰。
经过规范化之后的字体模板,将被按照配置文件的要求(一系列<match target="font">配置块)进行第二次修改。
修改规则与第一次修改完全相同。最终,经过"第一次修改-规范化-第二次修改"处理的字体模板将会被返回给应用程序。
最终返回的字体模板已经包含了充足的字体定位和渲染信息(包括文件名、像素大小以及其他各种渲染数据)。
由于不包含任何专属于 FreeType 库的信息,所以应用程序可以自由选择渲染引擎,甚至直接访问字体文件。
如前所述,对字体模板的修改实际上是分两次进行的,因为本质上就需要有两个不同操作:
第一次修改决定了如何选取字体:主要是修正字族名称,以及添加合适的默认值。
第二次修改决定了如何渲染已选定的字体:这个步骤必须作用在已选定的字体上,而不能作用在原始的字体模板上。
字体名称(注意,是"Font Name"而不是"Family Name"[字族名称])
Fontconfig 为字体模板(pattern)规定了一种文本格式,这种格式被称为"Font Name"(字体名称)。
它既是 Fontconfig 接受的格式,也是 Fontconfig 返回格式。
这种格式由三个部分组成:(1)字族名称列表,(2)磅大小列表,(3)附加的属性值列表。具体如下:
<families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...
属性的名称(name)不需要包含任何字族名称(families)或者磅大小(point sizes)。
如果属性值(values)是一个列表,那么必须用逗号分隔其中的每个项。
此外,还有一些符号常量可以同时指定属性的名称和值。下面是一些例子:
字体名称 含义
----------------------------------------------------------
Times-12 12 磅大小的 Times 正体(Roman)
Times-12:bold 12 磅大小的 Times 粗体(Bold)
Courier:italic 默认大小的 Courier 斜体(Italic)
Monospace:matrix=1 .1 0 1 采用合成斜体(obliquing)的用户首选的等宽字体
[注]由于"matrix"不是字体属性,所以"matrix=1 .1 0 1"会原封不动的返回给应用程序。
字族名称(family)中的 '\', '-', ':', ',' 字符必须要使用'\'进行转义。
类似的,属性值(values)中的 '\', '=', '_', ':', ',' 也必须要使用'\'进行转义。
调试
为了帮助诊断字体和应用的各种问题,fontconfig 内置了许多调试功能。这些调试功能可以通过 FC_DEBUG 环境变量进行控制。
这个环境变量是个整数值,它的每个位都对应着一类调试信息。具体如下:
Name Value Meaning
---------------------------------------------------------
MATCH 1 显示字体匹配的简要信息
MATCHV 2 显示字体匹配的扩展信息
EDIT 4 监视 match/test/edit 的执行
FONTSET 8 在启动时跟踪字体信息的加载
CACHE 16 显示字体缓存变化的简要信息
CACHEV 32 显示字体缓存变化的扩展信息
PARSE 64 (已废弃)
SCAN 128 显示扫描字体文件并创建缓存的过程
SCANV 256 显示扫描字体文件的详细信息
MEMORY 512 监视 fontconfig 的内存使用量
CONFIG 1024 监视加载了哪些配置文件
LANGSET 2048 显示用来创建 lang 的字符集
OBJTYPES 4096 显示值类型检查失败的消息
将你期望看到的调试信息类别所对应的 Value 值相加,然后赋给 FC_DEBUG 环境变量,再运行应用程序就可以在 stdout 上看到调试信息了。
[例子]假如你想查看'Courier,mono'的匹配过程,可以在命令行上运行: FC_DEBUG=5 fc-match -s 'Courier,mono'
语言标记(Lang Tag)
数据库中的每种字体都包含一个它所支持的语言的列表。
该列表是通过比较该字体的 Unicode 覆盖范围和每种语言的正字法(orthography,界定了每种语言的字符范围)之后计算出来的。
语言的标记符合 RFC-3066 规范,形如"语言[-国家]"(中括号表示可以省略)。
"语言"部分是一个符合 ISO 639 规范的语言标记,而"国家"部分是一个符合 ISO 3166 规范的国家代码。
Fontconfig 内置了多种语言的正字法。除非重新编译函数库,否则无法添加新的正字法。
Fontconfig 目前支持 ISO639-1 命名的139种语言中的122种,以及 ISO 639-2 中141种双字母编码的语言和另外30种三字母编码的语言。
对于那些同时具备双字母编码与三字母编码的语言,仅提供双字母编码标记。
对于那些在不同地区分别使用不同字符集的语言,fontconfig 会针对每个不同的地区使用不同的正字法。
例如:阿塞拜疆语,库尔德语,普什图语,提格里尼亚语,汉语。
配置文件的格式
fontconfig 的配置文件以XML格式存储。XML格式的优点是易于外部配置工具的编辑,同时又拥有严谨的语法结构。
由于XML文件是纯文本文件,专家级的用户还可以直接用文本编辑器处理它们。
Fontconfig 文档类型定义在外部实体"fonts.dtd"中,该文件通常位于默认的字体设置目录(/etc/fonts)。
每个配置文件必须包含如下结构:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
...
</fontconfig>
<fontconfig>
这是字体配置的顶层单元,可以包含0或1个 <config>, <selectfont> 单元,
以及任意数量的 <dir>, <cachedir>, <include>, <match>, <alias> 单元。
<dir prefix="default">
这个单元包含一个目录名称,Fontconfig 将会扫描其中的字体文件,然后将找到的字体添加到系统的可用字体列表中。
如果将'prefix'设为"xdg",那么环境变量 XDG_DATA_HOME 的值将会被作为前缀添加到路径的头部。
详情参见"XDG Base Directory Specification"。
<cachedir prefix="default">
这个单元包含一个目录名称(以'~'开头则表示位于用户的家目录中),用于保存字体属性的缓存(为了加速之后的读取)。
默认值是"$XDG_CACHE_HOME/fontconfig"。详情参见"XDG Base Directory Specification"。
如果将'prefix'设为"xdg",那么环境变量 XDG_CACHE_HOME 的值将会被作为前缀添加到路径的头部。
如果配置文件中包含多个<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"),那么将不会对丢失的文件或目录发出警告。
如果将'prefix'设为"xdg",那么环境变量 XDG_CONFIG_HOME 的值将会被作为前缀添加到路径的头部。
详情参见"XDG Base Directory Specification"。
<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>单元可以容纳一个shell风格的文件名匹配模式(包含"?"和"*"),用于根据字体的全路径名称进行匹配。
可以用于匹配一组特定目录(例如:/usr/share/fonts/uglyfont*)中的字体,或者用于匹配具有特定后缀名(例如:*.pcf.gz)的字体。
不过,基于后缀名的匹配并不总是那么可靠,因为并非所有字体文件的命名都十分规范。
此外,需要注意的是,<glob>单元仅可作用于目录,而不能作用于单个字体。
<pattern>
<pattern>通过包含任意数量的<patelt>单元,将字体的属性值与<patelt>单元列出的属性值列表进行比较,
如果每个<patelt>单元列出的属性值列表中都至少有一项与输入字体对应的属性值相符,
那么就表示该字体与整个<pattern>单元的要求相符合。
这样就可以基于字体的属性(缩放,粗细等)来匹配字体,这可比根据字体文件的后缀名匹配要可靠多了。
<patelt name="属性">
首先,必须明确指定"属性",以表明该<patelt>单元要比较的是字体的哪个属性。
其次,<patelt>又通过包含一系列常量单元,来指定可与该属性匹配的值列表。
"常量单元"是指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <const>
<match target="目标">
<match>必须首先包含一系列<test>组成的列表(可以为空),然后再包含一系列<edit>组成的列表(可以为空),
也就是<test>列表必须位于<edit>列表之前。注意:虽然两个列表都可以为空,但是不可以同时为空。
如果"目标"满足<test>列表的所有测试条件,那么将被按照<edit>列表中的指令序列进行修改。
"目标"的默认值是"pattern",表示此<match>单元针对的是用于匹配的字体模板(第一次修改)。
如果"目标"的值是"font",那么就表示此<match>单元针对的是已被选定的字体(第二次修改)。
如果"目标"的值是"scan",那么就表示此<match>单元针对的是扫描字体以创建内部配置数据的初始化阶段(FcConfigParse)。
<test qual="品质" name="属性" target="目标" compare="比较" ignore-blanks="false">
<test>必须包含一个单独的表达式单元(其值将在运行时实时计算),用于和"目标"的"属性"(参见前面"字体属性"小节)值列表进行"比较"。
[译者注]如果在<test>中包含了多个表达式单元,将会被警告:"Having multiple values in <test> isn't supported ..."。
"表达式单元"是指:<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>
"比较"的默认值是"eq"[等于],其他还有:"not_eq"[不等于], "less"[小于], "less_eq"[小于等于],
"more"[大于], "more_eq"[大于等于], "contains"[包含(字符串)], "not_contains"[不包含(字符串)]。
"品质"的默认值是"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>单元。
[译者注]如果在<alias>中包含了多个<family>单元,将会被警告:"Having multiple <family> in <alias> isn't supported ..."。
这种标记法等价于如下结构:
<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>必须包含恰好三个表达式单元(参见前面的解释)。
如果第一个表达式的值是真,那么整个单元的值就取第二个表达式的值,否则就取第三个表达式的值。
配置文件示例
系统配置文件
这是一个针对全系统范围的配置文件示例,文件位于 /etc/fonts/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf 文件用于全系统范围的配置 -->
<fontconfig>
<!-- 在下列目录中寻找字体 -->
<dir>/usr/share/fonts</dir>
<dir>/usr/X11R6/lib/X11/fonts</dir>
<!-- 将过时的 'mono' 别名替换为规范的 'monospace' -->
<match target="pattern">
<test qual="any" name="family"><string>mono</string></test>
<edit name="family" mode="assign"><string>monospace</string></edit>
</match>
<!-- 将所有无法识别的别名统一替换成 'sans-serif' -->
<match target="pattern">
<test qual="all" name="family" mode="not_eq"><string>sans-serif</string></test>
<test qual="all" name="family" mode="not_eq"><string>serif</string></test>
<test qual="all" name="family" mode="not_eq"><string>monospace</string></test>
<edit name="family" mode="append_last"><string>sans-serif</string></edit>
</match>
<!-- 加载用户自己定制配置文件,但是即使文件不存在,也不报警 -->
<include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>
<!-- 加载本地定制的配置文件,但是即使文件不存在,也不报警 -->
<include ignore_missing="yes">conf.d</include>
<include ignore_missing="yes">local.conf</include>
<!-- 将一些著名的 Type1 字体替换为对应的 TrueType 版本,以改善屏幕显示效果 -->
<alias>
<family>Times</family>
<prefer><family>Times New Roman</family></prefer>
<default><family>serif</family></default>
</alias>
<alias>
<family>Helvetica</family>
<prefer><family>Arial</family></prefer>
<default><family>sans</family></default>
</alias>
<alias>
<family>Courier</family>
<prefer><family>Courier New</family></prefer>
<default><family>monospace</family></default>
</alias>
<!-- 为标准的字族名称提供所需的别名,把这个配置段放在用户自己定制配置文件之后,以确保能够覆盖用户的设置 -->
<alias>
<family>serif</family>
<prefer><family>Times New Roman</family></prefer>
</alias>
<alias>
<family>sans</family>
<prefer><family>Arial</family></prefer>
</alias>
<alias>
<family>monospace</family>
<prefer><family>Andale Mono</family></prefer>
</alias>
<-- 如果'family'包含 'Courier New' 或 'Courier',那么就将'monospace'添加为备选 -->
<match target="pattern">
<test name="family" mode="eq"><string>Courier New</string></test>
<edit name="family" mode="prepend"><string>monospace</string></edit>
</match>
<match target="pattern">
<test name="family" mode="eq"><string>Courier</string></test>
<edit name="family" mode="prepend"><string>monospace</string></edit>
</match>
</fontconfig>
用户配置文件
这是一个针对单个用户的配置文件示例,文件位于 $XDG_CONFIG_HOME/fontconfig/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- $XDG_CONFIG_HOME/fontconfig/fonts.conf 针对单个用户的配置文件 -->
<fontconfig>
<!-- 私人专用的字体文件目录 -->
<dir prefix="xdg">fonts</dir>
<!-- 指定LCD屏次像素的排列顺序为"rgb"。由于次像素平滑只影响渲染而不影响匹配,所以应该总是使用 target="font" -->
<match target="font">
<edit name="rgba" mode="assign"><const>rgb</const></edit>
</match>
<!-- 当要求显示中文有衬线字体的时候,使用"WenQuanYi Zen Hei"(文泉驿正黑) -->
<match>
<!-- 如果你不想为所有中文都使用文泉驿正黑,可以将 zh 替换为 zh-tw 或 zh-cn 等。 -->
<!-- 注意:即使设为 zh-cn 也依然匹配 zh ,如果你需要精确的匹配,应使用 compare="eq" -->
<test name="lang" compare="contains"><string>zh</string></test>
<test name="family"><string>serif</string></test>
<edit name="family" mode="prepend"><string>WenQuanYi Zen Hei</string></edit>
</match>
<!-- 当要求显示日文无衬线字体的时候,使用"VL Gothic" -->
<match>
<test name="lang" compare="contains"><string>ja</string></test>
<test name="family"><string>sans-serif</string></test>
<edit name="family" mode="prepend"><string>VL Gothic</string></edit>
</match>
</fontconfig>
文件
fonts.conf
是 fontconfig 库的主配置文件,使用 XML 格式。
conf.d
是外部应用程序或本地系统管理员用来保存额外配置文件的目录。
其中包含的配置文件必须是XML格式,文件名必须以ASCII十进制数字开头,并以字典顺序排序。
主配置文件 fonts.conf 通过<include>单元引用此目录。
fonts.dtd
是描述配置文件语法规则的DTD文件
$XDG_CONFIG_HOME/fontconfig/conf.d
~/.fonts.conf.d
是每个用户用来保存额外配置文件的目录(通常是自动生成的)。其实际位置由主配置文件 fonts.conf 指定。
需要注意的是 ~/.fonts.conf.d 已经被反对使用,并会在未来的版本中不再被默认读取。
$XDG_CONFIG_HOME/fontconfig/fonts.conf
~/.fonts.conf
是每个用户的个性化配置文件。其实际位置由主配置文件 fonts.conf 指定。
需要注意的是 ~/.fonts.conf 已经被反对使用,并会在未来的版本中不再被默认读取。
$XDG_CACHE_HOME/fontconfig/*.cache-*
~/.fontconfig/*.cache-*
当没有在主缓存目录(<cachedir>)中发现字体的缓存信息时,就会在这些文件中缓存字体的信息。
这些文件由 fontconfig 自动维护。
需要注意的是 ~/.fontconfig/*.cache-* 已经被反对使用,并会在未来的版本中不再被默认读取。
环境变量
FONTCONFIG_FILE
用于指定主配置文件
FONTCONFIG_PATH
用于指定保存额外配置文件的目录
FC_DEBUG
用于指定输出哪些调试信息。参见前面的"调试"小节
FONTCONFIG_USE_MMAP
接受一个bool值,用于控制在访问缓存文件时,是否使用 mmap(2) 系统调用接口。
默认情况下,fontconfig 将会检查缓存文件所在的文件系统是否可以安全的使用 mmap(2) 功能。
明确设置此变量之后,将会跳过这个检测,强制使用或禁用 mmap(2) 功能。
参见
fc-cat(1), fc-cache(1), fc-list(1), fc-match(1), fc-query(1)