使用xelatex生成中文pdf

一直以来编辑LaTeX中文文档都是个麻烦事,因为TeX最初的设计就没有考虑多语言问题,所以后来使用CJK这个外挂包来处理中文字体。但是,由于CJK是个中文外挂,用起来很麻烦,需要自己编译生成中文字体集,而且常常有些问题,比如,中文目录的问题就一直没能解决,总是乱码。最近,由于想把org导出成pdf,于是研究了一下。发觉一个好东西 XeTeX,在LaTeX宏包里,它被称作XeLaTeX。

为什么说是个好东西呢?因为XeTeX就是为了支持多语言而重新设计的新一代TeX系统,这意味着在XeTeX眼里,中文文档和英文文档再没有任何区别,无需额外的外挂包;而且,XeTeX原生支持系统字体,这意味着我们无需再额外编译字体,系统安装了什么字体,我们就能使用什么字体。这两大优点简直就是大家一直以来梦寐以求的功能,所有的CJK环境、pdflatex这些老工具完全都可以抛弃了,以前碰到的让人焦头烂额的字体问题,再也不会困扰我们了。可以说,使用TeX的难度至少降低了50%。

在ubuntu上安装texlive包,就自动包含了XeLaTex工具集。不过如果不再需要pdflatex这些工具,我们也可以单独安装texlive-xetex;额外安装texlive-latex-extra,是因为其中包括常用的xkeyval.sty、wrapfig.sty这些宏包:

$ sudo apt-get install texlive-xetex texlive-latex-extra

这样编写中文文档,不再需要包含类似\begin{CJK*}{UTF8}{song}的环境。

\documentclass[12pt]{article}
\usepackage{fontspec}
\setmainfont{AR PL ShanHeiSun Uni}
\title{石頭記}
\author{曹雪芹}
\date{}

\begin{document}
\maketitle

\begin{center}
滿紙荒唐言\\
一把辛酸淚\\
都雲作者癡\\
誰解其中味\\
\end{center}

\end{document}

然后使用xelatex输出pdf文档:

$ xelatex sample.tex

你可以使用 \setmainfont, \setsansfont\setmonofont 来分别设置衬线字体,无衬线字体和等宽字体。也可以把这些默认配置写入sty文件,放到 texmf 目录下,比如 ~/.texmf-config/zhfontcfg.sty,参考 这里

Update@2011-10-31: Mac OS X下边可以把.sty放入目录 ~/Library/texmf/tex/latex/

% xetex/xelatex 字体设定宏包

\ProvidesPackage{zhfontcfg}
\usepackage{fontspec,xunicode}
\defaultfontfeatures{Mapping=tex-text} %如果没有它,会有一些 tex 特殊字符无法正常使用,比如连字符。

 % 中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt

%将系统字体名映射为逻辑字体名称,主要是为了维护的方便。`fc-list :lang=zh` 确保字体在系统中存在。
\newcommand\fontnamehei{文泉驿正黑}
\newcommand\fontnamesong{文鼎PL新宋}
\newcommand\fontnamekai{AR PL UKai CN}
\newcommand\fontnamemono{Bitstream Vera Sans Mono}
\newcommand\fontnameroman{Bitstream Vera Serif}

%设置文档正文字体为宋体
\setmainfont{\fontnamesong}
\setsansfont[BoldFont=\fontnamekai]{\fontnamekai}
\setmonofont{\fontnamemono}

%楷体
\newfontinstance\KAI {\fontnamekai}
\newcommand{\kai}[ 1]{{\KAI #1}}

%黑体
%\newfontinstance\HEI{\fontnamehei}
%\newcommand{\hei}[ 1]{{\HEI #1}}

%英文
\newfontinstance\ENF{\fontnameroman }
\newcommand{\en}[1 ]{\,{\ENF #1 }\,}
\newcommand{\EN}{\,\ENF\, }

然后更新文件索引:

$ sudo mktexlsr

现在就可以在xelatex中使用zhfontcfg宏包了:

\usepackage{zhfontcfg}

输入中文:

\kai{这样可以输入楷体}
{\KAI 也可以这样输入楷体}

在Mac下安装xecjk

xelatex虽然能够正常使用系统字体,但是无法分别指定中英文字体,这需要借助xecjk宏包实现,也可以安装ctex宏包,但后者会依赖Windows下的字体,具体可以参考 ctex项目

Linux下的texlive-xetex中已经包括了xecjk,但是Mac下从homebrew安装texlive的话,默认是不包括这个宏包的,可以用如下命令安装:

$ sudo tlmgr install xecjk

测试一下是否工作正常:

\documentclass[12pt,a4paper]{article}
\usepackage{xltxtra,fontspec,xunicode}
\usepackage[slantfont,boldfont]{xeCJK} % 允许斜体和粗体

\setCJKmainfont{Kai}   % 设置缺省中文字体
\setCJKmonofont{Hei}   % 设置等宽字体
\setmainfont{Optima}   % 英文衬线字体
\setmonofont{Monaco}   % 英文等宽字体
\setsansfont{Trebuchet MS} % 英文无衬线字体

\begin{document}
\begin{verse}
  Stray birds of summer come to my window to sing and fly away. \\
  And yellow leaves of autumn, which have no songs, \\
  flutter and fall there with a sign.\\
  \hfill \emph{Rabindranath Tagore}
\end{verse}

\begin{verse}
  夏天的飞鸟,飞到我的窗前唱歌,又飞去了。\\
  秋天的黄叶,它们没有什么可唱,只叹息一声,飞落在那里。\\
  \hfill \emph{罗宾德拉纳特·泰戈尔}
\end{verse}
\end{document}