上一篇:两个世界

ConTeXt 输出的 PDF 文件,其页面尺寸默认与 A4 纸的尺寸相同。在今后,我可能要给出很多的排版示例。若给出排版结果的全貌,则 A4 尺寸太大了,会导致示例截图里的文字不够清晰。倘若能将页面尺寸设置为卡片大小,并对版面略作设计,也许能岁月安好。

导言区

TeX 源文件里若使用了 ConTeXt 提供的控制序列,便可将其称为 ConTeXt 源文件。很多时候,我们也不必如此学究气。此外,TeX 控制序列也经常可以称为命令,只是要注意,它们是排版命令,而非在终端里执行的命令。

一份 ConTeXt 源文件,其基本格式为

\starttext
% 正文
\stoptext

% 是 TeX 源文件里的注释符,该符号以及位于它之后直至行尾的文字(包括换行符)会被 TeX 编译器忽略。

\starttext 之前出现的任何内容,不会出现在排版结果里。在 \starttext\stoptext 里出现的内容,可以出现在排版结果里,因此这部分内容称为正文。\stoptext 后面的内容,会被 TeX 编译器忽略。

现在,开始关心 \starttext 之前应该可以发生什么。通常称该区域为导言区,用于排版的全局控制。例如

\setuphead[title][align=middle]
\starttext
\title{Hello world!}

... some text ...

\title{Hello world again!}

... some text ...

\stoptext

在导言区设定了标题的居中,会作用于正文里的所有 \title。同理,如果我在导言区定义了页面的尺寸,那么它就可以作用于每个页面。试试看,

\definepapersize[card][width=85.6mm,height=53.98mm]
\setuppapersize[card]
\starttext
\title{Hello world!}

... some text ...

\title{Hello world again!}

... some text ...

\stoptext

上述第一个命令 \definepapersize 定义(define)了纸张(paper)的尺寸(size),并给它取了个名字 card。第二个命令的作用是设置(set up)纸张(paper)的尺寸(size)为 card 这个尺寸。

值得注意的是,在 ConTeXt 里,纸张的尺寸与页面的尺寸是两个概念,但是现在无需纠结此事,上述设定是用纸张尺寸作为页面尺寸了。

上述 ConTeXt 源文件的排版结果如下图所示:

排版结果的每一页上方的数字是页码。排版结果的第 1 页和第 2 页的页面尺寸看上去的确相同。所以,从现在开始要记住,导言区里的设定可对排版结果起到全局控制的作用。

\definepapersize 支持的长度单位不仅仅是毫米(mm),也可以是厘米(cm),英寸(in),点(pt),还有 ex,em 等……总之是很多种。在这份文档里,我尽量只用 mm。

页面布局

现在有了卡片大小的页面了,但是对于 ConTeXt 而言,页面由多个区域构成。使用 \showframe 可以显示这些区域,只需将它写于导言区即可,例如

\definepapersize[card][width=85.6mm,height=53.98mm]
\setuppapersize[card]
\showframe
\setuphead[title][align=middle]
\starttext
\title{Hello world!}

... some text ...

\stoptext

对应的排版结果为

页面具体由哪些区域构成,可参考下图:

我们本土的页面布局术语是上述页面区域布局图示的一个简洁的子集,即版心、天头、地脚、订口、翻口。这个子集与 ConTeXt 页面布局参数对应如下:

  • 版心:宽度为 width,高度为 height;
  • 天头:topspace;
  • 地脚:(paperheight - topspace - height);
  • 订口:backspace,指书籍页面靠近书脊(装订线)的空白区域;
  • 翻口:cutspace 或 (paperwidth - backspace - width),指看书时用于掀起书页的区域。

其中,paperwidth 和 paperheight 即 \definepapersize 定义的页面尺寸。

设置页面布局

使用 \setuplayout 可以设置(set up)页面的布局(layout),例如

\definepapersize[card][width=85.6mm,height=53.98mm]
\setuppapersize[card]
\setuplayout
  [backspace=.1\paperwidth,
    width=.8\paperwidth,
    topspace=.015\paperheight,
    height=.97\paperheight]
\showframe
\setuphead[title][align=middle]

\starttext
\title{Hello world}

... some text ...

\stoptext

上述代码里的 \setuplayout 部分,仅设定了版心、天头和订口的尺寸,基于这些设定,ConTeXt 能够推算出翻口和地脚的尺寸。

上述 ConTeXt 源文件对应的排版结果如下图所示:

边边角角

卡片里的世界,大局已定,但是周边并不太平。

为了节省篇幅,本节在上一节的 ConTeXt 源文件的基础上,仅对 \setuplayout 部分予以修改,并给出与之应的排版结果,从而能直观地理解 \setuplayout 的部分参数的效用。

首先,将版心左右的留白(Margin)区域设置为 backspace 或 cutspace 尺寸的 2/3(约 0.666):

\setuplayout
  [backspace=.1\paperwidth,
    width=.8\paperwidth,
    topspace=.015\paperheight,
    height=.97\paperheight,
    leftmargin=.666\backspace,
    rightmargin=.666\cutspace]

排版结果为

然后将位于版心内的页眉(header)和页脚(footer)区域与正文(text)区域有所分离:

\setuplayout
  [backspace=.1\paperwidth,
    width=.8\paperwidth,
    topspace=.015\paperheight,
    height=.97\paperheight,
    leftmargin=.666\backspace,
    rightmargin=.666\cutspace,
    headerdistance=.025\makeupheight,
    footerdistance=.025\makeupheight,
    textheight=.95\makeupheight]

排版结果为

页码

页码默认是在页眉上。我更喜欢将它移动到页脚并置于留白处,使用 \setuppagenumbering 可做到,例如

\setuppagenumbering[location={footer,margin}]

我想,现在已经无须在刻意提醒要将上述代码置于 ConTeXt 源文件的导言区了。

现在,排版结果如下:

将导言区里的 \showframe 去掉,页面里的脚手架也就消失了,现在卡片看上去更像卡片:

环境文件

上述设置了卡片页面布局、页码以及标题样式的 ConTeXt 源文件的导言区,已经很多内容了:

\definepapersize[card][width=85.6mm,height=53.98mm]
\setuppapersize[card]
\setuplayout
  [backspace=.1\paperwidth,
    width=.8\paperwidth,
    topspace=.015\paperheight,
    height=.97\paperheight,
    leftmargin=.666\backspace,
    rightmargin=.666\cutspace,
    headerdistance=.025\makeupheight,
    footerdistance=.025\makeupheight,
    textheight=.95\makeupheight]
\setuppagenumbering[location={footer,margin}]

\setuphead[title][align=middle]

以后可能需要继续增加内容。每次打开 ConTeXt 源文件,我不想让目光掠过它们之后方能定位到 \starttext ...\stoptext 区域。与导言区相比,我更看重正文区域的内容,因为我是作者,而非排版专家。

ConTeXt 允许将导言区的所有内容保存到一份或多个 ConTeXt 源文件,然后使用 \environment 载入。例如,可将上述导言区内容保存到 card-env.tex 文件。假设在 foo.tex 文件里载入 card-env.tex,只需令 card-env.tex 和 foo.tex 位于同一目录,然后则像下面这样撰写 foo.tex 的内容:

\environment card-env
\starttext
% 正文
\stoptext

注意需要载入 card-env.tex 的 ConTeXt 源文件需要与 card-env.tex 位于同一目录。

跟 ConTeXt 里 Lua 有何关系呢?

没有必然的关系,但有联谊的关系。

以下 ConTeXt 源文件:

\environment card-env
\starttext

\ctxlua{context(tex.dimen.makeupwidth / tex.dimen.paperwidth)}

\stoptext

排版结果为

之所以会输出这个结果,是因为在 card-env.tex 文件里的 \setuplayoutwidth 设置为 .8\paperwidth

结语

以后,我就可以在卡片这个方寸世界里摆弄 Lua 编程了。

下一篇:时间戳

参考

下一篇:待续

garfileo
6k 声望1.9k 粉丝

这里可能不会再更新了。