« 無責任字評:民以『食』為天 | Main | Adobe 提案 PDF 為 ISO 標準 »
teTeX 目前已經不再維護,取而代之的,Thomas Esser 如果對他以前的工具有所修改的話,通通是注入
TeX Live Project
裡頭去了。所以,如果你所使用的 OS/distribution 沒有包括這些新的成果,個人是比較建議直接安裝及使用 TeX Live,當然,最好就是各 OS/distro 直接就以 TeX Live 的成果來取代以往的 teTeX。
TeX 系統安裝字型一般來說是比較麻煩一點,因為相關要用到的檔案是分散成好幾個部份。中文字型的話,由於使用 subfonts 的機制,那就是更複雜了,而會來使用幕後系統的人們,好像是比較耐磨耐操,習慣於一些複雜的動作,所以,比較少人去發展更方便界面的工具?底下以
fireflysnug
為例來說明他的安裝方法。當然,這只是舉例說明,fireflysung 已經有製作好的現成字型供使用,無需再浪費時間製作:
ftp://cle.linux.org.tw/tex/cjk/fonts/nsungt1
安裝中文字型的相關步驟大致上有以下幾個階段:
這裡僅說明製作 CJK UTF8 編碼文件的步驟,因為這樣在編寫多國語文文件時會方便得多,其他編碼也可以借由虛擬字型的機制來使用這些字型。底下就一個個來說明他他們製作方法。
我們不準備直接的使用 fontforge,而是使用 LaTeX CJK 所附上的 subfonts.pe 這個工具,這是 fontforge script。使用方法很簡單:
fontforge -script subfonts.pe fireflysung.ttf nsung Unicode.sfd
這樣就成了,這需要相當長的時間來製作,最好的辦法就是睡覺前去讓他執行,第二天早上就應該製作完成了。
其中的 Unicode.sfd 是附在 FreeType1 裡頭,而 FreeType1 目前已經沒有在維護,最新版,但並未 release 的版本,可由以下方式取得(以 bash 環境為例):
mkdir YourNewDir cd YourNewDir export CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/freetype cvs login ==> 直接按 Enter cvs co freetype cvs co freetype1-contrib
freetype1-contrib 子目錄就含有 ttf2pk,裡頭的 data 子目錄就有這些 *.sfd 檔。這些 *.sfd 檔要置放於:
$TEXMF/fonts/sfd目錄下。在執行 subfonts.pe 時他無法找得到,這時請使用絕對路徑。
製作 map 檔的方法,進入你執行 subfonts.pe 的那個目錄:
for i in *.tfm
do
cat ﹥﹥ nsung.map ﹤﹤ EOF
${i%.tfm} ${i%.tfm} ﹤ ${i%.tfm}.pfb
EOF
done
fd 檔的內容:
% This is c70nsung.fd for CJK package. % created by Edward G.J. Lee\ProvidesFile{c70nsung.fd} \DeclareFontFamily{C70}{nsung}{\hyphenchar \font\m@ne} \DeclareFontShape{C70}{nsung}{m}{n}{﹤-﹥ CJK * nsungu}{} \DeclareFontShape{C70}{nsung}{bx}{n}{﹤-﹥ CJKb * nsungu}{\CJKbold} \endinput
*.enc 檔暫時保留,這是給 pdftex 直接取用 TTF 用的,這裡暫時不說明,怕把整個過程弄複雜了,在最後再來說明如何直接使用 TTF。
/usr/share/texmf-local/fonts 或 /usr/share/texmf-dist/fonts 或 /usr/share/texmf/fonts
他們都會有相對應的子目錄,例如 *.tfm 就是置放在:
/usr/share/texmf-local/fonts/tfm/CJK/nsung
一些沒有的子目錄,可以自行建立。以下就是其他檔案的置放位置:
/usr/share/texmf-local/fonts/type1/CJK/nsung/*.pfb /usr/share/texmf-local/fonts/map/dvips/CJK/nsung/nsung.map /usr/share/texmf-local/tex/latex/CJK/UTF8/c70nsung.fd
如果你不是系統管理者,那麼,只能置放在自家目錄下:
$HOME/texmf/fonts/map/dvips/CJK/nsung.map $HOME/texmf/fonts/tfm/CJK/nsung/*.tfm $HOME/texmf/fonts/type1/CJK/nsung/*.pfb $HOME/texmf/tex/latex/CJK/UTF8/c70nsung.fd
updmap-sys --enable Map nsung.map
如果你不是系統管理者,請執行:
updmap --enable Map nsung.map
而且,一旦使使用了自家目錄,那麼往後新增字也要使用一般使用者的身份來進行,此時系統管理者增加的字型所產生的 map 檔,你將會取用不到,要自行要執行一次 updmap 才行。這點常會讓人搞錯,希望以後能有所改善。
好了,這樣字型就安裝好了,你可以寫一個簡單的文稿來測試一下新字型運作的情形:
\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{nsung}
安裝 \LaTeX\ CJK 新字型測試。
\end{CJK}
\end{document}
要讓 dvipdfmx 直接使用 TTF,只要在 cid-x.map 設定:
nsung@Unicode@ unicode fireflysung.ttf
即可。如果是以一般使用者的方式來安裝,那麼這個 cid-x.map 的位置應該是在:
$HOME/texmf/fonts/map/dvipdfm/cid-x.map
這時最好把 firelysung.ttf 置放(link 即可)於:
$HOME/texmf/fonts/truetype
目錄下。 要讓 pdftex 使用 TTF 會比較麻煩一點,因為已經有了 Type 1 的 map 檔,他會優先去使用 Type 1。變通的辦法是,設定在文稿裡頭。我們先來製作他的 map 檔(這裡命名為 nsung-enc.map,以便和 Type 1 的 map 檔區分):
for i in *.tfm
do
cat ﹥﹥ nsung-enc.map ﹤﹤ EOF
${i%.tfm} ﹤ ${i%.tfm}.enc ﹤ fireflysung.ttf
EOF
done
這個 map 檔置放於:
/usr/share/texmf-local/fonts/map/pdftex/CJK/nsung-enc.map 或,一般使用者安裝的話,置放於: $HOME/texmf/fonts/map/pdftex/CJK/nsung-enc.map
由 fontforge 制作出來的 *.enc 檔,置放於:
/usr/share/texmf-local/fonts/enc/CJK/nsung/*.enc 或,一般使用者安裝,置放在: $HOME/texmf/fonts/enc/CJK/nsung/*.enc
使用的方法是:
\pdfoutput=1
\pdfmapfile{=nsung-enc.map}
\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{nsung}
安裝 \LaTeX\ CJK 新字型測試。
\end{CJK}
\end{document}
重點是在那一行
\pdfmapfile{=nsung-enc.map},這裡使用 = 的意思是,如果有重複定義,蓋過原來的定義,以防去使用同名的 Type 1 字型。不過,目前 pdfTeX 使用 TTF,在有些 TTF 速度相當的慢,原因還不是很清楚,所以,這裡還是建議使用 Type 1,等這個問題解決時再來使用 TTF。或者你多試試幾種 TTF,有些 TTF 的速度,在可以接受的範圍,但像 fireflysung.ttf 則會慢得相當的離譜,已經到了不堪使用的程度。
[Note] 程式碼中的大於、小於符號由於 blog 的關係,是使用全型符號,請自行修改為半型符號。
【修正】:Sat Feb 3 10:18:10 CST 2007
修正 typo(sunfonts.pe),並把 updmap 的參數格式修正為向後相容。感謝 Zale 的指正。
【修正】:Fri Dec 21 00:34:16 CST 2007
訂正 typo(usung.map ==> nsung.map),感謝 pluto。
製作 map 檔的方法,進入你執行 sunfonts.pe 的那個目錄:
另外這個我不知道是typo還是系統的差異
updmap --enable Map=usung.map
我自己在scientific linux上用 updmap的時候, 是沒有等號的:)
那是較舊的版本,新的 updmap,有沒有等號都可以。
[edt1023@lgj ~]$ updmap --version
updmap version 1107552857.
如果不確定版本,那麼使用 updmap --edit 來自行加入 map file 亦可。
1. “他會把 Unicode 編碼插入 Type 1 字型中”这是如何实现的,又如何起作用的呢?
2. subfonts.pe 中,Generate() 的参数包括:0x100 | 0x80000 | 0x200000:
1) 首先,.g2n 文件有什么用?
2) 为什么不要包含 PostScript hints?
2) 为什么要 round PostScript coordinates?
请指教,谢谢。
subfonts.pe 中用到了一个 while 循环来选择字形,在其中 Select(count, count + delta),然后对选定的字形进行处理,然而根据 fontforge 的手册,Select() 的参数含义是:for each pair of arguments it selects all glyphs between (inclusive) the bounds specified by the pair,那么,处于边界的“count + delta”这个字符,岂不是会被前后两次循环都选中,从而进行了两次处理?
1. 就是 type1 encoding vector 使用 UCS-2/4,這樣可以被 dvipdfmx 利用製作 toUnicode cMap。
2-1. fontofrge 的 hints 演算法是針對英文字母,而且,目前還不是很理想(可以說是很糟),所以 CJK 的字型都要取消 hints。
2-2. Type1 font 只支援 integers。
另外,我不清楚 *.g2n 是什麼(還是我忘記了?)。
那個 while loop 看起來好像是沒有問題?要不要請教一下 Werner 看看?
谢谢,前 3 个问题我都明白了 (g2n 好像指的就是 .enc...)
不过在 loop 中为什么要用 AddExtrema() 呢?我没有自己做过字体编辑,所以不能理解。
或者说,假设根本不跑 loop,不做 AddExtrema(), Simplify(),产生的 Type 1 字体会是什么样子的?
此外,我考虑的第二个问题是 ttf2pt1 转换的 Type 1 和 FontForge 转换的 Type 1 的效果比较的问题,您觉得根据这两种字体不同的格式 (Quadric Bezier Curve vs. Cubic Bezier Curve),转换出的中文字体里,哪些 glyph 容易看出差别来,或者说,转换出效果的优劣又应该如何判定呢?
毕竟中文的字符太多,我们只能选择性的抽样比较一下,而且仍然不好选择定量的评价标准。
我主要是在考虑对 TeX Live 2007 提供官方的中文支持时想到的,下面这里还有一些其他相关的想法:
http://www.ctex.org/society/news:tl2007
欢迎指正 :)
AddExtrema() 的作用是怕 TTF -> Type1 之間,計算上的漏失,把他補足。如果直接做 simplify,怕漏失會更嚴重,甚至有些 outline 變形了。就我的瞭解是這樣。
不做 simplify,會有過多不必要的 points,這樣會增加字型檔的大小,而且 render 時也會更秏 CPU/RAM。
那些 *.enc 檔是給 pdflatex 直接使用 TTF 做 index 用的。
由於我不是專業的 programmer,所以優劣的比較我就不清楚了。但據一位對字型製作有研究的朋友告知,ttf2pt1 的演算法是最佳的,這包括他的速度、outline 轉換的精確度及所需 points 的多少。
ttf2pfb 的好處是,他支援 bytecode interpreter,所以對於 mingliu.ttc 這類 TTF,他也能轉換。
Werner 有在 CJK 及 TeX Live mailing list 上,所以,問他關於 CJK/fontforge/ttf2pt1/ttf2pfb 的問題,可能答案會比較準確。
谢谢回答,我大致明白了,还有什么问题我会直接发到 CJK mailing list 上 :)
那想要在windows上安裝LATEX CJK字型,那要怎麼處理?
抱歉,我個人並不使用 windows 系統,無法幫得上忙,但你可以參考:
http://edt1023.sayya.org/tex/TeXInstall/%B1%C6%AA%A9%A8t%B2%CE%A6w%B8%CB.htm
http://sourceforge.net/mailarchive/forum.php?thread_name=20060307.154609.55847902.wl%40gnu.org&forum_name=fontforge-devel
看到這一篇之後,去下載了2005年最後的Fontforge.
速度跟後來的版本真是差很多..作者說得20倍聽起來真不誇張.
有覺得Fontforge太慢的可以試試看舊版的.
他們說得缺點是會弄出比較多的點,字型大小比較大,render速度慢一些
有一個折衷的方式是,不要使用 simplify,等 pfb 生成後,再針對每個 pfb 做 simplify,這樣速度上會比較快。
舊版的 fontforge 所產生的 pfb,常會碰到「破」的,這點要非常小心。
可以請問要怎麼作嗎?
and有沒有破破的範例?
謝謝
就是把 subfonts.pe 中關於 AddExtrema 及 Simplify 的部份註解起來。產生 pfb 後再針對每個 pfb 來做。
Open($1)
SelectAll()
AddExtrema()
Simplify(0, 2)
Generate($1:r + ".pfb", "", 0x1|0x10000|0x80000|0x200000, -1, "")
Close()
或者不做 AddExtrema(),速度上會加很多。
請問一下,一個中文字型檔會配上幾個 pfb 檔?和 tfm 一樣一堆還是獨自惟一呢?
我用 ttftpt1 只會生出一個 pfb 檔,我在懷疑是不是搞錯指令了...
因為一個 pfb 檔只能容納 256 個字。所以,中文字的話是許多 pfb 所組成的。tfm 也是一樣。
ttf2pt1 要有一個相對應的 map 檔,讓他把一個 TTF 分成好幾個部份來產生相對應的 pfb。請參考:
http://edt1023.sayya.org/tex/mycjk/mkfont.sh
不過,ttf2pt1 並不會自動嵌入 Unicode 碼,所以,會造成所產生的 PDF 無法 search©。
原來如此,看來是真的有問題...
想問問新版的 cid-x.map 是否還需要在字形檔前加入 :0: 字樣?
文中的設定:
nsung@Unicode@ unicode fireflysung.ttf
之前的寫法:
nsung@Unicode@ unicode :0:fireflysung.ttf
我找了一下 TeX Live 2007 內的檔案,發現...
1. dvipdfmx/ 下放的格式是沒特地加 :0: 的版本;
2. pdfhowto/examples/ 下放的格式是 2002 年的格式,其中 unicode 還是用 Identity-H ...
最後決定用新寫法。
1. :0: 的意思是指 *.ttc 的第一個字型,ttc 裡頭會有兩種以上的字型。ttf 的話不需要。
2. 對,Unicode 的請使用 unicode,不要使用 Identity-H。
>不過,ttf2pt1 並不會自動嵌入 Unicode 碼,所以,會造成所產生的 PDF 無法 search©。
不会吧,好像search and copy功能不是通过放在字型里面的Unicode码实现的吧。我所有的用ttf2pt1制作的字型都是可以copy and search的,不管是pdflatex还是通过dvipdfm(x)这条路径。要不我弄错了?
那是使用 macro 來達成的?新版的 CJK 好像就可以了。不過,由於我很久沒有在使用 ttf2pt1 了,所以是以前的印象。
ttf2pt1 對某些字型會有 Unicode 對映,有些則不會。cwTeX 的 Type1 字型,當初就是請教 dvipdfmx 的作者,後來把 Unicode 對映弄進去才能 copy&search 的。
| « | 三月 2010 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||