LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 647|回复: 9

fontconfig配置文件的一些心得和疑惑

[复制链接]
发表于 2012-2-28 19:23:21 | 显示全部楼层 |阅读模式
这几天看了一下与XFT字体配置有关的文档,有如下心得:
  • 系统级的配置文件为/etc/fonts/local.conf,还有一些存放系统级的字体配置文件的目录/etc/fonts/fonts.avail、/etc/fonts/fonts.d,其中后两个目录之间靠eselect fontconfig管理。另外,/etc/fonts/fonts.d中的README文件说明了配置文件夹中文件的命名方式;用户的字体配置文件为~/.fonts.conf,若用户有多个字体配置文件,例如关于各个字体的微调(具体可参考http://www.linuxsir.cn/bbs/thread266659.htmlhttp://www.linuxsir.cn/bbs/showthread.php?t=269312),则可放在~/.fonts.conf.d目录中。最后,这些字体配置会被汇总到/etc/fonts/fonts.conf,至于字体配置文件读取顺序好像是按/etc/fonts/fonts.d中文件的数字逆向排序。
  • Gentoo的系统级字体配置文件中有几个值得提一下:

    1. # eselect fontconfig list
    2.   [2]   10-autohint.conf *
    3.   [3]   10-no-sub-pixel.conf
    4.   [4]   10-sub-pixel-bgr.conf
    5.   [5]   10-sub-pixel-rgb.conf *
    6.   [6]   10-sub-pixel-vbgr.conf
    7.   [7]   10-sub-pixel-vrgb.conf
    8.   [8]   10-unhinted.conf
    9.   [9]   20-fix-globaladvance.conf *
    10.   [17]  25-unhint-nonlatin.conf
    11.   [23]  40-nonlatin.conf *
    12.   [28]  45-latin.conf *
    13.   [29]  49-sansserif.conf *
    14.   [30]  50-user.conf *
    15.   [31]  51-local.conf *
    16.   [35]  60-latin.conf *
    17.   [40]  65-nonlatin.conf *
    18.   [57]  69-odofonts.conf
    19.   [59]  70-no-bitmaps.conf
    20.   [60]  70-yes-bitmaps.conf
    21.   [63]  80-odofonts-original.conf
    22.   [64]  80-odofonts-simulate-MS-simplified-chinese.conf *
    23.   [65]  80-odofonts-simulate-MS-triditional-chinese.conf
    复制代码

    这几个配置文件均与具体字体无关,但是包含了大多数网上提到配置文件的各种小的修补,例如[2]、[8]、[17]可以决定是否开启AA;[3]、[4]、[5]、[6]、[7]则可以处理像素字体;[9]、[64]、[65]可以修正某些中英的间距问题等等。想必各位gentoo用户已经注意到了。



但fonts.conf中仍有几点不懂:
  • 字体别名应该是个列表;按文档意思,alias中不光接收匹配字体族,也可以接受accept、prefer、default字体族,prefer的意思是放在匹配字族之前,accept的意思是指放在匹配字族之后,default是指匹配字族的最后。但是,不太明白怎么匹配?是这样的吗:a)应用程序中设置的字体名是否与alias中的匹配字族match,b)若匹配,则根据alias列表中字族排列的先后次序开始实现字体渲染。同时这里需要一个前提,alias列表中排在前面的字族有没有实现,具体看该字体是否安装;c)若不匹配(这个就不懂了,极端情况就是没有任何fonts.conf时,xft是如何工作的?),。。。
  • 另外,字体别名设置时prefer字体族与alias中的匹配字族是否需要重复设置,例如

    1.   <!--
    2.     Monospace faces
    3.    -->
    4.         <alias>
    5.                 <family>Courier New</family>
    6.                 <family>Andale Mono</family>
    7.                 <family>NSimSun</family>
    8.                   <family>新宋体</family>
    9.                 <family>MingLiU</family>
    10.                   <family>細明體</family>
    11.                 <default>
    12.                         <family>monospace</family>
    13.                 </default>
    14.         </alias>
    复制代码



    1.         <alias>
    2.                 <family>monospace</family>
    3.                 <prefer>
    4.                         <family>Courier New</family>
    5.                         <family>Andale Mono</family>
    6.                         <family>NSimSun</family>
    7.                         <family>新宋体</family>
    8.                         <family>MingLiU</family>
    9.                         <family>細明體</family>
    10.                 </prefer>
    11.         </alias>
    复制代码

    应该没有必要同时放入字体配置文件吧?
  • 字体替换据我目前看到的有如下的方式:assign、pretend、与prefer。按我的解,assign是真正的实现了替换,不管被替换字体是否安装?其他方法只不过是把字族名放到alias列表中去而已,看字体优先级而定,除非靠前的字体没有安装。


以上看法比较混乱,如有错误,还请不吝赐教!
发表于 2012-2-29 17:32:40 | 显示全部楼层
  • 最重要的建议只有五个字:仔细看文档!man fonts-conf基本上把一切都解释清楚了。下次您问可以从文档中轻易得到答案的问题,我就只能用RTFM来回答了。
  • 关于读取配置文件:
    • fontconfig默认只读取一个配置文件:/etc/fonts/fonts.conf
    • 依次对<fontconfig>下每个顶级XML标签进行解析。
    • 如果发现了<include>标签,就暂停解析当前正在分析的配置文件,开始解析<include>中给出的配置文件/配置文件目录。
      之所以/etc/fonts/conf.d中的配置文件有效,只是因为fonts.conf中有这么一句:
      1. <include ignore_missing="yes">conf.d</include>
      复制代码

      ~/.fonts.conf有效,是因为它在/etc/fonts/conf.d/50-user.conf中被<include>了;/etc/fonts/local.conf有效,是因为它在/etc/fonts/conf.d/51-local.conf中被<include>了。
    • 如果<include>指定的是一个目录,只对该目录中名字符合"[0-9]*.conf"的文件进行解析。解析顺序似乎是按ASCII代码大小顺序进行,从小到大。
    • 通过对配置文件的解析,得到一系列字体文件路径(<dir>)、字体修改策略(<edit>、<alias>)、字体接受/拒绝策略(<acceptfont>、<rejectfont>)和其他配置信息。

    所以,您关于配置文件的心得大部分是正确的,但不够透彻。
  • /etc/fonts/conf.d中有很多配置文件可能会干扰您的配置,所以如果您打算详细配置fontconfig,要尽量关掉可能导致问题的配置文件。60-latin.conf和 65-nonlatin.conf是两个比较明显的例子。
  • fontconfig内部对TrueType/OpenType字体会调用freetype的函数FT_Get_Sfnt_Name()来查询字体名称,所有的名称都会被查询到。"NSimSun"和"新宋体"会匹配到相同的字体。没有必要指定一个字体的多个名称。
  • 这样,我简要介绍一下fontconfig做match处理的过程。因为正统的解释涉及术语太多,晦涩难懂,我们做个类比:您(某个应用程序)在"Xft"餐馆吃饭,负责点菜,就是点出您需要的字体(嗯,这样多好,只点菜,不付账 );fontconfig是服务生,负责匹配字体,也就是菜式;freetype是大厨,负责渲染字体,也就是做菜;Xft是另一个服务生,负责用XRender显示渲染出的字体,就是端菜。

    您懒得看菜单,要求服务生根据餐馆可以做出来的菜式决定您具体吃的菜。您的要求是:
    • “有红烧带鱼就点红烧带鱼;没有红烧带鱼,水煮鱼也可以;连水煮鱼也没有,就要一份宫爆鸡丁好了。”
    • “嗯,我正在节食,来一小盘就好。“
    • “不许弄辣椒啊!"

    您的要求我们就可以记成:

    1. 菜式:红烧带鱼 -> 水煮鱼 -> 宫爆鸡丁
    2. 大小:小盘
    3. 辣椒:不放
    复制代码

    对应于fontconfig,应用程序提出的要求(pattern/FcPattern)就可能是"4pt的文泉驿点阵宋,开抗锯齿”:

    1. family: 文泉驿点阵宋, 宋体, 文泉驿正黑
    2. size: 4(pt)
    3. antialias: FcTrue
    复制代码


    接下来服务生对您的要求进行预处理,按内置的默认选项补充您的要求:

    1. 菜式:红烧带鱼 -> 水煮鱼 -> 宫爆鸡丁
    2. 大小:小盘
    3. 盘子直径:150mm
    4. 辣椒:不放
    5. 盐:通常量
    6. 胡椒粉:不放
    复制代码

    真正的fontconfig通常会增加一大堆属性:
    (注意,在这个阶段,fontconfig不在乎您的系统中是否有文泉驿点阵宋等等字体,它只是在修改您的要求!)

    1. family: 文泉驿点阵宋, 宋体, 文泉驿正黑
    2. size: 4(pt)
    3. pixelsize: 4.1
    4. hintstyle: 3
    5. hinting: FcTrue
    6. slant: 0
    7. weight: 100
    8. width: 100
    9. ...
    复制代码


    然后服务生fontconfig开始阅读它的配置文件(老板娘的嘱咐? ),对您的要求进行修改。更准确地说,它目前只考虑target="pattern"的规则,而且它阅读的不是规则文件,而是一个定期刷新的配置文件的cache。假设配置文件中有这样一条规则:

    1.     <match target="pattern">
    2.         <test qual="any" name="菜式"><string>水煮鱼</string></test>
    3.         <edit name="菜式" mode="assign"><string>烤鱼</string></edit>
    4.     </match>
    复制代码

    就是说,如果找到菜式中有水煮鱼的话,把它替换成烤鱼:

    1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁
    2. 大小:小盘
    3. 盘子直径:150mm
    4. 辣椒:不放
    5. 盐:通常量
    6. 胡椒粉:不放
    复制代码

    如果将mode="assign"换成mode="prepend",这个规则就成了:如果找到菜式中有水煮鱼的话,把烤鱼放在水煮鱼前面。
    mode="append"就是后面了。fontconfig现在完全不考虑餐馆有没有水煮鱼或者烤鱼这两道菜!

    为了解释<alias>的功用,我们来一个<alias>规则:

    1.     <alias>
    2.         <family>宫爆鸡丁</family>
    3.         <family>烤鸡翅</family>
    4.         <accept>
    5.             <family>炸鸡腿</family>
    6.             <family>煮鸡腿</family>
    7.         </accept>
    8.     </alias>
    复制代码

    这个规则的意思就是,如果找到菜式中有宫爆鸡丁或者烤鸡翅的话,把炸鸡腿、煮鸡腿放在找到的宫爆鸡丁或者烤鸡翅后面:

    1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁 -> 炸鸡腿 -> 煮鸡腿
    2. 大小:小盘
    3. 盘子直径:150mm
    4. 辣椒:不放
    5. 盐:通常量
    6. 胡椒粉:不放
    复制代码

    <prefer>和<default>与<accept>区别只是插入的位置不同。同样,fontconfig不考虑餐馆有没有宫爆鸡丁、炸鸡腿。

    最后一条规则:

    1.         <match target="pattern">
    2.                 <test qual="all" name="菜式" compare="not_eq">
    3.                         <string>清水煮白菜</string>
    4.                 </test>
    5.                 <edit name="菜式" mode="append_last">
    6.                         <string>清水煮白菜</string>
    7.                 </edit>
    8.         </match>
    复制代码

    compare="not_eq" + qual="all" = "所有项目全部不是",append_last就是“加到最后面”。
    这一条规则是指,如果您的菜式列表中所有项目全部不是"清水煮白菜",就将"清水煮白菜"插入菜式列表的末尾。

    好了,配置文件中的规则执行完了。服务生fontconfig开始阅读菜单(终于开始了...),考虑具体给您上哪一道菜最符合要求。经过处理后您的要求是:

    1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁 -> 炸鸡腿 -> 煮鸡腿 -> 清水煮白菜
    2. 大小:小盘
    3. 盘子直径:150mm
    4. 辣椒:不放
    5. 盐:通常量
    6. 胡椒粉:不放
    复制代码

    (这哪里是您的要求啊,简直面目全非...)
    相应的,真正的fontconfig会阅读您的字体列表(的cache...),找到最符合要求的字体。

    服务生阅读列表后,发现红烧带鱼、烤鱼、宫爆鸡丁、炸鸡腿、煮鸡腿今天都没有,只有清水煮白菜... 于是他认定最符合要求的菜式是清水煮白菜。清水煮白菜没有小盘的,只有大碗装的。但是没有更匹配的菜式了,所以服务生会告诉大厨,要做的菜是大碗的清水煮白菜。

    真正的fontconfig发现系统中有文泉驿点阵宋,文泉驿点阵宋处在family列表的最高位,所以选择文泉驿点阵宋。文泉驿点阵宋其实没有4pt这种大小,但是,fontconfig还是选择了某一个文泉驿点阵宋的字体文件(我们假定他选择了9pt的)。您的"4pt"大小要求被无视了。

    这里实际上隐含了一个各种属性的优先权问题,对服务生来说,菜式的匹配最重要,盘子大小的匹配不重要。对真正的fontconfig来说,各种属性的匹配顺序是:foundry, charset, family, lang, spacing, pixelsize, style, slant, weight, antialias, rasterizer, outline,如果字体名family匹配而大小size不匹配,大小就会被忽视。

    可怜的服务生fontconfig还有工作要做:将配置文件中所有target="font"的修改规则施加到最终选择的菜上。例如有这样一条规则:

    1.     <match target="font">
    2.         <edit name="辣椒" mode="assign">
    3.             <bool>放</bool>
    4.         </edit>
    5.     </match>
    复制代码

    简单地说就是:这是川菜馆,辣椒你吃也得吃,不吃也得吃!

    对真正的fontconfig而言,所有target="font"规则都会在这一步被施加到最终选择的字体上。比如这样的规则:

    1.     <match target="font" >
    2.         <edit name="antialias" mode="assign">
    3.             <bool>false</bool>
    4.         </edit>
    5.     </match>
    复制代码

    就是说强制关闭抗锯齿处理。(不过这一点我还有些没想通...)

    然后,终于开始做菜了。您点了不辣的小盘红烧带鱼,而服务生Xft最后给您盛上了一大碗放了辣椒的清水煮白菜... 坑人啊,幸好在Xft餐馆您不必付钱...
    您对fontconfig提出的要求是4pt的文泉驿点阵宋,开启抗锯齿处理,而fontconfig给出的结果是关闭抗锯齿处理的9pt文泉驿点阵宋,这个还靠谱一些...
  • 您给出的两段配置代码说明您完全没有明白<alias>的作用。关于<alias>的功用请看上面的解释。

    您的两段代码的大意是:如果在字体列表中找到Courier New、Andale Mono、新宋体、細明體其中之一,就把monospace插入到字体列表的最后面;如果在字体列表中找到monospace,就把Courier New、Andale Mono、NSimSun、新宋体、細明體四种字体全体再次插到monospace前面。

    累不累啊?
  • 虽然man fonts-conf的英文资料很详细,但如果您非要中文资料不可的话:http://blog.chinaunix.net/space. ... 288152&id=67306
    注意这篇文章有些地方不是完全正确,而且可能过时了。
  • 对中文fontconfig用户而言,一个重要的概念就是binding。不了解binding可能会在涉及多语言的fontconfig配置上碰到很难解释的问题。呃,我今天码字太多了,懒得解释了,您自己一定要在man fonts-conf中找到binding相关内容仔细看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-1 16:23:03 | 显示全部楼层
Post by RichardGv;2161035

最重要的建议只有五个字:仔细看文档!man fonts-conf基本上把一切都解释清楚了。下次您问可以从文档中轻易得到答案的问题,我就只能用RTFM来回答了。
感觉兄台的英文水平相当了得,一定有过在纯英文环境下工作或生活的经历。另外,我感觉我的问题也不全在文档之内。
Post by RichardGv;2161035

/etc/fonts/conf.d中有很多配置文件可能会干扰您的配置,所以如果您打算详细配置fontconfig,要尽量关掉可能导致问题的配置文件。60-latin.conf和 65-nonlatin.conf是两个比较明显的例子。
非常感谢帮我纠正错误。其实,这两个文件里面除了定义sans、sans serif、mono,还定义了Fantasy、Cursive,通常的字体分类里好像没有见过,这两个是什么呢?

60-latin.conf和 65-nonlatin.conf是不是与49-sansserif.conf也不能共存呢?
Post by RichardGv;2161035

fontconfig内部对TrueType/OpenType字体会调用freetype的函数FT_Get_Sfnt_Name()来查询字体名称,所有的名称都会被查询到。"NSimSun"和"新宋体"会匹配到相同的字体。没有必要指定一个字体的多个名称。
这个好像不在文档之中啊。而且早几年的配置之中都会有这样的语句:
  1.     <match target="pattern">
  2.         <test name="family">
  3.             <string>新宋体</string>
  4.         </test>
  5.         <edit name="family" mode="assign">
  6.             <string>NSimSun</string>
  7.         </edit>
  8.     </match>
复制代码
看来兄台对于freetype模块提供的接口很了解啊!佩服。

Post by RichardGv;2161035

这样,我简要介绍一下fontconfig做match处理的过程。因为正统的解释涉及术语太多,晦涩难懂,我们做个类比:您(某个应用程序)在"Xft"餐馆吃饭,负责点菜,就是点出您需要的字体(嗯,这样多好,只点菜,不付账 );fontconfig是服务生,负责匹配字体,也就是菜式;freetype是大厨,负责渲染字体,也就是做菜;Xft是另一个服务生,负责用XRender显示渲染出的字体,就是端菜。

您懒得看菜单,要求服务生根据餐馆可以做出来的菜式决定您具体吃的菜。您的要求是:

  • “有红烧带鱼就点红烧带鱼;没有红烧带鱼,水煮鱼也可以;连水煮鱼也没有,就要一份宫爆鸡丁好了。”
  • “嗯,我正在节食,来一小盘就好。“
  • “不许弄辣椒啊!"

您的要求我们就可以记成:
  1. 菜式:红烧带鱼 -> 水煮鱼 -> 宫爆鸡丁
  2. 大小:小盘
  3. 辣椒:不放
复制代码
对应于fontconfig,应用程序提出的要求(pattern/FcPattern)就可能是"4pt的文泉驿点阵宋,开抗锯齿”:
  1. family: 文泉驿点阵宋, 宋体, 文泉驿正黑
  2. size: 4(pt)
  3. antialias: FcTrue
复制代码

接下来服务生对您的要求进行预处理,按内置的默认选项补充您的要求:
  1. 菜式:红烧带鱼 -> 水煮鱼 -> 宫爆鸡丁
  2. 大小:小盘
  3. 盘子直径:150mm
  4. 辣椒:不放
  5. 盐:通常量
  6. 胡椒粉:不放
复制代码
真正的fontconfig通常会增加一大堆属性:
(注意,在这个阶段,fontconfig不在乎您的系统中是否有文泉驿点阵宋等等字体,它只是在修改您的要求!)
  1. family: 文泉驿点阵宋, 宋体, 文泉驿正黑
  2. size: 4(pt)
  3. pixelsize: 4.1
  4. hintstyle: 3
  5. hinting: FcTrue
  6. slant: 0
  7. weight: 100
  8. width: 100
  9. ...
复制代码

然后服务生fontconfig开始阅读它的配置文件(老板娘的嘱咐? ),对您的要求进行修改。更准确地说,它目前只考虑target="pattern"的规则,而且它阅读的不是规则文件,而是一个定期刷新的配置文件的cache。假设配置文件中有这样一条规则:
  1.     <match target="pattern">
  2.         <test qual="any" name="菜式"><string>水煮鱼</string></test>
  3.         <edit name="菜式" mode="assign"><string>烤鱼</string></edit>
  4.     </match>
复制代码
就是说,如果找到菜式中有水煮鱼的话,把它替换成烤鱼:
  1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁
  2. 大小:小盘
  3. 盘子直径:150mm
  4. 辣椒:不放
  5. 盐:通常量
  6. 胡椒粉:不放
复制代码
如果将mode="assign"换成mode="prepend",这个规则就成了:如果找到菜式中有水煮鱼的话,把烤鱼放在水煮鱼前面。
mode="append"就是后面了。fontconfig现在完全不考虑餐馆有没有水煮鱼或者烤鱼这两道菜!

为了解释<alias>的功用,我们来一个<alias>规则:
  1.     <alias>
  2.         <family>宫爆鸡丁</family>
  3.         <family>烤鸡翅</family>
  4.         <accept>
  5.             <family>炸鸡腿</family>
  6.             <family>煮鸡腿</family>
  7.         </accept>
  8.     </alias>
复制代码
这个规则的意思就是,如果找到菜式中有宫爆鸡丁或者烤鸡翅的话,把炸鸡腿、煮鸡腿放在找到的宫爆鸡丁或者烤鸡翅后面:
  1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁 -> 炸鸡腿 -> 煮鸡腿
  2. 大小:小盘
  3. 盘子直径:150mm
  4. 辣椒:不放
  5. 盐:通常量
  6. 胡椒粉:不放
复制代码
<prefer>和<default>与<accept>区别只是插入的位置不同。同样,fontconfig不考虑餐馆有没有宫爆鸡丁、炸鸡腿。

最后一条规则:
  1.         <match target="pattern">
  2.                 <test qual="all" name="菜式" compare="not_eq">
  3.                         <string>清水煮白菜</string>
  4.                 </test>
  5.                 <edit name="菜式" mode="append_last">
  6.                         <string>清水煮白菜</string>
  7.                 </edit>
  8.         </match>
复制代码
compare="not_eq" + qual="all" = "所有项目全部不是",append_last就是“加到最后面”。
这一条规则是指,如果您的菜式列表中所有项目全部不是"清水煮白菜",就将"清水煮白菜"插入菜式列表的末尾。

好了,配置文件中的规则执行完了。服务生fontconfig开始阅读菜单(终于开始了...),考虑具体给您上哪一道菜最符合要求。经过处理后您的要求是:
  1. 菜式:红烧带鱼 -> 烤鱼 -> 宫爆鸡丁 -> 炸鸡腿 -> 煮鸡腿 -> 清水煮白菜
  2. 大小:小盘
  3. 盘子直径:150mm
  4. 辣椒:不放
  5. 盐:通常量
  6. 胡椒粉:不放
复制代码
(这哪里是您的要求啊,简直面目全非...)
相应的,真正的fontconfig会阅读您的字体列表(的cache...),找到最符合要求的字体。

服务生阅读列表后,发现红烧带鱼、烤鱼、宫爆鸡丁、炸鸡腿、煮鸡腿今天都没有,只有清水煮白菜... 于是他认定最符合要求的菜式是清水煮白菜。清水煮白菜没有小盘的,只有大碗装的。但是没有更匹配的菜式了,所以服务生会告诉大厨,要做的菜是大碗的清水煮白菜。

真正的fontconfig发现系统中有文泉驿点阵宋,文泉驿点阵宋处在family列表的最高位,所以选择文泉驿点阵宋。文泉驿点阵宋其实没有4pt这种大小,但是,fontconfig还是选择了某一个文泉驿点阵宋的字体文件(我们假定他选择了9pt的)。您的"4pt"大小要求被无视了。

这里实际上隐含了一个各种属性的优先权问题,对服务生来说,菜式的匹配最重要,盘子大小的匹配不重要。对真正的fontconfig来说,各种属性的匹配顺序是:foundry, charset, family, lang, spacing, pixelsize, style, slant, weight, antialias, rasterizer, outline,如果字体名family匹配而大小size不匹配,大小就会被忽视。

可怜的服务生fontconfig还有工作要做:将配置文件中所有target="font"的修改规则施加到最终选择的菜上。例如有这样一条规则:
  1.     <match target="font">
  2.         <edit name="辣椒" mode="assign">
  3.             <bool>放</bool>
  4.         </edit>
  5.     </match>
复制代码
简单地说就是:这是川菜馆,辣椒你吃也得吃,不吃也得吃!

对真正的fontconfig而言,所有target="font"规则都会在这一步被施加到最终选择的字体上。比如这样的规则:
  1.     <match target="font" >
  2.         <edit name="antialias" mode="assign">
  3.             <bool>false</bool>
  4.         </edit>
  5.     </match>
复制代码
就是说强制关闭抗锯齿处理。(不过这一点我还有些没想通...)

然后,终于开始做菜了。您点了不辣的小盘红烧带鱼,而服务生Xft最后给您盛上了一大碗放了辣椒的清水煮白菜... 坑人啊,幸好在Xft餐馆您不必付钱...
您对fontconfig提出的要求是4pt的文泉驿点阵宋,开启抗锯齿处理,而fontconfig给出的结果是关闭抗锯齿处理的9pt文泉驿点阵宋,这个还靠谱一些...
感谢兄台不厌其烦的解释,大概明白了alias的作用了。当然,请恕我愚钝,pattern这段还有几个东西需要再想想才能明白。还想问个不靠谱的问题:

如果应用程序的配置文件里面自行设定了字体要求(也即自带菜单),例如rxvt-unicode的配置文件中指定使用字体Lucida Grande,但系统里没有安装这个字体,这个时候xft怎么工作呢?
Post by RichardGv;2161035

对中文fontconfig用户而言,一个重要的概念就是binding。不了解binding可能会在涉及多语言的fontconfig配置上碰到很难解释的问题。呃,我今天码字太多了,懒得解释了,您自己一定要在man fonts-conf中找到binding相关内容仔细看看。
这个我会仔细看的。
回复 支持 反对

使用道具 举报

发表于 2012-3-1 17:47:58 | 显示全部楼层
Post by easior lars;2161065
感觉兄台的英文水平相当了得,一定有过在纯英文环境下工作或生活的经历。另外,我感觉我的问题也不全在文档之内。

您的问题基本上在文档之内,所以主要问题是您没有仔细读文档。确实有些不在文档之中,可是就像黄蓉在传授打狗棒法给杨过时说的一样:
...这棒法我师父传了你三成,你自个儿偷听了二成,今日我再传你二成。余下三成,就得凭你自己才智去体会领悟,旁人可传授不来...
学武和学知识本质上相通,师傅领进门,修行在个人。文档再细,也不可能面面俱到,剩下的就要靠自己的经验、不断试验还有悟性和灵感了。

纯英文环境?没有的事。我连出国旅游的财力都没有,也没有《圣经》里上帝那样的能耐,随便撮一堆土就捏出个洋人玩。 学习英语,未必要什么纯英文环境。只要您想学,就可以做到。缺乏纯英文环境不是学不好英语的借口,文档中没有提到也不是一定要求助他人的借口。顺便摘录卡耐基的一段话:
...都德将军知道如何无畏地站在障碍面前。只要站着面对它就行,千万不要有丝毫妥协或将路让给它,如此它终有自行破解或被你破解的一天。总之,一定有认输的一方,因为不会是你,那么就一定是障碍了。

另外,我想我们学习计算机遇到的困难一定比那位“包了一个83亩的鱼塘做养殖”的先生少的多。
Post by easior lars;2161065
其实,这两个文件里面除了定义sans、sans serif、mono,还定义了Fantasy、Cursive,通常的字体分类里好像没有见过,这两个是什么呢?

serif, sans-serif, monospace, fantasy, cursive是五种通用字体族,可以在W3C的CSS标准中找到它们的详细解释:
http://www.w3.org/TR/CSS2/fonts.html#generic-font-families

Wikipedia有很多Cursive字形的例子、图片:http://en.wikipedia.org/wiki/Cursive
Post by easior lars;2161065
60-latin.conf和 65-nonlatin.conf是不是与49-sansserif.conf也不能共存呢?

您自己看看它们的内容就清楚了。60-latin.conf和 65-nonlatin.conf的作用相似,只不过是分别为不同的语言设计的。它们与49-sansserif.conf的作用截然不同。
Post by easior lars;2161065

这个好像不在文档之中啊。而且早几年的配置之中都会有这样的语句:
  1.     <match target="pattern">
  2.         <test name="family">
  3.             <string>新宋体</string>
  4.         </test>
  5.         <edit name="family" mode="assign">
  6.             <string>NSimSun</string>
  7.         </edit>
  8.     </match>
复制代码

以讹传讹。
Post by easior lars;2161065
看来兄台对于freetype模块提供的接口很了解啊!佩服。

我在fontconfig的代码里看到的。对FreeType我也不了解。
Post by easior lars;2161065
如果应用程序的配置文件里面自行设定了字体要求(也即自带菜单),例如rxvt-unicode的配置文件中指定使用字体Lucida Grande,但系统里没有安装这个字体,这个时候xft怎么工作呢?

您点了红烧带鱼,餐馆没有,上的就是清水煮白菜;应用程序要Lucida Grande,系统中没有,fontconfig就会给出一个默认字体。仔细看一下/etc/fonts/conf.avail/49-sansserif.conf,您就会发现它的作用是,如果在应用程序要求的字体列表中"sans-serif"、"serif"、"monospace"三种通用字体族都没有,就会在字体列表末尾补一个sans-serif。如果应用程序要求"Lucida Grande",经过49-sansserif.conf之后就变成了"Lucida Grande, sans-serif"(如果没有Lucida Grande,就用sans-serif)。sans-serif具体映射到哪一种字体,就要看您自己的设定了。

60-latin.conf和65-nonlatin.conf含有一系列的关于"sans-serif"、"serif"、"monospace"三种通用字体族的映射规则,如果您没有自己的关于"sans-serif"、"serif"、"monospace"的映射规则,并且启用了这两个文件,fontconfig就会按照这两个文件中给出的优先级顺序将"sans-serif"、"serif"、"monospace"映射到某个字体。
回复 支持 反对

使用道具 举报

发表于 2012-3-1 23:00:48 | 显示全部楼层
对我这种英语不好的人很受用,感谢楼主
回复 支持 反对

使用道具 举报

发表于 2012-3-6 22:03:59 | 显示全部楼层
请允许我mark一下,哈哈!最近重装系统,才有动力学习东西!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-7 07:17:35 | 显示全部楼层
Post by forrestxz;2161264
请允许我mark一下,哈哈!最近重装系统,才有动力学习东西!

呵呵,我有点不好意思了。其实,本版版友在很早之前也讨论相关的问题,可能侧重点不一样。

看到前面有个你的帖子,大意是你想写个使用Gentoo的心得。为此,我再给你一个链接:http://www.aiview.com/thinkpad_and_pda/
(不知道怎么样网页定位(知道的高手教教我吧!),自己在该网页上找找吧)。这可能是本版的某个版友的主页,自己看了看收获不小,例如保养键盘、清洗风扇、Thinkpad相关的包的安装等等。

感谢网友分享,各取所需吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-7 07:23:33 | 显示全部楼层
Post by zorion;2161087
对我这种英语不好的人很受用,感谢楼主


呵呵,英语还是要好好学的。可惜,本人只是个哑巴英语。

不要谢我哦;要谢的话,就要感谢RichardGv、感谢其他热心的版友。
回复 支持 反对

使用道具 举报

发表于 2012-3-7 09:44:17 | 显示全部楼层
学习了, 不错.
回复 支持 反对

使用道具 举报

发表于 2012-3-7 11:03:24 | 显示全部楼层
这个不错 机器换了SSD要重装系统 刚好研究下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表