2. 用 LaTeX 排版文字 #
2.1 语言文字和编码 #
2.1.1 ASCII 编码 #
ASCII 用 7 位表示基本拉丁字母、数字、标点和控制字符。LaTeX 命令使用的反斜线、花括号等都属于这个范围。
2.1.2 扩展编码 #
Latin-1、GBK 等编码扩展了可表示的字符,却不能彼此随意混用。按 GBK 保存的文件被当作 UTF-8 读取时,可能乱码或报错。
了解这些编码有助于处理历史文档。新项目不要为了排中文改用 GBK,也不必直接配置旧的 CJK 工作流。
2.1.3 UTF-8 编码 #
UTF-8 是 Unicode 的一种编码方式,也是现代 LaTeX 的默认输入编码。文件编码、字体包含的字形、语言排版规则是三件不同的事:能读入一个字符,不代表选中的字体能显示它。
本教程的源文件统一保存为 UTF-8,使用 XeLaTeX。fontspec 用于选择 OpenType 字体;ctex 负责进一步配置中文。在 XeLaTeX/LuaLaTeX 下,不要额外加载用于传统输入编码的 inputenc。
2.2 排版中文 #
ctex 同时处理中文字体、中西文间距、标点禁则和标题名称等。可以选择中文文档类:
\documentclass[UTF8,fontset=fandol]{ctexart}
\begin{document}
在 \LaTeX{} 中排版中文。
汉字和 English 单词混排,通常不需要手工添加间距。
汉字之间在源文件中换行,也不会引入多余的西文空格。
\end{document}
如果现有模板要求别的文档类,可以在兼容的前提下加载 ctex 宏包,而不是替换文档类:
\documentclass{article}
\usepackage[UTF8,fontset=fandol]{ctex}
\begin{document}
这是使用 ctex 宏包的中文文档。
\end{document}
两种方案选一种即可。使用 ctexart 时不必再次加载 ctex、xeCJK 或 fontspec。
在 XeLaTeX 下,ctex 借助 xeCJK 处理中文;在 LuaLaTeX 下借助 luatexja。本教程用 XeLaTeX 统一示例环境。fontset=fandol 明确使用发行版字体,避免示例默认依赖某台电脑上的宋体或黑体。
“CTeX 开发小组”“ctex 宏包/文档类”和历史上的 CTeX 发行版不是同一个概念。
2.3 LaTeX 中的字符 #
2.3.1 空格和分段 #
在西文中,多个连续空格一般合并为一个,源代码中的单次换行通常相当于空格。空一行或使用 \par 才表示新段落。
Several spaces become one.
This is still the same paragraph.
This is a new paragraph.
中文的连续汉字之间不按西文单词空格处理。不要用连续空格缩进、对齐表格或调节页面布局。
2.3.2 注释 #
% 忽略该行余下内容,也会忽略行尾换行产生的空格:
正文内容。 % 这是一条作者笔记
Some%
thing
后两行输出为 Something,中间没有空格。定义命令时,行尾的 % 常用来避免意外空白。
2.3.3 特殊字符 #
下列字符有语法含义,不能总是直接当普通文字输入:
# $ % & { } _ ^ ~ \
| 要输出 | 写法 | 要输出 | 写法 |
|---|---|---|---|
# |
\# |
$ |
\$ |
% |
\% |
& |
\& |
{、} |
\{、\} |
_ |
\_ |
^ |
\textasciicircum{} |
~ |
\textasciitilde{} |
\ |
\textbackslash{} |
\^{} 和 \~{} 也能输出相应字符;它们本来是重音命令,空参数使其只打印重音。表示普通 ASCII 字符时,上表的 \textascii... 写法意图更明确。
\\ 是换行命令,不是打印反斜线的方法。全角括号、全角逗号不能替代命令语法需要的半角字符。
2.3.4 连字 #
一些西文字体会把 fi、fl、ff 等组合排成连字。这是字体与排版的正常行为,不是丢字。特定位置不想连写时,可以用空分组隔开:
difficult \qquad dif{}ficult
连字效果受字体和引擎设置影响,应查看 PDF,而不是仅根据源码判断。
2.3.5 标点符号 #
中文标点直接用中文输入法输入。英文左右引号可以用两个反引号和两个单引号表示:
``Please press the `x' key.''
中文可以直接输入“外层引号”和‘内层引号’。
西文中的三种横线作用不同:
| 源码 | 用途 |
|---|---|
well-known |
一个连字符,连接复合词。 |
pages 13--67 |
短破折号,表示范围。 |
yes---or no? |
长破折号,分隔语句。 |
西文省略号用 \ldots 或 \dots,不要把三个句点当作排版好的省略号。中文省略号通常直接输入“……”。中文波浪号可直接输入“~”。
2.3.6 拉丁文扩展与重音 #
XeLaTeX 下,只要字体支持,就可以直接输入 café、naïve、Möbius。对应的命令写法仍有用:
caf\'e \qquad na\"{\i}ve \qquad M\"obius
\`o \quad \^o \quad \~o \quad \c{c} \quad \ss{}
\i 是不带点的 i,便于添加重音。文本重音与数学重音不同:正文用 \"o,数学变量上的帽子用 \hat{x}。
2.3.7 其它符号 #
常见文本符号包括 \copyright、\textregistered、\texttrademark、\S、\P、\dag 和 \ddag。连续使用字母命令时,注意用 {} 保留后面的词间空格。
没有找到某个符号时,先查明它属于文本符号还是数学符号,以及是否需要额外宏包;不要只复制一个命令名而遗漏依赖。
2.3.8 LaTeX 标志 #
\TeX、\LaTeX、\LaTeXe 分别输出 TeX、LaTeX 和 LaTeX 2ε 的标志。更多标志可以使用 hologo 宏包输出:
% 导言区
\usepackage{hologo}
% 正文
\TeX{}、\LaTeX{}、\LaTeXe{};
\hologo{XeLaTeX}、\hologo{LuaLaTeX}。
标志名区分大小写。要输入其他工具的标志,先查 hologo 手册中的名称。
2.4 断行和断页 #
LaTeX 默认根据整段文字决定断行,再根据版面决定分页。只有确实需要时才手工干预。
2.4.1 单词间距 #
~ 是不会在该处断行的空格,适合把名称和编号连在一起:
Donald~E.~Knuth
图~\ref{fig:demo}
第二行依赖文档中已经定义的 fig:demo 标签。普通词间空格可随两端对齐伸缩,不需要手工统一宽度。
2.4.2 手动断行和断页 #
| 命令 | 作用 |
|---|---|
\\、\newline |
在当前段落中换行,不产生新段落。 |
\\[6pt] |
换行并增加垂直间距。 |
\\* |
换行,并禁止紧接着在此分页。 |
\newpage |
单栏时另起一页;双栏时另起一栏。 |
\clearpage |
先排出等待中的浮动体,再另起一页。 |
正文分段仍然应该空一行。不要在空白处用 \\“多空一行”,这可能产生 There's no line here to end 错误。
\linebreak[n]、\nolinebreak[n]、\pagebreak[n]、\nopagebreak[n] 用于建议或阻止断行、断页,n 从 0 到 4,强度递增。它们与 \newline、\newpage 的填充行为不同,强行使用可能造成过大的间距。
2.4.3 断词 #
英文长单词通常可按语言的断词规则自动拆分。局部指定可断位置可用 \-:
super\-cali\-fragilistic\-expialidocious
只有在那个位置实际断行时才出现连字符。单词没有断开不一定是错误;过长的 URL、不可拆分的盒子和错误的语言配置,也会导致行溢出。