|
edora7(Moonshine)發(fā)布也有一段時(shí)間了,這個(gè)版本包含了GNOME2.18和KDE3.5.6,美工有很大的提高;使用Xorg1.3版本,對(duì)nVidia顯卡支持很好,支持顯示器的熱插拔和自動(dòng)識(shí)別;yum性能也得到很大的提升,其它各方面的表現(xiàn)都很不錯(cuò)的,唯一的缺點(diǎn)就是中文字體顯示不夠完美。雖然比FC6有了極大的提高,但還是趕不上Ubuntu7.04。于是就有了自己動(dòng)手美化中文顯示的想法,下面我把美化過(guò)程的整理給大家。 試驗(yàn)環(huán)境:Fedora7,KDE3.5.6,在GNOME和其它發(fā)行版本上差別應(yīng)該不大。 首先,我們來(lái)了解一些關(guān)于字體方面的知識(shí)。 一、點(diǎn)陣字體(BDF)與矢量字體(TrueType) 大家知道PC的 顯示器是點(diǎn)陣顯示設(shè)備,圖像顯示的精細(xì)程度取決于顯示器的分辨率。文字也必須轉(zhuǎn)換為點(diǎn)陣信息方可正常顯示。于是人們?cè)O(shè)計(jì)制作了點(diǎn)陣字體,這種字體類似于位 圖圖像,以點(diǎn)陣詳細(xì)記錄了字體大小、形狀;這樣字體信息被讀取后不需要任何轉(zhuǎn)換就可直接在顯示器上顯示,由于制作精細(xì),因此顯示效果也是最好的。但這種字 體不能縮放,需要為每種字號(hào)制作點(diǎn)陣信息才能滿足不同大小字體的顯示,因此導(dǎo)致字體制作工作量大、耗時(shí)、占用空間大等問題。后來(lái)人們?cè)O(shè)計(jì)了矢量字體,它是 用矢量圖形記錄了筆畫和字形等信息,解決了字體縮放的問題。 矢量字體在顯示時(shí)轉(zhuǎn)換為點(diǎn)陣信息后才能顯示,在小字體情況下,轉(zhuǎn)換得到的點(diǎn)陣信息質(zhì)量與點(diǎn)陣字體相差甚遠(yuǎn),導(dǎo)致小字體顯示效果很差。因此人們?nèi)煞N字體之長(zhǎng),設(shè)計(jì)了一種即包括小字體點(diǎn)陣信息,又包括矢量字形的字體。比如著名的宋體(simsun),它包括12、13、14、15、16、18點(diǎn)的點(diǎn)陣字庫(kù),還包括矢量字形。 矢量字體涉及到以下兩個(gè)概念: AA(anti-alias)抗鋸齒技術(shù),它將字型以實(shí)際數(shù)倍大小繪制,然后縮放成想要的大小,未能占滿一格像素的格子就用灰階填補(bǔ)。對(duì)于英文字符,因其筆劃簡(jiǎn)單,所以比較美觀,但對(duì)于中文小字體,會(huì)導(dǎo)致文字看起來(lái)發(fā)虛,模糊不清的問題。 hinting字體微調(diào)技術(shù),它是字體的一種額外信息,嵌入字體內(nèi)部,告訴字體渲染引擎如何渲染字體,使用字體看起來(lái)更美觀。但hinting制作復(fù)雜,非常耗時(shí),所以帶有良好hinting的字體并不多(特別是中文字體)。對(duì)于字體的hinting有四種風(fēng)格hintnone、hintslight、hintmedium、hintfull,分別是指無(wú)hinting、輕度hinting、中等hinting、完全hinting。 但hinting如果調(diào)整不好,可能導(dǎo)致字體顯示并不好看,且由于hinting是有專利的,不能免費(fèi)無(wú)限制地使用,freetype又做出了自己的字體微調(diào)技術(shù)autohint,經(jīng)過(guò)不斷改進(jìn),已經(jīng)改善了部分字體的顯示效果。autohint是通過(guò)程序來(lái)實(shí)現(xiàn)的,并且是針對(duì)所有字體,當(dāng)然不可能有專門為每種字體制作的hinting技術(shù)效果好。 二、重要的概念:DPI DPI(DotperInch),這是一個(gè)印刷上的單位,是指每英寸上的油墨點(diǎn)數(shù)。這里把DPI用來(lái)描述顯示器上每英寸所包括的像素(Pixel),其值越高越精細(xì),顯示效果就越好。由于顯示器的分辨率、點(diǎn)距(或珊距)及尺寸的不同,因此不同顯示器的DPI也有差別。 那么我們?nèi)绻?jì)算自己顯示器的DPI呢?先測(cè)出自己顯示器的寬(width)和高(height),單位是cm,知道顯示器的分辨率。注意,如果是液晶顯示器,則它只有一個(gè)分辨率即其最大分辨率。對(duì)于CRT顯示器,它可以用多種分辨率,你先將其調(diào)整為最合適的分辨率(比如17寸CRT顯示器調(diào)整為1024*768)。由于1(inch)=2.54(cm),于是有下面的公式: 水平DPI=(水平分辨率/width)*2.54 垂直DPI=(垂直分辨率/height)*2.54 有的顯示器上水平DPI和垂直DPI有少許出入,這也是正常的。 大家可以看出,同樣像素的字體在高DPI的顯示器上顯示出來(lái)會(huì)較小。既然不同顯示器的DPI不同,那么用像素來(lái)描述字的大小顯然不合適,于是還有一個(gè)字體大小的單位:磅(point)。 磅是重量單位?不,此磅非彼磅,在這里,它才是字體大小的絕對(duì)度量(沒忘記MSWord里的行距的單位吧)。 1磅=1/72英寸。 不管何種大小的字體,最終都要換算成像素之后,才能在屏幕上顯示。那么像素(px)和磅(pt)換算關(guān)系為: px=pt*DPI/72 用這個(gè)公式可以算出,一個(gè)9磅的字在96DPI的顯示器上用12像素來(lái)顯示,但在75DPI的顯示器上卻只用9像素來(lái)顯示。因此如果你的系統(tǒng)里為顯示器設(shè)置了錯(cuò)誤的DPI,那么最終顯示出來(lái)的字將是不正常的大小。 請(qǐng)注意,Firefox里設(shè)置的字體大小是以像素(px)為單位,在系統(tǒng)其它你能看到的絕大多數(shù)地方,都是以磅(pt)為字體大小單位。 好了,我們來(lái)看看自己Xserver的DPI設(shè)置: $xdpyinfo |grep resolution resolution: 75x75 dots per inch 通過(guò)上面的方法已經(jīng)得知我的顯示器DPI約為96,這里卻設(shè)為75,明顯不正確。打開/etc/X11/xorg.conf,在Section"monitor"段中加入DisplaySize參數(shù): Section"Monitor" …… DisplaySize 270 203 # 1024x768 96pi EndSection 重啟X后,再使用上述xdpyinfo命令便可看到效果。不管實(shí)際的DPI是多少,都建議你將DPI值設(shè)為6甚至12的倍數(shù)。因?yàn)槲覀兪褂冒鮼?lái)計(jì)算字體大小,在轉(zhuǎn)換時(shí)采用舍入方法來(lái)選擇鄰近的值作為字體最終的大?。ㄏ袼兀?,如果DPI值不為6或12的倍數(shù),將可能導(dǎo)致相鄰的字號(hào)轉(zhuǎn)換后得到相同或差別很大的像素的字。 打開/etc/X11/Xresources文件,找到開頭為Xft.dpi那一行將其冒號(hào)后的值改為96(你的實(shí)際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中,但是不建議這么做,因?yàn)樵谏?jí)或其它設(shè)置時(shí),可能會(huì)被覆蓋。如果沒有這個(gè)文件,則創(chuàng)建一個(gè)。這是一個(gè)XML格式的文件,下面會(huì)有詳細(xì)介紹。 上面兩個(gè)修改DPI值的地方,其中GTK程序會(huì)讀取Xresources文件中的設(shè)置,而Qt程序則會(huì)應(yīng)用fonts.conf或local.conf中的設(shè)置。 三、Linux系統(tǒng)下字體顯示原理 現(xiàn)代Linux的字體處理系統(tǒng)大都采用Xft、Fontconfig和Freetype來(lái)處理字體。 Fontconfig提供了一系列字體設(shè)定的函數(shù)庫(kù),應(yīng)用程序直接向其索取字型;還負(fù)責(zé)發(fā)現(xiàn)和自動(dòng)配置新字體,使新字體安裝變得簡(jiǎn)單。它由兩部分組成,其一是設(shè)定模塊,把XML配置文件轉(zhuǎn)換成Fontconfig的內(nèi)部設(shè)定;另一是對(duì)比模塊,將應(yīng)用程序傳來(lái)的字體樣式需求與現(xiàn)有字體對(duì)比入修改,傳回最相似的字體。 Xft也是一套library,它使用fontconfig找出來(lái)的字型,將其繪制出來(lái)。 Freetype可以說(shuō)是一種完整的字體光柵化引擎,它提供一個(gè)簡(jiǎn)單的、易用的并且統(tǒng)一的接口實(shí)現(xiàn)對(duì)多種字體文件的訪問。目前版本是2.x,與1.x版本相比主要是支持Anti-alias和hinting。freetype的改變會(huì)影響到Xft畫出來(lái)的字。 說(shuō)了這么一段大家一定頭暈了,其實(shí)我也暈了。簡(jiǎn)單地說(shuō)就是由Fontconfig選出來(lái)的字,再由Freetype決定如何去畫,最后由Xft來(lái)處理畫字。這是我個(gè)人的理解,可能可能不太準(zhǔn)確,請(qǐng)大家不吝指正。 四、安裝新字體 講了這么多枯燥而繁瑣的理論,可能有的讀者都已經(jīng)睡著了。好,我們下面開始進(jìn)行實(shí)際的美化操作! 安裝MScorefonts,這里http://corefonts./有下載地址和詳細(xì)的安裝方法,Redhat或Fedora的用戶可能使用下面這個(gè)命令來(lái)安裝,但前提是已經(jīng)可以上網(wǎng)并設(shè)置好yum源。 yuminstall msttcorefonts Debian/Ubuntu用戶: apt-getinstall msttcorefonts 十一種字體將會(huì)被安裝到/usr/share/fonts/msttcorefonts/目錄中。然后我們到windows中把中文字體細(xì)明體和新細(xì)明體(mingliu.ttc)、華文細(xì)黑(stxihei.ttf)也考到此目錄吧,你也可以把其它常用的中文字體(比如楷體、幼圓等)也考過(guò)來(lái),不過(guò)在下面的配置就不體現(xiàn)它們了。而對(duì)于宋體(simsun.ttc),我們?nèi)?/font>http://wyx./jmm/Computing/SIMSUN.rar下載fromnuaa兄制作的這個(gè)版本,它帶有10-19點(diǎn)十種點(diǎn)陣字體,比Windows帶的效果更好。Fedora使用的是文鼎的宋體(uming.ttf)和楷體(ukai.ttf),實(shí)在不怎么好看,可以把它刪去,當(dāng)然你也可以保留。之后重啟X字體服務(wù)"servicexfs restart"讓系統(tǒng)自動(dòng)發(fā)現(xiàn)并配置新字體。 五、fontconfig配置 前面介紹過(guò),fontconfig可以把應(yīng)用程序傳來(lái)的字體請(qǐng)求信息進(jìn)行匹配和修改,從而實(shí)現(xiàn)個(gè)性化定制,其配置文件為/etc/fonts/fonts.conf。這是一個(gè)XML文件,可以用任何編輯器編輯。但由于升級(jí)原因?qū)е麓宋募菀妆桓采w,所以建議大家把自定義的配置寫在/etc/fonts/local.conf中,這個(gè)文件與fonts.conf格式一模一樣下面是它的框架: <?xmlversion="1.0"?> <!DOCTYPEfontconfig SYSTEM "fonts.dtd"> <!--/etc/fonts/local.conf file to configure system font access --> <fontconfig> </fontconfig> 所有的配置都應(yīng)該寫在<fontconfig>和</fontconfig>之間,比如加入上面提到的設(shè)置DPI的語(yǔ)句,將變成下面的樣子: <?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> 我們以后的設(shè)置都是在這個(gè)文件<fontconfig>和</fontconfig>之間添加語(yǔ)句。fontconfig配置文件的語(yǔ)法非常靈活和復(fù)雜,manfonts-conf可以看到非常詳細(xì)的解釋和語(yǔ)法說(shuō)明,網(wǎng)上據(jù)說(shuō)有繁體中譯版本,但我一直沒有找到。如有時(shí)間,我把它翻譯一下發(fā)到論壇上。 <matchtarget="font" > <editname="rgba" mode="assign"> <const>rgb</const><!--不同的顯示器取值有所差別--> </edit> </match> 這一段是用來(lái)啟用液晶顯示器的次像素排列,是液晶顯示器的最佳顯示方式。大家知道,液晶顯示屏的每一個(gè)點(diǎn)都是用三原色RGB來(lái)合成各種顏色,但各種液晶顯示器的RGB排列方式卻可能不同,因此,取值也有多種:rgb、bgr、vrgb、vbgr,對(duì)于CRT顯示器,應(yīng)關(guān)閉此功能(將值設(shè)為none)。如果設(shè)置錯(cuò)誤,對(duì)于開AA的字體可能看起來(lái)花花綠綠,不太舒服。 在計(jì)算機(jī)中我們把字體分為無(wú)襯線字體(SanSerif)和(有)襯線字體(Serif)。無(wú)襯線字體的筆畫沒有多余修飾,比如黑體、幼圓,英文字體有Arial、Verdana及著名的Tahoma等;而襯線字體的筆畫的起始和結(jié)束通常都有一些裝飾,使字體看起來(lái)更美觀,比如宋體、楷體,Georgia和TimesNew Roman等。 而對(duì)于英文字體,還有等寬字體(monotype)和不等寬字體,故名思義,即英文字符占用寬度是相等的或不相等的。常見的等寬字體有Andalemono、CourierNew等。絕大多數(shù)人都認(rèn)為不等寬字體具有更好的外觀和可識(shí)別性,但在計(jì)算機(jī)有的環(huán)境中卻不利于排版(比如控制臺(tái)中)。 下面對(duì)各類字體提供別名,靠前的字體優(yōu)先級(jí)高。當(dāng)應(yīng)用程序請(qǐng)求系統(tǒng)中沒有的字體時(shí),將自動(dòng)用后面的字體替換。 <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>新細(xì)明體</family> <family>STXihei</family> <family>華文細(xì)黑</family> </prefer> </alias> <alias> <family>serif</family> <prefer> <family>TimesNew Roman</family> <family>Georgia</family> <family>SimSun</family> <family>宋體</family> <family>PMingLiU</family> <family>新細(xì)明體</family> </prefer> </alias> <alias> <family>monospace</family> <prefer> <family>CourierNew</family> <family>AndaleMono</family> <family>NSimSun</family> <family>新宋體</family> <family>MingLiU</family> <family>細(xì)明體</family> </prefer> </alias> 這里把宋體和新細(xì)明體也加入無(wú)襯線字體類別中了,因?yàn)閮?nèi)嵌點(diǎn)陣字形的宋體和新細(xì)明體,比黑體等無(wú)襯線字體會(huì)有更好的表現(xiàn)。 有的網(wǎng)頁(yè)使用了如Times,Helvetica等英文字體。原來(lái)系統(tǒng)中沒有這些字體,fontconfig將其映射到其它字體,看起來(lái)不夠美觀。我們加上下面這段: <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> 前面已經(jīng)提到了hinting技術(shù),MS對(duì)每種字體做了不同的hinting,詳細(xì)可以到http://www.microsoft.com/typography/web/fonts/fonts02.htm查看,這里只貼出開頭一小部分。對(duì)于表中沒有的字體,MS也提供了工具來(lái)查看http://www.microsoft.com/typography/TrueTypeProperty21.mspx
表里的smoothed就是指打開AA,hinted是指打開hinting,both當(dāng)然就指兩者都開,單位是磅(pt)。大家看到,MS對(duì)待字體的hinting可不是一棒子打死,不同的字號(hào)是區(qū)分開的,正體、粗體、黑體等也是有區(qū)別的。我們這里要做的,就是針對(duì)不同的字體單獨(dú)設(shè)置。 先來(lái)一段總體的設(shè)置,對(duì)于沒有單獨(dú)設(shè)置的字形,就采用它了。autohint和hinting是兩種不同的字體微調(diào)技術(shù),不建議同時(shí)開啟。 <matchtarget="font" > <editname="antialias" mode="assign" > <bool>true</bool> <!-- 改成false即可關(guān)閉AA --> </edit> <editname="autohint" mode="assign" > <bool>false</bool> </edit> <editname="hinting" mode="assign" > <bool>true</bool> <!-- 改成false即可關(guān)閉hinting --> </edit> <editname="hintstyle" mode="assign" > <const>hintfull</const> <!-- 前面提到的hinting風(fēng)格,在這里設(shè)置--> </edit> </match> 表中看出,MS每種字體在0-6號(hào)字都只打開了AA,因此這段設(shè)置就是把所有MS字體0-6號(hào)開AA,關(guān)閉autohint和hinting <matchtarget="font" > <testname="foundry" qual="any" > <string>microsoft</string> <!-- 只針對(duì)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> 下面我就通過(guò)表中數(shù)據(jù)對(duì)Arial字體進(jìn)行設(shè)置,其它字體類似(為節(jié)約篇幅,這里代碼寫得很緊湊)。 <!--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可讓某些字體的某些字號(hào)開啟或關(guān)閉指定的特性,用法非常靈活,參照manpage(manfonts-conf)。將MS每種字體都照表上的數(shù)據(jù)設(shè)置一下,不過(guò)工作量也太大了點(diǎn),各位同胞要是有耐心可以照此修改,把它做完。但是,我也沒發(fā)現(xiàn)這樣做了之后字體變得有多么漂亮,也許是我的審美觀有問題,或者就是太懶。所以我自己的電腦上,還是把所有字體設(shè)置一棒子打死(中文字體除外),hinting全開,hintstyle為hintfull,呵呵!別扁我! 下面的就是針對(duì)中文字體的設(shè)置了,有的中文字體由于雙寬度屬性(spacing=dual),對(duì)于中文部分幾乎沒影響,但英文部分間隙太寬,不美觀,所以將其調(diào)整為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> 前面提到宋體和細(xì)明體都內(nèi)嵌了點(diǎn)陣字體,下面我們就爭(zhēng)對(duì)有點(diǎn)陣字體的字號(hào)單獨(dú)關(guān)閉AA,讓其使用字體內(nèi)嵌的位圖字體。 <!--這里使用前面下載的宋體,它帶了10-19點(diǎn)位圖字體--> <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> <!--細(xì)明體和新細(xì)明體,帶有11,12,13,15,16,20點(diǎn)位圖字體--> <matchtarget="font" > <testqual="any" name="family" compare="eq" > <string>MingLiU</string> <string>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</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>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</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>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</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>新細(xì)明體</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>細(xì)明體</string> </test> <editname="family" mode="prepend" binding="strong"> <string>CourierNew</string> <!-- 英文等寬字體替換為CourierNew --> </edit> </match> 我將英文不等寬字體替換為Arial,等寬字體替換為CourierNew,如果你更喜歡其它英文字體,在上面注釋處直接更改就可以了。 六、關(guān)于字體的修改 關(guān)于fontconfig配置文件的寫法我們就寫到這里了,但其配置靈活,能實(shí)現(xiàn)的遠(yuǎn)不只這里說(shuō)提到的功能,更多的寫法還需要大家去發(fā)掘。由于Linux系統(tǒng)中GUI應(yīng)用程序有很多種,如GTK1程序,GTK2及Qt程序,有的支持fontconfig,有的不支持,還有一些特殊程序擁有自己的畫字引擎,所以前面提到的配置不可能在所有的程序中生效。比如剛才提到的字體替換技術(shù)在Qt程序中好像不起作用,由于宋體內(nèi)嵌的位圖字體沒有包括英文部分點(diǎn)陣,導(dǎo)致不開AA的情況下英文部分顯示丑陋,但如果開AA,小號(hào)中文字體顯示又不理想。于是我們就會(huì)想是否可以為其加上英文部分的點(diǎn)陣,讓宋體在任何地方都有較好的顯示效果,這能不能行得通呢?答案是肯定的。下面就為大家介紹如何使用工具來(lái)為宋體加上英文部分點(diǎn)陣。 工具準(zhǔn)備: fontforge,可直接對(duì)點(diǎn)陣字體或矢量字形進(jìn)行編輯,這是我們的主要工具。工作平臺(tái):linux。下載地址:http://fontforge./ sbit32,工作平臺(tái):windows。下載地址:http://www./nuke/modules/Forums/files/sbit.zip ttctool,工作平臺(tái):windows。下載地址:http://www./nuke/modules/Forums/files/TTCTOOL_213.zip ttc字體是由多個(gè)ttf字體合并而來(lái)的。fontforge可以直接打開ttc字體,但當(dāng)我們打開simsun.ttc時(shí),發(fā)現(xiàn)其讀不到13、15、18點(diǎn)陣位圖字體,同樣打開fromnuaa兄制作的那款宋體也有同樣的問題。這并不是因?yàn)樗误w中沒有包含這三種位圖點(diǎn)陣,而是因?yàn)檫@三種點(diǎn)陣的flag=0(正常應(yīng)為1)的緣故。解決方法是使用sbit32分離出這出這三種點(diǎn)陣信息,將它們從原字體中刪除后再加入,就可以使其flag變?yōu)?/font>1,從而可以用fontforge打開編輯。但sbit32不支持ttc文件,因此我們需要先使用ttctool將ttc字體分解為ttf字體。 1.分割ttc字體為兩個(gè)ttf字體 解壓TTCTOOL_213.zip,打開windows命令行,進(jìn)入解壓目錄操作 D:\>cdTTCTOOL_213 D:\TTCTOOL_213>breakttc simsun.ttc 這里我們使用fromnuaa兄制作的這款宋體。這步操作完成之后生成兩個(gè)ttf字體,font000.ttf和font001.ttf,其中一個(gè)是宋體,另一個(gè)是新宋體。由于宋體和新宋體除了英文部分是否是等寬的之外,其它一模一樣,以后我們就只對(duì)宋體進(jìn)行操作,去掉新宋體。 2.將flag=0的那部分點(diǎn)陣信息保存為單獨(dú)的文件 解壓sbit32,同樣我們也打開windows命令行,進(jìn)入解壓目錄,將剛才生成的宋體(ttf)考貝到這里來(lái),還是將字體文件名改為simsun.ttf吧。 D:\sbit>sbit32-v -i simsun.ttf 這條命令將看到字體的詳細(xì)信息,我們主要是看字體包含那些字號(hào)的點(diǎn)陣和它的flag。這里看到13、15、18點(diǎn)陣字體的flag=0。 Sbit目錄中有一個(gè)文件sample.met,用記事本打開它,可以看到其中只有幾個(gè)字符ppemxx,我們將其改為ppem13,然后保存。 D:sbit>sbit32-x simsun.ttf sample.met 13.bdf 這條命令就將simsun.ttf文件中內(nèi)嵌的13點(diǎn)位圖點(diǎn)陣保存為13.bdf了。我們?cè)傩薷?/font>sample.met文件為ppem15,然后用sbit32-x simsun.ttf sample.met 15.bdf把15點(diǎn)位圖字體保存下來(lái)了,同理,把18點(diǎn)位圖字體保存下來(lái)。 3.刪除simsun.ttf字體中內(nèi)嵌的flag=0的點(diǎn)陣字體 把sample.met文件的內(nèi)容改為ppem13,再用這個(gè)命令得到一個(gè)不包含13點(diǎn)位圖字體的simsun1.ttf D:\sbit>sbit32-d simsun.ttf sample.met simsun1.ttf 再修改sample.met內(nèi)容為ppem15,用下面這個(gè)命令得到一個(gè)不包含13、15點(diǎn)位圖字體的simsun2.ttf D:\sbit>sbit32-d simsun1.ttf sample.met simsun2.ttf 同樣的方法,得到一個(gè)不包含13、15、18點(diǎn)位圖字體的simsun3.ttf 4.將剛才保存的bdf文件全部加入simsun3.ttf中 修改sample.met文件為ppem13,運(yùn)行下面這條命令得到simsun4.ttf,包含了13點(diǎn)位圖字體。 D:\sbit>sbit32-a simsun3.ttf 13.bdf sample.met simsun4.ttf 同樣的方法,可由simsun4.ttf得到simsun5.ttf,再得到包含了10-19所有位圖字體的simsun6.ttf。我們迂回地做了這么多工作得到的simsun6.ttf,其實(shí)就是把13、15、18點(diǎn)位圖字體的flag變?yōu)榱?/font>1,其它與simsun.ttf一模一樣。有的讀者可能會(huì)問,直接把第2步生成的bdf文件導(dǎo)入fontforge編輯不就行了嗎?憒憾的是fontforge并不能正常地打開這些bdf文件。以下的工作,我們就用fontforge打開simsun6.ttf來(lái)添加英文點(diǎn)陣了。 5.使用fontforge編輯字體。 fontforge的安裝是非常簡(jiǎn)單的,對(duì)于Fedora,除了在上面給出的地址下載安裝外,還可以使用yuminstallfontforge命令自動(dòng)安裝。在終端下輸入fontforge開始運(yùn)行,你可能覺得界面也太丑了,不過(guò)還好是中文的。開始運(yùn)行時(shí)就提示你打開一個(gè)字體,選擇剛才生成的simsun6.ttf,等會(huì)兒會(huì)提示你載入位圖字體,這時(shí)你應(yīng)該可以看到10-19共10種位圖字體(如果少了幾種,那么剛才的工作就沒做好),點(diǎn)[選擇全部],再點(diǎn)[是]打開字體。主界面以方格的形式顯示每個(gè)字的形狀。 點(diǎn)[查看]菜單,菜單最下面可看到10-19十項(xiàng)菜單,點(diǎn)選它們主界面就切換到點(diǎn)陣位圖字體查看狀態(tài),雙擊其中一個(gè)字,就可對(duì)這個(gè)字進(jìn)行點(diǎn)陣信息編輯。我們的目標(biāo)是對(duì)添加英文字體位圖點(diǎn)陣,你可以手動(dòng)一個(gè)個(gè)編輯,也可以將其它英文位圖字體導(dǎo)入,這是一項(xiàng)十分繁瑣的工作,不過(guò)不用擔(dān)心,我已經(jīng)幫大家做好了。 firefox瀏覽網(wǎng)頁(yè)時(shí),你可能發(fā)現(xiàn)文字總是緊貼著下劃線,十分不舒服,不過(guò)我們可以下移下劃線的位置。點(diǎn)[基礎(chǔ)]->[字體信息],彈出字體信息對(duì)話框,你可以對(duì)字體的很多信息進(jìn)行查看和修改,但是建議不要亂動(dòng)里面的信息。點(diǎn)左邊的[一般],在右邊找到[下劃線位置],其默認(rèn)為-22,把它改為-50,點(diǎn)確定,如果還出現(xiàn)提示信息,仍然點(diǎn)確定。 最后,點(diǎn)[文件]->[生成字體],在生成字體對(duì)話框中,為新字體取一個(gè)名字,下面分別選擇TrueType和TTF/OTF,點(diǎn)[確定],出現(xiàn)dpi選項(xiàng),選[估計(jì)]就可以了。需要注意的是如果使用了前面字體替換技術(shù),這里的下劃線設(shè)置就不起作用!不過(guò)由于現(xiàn)在我們已經(jīng)對(duì)字體加入了英文位圖點(diǎn)陣,也就不在擔(dān)心英文顯示太丑,所以在我的設(shè)置中沒有使用字體替換技術(shù)。 把這個(gè)新字體考到字體目錄中,刪掉原來(lái)的宋體,重啟xfs服務(wù),你會(huì)看到Linux下的宋體不管是中文還是英文,都已經(jīng)和windows下的樣子沒有區(qū)別! (全文完) 關(guān)于作者 姓名:茍廷勇 論壇ID:wotooa MSN:icecard@hotmail.com 論壇ID的由來(lái):其實(shí)這也和Linux有關(guān)。Ubuntu7.04剛發(fā)布時(shí),我就去下載回來(lái)體驗(yàn),它給我的第一感覺就是太漂亮了,因此決定由Fedora轉(zhuǎn)向Ubuntu,并且開始向我的朋友灌輸Ubuntu的好,才向朋友灌輸?shù)倪^(guò)程中,發(fā)現(xiàn)我將ubuntu念成了“我不吐”!但用了之后才發(fā)現(xiàn),我RedHat/Fedora的功底在Ubuntu里都用不上,很多以前用得很熟悉的命令都不能用,常見的配置文件也找不到,以前可以輕松搞定的事在這里做不了,我得重新學(xué)過(guò)!過(guò)了一個(gè)多月,實(shí)在忍受不了,我終于“吐了”!“我吐啊”(wotooa)這個(gè)名字就這么出來(lái)了!這個(gè)名字實(shí)在有點(diǎn)不雅,不過(guò)既然與Linux有關(guān),還是暫時(shí)留著吧! 我又換回了久違的Fedora,狠下心來(lái)做美化,于是就有了這篇文章,呵呵 |
|||||||||||||||||||||||||
|
|
來(lái)自: sigmon > 《技術(shù)文章》