荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (<font color=green><b>Love</b></font>), 信区: Linux
标  题: [转载] 贴一片tetex下使用cjk的文章,好像前面没有(转寄)
发信站: 荔园晨风BBS站 (Fri Nov  2 19:35:38 2001), 转信

【 以下文字转载自 jjksam 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: ganzhi (野兽), 信区: Linux
标  题: 贴一片tetex下使用cjk的文章,好像前面没有
发信站: BBS 水木清华站 (Fri Nov  2 19:26:07 2001)

转载自www.sinica.edu.tw

本文提供一个简单的范例,说明如何将 CJK-4_2.0 安装在 tetex-0.9, kpathsea-3.2
的环境下。由于自 4_2.0 版以后, CJK 将不再包含 ttf2pk 等工具程序,而 ttf2pk
也已移到 FreeType package 之中。因此若想要使用 TTF 字型来转换成 CJK 的字型
的话,还要另外抓 FreeType package 回来安装。本文试图将整个步骤做一个整理,
以方便大家参考。
(PS. 感谢 CJK 的作者 Werner LEMBERG <wl@gnu.org> 对本文所做的 comment :-))
A. 所需的 package:
===================
1. CJK-4_2.0:
   ftp://ftp1.sinica.edu.tw/pub2/tex/languages/chinese/CJK
2. FreeType:
   ftp://ftp.freetype.org/pub/freetype/devel/freetype-current.tar.gz
   ftp://apollo.ce.ntu.edu.tw/pub/freetype
B. 安装路径:
=============
由于我的 tetex-0.9 是随着 Debian Linux 2.0 distribution 而来的,其所在
的主路径是 /usr, 而现在要加装 CJK 的支持,我打算将 CJK 与 ttf2pk 的部分
尽可能地安装在 /usr/local 之下,以便与 Debian 所附的 distribution 有所
区格。因此,我便把所需的安装路径安排如下:
 执行档:         BINLOCAL=/usr/local/bin
 CJK 与 ttf2pk 的相关设定档:  TEXMFLOCAL=/usr/local/lib/texmf
同时我们还需要配合 (修改) TEXMFCNF=/etc/texmf/texmf.cnf 中的相关设定来
安装档案, 使得 latex 与 ttf2pk 在运作过程中能找到所有所需的档案。
PS.  1. $TEXMFCNF 是 tetex 的各种路径设定文件,文件名为 texmf.cnf, 但它的位
 置可能依不同的 distribution 而有不同: 可能在 /etc/ 下,也可能在
 /etc/texmf/ 下。
     2. $TEXMFLOCAL 的值是依 $TEXMFCNF 的设定而定,请自行参考您系统中的
 设定。
     3. 在我的系统中, $TEXMFCNF 中有一行是这样的:
  TEXMF = {$HOMETEXMF,!!$TEXMFLOCAL,!!$TEXMFMAIN}
 其意义是,凡是使用 $TEXMF 做为路径开头者,则系统在搜寻时会自动寻
 找 $HOMETEXMF, $TEXMFLOCAL, $TEXMFMAIN 等目录底下的路径。其中:
  HOMETEXMF = $HOME/texmf  % 使用者自己的 tex 目录位置
  TEXMFMAIN = /usr/lib/texmf % tetex 主目录
     4. latex/xdvi/dvips/ttf2pk 等程序在运作的过程中,所产生的 tfm 与 pk 字
 型档,会放到 $VARTEXFONTS 底下。根据 $TEXMFCNF 的预设,其值为
  VARTEXFONTS = /var/spool/texmf
     5. 关于相关的字型路径名称,可以参考 CJK-4_2.0..../doc/TDS.doc 的建议。
C. 安装步骤:
=============
1. TTF 字型我用 moe_kai.ttf, 放在 $TEXMFLOCAL/fonts/truetype 下。
   (PS. $TEXMFCNF 中的预设为:  TTFONTS = .:$TEXMF/fonts/truetype//)
2. 将  CJK-4_2.0/.../texinput/ 整个拷到 $TEXMFLOCAL/tex/CJK。
   (PS. $TEXMFCNF 中的预设为:
 TEXINPUTS.latex2e = .:$TEXMF/tex/{latex,generic,latex209,}//
 TEXINPUTS.latex = .:$TEXMF/tex/{latex,generic,latex209,}//)
3. 修改 /usr/lib/texmf/tex/latex/CJK/Bg5/c00kai.fd, 那是定义 CJK kai
   所用的字型,在此我们将使用 moe_kai 的字型。请将
\DeclareFontShape{C00}{kai}{m}{n}{<-> CJK * b5ka12}{}
\DeclareFontShape{C00}{kai}{bx}{n}{<-> CJKb * b5ka12}{\CJKbold}
   改成
\DeclareFontShape{C00}{kai}{m}{n}{<-> CJK * moekai}{}
\DeclareFontShape{C00}{kai}{bx}{n}{<-> CJKb * moekai}{\CJKbold}
   由于目前的 FreeType - ttf2pk 尚不支持将中文字转 90 度,故在此我们
   不去修改 c00kair.fd 檔。
   (PS. 请注意,在此所使用的字型名请尽量不要有 "_" 字符,以免造成问题)
4. 修改 $TEXMFMAIN/fontnames/special.map, 加入
moekai         big5         moekai
   其义意是, CJK 所需的 .tfm, .pk 等字型将会放在:
    moekai*.tfm  ===>  $VARTEXFONTS/tfm/big5/moekai/
 moekai*pk    ===>  $VARTEXFONTS/pk/big5/moekai/
   底下。
5. Compile 一下 CJK-4_2.0/utils/Bg5conv/bg5conv.c, 并将它放到 $BINLOCAL
   下。同时也将 bg5latex 也放过去。
6. 安装 FreeType lib 。请到 FreeType 的目录下,执行:
 ./configure --prefix=/usr/local --with-locale-dir=/usr/share/locale
 make
 make install
7. 安装 ttf2pk 。请到 freetype/contrib/ttf2pk 底下,执行:
 ./configure --prefix=/usr/local --with-kpathsea-dir=/usr
 make
 make install
   在此因为我的系统中有 kpathsea lib, 是放在 /usr 底下,因此我做了这样的
   的设定。若您的系统中没有 kpathsea lib, 则不要设 --with-kpathsea-dir。
   建议您使用 kpathsea lib, 因为这样的话 ttf2pk package 可以很完整地与
   tetex 系统整合在一起。
   (PS. 请注意,根据 Werner LEMBERG 的 comment, 这样的做法可能在某些
 情况下会失效。最一般的做法,是将 ttf2pk 的执行档安装在与其它
 tetex 的执行文件相同的目录下,在上述的例子即为 /usr/bin 。同时,
 在 configure 时 --prefix 也应该设为 /usr 才对。若您发现用上述
 的方式无法 work 时,请您试着将 ttf2pk 安装在与 tetex 的执行档
 安装在一起。除此之外,使用 symbolic link 将 /usr/local/bin/ttf2pk
 link 到 /usr/bin/ttf2pk 可能也没用)
8. 现在我将 ttf2pk 的相关资料文件放到 $TEXMFLOCAL/ttf2pk 下:
 mkdir $TEXMFLOCAL/ttf2pk
 cp freetype/contrib/ttf2pk/data/*  $TEXMFLOCAL/ttf2pk
 ln -s $TEXMFLOCAL/ttf2pk $TEXMFLOCAL/ttf2tfm
   然后修改 $TEXMFCNF, 加入以下两行:
 TTF2PKINPUTS  = $TEXMF/ttf2pk/
 TTF2TFMINPUTS = $TEXMF/ttf2pk/
   以明确指定 ttf2tfm 以及 ttf2pk 所需的设定与数据文件的位置)
9. 做出所有的 tfm 字型 (本指令的详细意义请见 man ttf2tfm):
 ttf2tfm moe_kai -P 3 -E 4 moekai@Big5@
   在程序执行终了会印出这一行:
moekai@Big5@   moe_kai Pid=3 Eid=4
   请将这一行写到 $TEXMFLOCAL/ttf2pk/ttfonts.map 檔中。ttf2pk 即使用此资
   料来产生所需的 pk 字型文件。
   然后,再将产生出来的 .tfm 字型全部移到 $VARTEXFONTS/tfm/big5/moekai
   底下。
10. 跑一下 texconfig rebuild ls-R data base. 若您的系统没有这个指令,则
    跑一下 mktexlsr <path_name>. 请注意,每次您重新做出 tfm 字型,或增加、
    删除 tetex 底下的档案时,您都必须做这一步,以更新 ls-R data base 的内
    容。使用 texconfig 时会出现一个选单,您可以选取 "rebuild ls-R database"
    即可。若您使用 mktexlsr, 则要指明路径,如
 mktexlsr /var/spool/texmf
 mktexlsr /usr/local/lib/texmf
11. Patch tetex-0.9 的 mktexpk script。其 diff 檔是在
    freetype/contrib/ttf2pk/scripts/web2c-7.2/ 底下。如此 latex 系统
    在需要时,就会呼叫 ttf2pk 来产生所需的 pk 字型。
    (PS. 若您所用的是最新的 teTeX 0.9-beta 的话,其 mktexpk 已包含了以上
  的 patch, 所以您不必做这一步。最新的 teTeX 0.9-beta 可以在这里
  找到:
 ftp://ftp.rrzn.uni-hannover.de/pub/local/misc/teTeX-beta/)
12. 完成! 您可以试试编译 CJK_4_2.0/doc/chinese/READMEb5.tex, 看有没
    有其它问题。
C. LaTeX/CJK 的工作原理 (for tetex-0.9, CJK-4_2.0):
====================================================
以下为就我所知的 LaTeX 编译文章的步骤与目前 CJK 的工作原理稍微说明一下,
以帮助读了解以上设定的意义。
首先,当 TeX/LaTeX 在读入一个 .tex 档,并试图地做出一个 .dvi 档时,它必须
要用到 .tfm 的字型。 .tfm 的字型文件只记录了该种字型最基本的信息,它甚至与
字型的实际大小无关,它纯粹只用来做排版用的。TeX/LaTeX 预设状况下都会到
$TEXMFDIR/fonts/tfm/ 底下找 .tfm 字型 (各位可以看看 /etc/texmf/texmf.cnf
的设定) ,因此,假设在 tfm/ 下还有很多目录,如
 ..../tfm/big5/moekai/
 ..../tfm/big5/moesung/
 ..../tfm/ams/
 ...........
等等,则这些子目录底下所有的 .tfm 字型文件都会被搜寻到。而 $TEXMFDIR 则代表
了你系统中 TeX 的主目录。万一找不到字型,它会呼叫 mktextfm 来产生字型,所
产生出来的字型就丢到 $TEXMFDIR/fonts/tfm/.... 下。
mktextfm 是一个 shell script ,它在工作时首先会先分析所需产生的字型种类与
应在的路径名,并再次检查该字型是否存在,如果真不存在,则它会呼叫字型产生
程序 mf 来把字型做出来。
然而,不管是做什么样的字型,都一定要有一个供参考的字型「样板」才行,在 TeX
系统中,预设的字型样版为 MetaFont, 这是系统最基本的字型样版。当然,我们可
以加入其它的字型做为样版,而这些加入的字型就记录在一个叫 special.map 的檔
中,此档有三个字段如下:
% Font          source  typeface
%
A               public  hieroglyph
Aa              public  hieroglyph
B               public  hieroglyph
C               public  hieroglyph
D               public  hieroglyph
DeadSea         public  hebrew
其中第一栏是字型名称,第二栏和第三栏是字型类别。TeX/LaTeX 即根据 special.map
的内容,在 $TEXMF/fonts/tfm 下寻找所需的 .tfm 字型。预设情况下,它就以
字型类别名称做为该字型的存在路径,例如当需要 DeadSea*.tfm 时,其存在的路行即
为 $TEXMF/fonts/tfm/public/hebrew/ 。若路径不存在或字型不存在,则视需要
产生该路径,并呼叫 mktextfm 来产生字型文件, mktextfm 则会进一步呼叫 mf 程序来
工作。
当 .dvi 档出来后,我们可以用 xdvi 来做预视,这时候就需要 .pk 的字型,此为
点阵字型,就与实际所需的字号有关。同样的, xdvi 会先到
$TEXMF/fonts/pk/..../ 看看该字型是否已存在,找不到它就会去呼叫
mktexpk 来做出字型。mktexpk 的工作机制与 mktextfm 完全一样,所以就不再重复。
当然,我们也可以用 dvips 来产生 PostScript 的文件档,在这里同样要使用 .pk
的字型,也是用 mktexpk 来做。
就以上的说明,我们可以知道,若要用 CJK 来产生中文文件,则需要具备以下条件:
1. 用来定义中文文件格式的 texinput style 檔。
2. 中文字型 .tfm 以及 .pk 。
其中第一个条件很容易,也就是我在上一节的「安装步骤」中的第二步所提到的。除
此之外,我们还需要一个 bg5conv 的程序,它负责读入中文 .tex 原始文件,经编码
后转成 .cjk 编输出,然后才交给 latex 进行产生 .dvi 档的动作。
比较麻烦的是字型的部分。就 .tfm 字型而言,在过去安装 CJK 时,我们可能不会
预先将所有需要的 .tfm 预先做出来,而是采用在线产生的方式,这时我们需要修
改 mktextfm, 以便在需要时呼叫 ttf2pk 之类的程序自 TTF 字型做出 .tfm 字型。
但现在我们使用新版的 ttf2pk package, 其 ttf2tfm 程序可以很容易地将所有的
.tfm 字型产生出来,并预先安装到正确的目录中,如此我们就不需要去修改 mktextfm
了。而这就是上一节「安装步骤」中的第 9 步所做的工作,其命令的意义为:
    ttf2tfm <TTF filename> -P <platform ID> -E <encoding ID> <TFM filename>
其中 <TTF filename> 档名格式为 <name>XX.tfm, <name> 是字型名称, XX 是一个
数字,代表了该字型 encoding 的序号,例如: moekai03.tfm 。对于一套完整的
字型,其序号必须足以包含所有的中文字,以 Big5 码为例,其完整的序号是从 01
到 58, 也就是必须产生 58 个字型文件。在新版的 ttf2tfm 中,您不需要呼叫 ttf2tfm
58 次,注意到在安装步骤中, <TFM filename> 这一个参数是
 moekai@Big5@
其中 moekai 即为 <name>, 而 @Big5@ 是指序号的部分,在这里是用一个
Big5.sfd 这个文件来代替 (程序会自动加入 .sfd 这个附档名) ,注意到在「安装
步骤」中的第 8 步我们已将这个档案拷到了适当位置,而该文件就记录了 Big5 码字
型所有序号等相关信息, ttf2tfm 可以直接参考这个档的内容将所有的字型全部
做出来。
在 ttf2tfm 工作完成之后,它会印出一行讯息 (见「安装步骤」第 9 步),这一
行是给 ttf2pk 参考用的,必须写入 ttf2pk 专属的设定档 ttfonts.map 中。最
后,我们再将所有的 .tfm 字型移至适当目录,即完成了 .tfm 字型的部分。
对于 .pk 字型,由于这里还牵涉了不同的字号有不同的档,我们无法预先知
道需要那些大小的字型,因此在此我们采用了在线产生的方式,需要时才产生 pk
字型。于是,我们必须修改 mktexpk,在需要中文字型时呼叫 ttf2pk 自 TTF 字
型将所需的字型做出来 (见「安装步骤」第 11 步)。
pk 字型文件名的格式如下:
 <name>XX.<SSSS>pk
其中 <name> 是字型名, XX 是 encoding 序号, <SSSS> 即为该字型的大小 (dpi)。
还有一点,由于新版的 ttf2pk 已能使用 kpathsea lib 来搜寻它所需的档案,包
括字型文件以及设定文件,而设定档的部分我们就必须将它的位置写在
/etc/texmf/texmf.cnf 中,并且要跑 mktexlsr 或 texconfig 后 (见「安装步骤」
的第 8 步与第 10 步),如此 kpathsea lib 才能找到设定文件的位置。
综上所述,以下我描述一下整个 LaTeX/CJK 的 compile 过程,做为总结。
1. 执行 bg5latex, 这是一个 script, 它呼叫 bg5conv 读入 .tex 原始档,并转
   成编码后的 .cjk 檔。
2. bg5latex 接着呼叫 latex, 读入 .cjk 檔,在判定它需要 CJK package 时,
   如:
 \usepackage{CJK}
 \begin{CJK*}{Bg5}{kai}
   便读入一系列的 CJK texinput style 文件,并跟据 Bg5, kai, 读取
   .../Bg5/c00kai.fd 这个字型定义文件。
3. 根据 c00kai.fd 档的定义, latex 知道中文的部分需要 moe_kai 字型。于是,
   在产生 .dvi 档的过程中,它根据 special.map 文件的内容,在适当的路径中寻找
   所需的 .tfm 档,若找不到则呼叫 mktextfm 来产生它。由于事先我们已安装好
   所有的 .tfm 字型,因此这一步不需要呼叫 mktextfm 即可完成。
4. .dvi 档出来后,假设我们要用 dvips 来产生 .ps 档,则 dvips 在发现需要
   moekai 字型时,会跟据 special.map 的内容,到适当的路径去寻找 moekai*pk
   檔。
5. 若找不到,则它会呼叫 mktexpk 来产生字型文件。修改过的 mktexpk 在发现所需
   产生的字型是 moekai 时,便会呼叫 ttf2pk 来工作。
6. ttf2pk 首先透过 kpathsea lib, 藉由 /etc/texmf/texmf.cnf 中的设定找到其
   设定档 ttfonts.map 的位置,读入设定文件后,根据 moekai 那一行,它知道了:
   a. 所需要的字型样版为 $TEXMFLOCAL/fonts/truetype/moe_kai.ttf 。
   b. 该字型的 encoding 序号数据存放在与 ttfonts.map 相同目录下的 Big5.sfd
      檔中。
   c. 其它如 Platform ID 与 Encoding ID 的信息。
   ttf2pk 即利用这些信息,将所需的 moekai*pk 档做出来,并交由 mktexpk 将该
   文件放到正确的路径下,以备日后重复利用。
7. 完成。

--

※ 修改:·ganzhi 於 Nov  2 19:28:40 修改本文·[FROM:    211.80.38.18]
※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.80.38.18]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店