国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

GPL的中文Postscript字型安裝、原理及使用
2008-09-18   Linux自由空間

本文主要的目的是介紹一套在GPL下發行的中文Postscript字型,它完全可以在Ghostscript下運作,它的使用就和一般英文字型一樣的容易。使用方法也完全一樣,這實在要感謝杰勝公司的慷慨,使我們能有這一個字型可用。但很可惜的,可能幾乎沒有人知道如何在Linux下使用它,本書將打開它神秘的面紗。并在最後提出一個perlscript使大家可以使用它來列印簡單的文字檔。

目前UNIX上有許多套中文列印程序,基本上它們的輸出檔都是Postscript檔。這是因為我們有一個最好的GPLPostscript檔列印程序,它就是Ghsoscript。Ghostscript有絕佳的可移植性,它所支援的列印設備范圍幾乎包括了目前市面上所有可見的設備。而且它的品質就和高階Postscript印表機一樣好,甚至也完全支援彩色列印的功能。
所以在Linux的環境下所用Postscript做為輸出檔的格式是很自然的選擇。但是要讓Postscript檔支援中文列印也不是一件很容易的事,原因是Postscript基本上所使用的字型格式中主要是為單位元組字集所設計。對於像中文這種雙位元組的字集在當初設計時并未考慮,但因為 Postscript語言是一種繪圖語言,所以我們當然可以把中文當做圖形來處理,不過Postscript所直接支援的一些文字列印功能就不能用了。
不過我提醒各位,這里所提到的字型在目前附在Slackware內的Ghostscript并不能使用,因為它用了一些level2的功能(我猜)。請在使用前先安裝3.33版以上的Ghostscript,我幫各位將它編譯成gs333.tgz,這個文件也在光盤上可找到。不過其中并沒有字型,請各位自己去把字型找來安裝。(沿用2.61的字型也無不可,記得把Fontmap拷到/usr/lib/ghostscript/3.33中)
Jackson字型的安裝
Jackson的中文Postscript字型可以在NCTUCCCA.EDU.TW://NeXT/Chinese/KaiSu.pkg_0_7.tar.gz中取得。但它沒有辨法直接在Linux下列開,我把它解開後取出有用的部份并把它放在光盤中。
Jackson的字型分成二個檔,一個是用來建立它的Postscript語言檔,另一個是放字型定義的檔。
KaiSu-Regular=====>字型定義檔
KaiSu-Regular.dat=====>字型資料檔
要把它放入Ghostscript內的步驟為
(1)將上述二個文件放入/usr/lib/ghostscript/fonts中。
(2)修改/usr/lib/ghostscript/Fontmap在最後加入/KaiSu-Regular(KaiSu-Regular); 不要忘了最後的分號。
(3)用下列文件測試它的功能。
你應該可以看到大大的觀念篇叁個字。
#!
/KaiSu-Regularfindfont80scalefontsetfont100100moveto
showpage Jackson字型的原理
如果你只是單純的想使用字型,那這一節就可以省略了。這一節是給那些對Jackson字型原理有興趣,或想自己做其它Postscript字型的人看的。我們可以由TTF字型用和Jackson相同的方法產生字型。
下文中提到叁個程序都可在光盤上找到,它們的檔名分別是CHPOST1.ps,CHPOST2.ps和CHPOST3.ps。你應該在看下文前先把它們印一份在手邊參考。
由於在原先的Postscriptlevel1中,Postscript所提供的Type1和Type3字型均只適用於小於256字的字集。所以 Postscript在level2中提供了額外的type0字型(注2),一般稱為合成字(compositefont),它本身并沒有有關字型的資料。相反的它是用來將多個不同的字型組合成一個字型,也就是說一個13095字的字集,須要52個字型才能裝得下,我們可以使用一個type0字型來代表這些字型。更清楚的說,一個雙位元組的字集有二個位元組,我們可以將第一個位元組看成字型碼,第二個位元組看成字型索引。有興趣的人可以在附錄中找到一個對Postscript字型詳細的說明,以下我們只針對Jackson字型如何由雙位元組字串選到正確的字型定義的過程做說明。我假設你對 Postscript組識字型的方法有一定了解,我盡量重復使用到的字型功能,如仍有不了解之處請參考附錄或 PostscriptLanguageReferenceManual。
首先我把KaiSu-Regular中的一小段程序碼列出并在其中加上一些注解,我把它放在光盤中的CHPOST1.ps中。以%%!開頭的注解是執行到該行時stack的狀況(注1),它并不在原先的字型中。如果程序看不懂沒關系,你可以直接由我後面的說明了解運作的過程。注1:Postscript是一種堆疊導向的語言,它和forth有些類似,同樣是采後序的運算式并將結果放在堆疊之上。注2:在有些levelI的系統中也有這個延伸。
一個Jackson字型為一個Type0的字型,它被分為89個子字型。每一個子字型有158個字元,這剛好就是BIG5的編碼方式。BIG5的第一碼為0xa1-0xf9共59個不同的碼,而其第二碼為0x40-0x7e及0xa1-0xfe共158個不同的碼。所以在Jackson中采取8/8的映射方式,上面的/bc就是每一個子字型中的BuildChar程序,這個程序是type3字型用來畫字的程序,Postscript在呼叫這個程序之前會把字型字典和字型索引堆進堆疊之中,而這個程序在執行完後應把它們移出堆疊。
因為中文字集的字元數實在太多,我們不能如英文字集般把所有字元的定義都一次載入記憶體中。上面的程序就是用來做動態載入的動作,它只在實際用到時才去載入字型,不過這個程序還有可改進之處,我們可以把它每次載入的定義存在字型字典之中,如此當第二次用到時就不必每次去文件中載入字型定義了。
上面的程式還有一個可議之處,它放棄了字型快取(fontcache)的使用。這可能使程式的速度大受影響,我還不太明白它放棄的原因,也許要試過才知,不過在Ghostscript中速度似乎還可以接受。
我們接下來看一下子字型實際上的定義,由於每一個子字型除了Offsets以外都一樣,我只列出第一位元是0xF9的字型為例。我把這部份程式放在CHPOST2.ps這個檔案中。
它第一碼是0xf9的字型定義,其它的也大致相同。它首先由CFT1JacksonFontdict中將各項字型資料拷貝過來,/DataFile就是字型資料檔的名稱,而/BuildChar就是指到前述的/bc中。值得注意的是最後一項/Offsets,它是一個長度為158*3的陣列,其中每一項就是相對字元在資料檔中啟始的位置。
至此我們已將所有Type3的字型準備好了,最後我們看一下KaiSu-Regular這個type0的字型如何把前面定義好的89個字型組合在一起,且了解一下Postscript解釋器如何讀入正確數目的字元。請參考CHPOST3.ps這個檔案
在/KaiSu-Regular的定義中我們可以看到它的字元轉譯模式是6(注),這表示它使用SubsVector中的訊息來解釋輸入字串。它的SubsVector的定義為
/SubsVector<00802158>def
第1個00代表每次讀入一個字元,後面叁個數字代表整個字型被分為四段,依次為第0-3號字型,然後由/Encoding中取出實際的字型編號,在這里就剛好是0-3,然後再由/FDepVector中取出實際的字型。上面的過程用意在分辨中文和英文的字型,如果把實際的字型范圍列出。
0-0x7f第0號字型/_@ASCII
0x80-0xa0第1號字型/NotDefFont
0xa1-0xf9第2號字型/CFT1JacksonFontSupp
0xfa-0xff第3號字型/NotDefFont
這就是BIG5碼的定義,在這個過程中只有合法的第一碼實際取用到了Jackson字型,其馀的就用原先的字型。
所以一個中文字元被取出的過程如下,以0xa10x40為例
KaiSu-Regular看到0xa10x40,取出encoding為2,在/FDepVector中取得/CFT1JacksonFontSupp,這也是一個typ20字型。
  /CFT1JacksonFontSupp是一個8/8mapping的type0字型,用0xa1為索引在/Encoding中取出0,故由/FDepVector中取得第一項/CFT1JacksonFontA1。
  將CFT1JacksonFontA1堆入堆疊,并將0x40也推入堆疊,呼叫/BuildChar也就是前述的/bc
/bc由CFT1JacksonFontA1中的/Encoding取得0x40的索引為0,故由Offsets中取得檔案的位置0,長度為9。
讀入這個字元定義,這是一個type1的加密字元定義字串(encrypedcharstrings)。
做一個暫時的字型叫存在/CFT1JacksonFontTemp中,并造出一個字型,把前面讀入的字元定義放在里面。
用一般show指令將這個臨時產生的Type1字型中的字元印出。
看起來有些復雜,不過Ghostscript的速度還可以接受,且用的記憶體也還可接受。不過我有點懷疑它在DiplayPostscript時的速度。
如何由TTF字型轉換而得到一個Postscript字型
看到這個標題很多人心跳加速吧!不過我先聲明,我在這里只給你一個食譜而沒有任何菜色。因為如同中文Postscript字型一樣,我們并沒有任何免費的TTF字型。所以我也不可能由任何TTF字型做Postscript字型給你,我只能告訴你方法,至於結果你必須自行去嘗試了。而且這可能不是一件容易的事,你如果決定要自己一試,那你告檢查一下你的配備是否足以勝任。
(1)當然一定要有至少一套的中文TTF字型。
(2)至少16MB最好有20MB以上的記憶體。
(3)至少50MB以上的硬碟空間,越大工作會越舒服,因為你不必把中間產生的檔刪除。 (4)很多很多的時間及很多很多的耐性
如果你準備好了,就跟著我開始上路吧!
由easyflow同一個子目錄取得ttf2limn這支程式,它可以由TTF字型產生一個158字的pk字型檔。用法為
ttf2limnntk5161.1440pkntk51611440161-s10-H0.75-D0.25-y150/cdrom/big5_k5.01_
它會產生ntk5161.1440pk及ntk5161.tfm二個檔。上面的參數和ttf2pk中使用的相似,唯一的不同是原先字型產生的起始內碼和給束內碼現在簡化成上面的161,它是產生字型檔中字型的第一碼。如果你接著要產生162開頭的字型,可用
ttf2limnntk5162.1440pkntk51621440162-s10-H0.75-D0.25-y150/cdrom/big5_k5.01_
由同一個位置取得limn這個程式,它可以由上面產生的pk檔中fit產生一個type1的外框字。它有很多參數必須調整,下面是我使用的,你可以參考fontutils-0.6中的文件。fontutils-0.6是GNU的產品。
limn-verbose-corner-surround=8
-filter-surround=12
-filter-alternative=6
-subdivide-surround=12
-tangent-surround=12
-dpi1440
-error-threshold=0.6
-subdivide-threshold=0.01
-filter-iterations=1
-reparameterize-threshold=10
ntk5161
取得bzrto產生type1的字型,其用法為
bzrto-encoding256-pstype1ntk5161-outputntk5161
將58個字型一一產生,名字依序為
ntk5160.gsf
ntk5161.gsf
.
.
ntk5259.gsf
我用perl寫了一個程式把產生這些檔案的過程自動化,它的用法為
maketype1ntk52880/cdrom/big5_k5.01_
|||
|+-----++------TTF字型檔的路徑
字型名稱|
使用ttf2limn時產生字型的大小,當然越 大越好,但硬碟.....
這個命令會自動執行上述(1)(2)(3)中所有的動作。下了這個命令,你可以去睡一覺,醒來它可能剛好做完。
將上述檔中的Type1字元定義取出組成一個字元定義檔。在光碟上有一個程式makeup_jackson來做這件事。
#makeup_jacksonntk536001
這會產生一個叫ntk5.hex的檔案,并產生一個叫ntk5.pf0的檔案。它是由前述的KaiSu-Regular修改而來。第二個參數是字型的UID,要注意不要和其它字型的UID重復了。
上一步中產生的ntk5.hex是一個用hex字串格式編碼的檔案,我們通常把它轉換成二進位檔以節省空間及增加處理速度。我提供了hextobin做這件工作,它設計成一個filter的型式,用法為
#./hextobinntk5.dat
將ntk5.pf0和ntk5.dat裝到/usr/lib/ghostscript/fonts中,并在/usr/lib/ghostscript/Fontmap中加入
/ntk5(ntk5.pf0);
拿下面的程式測試看看你的成果,注意程式中第一行載入一個Postscript檔,這個檔定義了一些在字型中會用到的定義。它可以和其它程式一起得到
/ntk5findfont80scalefontsetfont
100100moveto
看起來不太難,但至少會花去你一天的時間,有興趣的人試試看吧。也許我們可以慢慢的建立一套自動的系統,讓每個人都可以容易的產生字型。這個程序產生的字型都有一些虛胖的現象,這是因為我們在做fit字型的工作時不論對簡單的字型或復雜的字型都用相同的參數,所以簡單的字型難免有些虛胖的現象。以全形的逗號而言,在Jackson字型中用8個位元就表示出來了,但在用上述過程以文新的big5_k5.ttf為例則長達53個位元。要消除這種狀況可能要一個能以字元為單位設定參數的程式,而且要很多人的參與才能做到。
使用Jackson字型列印中文文字檔
在最後我介紹一個很簡單的perlscript,它可以用來將中中文件檔利用Jackson字型列印。它的功能很簡單,但己足夠解決大多數中文列印上的問題。其用法為 makeps[-f] 字型名稱,如/KaiSu-Regular 欲列印的文件檔 產生的Postscript檔 使用的字型大小 你可以用它來驗證你產生的Postscript字型或是其它任何來源的Postscript字型,它會用橫放二欄式的方式列印。當然這個程式還沒有經過太多的測試,可能還有很多問題,你可以直接直作者反映問題,如果順便把解答告訴我是最好不過的了。

熱詞搜索:

上一篇:構筑穩健的中文Linux(上)
下一篇:細看嵌入式中文Linux

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
韩国午夜理伦三级不卡影院| 蜜桃在线一区二区三区| 51精品视频一区二区三区| 久久99蜜桃精品| 亚洲精品五月天| wwwwww.欧美系列| 欧美色图免费看| 激情久久五月天| 亚洲成人综合网站| 国产精品美女久久福利网站| 欧美日韩免费观看一区二区三区| 粉嫩高潮美女一区二区三区| 日韩av电影一区| 亚洲激情图片一区| 欧美激情一区二区三区在线| 欧美理论片在线| 色呦呦国产精品| 成人中文字幕在线| 国内精品自线一区二区三区视频| 亚洲线精品一区二区三区| 国产日产欧美精品一区二区三区| 欧美一区二区三区视频免费播放| 色吧成人激情小说| 白白色亚洲国产精品| 韩国v欧美v日本v亚洲v| 日韩av午夜在线观看| 亚洲高清三级视频| 一二三四区精品视频| 国产精品电影院| 国产欧美精品在线观看| 2014亚洲片线观看视频免费| 欧美一区二区在线不卡| 欧美日韩在线播放一区| 91久久香蕉国产日韩欧美9色| 波多野结衣中文字幕一区二区三区| 国产一区二区三区蝌蚪| 久久er精品视频| 国内精品写真在线观看| 久久精品国产成人一区二区三区| 免费在线欧美视频| 美女看a上一区| 久久国产精品露脸对白| 日本少妇一区二区| 免费美女久久99| 老司机精品视频导航| 捆绑调教美女网站视频一区| 奇米888四色在线精品| 免费欧美在线视频| 国产曰批免费观看久久久| 国产乱淫av一区二区三区| 国产一区二区三区在线看麻豆| 九九热在线视频观看这里只有精品| 久久精品72免费观看| 久久99精品国产.久久久久久| 久久精品国产精品亚洲红杏| 国产一区二区三区观看| 国产成人精品免费视频网站| 成人丝袜高跟foot| 99久久精品国产观看| 在线观看视频欧美| 69av一区二区三区| 精品国一区二区三区| www激情久久| 日韩一区欧美小说| 亚洲一区二区三区四区的| 视频一区二区国产| 另类小说图片综合网| 国产成人av一区二区三区在线观看| 波多野结衣中文字幕一区二区三区| 色噜噜狠狠成人中文综合| 欧美无砖砖区免费| 欧美va亚洲va在线观看蝴蝶网| 国产日韩欧美精品综合| 亚洲欧美国产高清| 日韩av中文在线观看| 国产mv日韩mv欧美| 欧美亚洲尤物久久| 日韩写真欧美这视频| 日本一区二区三区久久久久久久久不 | 国产一区高清在线| 9人人澡人人爽人人精品| 欧美午夜影院一区| 欧美xxxxx牲另类人与| 国产精品国产自产拍高清av王其 | 欧洲中文字幕精品| 欧美成人高清电影在线| 国产精品久久久久久久久免费丝袜| 一区二区三区不卡在线观看 | 欧美日韩www| 欧美精品一区二区在线观看| 中文字幕亚洲区| 秋霞影院一区二区| jvid福利写真一区二区三区| 欧美区在线观看| 中文字幕av一区二区三区高 | 精品一区二区影视| 色综合夜色一区| 精品盗摄一区二区三区| 亚洲制服丝袜av| 国产不卡免费视频| 3d成人h动漫网站入口| 国产精品美女久久久久av爽李琼| 奇米亚洲午夜久久精品| 91啪亚洲精品| 国产亚洲女人久久久久毛片| 日韩不卡一二三区| 91久久香蕉国产日韩欧美9色| 久久精品夜色噜噜亚洲a∨| 亚洲午夜电影在线观看| 成人精品视频.| 精品国产髙清在线看国产毛片| 一区二区在线观看视频在线观看| 国产麻豆视频精品| 日韩欧美一区二区久久婷婷| 亚洲一区二区三区在线看| 国产成人av一区二区三区在线观看| 日韩欧美一级在线播放| 天天影视网天天综合色在线播放| 91色在线porny| 中文字幕国产一区| 国产米奇在线777精品观看| 日韩情涩欧美日韩视频| 亚洲国产欧美日韩另类综合| 91尤物视频在线观看| 国产日产欧美一区二区三区| 韩国成人福利片在线播放| 日韩免费观看高清完整版在线观看| 亚洲va韩国va欧美va精品| 99视频一区二区| 国产精品久久久久久久蜜臀| 国产精品一区二区三区网站| 日韩欧美久久久| 蜜桃一区二区三区在线观看| 欧美一区二区三区不卡| 婷婷成人激情在线网| 欧美色图片你懂的| 亚洲一区影音先锋| 欧美丝袜第三区| 亚洲在线中文字幕| 欧美老人xxxx18| 日本中文字幕一区| 欧美一卡二卡在线观看| 免费精品99久久国产综合精品| 91精品国产乱| 美女性感视频久久| 欧美成人在线直播| 精品午夜一区二区三区在线观看| 日韩精品中文字幕在线不卡尤物| 奇米一区二区三区| 精品国产乱码久久久久久蜜臀| 国内精品免费**视频| 亚洲国产精品成人综合色在线婷婷| 成人小视频在线观看| 国产精品久久久久久久久久久免费看 | 日韩午夜三级在线| 久久99国产精品久久| 久久久久国产免费免费| 成人一级片在线观看| 国产精品精品国产色婷婷| 91丨porny丨中文| 亚洲国产欧美在线| 精品少妇一区二区三区在线播放 | 亚洲1区2区3区4区| 日韩欧美高清一区| 国产高清视频一区| 亚洲天堂精品视频| 欧美喷潮久久久xxxxx| 麻豆精品在线播放| 国产午夜亚洲精品理论片色戒| aa级大片欧美| 日韩激情在线观看| 久久精品综合网| 欧美亚洲综合在线| 国产美女精品在线| 一区二区三区精品| 日韩精品一区二区三区swag| 丁香婷婷综合色啪| 亚洲午夜在线电影| 精品999久久久| 91片在线免费观看| 久久99九九99精品| 椎名由奈av一区二区三区| 欧美日韩精品欧美日韩精品| 久久成人综合网| 亚洲日本一区二区三区| 日韩欧美中文字幕制服| 成人毛片视频在线观看| 日韩激情中文字幕| 亚洲丝袜美腿综合| 欧美电影精品一区二区| 91影视在线播放| 国产一区美女在线| 亚洲6080在线| 亚洲视频资源在线| 欧美大胆人体bbbb| 在线亚洲精品福利网址导航| 久久99精品国产.久久久久久| 亚洲激情av在线| 久久精品一区二区三区不卡牛牛| 欧美亚洲日本一区|