\chapter{写一本书？}

至此，你所掌握的关于 \CONTEXT\ 的所有知识，无论是用于撰写书信，随笔，论文，还是制作幻灯片，皆已游刃有余。现在再掌握 \ConTeXt\ 对文档逻辑结构的划分以及为文档添加目录等功能，便可写书了，这是 \TEX\ 系统一直以来最为擅长的事情，也是 \TEX\ 系统为何复杂到令很多人畏惧的原因，他们从未想过自己有一天会写一本书。

\section{书的内容结构}

一本书，通常是由一组文章构成的，可分为序、前言、目录、正文篇章、跋、参考文献、索引、附录等内容，再加上封面，衬页、扉页等页面。对于书籍制作，\CONTEXT\ 对 \type{text} 环境进行了更为细致的划分：

\starttyping[option=TEX]
\starttext
\startfrontmatter
% 封面、扉页、序、前言、目录等内容
\stopfrontmatter
\startbodymatter
% 正文篇章
\stopbodymatter
\startbackmatter
% 跋，参考文献列表、索引等内容
\stopbackmatter
\startappendices
% 附录
\stopappendices
\stoptext
\stoptyping

\section{文件结构}

将一本书的内容全部放在一份 \CONTEXT\ 源文件中并不违法，但是数十万甚至上百万字的内容，无论是撰写还是修改必定极为不便。通常是将按照内容结构，将每部分内容制作为单独的 \type{.tex} 源文件，然后使用 \type{\input} 载入到主文件中。例如，主文档的主文件内容如下：

\starttyping[option=TEX]
\starttext
\startfrontmatter
\input cover  % cover.tex：封面
\input preface  % preface.tex：序
\stopfrontmatter
\stoptyping
\starttyping[option=TEX]
\startbodymatter
\input 01  % 01.tex：第一章
\input 02  % 02.tex：第二章
% ... ...
\stopbodymatter
\startbackmatter
\title{参考文献}
\placelistofpublications  % 参考文献列表
\stopbackmatter
\startappendices
\null  % 暂时为空
\stopappendices
\stoptext
\stoptyping

\noindent 主文件 \type{\input} 的所有文件皆与主文件在同一目录。

\section{样式}

原则上，书籍的所有排版样式皆应在单独的文件中设定，然后使用 \type{\input} 或 \type{\environment} 命令在 \type{text} 环境之前将其载入。例如

\starttyping[option=TEX]
\environment book-style  % 载入book-style.tex
\starttext
% ... ... ...
\stoptext
\stoptyping

\section{目录}

\type{\placecontent} 可将全文章节标题及其所在页码等信息汇总为一个列表，以方便读者查阅。例如

\starttyping[option=TEX]
\usemodule[visual]
\starttext
\title{\fakewords{3}{5}}
\placecontent
\section{\fakewords{3}{5}}
... ... ...
\section{\fakewords{3}{5}}
... ... ...
\stoptext
\stoptyping
\midaligned{%
  \clip[width=\textwidth,height=6cm,voffset=3cm]{%
    \externalfigure[14/toc.pdf][width=\textwidth,frame=on]%
  }%
}

使用 \type{\setupcombinedlist} 可设定目录样式，例如设定可在目录中出现的标题级别以及列表样式。若得到常见的目录样式，只需作以下设定：

\starttyping[option=TEX]
\setupcombinedlist[content][alternative=c]
\stoptyping
\midaligned{%
  \clip[width=\textwidth,height=6cm,voffset=3cm]{%
    \externalfigure[14/toc-2.pdf][width=\textwidth,frame=on]%
  }%
}
\blank
\noindent 目录列表样式参数 \type{alternative} 有 \type{a}，\type{b}，\type{c}，\type{d} 四个值可选，默认是 \type{b}。本文档目录使用的是 \type{d}。

\type{\setupcombinedlist} 亦可用于指定可出现在目录列表中的标题级别，例如

\starttyping[option=TEX]
\setupcombinedlist[content][list={chapter,section}]
\stoptyping

注意，当 \type{\placecontent} 出现在 \type{\chapter} 之后时，生成的目录仅针对该章之内的各节。若是写书，需将 \type{\placecontent} 放在 \type{frontmatter} 环境，例如：

\starttyping[option=TEX]
\startfrontmatter
\title{目录}
\placecontent
\stopfrontmatter
\stoptyping

\noindent 可对全篇被列入目录列表的章节生成目录。

使用 \type{\setuplist} 可对出现在目录列表中相应级别的标题样式分别予以设定，例如

\starttyping[option=TEX]
\setuplist[chapter]
          [alternative=a,
           before={\blank[halfline]},after={\blank[halfline]},style=bold]
\setuplist[section]
          [alternative=d,style=normal,pagestyle=smallbold]
\stoptyping

\section{让无编号标题进入目录}

\CONTEXT\ 默认不允许无编号标题出现在目录中，但是倘若对无编号标题，例如 \type{\title} 作以下设定

\starttyping[option=TEX]
\setuphead[title][incrementnumber=list]
\stoptyping

\noindent 之后便可将 \type{\title} 添加到目录列表，即

\starttyping[option=TEX]
\setupcombinedlist[content][list={title,chapter,section}]
\stoptyping

需要注意的是，在 \type{frontmatter} 环境中放置目录列表时，若使用以下代码

\starttyping[option=TEX]
\startfrontmatter
\title{目录}
\placecontent
\stopfrontmatter
\stoptyping

\noindent 由于此时 \type{\title} 已被列入目录列表，因此 \type{\title{目录}} 本身会出现在目录列表中。为避免这一问题，需要为目录页单独定义一个标题。\CONTEXT\ 支持我们定义自己的标题，例如

\starttyping[option=TEX]
\definehead[TOC][title]
\stoptyping

\noindent 定义了一个新的标题 \type{\TOC}，它与 \type{\title} 的样式相同。在 \type{frontmatter} 环境中使用 \type{\TOC}：

\starttyping[option=TEX]
\startfrontmatter
\TOC{目录}
\placecontent
\stopfrontmatter
\stoptyping

\noindent 由于我们并未将 \type{\TOC} 列入目录列表，因此上述问题得以解决。

\section{书签}

对于内容较多的 PDF 文档，提供书签（Bookmark）可更加便于他人阅读。书签通常显示于 PDF 阅读器的侧栏，如图 \in[13-bookmarks] 所示，点击某个书签便可跳转至其关联的页面。

\placefigure[here][13-bookmarks]{PDF 书签}{\externalfigure[14/bookmarks.png][width=.6\textwidth]}

为 \ConTeXt\ 生成的 PDF 文件制作书签，非常简单，只需在样式文件中添加以下语句，

\starttyping[option=TEX]
\setupinteraction[state=start,focus=standard]
\setupinteractionscreen[option=bookmark]
\placebookmarks[title,chapter,section][title,chapter]
\stoptyping

\noindent 其中，\type{\setupinteraction} 用于开启 PDF 的用户交互特性。\type{\setupinteractionscreen} 用于设定 PDF 文件被阅读器打开后，以何种形式如何呈现在屏幕上，若其 \type{option} 值为 \type{bookmark}，则文件打开后，会自动开启阅读器的侧边栏并显示书签；若设置 \type{option} 为 \type{max}，则文件在被打开后会全屏显示。上述 \type{\placebookmarks} 语句的用途是设置可出现在书签栏的标题级别，且仅允许 \type{\title} 和 \type{\chapter} 级别的标题，其子标题列表可被展开。

需要注意的是，\CONTEXT\ 同样默认无编号标题不被列入书签，但是倘若做以下设定

\starttyping[option=TEX]
\setuphead[title][incrementnumber=list]
\stoptyping

\noindent 则 \type{\title} 亦可出现在书签列表中。

还需要注意一点， 书签功能取决于你所用的 PDF 阅读器是否支持。此外，你的 PDF 阅读器可能会将 \ConTeXt\ 生成的书签视为索引（Index），而其本身则提供了另一个叫作书签的功能，允许用户手动在侧边栏为文档的某一页建立链接，与 \CONTEXT\ 的书签原理相同。

\section[reference]{引用}

在本文档的插图、表格、数学公式等章节中，已简略介绍了 \CONTEXT\ 引用的用法。\CONTEXT\ 的标题和列表也支持引用。例如，本节的标题对应的排版命令是

\starttyping[option=TEX]
\section[reference]{引用}
\stoptyping

可以在文章几乎任何一个位置，像下面这样引用本节：

\starttyping[option=TEX]
我在 \at[reference] 页 \in[reference] 节\about[reference]中的一些内容。
\stoptyping

\noindent 结果为
\blank[line]
\blueframed{我引用了本文档 \at[reference] 页 \in[reference] 节\about[reference]中的一些内容。}
\blank[line]

使用 \type{\textreference} 可在文档几乎任何位置插入引用。例如

\starttyping[option=TEX]
我在此处放置了一个引用\textreference[myref]{一个引用}。
\stoptyping
\blank[line]
\blueframed{我在此处放置了一个引用\textreference[myref]{一个引用}。}
\blank[line]
\noindent 注意，一个引用，其内容是不会显示在排版结果中的。然后在文档某处使用该引用，

\starttyping[option=TEX]
我在此处使用一个引用，它是 \at[myref] 的「\in[myref]」。
\stoptyping
\blank[line]
\blueframed{我在此处使用一个引用，它是第 \at[myref] 页的「\in[myref]」。}
\blank[line]

如果你希望一个引用，其内容不仅出现在排版结果中，且想给他加个外框，只需定义一个宏来帮助你实现这一需求。例如

\starttyping[option=TEX]
\def\framedref[#1]#2{\inframed{#2}\textreference[#1]{#2}}
\stoptyping
\starttyping[option=TEX]
我在此处放置了一个引用\textreference[myref]{一个引用}。
\stoptyping
\blank[line]
\def\framedref[#1]#2{\inframed{#2}\textreference[#1]{#2}}
\blueframed{我在此处放置了\framedref[myref]{一个引用}。}
\blank[line]

\section{索引}

索引通常放在 \type{backmatter} 环境，即附在书的正文之后，

\starttyping[option=TEX]
\startbackmatter
\title{索引}
\placeindex
\stopbackmatter
\stoptyping

\noindent 以便检索在正文某页检索一些关键词这些关键词在正文中需由 \type{\index} 给出。例如

\starttyping[option=TEX]
我在此演示 \type{\placeindex}\index[placeindex]{\type{\placeindex}}
和 \type{\index}\index[index]{\type{\index}} 的用法。
\stoptyping
\blank[line]
\blueframed{我在此演示 \type{\placeindex}\index[placeindex]{\type{\placeindex}} 和 \type{\index}\index[index]{\type{\index}} 的用法。}
\blank[line]

\noindent \tex{placeindex} 产生的结果为

\blank[line]
\blueframed{\placeindex}
\blank[line]

\section{小结}

用 \CONTEXT\ 排版一本书并不难，难的是书该如何写。