歡迎您光臨本站 註冊首頁

Linux中文化之 GPL的中文Postscript字型安裝、原理及使用

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  作者:王佑中 (twchiu2@phys.ntu.edu.tw)
    這一篇文章是這個系統的基礎,這個系統的輸出檔是Postscript檔.它可以使用中文Postscript字型,我們很幸運的有一套GPL的中文Postscript字型,本文就是介紹它的原理及安裝使用.
    本文中所提到的軟體全部是GPL的軟體,我對其中許多程序都加入修改,這些修改的程序在將來都會公開,目前在我只把執行檔直接放在光碟上.你可以在光碟中的[[[!!!麻煩您填上正確的路徑!!!]]]中拿到這些程序,並且如果你想知道原始程序的位置,請參考ORIGINAL這個文件.
    目前UNIX上有許多套中文列印程序,基本上它們的輸出檔都是Postscript檔.這是因為我們有一個最好的GPLPostscript檔列印程序,它就是Ghsoscript.Ghostscript有絕佳的可移植性,它所支援的列印設備範圍幾乎包括了目前市面上所有可見的設備.它的品質就和高階Postscript印表機一樣好,甚至也完全支援彩色列印的功能.
    在Linux的環境下所用Postscript做為輸出檔的格式是很自然的選擇.但是要讓Postscript檔支援中文列印也不是一件很容易的事,原因是Postscript基本上所使用的字型格式中主要是為單位元組字集所設計.對於像中文這種雙位元組的字集在當初設計時並未考慮,但因為Postscript語言是一種繪圖語言,我們當然可以把中文當做圖形來處理,不過Postscript所直接支援的一些文字列印功能就不能用了.
    本文主要的目的是介紹一套在GPL下發行的中文Postscript字型,它完全可以在Ghostscript下運作,它的使用就和一般英文字型一樣的容易.使用方法也完全一樣,這實在要感謝傑勝公司的慷慨,使我們能有這一個字型可用.但很可惜的,可能幾乎沒有人知道如何在Linux下使用它,本書將打開它神秘的面紗.並在最後提出一個perlscript使大家可以使用它來列印簡單的文字檔.
    不過我提醒各位,這裡所提到的字型在目前附在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
  (觀念篇)show
  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-s


[火星人 ] Linux中文化之 GPL的中文Postscript字型安裝、原理及使用已經有573次圍觀

http://coctec.com/docs/linux/show-post-55864.html