LaTeX 随笔漫谈(1)- LaTeX 下的中文支持总结

LaTeX 中文环境排版方式总结

Posted by LiuTong on July 11, 2018

LaTeX下的中文环境排版方式有几种,目前这些方式有一些已经比较老了,也有一些比较新的方法,在此将这些方法总结一下。

CJK宏包(提供底层中文支持)

CJK 的全称为 Chinese、Japanese、Korean,就是“中日韩”的意思。

CJK 编码是德国人 Werner Lemberg 制作的,1997年发行,至今已有21年的历史,可以说是 LaTeX 下提供中文支持的祖师爷了,它的出现,方便了中国人使用 LaTeX,也大大推动了 LaTeX 在中国的推广,是很伟大的。以下是1997年原作者 Werner Lemberg 为 CJK 写的说明文档。

The CJK package for LATEX 2e – Multilingual support beyond babel

可以使用两个宏包:CJK 或 CJKutf8,无论使用哪个宏包,要确保源文件是以 UTF-8 编码保存的,不能用 GBK 编码保存。

\usepackage{CJKutf8} % or \usepackage{CJK}
\begin{document}
\begin{CJK}{UTF8}{<font>}
 ...
\end{CJK}
\end{document}

其中 font 为简体中文字体,CJK 自带的 UTF-8 简体字体有 gbsn(宋体)和 gkai(楷体)。以下代码是一个简单的例子:

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{UTF8}{gbsn}
CJK是处理中文最为无奈的选择。此法现在已经过时,不提倡大家使用。
\end{CJK}
\end{document}

上述代码可以使用传统的 LaTeX 引擎编译,也可以使用 pdfLaTeX 引擎编译,但不能使用 XeLaTeX 引擎编译。

xeCJK宏包(提供底层中文支持)

建议直接去阅读 xeCJK 宏包的用户手册,里面事无巨细方方面面列的相当清楚。

简介

xeCJK 目前是 XeTeX 引擎下处理中文最好的方式,xeCJK 使用了 XeTeX 的一些最新特性,并且依赖 LaTeX3 项目的宏包套件 l3kernel 和 l3packages,必须用支持 XeTeX 的引擎进行编译。

使用 xeCJK 宏包的另一个好处在于它在内部调用 fontspec 宏包,这也是一个必须依赖 XeTeX 引擎的宏包。这使得用户可以在使用中调用本机操作系统上的任何中文字体,非常方便。

xeCJK 的原始作者是孙文昌,最早 2007 年在 CTEX 社区论坛上发布,xeCJK for XeTeX ,2009 年 5 月起宏包被收入 ctex-kit 项目进行维护,目前 主要维护者是刘海洋和李清。至今已有11年的历史。

用法

与其他 LaTeX 宏包一样,在导言区只需要加上宏包声明

\usepackage{xeCJK}

在引入 xeCJK 宏包之后,只要设置 CJK 文字的字体,就可以在文档中使用中日韩文字了。

可以在各种文档类中使用 xeCJK 宏包,最简单的示例是:

\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{SimSun} % Windows 下自带中易字库中的宋体

\begin{document}
中文 \LaTeX 示例。
\end{document}

上述示例设置了中文字体 SimSun(宋体)。运行此示例要求系统安装了设置的字体,源文件 用 UTF-8 编码保存,使用 XeLaTeX 编译。

评价

在知乎上已经有一些对 xeCJK 比较中肯的评价了,最近写模板编译中文开始转向使用 xeCJK,发现确实很好用了。

知乎 – 如何评价 xeCJK?

附上一篇孙文昌老师本人写的博客,其介绍了 XeLaTeX + xeCJK 中文支持实现方式,里面主要介绍了底层方法(直接使用 xeCJK 宏包)和高层方法(使用 CTEX 宏集调用底层 xeCJK)的区别。

XELATEX+XECJK中文支持示例-孙文昌

CTEX 宏集(提供上层中文支持)

简介

注意,CTEX 宏集与中文 CTEX 套装完全不是一个东西,中文 CTEX 套装在今天已经不适合使用了。

之所以说 CTEX 宏集为上层中文支持,是因为 CTEX 在处理中文的时候会根据编译引擎的不同调用不同的底层中文支持方式,它并非原生的中文支持方式。

以上 CJK 宏包只提供了两种中文字体,远远不能满足需要,所以逐渐地,使用 CJK 宏包处理中文成为了一种过时的做法,由于中文 CTEX 团队的努力,采用 ctex 宏包或者 ctex 系列的文档类处理中文已经成为处理中文文档的主流。

其实,直接去阅读 ctex 的说明文档是了解 ctex 的最明智的选择,ctex 的发展非一朝一夕完成,其中凝聚着多位大牛的心血,ctex 的源头可追溯至 2003 年之前,至今已有至少 15 年的历史。

以上 ctex 宏包及其系列文档类统称为 CTEX 宏集,其中,CTEX 宏集最主要包含如下内容:

类别 文件 说明
文档类 ctexart.cls 标准文档类 article 的汉化版本,一般适用于短篇幅的文章
ctexrep.cls 标准文档类 report 的汉化版本,一般适用于中篇幅的报告
ctexbook.cls 标准文档类 book 的汉化版本,一般适用于长篇幅的书籍
ctexbeamer.cls 文档类 beamer 的汉化版本,适用于幻灯片演示
宏包 ctex.sty 提供全部功能,但默认不开启章节标题设置功能

使用 ctex 文档类和 ctex 宏包

ctex 小组给出的建议是:如果用户需要在标准文档类的基础上添加中文支持和中文版式支持,我们建议用户使用 CTEX 宏集提供的四个中文文档类。

在使用这些文档类的时候,需要将涉及到的所有源文件使用 UTF-8 编码保存,其示例为:

\documentclass[UTF8]{ctexart}
\begin{document}
中文文档类测试。你需要将所有源文件保存为UTF-8 编码。

你可以使用XeLaTeX、LuaLaTeX 或upLaTeX 编译,也可以使用(pdf)LaTeX 编译。
推荐使用XeLaTeX 或LuaLaTeX 编译。
\end{document}

用户在使用非标准文档类时,如果需要添加中文支持或中文版式支持,则可以使用 ctex 宏包。

有些文档类是建立在 LaTeX 标准文档类之上开发的。这时,给 ctex 宏包加上 heading 选 项,可以将章节标题设置为中文风格。

\documentclass{ltxdoc}
\usepackage[UTF8, heading = true]{ctex}
\begin{document}
\section{简介}
章节标题中文化的\LaTeX{} 手册。
\end{document}

编译方式

CTEX宏集会根据用户使用的编译方式,在底层选择不同的中文支持方式,如下所示:

  • (pdf)LaTeX: CJK
  • XeLaTeX: xeCJK
  • LuaLaTeX: LuaTeX-ja
  • upLaTeX: 原生

不同的编译方式和中文支持方式会在一定程度上影响 CTEX 宏集的行为,比如宏包对编码的处理。在用户使用 XeLaTeX、LuaLaTeX 及 upLaTeX 编译时,CTEX 宏集使用(且仅能使用)UTF-8 编码;而因为历史原因,在用户使用 latex 及 pdfLaTeX 编译时,宏包默认使用 GBK 编码。用户需要保证 编译方式源文件编码宏包 编码选项三者一致。

中文编码

指明编写文档时使用的编码格式。CTEX 宏集无法检测用户编写文档时使用的编码格式,因此需要用户自行指定编码。我们建议用户总是使用 UTF-8 编码,并显式指定 UTF8 选项,并使用 XeLaTeX、LuaLaTeX 或 upLaTeX 编译。

使用 XeLaTeX、LuaLaTeX 或 upLaTeX 编译时,CTEX 宏集强制使用 UTF-8 编码,此时 GBK 选项无效。使用(pdf)LaTeX 编译时,CTEX 宏集默认启用 GBK 选项;不过,用户也可以显式声 明 UTF8 选项,使 CTEX 宏集工作在 UTF-8 编码下。

中文字库

默认情况下,CTEX 宏集能自动检测用户使用的编译方式和操作系统,选择合适的底层支持和字库,从而简化配置过程。自动配置的情况如下:

引擎 Mac OS X Windows New Windows Old 其他
XƎLATEX xeCJK 华文字库 xeCJK 中易字库 + 微软雅黑 xeCJK 中易字库 xeCJK Fandol 字体
LuaLaTeX LuaTeX-ja 华文字库 LuaTeX-ja 中易字库 + 微软雅黑 LuaTeX-ja 中易字库 LuaTeX-ja Fandol 字库
pdfLaTeX 不可用 CJK + zhmetrics 中易字库+ 微软雅黑 CJK + zhmetrics 中易字库 不可用
LATEX + DVIPDFMx 不可用 CJK + zhmetrics 中易字库+ 微软雅黑 CJK + zhmetrics 中易字库 CJK + zhmetrics Fandol 字库
upLATEX + DVIPDFMx 不可用 zhmetrics-uptex 中易字库+ 微软雅黑 zhmetrics-uptex 中易字库 zhmetrics-uptex Fandol 字库

其中 Windows Old 指 Windows XP 及以前的操作系统,Windows New 指 Windows Vista 及以前的操作系统。

字符集编码

中文 TeX 源文件常常使用两种字符编码格式保存,分别是 UTF-8 和 GBK,这两种编码方式都包含所有的中文字符,但 GBK 是国内的字符集, 其通用性较差,UTF-8 是国际标准字符集,不仅仅包含中文字符,更包含世界上所有国家语言字符,其通用性较强,并且格式稳定。

我个人平时使用的是 SublimeText 或者 vscode 搭建的 LaTeX 编译环境,SublimeText 如此流行的编辑器,其编辑器自带字符编码方式并不包含 GBK 字符集,需要安装扩展插件,对于 TeX 源文件的编码方式,最好使用 UTF-8 编码,并且最好在导言区显示声明 UTF-8 编码方式,这样能够最大程度的保证文档的稳定性。

实际上,字符集编码还是采用国际通用的比较好。说一个个人的问题,SublimeText 在处理 GBK 的中文字符编码时尤为让人头疼,如果稍有不慎将一个 GBK 编码的源文件以 UTF-8 格式打开并保存,那么这个包含中文的源文件就此作废,因为全是乱码并且改不回来了。另外,即使安装了支持 GBK 编码的插件,Sublime 下在按 Ctrl+S 保存以 GBK 格式编码的源文件时,会出现令人心惊肉跳的卡顿掉帧现象,体验非常不好。

综上所述,文档还是采用 UTF-8 格式编码的好,并且作为一个程序员,使用 UTF-8 编码是一个优良程序员的基本素养。所有程序员都应时刻养成使用 UTF-8 编码的好习惯。

总结

俗话说,不管黑猫白猫,能抓老鼠就是好猫。以上各种方法,都能很好的支持中文,具体使用哪种方法,要视具体情况而定。

牛人推荐

最近刚刚加入中文 CTEX 社区,又在知乎上关注了不少国内 LaTeX 界的牛人,在此附上这些牛人的社交地址链接(知乎、个人主页等等)。

马起园 – Github

国内 TeX 界牛人, pTeX-ng 引擎开发者 ,fandol-font 主要开发者。

刘海洋 – 知乎

国内 TeX 界牛人,出版各种 LaTeX 学习书籍,是 xeCJK 宏包的主要维护者。

李清 – 知乎

使用 LaTeX3 语法重构了 xeCJK 宏包,是目前国内 xeCJK 的主要维护者。

黄晨成 – 主页

CTeX 论坛版主/管理员,ChinaTeX 论坛版主,LaTeX 问答站管理员,CTeX-kit 的第九位开发者,xprintlen、sduthesis、mcmthesis 宏包的作者,fandol-font 的开发者之一。

林莲枝 Lim Lian Tze – 主页

马来西亚 TeX 用户组织的首席写手。

ctex-kit 开发小组 – Github

都是牛人,还有很多牛人,就不一一介绍了。