『ConTeXt 文稿的物理结构』阐述了 ConTeXt 文稿的自身结构。本文所讲述的 ConTeXt 文稿的逻辑结构则是所排版文档的结构,例如文档的章节标题、段落等文档逻辑单元。文稿的逻辑结构可被文稿的物理结构中的任何一种结构所包含。
标题
对于所排版的文档的标题,ConTeXt 提供的宏根据逻辑上的从属关系分为:
有编号标题可显示于文档的目录中,无编号标题则没这种待遇。例如:
\usemodule[zhfonts]
\setuppapersize[A5]
\setuphead[title][style=\bfc]
\setuphead[section, subject][style=\bfa]
\setupcombinedlist[content][alternative=c]
\starttext
\title{B\'ezier 三角曲面片光滑拼接}
\placecontent % 目录
\subject{前言}
<此处删除 xxx 字>
\section{基本概念和理论}
<此处删除 xxx 字>
\section{$G^1$ 连续拼接}
<此处删除 xxx 字>
\section{高斯曲率连续拼接}
<此处删除 xxx 字>
\section{计算实例}
<此处删除 xxx 字>
\stoptext
其输出结果如下图所示。
认真观察上述示例,可以发现:
有编号标题与无编号标题是可以混杂在一起使用。
无编号标题的确不会出现在目录中。例如上例中的
\subejct{前言}
便未出现在目录中。使用
\setuphead[标题名称][参数=参数值]
可对各种标题的样式进行定制。上例中为\title
设定了大号粗体样式。\setuphead[section, subject][style=\bfa]
为\section
与\subject
设定了尺寸比\bfc
小一些的粗体样式。\bfc
对应的字体尺寸大于\bfa
,不难想到还应该有个\bfb
,其字体尺寸介于\bfc
与\bfa
之间。\setupcombinedlist
与\placecontent
与目录排版有关。
『head』这个单词本身就有『标题』的意思。Hangen Hans 在 ConTeXt 中使用『head』作为所有标题宏的统称,并提供 \setuphead
这个宏来设定所有的标题样式,这就是我在『序幕有些长』所谓的“『让用户只需为控制序列提供一些很简单的参数便可以实现最大化地排版控制』的一个例证。
有关标题样式的更多设定细节,请阅读:http://wiki.contextgarden.net/Titles
段落
ConTeXt 文稿中,一般是采用以空行结表示段落的间隔。例如:
\usemodule[zhfonts]
\setupindenting[first,always,2em]
\starttext
庄子与惠子游于濠梁之上。
庄子曰:“鯈鱼出游从容,是鱼之乐也。”
惠子曰:“子非鱼,安知鱼之乐?”
庄子曰:“子非我,安知我不知鱼之乐?”
惠子曰:“我非子,固不知子矣;子固非鱼也,子之不知鱼之乐全矣!”
庄子曰:“请循其本。子曰‘汝安知鱼乐’云者,既已知吾知之而问我。我知之濠上也。”
庄子与惠施在濠水的桥上游玩。
庄子说:“白鱼在河水中游得多么悠闲自得,这是鱼的快乐啊。”
惠施说:“你不是鱼,怎么知道鱼的快乐呢?”
庄子说:“你不是我,怎么知道我不知道鱼的快乐呢?”
惠施说:“我不是你,固然不知道你;你本来就不是鱼,你不知道鱼的快乐,是可以肯定的!”
庄子说:“请从我们最初的话题说起。你说‘你哪儿知道鱼快乐’的话,说明你已经知道我知道鱼快乐而在问我。
我是在濠水的桥上知道的。”
\stoptext
虽然文稿中是由多行文本构成,但实际上它们构成的只是两段文字,因为 ConTeXt 只从中看到一个段落间隔符(TeX 与 LaTeX 文稿也是也如此)。
上例还隐含着 TeX 的一个知识点,那就是 TeX 会将段落中的换行符视为空格,而 ConTeXt 只将西文文本中的换行符转化为空格,汉字之间的空格会被它忽略。
除了可以用空行表示段落间隔之外,也可以使用 \par
,这是 Plain TeX 提供的宏,它通常用于一些较为紧凑的环境,例如:
\starttext
\dorecurse{10}{\input knuth\par}
\stoptext
上例表示将 knuth.tex 文件载入 10 次,并且每次载入都构成 1 个段落。在此,顺便记住 \dorecurse
的用法,它在写一些文本重复或者填充足够内容的示例以测试 ConTeXt 效果时非常节省时间。
使用 \startnarrower ... \stopnarrower
可以构建较窄的段落。例如:
\starttext
\startnarrower
\input knuth
\stopnarrower
\blank
\input knuth
\stoptext
也可以调整段落的窄度,虽然不是那么直观。例如下面的实示例将段落两侧空白区域的宽度分别设为 1cm(也就是说 middle 表示 0.5 cm):
\starttext
\startnarrower[2*middle]
\input knuth
\stopnarrower
\blank
\input knuth
\stoptext
显然,窄的段落适用于撰写期刊论文的摘要部分。有关 \startnarrower
宏的参数的意义,请参考:http://wiki.contextgarden.net/Command/startnarrower
注意:上面两个构建较窄段落的示例中出现了一个以前未见过的控制序列 \blank,它可用于构建一个竖直方向的空区。比如要在两个段落之间插入高度为 3cm 的空白区域,可以使用 \blank[3cm]。
元结构
上文已经大致介绍了 ConTeXt 的标题与段落的基本知识。如果不是从全面精微的方面去考虑文档排版,那么标题与段落的组合便足以涵盖文档正文内容的逻辑结构,但是现实中较为正式的文档对 于结构上的要求通常非常严格。例如,对于一本书的排版,除了正文内容之外,还要考虑封皮、前衬页、衬页、前页(front matter)、正文、后页(back matter)等。
ConTeXt 提供了元结构(Meta Structure)机制,可以建立居于标题、段落、目录等基本排版要素之上的文档逻辑结构,适合于排版书籍。例如,一本不包含封面和衬页的 GTK+ 编程技术书籍的 ConTeXt 元结构如下图所示。
上图所表达的 ConTeXt 元结构对应以下 ConTeXt 文稿:
\usemodule[zhfonts]
\starttext
\startfrontmatter
\completecontent % 目录
\chapter{关于作者}
\chapter{引言}
\stopfrontmatter
\startbodymatter
\chapter{开始}
\chapter{第一个 GTK+ 应用程序}
... ...
\chapter{综合应用}
\stopbodymatter
\startappendices
\chapter{GTK+ 属性} % 附录 A
\chapter{GTK+ 信号} % 附录 B
... ...
\chapter{习题答案} % 附录 F
\stopappendices
\startbackmatter
\chapter{索引}
\chapter{后记}
\chapter{致谢}
\stopbackmatter
\stoptext
文稿的正文区域被 frontmatter、bodymatter、appendices 以及 backmatter 等元结构划分为四个子区域,每个子区域都可以包含标题与段落(上例省去了段落)等排版要素构成的逻辑结构。
在 frontmatter 区域中,有编号标题,例如 \chapter
,其编号在排版输出结果中不会被显示,但是标题可在目录中显示。
在 bodymatter 区域中,有编号标题名符其实。
在 appendices 区域中,有编号标题的编号变为大写字母 A,B,...,Z,除此之外它的表现依然名符其实。
在 backmatter 区域中,有编号标题的表现与其在 frontmatter 区域类似。