\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\ 世界里寻找汉字。