Linux 下 美化字体

一学即懂!

 

linux下主要有两套字体系统,X11核心字体系统和xft字体系统。其中,应用越来越广泛的是xft字体系统。gtk2、qt等都采用xft方式进行 字体渲染。xft本身并没有配置的功能,需要借助另外一个库fontconfig来对xft进行配置。这篇文章简单介绍了使用fontconfig进行字 体美化的过程,希望对最近装linux的同学有所帮助。请确保安装了fontconfig库。在debian下可以简单地使用apt-get install fontconfig来安装。

首先简单介绍一下fontconfig工作的原理。当应用程序需要显示文字时,会向fontconfig发送字体样板(pattern),其中包含部分需 要显示的字体信息,例如字体名称,风格,字号等等。fontconfig收到pattern后,按照配置文件中的内容对pattern进行修改,以实现一 些控制功能。接着,fontconfig按照某种算法从系统目前安装的字体中挑选出最接近pattern的一个,并根据这个字体的相关信息将 pattern中的信息完善,返回给应用程序。应用程序根据收到的详细字体信息选择具体的渲染程序(例如freetype)进行显示和渲染,我们才能看到 具体的字体效果。
简单了解了原理,我们就可以开始对字体进行美化了。
第一步是准备可用的字体,没有具体的字体文件,fontconfig自然是巧妇难为无米之炊了。最方便的方法就是从windows中提取字体来用,它们都 在C:/windows/Fonts目录下。比较好看的有宋体(simsun),Tahoma(tahoma),Consolas(consola)等。 我们就以这三个字体作为例子进行美化吧。
如果你是使用kde桌面环境,可以在控制中心里添加字体,非常方便。也可以通过修改配置文件的方法添加,这就需要我们了解fontconfig的配置文件 格式。默认情况下主配置文件是/etc/fonts/fonts.conf,但这个文件在升级时很容易被替换,因此我们在/etc/fonts下建立文本 文件local.conf来保存本地设置。可以用一般的文本编辑器如vim等编辑它。
fontconfig的配置文件为xml格式。基本框架为:

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

其中,我们的配置内容就写在...处。记住最后必须有</fontconfig>标签!
现在在...的地方开始写具体的配置代码。首先填写自己的字体路径:

<!--
在以下目录寻找字体
-->
<dir>/usr/share/winfonts</dir>

/usr/share/winfonts是字体文件保存的位置。当然使用其他的路径也是可以的,fontconfig会自动寻找你指定的目录下的字体文件,并生成字体信息。
接下把一些不常见或者不通用的字体进行重新命名,以正确显示它们:

<!--
把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重命名为sans-serif
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans serif</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>

<!--
把sans重命名为sans-serif
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>

<!--
对于其他字体,用sans-serif对名称赋值
-->
<match target="pattern">
<test qual="all" name="family" compare="not_eq">
<string>sans-serif</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>serif</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>monospace</string>
</test>
<edit name="family" mode="append_last" binding="strong">
<string>sans-serif</string>
</edit>
</match>

这一步相当于把所有字体分成三大类:有衬线(serif)、无衬线(sans-serif)和等宽(monospace)。下面分别指定各类所使用的实际字体以及显示时的优先顺序:

<!--
Serif faces
-->
<alias>
<family>SimSun</family>
<default><family>serif</family></default>
</alias>

<!--
Sans-serif faces
-->
<alias>
<family>Tahoma</family>
<family>SimSun</family>
<default><family>sans-serif</family></default>
</alias>
<!--
Monospace faces
-->
<alias>
<family>Consolas</family>
<family>SimSun</family>
<default><family>monospace</family></default>
</alias>

<!--
这段决定各字体的优先顺序。例如这里,当选择monospace字体时,
优先使用consolas字体显示,若不能正常显示则使用宋体
-->
<alias>
<family>serif</family>
<prefer>
<family>SimSun</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Tahoma</family>
<family>SimSun</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Consolas</family>
<family>SimSun</family>
</prefer>
</alias>

到此时我们的字体美化基本完成了。但为了更好的显示效果,我们还要把反锯齿功能打开。在kde控制中心中的字体选项里可以很容易得打开所有字体的反锯齿 (Anti-Aliased)。也可以在配置文件最后(但在</fontconfig>标签前)加入这么一段:

<!--
为所有字体打开AA
-->
<match target="font">
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
</match>

然而,我们知道宋体在某些字号下不需要反锯齿就已经很漂亮,而打开AA后反而发虚。为了解决这个问题,我们要对某些字号的宋体关闭反锯齿:

<!--
为12-16点大小的宋体关闭AA
-->
<match target="font">
<test name="family" qual="any">
<string>SimSun</string>
<string>NSimSun</string>
<string>宋体</string>
<string>新宋体</string>
</test>
<test name="pixelsize" compare="more_eq">
<double>12</double>
</test>
<test name="pixelsize" compare="less_eq">
<double>16</double>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>

至此,基本的字体美化就完成了。把界面字体改为sans-serif字体,控制台以及需要使用等宽字体的地方使用monospace,在qterm等地方可以使用宋体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值