\chapter[post]{让文章有它该有的样子} 走出新手村,我们的第一个任务是,让一篇文章有它该有的样子。什么样子呢?至少要有标题,有作者信息,还可能有次标题,次次标题……还要有页码,当然最重要的是,要有段落——新手村里我们的老朋友。对于大多数文学创作工作者而言,这些已经足够了,这就是一篇文章该有的样子。至于科技工作者通常所需要的列表、表格、插图、数学公式等形式,是在文章该有的样子的基础上进一步的构造,现在不必急于理会。 \section{标题} 在 \ConTeXt\ 中,标题分为两种,无编号的和有编号的。每种标题又分为诸多级别。无编号的标题,级别从高到低,排版命令依序是 \starttyping[option=TEX] \title{...} % 一级标题 \subject{...} % 次级标题 \subsubject{...} % 次次级标题 \subsubsubject{...} % 次次次级标题 ... ... ... \stoptyping \noindent 有编号的标题,级别从高到低,排版命令依序是 \starttyping[option=TEX] \title{...} % 一级标题 \section{...} % 次级标题 \subsection{...} % 次次级标题 \subsubsection{...} % 次次次级标题 ... ... ... \stoptyping \noindent 应该不难看出两种标题各自的次级标题降级规律。不建议使用级别层次太深的标题,否则会让读者觉得身陷迷宫,通常前三级标题足够使用。若是写一篇散文,标题只需要用 \type{\title}。若是写一本小说,只需用 \type{\title} 制作书名,用 \type{\chapter} 制作章名。 \section{写一篇散文} 示例 \in[zaoshu] 虚构了一篇散文,我只给出了关键的源代码——为它构建完整的可编译的源代码,对你应该不是难事。该示例设置了段落首行缩进距离,并且使用 \type{\title} 创建了文章标题。目前尚无作者的名字,因为它会导致你无法看到 \ConTeXt\ 标题之后的段落,首行是不缩进的,这是西文的排版习惯。在使用标题前,只需对标题作如下设定,便可强迫 \ConTeXt\ 必须对每个标题后的第一个段落进行缩进。 \starttyping[option=TEX] \setupheads[indentnext=yes] \stoptyping \startsample \setupindenting[first,always,2em] \title{鲁迅家的后园} 在鲁迅家的后园,可以看见墙外有两株树。 一株是枣树,还有一株也是枣树。 这上面的夜的天空,奇怪而高,鲁迅生平 没有见过这样奇怪而高的天空。 \stopTEXpage \stopsample \sample[option=TEX][zaoshu]{散文示例 1}{\externalfigure[04/zaoshu.pdf]} 现在可以为文章增加作者信息了,虽然他叫无名氏,见示例 \in[zaoshu-2],只是作者距离正文太近了。不要尝试使用一些空行去增大该距离,因为 \TeX\ 引擎在遇到多个空行时,它也只是把它们当成一个空行,并将其视为 \type{\par}。 \startsample \setupheads[indentnext=yes] \setupindenting[first,always,2em] \title{鲁迅家的后园} \midaligned{无名氏} % 省略了正文内容 \stopTEXpage \stopsample \sample[option=TEX][zaoshu-2]{散文示例 2}{\externalfigure[04/zaoshu-2.pdf]} 在版面的竖直方向,段落之间,或标题与段落之间,或标题与标题之间……增加空白,通常可以使用 \type{\blank} 命令。例如,在作者和正文之间增加一个空行的距离,只需 \type{\blank[line]};要增加 $n$ 个空行的距离,只需 \type{\blank[n*line]}。 \startsample \midaligned{无名氏} \blank[line] % 省略了正文内容 \stopsample \sample[option=TEX][zaoshu-3]{散文示例 3}{\externalfigure[04/zaoshu-3.pdf]} 倘若需要将标题居中,而非默认的居左,只需使用 \type{\setuphead}单独为 \type{\title} 设定样式: \starttyping[option=TEX] \setuphead[title][align=middle] \stoptyping 若汉字字族里已经设定了粗体,也可以将标题的样式设为粗体,并指定它的大小级别: \starttyping[option=TEX] \setuphead[title][style=\bfc,align=middle] \stoptyping 示例 \in[zaoshu-4] 将上述设定综合起来,排版结果已经中规中矩了,只是标题里的汉字的分布有些疏松,这是 \type{\setscript[hanzi]} 命令在汉字之间插入的粘连的伸长特性被 \ConTeXt\ 激活导致的,而它们之所以被激活,大概是 \ConTeXt\ 过于追求精确文字居中对齐而导致的,令 \type{\setuphead} 的参数 \type{align} 的值为 \type{{middle,broad}} 可以让 \ConTeXt\ 在文字居中对齐方面宽松一些\cite[contextref](p86),结果可让汉字的分布变为紧密,见示例 \in[zaoshu-5]。 \startsample \setupheads[indentnext=yes] \setuphead[title][style=\bfc,align=middle] \setupindenting[first,always,2em] \title{鲁迅家的后园} \midaligned{无名氏} % 省略了正文内容 \stopsample \sample[option=TEX][zaoshu-4]{散文示例 4}{\externalfigure[04/zaoshu-4.pdf]} 不知 \ConTeXt\ 从哪个版本起,有了一个新的对齐方式 \type{center},它与 \type{{middle,broad}} 等价。请记住这个知识,因为以后可能会经常需要设定居中对齐。 \startsample \setupheads[indentnext=yes] \setuphead [title][style=\bfc,align=center] \setupindenting[first,always,2em] \title{鲁迅家的后园} \midaligned{无名氏} % 省略了正文内容 \stopsample \sample[option=TEX][zaoshu-5]{散文示例 5}{\externalfigure[04/zaoshu-5.pdf]} \section[context-world]{正式踏入 \ConTeXt\ 世界} 新手村终究太小了,小到已经不太容易让你尝试越来越多的 \ConTeXt\ 排版命令了。事实上,真正的 \ConTeXt\ 世界用起来要比新手村更为简单,只需使用 \type{\starttext ...\stoptext} 环境取代新手村即可,另外,一切设置排版样式的命令皆可放在 \type{\starttext} 之前。在 \type{text} 环境里,我们通常只需要关心文章或书籍的内容。 以下代码应当有助于你看到 \ConTeXt\ 世界大致面目。它是完整的,亦即可将其保存为 \ConTeXt\ 源文件,使用 \type{context} 程序进行编译。 \starttyping[option=TEX] % 排版样式 \definefontfamily[myfonts][rm][nsimsun][bf=simhei] \setupbodyfont[myfonts,10.5pt] \setscript[hanzi] \setupheads[indentnext=yes] \setuphead[title][style=\bfc,align=center] \setupindenting[first,always,2em] % 行距:1.5 倍的正文字体尺寸,即1.5 * 10.5pt \setupinterlinespace[line=15.75pt] % 正文 \starttext \title{鲁迅家的后园} \midaligned{无名氏} \blank[line] 在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。 这上面的夜的天空,奇怪而高,我生平没有见过这样的奇怪而高的天空。他仿佛要离开人间而去,使人们仰面不再看见。然而现在却非常之蓝,闪闪地眨着几十个星星的眼,冷眼。他的口角上现出微笑,似乎自以为大有深意,而将繁霜洒在我的园里的野花草上。 ... ... ... \stoptext \stoptyping \section[style]{内容与样式分离} 或许你现在已经对每次排版时,会担心日后需要重复输入许多代码,它们主要用于设定排版所用的字体,标题的对齐方式、字体的大小粗细、段落缩进、行间距等。无需有此担心,因为任何一种 \TeX\ 都支持排版内容与样式的分离。 如图 \in[style-file] 若将 \in[context-world] 节中的代码中位于 \type{\starttext} 之前的部分保存为文件,例如 foo-env.tex,然后将这部分代码之后的所有代码也保存为文件,例如 foo.tex。让 foo-env.tex 和 foo.tex 位于同一目录,然后在 foo.tex 的开头添加 \starttyping[option=TEX] \input foo-env \stoptyping \noindent 最后,编译 foo.tex,所的结果必定与 \in[context-world] 节中的代码的编译结果相同。\type{\input} 是 \TeX\ 层面的命令,它的作用载入指定的扩展名为 \type{.tex} 的文件,但扩展名可省略。\ConTeXt\ 提供了 \type{\input} 等效且用法相同的命令 \type{\environment},以体现所载入的文件仅涉及排版样式的设定。 \placefigure [here,force][style-file] {内容与样式分离}{\blueframed{\externalfigure[04/style-file.png][width=.8\textwidth]}} 一旦熟悉了如何实现排版内容与样式的分离,在使用 \ConTeXt\ 排版愈发复杂的内容时,你的样式文件 foo-env.tex 的内容便会日益丰富。长此以往,你总是能攒出一些样式文件,供不同的文档形式使用。排版内容总是千变万化,但样式却总是寥寥数种且极易与他人分享,这便是 \TeX\ 的优点,但前提是,你需要清晰地理解你所设定的任何一个排版样式。事实上,这也正是学习任何一种 \TeX\ 系统的乐趣所在。 \section{页码} 如果你亲自动手编译了 \in[style] 的 foo.tex,应当能看到,页眉是有页码的,如图 \in[pagenumber] 所示。这是 \ConTeXt\ 默认的页码样式,即页码出现在每一页,且居中位于页眉,这并不合乎中文的排版习惯,需要对页码进行样式设定。 \placefigure [here,force][pagenumber] {页码}{\blueframed{\externalfigure[04/pagenumber.png][width=.8\textwidth]}} 首先,文章标题所在页面,通常不需要页码。该要求,只需在标题样式将页眉和页脚置空,即 \starttyping[option=TEX] \setuphead [title] [header=empty, footer=empty, % 应该还有其他设定吧 ...=...] \stoptyping 然后,修改页码投放位置,例如放在页脚右侧: \starttyping[option=TEX] \setuppagenumbering[location={footer,right}] \stoptyping 将上述设定酌情添加到样式文件里,然后编译 \ConTeXt\ 源文档,查看其效果吧。日后,倘若是排版书籍,还需要对标题和页码样式的设计作更多的调整。 \section{小结} 现在,你已经可以用 \ConTeXt\ 写日记或随笔了。倘若动手尝试了 \type{\chapter},你甚至能用 \ConTeXt\ 写一本文集,只是风格过于朴素。若想让排版结果更为精致,\ConTeXt\ 博大精深,通常总有途径能够实现你的想法,前提是你需要更加用心。\TeX\ 之父 Donald Knuth 曾有一言,「我从来也不期盼 {\TeX} 会成为某种万能的排版工具,用于制作一些快速而脏的东西;我只是将其视为一种只要你足够用心就能得到最好结果的东西」,引用于此,与君共勉。