原文见http://edyfox.codecarver.org/html/debian_testing_chinese.html
中文字体美化是个很讨厌的事情, 无数初学者在这里面浪费了无数时间, 做了无数没有意义的事情。 但这也是不得不做的, firefly 为字体美化做了卓越的贡献, 却至今没能把他的工作直接合并进相关的官方源代码中, 无奈。 我把 Debian Etch 所需要的中文字体美化操作步骤详细记录在这里, 希望能节约大家一部分时间。
1 安装必要的字体包
首先, 我们的字体美化依赖 Bitstream Vera 系列字体, 因此我们首先安装这个软件包:
其次, 因为是“中文”美化, 因此必须有中文字体。 “文泉驿”是一个非常漂亮的点阵字体, 但它只能提供 9pt、10.5pt、11pt、12pt 等少数几个尺寸 (96dpi), 其它尺寸下都无法正常显示, 因此我们使用“文鼎PL细上海宋Uni”作为补充。 顺便说一句, 上海宋也提供了内置点阵, 虽然没有文泉驿那么好看, 但作为日常工作已经没有什么太大问题。 有了这些东西在手上, 我们不一定非得偷盗版的 SimSun 才能生活。
如果不打算使用盗版 SimSun 的话, 请安装以下软件包:
- ttf-arphic-ukai
- ttf-arphic-uming
- xfonts-wqy
2 修改配置文件
安装完字体包后, 我们再修改几个配置文件, 就可以获得非常好的显示效果了。
首先将这个文件命名为 65-fonts-cjk.conf, 存放到 /etc/fonts/conf.avail/ 下。
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>Bitstream Vera Serif</family>
<family>DejaVu Serif</family>
<family>Times New Roman</family>
<family>SimSun</family>
<family>NSimSun</family>
<family>WenQuanYi Bitmap Song</family>
<family>AR PL ShanHeiSun Uni</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Bitstream Vera Sans</family>
<family>DejaVu Sans</family>
<family>Arial</family>
<family>SimSun</family>
<family>NSimSun</family>
<family>WenQuanYi Bitmap Song</family>
<family>AR PL ShanHeiSun Uni</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Bitstream Vera Sans Mono</family>
<family>DejaVu Sans Mono</family>
<family>Courier New</family>
<family>SimSun</family>
<family>NSimSun</family>
<family>WenQuanYi Bitmap Song</family>
<family>AR PL ShanHeiSun Uni</family>
</prefer>
</alias>
<match target="pattern" >
<test name="family" qual="any" >
<string>WenQuanYi Bitmap Song</string>
</test>
<test compare="more_eq" name="pixelsize" qual="any">
<double>17</double>
</test>
<edit mode="assign" name="family" >
<string>AR PL ShanHeiSun Uni</string>
</edit>
</match>
<match target="pattern" >
<test name="family" qual="any" >
<string>WenQuanYi Bitmap Song</string>
</test>
<test compare="less" name="pixelsize" qual="any">
<double>12</double>
</test>
<edit mode="assign" name="family" >
<string>AR PL ShanHeiSun Uni</string>
</edit>
</match>
</fontconfig>
|
然后将这个文件命名为 90-synthetic-cjk.conf, 存放到 /etc/fonts/conf.avail/ 下。 由于这个文件中存在一些 GBK 编码无法显示的字符, 因此网页中的文件和我系统中实际的文件有少许差异, 可以点击这里下载完整版。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern" >
<test name="family" qual="any" >
<string>sans-serif</string>
</test>
<edit mode="append" binding="strong" name="family" >
<string>Bitstream Vera Sans</string>
</edit>
</match>
<match target="pattern" >
<test name="family" qual="any" >
<string>serif</string>
</test>
<edit mode="append" binding="strong" name="family" >
<string>Bitstream Vera Serif</string>
</edit>
</match>
<match target="pattern" >
<test name="family" qual="any" >
<string>monospace</string>
</test>
<edit mode="append" binding="strong" name="family" >
<string>Bitstream Vera Sans Mono</string>
</edit>
</match>
<match target="font">
<edit name="embolden" mode="assign">
<bool>false</bool>
</edit>
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
</match>
<match target="font">
<!-- check to see if the font is just regular -->
<test name="weight" compare="less_eq">
<int>100</int>
</test>
<!-- check to see if the pattern requests bold -->
<test target="pattern" name="weight" compare="more_eq">
<int>180</int>
</test>
<test compare="contains" name="lang">
<string>zh-cn</string>
<string>zh-tw</string>
<string>ja</string>
<string>ko</string>
</test>
<!-- set the embolden flag -->
<edit name="embolden" mode="assign">
<bool>true</bool>
</edit>
</match>
<match target="font">
<test compare="eq" name="family">
<!-- Chinese Simplified -->
<string>SimSun</string>
<string>宋体</string>
<string>NSimSun</string>
<string>新宋体</string>
<string>AR PL ShanHeiSun Uni</string>
<string>文鼎PL细上海宋Uni</string>
<!-- Chinese Traditional -->
<string>MingLiU</string>
<string>細明體</string>
<string>PMingLiU</string>
<string>新細明體</string>
<!-- Japanese -->
<string>MS Gothic</string>
<string>MS ゴシック</string>
<string>MS Mincho</string>
<string>MS 明朝</string>
<string>MS PGothic</string>
<string>MS Pゴシック</string>
<string>MS PMincho</string>
<string>MS P明朝</string>
<!-- Korean -->
<string>Batang</string>
<string>BatangChe</string>
<string>Dotum</string>
<string>DotumChe</string>
<string>Gulim</string>
<string>GulimChe</string>
<!-- Bitmap Font -->
<string>WenQuanYi Bitmap Song</string>
</test>
<test compare="more_eq" name="pixelsize" qual="any">
<double>12</double>
</test>
<test compare="less" name="pixelsize" qual="any">
<double>17</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
</fontconfig>
|
接下来, 我们在 /etc/fonts/conf.d/ 下创建符号链接, 指向刚才下载的两个配置文件:
# cd /etc/fonts/conf.d
# ln -s ../conf.avail/90-synthetic-cjk.conf
# ln -s ../conf.avail/65-fonts-cjk.conf
3 安装额外字体
以上配置应该能够满足日常需要了。 而且字型也足够美观大方。 如果还是觉得不满意, 非得偷盗版的 SimSun 才舒服的话, 请将偷来的文件放到 /usr/local/share/fonts 下, 然后运行 sudo fc-cache 即可。 上述配置文件已经考虑了使用 SimSun 时的美化。
华丽的分割线,前面是授人以鱼,后面是授人以渔,嘿嘿!
摘自中国Linux公社
Fontconfig用户手册
|
贴出者为 connermo
|
Linux的字体引擎已经统一采用fontconfig+xft2体系。Fontconfig负责字体的安装确认和匹配,xft2则负责字体渲染。这篇翻译的Fontconfig手册希望可以让大家更深入地了解Fontconfig的配置和机理。
原文:http://www.fontconfig.org/fontconfig-user.html
作者:Keith Packard , HP Cambridge Research Lab
翻译:Conner Mo ([email protected]) 中国Linux公社 (www.linuxfans.org )
Fonts-conf
名称
fonts.conf - 字体配置文件
文件纲要
/etc/fonts/fonts.conf
/etc/fonts/fonts.dtd
~/.fonts.conf
描述
fontconfig 是提供系统范围内字体设置,定制和允许应用程序访问的函数库。
功能概述
fontconfig 包含两个基本的模块,即读取XML文件并建立内部配置的配置模块和接受请求的字体样板并返回最接近所需字体的匹配模块。
字体设置
fontconfig的配置模块由FcConfig 数据类型,libexpat和FcConfigParse 组成。它扫描一个XML树并将其中的数据处理成一个配置文件。从外部来看,函数库的配置就是生成一个有效的XML树并将其填充到FcConfigParse里。应用程序改变运行中的函数库配置的唯一途径就是添加字体和目录到用户的字体文件列表中。
这样做的目的就是让字体的配置变得相对静态,并且可以尽可能多地让其他应用程序共享。这种做法预计可以在应用程序相互传递字体名称的时候获得相对稳定的字体选择。XML被选为配置文件的标准格式是因为它是一个既便于外部程序编辑又可以保留正确结构和语法的格式。
字体的配置和字体的是分开的。需要采取自身特定匹配方式的应用程序可以从库中访问已有的字体并执行独立的匹配操作。这样做是为了让应用程序可以从字体库中 挑选并选定合适的库功能,而不是强迫他们选择这个库或者私有的设置机制。这种做法预计可以让所有应用程序的字体配置可以集中在一处。集中的字体配置可以标 准化和简化字体安装和定制。
字体属性
虽然字体样板可能包含任意基本属性,但还是有一些众所周知的属性及其附带的类型。Fontconfig利用这些属性来匹配和完成字体配置。其他属性则被用来为应用程序的渲染机制提供方便。
属性
|
类型
|
描述
|
family
|
String
|
字体家族名称 (宋体,仿宋体等)
|
style
|
String
|
字体风格,包括粗度(weight)和倾斜度(slant)。
|
slant
|
Int
|
倾斜度,分为Italic(斜体), oblique(倾斜罗马体)或者roman(罗马体)
|
weight
|
Int
|
Light (微粗),medium(稍粗),demibold(略粗),bold(粗)或者black(黑体)
|
size
|
Double
|
尺寸大小
|
aspect
|
Double
|
在微调(hinting)前水平拉伸字体
|
pixelsize
|
Double
|
像素大小
|
spacing
|
Int
|
间距,Proportial (可变),monospace (等宽) 或者charcell (字符单元)
|
foundry
|
String
|
字体厂商名称
|
antialias
|
Bool
|
字体渲染是否采用抗锯齿功能
|
hinting
|
Bool
|
渲染引擎是否采用微调
|
verticallayout
|
Bool
|
采用竖直排版
|
autohint
|
Bool
|
采用自动微调代替普通微调
|
globaladvance
|
Bool
|
使用字体全局间距数据
|
file
|
String
|
存储字体的文件名称
|
index
|
Int
|
字体文件内的字体索引
|
ftface
|
FT_Face
|
使用指定的Freetype格式对象
|
rasterizer
|
String
|
正在使用的渲染引擎
|
outline
|
Bool
|
字型是否中空
|
scalable
|
Bool
|
字型是否可以放缩
|
scale
|
Double
|
尺寸->像素的放缩比例
|
dpi
|
Double
|
目标点数/英寸
|
rgba
|
Int
|
unkonw, rgb, brg, vrgb, vbgr, none -子像素的几何排列
|
minspace
|
Bool
|
是否采用最小行间距
|
charset
|
CharSet
|
字体的编码
|
lang
|
String
|
字体支持的RFC-3066-style 语言列表。
|
字体匹配
Fontconfig用计算输入的字体样板和现有系统中字体的距离来实现字体匹配。最接近的字体将被选择。这样可以保证任何时候都能够返回一个字体,但不能保证它和所需要的样板类似。
字体的匹配是从应用程序所创建的样板开始的。请求字体的所有属性会被搜集到一个样板里。每个属性可以包含一个或多个值。它们按照优先等级排列。匹配列表前的被认为是比符和列表后的更加接近所需属性。
最初的字体样板会按照配置文件中的编辑指令按顺序修改。每个修改的过程包括匹配和其它一系列的编辑操作,并且每个匹配的过程都会执行相应的编辑操作。
当字体样板编辑修改完后,将会执行一系列默认的替换操作,从而标准化已有的一套属性。这样可以避免较低层程序在渲染的时候为不同的字体属性提供一成不变的默认值。
标准化后的字体样板最后将和系统所有拥有的字体进行匹配。样板和字体的距离是用它的每个属性,厂商,编码,家族,语言,间距,像素大小,风格,斜度,粗度,防锯齿,渲染引擎和中空测量出来的。这个列表是按照优先级排序的,排在前面的元素比后面的元素占的比重大。
这个规则中有一个特殊的例子:家族的名称分成两个部分,strong(强)和weak (弱)。强家族名称在匹配中比语言元素优先级要高,而弱家族名称在匹配中比语言元素的优先级别要低。这样允许在文档指定字体都不存在的时候,文档的语言属性可以指导字体的选择。
代表所属字体的样板会包含所有在那个样板找到的属性,而不只是在字体中找到的。这允许应用程序通过匹配系统传送渲染指令和其它数据。最后,在配置文件中找到字体的编辑指令列表将被应用到样板。修改过的样板会返回给应用程序。
返回的值包括充足的字体定位和渲染信息,包括文件名,像素大小和其他渲染数据。因为没有任何包含的信息属于Freetype库,引用程序可以自由选择渲染引擎,甚至直接获取和访问字体文件。
在编辑文件中,匹配和编辑的序列是按照两步执行的, 因为需要有两个不同操作。第一步是修改如何选取字体,为字体家族取别名和添加合适的默认值。第二步是修改如何渲染已选择的字体。这些步骤必须应用在已选择的字体上,而不是原有的字体样板,因为经常会发生错误的匹配。
字体名称
Fontconfig 为样板提供一个可以让函数库接受和产生的文本表达。表达有三个部分,第一个是字体家族名称列表,第二个是尺寸大小列表,最后是附加属性列表:
<families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...
<家族名称>-<尺寸大小>:<名称1>=<赋值1>:<名称2>=<赋值2>...
在列表中的赋值用逗号分开。名称不需要包含家族或者尺寸大小,它们可以省略。另外,还有一些字符常量可以同时说明名称和赋值。这里有一些例子:
名称
|
含义
|
Times-12
|
尺寸12的Times Roman
|
Times-12:bold
|
尺寸12的Times粗体
|
Courier:italic
|
Courier默认尺寸的斜体
|
Monospace:matrix=1 .1 0 1
|
用户首选的采用人工斜体的等宽字体
|
语言标记
每种在数据库中的字体包括一个它所支持的语言列表。这是用比较字体的unicode范围和语言的正词法(orthography)计算出来的。语言使用一个兼容RFC-3066的命名标准并且具有两个部分——ISO693语言标记跟一个连字符,然后是ISO3166国家代码。连字符和国家代码可以省略。
Fontconfig在函数库中有几种语言的正词法。除了重新编译函数库外,还没有其他途径添加新的正词法。Fontconfig现在支持ISO639-1中命名的139种语言的122种,ISO 639-2的141种有双字符编码的语言和另外30种三字符编码的语言。
配置文件的格式
Fontconfig的配置文件的存储格式为XML格式。这种格式可以让延伸的配置工具更加方便的编写并且可以保证他们可以生成语法结构正确的文件。由于XML文件是纯文本文件,专家用户可以用文本编辑器处理它们。
Fontconfig 文件类型定义在延伸的实体“fonts.dtd”中,通常存储在默认的字体设置目录(/etc/fonts)。每个配置文件必须包括下列的结构:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
...
</fontconfig>
<fontconfig>
这是字体配置顶层的单元,可以按照任意顺序包括dir, cache, include, match和alias单元。
dir
这个单元包含一个会被扫描目录名称,扫描到字体文件将被包括到可用的字体列表中里。
cache
这个单元包含一个为每个用户设置的缓存字体信息的文件名称。如果它以“~”开始的话,代表一个在用户主目录的文件。这个文件是用来保留在为每个目录设置的 缓存文件中没有的字体信息的。Fontconfig将会自动处理缓存文件。默认的缓存文件是“~/.fonts.cache-version”,这里 version是字体配置文件的版本号。(目前是1)。
include ignore_missing="no"
这个单元包含一个附加的配置文件名称。当XML数据类型被FcConfigParse扫描处理后,这个文件的内容也将会通过传送文件名称到 FcConfigLoadAndParse,从而被包括在配置中。如果“ignore_missing”设成“yes”而不是默认的“no”的话,一个丢 失的文件将不会引起函数库的警告信息。
config
这个单元提供一个整合附加的配置信息的地方。config可以按照任意顺序包含blank和rescan单元。
blank
字体通常包含“破碎”的字型,它们在编码中存在但在屏幕上却被绘制成空白。我们在blank单元中放置每个预计是空白的unicode字符到int单元中。这些绘制为空白的字符将从字体支持的字符集中忽略。
rescan
rescan单元存放一个表示自动扫描字体配置文件变化间隔时间的int单元。每次间隔过后,Fontconfig都将验证所有的配置文件和目录并且自动重建内部的数据结构 。
match target="pattern"
这个单元先存放(可能是空的)test元素列表,然后是一个edit元素列表(也可能是空的)。匹配检测(test元素)条件的样板将受到 edit元素列表的影响。如果“target”设定为“font”而不是默认的“pattern”的话,那么这个单元就将应用到一个匹配后的字体名称,而 不是一个需要匹配的字体样板。
test qual="any" name="property" compare="eq"
这个单元包含一个单独的值,用来和样本的属性“property”比较(可以替换property为任意一个上面列出的属性)。 “compare”可以是“eq”(等于),“not_eq”(不等于),“less”(小于),“less_eq”(小于等于),“more”(大 于),“more_eq”(大于等于)。“qual”可以为默认的“any”,在这种情况下,只要任意一个之字体属性符合比较的值,匹配就成功。如果 “qual”为“all”的话,只有当所有的字体属性都符合比较的值的时候,匹配才成功。
edit name="property" mode="assign" binding="weak"
这个单元包括一个表达式单元的列表(任何赋值和操作单元)。表达式单元将在运行的时候被执行并且将修改属性“property”。是否修改依赖于 “property”的值是否匹配相应的test单元。如果匹配的话,这个修改将会影响第一个匹配的值。任何插入到属性的值都可以给出绑定 (binding)说明。“mode”可以是以下列表其中的一个:
Mode
|
有匹配条件
|
没有匹配条件
|
"assign"
|
替换匹配的值
|
替换所有值
|
"assign_replace"
|
替换所有值
|
替换所有值
|
"prepend"
|
在匹配前插入
|
在列表头部插入
|
"prepend_first"
|
在列表头部插入
|
在列表头部插入
|
"append"
|
在匹配后添加
|
在列表底部添加
|
"append_last"
|
在列表底部添加
|
在列表底部添加
|
int, double, string, bool
这些单元保存单独一个声明的类型。bool 单元保存true或者false。在赋浮点数的时候有一个重要的限制——fontconfig要求尾数必须以一个数字开始,而不是一个小数点,所以应该碰到纯小数的时候应该插入一个起始的"0"。(例如用0.5而不是.5,-0.5而不是-.5。)
matrix
这个单元保存一个防射变换的四个double元素。
name
保存一个属性名称。从字体属性的第一个值判断出来的,而不是样板的第一个值。
const
保存一个常量的名称。以下这些数值总是整数并且作为一般字体值的字符表达。
常量
|
属性
|
值
|
light
|
weight
|
0
|
medium
|
weight
|
100
|
demibold
|
weight
|
180
|
bold
|
weight
|
200
|
black
|
weight
|
210
|
roman
|
slant
|
0
|
oblique
|
slant
|
110
|
proportional
|
spacing
|
0
|
mono
|
spacing
|
100
|
charcell
|
spacing
|
110
|
unknow
|
rgba
|
0
|
rgb
|
rgba
|
1
|
bgr
|
rgba
|
2
|
vrgb
|
rgba
|
3
|
vbgr
|
rgba
|
4
|
none
|
rgba
|
5
|
or(与), and(或), plus(加), minus(减), times(乘), divide(除)
这些元素在一个表达试列表上执行特定的操作。or和and是布尔操作,不是位操作。
eq(等于), not_eq(不等于), less(小于), less_eq(小于等于), more(大于), more_eq(大于等于)
这些元素比较两个值,产生一个布尔值。
not
对一个表达式的布尔值进行“非”操作。
if
这个单元包含三个表达单元。如果第一个单元为真,则产生第二个单元的值,否则产生第三个单元的值。
alias
Alias (别名)单元为需要替代一个字体家族名称到另一个的一套通用匹配操作提供简化符号。它们包含一个family单元,紧跟着是可选的prefer, accept和default单元。匹配family单元的字体将被编辑,使得prefer家族在匹配family的前面,accept家族在匹配的 family后面并且default家族在家族列表的最后。
family
保存一个单独的字体家族名称
prefer, accpet, default
这些单元保存一个让alias单元使用的字体列表。
配置文件举例
系统配置文件
这是一个系统范围的配置文件例子
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <!-- /etc/fonts/fonts.conf 配置系统自体的文件 --> <fontconfig> <!-- 在以下目录寻找字体 --> <dir>/usr/X11R6/lib/X11/fonts/truetype</dir> <dir>/usr/X11R6/lib/X11/fonts/Type1</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'赋值。 --> <match target="pattern"> <test qual="all" name="family" mode="not_eq">sans</test> <test qual="all" name="family" mode="not_eq">serif</test> <test qual="all" name="family" mode="not_eq">monospace</test> <edit name="family" mode="append_last"><string>sans</string></edit> </match>
<!-- 读入用户配置文件,如果不存在的话不发出警告信息。 --> <include ignore_missing="yes">~/.fonts.conf</include>
<!-- 创建众所周知的字体名称别名到可用的Truetype字体。 将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>Verdana</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>Verdana</family></prefer> </alias> <alias> <family>monospace</family> <prefer><family>Andale Mono</family></prefer> </alias> </fontconfig>
用户配置文件
这是一个以用户为单位的字体配置文件例子,文件名为 ~/.fonts.conf
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <!-- ~/.fonts.conf 用户的字体配置文件 --> <fontconfig>
<!-- 用户字体文件目录 --> <dir>~/misc/fonts</dir>
<!-- 使用rgb子像素显示顺序来提高字型在液晶显示器上的显示效果。效果会影响渲染, 但不会影响匹配。记得应该总是使用target="font"。 --> <match target="font"> <edit name="rgba" mode="assign"><const>rgb</const></edit> </match> </fontconfig>
文件
fonts.conf 包含了fontconfig函数库的配置信息,其中有用来寻找字体及相关信息的目录名称,还有在尝试匹配现有字体前执行的字体样板编辑指令。它使用的是xml格式。
fonts.dtd 是一个描述配置文件格式的DTD文件。
~/.fonts.conf 是当前用户字体配置的默认位置,实际的位置可以在fonts.conf文件里指定。
~/.fonts.cache-* 是在没有发现字体目录中的缓存文件时,在当前用户目录存储字体信息的文件。这个文件是fontconfig自动维护的。
版本号
Fontconfig version2.2.0
|