XeTeX实战

2007年12月5日星期三

乱蓬蓬的图标?这Show的是XeTeX中调用Zapfino字体中的9个Variant(变体字型)。XeTeX是一个TeX引擎,最初在Mac系统下使用。它的一大优点就是良好的Unicode支持和简易的字体调用。正如前面的日志写到,LaTeX中安装字体相当麻烦,而XeTeX的出现让Mac用户首先尝到了直接使用系统字体的甜头。后来XeTeX被Port到各个主流平台上,鉴于我一直在Windows下面使用MiKTeX系统,在MiKTeX 2.7 Beta 5 开始集成XeTeX后,我考虑再三升级了自己的MiKTeX。

字体调用方式的改变,使得原有的代码需要进行相应的调整,好在原来安装字体用的是fontinst,这样字体是用宏包方式载入,没有冗余的字体选择代码夹杂在正文中,要修改起来并不算难。XeTeX有一个经典的宏包fontspec来进一步把字体的调用表面化,查阅这个宏包的说明文档后就基本上知道如何使用字体了,为了达到预期的效果,有时要加上几处修正:

\XeTeXinputencoding "bytes"

\XeTeXdefaultencoding "bytes"
%这两条用于修正汉字的编码长度
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt
%这两条用于修正汉字断行问题

\defaultfontfeatures{Mapping=tex-text}
%启用tex风格字符,主要是---和--的组合字符

\usepackage[cm-default]{fontspec}
%默认使用Computer Modern系字体,后面可以使用

\setmainfont[Numbers=OldStyle]{Minion Pro}
%来调整正文英文字体,但有了cm-default后,页码会使用CM字体而不是难看的LM字体。

\usepackage{xunicode}% provides unicode character macros
\usepackage{xltxtra} % provides some fixes/extras

hyperref宏包选项中加上xetex,去掉pdftex或者dvipdfm,否则pdf书签乱码。

西方文字方面,如果要在tex文档中直接输入法语重音字,需要把文档按UTF-8编码保存。此时,惯用的WinEdt不能很好支持UTF-8编码,只有考虑换编辑器,这时我选择了轻型、可定制的SciTE,坦率地说,SciTE不好上手,像Firefox一样,刚刚拿到手时你根本不知道它能干什么,同样需要慢慢地配置和扩充才能发挥它最大、最贴心的作用。一边配置SciTE一边实践着XeTeX,西文方面已经可以发挥出OTF字体的优势了,要集成自己很喜欢的Adobe Minion Pro再不需要用fontinst去创建无穷的Type 1字体,而这个Minion Pro比原来Type 1 Minion还要更新、更全。不过在字体上,XeTeX也不是没有缺点,抛开和某些宏包不能很好结合外,它对Computer Modern字体的调用也跟LaTeX的习惯有些不同,比如用\up指令放到上标的文字。

中文方面的工作要更复杂一些(不过在中文系统下文件无需用UTF-8编码):前面提到断行、编码长度的问题都有被XeTeX的作者考虑到,但具体到中文的排版,还是要靠CTeX论坛的高手们,为此,在那里出现了很多具体的解决方案:jjgod的xcp,yindian的zhspacing,孙老师的xCJK和xCCT。刚开始时是因为孙老师的TeXfriend中有给WinEdt添加一个XeTeX编译按钮,装了TeXfriend,自然在其中发现了采用xCJK宏包的例子,但当我尝试了一下后发现,XeTeX的中文编译速度好慢啊!30几页的文档要高cpu高内存地编170秒。生成的文件质量当然是令人很满意,但这个速度够呛。询问了好几次,今天听孙老师说是因为xCJK宏包的处理方式本来就慢,对应到XeTeX来就更慢(XeTeX编译普通英文文档也比LaTeX慢,估计是调用字体的方法不同),用xCCT会快一点。折腾了半天改用xCCT宏包,果然快多了,17秒(10倍!),相应地又要做一些修改,不过有了XeTeX,中文方面真的省事多了。在我看来,PDF中只有集成TTF中文字体才是王道,因为Type 1字体对中文来说来复杂,渲染速度也很低。(更新:
孙老师优化了xCJK,速度现在跟xCCT一样了)

最近还解决了一个西欧编码的问题:学校机器是法语系统,里面默认用西欧编码保存tex文件,拿到家里来就是乱码,编译倒是没问题,但编辑起来太累了(看不清混杂着乱码的单词)。本以为是WinEdt非Unicode程序造成的,但用SciTE打开问题依旧,看来还是系统内码问题,只有彻底走上UTF-8路线才能一劳永逸,为此,tex文档要相应地改变一些:

  • inputenc宏包的选项由latin1改成utf8x-- \usepackage[utf8x]{inputenc}
  • fontenc选项依然是T1字体-- \usepackage[T1]{fontenc}
  • 为了保证hyperref生成的pdf信息没有乱码,在导言区hyperref宏包出现之前需要加上一条神奇的\PrerenderUnicode{é},看起来好像只是指定了é字体,实际上所有法语重音字符全部解决了。这个也真是巧合,是在PDF作者、关键字出现的一堆乱码中找到的“Please insert PrerenderUnicode...in preamble”……
  • hyperref中加上unicode的选项。
  • 文件保存成UTF-8编码,为保证在SciTE中正常显示打开,不要添加UTF-8签名(BOM)——这一条折腾我好久啊。即使是这样,由于没有UTF-8签名,在SciTE中依然需要手动切换显示编码,不过比起只有看着乱码进行编辑,这只要看一眼就也还算省事了。
这回源文件就更加安全了,因为不需要总是切换保存的编码,而且在家里也可以放心地编辑。从WinEdt转到SciTE,失去了一些功能,但得到的是UTF-8带来的更多保证(Jabref也支持把bib文件保存成UTF-8)。