LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2210|回复: 1

转:有源代码安装CJK的经验,安装中文字体

[复制链接]
发表于 2003-5-19 02:59:12 | 显示全部楼层 |阅读模式
http://bbs.ctex.org/cgi-bin/topic.cgi?forum=9&topic=84

我刚刚接触TeX 的时候,他最吸引我的是,我不用再关心排版了, 我只要关心我写些的东西就可以了.但是中文处理确实很大的一个难题.我搞了好久, 终于稍稍知道一些关于字体的东西了,写出来和大家分享,如果有不对的或者不准确地方还恳请高手指点.  

从源代码安装CJK

1.解包
tar -xzvf cjk-???-.tar.gz
说明:
这本来和 TeX CJK 无关,是Unix下的一个基本操作.


2.mkdir /usr/share/texmf/tex/cjk
cp -a cjk/texinput/ /usr/share/texmf/tex/cjk/
texhash
说明:
tex是不能处理双字节的文章的,也就是不能处理中文,但是CJK.sty 一个tex package 可以将中文,日文,韩文等双字节的文章转换成 tex 可以识别的字符,然后把一个很大的字体集分成若干小的子集,具体怎么转的,我也不知道.
\usepackage{CJK} ...
就是调用这个CJK.sty文件
如果你用
latex READMEgb.tex
发现出错,找不到CJK.sty,那就说明你没有指定足够的信息让 tex 找到 CJK.sty 文件.
同时CJK.sty 还使用会其他的文件,就像C语言中的include 一样.

tex 怎么着一个CJK.sty呢?

其实不光找CJK.sty, tex 找所有的文件都会用以下说明的办法来找的.

tex 会搜索 /usr/share/texmf 这个目录下的所有子目录, 来找sty, 其实这么说不准确. tex 会根据 TDS (Tex Directory Standard ) 搜索部分子目录. 我用的是 tetex under Linux 其实也是 Web2c.

/usr/share/texmf/web2c/texmf.cnf 定义了TDS的结构, 定义了缺什么样的文件,怎么找.一般不用修改,因为他符合TDS的定义.但是可以通过这个文件,知道什么类型的文件应该放在什么目录下.

/usr/share/texmf 就是 tex 的根目录.

tex 是用 kspewhich 命令来找文件的. 一个类似于which 的命令,但是他不是延着PATH环境变量来找一个文件, 而是按 /usr/share/texmf/web2c/texmf.cnf的定义来找文件, 可以搜索包含任意深度的子目录.

因为每次都搜索所有子目录是很慢的, 于是kspewhich 就建立了一个缓冲机制, 只是到缓冲区数据库中搜索, 这样就可以大大的提高搜索速度, 但是缺点是不能实时的跟踪最新的目录结构变化.
texhash
这个命令就是更新缓冲区数据库的. 可以查找kpsewhich 的帮助
man kpsewhich
可以知道更详悉的信息如何更新数据库.

结论: CJK.sty 和所有他所需要的文件都在cjk/texinput目录中, 我们把cjk/texinput 拷贝到 /usr/share/texmf/latex 下, tex 就可以找到他了.

可以用以下命令来检查是不是tex是不是可以找到CJK.sty, 或者其他tex需要的文件.
kpsewhich CJK.sty
如果没有任何输出,表示没有找到.否则会输出找到的CJK.sty文件的绝对路径
/usr/share/texmf/tex/cjk/CJK.sty

另一个办法
如果你没有权限在/usr/share/texmf 下建立或者拷贝文件,那么可以设定一个环境变量
export TEXINPUTS=:/some/path/where/your/cjk/stay/texinput//
效果是一样的.

这时候在用
latex examples/READMEgb.tex

就不会说找不到CJK.sty或者任何其他文件了.
如果还有什么文件找不到,先用
locate filename
找到他,然后在想办法知道这个文件是什么类型的文件,用上面提到的方法,让kspewhich 能找到的地方.

如果还是找不到,假设文件名称是unkown.tfm, 就看一看/usr/share/texmf 下有什么文件和这个找不到的文件是同一个类型的文件,也就是有同样的扩展名称,如cmr.tfm 然后用
kspewhich cmr10.tfm
把unknown.tfm放在cmr10.tfm所在目录下
然后
texhash
更新数据库
然后
kspewhich unknown.tfm
一定会找到的.
然后分析为什么原来的路径不对.然后想办法解决问题,把unkown.tfm 放到正确的位置.

2.
如果要生成dvi文件, Tex 要关心的就是要知道一个字符的排版信息 matric,这些信息存储在*.tfm的文件中Tex font matric,注意这些信息并不是真正的字型,只是描述一个字符的高矮胖瘦等等等信息,用这些信息tex 就可以生成*.dvi文件了.

怎么找呢?

当然是根据作者指定的字体了.

所以这里简单介绍以下NFSS(New Font Selection Scheme)

一个作者要指定一个字体有五种属性
1.encoding
OT1 TeX text
T1 Tex extend text
OML tex math itlatic
OMS tex math symbols
OMX tex math large symbols
U Unknown
L<xx> A local encoding
2.family
cmr  Computer Modern Roman
cmms computer modern sams
cmmt computer modern typewriter
cmm computer moden math italic
cmsycomputer modern math symbols
cmex computer modern math extensions
ptm Adobe times
phv Adovel helvetica
pcr Adoble courier
3.series  
m Medium
b Bold
bx Bold extend
sb semi-bold
c condensed
4.shape italic oblique upright(roman)
n Normal (upright roman)
it Italic
sl Slant
sc Caps and small caps
5.size
10  10pt
1pc
1in

Latex 有很多命令选择字体,如\emph \Large 这些命令都是选择一个五个属性中的一个.
\usepackage{CJK}{GB}{song}
其中GB表示 encoding, song 表示 Family .

tex会根据这encoding 和 family 的属性找一个*.fd 的一个字体定义文件
文件名称的格式是
Font definition files format
<encoding><family>.fd
ex:
c19fs.fd
ot1cmr.fd

C19 表示中文简体GBK 编码,
fs 表示仿宋体

latex 找到 字体定义文件后,就可以找到 *.tfm 文件的文件名称,
具体怎么找到的,我还不清楚,因为在 *.fd中
\DeclareFontShape
\DeclareSizeFunction
都是比较复杂的命令.

例如
\DeclareFontShape{C10}{song}{m}{n}{<-> CJK * gbsong}{}

总之,再运行
latex READMEgb.tex
会出错

!Font C19/gbsong/m/n/20.74/18= ... not loadable

不能加载某个字体
C19 表示编码是GBK
gbsong  表示字体是宋体
m   表示中等字体medium
n   表示normal
20.74 表示size

tex 会根据 fd 文件中的定义的字体名称 gbsong 到 /usr/share/texmf/fontname/special.map
中找真正的tfm 文件的文件名称.
tfm 的文件名称是<fontname><size>.tfm

gbsong19.tfm

现在是因为找不到gbsong19.tfm,
用 ttf2tfm 可以把simsun.ttf 转换成为gbsong*.tfm, * 表示一大堆的不同字体大小的文件.

这一个步骤我没有作,所有具体是怎么从fd 文件找到 tfm 文件的细节我还不清楚.
还好,我有MikTex 下生成好的, tfm 文件. 就算没有, 在研究以下ttf2tfm 也应该不难.我偷懒了,

然后把生成*.tfm  文件按照字体的family 放在不同的目录下面

/usr/share/texmf/fonts/tfm/cjk/gb/gbsong/gbsong*.tfm
注意: /usr/share/texmf/fonts/tfm 是可以变的,否则不符合TDS,cjk 后面的名字随便了,但是
cjk/gb/gbsong 还是一个好名字.

好了
现在
latex READMEgb.tex
就不会处错了。
就可以生成 READMEgb.dvi 了!!!

3. 查看dvi 文件
xdvi READMEgb.dvi
出错
mktexpk 出错,不能生成*.pk 文件.

这里解释以下 *.pk 文件是干什么的.
   上面提到, tex 生成 div 文件只要知道字体的高矮胖瘦的matric就可以了,而不需要知道字型,也就是到底一个字长什么样.
但是现在我们要看 dvi 文件,当然要知道一个具体的字长什么样了.
*.pk 文件就是一个字体的bit pattern,点阵字体,是跟具体的分辨率有关的,通常是十分大的,因为打印机的分辨率是十分高的,所以 pk 文件都很大.
一般都是根据需要生成 pk 文件的.
缺省的情况下,是用mf (metafont) 根据 *.mf 文件生成 *.pk 文件.
但是我们一般都用的true type 字体,所以要用 ttf2pk 把 ttf 字体转换成 pk 文件.
mktexpk
是一个脚本文件, 他判断是要将字体的类型,然后找相应的程序生成 pk
但是我的mktexpk 有个小bug
就是不能正确的判断是ttf 文件.
我做了一个小的修改.
但是我想,我碰到的可能不是通常碰到的情况.
当然, CJK 带有一个 mktexpk.diff 文件,可以用这个文件给系统中的mktexpk 打个补丁.
我不熟悉diff,patch的使用, 于是手工debug mktexpk 的运行.改成功了.
我想一般很少像我这么笨的,把diff 文件合并一下也许就搞定了.

ttf2pk gbsong19 710

ttf2pk 需要查找 /usr/share/texmf/ttf2pk/ttfonts.map
来查找真正的ttf 文件
添加以下内容在其中.

gbfs@UGB@ simfang.ttf Pid = 3 Eid = 1
gbfssl@UGB@ simfang.ttf Slant=0.25 Pid = 3 Eid = 1
gbkai@UGB@ simkai.ttf Pid = 3 Eid = 1
gbkaisl@UGB@ simkai.ttf Slant=0.25 Pid = 3 Eid = 1
gbhei@UGB@ simhei.ttf Pid = 3 Eid = 1
gbheisl@UGB@ simhei.ttf Slant=0.25 Pid = 3 Eid = 1
gbsong@UGB@ simsun.ttf Pid = 3 Eid = 1
gbsongsl@UGB@ simsun.ttf Slant=0.25 Pid = 3 Eid = 1
gbli@UGB@ simli.ttf Pid = 3 Eid = 1
gblisl@UGB@ simli.ttf Slant=0.25 Pid = 3 Eid = 1
gbyou@UGB@ simyou.ttf Pid = 3 Eid = 1
gbyousl@UGB@ simyou.ttf Slant=0.25 Pid = 3 Eid = 1
gbksong@UGBK@ simsun.ttf Pid=3 Eid=1
gbksongsl@UGBK@ simsun.ttf Slant=0.25 Pid=3 Eid=1
gbkkai@UGBK@ simkai.ttf Pid=3 Eid=1
gbkkaisl@UGBK@ simkai.ttf Slant=0.25 Pid=3 Eid=1
gbkhei@UGBK@ simhei.ttf Pid=3 Eid=1
gbkheisl@UGBK@ simhei.ttf Slant=0.25 Pid=3 Eid=1
gbkfs@UGBK@ simfang.ttf Pid=3 Eid=1
gbkfssl@UGBK@ simfang.ttf Slant=0.25 Pid=3 Eid=1
gbkli@UGBK@ simli.ttf Pid = 3 Eid = 1
gbklisl@UGBK@ simli.ttf Slant=0.25 Pid = 3 Eid = 1
gbkyou@UGBK@ simyou.ttf Pid = 3 Eid = 1
gbkyousl@UGBK@ simyou.ttf Slant=0.25 Pid = 3 Eid = 1

其中simsun.ttf, simyou.ttf, simli.ttf, simhei.ttf 就是大家熟悉的ttf 文件了,可以从windows 98 中得到.

ttf2pk -t gbsong16
可以测试是不是可以在ttfonts.map中找到ttf文件的文件名称.

但是找ttf 文件真正的位置,还是需要kpsewhich 所以
kpsewhich simsun.ttf
应该找到simsun.ttf
如果找不到

cp  /mnt/c/windows/fonts/simsun.ttf /usr/share/texmf/fonts/truetype/cjk/gb/simsun.ttf
texhash

也就是把simsun.ttf 拷贝到kpsewhich 能够搜索的目录下面,注意,一定要是
/usr/share/texmf/fonts/truetype
下面的子目录下.
kpsewhich 会在/usr/share/texmf/fonts/truetype 及其子目录下搜索true type 字体文件
放在其他目录下是不会找到的,可以看一下/usr/share/texmf/web2c/texmf.cnf下有定义的.


好了现在大功告成,可以
xdvi READMEgb.dvi
欣赏你的杰作了!
发表于 2003-5-19 11:06:04 | 显示全部楼层
不错
我也是按照类似的教程装的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表