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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
\startcomponent basis
\product ctxnotes
\chapter{让 \CONTEXT\ 工作起来}
\bookmark{让 ConTeXt 工作起来}
目前,只有 \ConTeXt\ Minimals(\ConTeXt\ 最小包)提供了最新的 ConTeXt 版本并且可以使之与系统所安装的其它 TeX 发行版友好共存。本章介绍 \ConTeXt\ Minimals 的安装、基本使用以及 MkIV 的中文支持等知识,目的在于让你多快好省地拥有一个 \CONTEXT\ 文档编译环境。本章的最后介绍了一些初学者应当阅读的文档以及一些学习资源。
\section[installmkiv]{\ConTeXt\ Minimals}
\bookmark{ConTeXt Minimals}
首先,在本地机器上创建一个 \ConTeXt\ 安装目录,该目录的位置与名字视个人嗜好而定,我喜欢用 \type{/opt/context}。为了不引起混乱,下文提及 \ConTeXt\ 安装目录皆以如下设定的 Bash 变量 \type{$CTXDIR} 代替:
\starttyping
$ export CTXDIR=/opt/context
$ mkdir -p $CTXDIR
\stoptyping
然后下载 ConTeXt 最小包安装脚本,将其存放于 \type{$CTXDIR} 目录并执行:
\starttyping
$ cd $CTXDIR
$ rsync -ptv \
rsync://contextgarden.net/minimals/setup/linux/first-setup.sh .
$ ./first-setup.sh
\stoptyping
由于安装脚本需要联网下载 \ConTeXt\ Minimals,需要等待一段时间才可以完成安装。这段时间,你可以做点自己喜欢做的事情。
\ConTeXt\ Minimals 安装完毕后,就开始进行 \ConTeXt\ 运行环境的配置,这需要设置许多的系统环境变量。不过莫要担心,\ConTeXt\ Minimals 提供了一个配置脚本,使用 source(亦称点命令)命令加载该文件即可完成所有 \ConTeXt\ 所需环境变量的设定。
\starttyping
$ . $CTXDIR/tex/setuptex $CTXDIR/tex
\stoptyping
上述命令行可将 setuptex 配置文件中的诸多环境变量的设定在当前终端环境中保持有效性。这意味着,每次使用 \ConTeXt\ Minimals,可以开一个终端窗口,然后执行一次上述命令,之后就可以在该终端中使用 \ConTeXt\ 环境。如果需要使用系统所安装的其它 \TeX\ 发行套件,可另建一个未开启 \ConTeXt\ 环境的终端即可。
虽然每次启用 \ConTeXt\ Minimals 所输入的命令行并不复杂,但是尽力让命令行简约且易于输入一向是 Unix-like 系统的光荣传统,因此我在 \type{$HOME/myscript} 目录下建立了一个配置文件 ctx,该文件内容如下:
\starttyping
export TEXDIR=/opt/context/tex
source $TEXDIR/setuptex $TEXDIR
export OSFONTDIR="/usr/share/fonts/{adobe,winfonts}"
\stoptyping
然后将 \type{$HOME/myscript} 目录添加到系统环境变量 \type{$PATH} 并使之生效:
\starttyping
$ echo "PATH=$PATH:$HOME/myscript" >> ~/.bashrc
$ . ~/.bashrc
\stoptyping
这样,以后每次启用 \ConTeXt\ 环境时,只需执行以下命令:
\starttyping
$ . ctx
\stoptyping
注意,在 ctx 文件中设置了 \type{$OSFONTDIR} 变量,该变量的意义在下一章讲述 MkIV 中文排版时会进行详细阐述,现在可不予理会。
使用 \type{ctxtools} 命令并配合 \type{-updatecontext} 参数可对所安装的 \ConTeXt\ Minimals 进行在线升级,不过前提是要建立 \type{$TEXMFLOCAL} 目录。因为 \ConTeXt\ Minimals 升级包是一个 zip 压缩档,升级时会将该压缩档下载到 \type{$TEXMFLOCAL} 目录并进行解压缩。
\CONTEXT\ Minimals 的升级很简单,那就是再重装一遍。
\section{若需要 \TeX\ 与 \LaTeX}
\bookmark{若需要 TeX 与 LaTeX}
\ConTeXt\ Minimals 可以与其它 \TeX\ 发行套件友好共存。最近,我打算使用 \XeTeX\ + plain \TeX\ 格式写一份文档,但是 \ConTeXt\ Minimals 默认未提供 \XeTeX\ 的 plain \TeX\ 格式并且缺乏一些 plain \TEX\ 必须的字体,因此基于 \XeTeX\ 的 plain \TEX\ 及 \LATEX\ 环境均无法正常运行。对于这个问题,我能想到的比较轻省的解决方案是安装一个 \TeX\ Live 2008,使用它所包含的 plain \TeX\ 环境,另外再安装一个 \LATEX\ 环境以备不时之需。
首先从清华的 CTAN 镜像 FTP 服务器下载 \TEX\ Live 2008 的网络安装程序并解包:
\starttyping
$ wget ftp://ftp.tsinghua.edu.cn/mirror/CTAN/systems/texlive/\
tlnet/tldev/install-tl-unx.tar.gz
$ tar -zxvf install-tl-unx.tar.gz && cd install-tl-unx
\stoptyping
\TEX\ Live 2008 的安装程序兼顾了不同用户的软件使用习惯,同时提供了文本界面与图形界面两种安装模式:
\starttyping
$ install-tl # 文本界面安装
$ install-tl --gui # 图形界面安装模式
\stoptyping
\type{install-tl} 程序在运行时会自动访问预设定的 CTAN 镜像 FTP 服务器,如果连接失败,安装过程也就终止了。对于国内用户,可以通过 \type{--location} 参数将 CTAN 镜像服务器设为清华的 FTP:
\starttyping
$ install-tl --location=ftp://ftp.tsinghua.edu.cn/\
mirror/CTAN/systems/texlive/tlnet/tldev
\stoptyping
如果网速足够,那么应当很快就可以在终端中显示文本安装界面了,具体的安装过程应当参考 \TEX\ Live 2008 中文指南\footnote{http://tug.org/texlive/doc/texlive-zh-cn/}。\TEX\ Live 2008 成功安装后,只要不在终端中开启 \ConTeXt\ Minimals 的 \ConTeXt\ 环境,就不会影响它的使用。
\section[helloworld]{Hello World}
将下面代码使用文本编辑器保存为 hello-world.tex 文件,这就是一个最简单的 \ConTeXt\ 源文档。
\starttyping
% hello-world.tex
\starttext
Hello World.
\stoptext
\stoptyping
我们可以在终端中使用 \type{context} 命令将这份源文档编译、输出为 PDF 文档:
\starttyping
$ . ctx
$ context hello-world
\stoptyping
上述命令将在当前目录产生 hello-world.pdf 文档,使用 PDF 阅读器查看它,可以看到文档中除了“Hello World.”字串之外,就剩下一个置于顶端的页码了。
在编译 hello-world.tex 时,生成了许多中间文件,如果你不喜欢看到它们,可以使用以下命令将其清除:
\starttyping
$ context --purge
\stoptyping
\section{\TeX\ 与 \ConTeXt\ 的关系}
\bookmark{TeX 与 ConTeXt 的关系}
在上一节 hello-world.tex 文档的编译过程中,我们可以获得的直观认识如下图所示:
\setupFLOWcharts[nx=3,ny=1,
dx=2\bodyfontsize,dy=4\bodyfontsize,
width=8\bodyfontsize, height=4\bodyfontsize,
maxwidth=.8\textwidth]
\startFLOWchart[context-flow]
\startFLOWcell
\name{texfile}\location{1,1}\shape{singledocument}
\text{\ConTeXt\ 源文档}
\connection[rl]{context}
\stopFLOWcell
\startFLOWcell
\name{context}\location{2,1}\shape{}
\text{\ConTeXt\ 程序}
\connection[rl]{pdf}
\stopFLOWcell
\startFLOWcell
\name{pdf}\location{3,1}\shape{singledocument}
\text{PDF 文档}
\stopFLOWcell
\stopFLOWchart
\placefigure[force][fig:context-flow]{\ConTeXt\ 文档编译过程的直观认识}
{\FLOWchart[context-flow]}
实际上是没有所谓的“\ConTeXt\ 程序”的,真正实现 \TeX\ 文档编译的的是 \TeX\ 引擎。在 \ConTeXt\ MkIV 中,\type{context} 程序只是一个脚本文件,只有一行代码:
\starttyping
mtxrun --script context "$@"
\stoptyping
\type{mtxrun} 是一个 Lua 脚本,它需要调用 Lua\TEX\ 引擎并读入 cont-en.fmt 文件才可以对 \ConTeXt\ 文档进行编译处理。cont-en.fmt 是 \ConTeXt\ 的格式文件,可以将它理解为一本词典,当编译 \ConTeXt\ 文档时,Lua\TeX\ 引擎遇到文档中的排版命令时,就去 cont-en.fmt 文件中查找这些排版命令的定义并依命行事。可还记得 2.3 节中使用 \type{context --make} 命令么?这个命令就是用于产生 cont-en.fmt 之类的格式文件的。这就是为什么我们经常说 \ConTeXt\ 或 \LaTeX\ 是 \TeX\ 的一种格式的原因。
\section{让 MkIV 讲中文}
要让 \ConTeXt\ MkIV 讲中文,首先要让它能够找到中文字体所在。还记得 \in{}[installmkiv]\ 节中我们写的那个 \ConTeXt\ 环境配置文件 ctx 么?其中有一行代码如下:
\starttyping
export OSFONTDIR="/usr/share/fonts/{adobe,winfonts}"
\stoptyping
\type{$OSFONTDIR} 可以让 Lua\TeX\ 知道系统所安装的字体所在。
我在 \type{/usr/share/fonts/adobe} 目录中存放了 4 款 Adobe OTF 中文字体,在 \type{/usr/share/fonts/winfonts} 目录中存放了一些从 Windows XP 中复制过来的一些中文字体。
有了中文字体,还需要一份字体配置文件。\ConTeXt\ 提供了一套比较高级的字体机制,叫做 Typescript,它可以设置三种字型:衬线 (Serif)、非衬线 (Sans)与等宽 (Mono) 字型。这三种字型均为英文字体机制中的术语,就像我们中文字体有楷体、宋体、黑体等类型一样。\ConTeXt\ 的 Typescript 机制牵涉太多的字体知识,对它们的详细描述已超出我之所能,这里仅给出一份我照猫画虎搞出来的的一份字体配置文件——\type{zhfonts.tex},它是随这份文档一起发布的,只需将它放到 \type{TEX} 目录树中,譬如:
\startniceTEX
$ mkdir -p $TEXMFLLOCAL/tex/context/third
$ mv zhfonts.tex $TEXMFLLOCAL/tex/context/third
\stopniceTEX
\noindent 然后执行:
\starttyping
$ context --generate
\stoptyping
\noindent 刷新一下文档数据库,就可以使用该字体配置文件了。
在 zhfonts.tex 中,我使用了 Adobe 宋、黑、楷体作为主要的中文字体。如果你没有这些字体,可以将其替换为其它 TTF 或 OpenType 中文字体,但是要保证 Lua\TEX\ 可以找到它们。由于中文字体所包含的英文字形通常比较丑陋,因此在 zhfonts.tex 文件中利用了 MkIV 的混合字体机制,将 lmroman、lmsans、lmmono 以及它们的粗体的英文字形区域分别注入到相应的中文字体中。
现在,将 \in[helloworld] 节中的 hello-world.tex 文档修改为:
\startTEX
\usetypescriptfile[zhfonts]
\usetypescript[myfont]
\setupbodyfont[myfont,rm,11pt]
\starttext
世界,你好!
\stoptext
\stopTEX
重新编译这份文档,即可得到中文版的 hello-world.pdf 文档。
\tex{usetypescriptfile} 命令用于加载 typescript 文件,要求 typescript 文件与 helloworld.tex 文件均在同一目录或者前者位于 \ConTeXt\ Minimals 的某个可以检索到的目录中。
\tex{usetypescript} 命令表示使用 typescript 文件中定义的 typeface。所谓 typeface,就是一个字型族。在 zhfonts.tex 文件中所定义的 typeface为 myfont,该字型族包含了 3 种字型:Serif、Sans 与 Mono。\tex{setupbodyfont} 命令是用于定义 hello-world.tex 文档的默认字体,也就是正文字体,这里是将 myfont 字型族中的 Serif 字型作为文档的默认字体,并且默认尺寸为 11pt。
现在,MkIV 基本上已经解决了中文排版问题,我们应当为此感谢 Hans、Taco 等开发者的辛勤劳动。另外,还要感谢 Wang Yue、SDE 诸位同学,他们提出了许多有关 \ConTeXt\ 中文支持的要求并报告了许多 bug。特别是 Wang Yue 同学,自去年始,一直在关注 Lua\TeX\ \& \ConTeXt\ MkIV 等项目的发展,并积极地与开发者们沟通,使得开发者认真考虑了有关中文处理的诸多需求。
\section{开始 \ConTeXt\ 的旅程}
\bookmark{开始 ConTeXt 的旅程}
\ConTeXt\ MkIV 中文支持的成功尝试,奠定了我开始学习 \ConTeXt\ 的信心。\CONTEXT\ 的文档非常丰富,不过大部分都是英文的,这多少让我有点沮丧。虽然读英文文档不是什么大障碍,但是总没有中文文档来得亲切。现状如此,只好忍了。
目前,\ConTeXt\ 的大多数文档是针对 MkII 版本的,除了 MkIV 手册之外,似乎再也没有其它文档来讲述 MkIV 的应用。不过,由于 MkIV 改变的主要是 \CONTEXT\ 底层,用户界面基本上没有改变,对于中文用户而言,基本上只需将 MkII 的中文字体支持机制改换为 MkIV 的即可,这样原来适用于 MkII 的文档基本上也适用于 MkIV。现在,\ConTeXt\ 项目组现在正在组织进行新的 \ConTeXt\ 文档撰写,这个工程非常浩大,其意在于将这么多年零散的文档汇总到一起,并追随 \CONTEXT\ 的最新进展,估计要到明年方能竣工。远水解不了近渴,现在学习 \CONTEXT,还是要从 MKII 版本的文档开始。
作为初学者,{\it\ConTeXt, an excursion}\cite[ms-cb-en]文档是官方制作的新手入门必读文档。\ConTeXt\ 的官方文档通常是分为屏幕阅读版本与打印版本,我读的 {\it\ConTeXt, an excursion} 是屏幕阅读版本,第一次打开这份文档,就惊愕了一下,没想到 PDF 文档居然可以做得如此精致。内容浅显易懂,文档版面美观,我觉得 \ConTeXt\ 是非常礼遇初学者的。
当读过 {\it\ConTeXt, an excursion} 时\footnote{实际上我是用到什么就去看什么,现在大概看了有一半内容。},就可以使用 \ConTeXt\ 排版手头上正在写作的一些文档,其实这才是真正的开始学习 \CONTEXT。对于其它任何一种 \TEX\ 都是如此,只有真正开始使用它,才有可能掌握它。一开始,文档的版面丑点没关系,毕竟内容是最重要的。随着对 \CONTEXT\ 的认识日益深刻,你的文档便会愈发具备可观赏性。在实践的过程中,\CONTEXT\ 用户手册\cite[cont-eni]是主要的参考书。当你遇到不解的命令/参数,或者想了解一些命令更多的细节,都可以使用 PDF 阅读器打开 \CONTEXT\ 用户手册,利用阅读器提供的查询功能找到你所感兴趣的内容,并掌握它们。
字体在排版中是决定版面美观的重要因素,阅读 \CONTEXT\ 新手册中已经基本完工的 {\it fonts}\mycite{fonts} 部分,便可以理解 \CONTEXT\ 的字体机制,你将获得可以在 \CONTEXT\ 自如使用你喜欢的字体的能力;同时,我制作的那份 MkIV 中文字体配置文件也不再会令你感到困惑。
若使用 \ConTeXt\ 排版时存在矢量图绘制需求,推荐使用 \METAPOST。不过,在 \ConTeXt\ 中,我们要面对的不是 \METAPOST,而是 \METAFUN\mycite{metafun},后者对前者进行了封装,实现了 \CONTEXT\ 与 \METAPOST\ 的完美结合。{\it\ConTeXt, an excursion} 文档版面之所以美观,是因为在排版中大量使用 \METAFUN 来美化版面布局的结果。
若你对 \ConTeXt\ 已经有所认识,那么 \ConTeXt\ Wiki\footnote{\type{http://wiki.contextgarden.net/Main_Page}} 是非常好的网络学习资源。若有能力,可以在该 Wiki 上与整个世界的 \ConTeXt\ 用户分享你的学习经验;若暂时没能力,可以选择潜水。目前,我是这个 Wiki 众多潜水员中的一名。
目前,\CONTEXT\ MkIV 也许还存在许多的 bug,当你发现它们,应当提交 \CONTEXT\ 邮件列表\footnote{http://archive.contextgarden.net/list/context.en.html}中;当你使用 \CONTEXT\ 时有不解的问题,也可以去邮件列表中寻找答案。说来惭愧,我英文不好,并且不熟悉邮件列表的交流规则,所以一直都胆怯于邮件列表上的交流。
介绍了以上学习资源之后,我开始如释重负。以后再在这份文档上折腾,心里就不会总是想着自己在写一本 \CONTEXT\ 教程,那样子很累,并且很容易丧失乐趣。这份笔记的真正的意图是自我备忘,将它投放到网络上,是希望我的经验能够对他人有所帮助并且能够一同学习、讨论 \CONTEXT\ 排版知识。
\vfil
\midaligned{\color[gray]{\bfa Just for fun!}}
\stopcomponent
|