实现中英文混排
除掉成功生成第一个文档,实现中文输出(或者说是中英文混排)恐怕是困扰中国的 TeX 使用者的第二个普遍问题。众所周知,TeX 系统是高教授开发的,当初并没有考虑到亚洲文字的问题。因此早期的 TeX 系统并不能直接支持中文,必须要用其他工具先处理一下(或者是一些宏包之类的)。
但是现在,XeTeX 原生支持 Unicode,并且可以方便地调用系统字体。可以说解决了困扰中国 TeX 使用者多年的大问题。
此外,除去中文支持,中文的版式处理和标点禁则也是不小的挑战。好在由吴凌云和江疆牵头,现在主要由刘海洋和李清(还有我打个酱油)维护的 ctex
宏包 / 文档类一次性解决了这些问题。ctex
宏包和文档类的优势在于,它适用于多种编译方式;在内部处理好了中文和中文版式的支持,隐藏了这些细节;并且,提供了不少中文用户需要的功能接口。
为了和原有的日志对接,这里分别用两种方法来介绍中英文混排。当然,老方法只是为了「兼容性」存在的,推荐使用新方法。
新方法——使用 ctex
文档类
在 TeXworks 编辑框中输入以下内容,保存,使用 XeLaTeX 编译:
\documentclass[UTF8]{ctexart}
\begin{document}
你好,world!
\end{document}
如果没有意外,你将会看到类似下图的输出结果。
相较于之前的例子,这份代码只有细微的差异:
- 文档类从
article
变为ctexart
; - 增加了文档类选项
UTF8
。
新版 ctex
宏包和文档类的默认能够自动检测用户的操作系统,并为之配置合适的字库。对于 Windows 用户、Mac OS X 用户和 Linux 用户,都无需做任何配置,就能使用 ctex
宏包和文档类来排版中文。[2015-05-20 更新]
老方法——直接调用 xeCJK 宏包
在 TeXworks 编辑框中输入以下内容,保存,使用 XeLaTeX 编译:
\documentclass{article}
\usepackage{xeCJK}% 调用 xeCJK 宏包
\setCJKmainfont{SimSun}% 设置 CJK 主字体为 SimSun (宋体)
\begin{document}
你好,world!
\end{document}
如果一切顺利,你将会在屏幕右边的窗口,看见类似下图的输出结果。
如果你的 TeX 系统提示找不到字体,请换用你的操作系统中可用的中文字体。关于如何寻找你的操作系统中可用的中文字体,请参考本章最后一小节。
除了 “document” 环境中同时出现了中文和英文,和最原始的 Hello, world! 不同点在于,导言区中多出了两条控制序列。他们的作用我已经用注释标出了。
所谓的宏包,就是一系列控制序列的合集。这些控制序列太常用,以至于人们会觉得每次将他们写在导言区太过繁琐,于是将他们打包放在同一个文件中,成为所谓的宏包(台湾方面称之为“巨集套件”)。\usepackage{·}
可以用来调用宏包。
\setCJKmainfont{·}
是定义在 “xeCJK” 宏包中的控制序列,它可以用来设置 CJK 主字体。
请注意,TeX 系统对宏包名称和控制序列的大小写是敏感的
查看当前操作系统中的字体
Mac OS X 用户
请参照 这篇博客 中的方法,使用系统自带的字体册程序来查看系统字体。
非 Mac OS X 用户
按照如下步骤打开系统命令行(*nix 系统请打开终端):
- 按下
+ R
; - 键入
cmd
, 回车。
在系统命令行中输入如下命令:
fc-list :lang=zh-cn > C:\font_zh-cn.txt
(相信使用 *nix 的你,一定知道如何修改上述命令达到你想要的效果)
打开 C 盘根目录下的 C:\font_zh-cn.txt
纯文本文档,里面的内容就是你当前系统可用的全部中文字体,形如:
每一个小黑框之间的内容,就对应着一个可用的字体。这些小黑框实际上是换行符,但是由于 Windows 系统的原因,他们没有被正常显示。如果看着不爽,你可以尝试用 TeXworks 打开这个文件查看(放心,能够打开的)。以下是我用 gVim 打开的效果:
其中的每一行,都代表着一个可用的字体。其形式如下:
<字体文件路径>: <字体标示名 1>, <字体表示名 2>:Style=<字体类型>
我们可以看到图中的倒数第四行
C:/WINDOWS/fonts/simsun.ttc: 宋体,SimSun:style=Regular
出现了之前文档里调用的字体SimSun
,此处表明该字体有两个表示名:宋体
和SimSun
,我们在\setCJKmainfont{·}
中填入任意一个都有同样的效果。
因此,如果之前的文档无法编译通过,请在你的操作系统字体中,选取一个自己喜欢的,将它的字体表示名填入到\setCJKmainfont{·}
中去。
更多建议: