睦邻友好的 ConTeXt Standalone

阅读本文之前,最好已经读过『序幕有些长

简介

这个星球上最复杂庞大的软件可能不是 Unix-like 与 Windows 这些操作系统,像 TeX Live 这种网罗了几乎所有的 TeX 及其周边工具的软件体系(自然也是包括 ConTeXt 的)也差不多拥有一个人一生也无法穷尽其一切的复杂性。这种复杂性也许并非来自开发者们孜孜不倦的努力,而是来自他们的耐心经营,于是时间就帮助他们慢慢的让系统膨胀,让复杂涌现。于是系统就会尽力保持稳定,其结果也就变得审慎与保守。

ConTeXt Standalone 仅关注 ConTeXt 自身的完整性,能够为 ConTeXt 自身的运行提供一个自成一体的最小运行环境——TeX 引擎、宏包、周边工具、字体以及文档,这些加起来不过占据 200 MB 左右的空间,而且只要你愿意,可以让它变得更小一点——我曾经制作过一份不到 20 MB 的只支持 Plain TeX 的 LuaTeX 运行环境。所以,这是 ConTeXt Standalone 的前身叫做『ConTeXt Minimals』的原因。

安装

在 Linux 中通过网络安装 ConTeXt Standalone 的过程非常简单,如果将创建目录与下载文件也算作安装步骤,那么只需三步:

$ mkdir ~/context ; cd ~/context # 可以换成你喜欢的目录
$ wget http://minimals.contextgarden.net/setup/first-setup.sh
$ sh ./first-setup.sh --engine=luatex

上述步骤可将 ConTeXt MkIV 安装到 ~/context 目录。first-setup.sh 是个 Shell 脚本,它的 --engine=luatex 选项表示只安装 MkIV,不安装 MkII 文件。对于 ConTeXt 的新用户而言,安装 MkII 的意义不大。

first-setup.sh 也能用于 ConTeXt MkIV 的升级。升级步骤只是比安装步骤省去创建 context 目录的环节,即:

$ cd ~/context
$ wget http://minimals.contextgarden.net/setup/first-setup.sh
$ sh ./first-setup.sh --engine=luatex

测试

接下来,用你喜欢的文本编辑器,在 /tmp 目录建立一份名为 hello.tex 的文件,其内容如下:

\starttext
\title{Hello \ConTeXt}

Here I come!
\stoptext

然后即可使用 context 命令将 hello.tex 编译为 hello.pdf 文件。在调用 context 命令之前,需要开启 ConTeXt 运行环境,否则 Shell 不知道 context 命令对应的可执行文件位于何处。开启 ConTeXt 运行环境的命令是:

$ source ~/context/tex/setuptex

setuptex 文件是一份 Shell 脚本,其中定义了 PATH 变量,而 Shell 是通过 PATH 变量的值在系统搜寻可执行文件的。上述的 source 命令可使得这些环境变量在当前 Shell 环境中生效。也就是说,上述命令只需在当前终端中执行一次即可,执行一次即可,执行一次即可……重要的事重复三遍!

开启了 ConTeXt 运行环境之后,即可在当前 Shell 中使用 context 编译 hello.tex 文件:

$ context hello  # 不需要输入 hello.tex 的后缀 ".tex"

然后使用 PDF 阅读器,例如 evince,查看生成的 pdf 文件:

$ evince hello.pdf

一切就这么简单!

如果 ConTeXt Standalone 不采用这种运行方式,那么势必会造成天无二日,土无二主的局面。因为如果你的系统装有 TeX Live,那么它与 ConTeXt 有交集的那部分构件可能会存在版本的不同,从而因为同名而发生冲突。例如,TeX Live 中有一个 luatex,而 ConTeXt MkIV 中也有个 luatex。由于 TeX Live 的发行周期是 1 年,而在这一年中 ConTeXt MkIV 中的 luatex 的版本可能已经更新了多次,因此它们虽然都有 luatex,但是它们是不同的 luatex

虽然 ConTeXt 秉持睦邻友好的原则,仅在运行 context 之前开启运行环境,但还是有些繁琐了一些,可以利用 Shell 脚本简化这一过程。在 /usr/local/bin 目录建立一份名为 ctx 的 Bash 脚本,内容如下:

#!/bin/bash
source /opt/context/tex/setuptex /opt/context/tex
context $@

然后使得ctx 具备可执行权限:

$ sudo chmod +x /usr/local/bin/ctx

以后可以直接使用 ctx 命令去编译 .tex 文件,例如:

$ ctx hello

ConTeXt Standalone 可以跨 GNU/Linux、MS Windows 以及 Mac OS X 等平台运行。关于它的更多的介绍,请参考:http://wiki.contextgarden.net/ConTeXt_Standalone

中文支持

现在,ConTeXt Standalone 能够初步支持中文排版,前提是需要向它提供中文字体。因为适合排版使用的中文字体,目前几乎没有自由或免费使用的字体,所以 ConTeXt Standalone 从法律上无法将我们在 MS Word 中习惯使用的那些中文字体打包进来。

现在假设你具有 simsun.ttf 这份字体文件,它就是 MS Word 中用的最多的宋体。要将这个字体安装到 ConTeXt 中,最简单的办法在你的 ConTeXt 安装目录中创建字体目录,专门用于存放中文字体。例如:

$ mkdir -p ~/context/tex/texmf-local/fonts/truetype/non-free
$ cp simsun.ttf ~/context/tex/texmf-local/fonts/truetype/non-free

然后刷新一下 ConTeXt 的字体数据信息,相当于将新安装的字体『注册』到 ConTeXt 的字体数据表中,以便它能够查找到字体文件。

$ mtxrun --script fonts --reload

然后用下面这份 test-zh-fonts.tex 验证所添加的 simsun.ttf 是否可用:

\definefontfamily[myfont][serif][nsimsun]
\setscript[hanzi]
\setupbodyfont[myfont]

\starttext

测试是否支持中文字体。

\stoptext

上述第一行代码便作加载 simsun.ttf 之用。要注意的是,ConTeXt 是使用字体名来加载字体,而非字体文件。要查看所安装的字体文件对应的字体名,例如 simsun.ttf,可使用以下命令:

mtxrun --script fonts --list --all

输出结果类似:

...                                  ...                               ...
kaiti                                kaiti                             simkai.ttf
kaitinormal                          kaiti                             simkai.ttf
kaitiregular                         kaiti                             simkai.ttf
nsimsun                              nsimsun                           simsun.ttf
nsimsunnormal                        nsimsun                           simsun.ttf
nsimsunregular                       nsimsun                           simsun.ttf
...                                  ...                               ...

从输出结果的第一列中找出 simsun.ttf 对应的字体名,然后在 test-zh-fonts.tex 中使用。如果一份字体文件对应多个字体名,随便取一个字体名用即可。

目前,对于不怎么讲究的中文排版,ConTeXt 目前对中文的支持勉强够用。如果希望对中文标点符号的排版做一些控制,例如相邻标点的间距调整与文本左右边界处标点与边界对其等,ConTeXt 便无能为力了。为了使得 ConTeXt 能对中文支持的更好一些,我写了一个 zhfonts 模块,它能够解决一些问题,但并非全部问题。有关 zhfonts 的安装与用法请参考:http://garfileo.is-programmer.com/posts/23740

阅读 2.6k

推荐阅读
while(1) { }
用户专栏

NULL

240 人关注
125 篇文章
专栏主页