修改ttf字體美化顯示效果

很多人在使用 linux 做桌面時常常會抱怨字體模糊、破碎變形、英文不好看、沒有粗斜體等。在 firefly(臺灣) http://firefly.idv.tw/test/Forum.php?Board=1 和 akito(日本) http://www.kde.gr.jp/~akito/xft/ 等各位前輩的努力下顯示效果已經有了極大進步,可以說不遜於 windows ,但是都要對現有字體引擎打補丁、作修改。而且 CJK(中日韓)等字體的粗、斜效果是用算法實現的。而不是像使用字符文字的國家那樣使用真正的粗體字、斜體字、粗斜體
Windows 下常用的 arial、courier、times、verdana 等也都是通過定義 4 個相關字體實現的粗斜體,最爲人們津津樂道的 Tahoma 也是有“常規”和“粗體”兩種字型,而不是用算法。這樣的效果應該會更好,可以在字體最初設計階段就達到最爲匹配的粗、斜效果,而不會因平臺和字體渲染引擎的原因對粗、斜體的顯示效果產生較大影響,以及用算法生成時導致的耗費更多計算時間





下面就介紹通過修改已有字體實現美化的方法
如無特殊說明,矢量字均指 TureType 字體,點陣字均指 bdf 字體,字體渲染引擎均指 X 的 Xft/freetype/fontconfig 系統
fontforge 和 xmbdfed 這些工具也在不停的發展完善,有一些功能選項也有了部分變化,你在使用時可能會看到一些小的不同,還請諒解我不能及時更新這份文章






字體的製作過程(具體參見 http://www.foundertype.com/jishujl/aboutStyle.htm ):字體是先由專業字體設計師在紙上固定大小的範圍內,書寫出統一風格的漢字字形設計稿。然後掃描成高精度點陣字庫,同時給出其字庫編碼。接着將剛纔掃描到的點陣字體矢量化。經過人工修字等步驟後得到的

點陣字體:這種字體類似於位圖圖像,以每個象素(點)爲單位,詳細記錄了字體大小、形狀。使用時直接讀取並顯示,所以效果很好,但是也因此導致只能適用於某種固定情況。如果要在別的分辨率、dpi 下顯示的話就需要另外再製作字體。這就導致字體制作量大、費時,佔用存儲空間大等問題。也決定了點陣字體不受 AA 和 hinting 的影響。 常用代表字型是 BDF、PCF。BDF 是純文本的文本文件,PCF 是二進制的,所以顯示效率要比 BDF 的好些

可縮放字體:它類似於矢量圖形,是利用曲線公式來描繪字框,記錄的是筆畫和顯示方式而不是具體內容,能按照需要進行任意尺寸的縮放或其它變形,例如傾斜。因此單獨一個字體就可以顯示多種不同字號的字型。但是計算相對點陣字體耗時。常用代表字型就是 TrueType(ttf),它是由 Apple 及 Microsoft 爲了對抗 Adobe 的 PostScript 所共同制定,開放標準。並且由系統直接提供支持,不需外掛其它管理程序
點陣字體(位圖字體)和可縮放字體(矢量字體)的關係就類似於 wav 和 midi、psd 和 ai 的關係

TrueType 字體分類


變寬、等寬:TrueType 字體分成兩種,一種是每個字符寬度不一樣,比如 w 與 i 就不等寬。它是在每個字符中紀錄該字符的寬度,大多數的 TrueType 都是這種格式
另一種就是固定字距。也就是每個字符寬度都一樣,這樣顯示或打印時,會有對齊效果,比較美觀。只有把等寬字體用在虛擬終端纔不會出現字符重疊的現象
例如:bitsteam vera sans 就是變寬的比例字體,而bitsteam vera sans mono 就是等寬的字體

襯線、無襯線:Serif(某些印刷體字母各端部的短線)就是襯線的意思,例如 M 的起點於終點、T的左右兩端。它是由羅馬刻印字母所發展出來的,用以改良字體的優雅程度與易讀性。它們是先用毛筆寫在石頭上,然後再刻出來的。Serif 會活存到現在,是因爲它們十分美麗及古典,而且它們閱讀起來比較容易。它的特點是字體粗細對比明顯,比較省眼力。適合作爲段落文字使用。特別是對於細小的文本字體,非常適合用。例如 Times New Roman
Sans Serif(Sans 是法文裏的“無”,有時也簡寫作 Sans)就是無襯線,就是邊緣是方的字。sans serif 一般字體用作較短的文字或者裝飾用。但是大段看多了之後眼睛容易累,所以正文都是用serif字體。它的特點是字體粗細平均,對比不明顯,閱讀時比較費力。適合作爲標題使用,不宜作爲正文大段顯示。例如 Arial、Verdana、Tahoma、Helvetica 等等

以上等寬、襯線等分類都是應用在英文等字母文字上的,並不適用於中文這些表意文字。但如果單純按照特點來劃分的話,中文應該屬於等寬字體。中文中的宋體、標宋屬於襯線字體,黑體、圓體屬於無襯線字體
中文字體都是四四方方的方塊字,也沒有什麼粗體、斜體之分。按照國家標準就是宋體、楷體、仿宋體、黑體(宋楷仿黑)這 4 種字體,當然還有很多其它美術體、書法體等。但是爲了適應英文字體的顯示方式,還使用了粗斜,遺憾。關於用宋楷仿黑字型來替代粗斜的方法可以參看 實現字型替代: http://www.linuxfans.org/nuke/module...wtopic&t=99214



anti-alias(反鋸齒、字體平滑):是針對可縮放字體的技術,會讓字體邊緣看起來圓滑、無鋸齒。它將字型先在幕後以數倍的大小來繪製,然後再縮成想要的大小,未能佔滿一格像素(pixel)的格子就用灰色填補。所以對於大字體,因爲相應的筆畫變粗,字體邊緣的灰階相對整體變少,所以效果很好。小字體時類似於英文這些筆畫較少、相對簡單的字符文字也會好看些,但是對於部分中文矢量字體就會導致在小字體時因邊緣灰度過多而看起來模糊發虛
圖中左邊是無 AA 的效果,右邊是 AA 後的。可以明顯看到 AA 效果
http://www.linuxfans.org/nuke/modules/Forums/files/aa-nonaa.gif
這裏有 AA 的詳細信息 http://www.truetype.demon.co.uk/ttalias.htm
http://www.widearea.co.uk/designer/anti.html
http://www.microsoft.com/typography/links/link9.aspx

hinting(字體暗示、微調):是用來優化小字體顯示的方法。由於顯示器的種類不同 (CRT & LCD),同種顯示器的點距也不同,使用環境(分辨率、dpi)也不盡相同,所以矢量字體的縮放就需要考慮更多的問題。如果控制得不好就會造成小字體破碎變形等情況。hinting 就是額外的信息,它嵌入在字體內部,人工的,詳細指定了如何在字體縮放、變形後的顯示方法,字體渲染引擎就根據 hinting 處理這些矢量字體的顯示,使得小字的時候看起來更美觀。也因此 hinting 是非常費時費力的工作,不是所有的字體都有,更不是所有的字體做的都好。truetype 字體很多,但是有良好 hinting 的並不多,劣質的 hinting 不但不會讓字體更好看,還會讓字變得更糟糕。對於筆劃複雜、字符繁多的文字(如中文)帶有 hinting 的字體更是極少。也就使得很多中文字體看起來不如英文字體好看
這裏有 hinting 的詳細信息 http://www.microsoft.com/typography/...tingIntro.mspx
圖中左邊是無 hinting 的效果,右邊是 hinting 後的。可以明顯看到 hinting 在顏色、間距、高低、勻稱、weight 等方面都能達到很好的效果

http://www.linuxfans.org/nuke/modules/Forums/files/hint-nonhint.gif


也可以查看這篇文章,以獲得更多信息。FreeType字體程序庫介紹: http://www.infomall.cn/cgi-bin/mallg...cle/ftintr.htm



綜上所述,單就字體本身方面,解決方法有三種:一就是使用上面提到的點陣字。二就是加粗、加黑、加深字型,讓它佔據更多的像素,而不是用灰色的點填充邊緣。三就是使用 hinting 技術
第三種方法顯然是不太現實,因爲中文字體太過衆多和複雜,針對每個字體進行微調太過困難和耗時。所以就只能使用點陣字體,也可以是內嵌點陣的矢量字體(此時需要關閉anti-alias(AA));或者加粗加黑的矢量字體(此時需要開anti-alias(AA)。以便達到滿意的顯示效果
Windows 下的 simsun 就是通過在某些小字號時使用嵌入點陣字體並關掉anti-alias(AA)來獲得清晰的顯示效果的
MacOS X 則是通過使用使用華文黑體這種加粗、加深了的字體配合anti-alias(AA)來做界面字體以達到較好的顯示效果





方法:



點陣字關 anti-alias(AA)解決方案
關掉 anti-alias(AA)
選擇一款你看起來舒服的中文矢量字體用做“常規”字體的顯示,並嵌入“常規”字型的點陣
另一款中文矢量字體用做“粗體”字體的顯示,並嵌入“粗體”字型的點陣
以修改過的“常規”字體爲基礎生成“斜體”字。也可以找一款現成的字體作爲“斜體”
以修改過的“粗體”字體爲基礎生成“粗斜體”字。也可以找一款現成的字體作爲“粗斜體”
這四種字體一定要粗細適度、傾斜得當,能夠互相搭配纔會好看。例如:宋體搭配粗宋、黑體搭配粗黑。當然,如果你不這麼做我也沒辦法
修改後的四種字體的 Family(族)都必須要相同,這樣系統才能在需要顯示粗、斜、粗斜等字體時自動調用對應得字體,這也是修改字體的目的和關鍵一步
如果你覺得這種字體的英文部分不夠好看,還可以用其它你中意的英文字體替換掉其中相同的字符,以獲得更滿意的顯示效果

矢量字粗體開 anti-alias(AA)解決方案——類似於方法 1.只是不需要嵌入點陣字體
打開 anti-alias(AA)
選擇一款你看起來舒服的中文矢量字體用做“常規”字體的顯示
另一款中文矢量字體用做“粗體”字體的顯示
以修改過的“常規”字體爲基礎生成“斜體”字。也可以找一款現成的字體作爲“斜體”
以修改過的“粗體”字體爲基礎生成“粗斜體”字。也可以找一款現成的字體作爲“粗斜體”
這四種字體一定要粗細適度、傾斜得當,能夠互相搭配纔會好看。例如:宋體搭配粗宋、黑體搭配粗黑。當然,如果你不這麼做我也沒辦法
修改後的四種字體的 Family(族)都必須要相同,這樣系統才能在需要顯示粗、斜、粗斜等字體時自動調用對應得字體,這也是修改字體的目的和關鍵一步
如果你覺得這種字體的英文部分不夠好看,還可以用其它你中意的英文字體替換掉其中相同的字符,以獲得更滿意的顯示效果





工具:
fontforce 原名pfaedit 主頁: http://fontforge.sourceforge.net/ 工作平臺:linux
xmbdfed 下載 http://crl.nmsu.edu/~mleisher/gbdfed.html 工作平臺:linux
sbit32 下載: http://www.linuxfans.org/nuke/module...files/sbit.zip 工作平臺:windows(也可以用wine模擬)
ttctool 下載: http://www.linuxfans.org/nuke/module...TCTOOL_213.zip 工作平臺:windows
Font properties extension 下載: http://download.microsoft.com/downlo...cbf/ttfext.exe 工作平臺:windows
可選工具:
Font Creator Program 主頁: http://www.high-logic.com/ 工作平臺:windows
AsiaFont Studio 主頁: http://www.fontlab.com/html/asiafontstudio.html/ 工作平臺:windows
(我沒怎麼用過,所以不進行介紹。如果各位有興趣儘可以自己嘗試。AsiaFont Studio據說是生成中文粗體的好工具,但官方主頁被誤傷,無法訪問,而且新版的破解也不好找)


優缺點:
不用對現有字體引擎打補丁、做修改,即可以實現你想要的中文粗斜體
比較麻煩;有版權問題;比較配套能互相做粗、斜、常規的字體不好找



Font properties extension 工具:用於查看 ttf 字體的擴展信息
安裝好後,在 windows 下右擊 ttf 字體就可以看到更多更詳細的信息
更多信息可以查看 http://www.microsoft.com/typography/...roperty21.mspx

ttctool 工具:用於處理 ttc 字體
有些工具無法使用 ttc 文件,就需要先用
ttctool 工具:用於處理 ttc 字體
有些工具無法使用 ttc 文件,就需要先用
代碼:
breakttc.exe fontname.ttc

命令把 ttc 分解爲獨立的多個 ttf 文件,然後再進行進一步的處理
代碼:
makettc ttcfilename.ttc ttf1filename.ttf ttf2filename.ttf ttf3filename.ttf ……

用於把多個獨立的 ttf 文件合併成一個 ttc
這套工具無法處理長文件名,有 8.3 格式的限制,否則會提示找不到字體,所以要注意字體的文件名
例子:
分解 simsun.ttc。
代碼:
breakttc.exe simsun.ttc

就會得到 font00.ttf 和font01.ttf 兩個字體
整合 font00.ttf 和 font01.ttf 爲一個文件
代碼:
makettc.exe new.ttc font00.ttf font01.ttf

就會得到合併後的 new.ttc 字體集合

sbit32 工具:用於處理 ttf 中的點陣字體
具體命令可以自己運行
代碼:
sbit -?

看幫助和壓縮包中的 doc 文件。它在使用時會用到 .met 文件,它是一個純文本文件,具體寫法可以查看 doc 文件。最簡單寫法就是
代碼:
PPEM x

x 爲要處理的點陣(bdf)文件的 pixel
這個工具也不是所有點陣都能處理的。像東文宋體,雖然可以看到點陣的信息但是卻無法提取。總體來說這個工具很好,某些 fontforge 無法處理的字體就可以用它。在這方面就推薦用它來代替 fontforge 完成相關工作
以上面從 simsun.ttf 中分解出的 font00.ttf 爲例:



先查看字體信息
代碼:
sbit32.exe -i font00.ttf

可以看到它集成了 12、14、16、18、15、13,6 個 pixel 的點陣字,這也就是爲什麼微軟的宋體在很多不同大小時仍好看的原因。加上
代碼:
– v

參數可以看到更詳細的信息。而用 fontforge 時只能看到 12、14、16 這 3 個點陣,就是因爲 flags 被設置爲了 0 的緣故

提取點陣。這時就要用到 .met 文件了。修改 sample.met 的內容爲
代碼:
PPEM 12

後,保存
代碼:
sbit32.exe -x font00.ttf sample.met 12.bdf

就可以提取出 12 pixel 大小的點陣。再想提取其餘別的 bdf 文件時,就要依次修改 sample.met 文件內
代碼:
PPEM

的值後再進行提取。也可加上
代碼:
– v

參數看到更詳細的信息

嵌入點陣。類似於提取點陣的方法
代碼:
sbit.exe -a font00.ttf 12.bdf sample.met new.ttf

也要注意修改 sample.met 以便針對不同的點陣。也可加上
代碼:
– v

參數看到更詳細的信息

刪除點陣
代碼:
sbit32.exe -d font00.ttf sample.met new.ttf

也要注意修改 sample.met 以便針對不同的點陣。也可加上
代碼:
– v
參數看到更詳細的信息



xmbdfed 工具:用於處理 bdf 格式的點陣字



導入字體:
在終端執行 xmbdfed 以後,選擇 File--Import 就可以導入多種非 bdf 格式的字體文件進行修改。這裏選 TureType Font 就可以導入 ttf 或 ttc 字體。可以分別選擇其中包含的字體、平臺和編碼。一般使用 Microsoft 和 ISO10646。然後就可以直接保存 Save As 爲一個 bdf 文件

加粗字體:
打開 Open 或者導入 Import 一個字體後,執行 Operations--Embolden Glyphs 然後選擇 All Glyphs,按 Embolden 就可以加粗字體。多次執行就可以繼續加粗。其實質是將字符向右平移複製了一個單位。我們可以單獨找一個字符做一下試驗。隨邊找一個字符,雙擊打開修改窗口,執行 Operation--Embolden 就可以清楚看到它只是簡單的在原字體右側進行了重畫線的工作
這種加粗方法目前還有一些缺點。當一個字符很小,或者比劃很繁複的時候,會讓加粗後的字符看起來聚在一起,看起來像一個疙瘩,不清楚。而且對於 iso10646 之類的既有表意(中文)又有非表意(英文)之類編碼的字體,會由於上行高度(ascent)和下行高度(descent)不統一,造成加粗後字體的標點符號位置靠上,在右上角,而不是右下角的位置

生成斜體:
類似於生成粗體的方法。打開 Open 或者導入 Import 一個字體後,執行 Operations--Shear Glyphs 然後輸入傾斜角度,可選範圍是-45度~~+45 度。然後選擇 All Glyphs,按 Shear 就可以生成斜體。我們可以單獨找一個字符做一下試驗。隨邊找一個字符,雙擊打開修改窗口,執行 Operation--Shear 輸入數值後按 Shear 就可以生成傾斜效果

參數配置:
通過 Edit--Setup 選項可以設置一些默認參數。建議大家把 resolution 都設置爲 72。因爲點是固定大小的,在數字印刷中,一點(point)等於 1/72 英寸,這樣便於計算。改變完參數後要記得依次點擊 Update、Save Setup 以保存設置

修改字體信息:
Edit--Font Info 修改某參數後 Update 保存即可

修改字體屬性:
Edit--Properties 刪除 Delete 或者修改某屬性後 Update 保存即可。例如 COPYRIGHT、FAMILY_NAME、FOUNDRY 之類的。修改完之後記得 Edit--Font Name--Update Name From Properties 一下,就可以在主界面的 Font 欄看到 Name 變化後的效果。也可以直接更改 Font 欄的內容,然後用 Edit--Font Name--Update Properties From Name 命令從字體名更改屬性。有關其中字體名的詳細寫法和意義可以參看

導入字體:
基本上沒什麼好說的,提一下其中的 File--Import--Server Font 命令。xmbdfed 默認情況下導入 TureType 字體只能是 iso10646 編碼的。如果實際內嵌點陣沒有對應大小的字符時,它會根據對應編碼位的矢量字用算法生成點陣。當然效果肯定沒有人力手工製作並嵌入的點陣效果好。舉個例子:用 File--Import--TrueType Font 命令導入的 simsun.ttf 會自動生成 latin 1 部分的點陣一樣,而實際 simsun 只內嵌有 GB 編碼的中文字
如果想導入 GB2312 或者 GBK 之類的話。先按照正常方法安裝你想提取點陣的字體,關鍵就是配置 X 核心字體子系統部分,使它能識別這個字體,特別是要寫對 fonts.dir 文件。然後用 File--Import--Server Font 命令就能正常導入、導出其它多種編碼的點陣字了。並且在導入字體時可以直接給出字號、分辨率以便提出符合要求的點陣
fonts.dir 的具體寫法可以參看 Linux字體設置fonts.dir文件分析: http://www.linuxfans.org/nuke/module...ight=fonts.dir


還要說一下,這個工具對 bdf 文件的格式要求很嚴格。用 fontforge 或者 sbit32 提取出的 bdf 字體不能夠打開,導致應用起來有些困難
xmbdfed 更詳細的用法可以參看 man 手冊、help 或者 http://crl.nmsu.edu/~mleisher/xmbdfed-doc.html


fontforce 工具:



提取點陣:
打開含有點陣的字體後,會自動彈出窗口詢問是否裝載點陣。裝載後可以在 view 菜單下選擇 xx pixel bitmap 查看、修改點陣。用 File--Generate Fonts,右側選單選擇 BDF,點擊Save後可以生成點陣字體

嵌入點陣:
File--Import 就可以嵌入不同格式的點陣字體。嵌入後可以在 Element--Bitmaps Available 下查看已有點陣和在不同環境、dpi 下的字號

替換字符:


可以同時打開兩個需要進行替換和被替換的字體,一個一個字符的進行復制、粘貼的工作。顯然這樣比較費時、費力。可以用下一種方法

Element 菜單下的 Merge fonts 直接導入進行合併。注意:如果 A 字體包含了 B 字體裏的字符的話,最好是在 B 的基礎上進行合併。例如我想用 tahoma 替換掉 simsun 裏的相同部分。因爲 simsun 已經包含了tahoma 裏的字符,所以如果以 simsun 爲基礎合併 tahoma 的話,仍然會保留 simsun 原有的部分,而不是進行替換。應該打開 tahoma,然後合併 simsun
合併之前還要注意兩個字體的 Em Size 是否相同,否則可能會導致字體大小不一、不成比例。一般規定 PostScript 字型是1000,truetype 字型用2的次方(常是2048或4096)。可以通過 Element 菜單下的 Font info 內的General 進行修改。Ascent、Descent、Underline position 和 Height 也最好能一樣
如果你並不想完全替換爲另一字體的話,也可以先刪除你不想要的部分字符後再進行合併



修改字體,實現粗斜體:
系統是根據字體的 Family 是否一樣來判斷兩款不同的字體究竟是不是能夠互相搭配的一套的。而字體名只是起一種標示、區別字體的作用的。所以修改 Family 就是將不同字體變爲同種,實現相同顯示要求的關鍵。而 Weight 則用來鑑別字體是粗體還是常規字體。
分別打開每個要修改的字體後,點擊 Element 菜單下的 Font info 項,修改 Names 選項卡中的 Family Name 和 Weight。TTF Values 選項卡中的 Weight Class 也進行修改。還有 Panose 選項卡中的 Weight。以及 TTF Names 選項卡中的內容。這在下面的例子中會詳細提到

製作斜體:
可以執行 Element 菜單下的 Transform 然後在新彈出的對話框中改變第二個選框內的內容爲 Skew,然後調整其後的傾斜度數值即可。在把字型修改成斜體後,還需要執行Element->Add Extrema (因爲傾斜字體之後,垂直切點會移位,所以要在新的垂直切點上加上新的曲線點)

製作粗體:
可以通過 Element 菜單下的 Expand Stroke 功能完成
可能是這個功能還處在開發階段,並不完善的原因(也確實不完善,這在下面會詳細提到)。所以這個選項是灰色的,不可選。但是可以用它的快捷鍵 ctrl+shift+e 直接調出調整的對話框
選中一個或全部字符,按下 ctrl+shift+e 調出 Expand Stroke 對話框。下面的 Stroke Width 就可以用來調整加粗的多少。加粗可以根據比劃(Stroke)、Caligraphic、Ellipse 等不同方法進行,選擇你喜歡或者效果好的一種進行加粗即可。如果加粗時你沒有選擇下面的 Remove Internal Contour 或 Remove External Contour 的話,加粗的效果就只是加一個邊。選中 Remove Internal Contour(移除內部輪廓)或 Remove External Contour(移除外部輪廓) 其中之一就可以去掉這個“粗邊”(兩者不能同時選擇),得到一個“粗體”字。由於字符的走向問題,即便是同一個字體,對於其中不同的字符也要使用不同的 Remove(移除)方法,否則效果會適得其反,不但未能加粗反而又變細了。但對不同字符使用不同的 Remove(移除)方法就會導致加粗字體時工作量過大,所以這個功能在目前不太切合實際
在筆者使用時這個功能只對部分矢量字體的英文等字母數字有效。對於中文矢量字符沒有效果,對於點陣字也都無法看到效果。但是相信隨着時間的推移,這個功能會不斷的改進和完善,直到生成大家滿意的效果
還可以通過 Element 菜單下的 Meta Font 功能完成因爲同樣不完善的原因,所以這個選項是灰色的,不可選。但是可以用它的快捷鍵 ctrl+shift+! 直接調出調整的對話框進行修改
利用這個功能可以從基礎樣式自動產生粗體(或窄體、寬體等)

其它:
如果你有了同一字體的基本樣式和粗體樣式,而且每一個字體都有一樣多的點和相同的順序,你可以用 Element--Interpolate Font 指令來產生半粗體的樣式
創建或修改 TrueType 時要保證 Element--Font Info 菜單內的 General 選項卡內的 Quadratic Splines(二次曲線)選項爲選中狀態,並且 Em Size 爲2的次方(常是2048或4096)這纔是 TrueType 的標準做法
如果你打算讓字體縱向排列時也能夠有良好的間距,就需要保證 Element--Font Info 菜單內的 General 選項卡內的 Has Vertical 選項爲選中狀態。並且調整好下面的數值


Fontforge 更詳細的用法可以參看 http://fontforge.sourceforge.net/overview.html
或者到 http://edt1023.sayya.org/fontforge/ 看繁體中文的翻譯






因爲具體修改字體過程寫的過於囉嗦繁瑣,而且上面已經簡單敘述了方法,所以本想把它刪除。但是對於我這種打字速度的人來說,實在是不容易。所以終究沒能狠下心,仍然保留了這段囉嗦的過程,各位不想看也罷

我這裏以方正圓體和 Bitstream Vera Sans 爲例。用方正準圓作爲“常規”字體顯示,方正粗圓作爲“粗體”顯示。統一改爲 Vera Sans YuanTi。“斜體”由“常規”字體生成,“粗斜體”由“粗體”生成。其中與 Bitstream Vera Sans 相同的部分全部進行替換
沒用中文名的原因是在不打 firefly( http://firefly.idv.tw/setfont-xft/ )補丁的情況下 linux 無法顯示中文字體名

製作"常規"字體



安裝完成 fontforce 後,在終端裏輸入 fontforce 運行。在彈出的界面裏載入方正準圓(fzy3k.ttf)

點擊菜單欄的 Element--Font Info
Fontname 改爲 Vera Sans YuanTi_JT(這一步的修改將顯示爲 PostScript 名。右鍵--屬性,Meta 信息就可看到)
Family Name 改爲 Vera Sans YuanTi
Name For Humans 改爲 Vera Sans YuanTi(這一步不改也可以,但爲了統一我還是改了)
Weight 改爲 Medium(MS 帶的字體這裏均爲 Book,你不改也可以)
關鍵是 Family Name 應該和你將用的"粗體"統一,名字可以任意。我用 Vera Sans YuanTi

切換到 TTF Values 選項卡
Weight Class 改爲 500 Medium(MS 帶的字體這裏均爲 400 Book,你不改也可以)

切換到 Panose 選項卡
Weight 改爲 Medium

切換到 TTF Names 選項卡
在下面第二個選框內選擇 Chinese(PRC)zh_CN
改變第一個選框內的內容爲 Family,此時將下面輸入框內的內容改爲 Vera Sans YuanTi
改變第一個選框內的內容爲 Fullname,此時將下面輸入框內的內容改爲 Vera Sans YuanTi
改變第一個選框內的內容爲 UniqueID,此時將下面輸入框內的內容改爲 Founder:Vera Sans YuanTi Regular
然後將下面第二個選框內選擇 English(US)en_US(這裏字體所支持的語言會用不同顏色顯示,直觀明瞭。方便選擇。如果我不是色盲的話應該是綠色的 )
做於 Chinese(PRC)zh_CN 類似的修改。即修改 Family;Fullname;UniqueID 三部分

點擊 OK 關閉對話框後。如果彈出窗口提示不匹配,詢問是否改變的話,點擊 Retain All。不做改變

選擇 File--Generate Fonts,選擇 True Type,點擊 Save 後生成字體。文件名任意。我取爲 Vera Sans YuanTi_regular.ttf。如果彈出窗口提示什麼 Em Size 的話不用理會,點擊 yes 確定



製作"粗體"字體(與製作"常規"字體類似,我就簡單複製了阿 )



安裝完成 fontforce 後,在終端裏輸入 fontforce 運行。在彈出的界面裏載入方正粗圓(fzy4k.ttf)

點擊菜單欄的 Element--Font Info
Fontname 改爲 Vera Sans YuanTi-Bold_JT(這一步的修改將顯示爲 PostScript 名。右鍵--屬性,Meta 信息就可看到)
Family Name 改爲 Vera Sans YuanTi
Name For Humans 改爲 Vera Sans YuanTi Bold(這一步不改也可以,但爲了統一我還是改了)
Weight 改爲 Bold
關鍵是 Family Name 應該和你將用的"常規"統一,名字可以任意。我用 Vera Sans YuanTi

切換到 TTF Values 選項卡
Weight Class 改爲 700 Bold

切換到 Panose 選項卡
Weight 改爲 Bold

切換到 TTF Names 選項卡
在下面第二個選框內選擇 Chinese(PRC)zh_CN
確認第一個選框內的內容爲 Styles(SubFamily),此時將下面輸入框內的內容改爲 Bold
改變第一個選框內的內容爲 Family,此時將下面輸入框內的內容改爲 Vera Sans YuanTi
改變第一個選框內的內容爲 Fullname,此時將下面輸入框內的內容改爲 Vera Sans YuanTi Bold
改變第一個選框內的內容爲 UniqueID,此時將下面輸入框內的內容改爲 Founder:Vera Sans YuanTi Bold
然後將下面第二個選框內選擇 English(US)en_US(這裏字體所支持的語言會用不同顏色顯示,直觀明瞭。方便選擇)
做於 Chinese(PRC)zh_CN 類似的修改。即修改 Styles(SubFamily);Family;Fullname;UniqueID 四部分

點擊 OK 關閉對話框後。如果彈出窗口提示不匹配,詢問是否改變的話,點擊 Retain All。不做改變

選擇 File--Generate Fonts,選擇 True Type,點擊 Save後生成字體。文件名可任意。我取爲 Vera Sans YuanTi_bold。ttf。如果彈出窗口提示什麼 Em Size 的話不用理會,點擊 yes 確定



製作"斜體"(與製作"常規"字體類似,我就簡單複製了阿 )



安裝完成 fontforc e後,在終端裏輸入 fontforce 運行。在彈出的界面裏載入剛纔修改過的常規字體(Vera Sans YuanTi_regular.ttf)

點擊菜單欄的 Element--Font Info
Fontname 改爲 Vera Sans YuanTi-Italic_JT(這一步的修改將顯示爲 PostScript 名。右鍵--屬性,Meta 信息就可看到)
Family Name 改爲 Vera Sans YuanTi
Name For Humans 改爲 Vera Sans YuanTi Italic(這一步不改也可以,但爲了統一我還是改了)
Weight 改爲 Medium(MS 帶的字體這裏均爲 Book,你不改也可以)
關鍵是 Family Name 應該和你將用的"粗體"統一,名字可以任意。我用 Vera Sans YuanTi

切換到 TTF Values 選項卡
Weight Class 改爲 500 Medium(MS 帶的字體這裏均爲 400 Book,你不改也可以)

切換到 Panose 選項卡
Weight 改爲 Medium

切換到 TTF Names 選項卡
在下面第二個選框內選擇 Chinese(PRC)zh_CN
確認第一個選框內的內容爲 Styles(SubFamily),此時將下面輸入框內的內容改爲 Italic
改變第一個選框內的內容爲 Family,此時將下面輸入框內的內容改爲 Vera Sans YuanTi
改變第一個選框內的內容爲 Fullname,此時將下面輸入框內的內容改爲 Vera Sans YuanTi Italic
改變第一個選框內的內容爲 UniqueID,此時將下面輸入框內的內容改爲 Founder:Vera Sans YuanTi Regular Italic
然後將下面第二個選框內選擇 English(US)en_US(這裏字體所支持的語言會用不同顏色顯示,直觀明瞭。方便選擇)
做於 Chinese(PRC)zh_CN 類似的修改。即修改 Styles(SubFamily);Family;Fullname;UniqueID 三部分

切換到 General 選項卡
在 Italic Angle: 後輸入 12

點擊OK關閉對話框後。如果彈出窗口提示不匹配,詢問是否改變的話,點擊 Retain All。不做改變

選擇 Edit--Select--Select All,然後執行 Element--Transform。
在新彈出的對話框中改變第二個選框內的內容爲 Skew,在將其後的數值改爲 12(數值可根據你的視覺需要任意輸入,windows 自帶的英文字體多爲 10;12;13;16。你可以先單獨選中一個字體 Skew 一下試試看傾斜程度是否合適)
點擊 OK 確定。

在彈出的警告對話框中點擊 OK 確定。如果彈出什麼錯誤提示的話不用理會,一路回車。完成後會看到字體已變爲斜體。接着按照剛纔的警告執行Element--Add Extrema
最後選擇 File--Generate Fonts,選擇 True Type,點擊 Save 後生成字體。文件名可任意。我取爲 Vera Sans YuanTi_Italic.ttf。如果彈出窗口提示什麼 Em Size 的話不用理會,點擊 yes 確定



製作"粗斜體"



安裝完成 fontforc e後,在終端裏輸入 fontforce 運行。在彈出的界面裏載入剛纔修改過的粗體(Vera Sans YuanTi_bold.ttf)

點擊菜單欄的 Element--Font Info
Fontname 改爲 Vera Sans YuanTi-BoldItalic_JT(這一步的修改將顯示爲 PostScript 名。右鍵--屬性,Meta 信息就可看到)
Family Name 改爲 Vera Sans YuanTi
Name For Humans 改爲 Vera Sans YuanTi Bold Italic(這一步不改也可以,但爲了統一我還是改了)
Weight 改爲 Bold
關鍵是 Family Name 應該和你將用的"粗體"統一,名字可以任意。我用 Vera Sans YuanTi

切換到 TTF Values 選項卡
Weight Class 改爲 700 Bold

切換到 Panose 選項卡
Weight 改爲 Bold

切換到 TTF Names 選項卡
在下面第二個選框內選擇 Chinese(PRC)zh_CN
確認第一個選框內的內容爲 Styles(SubFamily),此時將下面輸入框內的內容改爲 Bold Italic
改變第一個選框內的內容爲 Family,此時將下面輸入框內的內容改爲 Vera Sans YuanTi
改變第一個選框內的內容爲 Fullname,此時將下面輸入框內的內容改爲 Vera Sans YuanTi Bold Italic
改變第一個選框內的內容爲 UniqueID,此時將下面輸入框內的內容改爲 Founder:Vera Sans YuanTi Bold Italic
然後將下面第二個選框內選擇 English(US)en_US(這裏字體所支持的語言會用不同顏色顯示,直觀明瞭。方便選擇)
做於 Chinese(PRC)zh_CN 類似的修改。即修改 Styles(SubFamily);Family;Fullname;UniqueID 四部分

點擊 OK 關閉對話框後。如果彈出窗口提示不匹配,詢問是否改變的話,點擊 Retain All。不做改變

選擇 Edit--Select--Select All,然後執行 Element--Transform。
在新彈出的對話框中改變第二個選框內的內容爲 Skew,在將其後的數值改爲 12(數值可根據你的視覺需要任意輸入,windows 自帶的英文字體多爲 10;12;13;16。你可以先單獨選中一個字體 Skew 一下試試看傾斜程度是否合適)
點擊 OK 確定。

在彈出的警告對話框中點擊 OK 確定。如果彈出什麼錯誤提示的話不用理會,一路回車。完成後會看到字體已變爲粗斜體。接着按照剛纔的警告執行Element--Add Extrema
最後選擇 File--Generate Fonts,選擇 True Type,點擊 Save後生成字體。文件名可任意。我取爲 Vera Sans YuanTi_bold_Italic.ttf。如果彈出窗口提示什麼 Em Size 的話不用理會,點擊 yes 確定



替換字符:



逐字複製粘貼:
還以上面的方正圓體和 Bitstream Vera Sans 爲例。用 Bitstream Vera Sans 替換掉與方正圓體裏相同的字符,如果圓體裏沒有某個字符的話就直接用 Bitstream Vera Sans 補足(如果你覺得 Bitstream Vera Sans 太粗、字體間距大的話也可以用 windows 的 arial 甚至是 tahoma)
注意字體的搭配,斜體配斜體,粗體配粗體。下面以粗斜體爲例
運行 fontforge,分別打開 /usr/share/fonts/bitstream-vera/VeraBI.ttf(Bitstream Vera Sans 的粗斜體)和剛纔做好的 Vera Sans YuanTi_bold_Italic.ttf
在 Bitstream Vera Sans 的窗口中,選擇 View--Compacted View,點擊菜單欄的 Element--Font Info--Encoding 可以看到總共有 268個字符。不算多,慢慢來還可以接受。如果太多的話,我勸你還是放棄吧,除非你想鍛鍊耐心
點擊菜單欄的 Element--Font Info--Encoded View,把瀏覽方式改回去(生成字體以前一定要改回)
切換到方正圓體的 Element--Font Info--General 選項卡把 Em Size 改爲 2048,即與 Bitstream Vera Sans 一樣(兩款字體的 Em Size 一定要一樣,否則最後生成的字體會大小不一)。點擊 OK 後,等待轉換完成
然後在方正圓體裏用鼠標選中與 Bitstream Vera Sans 重複的字符(可以拖動,多選);右鍵;Clear 清除。再用複製、粘貼把 Bitstream Vera Sans 的字符都貼過來即可(這一點說起來最輕鬆,但是做起來卻最浪費時間)。有的字符在方正圓體沒有包括,直接貼過來就行了。可以用 View--Next Defined Char 直接轉到下一個字符,否則找起來很麻煩

清除合併:
把方正圓體裏與 Bitstream Vera Sans 重複的字符都清除後,選擇 Element--Merge Fonts。在 Merge Fonts 窗口中選擇 Bitstream Vera Sans。完成後,File--Generate Fonts 生成字體即可
合併字體時,只會合併原字體(這裏是方正圓體)裏沒有包含的字符。而不會覆蓋已有的字符,所以要先清除方正圓體裏與 Bitstream Vera Sans 重複的字符後再合併

直接合並:
當然你也可以用 Bitstream Vera Sans 做基礎把方正圓體合並進來。但這時你要修改的字體信息就比較多了
打開 Bitstream Vera Sans 後,直接選擇 Element--Merge Fonts。在 Merge Fonts 窗口中選擇 Vera Sans YuanTi_bold_Italic.ttf。完成後,File--Generate Fonts 生成字體即可







使用 hinting:
由於 TureType 字體的 hinting 是有專利的(apple),所以很多發行版默認並沒有打開 hinting。這就造成了很多字體不夠好看。由於有些字體已經內置了 hinting,所以爲利用這種技術獲得更好的顯示效果,我們可以自己開啓 hinting
用如下方法就可以打開 hinting。前提是你使用 freetype2/xft2/fontconfig 顯示字體
有一些發行版因爲涉及到專利的原因,默認沒有編譯出帶hinting支持的freetype。例如RH、FC的發行版
下載freetype2的源碼,解壓後,把 include/freetype/config/ftoption.h 裏面的
引用:

/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */


改成
引用:

#defineTT_CONFIG_OPTION_BYTECODE_INTERPRETER


然後編譯,重新安裝freetype2就行了
或者下載freetype2的src.rpm。rpm -ivh 安裝以後。改/usr/src/redhat/SPECS/freetype.spec 的
引用:

%define without_bytecode_interpreter 1



引用:

%define without_bytecode_interpreter 0


然後
引用:

rpmbuild -bb /usr/src/redhat/SPECS/freetype.spec


引用:

cd /usr/src/redhat/RPMS/i386
rpm -ivh freetype*.rpm


然後在 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf 內加入
代碼:
<match target="font">
<edit name="hinting" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

即可對所有具備 hinting 的字體使用 hinting
代碼:
<match target="font">
<test name="family" compare="eq">
<string>fontname</string>
</test>
<edit name="hinting" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

可以對字體族(family)爲 fontname 的有 hinting 字體使用 hinting
對於字體的 hinting 有四種風格 hintnone、 hintslight、hintmedium、hintfull 分別是無 hinting、輕度 hinting、中等 hinting、完全 hinting。對應於微調的強弱
在 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf 內加入
代碼:
<match target="font">
<edit name="hintstyle" mode="assign">
<const> hintfull </const><!— 可改成 hintnone、 hintslight、hintmedium -->
</edit>
</match>

即可調整所有具備 hinting 的字體的 hinting 風格

也由於爲避開有專利的 hinting ,freetype 有自己微調字體的技術 autohint,可以在一定程度上改善部分字體的顯示效果。但由於它是用程序來調整字體的顯示,而且又是要針對所有字體,所以肯定沒有用人力手工生成的針對具體某一款字體的 hinting 的效果好。autohint 一直都在在不斷的改進,顯示效果也越來越好。故對於某些沒有 hinting 的字體也能有一定程度的改進。你可以自己通過修改配置文件觀察 hinting 和 autohint 以及沒有字體微調時的效果,以取你最滿意的方案顯示
把下面的內容加入 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf
代碼:
<match target="font">
<edit name="autohint" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

就可以對所有字體使用 autohint
即可對所有字體使用 hinting
代碼:
<match target="font">
<test name="family" compare="eq">
<string>fontname</string>
</test>
<edit name=" autohint" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

可以對字體族(family)爲 fontname 的字體使用 autohint

因爲 hinting 和 autohint 是不同的字體微調技術,所以不建議同時使用



修改字體配置文件:
除了上面提到的於 hinting 和 autohint 有關的配置外,還有下面常用的一些
代碼:
<match target="font">
<edit name="antialias" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

打開 antialias(AA)
代碼:
<match target="font">
<test qual="any" name="family">
<string>fontname</string>
</test>
<edit name="antialias" mode="assign">
<bool>true</bool><!— 改成 false 即可關閉 -->
</edit>
</match>

對字體族(family)爲 fontname 的字體打開 antialias(AA)
代碼:
<match target="font">
<test name="size" compare="less_eq"><int>12</int></test>
<test name="size" compare="more_eq"><int>9</int></test>
<edit name="antialias" mode="assign"><bool>true</bool></edit><!— 改成 false 即可關閉 -->

對字體大小小於等於 12、大於等於 9 的字體打開 antialias(AA)
代碼:
<match target="font">
<test name="family"><string>fontname</string></test>
<test name="size" compare="less_eq"><int>12</int></test>
<test name="size" compare="more_eq"><int>9</int></test>
<edit name="antialias" mode="assign"><bool>true</bool></edit><!— 改成 false 即可關閉 -->

對字體族(family)爲 fontname 且字體大小小於等於 12、大於等於 9 的字體打開 antialias(AA)
代碼:
<match target="font">
<test name="size" compare="less_eq"><int>12</int></test>
<test name="size" compare="more_eq"><int>9</int></test>
<edit name="hinting" mode="assign"><bool>true</bool></edit><!— 改成 false 即可關閉 -->

對字體大小小於等於 12、大於等於 9 的字體打開 hinting
代碼:
<match target="font">
<test name="family"><string>fontname</string></test>
<test name="size" compare="less_eq"><int>12</int></test>
<test name="size" compare="more_eq"><int>9</int></test>
<edit name="hinting" mode="assign"><bool>flase</bool></edit><!— 改成 true 即可關閉 -->

對字體族(family)爲 fontname 且字體大小小於等於 12、大於等於 9 的字體關閉 hinting

因爲 fontconfig 的配置方法非常靈活,所以相同的功能可以由不同的寫法來完成配置。也因此不再累述。具體可以參見 看看 http://www.higherorder.org/wiki/Fontconfighttp://fontconfig.org/fontconfig/fontconfig-user.html
以及中文翻譯 http://www.linuxfans.org/nuke/module...=view&sid=1184http://edt1023.sayya.org/fontconfig/...nfig-user.html
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章