LinuxSir.cn,穿越时空的Linuxsir!

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

Linux系统中为texlive生成CJK字体

[复制链接]
发表于 2008-10-31 19:43:08 | 显示全部楼层 |阅读模式
1. 简要说明
mkfonts -- 这是一个我用shell写的CJK-LaTeX字体生成程序,其主要目的是从TTF字体产生能够被Texlive使用的中文字体,生成的文件包括metric字体文件,字体定义文件*.fd,字体隐射文件*.map等。用mkfonts生成的字体与CTeX兼容,并且与www.ctex.org发布的ctexbook等宏包兼容。

以下涉及的所有命令均以普通用户身份执行。

teTeX用户请注意:从使用原理上,用mkfonts所生成的字体以及字体定义文件也可以用在tetex系统中,但用户可能需要手动修改相当多的字体映射配置。我本人曾做过很多努力想将为texlive生成的字体用于teTeX系统,但始终未能成功。我曾经专门为teTeX生成过字体,但过程相当复杂,况且teTeX已经停止开发,建议使用Texlive代替teTeX。

2. 压缩包中的文件内容
上传的cjkfonts.tar.gz是一个压缩包文件,其中主要的文件包括编码定义文件*.sfd,一个可执行文件mkfonts, 以及若干个子目录。除了test子目录包含简单的测试文件外,其余子目录的作用是提供并安装与CTeX兼容的宏包。(由于上载文件大小的限制,我将这些宏包删除了。)

3. 解压缩
使用下列的步骤进行解压缩:

  1. $ mkdir buildfont
  2. $ cd buildfont
  3. $ tar zxvf <path_to_cjkfonts>/cjkfonts.tar.gz
  4. $ cd fonts
复制代码

解压后在当前目录下生成一个fonts子目录,

4. 准备工作
4.1 下载并安装Texlive2007, 可以从这里下载ftp://tug.org/historic/systems/t ... ve-20070212.iso.bz2。也可以下载最新的Texlive2008
4.2 安装fontforge软件包, 可以从http://www.linuxpackges.net下载当前版本并安装。
4.3 运行mkfonts之前需要设置TTFPATH环境变量告知mkfonts从那里找到TTF字体。有几种方法:
  a. mkfonts缺省地认为TTF字体在当前目录中,因此必须先拷贝相应的字体文件到当前目录中,比如

  1.   $ cp /usr/share/fonts/TTF/sim*.tt? .
  2.   
复制代码


  b. 使用命令行环境变量运行mkfonts,比如

  1. $ TTFPATH=/usr/share/fonts/TTF ./mkfonts
复制代码

  c. 修改mkfonts中的变量定义。使用任何一个你熟悉的编辑器打开mkfonts文件,在开头的位置找到TTFPATH变量的定义,直接将TTFPATH变量修改为路径名。

4.4 指定TEXMF根路径。texlive2007默认的TEXMF用户路径为$HOME/.texlive2007/texmf-var,这也是mkfonts使用的缺省路径。如果你想使用一个特定的安装路径,可以使用命令行,比如

  1. TEXMF=$HOME/texmf  ./mkfonts
复制代码

也可以直接打开mkfonts文件,在程序的开头找到TEXMF的定义,直接修改。

注意:用户指定的TEXMF目录树必须位于texlive搜索路径中,texmf以及localtexmf都是可以考虑的路径名,参考/usr/local/texlive/2007/texmf/web2c/texmf.cnf

5. 运行mkfonts
mkfonts会在指定的TTFPATH路径下查找下列文件:simfs.ttf(仿宋)、simsun.ttc(宋体)、simkai.ttf(楷体)、simhei.ttf(黑体)、simli.ttf(隶书)、simyou.ttf(幼圆),并分别生成GBK和UTF8两种编码格式的CJK字体文件。整个过程大约需要耗时6小时(在我的2.7GHz/1MB/dual core CPU机器上进行测试),请耐心等待。

6. texlive的配置
如果mkfonts没有报告任何错误,那么所生成的字体,字体定义文件等都已经拷贝到了合适的路径下。接下来的工作是做一些配置工作。texlive2007的配置比teTeX的配置简单了许多,只需要运行updmap即可。

  1. $ updmap --edit
复制代码

该命令将打开一个编辑器让你加入一些字体映射文件,将下列几行加入到文件的末尾。


  1. Map unifs.map
  2. Map unisong.map
  3. Map unikai.map
  4. Map unihei.map
  5. Map unili.map
  6. Map uniyou.map
复制代码

这些文件是mkfonts产生的字体映射文件。

7. 使用CJKFonts
对于使用GBK编码的文件,可以这样来编写LaTeX源文件来使用刚刚产生的CJK字体

  1. \documentclass{article}
  2. \usepackage{CJK}
  3. \begin{document}
  4. \begin{CJK}{GBK}{song}

  5. \textit{你好! 这是一个测试CJKGBK编码的测试文件。}
  6. \textbf{你好! 这是一个测试CJKGBK编码的测试文件。}
  7. \textsl{你好! 这是一个测试CJKGBK编码的测试文件。}

  8. \end{CJK}
  9. \end{document}
复制代码


对于使用UTF8编码的文件,可以这样来编写LaTeX源文件来使用刚刚产生的CJK字体

  1. \pdfoutput=1
  2. \pdfmapfile{=fs-enc.map}
  3. \documentclass{article}
  4. \usepackage{CJKutf8}
  5. \begin{document}
  6. \begin{CJK}{UTF8}{song}
  7. \textit{你好! 这是一个测试CJKutf8编码的测试文件。}

  8. \textbf{你好! 这是一个测试CJKutf8编码的测试文件。}

  9. \textsl{你好! 这是一个测试CJKutf8编码的测试文件。}
  10. \end{CJK}
  11. \end{document}
复制代码

可以在LaTeX中使用的字体有
fs  仿宋
song  宋体
kai  楷体
hei  黑体
li  隶书
you  幼圆


8. 测试
在解压缩后的文件中包含一个test子目录,其中包含了三个简单的测试文件,cjkgbk.tex, cjkutf8.tex, ctextest.tex。可以运行下列命令来进行测试

  1. $ latex cjkgbk
  2. $ xdvi cjkgbk
  3. $ dvipdf -o cjkgbk.ps cjkgbk
  4. $ dvipdfm cjkgbk
  5. $ dvipdfmx cjkgbk
  6. $ pdflatex cjkgbk
复制代码

上述命令应该能够产生所预期的结果。如果上述测试全部通过,可以删除buildfont子目录。

9. 最后的说明
mkfonts 将生成下列文件:

字体定义文件
    c19fs.fd c19song.fd c19kai.fd c19hei.fd c19li.fd c19you.fd
这些是使用GBK编码的字体定义文件,分别表示仿宋体,宋体,楷体,黑体,隶书,幼圆。

   c70fs.fd c70song.fd c70kai.fd c70hei.fd c70li.fd c70you.fd
这些是使用UTF8编码的字体定义文件,分别表示仿宋体,宋体,楷体,黑体,隶书,幼圆.

字体映射文件
   unifs.map unisong.map unikai.map unili.map uniyou.map
这些是dvipdfm所需要的字体映射文件。

  fs-enc.map song-enc.map kai-enc.map hei-enc.map li-enc.map you-enc.map
这些是pdftex所需要的字体映射文件。

各种字型定义文件,比如*.tfm *.afm *.vf等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2008-11-11 22:54:55 | 显示全部楼层

Linux系统中为texlive生成CJK字体(补充)

一点补充:

如果按照上面的步骤安装了中文字体,在执行dvipdfmx可能会出错,原因是找不到CMap编码定义文件。CMap的作用是将字符编码转换成CID。

在mkfonts的最后,有一条命令是将cmap拷贝到$HOME/fonts目录中,
# Lastly, copy necessay files for CTeX
cp cid-x $TEXMF/fonts/map/dvipdfm/cid-x.map
cp -a cmap $TEXMF/fonts/
#cp -a ctex $TEXMF/tex/latex
#cp -a ctexutf8 $TEXMF/tex/latex
因为压缩包的大小超出linuxsir 200kB的限制,因此我在上传cjkfonts.tar.gz时将cmap的内容删除了。CMap for Chinese包含在xpdf软件包中,可以从ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz下载。解压后将cmap目录拷贝到$TEXMF/fonts子目录中,然后执行一次texhash.

可能已经注意到了还有两条拷贝命令被注释掉了。这两条命令是拷贝CTeX的两个目录,目的是增加对ctexbook.sty 和ctexart.cls的支持,如果你确实需要它们,可以从CTeX的发行版中找到这两个目录,自己拷贝一下。

2008年11月11日
回复 支持 反对

使用道具 举报

发表于 2008-11-12 22:00:04 | 显示全部楼层
对texlive,一无所知。。。啊
回复 支持 反对

使用道具 举报

发表于 2008-11-13 10:28:55 | 显示全部楼层
Post by lchxr;1902096

4. 准备工作
4.3 运行mkfonts之前需要设置TTFPATH环境变量告知mkfonts从那里找到TTF字体。有几种方法:
  a. mkfonts缺省地认为TTF字体在当前目录中,因此必须先拷贝相应的字体文件到当前目录中,比如

  1.   $ cp /usr/share/fonts/TTF/sim*.tt? .
  2.   
复制代码


感谢楼主分享!
请问这里使用的sim*.tt?字体是simsun吗?能否用文泉驿正黑代替?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-13 18:49:42 | 显示全部楼层
请问这里使用的sim*.tt?字体是simsun吗?能否用文泉驿正黑代替?

是的,simsun.ttc,simfang.ttf,simkai.ttf,simhei.ttf,simli.ttf,simyou.ttf。或者直接从Windows系统拷贝。文泉驿字体我没有试验过,我不清楚。
回复 支持 反对

使用道具 举报

发表于 2008-11-13 20:06:18 | 显示全部楼层
谢谢!
我一直想在linux下用ctex,但就是这个字体的版权问题头疼。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-13 21:12:54 | 显示全部楼层
Post by duangw;1908151
谢谢!
我一直想在linux下用ctex,但就是这个字体的版权问题头疼。


你可以试着修改mkfonts脚本,看行不行。
回复 支持 反对

使用道具 举报

发表于 2009-8-22 22:47:35 | 显示全部楼层
不错的脚本,
自动化程度挺高的,
谢谢楼主。
回复 支持 反对

使用道具 举报

发表于 2009-8-25 01:18:55 | 显示全部楼层
好贴,我折腾不见效果,lz老大出马一个顶N。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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