ConTeXt 文稿的物理结构
页面布局控制

ConTeXt 文稿的逻辑结构

Garfileo posted @ 2011年1月17日 06:42 in ConTeXt 笔记 with tags luatex ConTeXt MkIV , 10352 阅读

声明:可转载,可修改,也可以不注明作者和出处。

阅读本篇之前,需要你确认是否已对上一篇文章所讲的“ConTeXt 文稿的物理结构” 有所了解。ConTeXt 文稿的物理结构表示的是 ConTeXt 文稿的自身结构,而本文所讲述的 ConTeXt 文稿的逻辑结构表示的是所排版文档的结构,例如文档的标题和段落。ConTeXt 文稿的逻辑结构可被 ConTeXt 文稿的物理结构中的任何一种结构所包含。

标题

对于所排版的文档的标题,ConTeXt 提供的控制序列根据逻辑上的包含关系从上至下分为:

ConTeXt 控制序列 含义
有编号标题 无编号标题
\part —— 部分
\chapter \title
\section \subject
\subsection \subsubject 小节
\subsubsection \subsubsubject 次小节
\subsubsubsection \subsubsubsubject 次次小节
\subsubsubsubsection \subsubsubsubsubject 次次次小节

有编号标题可显示于文档的目录中,无编号标题则没这种待遇。例如:

\usemodule[zhfonts]
\zhfonts[rm, 11pt]

\setuphead[title][style=\bfc]
\setuphead[section, subject][style=\bfa]

\setupcombinedlist[content][alternative=c]

\starttext

\title{绕一角点的 B\'ezier 三角曲面片的光滑拼接}

\placecontent % 目录

\subject{前言}

<此处删除 xxx 字>

\section{基本概念和理论}

<此处删除 xxx 字>

\section{绕一角点的 3 次多项式曲面片的 $G^1$ 连续拼接}

<此处删除 xxx 字>

\section{绕一角点的 4 次多项式曲面片的高斯曲率连续拼接}

<此处删除 xxx 字>

\section{绕一角点的 5 次多项式曲面片的曲率连续拼接}

<此处删除 xxx 字>

\section{计算实例}

<此处删除 xxx 字>

\stoptext

排版结果截图如下:

认真观察上述示例,不难发现:

  • 有编号标题无编号标题是可以混杂在一起使用。
  • 无编号标题的确不会出现在目录中。例如上例中的 \subejct{前言} 便没有出现在“\title”标题之后的目录中。
  • 使 用 \setuphead[标题名称][参数=参数值] 可对各种标题的样式进行定制。上例使用了 \setuphead[title][style=\bfc] 为 \title 标题设定了大号粗体字样式,并使用 \setuphead[section, subject][style=\bfa] 分别为 \section 与 \subject 标题设定了较大号粗体字样式。
  • 示例中还出现了两个从未提及的控制序列:\setupcombinedlist 和 \placecontent,现在只需要知道它们与文档目录的排版相关即可。以后会有专门的一篇文档讲述 ConTeXt 目录排版方面的知识

我 刚开始接触 ConTeXt 的时候,第一次遇见 \setuphead,便认为它是用来设置页眉样式的控制序列。事实上,“head”这个单词本身就有“标题”的意思。Hans 在 ConTeXt 中使用“head”作为所有标题控制序列的统称,并提供 \setuphead 这个控制序列来管辖所有标题样式的定义。这是我在“序幕有些长”一文中所指出的“让用户只需为控制序列提供一些很简单 的参数便可以实现最大化地排版控制”这种 ConTeXt 风格的又一个例证。有关标题以及其他排版要素样式定制方面的内容,以后会单独作为一篇文章进行讲述,在此略过不言。

段落

ConTeXt 文稿中,一般是采用以空行结表示段落的间隔。例如:

\usemodule[zhfonts]
\zhfonts[rm, 11pt]

\setupindenting[first,always,2em]

\starttext

庄子与惠子游于濠梁之上。
庄子曰:“鯈鱼出游从容,是鱼之乐也。”
惠子曰:“子非鱼,安知鱼之乐?”
庄子曰:“子非我,安知我不知鱼之乐?”
惠子曰:“我非子,固不知子矣;子固非鱼也,子之不知鱼之乐全矣!”
庄子曰:“请循其本。子曰‘汝安知鱼乐’云者,既已知吾知之而问我。我知之濠上也。”

庄子与惠施在濠水的桥上游玩。
庄子说:“白鱼在河水中游得多么悠闲自得,这是鱼的快乐啊。”
惠施说:“你不是鱼,怎么知道鱼的快乐呢?”
庄子说:“你不是我,怎么知道我不知道鱼的快乐呢?”
惠施说:“我不是你,固然不知道你;你本来就不是鱼,你不知道鱼的快乐,是可以肯定的!”
庄子说:“请从我们最初的话题说起。你说‘你哪儿知道鱼快乐’的话,说明你已经知道我知道鱼快乐而在问我。
我是在濠水的桥上知道的。”

\stoptext

虽然文稿中是由多行文本构成,但实际上它们构成的只是两段文字,因为 ConTeXt 只从中看到一个段落间隔符(其它的 TeX 格式通常也如此)。

上例还隐含着 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

也可以设定段落的窄度(虽然不是那么直观),例如:

\starttext

\startnarrower[2*middle]
\input knuth
\stopnarrower

\blank

\input knuth

\stoptext

上例排版结果截图如下:

显然,窄的段落适用于撰写期刊论文的摘要部分。

注意:上面两个构建较窄段落的示例中出现了一个以前未见过的控制序列 \blank,它可用于构建一个竖直方向的空区。比如要在两个段落之间插入高度为 3cm 的空白区域,可以使用 \blank[3cm]

元结构

上 面已经大致介绍了 ConTeXt 的标题与段落的基本知识。如果不是从全面精微的方面去考虑文档排版,那么标题与段落的组合便足以涵盖文档正文内容的逻辑结构,但是现实中较为正式的文档对 于结构上的要求通常非常严格。例如,对于一本书的排版,除了正文内容之外,还要考虑封皮、前衬页、衬页、前页(front matter)、正文、后页(back matter)等[1]。为此,ConTeXt 提供了元结构(Meta Structure)机制,可以建立居于标题、段落、目录等基本排版要素之上的文档逻辑结构,适合于排版书籍。例如,一本不包含封面和衬页的 GTK+ 编程技术书籍的 ConTeXt 元结构如下图所示。

下面是这幅图所表达的 ConTeXt 元结构对应的 ConTeXt 文稿:

\usemodule[zhfonts]
\zhfonts[rm, 11pt]

\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

上例 ConTeXt 文稿的正文区域被 frontmatter、bodymatter、appendices 以及 backmatter 等元结构划分为四个子区域,每个子区域都可以包含标题与段落(上例省去了段落)等排版要素构成的逻辑结构。

在 frontmatter 区域中,有编号标题,例如 \chapter,其编号在排版输出结果中不会被显示,但是标题可在目录中显示。

在 bodymatter 区域中,有编号标题名符其实。

在 appendices 区域中,有编号标题的编号变为大写字母 A,B,...,Z,除此之外它的表现依然名符其实。

在 backmatter 区域中,有编号标题的表现与其在 frontmatter 区域类似。

预告

下一篇是“页面布局控制”。


参考文献

[1] 有关书籍的英文表达

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

negatlov 说:
2011年1月17日 13:24

不得不说句:这一系列得文章写得很清晰易懂,对于初学者来说完全是说到最需要的地方了。

整个系列完成后,修订下,出版绝对是第一选择!
电子文档变纸张很又必要!

Avatar_small
Garfileo 说:
2011年1月17日 20:13

@negatlov: 谢谢表扬 :)

不考虑出版,只是希望 ConTeXt 用户再多一些,多到可以足够影响 Hans 他们,促使他们对中文的支持更为关注一些。所以我把这一系列文档的协议放的很宽。

murong 说:
2011年1月18日 02:59

@Garfileo
negatlov兄说的很对,这系列文章对我等初学者确实非常实用。
再次感谢作者。

Avatar_small
HeroMe 说:
2011年1月18日 03:35

@Garfileo:
出版是扩大ConTeXt用户的一个很强大的方式,出本新书,比在博客里写一系列的文章带来的效应要大的多!

Avatar_small
galeki 说:
2011年1月18日 03:45

看来出版不只是我的建议,群众的眼光是雪亮的啊~~

hezhit 说:
2011年4月05日 14:26

[start|stop]bodypart应该改成[start|stop]bodymatter

tanhua 说:
2011年4月27日 15:09

请问版主,context 下怎么排诗词?

Head_small
lyanry 说:
2011年4月27日 15:21

@tanhua: http://garfileo.is-programmer.com/2011/1/24/context-mkiv-verbatim.24060.html

lxping 说:
2011年6月14日 15:28

你好,我手上有本文档way2ctx-ch1-3,不知道是不是你的作品,很精美,我很喜欢这种style,不知道你可不可以给我一份源码呢,因为我对context不是很熟,想借着模板来学习,谢谢

Avatar_small
Garfileo 说:
2011年6月14日 15:38

@lxping: way2ctx 的源码被我弄丢了。http://garfileo.is-programmer.com/2011/2/6/glib-notes-2011-02-06.24239.html 也有一份源码文件,可供参考。

lxping 说:
2011年6月14日 17:06

谢谢
.....折腾ing.....

bksy 说:
2014年1月29日 11:03

"三角曲面片的“
的这段代码例子,我在“\setuphead”这一组命令后加入了“\setupindenting[always, first, 2em]”,可是编译后的每一章的第一段,依然不缩进,第二段开始才缩进。这个有什么处理办法吗?或者这个是bug?

Avatar_small
rca 说:
2014年2月05日 16:07

@bksy: 标题后的段落,默认是不缩进的,你需要 \setuphead[title, chapter, section, subsection...][indentnext=yes] 强制使之缩进。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter