先写作,后排版

garfileo

注意:阅读本文之前请确定已经至少读过『睦邻友好的 ConTeXt Standalone 』一文。

先写作,后排版。换言之,内容为重,排版次之。这个道理无需多言,使用 ConTeXt 排版你的个人文档时,这一点尤为重要。因为你需要先用 ConTeXt 写文档,然后用 ConTeXt 排版文档。也就是说,你要将 ConTeXt 的所有宏分成两类,一类是用来写文档的,另一类是用于文档排版的。

写作

以科技论文为例。要写一篇科技论文,考虑的是标题、作者信息、引言、正文、结论、参考文献以及论文摘要这几部分内容的确定,这就是写作。这个过程如果用 ConTeXt 宏来表示,那就是:

\starttext

\title{...} % 标题
\author{...} % 作者信息

\section{...} % 引言
% 引言内容

\section{...} % 正文第一节
% 正文第一节内容
... ... ... % 段落 1

... ... ... % 段落 2

... ... ...

\section{...} % 正文第二节
% 正文第二节内容

... ... ...

\section{...} % 结论
% 结论内容

\placepublications % 生成参考文献

\stoptext

对上述文档内容略做说明:

  • % 是所有 TeX 的注释符,亦即 % 之后的文本会被 TeX 忽略,也意味着这些文本是可有可无的。

  • \starttext\stoptext 之间的文本,即是你要写作的内容,也是是 ConTeXt 要排版的内容。

  • \title{...} 表示文章的标题,将 ... 替换成标题文本即可。

  • \section{...} 是『章节』中的『节』的标题。节标题后面的内容就是这一节的内容,即『段落』。ConTeXt 用空行对文本进行分段。

  • \placepublications 用于放置参考文献列表。

可将上述文档内容作为科技论文最基本的写作模板。我们写论文的过程,就是为这个模板填充内容的过程。

现在可以将上述内容保存至一个文本文件,姑且称之为 simplicity.tex,然后尝试编译它:

$ . ~/context/tex/setuptex # 该命令仅在当前终端中执行一次即可
$ context simplicity

结果你会遭遇 \author\placepublications 等宏未定义的错误。没有关系,我们可以先简单的定义它们,即在 \starttext 之前放置以下代码:

\def\author#1{#1}
\def\placepublications{}

\def 是 TeX 提供的定义其他宏的宏。如果现在就想了解 \def 的一些细节,可以阅读『TeX 的宏 \ 第一集』。

然后即可编译通过。用 pdf 阅读器打开所生成的 simplicity.pdf,看到的应该类似下面图中的结果。请对照 simplicity.tex 的内容认真的在自己的大脑中建立 simplicity.tex 与 simplicity.pdf 之间的映射关系。

simplicity.tex 的编译结果

如果你熟悉科技论文的格式,你会发现 simplicity.tex 中未出现论文的摘要。之所以如此,是因为摘要通常是在文章写完后才写的。

现在假设文章已经写完了,那么就在作者与引言之间插入摘要:

\author{...} % 作者信息
\abstract{...} % 摘要
\section{...} % 引言
% 引言内容

然后再重新编译 simlicity.tex,context 命令便会抱怨 \abstract 未定义,那么好吧,我们再用 \def 定义一下它:

\def\abstract#1{#1}

以上过程所得的结果是 ConTeXt 默认设置的排版结果,非常的简陋,但是那有什么关系?我们现在是在写作,并非排版。

重要的事重复三遍

写作的过程不考虑排版,不考虑排版,不考虑排版。

甚至,我们可以随心所欲的定义一些只是原样输出文本的宏来满足文档格式上的需求,例如上一节所定义的 \authorplacepublications\abstract 宏。

我们可以一边在 simplicity.tex 中创造内容,一边用 context 生成 simplicity.pdf 来查看结果。这里顺便推荐一下 evince 阅读器,每当 context 更新了 pdf 文件,evince 会自动刷新自己所打开的 pdf。如果没有 evince,你应该找到类似它这样的软件。texworks 也不错,它不仅具备可动态刷新的 pdf 查看功能,同时也提供了 .tex 文档的编辑器。我只是因为喜欢用 Emacs 进行文档编辑,所以未使用 texworks。

当你对 ConTeXt 中用于写作的宏足够熟悉之后,是不需要去查看 pdf 输出结果的。

之所以提倡写作的过程不考虑排版,是因为我们有足够的自信能够在写作过程结束后总是能够完成符合既定要求的排版,因为任何形式的排版都应该为内容的良好呈现而服务。如果在写作过程中为了迎合排版,这是对写作的一种扭曲。

内容与样式的分离

只有秉持写作过程中不考虑排版,才能够实现内容与样式的分离,才能够实现一份内容对应着多种样式的输出,就像 HTML + CSS 那样。

更何况 ConTeXt 的宏要比 HTML 标记简洁得多,仅从 ConTeXt 不需要一大堆 <p>...</p> 这一点就可以证明。虽然 ConTeXt 的宏名要比 HTML 标记名长得多,但是长的宏名具备自解释性而且它们并非频繁使用,因此直接用 ConTeXt 写文档是完全可行的。

用于写作的宏

除了上述提到的一些宏,其他在写作中频繁使用的宏,若逐一列举,味同嚼蜡,还是直接以一个比较全面的实例来说明为好。

在文章内容的写作方面,ConTeXt 与 MarkdownreStructuredTeXt 这类专注于写作内容而不关心排版的标记文本有些类似。因此我用 ConTeXt 写了与本文在结构上近乎相当的一份 .tex 文件,只要你理解 Markdown(segmentfault.com 的用户对此应该不陌生),那么结合本文的内容结构,这份 .tex 文档中的大部分内容应该不难理解,这份文档本身及其所生成的 pdf 文件可从我的百度网盘下载,地址: http://pan.baidu.com/s/1jG1ukS2

\usemodule[zhfonts]
\setupwhitespace[big] % 段间距
\setupinterlinespace[line=1.5em] % 行间距
\setupinteraction[state=start] % 启用超级链接

\starttext
\title{先写作,后排版}

先写作,后排版。换言之,内容为重,排版次之。这个道理无需多言,使用 \ConTeXt\ 排版你的个人文档时,这一点尤为重要。因为你需要先用 \ConTeXt\ 写文档,然后用 \ConTeXt\ 排版文档。也就是说,你要将 \ConTeXt\ 的所有宏分成两类,一类是用来写文档的,另一类是用于文档排版的。

\section{写作}

以科技论文为例。要写一篇科技论文,考虑的是标题、作者信息、引言、正文、结论、参考文献以及论文摘要这几部分内容的确定,这就是写作。这个过程如果用 \ConTeXt\ 宏来表示,那就是:

\starttyping
\starttext

\title{...} % 标题
\author{...} % 作者信息

\section{...} % 引言
% 引言内容

\section{...} % 正文第一节
% 正文第一节内容
... ... ... % 段落 1

... ... ... % 段落 2

... ... ...

\section{...} % 正文第二节
% 正文第二节内容

... ... ...

\section{...} % 结论
% 结论内容

\placepublications % 生成参考文献

\stoptext
\stoptyping

对上述文档内容略做说明:

\startitemize[1]
\item \type{%} 是所有 TeX 的注释符,亦即 \type{%} 之后的文本会被 TeX 忽略。
\item \type{\starttext} 与 \type{\stoptext} 之间的文本,即是你要写作的内容,也是是 \ConTeXt\ 要排版的内容。
\item \type{\title{...}} 表示文章的标题,将 \type{...} 替换成标题文本即可。
\item \type{\placepublications} 用于放置参考文献列表。
\stopitemize

可将上述文档内容作为科技论文最基本的写作模板。我们写论文的过程,就是为这个模板填充内容的过程。

现在可以将上述内容保存至一个文本文件,姑且称之为 simplicity.tex,然后尝试编译它:

\starttyping
$ . ~/context/tex/setuptex # 该命令仅在当前终端中执行一次即可
$ context simplicity
\stoptyping

结果你会遭遇 \type{\author}、\type{\placepublications} 等宏未定义的错误。没有关系,我们可以先简单的定义它们,即在 \type{\starttext} 之前放置以下代码:

\starttyping
\def\author#1{#1}
\def\placepublications{}
\stoptyping

\useURL[TeX-macro][http://garfileo.is-programmer.com/2010/5/21/macro-of-tex.18296.html][][\TeX 的宏 \type{\ } 第一集]

\type{\def} 是 TeX 提供的定义其他宏的宏。如果现在就想了解 \type{\def} 的一些细节,可以阅读『\from[TeX-macro]』。

然后即可编译通过。用 pdf 阅读器打开所生成的 simplicity.pdf,看到的应该类似下面图中的结果。请对照 simplicity.tex 的内容认真的在自己的大脑中建立 simplicity.tex 与 simplicity.pdf 之间的映射关系。

\placefigure[][here]{simplicity.tex 的编译结果}{\framed{\externalfigure[simplicity.pdf][height=10cm]}}

如果你熟悉科技论文的格式,你会发现 simplicity.tex 中未出现论文的摘要。之所以如此,是因为摘要通常是在文章写完后才写的。

现在假设文章已经写完了,那么就在作者与引言之间插入摘要:

\starttyping
\author{...} % 作者信息
\abstract{...} % 摘要
\section{...} % 引言
% 引言内容
\stoptyping

然后再重新编译 simlicity.tex,\type{context} 命令便会抱怨 \type{\abstract} 未定义。那么,好吧,我们再用 \type{\def} 定义一下它:

\starttyping
\def\author#1{#1}
\stoptyping

以上过程所得的结果是 \ConTeXt\ 默认设置的排版结果,非常的简陋,但是那有什么关系?我们现在是在写作,并非排版。

\section{重要的事重复三遍}

写作的过程不考虑排版,不考虑排版,不考虑排版。

甚至,我们可以随心所欲的定义一些只是原样输出文本的宏来满足文档格式上的需求,例如上一节所定义的 \type{\author},\type{placepublications} 与 \type{\abstract} 宏。

我们可以一边在 simplicity.tex 中创造内容,一边用 \type{context} 生成 simplicity.pdf 来查看结果。这里顺便推荐一下 evince 阅读器,每当 \type{context} 更新了 pdf 文件,evince 会自动刷新自己所打开的 pdf。如果没有 evince,你应该找到类似它这样的软件。texworks 也不错,它不仅具备可动态刷新的 pdf 查看功能,同时也提供了 .tex 文档的编辑器。我只是因为喜欢用 Emacs 进行文档编辑,所以未使用 texworks。

当你对 \ConTeXt\ 中用于写作的宏足够熟悉之后,是不需要去查看 pdf 输出结果的。

之所以提倡写作的过程不考虑排版,是因为我们有足够的自信能够在写作过程结束后总是能够完成符合既定要求的排版,因为任何形式的排版都应该为内容的良好呈现而服务。在写作过程中过于迎合排版,这是对写作的一种扭曲。

\section{内容与样式的分离}

只有秉持写作过程中不考虑排版,才能够实现内容与样式的分离,才能够实现一份内容对应着多种样式的输出,就像 HTML + CSS 那样。

更何况 \ConTeXt\ 的宏要比 HTML 标记简洁得多,仅从 \ConTeXt\ 不需要一大堆 \type{<p>...</p>} 这一点就可以证明。虽然 \ConTeXt\ 的宏名要比 HTML 标记名长得多,但是长的宏名具备自解释性而且它们并非频繁使用,因此直接用 \ConTeXt\ 写文档是完全可行的。

\section{ConTeXt 中用于写作的宏}

除了上述提到的一些宏,在写作中频繁使用的宏都有……逐一列举,味同嚼蜡,还是直接以一个比较全面的实例来说明为好。

\useURL[example-01][http://pan.baidu.com/s/1c0FJADU]
我用 ConTeXt 写了与本文在结构上近乎相当的一份 .tex 文件并将其生成为 pdf 文件,它们可从我的百度网盘下载,地址:\from[example-01]

下载后,请与 [markdown 文本格式](http://segmentfault.com/markdown)进行一些对比,然后应该差不多能够明白 ConTeXt 中常用的写作宏的基本用法。

\stoptext

值得注意的是,虽然我强调要先写作,后排版,但上面的示例文件中的三行代码:

\setupwhitespace[big] % 段间距
\setupinterlinespace[line=1.5em] % 行间距
\setupinteraction[state=start] % 启用超级链接

它们已经违反了写作过程中不排版的原则,但是我觉得调整一下排版结果中的段落与文本行的间距,改善排版结果的可阅读性,这样更有利于排查写作中出现的逻辑或字句错误。

阅读 3.2k

5.7k 声望
1.8k 粉丝
0 条评论
你知道吗?

5.7k 声望
1.8k 粉丝
文章目录
宣传栏