\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\ 排版知识。

\section{更多阅读……}

如果上述内容有误或者你认为讲述的不够细致，那么请阅读以下文档：

\startitemize
\item “序幕有些长”，介绍了 \TEX\ 与 \CONTEXT\ MkIV 的背景知识：\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/10/zhfonts-usage.23740.html}
\item “这就是 \CONTEXT\ Minimals”，讲述了 \CONTEXT\ Minimals 的安装方法：\crlf\hbox{\tt http://liyanrui.is-programmer.com/2009/10/7/this-is-context-minimals.11971.html}
\stopitemize

我计划今年年底将这些外部文档归整到这份文档中。

\stopcomponent
