ZNHOO Whatever you are, be a good one!

LaTeX

  1. 基本概念
  2. 排版
  3. 中文支持
    1. Fontspec
    2. CJK
    3. xeCJK
    4. CTeX package with article class
    5. CTeX class
  4. AUCTex

基本概念

  1. TeX 系统分为 engine 和 format 两大部分。(input) format 是文档的书写格式,engine 是编译文档的程序。

    最原始的 format 是 plain TeX,升级后的是 LaTeX (LaTeX2e),更新的是 ConTeXt. Format 实际是一个特殊的 macro package, 扩展 plain TeX, 只不过这个宏包更高级灵活。在 LaTeX 基础上开发出的扩展 包也可“视作 ”一种 format 就数不更数了,如 CTeX format 等。只不过这类 format 太多太杂不成系统,不算入 TeX 核心组件。通常我们只称其为“宏包 macro package/set”。

    最原始的 egine 是 TeX, 后面发展出 pdfTeX, XeTeX, LuaTeX 各有特色。注意:没有 LaTeX engine 和 ConTeXt engine 的说法,也没有 pdfLaTeX engine.

  2. 发行版里的各种命令最少暗含一种 engine 和 format。特别的,大部分命令都包含 pdfTeX engine (如 xelatex), 支持输出 PDF 格式。

    如果是 plain TeX format, 命令是 *tex; 如果是 LaTeX format, 命令则是 *latex. 最原始的 tex 命令表示用 TeX 引擎编译 plain TeX format。pdftex 命令表示用 pdfTeX 引擎编译 plain TeX format. pdflatex 暗含用 pdfTeX 引擎编译 LaTeX format.

  3. ConTeXt 比较特殊,同时支持多种 engine 和 format, 需要在 source file 里分别指定,但对应的命令是 context.

排版

  1. TeX 源文件包含两个部分:文稿内容和排版控制命令。文稿内容就是我们要写的内容,文字、图片、表格、公式及整个文章的章节段落结构等;排版命令如同 CSS 控制 HTML 显示一样,控制样式、字体、分页等呈现的。
  2. 排版控制命令以 \ 开始:

    \命令名[可省略的参数]{不可省略的参数}
    

    Note that arguments are enclosed in braces, options (or optional arguments) are enclosed in brackets.

  3. 排版控制命令 \begin{document}\end{document} 表示文稿内容 body 的起始与终止。在 \documentclass{}\begin{document} 之间的区域称为“导言区 preamble”可在此区域内放置一些可影响文档全局样式的控制命令。

    Anything between \begin{name} and \end{name} is called the content of the environment. name would be the name of the environment like document. The body of the article is the content of the document environment.

  4. Blanks
    1. Two or more spaces in text are the same as one.
    2. A tab or end-of-line character is the same as a space.
    3. A blank line indicates the end of a paragraph.
    4. Two or more blank lines are the same as one.
    5. Spaces at the beginning of a line are ignored.
    6. Add thin space (\,) or no space within strings of initials and be consistent.
  5. There are three lengths.
    1. hypen: type this with a single dash like: third-world country
    2. en dash: two dashed used for number ranges (and other things): office hours are 3--4.
    3. em dash: three dashes mark an abrupt change in thought or to add emphasis: an aside ---like this one--- can be distracting.
  6. 当文档非常复杂时,需要多次编译才能生成最终效果,特别是文档内有引用时。

中文支持

  1. LaTeX format写英文文档;CTeX format 写中文文档。
  2. CTeX xeCJK/CJK fontspec

    CTeX 依赖 xeCJK, CJK and/or CCT; xeCJK 又依赖 fontspec. 特别注意,CJK 独立于 fontspec. CTeX 会根据用户选则的 engine 实时调用xeCJK, CJK, CCT 三者之一。特别注意,CJK, xeCJK 和 CCT 三者不可同时使用,每个文档只可选其一。

    拿 CTeX 文档为例,CTeX format 基于 LaTeX format, 所以要求 *latex 命令。如果使用了 CJK 包(如 \CJKfamily),则要 TeX engine 或 pdfTeX engine, 所以选 latexpdflatex 命令。如果使用了 xeCJK/fontspec 包(如 \setCJKmainfont, \setmainfont),则要 XeTeX engine, 所以选 xelatex 命令。 xelatex 暗含 pdfTeX engine,默认输出 PDF, 加 -no-pdf 参数则输出 DVI.

  3. CTeX 管中文格式;xeCJK 管中西文字体自动切换、中文标点压缩. fontspec 管全局字体选择。除 老旧的 CJK 外,xeCJK 是专门为支持 XeTeX 而适配。四者中的任何一种都可以直接处理中文排版,但是越底层,越困难,用户需要了解的命令就越多,关键是用户自己设置的格式还不一定美观,所以一般都用 CTeX 宏包。
  4. 宋、仿宋都可以看作是衬线字体,而楷体、黑体、幼圆可以看作是非衬线字体。
  5. No matter CTeX, xeCJK or fontspec is used, they ignore Fontconfig customization like font renaming, alias etc.
  6. 下面四个样例引用的字体原始名,实际还可以引用字体文件名,具体请参考 CTeX, xeCJK, CJK, 和 fontspec 文档。
  7. 如果只插入几个汉字,可以用图片的形式,更方便。

Fontspec

Set global fonts to Chinese. 加载 fontspec 宏包后,使用其提供的 \setmainfont 命令可设定文稿正文中的中文字体。这样英文字符会用中文字体显示,可能效果不是非常好!由于是 fontspec, 所以要 XeTeX engine.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
\documentclass[11pt,a4paper,portrait]{article}

\usepackage{fontspec}
\setmainfont{Adobe Song Std}
\setsansfont{Noto Sans S Chinese}
\setmonofont{Adobe Fangsong Std}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt

\usepackage[top=1in,bottom=1in,left=1.2in,right=1in]{geometry}

\begin{document}

世界,你好!

下面讲一下 'setmainfont' 与 'setsansfont' 指令中的可省略参数 'BoldFont' 的用法,这个参数是用来指定衬线与非衬线字体在粗体( bold )状态下所使用的字体,这是因为字体可以在常态下经“加粗”后所得到的实际上是另一种字体。对于任意一款计算机字体而言,它不是一个你想怎么变就可以怎么变的东西,如果一款字体在设计的时候就不是粗体,那么是不可能把它变成粗体的,只有用一种设计好的粗体去替换。虽然有一些办法可以让一些字体经过微量平移并叠合后可以得到类似“粗体”的效果,但那是“穷人的粗体”,显示效果很差的。所以,我们不应该把你正在用的这个“宋体”变成“粗”宋体,而必须去找专门的粗宋体来用。如果找不到粗宋体,那就用黑体来代替,本文的排版就是这么做的,'Adobe Heiti Std' 来作为衬线与非衬线的粗体。

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

其中\setmainfont 设置 衬线 字体,因为 XeTeX 默认用是的是衬线字体;\setsansfont 设置反衬线字体;\setmonofont 设置的是等宽字体。fontspec 提供了一个与 \setmainfont 等价的命令 \setromanfont,这完全是历史缘故,因为以大部分西方人把 Roman 字体当文章正统字体。

CJK

Insert Chinese characters on demand, especially when writing English article.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
\part{Insert Chinese}
\label{part:insert-chinese}

\begin{CJK*}{UTF8}{gbsn}
  \section{插入中文}
  \paragraph{CJK 和 CJK* 环境} 在英文文档里用 CJK 或 CJK* 环境插入
  少量汉字。后者会忽略汉字后面的空格,推荐使用。\subparagraph{字体}
  bsmi~字体可能没有,尝试换一个如~gkai,
  ~gbsn~等。\subparagraph{xeCJK 更好} xeCJK 在处理细节上更好,关键
  是可方便设置中英文字体。用 xeCJK 则不需要特殊环境包裹汉字,只需
  在``导言区''设置好中英文字体即可。\subparagraph{中英文空格} 我们
  想要的效果是英文字符前后自动加上空格。即使在 \TeX{} 源码里加了空
  格,CJK 会忽略。xeCJK 则会自动处理,但是效果不是非常好。所以我们
  统一用 CJK 的 CJKspace 包,源码里英文后空格会保留,中文后空格依然
  被 CJK* 压缩。还有一个方法是在需要空格的地方用 tilde $\sim$.
\end{CJK*}

\part{\LaTeX{} Tutorial}
\label{part:latex-tutorial}

\section{Basics}
\label{sec:basics}

how are you?

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

In the above example, we assume it's an English article. We insert Chinese on demand by \begin{CJK*} and \end{CJK*}. However, the CJK macro package defines font names (song, gbsn, gkai etc.) under /usr/share/texmf-site/tex/latex/cjk-latex/*/*.fd.

As mentioned earlier, we should compile CJK format with TeX engin (latex) and/or pdfTeX engine (pdflatex). Dunno why XeTeX engine (xelatex) cannot locate CJK fonts and miss Chinese characters.

Sometimes, TeX distribution does not bring along CJK fonts, then check download a copy or try xeCJK method.

xeCJK

xeCJK 较 CJK 和 fontspec 的优势是可以分别设中文和英文字体。

\documentclass[11pt,a4paper]{article}

\usepackage{syntonly}
%\syntaxonly

\usepackage{xeCJK} % brings in `fontspec' automatically
\setmainfont{Tinos}[ % search font by filename
  Path = /opt/fonts/core/Tinos/,
  Extension = .ttf,
  UprightFont = *-Regular,
  BoldFont = *-Bold,
  ItalicFont = *-Italic,
  BoldItalicFont = *-BoldItalic
]
\setsansfont{NotoSans}[ % search by `postscriptname'
  BoldFont = NotoSans-Bold,
  ItalicFont = NotoSans-Italic,
  BoldItalicFont = NotoSans-BoldItalic  
]
\setmonofont{migu-1m-regular}[
  BoldFont = migu-1m-bold
]
\setCJKmainfont{Adobe Song Std} % search by `family'
\setCJKsansfont{NotoSansHans-DemiLight}[
  BoldFont = NotoSansHans-Bold
]
\setCJKmonofont{Adobe Fangsong Std}

\begin{document}

How are you?

非常好!

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

如上分析,xeCJK 依赖 fontspec, 所以要用 XeTeX 引擎。

CTeX package with article class

用的 article 排版,所以英文格式;但 ctex 包支支持中文编译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
\documentclass[11pt,a4paper]{article}

\usepackage[heading = true,UTF8]{ctex}
% By default, CTeX on Linux use /usr/share/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-fandol.def
\setmainfont{Tinos}[ % search font by filename
  Path = /opt/fonts/core/Tinos/,
  Extension = .ttf,
  UprightFont = *-Regular,
  BoldFont = *-Bold,
  ItalicFont = *-Italic,
  BoldItalicFont = *-BoldItalic
]
\setsansfont{NotoSans}[ % search by `postscriptname'
  BoldFont = NotoSans-Bold,
  ItalicFont = NotoSans-Italic,
  BoldItalicFont = NotoSans-BoldItalic  
]
\setmonofont{migu-1m-regular}[
  BoldFont = migu-1m-bold
]
\setCJKmainfont{Adobe Song Std} % search by `family'
\setCJKsansfont{NotoSansHans-DemiLight}[
  BoldFont = NotoSansHans-Bold
]
\setCJKmonofont{Adobe Fangsong Std}

\begin{document}

\title{\LaTeX~中文文档模板}
\author{作者}
\maketitle
\tableofcontents
\newpage

\section{前言}

本文测试CTeX~文档类。

\section{正文}

下面一一看下Fandol~字体效果。

\subsection{宋体}

\songti {这是Fandol~宋体。看一下效果吧。}

\subsection{楷体}

\kaishu {这是Fandol~中文楷书。}

\subsection{黑体}

\heiti {这是Fandol~中文黑体字。}

\subsection{仿宋}

\fangsong {这是Fandol~仿宋体。}

\section{后记}

TeXLive~CTeX~在Linux~上默认用Fandol~字体集,所以我们要在“导言preamble~”部分重新设置默认字体。若实在需要Fandol~字体,用对应的命令。

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

CTeX 指整个宏包集,而 ctex 仅仅是 ctex.sty 这个宏包。单独导入的 ctex 包并默认不开启章节标题设置功能,需要使用 heading 选项来开启。

CTeX class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
\documentclass[UTF8]{ctexart}

% By default, CTeX on Linux use /usr/share/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-fandol.def
\setmainfont{Tinos}
\setsansfont{Noto Sans}
\setmonofont{Migu 1M}
\setCJKmainfont{Adobe Song Std}
\setCJKsansfont{Noto Sans S Chinese}
\setCJKmonofont{Adobe Fangsong Std}

\begin{document}

\title{\LaTeX~中文文档模板}
\author{作者}
\maketitle
\tableofcontents

\section{前言}

本文测试CTeX~文档类。

\section{正文}

下面一一看下Fandol~字体效果。

\subsection{宋体}

\songti {这是Fandol~宋体。看一下效果吧。}

\subsection{楷体}

\kaishu {这是Fandol~中文楷书。}

\subsection{黑体}

\heiti {这是Fandol~中文黑体字。}

\subsection{仿宋}

\fangsong {这是Fandol~仿宋体。}

\section{后记}

TeXLive~CTeX~在Linux~上默认用Fandol~字体集,所以我们要在“导言preamble~”部分重新设置默认字体。若实在需要Fandol~字体,用对应的命令。

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

AUCTex

  1. Emacs + LaTeX 快速上手.
  2. emacs-as-the-ultimate-latex-editor