架设laTEX中文环境的方法
转自http://www.soforge.com/emacs/teTeX-chinese.html
本文的目的是说明如何在Unix/Linux 下搭建一个TEX环境,并作配置和调整, 可以用来编辑和处理中文,最终生成高质量的pdf 文档。
文中示例都是在NetBSD 操作系统下,结合pkgsrc 软件包管理系统进行的。在 不同的Unix/Linux 发行版中,teTEX的软件包封装形式各不相同,但基本原理 和设置是一样的,因此参照本文也可以在其他系统下架设出TEX中文环境。
下面表格是搭建这个TEX环境所需软件包,在pkgsrc 中对应的名称和版本:
软件包 版本 备注 print/teTeX3-bin 3.0 print/teTeX3-texmf 3.0 print/teTeX3-texmfsrc 3.0 可选 fonts/arphic-ttf 2.11 文鼎字体 fonts/ttf2pk 1.3.1 wip/tex-arphic-ttf 2.11 wip/cjk-latex 4.6.0 fonts/adobe-cmaps 20051109 print/dvipdfmx 0.0.0.20050831 fonts/t1utils 1.32 fonts/ttf2pt1 3.44
这些软件包,既可以采用pkgsrc 的源码编译机制使用make install 进行安装, 也可以直接使用预编译的二进制软件包。但wip 下的软件包,由于没有提供二进 制软件包,还需自己动手进行编译。
teTEX
TEX在Unix/Linux 下的分发套件是teTEX。首先我们需要安装软件 包print/teTeX3-bin,该软件包主要内容是TEX的可执行文件,包 括latex、pdflatex、xdvi 这些命令,以及这些命令的配置文件,还有对应 的man 和info 等帮助信息。
接着安装print/teTeX3-texmf,它里面是TEX所使用的宏包和各种字体定义, 以及大量的帮助和示例文档。该软件包安装的目录,在TEX中称为TEXMFMAIN, 对于pkgsrc,默认是安装到/usr/pkg/share/texmf 目录。另外一个软件 包print/teTeX3-texmfsrc 是这些宏包的源码文件,也建议安装,它对于学习使 用这些宏包很有帮助。
teTEX软件包中各项功能的配置文件,位于TEXMFMAIN 目录下。我们可以直接 编辑该目录下的文件调整配置信息,但修改后影响的是整个系统的配 置。Unix/Linux本身是多用户的系统,其下的应用软件,都支持用户设置各自的 配置信息。teTEX也支持这种特性,它默认使用用户HOME 目录下的texmf 目 录,该目录在TEX 中称为TEXMFHOME,修改该目录下的文件,与修 改TEXMFMAIN 中的文件有同样的效果。另外,在用户目录中修改配置文件,最大 的好处就是当teTeX 软件升级时,更新的软件包只会修改TEXMFMAIN 里面的内 容,而不会覆盖用户自己定义的配置文件。
teTEX软件包中的dvips 工具,默认配置输出指向的是打印机,为了生成ps 文件,需要对配置文件进行调整。它的配置文件是TEXMFMAIN 目录下 的dvips/config/config.ps,为了修改dvips 的配置,我们先复制一份配置文 件到TEXMFHOME:
$ mkdir -p ~/texmf/dvips/config $ cd ~/texmf/dvips/config $ cp /usr/pkg/share/texmf/dvips/config/config.ps .
然后将config.ps 中的
o |lpr
一行注释掉即可。为了让这次修改生效,还必须执行texhash 命令。
安装完上述软件包就可以编辑和处理英文的TEX文档。例如,将下面这 段TEX文字保存为russell_en.tex:
/documentclass[12pt]{article} /begin{document} /section*{What I Have Lived For} /normalsize /small The Prologue to /textit{Bertrand Russell}'s Autobiography /normalsize /bigskip Three passions, simple but overwhelmingly strong, have governed my life: the longing for love, the search for knowledge, and unbearable pity for the suffering of mankind. These passions, like great winds, have blown me hither and thither, in a wayward course, over a great ocean of anguish, reaching to the very verge of despair. /end{document}
然后执行LATEX命令生成dvi 格式文件:
$ latex russell_en
这个dvi 文件,我们可以使用TEX中的xdvi 工具进行查看:
$ xdvi russell_en.dvi
如果满意,使用dvips 和dvipdf 命令将dvi 文件转换成ps 和pdf 格式的文 档。
$ dvips russell_en.dvi $ dvipdf russell_en.dvi
如果不想使用dvi 格式作为中介,我们还可以直接用pdflatex 命令生成pdf 格式的文件:
$ pdflatex russell_en
使用CJK
TEX中处理中文现在有很多种解决方案,其中最常见的是用于LATEX的CJK 宏包,虽然它并不是按中文用户的习惯设计开发的,但是因为与其他 的LATEX宏包兼容性最好,所以最受欢迎。
CJK 宏包的软件发布包中并不附带TEX格式的字体,这需要用户自己另行安装。 在pkgsrc 中提供了fonts/arphic-ttf,它是文鼎捐助的中文TrueType 字体。 另外还有fonts/ttf2pk 软件包,其中的工具可以将TrueType 字体转换 成TEX可以使用的格式。wip/tex-arphic-ttf 软件包就是使用文鼎的字体 和ttf2pk 中的工具生成可供TEX使用的中文字体。准备好中文字体,就可以 安装wip/cjk-latex 这个宏包。
下面我们就用CJK 宏包来处理中文:
/documentclass[12pt]{article} /usepackage{CJK} /begin{document} /begin{CJK*}{GB}{song} /section*{What I Have Lived For} /section*{我为何而生} /normalsize /small The Prologue to /textit{Bertrand Russell}'s Autobiography /noindent 伯兰特罗素自传序言 /normalsize /bigskip Three passions, simple but overwhelmingly strong, have governed my life: the longing for love, the search for knowledge, and unbearable pity for the suffering of mankind. These passions, like great winds, have blown me hither and thither, in a wayward course, over a great ocean of anguish, reaching to the very verge of despair. /bigskip 对爱情的渴望,对知识的追求,对人类苦难不可遏制的同情,是支配我一生的单 纯而强烈的三种感情。这些感情如阵阵巨风,吹拂在我动荡不定的生涯中,有时 甚至吹过深沉痛苦的海洋,直抵绝望的边缘。 /end{CJK*} /end{document}
这段文字在前面russell_en.tex 的基础上增加了中文译文,文档的导言部分加 入使用CJK 宏包的声明
/usepackage{CJK}
并在使用中文的段落前后增加CJK 环境
/begin{CJK}{GB}{song} ... /end{CJK}
现在将它另存为russell_gb.tex 文件,保存时选择存为GB2312 编码。处 理TEX中文文档生成dvi 和pdf 文件的过程与英文文档没有区别,同样是 用latex 和pdflatex 命令。
汉字的复制与剪切
上一节里面生成的中文pdf 文档,浏览和打印都正常,但是在Adobe Reader 中 无法实现中文段落的复制与剪切。为了使TEX生成的中文pdf 文档支持这一功 能,还需要使用print/dvipdfmx 这一软件包。
dvipdfmx 实现中文字句的复制与剪切,需要用到Adobe 的CMap,因此在安 装dvipdfmx 前要先安装fonts/adobe-cmaps 这一软件包。
安装完dvipdfmx,在使用之前,还需将系统中所使用的中文字体告诉它。前面我 们安装的是文鼎的字体,因此在/texmf/dvipdfm/config/cid-x.map 中添加:
% Arphic GB TrueType fonts gbsn00lp@UGB@ UniGB-UCS2-H :0:gbsn00lp.ttf gkai00mp@UGB@ UniGB-UCS2-H :0:gkai00mp.ttf
然后执行texhash 命令更新。
为了生成支持复制和剪切的中文pdf 文档,就不能使用pdflatex 命令,而必须 分两步操作,第一步生成dvi 文件,再用dvipdfmx 转换成pdf 文件。例如:
$ latex russell_gb $ dvipdfmx russell_gb.dvi
Unicode
文鼎的字体只支持GB2312 字符集,当前已经不能满足中文处理的要求。要使用 较大的字符集,我们可以选择GBK 或者Unicode。由于Unicode 有更广泛的应 用面,下面就介绍在TEX中使用Unicode 的方法。
teTEX软件包中有一个Omega 程序,它是为了更好地支持Unicode 等多字节的 文档用来替代TEX。现在虽然已经可以处理中文,但仍处于开发阶段,并与已有 宏包的兼容性不是很好,所以实用性不高。因此,当前的解决方案还是 在TEX的基础上进行扩充,来支持Unicode 文档的处理。
CJK 宏包内包含了对UTF8 编码的支持,由于没有对应的字体,还需要另外生成。 与使用GB2312 编码的字体一样,需要先准备好字体,再用ttf2pk 里面的工具 进行转换。
这里有一个shell 脚本cvtfont.sh可以辅助生成TEX字体和配置文件:
#!/bin/sh # # Origin By Edward G.J. Lee 2001.11.25 # http://www.study-area.org/tips/latex/pdftex.html # This code is Public Domain. # # Enhanced by intron@intron.ac, 2006.1.9 # Modified for NetBSD by jungle@soforge.com, 2006.1.14 # Italic support added by robert.zhangle@gmail.com, 2006.5.19 # if [ $# -ne 3 ] then cat << EOF Usage: `basename $0` font.ttf <TeX_Internal_Font_Name> <Tex_Font_Name> <TeX_Internal_Font_Name>: Used to name *.enc, *.afm, *.pfb, *.tfm & *.map <Tex_Font_Name>: Used in TeX source: /CJKencfamily{UTF8}{Tex_Font_Name} An example: `basename $0` gbsn00lp.ttf gbsn00lp songpt1 EOF exit 1 fi if ! which ttf2pt1; then echo "Please install pkgsrc fonts/ttf2pt1 before you can run me." exit 1 fi if ! which t1asm; then echo "Please install pkgsrc fonts/t1utils before you can run me." exit 1 fi if ! which extconv; then echo "Please install pkgsrc chinese/CJK before you can run me." exit 1 fi cat <<EOF *************************************************************************** * Please confirm that current working directory is EMPTY except scripts * * and HAS ENOUGH SPACE to contain so many intermediate files. * * If it is not empty, this script may DAMAGE INNOCENT FILES!!! * *************************************************************************** EOF read -p "Go ahead?[n]" a if [ "$a" != "y" ] && [ "$a" != "Y" ]; then exit 0 fi FONTFILENAME="$1" FONTNAME="$2" FONTTEXNAME="$3" TEXMFHOME=`kpsexpand '$TEXMFHOME'` ENCDIR=${TEXMFHOME}/fonts/enc/dvips/local/${FONTNAME} AFMDIR=${TEXMFHOME}/fonts/afm/local/${FONTNAME} TFMDIR=${TEXMFHOME}/fonts/tfm/local/${FONTNAME} PFBDIR=${TEXMFHOME}/fonts/type1/local/${FONTNAME} MAPDIR=${TEXMFHOME}/fonts/map/dvips/local UPDMAPCFG=${TEXMFHOME}/web2c/updmap.cfg if [ ! -f $UPDMAPCFG ] then SYSUPDMAPCFG=`kpsewhich -format 'web2c files' updmap.cfg` cp $SYSUPDMAPCFG $UPDMAPCFG fi CIDXMAP=${TEXMFHOME}/dvipdfm/config/cid-x.map if [ ! -f $CIDXMAP ] then touch $CIDXMAP fi CJKDIR=${TEXMFHOME}/tex/latex/CJK/UTF8 INSTALLDIRMODE="-m 0755" INSTALLMODE="-m 0644" FONTFILEBASENAME=`basename "$FONTFILENAME"` FDNAME=c70${FONTTEXNAME}.fd #MAPFILE=/usr/local/share/ttf2pt1/maps/cugb.map PLANENUM=255 # Initialize ${FONTNAME}.map echo -n "" > ${FONTNAME}.map n=0 echo "Generating subfonts from plane $n to plane $PLANENUM ..." while [ $n -le $PLANENUM ] do m=`printf %02x $n` echo -n "[$n]" SUBFONTNAME=${FONTNAME}${m} # Generate *.t1a *.afm *.enc ttf2pt1 -GAE -pft -OHUBs -W0 -l plane+pid=3,eid=1,0x$m / "$FONTFILENAME" ${SUBFONTNAME} # avoid dvips(k)(before v5.86) t1part module bug. perl -pi -e 's/_/Z/g' ${SUBFONTNAME}.t1a ${SUBFONTNAME}.afm # Generate *.pfb t1asm -b ${SUBFONTNAME}.t1a > ${SUBFONTNAME}.pfb 2>/dev/null # Generate *.tfm afm2tfm ${FONTNAME}$m.afm ${FONTNAME}$m.tfm >/dev/null afm2tfm ${FONTNAME}$m.afm -s .167 ${FONTNAME}sl$m.tfm >/dev/null # Generate ${FONTNAME}.map AFMNAME=`grep -m 1 -i fontname ${SUBFONTNAME}.afm | cut -d ' ' -f 2` echo "${FONTNAME}$m ${AFMNAME} <${FONTNAME}$m.pfb" >> ${FONTNAME}.map echo "${FONTNAME}sl$m ${AFMNAME} /" .167 SlantFont /" <${FONTNAME}$m.pfb" / >> ${FONTNAME}.map n=`expr $n + 1` done echo cat > ${FDNAME} << EOF % This file is automatically generated by `basename $0` //def//fileversion{0.0.1} //def//filedate{`date +%Y/%m/%d`} //ProvidesFile{${FDNAME}}[//filedate//space//fileversion] //DeclareFontFamily{C70}{${FONTTEXNAME}}{//hyphenchar //font//m@ne} //DeclareFontShape{C70}{${FONTTEXNAME}}{m}{n}{<-> CJK * ${FONTNAME}}{} //DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{n}{<-> CJKb * ${FONTNAME}}{//CJKbold} //DeclareFontShape{C70}{${FONTTEXNAME}}{m}{it}{<-> CJK * ${FONTNAME}sl}{} //DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{it}{<-> CJKb * ${FONTNAME}sl}{//CJKbold} //DeclareFontShape{C70}{${FONTTEXNAME}}{m}{sl}{<-> CJK * ${FONTNAME}sl}{} //DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{sl}{<-> CJKb * ${FONTNAME}sl}{//CJKbold} //endinput EOF #exit 0; echo echo "Installing ..." install -d $INSTALLDIRMODE $ENCDIR $AFMDIR $TFMDIR $PFBDIR $MAPDIR $CJKDIR n=0 while [ $n -le $PLANENUM ] do m=`printf %02x $n` echo -n "[$n]" install $INSTALLMODE ${FONTNAME}${m}.enc $ENCDIR install $INSTALLMODE ${FONTNAME}${m}.afm $AFMDIR install $INSTALLMODE ${FONTNAME}${m}.tfm $TFMDIR install $INSTALLMODE ${FONTNAME}sl${m}.tfm $TFMDIR install $INSTALLMODE ${FONTNAME}${m}.pfb $PFBDIR n=`expr $n + 1` done echo install $INSTALLMODE ${FONTNAME}.map $MAPDIR install $INSTALLMODE $FDNAME $CJKDIR echo >> $UPDMAPCFG echo "Map ${FONTNAME}.map" >> $UPDMAPCFG # update cid-x.map echo "${FONTNAME}@Unicode@ unicode :0:${FONTFILENAME}" >> $CIDXMAP echo "${FONTNAME}sl@Unicode@ unicode :0:${FONTFILENAME}" >> $CIDXMAP mktexlsr #updmap-sys updmap read -p "Do you want remove all intermediate files?[n]" a if [ "$a" = "y" ] || [ "$a" = "Y" ]; then n=0 while [ $n -le $PLANENUM ] do m=`printf %02x $n` echo -n "[$n]" rm -f ${FONTNAME}${m}.enc ${FONTNAME}${m}.afm ${FONTNAME}${m}.t1a / ${FONTNAME}${m}.pfb ${FONTNAME}sl${m}.tfm ${FONTNAME}${m}.tfm n=`expr $n + 1` done echo rm -fv $FDNAME ${FONTNAME}.map fi echo echo "OK, all done. :-)" echo
这个脚本将TrueType 生成Type1 字体,过程中使用 了t1asm 和ttf2pt1 工具,因此使用前要先安装fonts/t1utils 和fonts/ttf2pt1 软 件包。
下面示例用的是Solaris 10 里面的方正中文字体。TEX 要求TrueType字体放 在fonts/truetype 目录下,为了与其他字体区分开来,这里再建一个local 子 目录,然后放入将要处理的几款字体,包 括fangsongti.ttf、heiti.ttf、kaiti.ttf 和songti.ttf。
接着,就用上面的脚本处理这些字体:
$ ./cvtfont.sh fangsongti.ttf fzfs fzfs $ ./cvtfont.sh heiti.ttf fzhei fzhei $ ./cvtfont.sh kaiti.ttf fzkai fzkai $ ./cvtfont.sh songti.ttf fzsong fzsong
文档中使用UTF8 字体的时候,需要将文件中的
/begin{CJK}{GB}{song}
替换为
/begin{CJK}{UTF8}{fzsong}
用TEX命令处理该文档时,文件本身必须是UTF8 编码的。现将前面示例 russell_gb.tex 另存为russell_utf.tex,保存时编码选成UTF8。TEX 命令的使用方法与处理GB2312 编码的文档相同。
中文bookmarks
pdf 格式的文档有一个特性-- bookmarks,让用户可以打开一个树状的索引浏 览文章的各个章节,这在阅读较大的文档时非常方便。TEX中可以使 用hyperref 宏包实现这一功能。
pdf 的bookmarks 对文字的编码要求比较特殊,它可以使用两种编码:ISO Latin 1 或Unicode UTF16 Big Endian。TEX处理像中文这种多字节语言,即 使文档采用UTF8 编码保存,仍然无法得到正确的bookmarks,这需要在文档中 使用特殊的命令。
下面是常用的hyperref 宏包的调用方法:
/usepackage[dvipdfm,CJKbookmarks,bookmarks=true,% bookmarksnumbered=true]{hyperref}
对于GB2312 编码的文件,我们可以在其后加上一行特殊指令:
/AtBeginDvi{/special{pdf:tounicode GBpc-EUC-UCS2}}
而UTF8 编码的文件,则使用:
/AtBeginDvi{/special{pdf:tounicode UTF8-UCS2}}
其中UTF8-UCS2 的CMap,需要到 这里下载一个文件包,然后将UTF8-UCS2 文件复制到TEXMFHOME/dvipdfm/CMap 目录下。
Emacs 下的TEX编辑环境
由于TEX文档是纯文本文件,我们可以使用任何一款自己熟悉的编辑器进行编 写。编辑完后,再转到命令行下,调用相应的TEX命令进行处理。虽然这种经 典的操作步骤也可以完成日常工作,但现在有很多对TEX支持良好的编辑器, 可以大幅提高工作效率。在Unix/Linux 的世界,Emacs 是一个强大的编辑器, 它有很多的模式对TEX提供支持。这一节就Emacs 和AUCTeX 模式下编辑和处 理TEX文档进行简单的介绍。
安装
Emacs 最新的稳定版本是21.4,但它不支持Unicode,如果要编辑UTF8 编码 的文件,还需要安装mule-ucs 包进行转换。Emacs 和mule-ucs 软件包 在pkgsrc 中的位置是editors/emacs 和editors/mule-ucs。Emacs 的当前开 发版本22.0.50 已经内含了Unicode 的支持,而且稳定性也不错,建议使用。 这个版本可以使用cvs 从GNU savannah 获取:
$ cvs -d :pserver:anonymous@cvs.savannah.gnu.org:/cvsroot/emacs co emacs
编译安装的步骤为:
$ ./configure $ make bootstrap # make install
AUCTeX 可以从 这里下载,然后使用下面命令进行编译安装:
$ ./configure $ make # make install
设置
为了在Emacs 运行时加载AUCTeX,需要在HOME 目录的.emacs 配置文件中加 入下面语句:
(load "auctex.el" nil t t)
如果需要preview 功能,可以加上
(load "preview-latex.el" nil t t)
AUCTeX 还可以和RefTeX 模式配合使用
(autoload 'reftex-mode "reftex" "RefTeX Minor Mode" t) (autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil) (autoload 'reftex-citation "reftex-cite" "Make citation" nil) (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t) (add-hook 'LaTeX-mode-hook 'turn-on-reftex); (add-hook 'latex-mode-hook 'turn-on-reftex);
其中LaTeX-mode 指的是AUCTeX 提供的模式,latex 是Emacs 内含的模式。
我们还可以给TEX模式加入Emacs 里面常用的自动换行、拼写检查、outline 等常用功能:
(add-hook 'LaTeX-mode-hook (function (lambda () (auto-fill-mode) (outline-minor-mode) (flyspell-mode)))) (add-hook 'latex-mode-hook (function (lambda () (auto-fill-mode) (outline-minor-mode) (flyspell-mode))))
如果要让AUCTeX 正确处理多个文件组成的文档,还需加入
(setq TeX-auto-save t) (setq TeX-parse-self t) (setq-default TeX-master nil)
CJK宏包也有两个工具配合AUCTeX使用,它们位于cjk发布包的utils/lisp目 录下:cjkspace.el和emacs/cjk-enc.el。将它们复制到Emacs搜索加载的路 径,然后在.emacs中加入
(load-library "cjk-enc") (autoload 'CJK-insert-space "cjkspace" "Insert tildes appropriately in CJK document." t) (defun cjk-LaTeX-mode-hook () "CJK key definitions for LaTeX mode." (define-key LaTeX-mode-map " " 'CJK-insert-space)) (add-hook 'LaTeX-mode-hook 'cjk-LaTeX-mode-hook)
在AUCTeX 模式下编辑一个TEX文档,不再需要切换到命令行下,可以 用Emacs 的快捷键调用TEX命令。
-
Ctrl+c Ctrl+c 这是使用最频繁的快捷键。首次键入时,它通 常调用latex 命令处理当前buffer 中的文件。再次键入时,它默认会调 用xdvi 程序查看上一命令生成的.dvi 文件。如果不想使用AUCTeX 建议 使用的命令,可以按下TAB 键浏览和选择所需的命令。
对于AUCTeX 没有提供的命令,我们自己可以进行扩充。比如,加入dvipdfmx 命令,只需在.emacs 中加入:
(require 'tex) (add-to-list 'TeX-command-list (list "dvipdfmx" "dvipdfmx %s.dvi" 'TeX-run-command nil t))
-
Ctrl+c ` 执行LATEX命令如果遇到了错误,用此快捷键可 以定位错误信息。
-
Ctrl+c Ctrl+r 如果想只查看文件中的某一部分内容的输出 效果,比如一个数学公式,可以先用mark 将其设置到一个区域内,然后此 快捷键,可以像理整个文档一样处理该区域。对于大型文档,这种方法可以 节约不少时间。
-
Ctrl+c Ctrl+t Ctrl+p 如果想直接生成pdf 文件而跳 过dvi 文件这一步骤,可以用它在dvi 和pdf 之间切换,也就是选择调 用latex 或pdflatex 命令。
除了能很方便地调用TEX命令,AUCTeX 还提供了键入TEX文档中宏和环境 的快捷方法。
- Ctrl+c Ctrl+e 输入环境,像quote、verbatim,甚 至documentclass 和CJK 也可以用它来输入。
- Ctrl+c Ctrl+s 输入段落的章节。
- Ctrl+c Enter 输入宏,比如usepackage、ref 等等。
- Ctrl+c Ctrl+f 插入特殊的字体,插入黑体为Ctrl+b,斜体 为Ctrl+i 等等。
- Ctrl+c Ctrl+j 插入itemize 等环境的下一个item。
如果这些快捷键记不住,通过AUCTeX 提供的菜单上也能选择所需的命令。
本文地址:http://www.45fan.com/dnjc/71780.html