\chapter{新手村}

不要急于探索如何使用 \CONTEXT\ 排版你的论文或专著，虽然它极为擅长这类任务，但是我还是希望你在新手村里待两天，学几个简单的招式，打一些立竿见影的怪物，培养一些成就感或信心。至于装备，只需要一个文本编辑器和一个 PDF 阅读器，前者用于编写 \CONTEXT\ 源文件，后者用于查看 \type{context} 命令的编译结果。

你的 PDF 阅读器最好能自动响应 PDF 文件的变化，亦即当所打开的 PDF 文件发生变化时，PDF 阅读器能自动刷新页面，例如 Windows 里的 Sumatra PDF，Linux 里的 Evince，macOS 里的 Skim 皆具有该功能。

\section{单页环境}

在第 \in[Installation] 章中，为了验证 \CONTEXT\ LMTX 是否已成功安装，我使用三条 \type{echo} 命令构造了一份简单的 \CONTEXT\ 源文件 foo.tex。在生产环境，你需要一个文本编辑器，哪怕是功能最为简单的文本编辑器，也要比 \type{echo} 命令更适合做此事。

现在，用你的文本编辑器重写一次 foo.tex，其内容如下：

\starttyping[option=TEX]
\startTEXpag[frame=on]
Hello \CONTEXT!
\stopTEXpage
\stoptyping

\noindent 然后用 \type{context} 命令，将 foo.tex 编译成 PDF 文件 foo.pdf，亦即

\starttyping
$ context foo.tex
\stoptyping

\noindent 或

\starttyping
$ context foo
\stoptyping

\noindent 从本章开始，在表达命令行语句时，将一直使用 Linux 风格的命令提示符 \type{$}。此外，我们将 \type{context} 命令称为 {\bf\CONTEXT\ 编译器}，有时我也会将后者简称为 \CONTEXT。

在 \CONTEXT\ 源文件里，前缀为反斜线 \type{\} 的英文单词，皆为排版命令。的确如此。排版命令\boxquote{\type{\startTEXpage...\stopTEXpage}} 称为 \type{TEXpage} 环境\index[TEXpage]{\type{TEXpage} 环境}。这对排版命令所包含的内容，例如\boxquote{\type{Hello \CONTEXT!}}会被安排在一个恰好能包含它的矩形排版空间。

\type{TEXpage} 环境的 \type{frame} 参数用于控制边框是否开启，若该参数不存在，或其值为 \type{off}，表示无边框。\type{offset} 参数可用于对排版空间进行扩大或缩小，例如将排版空间从中心向四周被扩大 2.5 mm，结果见例 \in[starting-area]。

\startexample
\startTEXpage[frame=on,offset=2.5mm]
Hello \CONTEXT!
\stopTEXpage
\stopexample
\example[option=TEX][starting-area]{新手村}{\externalfigure[02/starting-area.pdf]}

在下文里，所有新学的 \CONTEXT\ 排版命令皆以 \type{TEXpage} 为舞台，原因是因 \type{TEXpage} 足够简单，方便观察大多数基本排版命令的效用，无需关心天头、地脚、订口、翻口、版心、页码等排版元素的设定。

\section{伪文}

\CONTEXT\ 自带一个 visual 模块，该模块提供了命令 \tex{fakewords}\index[fakewords]{\tex{fakewords}}，可生成一些黑色的长短随机的矩形块。若将这些矩形块视为文字，在新手村里，我们举止会更为随心所欲一些，例如下例排版了两行文字，每一行由 3～5 个单词构成。

\startexample
\usemodule[visual] % 载入 visual 模块
\startTEXpage[frame=on,offset=2.5mm]
\fakewords{3}{5}\\ 
\fakewords{3}{5}
\stopTEXpage
\stopexample
\example[option=TEX][fakewords]{两行伪文字}{\externalfigure[02/fakewords.pdf]}

在例 \in[fakewords] 的源码中，\type{%} 及其后面的同一行文字，是 \TEX\ 注释文本，在编译过程中，它们会被忽略，不会出现在排版结果中。除了用于注释源码，注释符也能用于消除其后的换行符，以后你自定义 \TEX\ 命令时会用到这个功能。

\section{换行}

在例 \in[fakewords] 的源码中，\tex{\} 是强制换行命令\index[huanhangfu]{\type{换行命令}}，若将其删除，即使将文字分为两行，

\starttyping[option=TEX]
This is the first line.
This is the second line.
\stoptyping

\noindent 排版所得结果依然是一行，而且换行符会被 \CONTEXT\ 编译器视为一个空格，你可以亲自动手试验一下。在使用强制换行命令时，即使两行文字在源代码中处于同一行，例如

\starttyping[option=TEX]
This is the first line.\\ This is the second line.
\stoptyping

\noindent 排版所得结果依然是两行。\type{\crlf} 也能用于文字强制换行。

\type{lines} 环境\index[lines 环境]{\type{lines} 环境}可以排版多行文本，无需 \tex{\} 或 \tex{crlf}，见下例。

\startexample
\startlines
\fakewords{3}{5}
\fakewords{4}{7}
\fakewords{5}{9}
\stoplines
\stopexample
\example[option=TEX][lines]{排版多行文本}{\externalfigure[02/lines.pdf]}

\section{分段}

观察例 \in[pars]，虽然排版结果依然是两行，但实际上是两段。\type{\par} 是分段命令。

\startexample
\fakewords{3}{5}\par
\fakewords{3}{5}
\stopexample
\example[option=TEX][pars]{分段}{\externalfigure[02/pars.pdf][width=.325\textwidth]}

\noindent 上例也能写成以下形式：

\startTEX
\fakewords{3}{5}\par \fakewords{3}{5}
\stopTEX

通常很少使用分段符对文本进行分段，因为在 \CONTEXT\ 源文档中，只需在两段文字之间空一行便可实现分段。例 \in[pars-2] 使用空行进行分段，并将页面宽度设定为 6cm，从而在促狭的空间里展示了多行伪文字构成的段落。

\startexample
\usemodule[visual]
\startTEXpage[frame=on,offset=2.5mm,width=6cm]
\fakewords{9}{15}\par
\fakewords{9}{15}
\stopTEXpage
\stopexample
\example[option=TEX][pars-2]{多行文本构成的段落}{\externalfigure[02/pars-2.pdf][width=.325\textwidth]}

段落可以设置首行缩进。中文排版的惯例是，段落首行需缩进 2 个汉字的宽度，例 \in[parindent] 将段落首行缩进距离设定为 2em，即英文字母 \type{M} 的宽度的 2 倍，刚好与两个汉字的宽度相同。\CONTEXT\ 还有一个常用的尺寸单位 ex，它是英文字母 \type{x} 的高度。

\startexample
\usemodule[visual]
\startTEXpage[frame=on,offset=2.5mm,width=6cm]
\setupindenting[first,always,2em]
% 将缩进区域的颜色设为白色
\definecolor[fakeparindentcolor][white]
\fakewords{9}{15}\par
\fakewords{9}{15}
\stopTEXpage
\stopexample
\example[option=TEX][parindent]{段落首行缩进}{\externalfigure[02/parindentcolor.pdf]}

\noindent visual 模块默认是将段落缩进区域设定为蓝色，为了让缩进区域更为直观而非明显，上例参考了文档 \cite[faking-text]，将其改为白色。

在设定段落首行缩进后，若不希望某个段落的首行被缩进，可在段落开头放置命令 \type{\noindent}\index[indenting]{indenting + \tex{noindent}}，参考例 \in[noindent]。

\startexample
\fakewords{9}{15}\par
\noindent\fakewords{9}{15}
\stopexample
\example[option=TEX][noindent]{消除第二段的首行缩进}{\externalfigure[02/pars-4.pdf][width=.325\textwidth]}

\section[interlinespace]{行距}

\CONTEXT\ 默认的段落内各行文字的间距是 2.8ex，约等于 \CONTEXT\ 默认的正文字体大小 12pt。可使用 \type{\setupinterlinespace}\index[setupinterlinespace]{\tex{setupinterlinespace}} 命令对行间距进行调整。使用该命令，需要确定当前正文字体所用字号。例 \in[pars-5] 按默认的正文字体字号即 12pt 将行距设为该字号的 1.75 倍。

\startexample
% 1.75 * 12pt = 21pt
\setupinterlinespace[line=21pt]
\fakewords{9}{15}\par
\fakewords{9}{15}
\stopexample
\example[option=TEX][pars-5]{多行文本构成的段落}{\externalfigure[02/pars-5.pdf]}

\noindent 上例设定的实际上是行高，只是在 \CONTEXT\ 中，行间距是相邻两行文字的基线距离，恰好等于行高。由于 \CONTEXT\ 提供了 \tex{bodyfontsize} 命令\index[bodyfontsize]{\tex{bodyfontsize}}，通过它能获得当前正文字体的字号，故而上例亦可写为让 \CONTEXT\ 编译器自动计算行高的形式：

\starttyping[option=TEX]
\setupinterlinespace[line=1.75\bodyfontsize]
\fakewords{9}{15}\par
\fakewords{9}{15}
\stoptyping

\CONTEXT\ 是 \TEX\ 的上层建筑，上例中用一个数字直接乘以一个能获得某种尺寸的命令，这是 \TEX\ 的语法。今后，我们会时常用这种形式构造一些尺寸。如果能够以字号确定行高，就无需单独为行高设定一个尺寸了。我认为排版作为一门艺术，其根本在于，是为不同尺度建立联系，用尽量少的尺度控制尽量的尺度，类似于物理学的杠杆原理。我甚至觉得，任何一门艺术皆应如此。

\section{对齐}

将一行文字居左、居中或居右放置，可分别使用 \type{\leftaligned}，\type{\midaligned} 和\type{\rightaligned} 进行排版\index{alignment，单行对齐\crlf\tex{leftaligned}\crlf\tex{midaligned}\crlf\tex{rightaligned}}，请参考例 \in[aligned-1]。

\startexample
\leftaligned{\fakewords{1}{2}}
\midaligned{\fakewords{1}{2}}
\rightaligned{\fakewords{1}{2}}
\stopexample
\example[option=TEX][aligned-1]{多行文本构成的段落}{\externalfigure[02/aligned-1.pdf]}

现在，你已经有能力用伪文字写一封谁也看不懂内容的书信了，见例 \in[letter]。注意，该例使用了 \tex{dorecurse} 命令\index[dorecurse]{\tex{dorecurse}}，该命令可将其第 2 个参数复制 $n$ 次，$n$ 值由该命令的第 1 个参数设定。

\startexample
\usemodule[visual]
\startTEXpage[frame=on,offset=1cm,width=10cm]
\definecolor[fakeparindentcolor][white]
\setupindenting[first,always,2em]
\noindent\fakewords{1}{1}:\par
\fakewords{1}{2}\par
\dorecurse{3}{\fakewords{20}{50}\par}
\fakewords{1}{1}\par
\noindent\fakewords{1}{1}\par
\rightaligned{\fakewords{1}{1}}\par
\rightaligned{\fakewords{1}{1}}
\stopTEXpage
\stopexample
\example[option=TEX][letter]{一封谁也看不懂的信}{\externalfigure[02/letter.pdf][width=.35\textwidth]}

如果是一段文字需要居左、居中或居右排版，可使用 \type{alignment} 环境\index[alignment]{\type{alignment} 环境}，通过该环境的参数控制对齐形式。例 \in[aligned-2] 展示了段落的三种对齐形式。

\startexample
\startalignment[flushleft] % 左对齐
1. \fakewords{5}{15}
\stopalignment
\startalignment[middle] % 居中对齐
2. \fakewords{5}{15}
\stopalignment
\startalignment[flushright] % 右对齐
3. \fakewords{5}{15}
\stopalignment
\stopexample
\example[option=TEX][aligned-2]{段落对齐}{\externalfigure[02/aligned-2.pdf][width=.375\textwidth]}

\subject{结语}

排版是一门艺术，\CONTEXT\ 排版自然也是如此。接触艺术最好的办法是，附庸风雅，多观察一些例子，掌握基本排版命令的用法，筑好根基。理解了这一点，你就可以走出新手村了。接下来你的第一个重要任务是在漫无边际的 \CONTEXT\ 世界里寻找汉字。
