edora7(Moonshine)发布也有一段时间了,这个版本包含了GNOME2.18KDE3.5.6,美工有很大的提高;使用Xorg1.3版本,对nVidia显卡支持很好,支持显示器的热插拔和自动识别;yum性能也得到很大的提升,其它各方面的表现都很不错的,唯一的缺点就是中文字体显示不够完美。虽然比FC6有了极大的提高,但还是赶不上Ubuntu7.04。于是就有了自己动手美化中文显示的想法,下面我把美化过程的整理给大家。
    试验环境:Fedora7KDE3.5.6,在GNOME和其它发行版本上差别应该不大。

    首先,我们来了解一些关于字体方面的知识。
一、点阵字体(BDF)与矢量字体(TrueType
   大家知道PC的 显示器是点阵显示设备,图像显示的精细程度取决于显示器的分辨率。文字也必须转换为点阵信息方可正常显示。于是人们设计制作了点阵字体,这种字体类似于位 图图像,以点阵详细记录了字体大小、形状;这样字体信息被读取后不需要任何转换就可直接在显示器上显示,由于制作精细,因此显示效果也是最好的。但这种字 体不能缩放,需要为每种字号制作点阵信息才能满足不同大小字体的显示,因此导致字体制作工作量大、耗时、占用空间大等问题。后来人们设计了矢量字体,它是 用矢量图形记录了笔画和字形等信息,解决了字体缩放的问题。
   矢量字体在显示时转换为点阵信息后才能显示,在小字体情况下,转换得到的点阵信息质量与点阵字体相差甚远,导致小字体显示效果很差。因此人们取两种字体之长,设计了一种即包括小字体点阵信息,又包括矢量字形的字体。比如著名的宋体(simsun),它包括121314151618点的点阵字库,还包括矢量字形。
    矢量字体涉及到以下两个概念:
   AAanti-alias)抗锯齿技术,它将字型以实际数倍大小绘制,然后缩放成想要的大小,未能占满一格像素的格子就用灰阶填补。对于英文字符,因其笔划简单,所以比较美观,但对于中文小字体,会导致文字看起来发虚,模糊不清的问题。
   hinting字体微调技术,它是字体的一种额外信息,嵌入字体内部,告诉字体渲染引擎如何渲染字体,使用字体看起来更美观。但hinting制作复杂,非常耗时,所以带有良好hinting的字体并不多(特别是中文字体)。对于字体的hinting有四种风格hintnonehintslighthintmediumhintfull,分别是指无hinting、轻度hinting、中等hinting、完全hinting
   hinting如果调整不好,可能导致字体显示并不好看,且由于hinting是有专利的,不能免费无限制地使用,freetype又做出了自己的字体微调技术autohint,经过不断改进,已经改善了部分字体的显示效果。autohint是通过程序来实现的,并且是针对所有字体,当然不可能有专门为每种字体制作的hinting技术效果好。

二、重要的概念:DPI
    DPIDotperInch),这是一个印刷上的单位,是指每英寸上的油墨点数。这里把DPI用来描述显示器上每英寸所包括的像素(Pixel),其值越高越精细,显示效果就越好。由于显示器的分辨率、点距(或珊距)及尺寸的不同,因此不同显示器的DPI也有差别。
   那么我们如果计算自己显示器的DPI呢?先测出自己显示器的宽(width)和高(height),单位是cm,知道显示器的分辨率。注意,如果是液晶显示器,则它只有一个分辨率即其最大分辨率。对于CRT显示器,它可以用多种分辨率,你先将其调整为最合适的分辨率(比如17CRT显示器调整为1024768)。由于1(inch)=2.54(cm),于是有下面的公式:
    水平DPI=(水平分辨率/width)*2.54
    垂直DPI=(垂直分辨率/height)*2.54
    有的显示器上水平DPI和垂直DPI有少许出入,这也是正常的。

   大家可以看出,同样像素的字体在高DPI的显示器上显示出来会较小。既然不同显示器的DPI不同,那么用像素来描述字的大小显然不合适,于是还有一个字体大小的单位:磅(point)
   磅是重量单位?不,此磅非彼磅,在这里,它才是字体大小的绝对度量(没忘记MSWord里的行距的单位吧)。
    1磅=172英寸。
   不管何种大小的字体,最终都要换算成像素之后,才能在屏幕上显示。那么像素(px)和磅(pt)换算关系为:
    pxptDPI72
   用这个公式可以算出,一个9磅的字在96DPI的显示器上用12像素来显示,但在75DPI的显示器上却只用9像素来显示。因此如果你的系统里为显示器设置了错误的DPI,那么最终显示出来的字将是不正常的大小。
   请注意,Firefox里设置的字体大小是以像素(px)为单位,在系统其它你能看到的绝大多数地方,都是以磅(pt)为字体大小单位。
    好了,我们来看看自己XserverDPI设置:
    $xdpyinfo |grep resolution
    resolution:   75x75 dots per inch
   通过上面的方法已经得知我的显示器DPI约为96,这里却设为75,明显不正确。打开/etc/X11/xorg.conf,在Section"monitor"段中加入DisplaySize参数:
    Section"Monitor"
        ……
        DisplaySize 270 203  # 1024x768  96pi
    EndSection
   重启X后,再使用上述xdpyinfo命令便可看到效果。不管实际的DPI是多少,都建议你将DPI值设为6甚至12的倍数。因为我们使用磅来计算字体大小,在转换时采用舍入方法来选择邻近的值作为字体最终的大小(像素),如果DPI值不为612的倍数,将可能导致相邻的字号转换后得到相同或差别很大的像素的字。
   打开/etc/X11/Xresources文件,找到开头为Xft.dpi那一行将其冒号后的值改为96(你的实际DPI)。
   再打开/etc/fonts/local.conf,在<fontconfig></fontconfig>之间加入下面几行:
        <matchtarget="pattern">
                <editname="dpi" mode="assign" >
                       <double>96</double>
                </edit>
        </match>
   5行代码,也可以写在/etc/fonts/fonts.conf~/.fonts.conf中,但是不建议这么做,因为在升级或其它设置时,可能会被覆盖。如果没有这个文件,则创建一个。这是一个XML格式的文件,下面会有详细介绍。
   上面两个修改DPI值的地方,其中GTK程序会读取Xresources文件中的设置,而Qt程序则会应用fonts.conflocal.conf中的设置。

三、Linux系统下字体显示原理
   现代Linux的字体处理系统大都采用XftFontconfigFreetype来处理字体。
   Fontconfig提供了一系列字体设定的函数库,应用程序直接向其索取字型;还负责发现和自动配置新字体,使新字体安装变得简单。它由两部分组成,其一是设定模块,把XML配置文件转换成Fontconfig的內部设定;另一是对比模块,将应用程序传来的字体样式需求与现有字体对比入修改,传回最相似的字体。
    Xft也是一套library,它使用fontconfig找出来的字型,将其绘制出来。
   Freetype可以说是一种完整的字体光栅化引擎,它提供一个简单的、易用的并且统一的接口实现对多种字体文件的访问。目前版本是2.x,与1.x版本相比主要是支持Anti-aliashintingfreetype的改变会影响到Xft画出来的字。
   说了这么一段大家一定头晕了,其实我也晕了。简单地说就是由Fontconfig选出来的字,再由Freetype决定如何去画,最后由Xft来处理画字。这是我个人的理解,可能可能不太准确,请大家不吝指正。

四、安装新字体
   讲了这么多枯燥而繁琐的理论,可能有的读者都已经睡着了。好,我们下面开始进行实际的美化操作!
    安装MScorefonts,这里http://corefonts.sourceforge.net/有下载地址和详细的安装方法,RedhatFedora的用户可能使用下面这个命令来安装,但前提是已经可以上网并设置好yum源。
    yuminstall msttcorefonts
    Debian/Ubuntu用户:
    apt-getinstall msttcorefonts
   十一种字体将会被安装到/usr/share/fonts/msttcorefonts/目录中。然后我们到windows中把中文字体细明体和新细明体(mingliu.ttc)、华文细黑(stxihei.ttf)也考到此目录吧,你也可以把其它常用的中文字体(比如楷体、幼圆等)也考过来,不过在下面的配置就不体现它们了。而对于宋体(simsun.ttc),我们去http://wyx.nbtvu.net.cn/jmm/Computing/SIMSUN.rar下载fromnuaa兄制作的这个版本,它带有1019点十种点阵字体,比Windows带的效果更好。Fedora使用的是文鼎的宋体(uming.ttf)和楷体(ukai.ttf),实在不怎么好看,可以把它删去,当然你也可以保留。之后重启X字体服务"servicexfs restart"让系统自动发现并配置新字体。

五、fontconfig配置
   前面介绍过,fontconfig可以把应用程序传来的字体请求信息进行匹配和修改,从而实现个性化定制,其配置文件为/etc/fonts/fonts.conf。这是一个XML文件,可以用任何编辑器编辑。但由于升级原因导致此文件容易被覆盖,所以建议大家把自定义的配置写在/etc/fonts/local.conf中,这个文件与fonts.conf格式一模一样下面是它的框架:
    <?xmlversion="1.0"?>
    <!DOCTYPEfontconfig SYSTEM "fonts.dtd">
    <!--/etc/fonts/local.conf file to configure system font access -->
    <fontconfig>

    </fontconfig>
   所有的配置都应该写在<fontconfig></fontconfig>之间,比如加入上面提到的设置DPI的语句,将变成下面的样子:
    <?xmlversion="1.0"?>
    <!DOCTYPEfontconfig SYSTEM "fonts.dtd">
    <!--/etc/fonts/local.conf file to configure system font access -->
    <fontconfig>
        <matchtarget="pattern">
                <editname="dpi" mode="assign" >
                       <double>96</double>
                </edit>
        </match>

    </fontconfig>

   我们以后的设置都是在这个文件<fontconfig></fontconfig>之间添加语句。fontconfig配置文件的语法非常灵活和复杂,manfonts-conf可以看到非常详细的解释和语法说明,网上据说有繁体中译版本,但我一直没有找到。如有时间,我把它翻译一下发到论坛上。

     <matchtarget="font" >
          <editname="rgba" mode="assign">
              <const>rgb</const><!--不同的显示器取值有所差别-->
          </edit>
    </match>
   这一段是用来启用液晶显示器的次像素排列,是液晶显示器的最佳显示方式。大家知道,液晶显示屏的每一个点都是用三原色RGB来合成各种颜色,但各种液晶显示器的RGB排列方式却可能不同,因此,取值也有多种:rgbbgrvrgbvbgr,对于CRT显示器,应关闭此功能(将值设为none)。如果设置错误,对于开AA的字体可能看起来花花绿绿,不太舒服。
    在计算机中我们把字体分为无衬线字体(SanSerif)和(有)衬线字体(Serif)。无衬线字体的笔画没有多余修饰,比如黑体、幼圆,英文字体有ArialVerdana及著名的Tahoma等;而衬线字体的笔画的起始和结束通常都有一些装饰,使字体看起来更美观,比如宋体、楷体,GeorgiaTimesNew Roman等。
   而对于英文字体,还有等宽字体(monotype)和不等宽字体,故名思义,即英文字符占用宽度是相等的或不相等的。常见的等宽字体有AndalemonoCourierNew等。绝大多数人都认为不等宽字体具有更好的外观和可识别性,但在计算机有的环境中却不利于排版(比如控制台中)。
   下面对各类字体提供别名,靠前的字体优先级高。当应用程序请求系统中没有的字体时,将自动用后面的字体替换。
        <alias>
               <family>sans-serif</family>
                <prefer>
                       <family>Arial</family>
                       <family>Verdana</family>
                       <family>Tahoma</family>
                       <family>TrebuchetMS</family>
                       <family>SimSun</family>
                       <family>宋体</family>
                       <family>PMingLiU</family>
                       <family>新細明體</family>
                       <family>STXihei</family>
                       <family>华文细黑</family>
                </prefer>
        </alias>
        <alias>
                <family>serif</family>
                <prefer>
                        <family>TimesNew Roman</family>
                       <family>Georgia</family>
                       <family>SimSun</family>
                       <family>宋体</family>
                       <family>PMingLiU</family>
                       <family>新細明體</family>
                </prefer>
        </alias>
        <alias>
               <family>monospace</family>
                <prefer>
                        <family>CourierNew</family>
                        <family>AndaleMono</family>
                       <family>NSimSun</family>
                       <family>新宋体</family>
                       <family>MingLiU</family>
                       <family>細明體</family>
                </prefer>
        </alias>
   这里把宋体和新细明体也加入无衬线字体类别中了,因为内嵌点阵字形的宋体和新细明体,比黑体等无衬线字体会有更好的表现。
   有的网页使用了如TimesHelvetica等英文字体。原来系统中没有这些字体,fontconfig将其映射到其它字体,看起来不够美观。我们加上下面这段:
        <alias>
                <family>Times</family>
                <prefer>
                        <family>TimesNew Roman</family>
                </prefer>
                <default>
                       <family>serif</family>
                </default>
        </alias>
        <alias>
               <family>Helvetica</family>
                <prefer>
                       <family>Arial</family>
                </prefer>
                <default>
                       <family>sans-serif</family>
                </default>
        </alias>
        <alias>
               <family>Courier</family>
                <prefer>
                        <family>CourierNew</family>
                </prefer>
                <default>
                       <family>monospace</family>
                </default>
        </alias>

   前面已经提到了hinting技术,MS对每种字体做了不同的hinting,详细可以到http://www.microsoft.com/typography/web/fonts/fonts02.htm查看,这里只贴出开头一小部分。对于表中没有的字体,MS也提供了工具来查看http://www.microsoft.com/typography/TrueTypeProperty21.mspx

                                       
                        Font                        name
               
                        Smoothing                        and hinting*
               
                        Also                        supplied with
               
                        Smoothed
               
                        Hinted
               
                        Both
               
                        Arial
               
                        0-6
               
                        7-13
               
                        14+
               
                        .Windows
                        .Web                        fonts
               
                        Arial                        Bold
               
                        0-6
               
                        7-8
               
                        9+
               
                        Arial                        Italic
               
                        0-6
               
                        7-13
               
                        14+
               
                        Arial                        Bold Italic
               
                        0-6
               
                        7-8
               
                        9+
               

   表里的smoothed就是指打开AAhinted是指打开hintingboth当然就指两者都开,单位是磅(pt)。大家看到,MS对待字体的hinting可不是一棒子打死,不同的字号是区分开的,正体、粗体、黑体等也是有区别的。我们这里要做的,就是针对不同的字体单独设置。
   先来一段总体的设置,对于没有单独设置的字形,就采用它了。autohinthinting是两种不同的字体微调技术,不建议同时开启。
        <matchtarget="font" >
                <editname="antialias" mode="assign" >
                       <bool>true</bool>               <!--   改成false即可关闭AA  -->
                </edit>
                <editname="autohint" mode="assign" >
                       <bool>false</bool>
                </edit>
                <editname="hinting" mode="assign" >
                       <bool>true</bool>              <!--   改成false即可关闭hinting -->
                </edit>
                <editname="hintstyle" mode="assign" >
                       <const>hintfull</const>     <!--   前面提到的hinting风格,在这里设置-->
                </edit>
        </match>

   表中看出,MS每种字体在0-6号字都只打开了AA,因此这段设置就是把所有MS字体06号开AA,关闭autohinthinting
        <matchtarget="font" >
                <testname="foundry" qual="any" >
                       <string>microsoft</string>   <!--   只针对MS的字体-->
                </test>
                <testname="size" compare="less_eq" >
                        <int>6</int>
                </test>
                <editname="antialias" mode="assign" >
                       <bool>true</bool>
                </edit>
                <editname="autohint" mode="assign" >
                       <bool>false</bool>
                </edit>
                <editname="hinting" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>
   下面我就通过表中数据Arial字体进行设置,其它字体类似(为节约篇幅,这里代码写得很紧凑)。
    <!--Arial正体 -->
        <matchtarget="font" >
                <testname="family" ><string>Arial</string></test>
                <testname="weight" compare="eq"><const>regular</const></test>
                <testname="slant" compare="eq"><const>roman</const></test>
                <testname="size" compare="more_eq"><int>7</int></test>
                <testname="size" compare="less_eq"><int>13</int></test>
                <editname="antialias" mode="assign"><bool>false</bool></edit>
                <editname="autohint" mode="assign"><bool>false</bool></edit>
                <editname="hinting" mode="assign"><bool>true</bool></edit>
                <editname="hintstyle" mode="assign"><const>hintfull</const></edit>
        </match>
    <!--   Arial 粗体  -->
        <matchtarget="font" >
                <testname="family" ><string>Arial</string></test>
                <testname="weight" compare="eq"><const>bold</const></test>
                <testname="slant" compare="eq"><const>roman</const></test>
                <testname="size" compare="more_eq"><int>7</int></test>
                <testname="size" compare="less_eq"><int>8</int></test>
                <editname="antialias" mode="assign"><bool>false</bool></edit>
                <editname="autohint" mode="assign"><bool>false</bool></edit>
                <editname="hinting" mode="assign"><bool>true</bool></edit>
                <editname="hintstyle" mode="assign"><const>hintfull</const></edit>
        </match>
  <!-- Arial 斜体 -->
        <matchtarget="font" >
                <testname="family" ><string>Arial</string></test>
                <testname="weight" compare="eq"><const>regular</const></test>
                <testname="slant" compare="eq"><const>italic</const></test>
                <testname="size" compare="more_eq"><int>7</int></test>
                <testname="size" compare="less_eq"><int>13</int></test>
                <editname="antialias" mode="assign"><bool>false</bool></edit>
                <editname="autohint" mode="assign"><bool>false</bool></edit>
                <editname="hinting" mode="assign"><bool>true</bool></edit>
                <editname="hintstyle" mode="assign"><const>hintfull</const></edit>
        </match>
  <!-- Arial 粗斜体 -->
        <matchtarget="font" >
                <testname="family" ><string>Arial</string></test>
                <testname="weight" compare="eq"><const>bold</const></test>
                <testname="slant" compare="eq"><const>italic</const></test>
                <testname="size" compare="more_eq"><int>7</int></test>
                <testname="size" compare="less_eq"><int>8</int></test>
                <editname="antialias" mode="assign"><bool>false</bool></edit>
                <editname="autohint" mode="assign"><bool>false</bool></edit>
                <editname="hinting" mode="assign"><bool>true</bool></edit>
                <editname="hintstyle" mode="assign"><const>hintfull</const></edit>
        </match>   
   大家也看到,fontconfig可让某些字体的某些字号开启或关闭指定的特性,用法非常灵活,参照manpagemanfonts-conf)。将MS每种字体都照表上的数据设置一下,不过工作量也太大了点,各位同胞要是有耐心可以照此修改,把它做完。但是,我也没发现这样做了之后字体变得有多么漂亮,也许是我的审美观有问题,或者就是太懒。所以我自己的电脑上,还是把所有字体设置一棒子打死(中文字体除外),hinting全开,hintstylehintfull,呵呵!别扁我!

   下面的就是针对中文字体的设置了,有的中文字体由于双宽度属性(spacing=dual,对于中文部分几乎没影响,但英文部分间隙太宽,不美观,所以将其调整为Proportional
        <matchtarget="font" >
                <testtarget="pattern" name="lang" compare="contains">
                       <string>zh</string>
                       <string>ja</string>
                       <string>ko</string>
                </test>
                <testname="spacing" compare="eq">
                       <const>dual</const>
                </test>
                <editname="spacing" mode="assign" >
                       <const>proportional</const>
                </edit>
                <editname="globaladvance" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>
   前面提到宋体和细明体都内嵌了点阵字体,下面我们就争对有点阵字体的字号单独关闭AA,让其使用字体内嵌的位图字体。
    <!--这里使用前面下载的宋体,它带了10-19点位图字体-->
       <matchtarget="font" >
                <testqual="any" name="family" compare="eq" >
                       <string>SimSun</string>
                       <string>宋体</string>
                       <string>NSimSun</string>
                       <string>新宋体</string>
                </test>
                <testname="pixelsize" compare="more_eq" >
                        <int>10</int>
                </test>
                <testname="pixelsize" compare="less_eq" >
                        <int>19</int>
                </test>
                <editname="antialias" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>
   <!--细明体和新细明体,带有111213151620点位图字体-->
        <matchtarget="font" >
                <testqual="any" name="family" compare="eq" >
                       <string>MingLiU</string>
                       <string>細明體</string>
                       <string>PMingLiU</string>
                       <string>新細明體</string>
                </test>
                <testname="pixelsize" compare="more_eq" >
                        <int>11</int>
                </test>
                <testname="pixelsize" compare="less_eq" >
                        <int>13</int>
                </test>
                <editname="antialias" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>
        <matchtarget="font" >
                <testqual="any" name="family" compare="eq" >
                       <string>MingLiU</string>
                       <string>細明體</string>
                       <string>PMingLiU</string>
                       <string>新細明體</string>
                </test>
                <testname="pixelsize" compare="more_eq" >
                        <int>15</int>
                </test>
                <testname="pixelsize" compare="less_eq" >
                        <int>16</int>
                </test>
                <editname="antialias" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>
        <matchtarget="font" >
                <testqual="any" name="family" compare="eq" >
                       <string>MingLiU</string>
                       <string>細明體</string>
                       <string>PMingLiU</string>
                       <string>新細明體</string>
                </test>
                <testname="pixelsize" compare="eq" >
                        <int>20</int>
                </test>
                <editname="antialias" mode="assign" >
                       <bool>false</bool>
                </edit>
        </match>

   如果你觉得宋体的英文部分不美观,可以使用其它英文字体替换掉,也就是中英文字体混用的问题,在Firefox中可以生效。
      <matchtarget="pattern">
                <testname="family" qual="any" >
                       <string>SimSun</string>
                       <string>宋体</string>
                       <string>PMingLiU</string>
                       <string>新細明體</string>
                </test>
                <editname="family" mode="prepend" binding="strong">
                       <string>Arial</string>   <!--  将英文不等宽字体替换为Arial-->
                </edit>
        </match>
        <matchtarget="pattern">
                <testname="family" qual="any" >
                       <string>NSimSun</string>
                       <string>新宋体</string>
                       <string>MingLiU</string>
                       <string>細明體</string>
                </test>
                <editname="family" mode="prepend" binding="strong">
                        <string>CourierNew</string>   <!-- 英文等宽字体替换为CourierNew -->
                </edit>
        </match>
    我将英文不等宽字体替换为Arial,等宽字体替换为CourierNew,如果你更喜欢其它英文字体,在上面注释处直接更改就可以了。

六、关于字体的修改
   关于fontconfig配置文件的写法我们就写到这里了,但其配置灵活,能实现的远不只这里说提到的功能,更多的写法还需要大家去发掘。由于Linux系统中GUI应用程序有很多种,如GTK1程序,GTK2Qt程序,有的支持fontconfig,有的不支持,还有一些特殊程序拥有自己的画字引擎,所以前面提到的配置不可能在所有的程序中生效。比如刚才提到的字体替换技术在Qt程序中好像不起作用,由于宋体内嵌的位图字体没有包括英文部分点阵,导致不开AA的情况下英文部分显示丑陋,但如果开AA,小号中文字体显示又不理想。于是我们就会想是否可以为其加上英文部分的点阵,让宋体在任何地方都有较好的显示效果,这能不能行得通呢?答案是肯定的。下面就为大家介绍如何使用工具来为宋体加上英文部分点阵。
    工具准备:
   fontforge,可直接对点阵字体或矢量字形进行编辑,这是我们的主要工具。工作平台:linux下载地址:http://fontforge.sourceforge.net/
    sbit32工作平台:windows下载地址:http://www.linuxfans.org/nuke/modules/Forums/files/sbit.zip
   ttctool工作平台:windows下载地址:http://www.linuxfans.org/nuke/modules/Forums/files/TTCTOOL_213.zip

   ttc字体是由多个ttf字体合并而来的。fontforge可以直接打开ttc字体,但当我们打开simsun.ttc时,发现其读不到131518点阵位图字体,同样打开fromnuaa兄制作的那款宋体也有同样的问题。这并不是因为宋体中没有包含这三种位图点阵,而是因为这三种点阵的flag=0(正常应为1)的缘故。解决方法是使用sbit32分离出这出这三种点阵信息,将它们从原字体中删除后再加入,就可以使其flag变为1,从而可以用fontforge打开编辑。但sbit32不支持ttc文件,因此我们需要先使用ttctoolttc字体分解为ttf字体。
    1.分割ttc字体为两个ttf字体
   解压TTCTOOL_213.zip,打开windows命令行,进入解压目录操作
    D:\>cdTTCTOOL_213
    D:\TTCTOOL_213>breakttc simsun.ttc
   这里我们使用fromnuaa兄制作的这款宋体。这步操作完成之后生成两个ttf字体,font000.ttffont001.ttf,其中一个是宋体,另一个是新宋体。由于宋体和新宋体除了英文部分是否是等宽的之外,其它一模一样,以后我们就只对宋体进行操作,去掉新宋体。
    2.flag=0的那部分点阵信息保存为单独的文件
   解压sbit32,同样我们也打开windows命令行,进入解压目录,将刚才生成的宋体(ttf)考贝到这里来,还是将字体文件名改为simsun.ttf吧。
    D:\sbit>sbit32-v -i  simsun.ttf
   这条命令将看到字体的详细信息,我们主要是看字体包含那些字号的点阵和它的flag。这里看到131518点阵字体的flag=0
   Sbit目录中有一个文件sample.met,用记事本打开它,可以看到其中只有几个字符ppemxx,我们将其改为ppem13,然后保存。
    D:sbit>sbit32-x simsun.ttf sample.met 13.bdf
   这条命令就将simsun.ttf文件中内嵌的13点位图点阵保存为13.bdf了。我们再修改sample.met文件为ppem15,然后用sbit32-x simsun.ttf sample.met 15.bdf15点位图字体保存下来了,同理,把18点位图字体保存下来。
    3.删除simsun.ttf字体中内嵌的flag=0的点阵字体
    sample.met文件的内容改为ppem13,再用这个命令得到一个不包含13点位图字体的simsun1.ttf
    D:\sbit>sbit32-d simsun.ttf sample.met simsun1.ttf
   再修改sample.met内容为ppem15,用下面这个命令得到一个不包含1315点位图字体的simsun2.ttf
    D:\sbit>sbit32-d simsun1.ttf sample.met simsun2.ttf
   同样的方法,得到一个不包含131518点位图字体的simsun3.ttf
    4.将刚才保存的bdf文件全部加入simsun3.ttf
    修改sample.met文件为ppem13,运行下面这条命令得到simsun4.ttf,包含了13点位图字体。
    D:\sbit>sbit32-a simsun3.ttf 13.bdf sample.met simsun4.ttf
   同样的方法,可由simsun4.ttf得到simsun5.ttf,再得到包含了1019所有位图字体的simsun6.ttf。我们迂回地做了这么多工作得到的simsun6.ttf,其实就是把131518点位图字体的flag变为了1,其它与simsun.ttf一模一样。有的读者可能会问,直接把第2步生成的bdf文件导入fontforge编辑不就行了吗?愦憾的是fontforge并不能正常地打开这些bdf文件。以下的工作,我们就用fontforge打开simsun6.ttf来添加英文点阵了。
    5.使用fontforge编辑字体。
   fontforge的安装是非常简单的,对于Fedora,除了在上面给出的地址下载安装外,还可以使用yuminstallfontforge命令自动安装。在终端下输入fontforge开始运行,你可能觉得界面也太丑了,不过还好是中文的。开始运行时就提示你打开一个字体,选择刚才生成的simsun6.ttf,等会儿会提示你载入位图字体,这时你应该可以看到10-1910种位图字体(如果少了几种,那么刚才的工作就没做好),点[选择全部],再点[是]打开字体。主界面以方格的形式显示每个字的形状。
   点[查看]菜单,菜单最下面可看到10-19十项菜单,点选它们主界面就切换到点阵位图字体查看状态,双击其中一个字,就可对这个字进行点阵信息编辑。我们的目标是对添加英文字体位图点阵,你可以手动一个个编辑,也可以将其它英文位图字体导入,这是一项十分繁琐的工作,不过不用担心,我已经帮大家做好了。
   firefox浏览网页时,你可能发现文字总是紧贴着下划线,十分不舒服,不过我们可以下移下划线的位置。点[基础]->[字体信息],弹出字体信息对话框,你可以对字体的很多信息进行查看和修改,但是建议不要乱动里面的信息。点左边的[一般],在右边找到[下划线位置],其默认为-22,把它改为-50,点确定,如果还出现提示信息,仍然点确定。
   最后,点[文件]->[生成字体],在生成字体对话框中,为新字体取一个名字,下面分别选择TrueTypeTTF/OTF,点[确定],出现dpi选项,选[估计]就可以了。需要注意的是如果使用了前面字体替换技术,这里的下划线设置就不起作用!不过由于现在我们已经对字体加入了英文位图点阵,也就不在担心英文显示太丑,所以在我的设置中没有使用字体替换技术。
   把这个新字体考到字体目录中,删掉原来的宋体,重启xfs服务,你会看到Linux下的宋体不管是中文还是英文,都已经和windows下的样子没有区别!

    (全文完)

    关于作者
    姓名:苟廷勇
    论坛IDwotooa
    MSNicecard@hotmail.com
   论坛ID的由来:其实这也和Linux有关。Ubuntu7.04刚发布时,我就去下载回来体验,它给我的第一感觉就是太漂亮了,因此决定由Fedora转向Ubuntu,并且开始向我的朋友灌输Ubuntu的好,才向朋友灌输的过程中,发现我将ubuntu念成了“我不吐”!但用了之后才发现,我RedHat/Fedora的功底在Ubuntu里都用不上,很多以前用得很熟悉的命令都不能用,常见的配置文件也找不到,以前可以轻松搞定的事在这里做不了,我得重新学过!过了一个多月,实在忍受不了,我终于“吐了”!“我吐啊”(wotooa)这个名字就这么出来了!这个名字实在有点不雅,不过既然与Linux有关,还是暂时留着吧!
    我又换回了久违的Fedora,狠下心来做美化,于是就有了这篇文章,呵呵