zhfonts:ConTeXt MkIV 中文支持的 Hacking

背景

如『睦邻友好的 ConTeXt Standalone』文中最后一节所述,对于不怎么讲究的中文排版,ConTeXt 目前对中文的支持勉强够用。目前,ConTeXt MkIV 仅支持:

  • 载入中文字体,将其嵌入 PDF 文件;

  • 对中文字体中的西文字符,能够指定替换字体,即 Fallback 机制。

如果仅具有上述单薄的功能,那么在中文排版方面 ConTeXt MkIV 甚至不如 MS Word。举几个例子来说明这一点。

标点间距

看下图, ConTeXt MkIV 尚无法对相邻的标点符号的间隔距离进行微调。虽然这个问题是中文字体设计上的缺陷——标点的宽度与字宽相同而导致的,但是文字排版软件本应给出方便的特定字距调整机制。

标点符号间距无压缩时的排版结果

下图是对标点间距进行压缩后的效果,可与上图对比一下。

标点符号间距压缩后的排版结果

标点在文本边界的伸出

看下图,左引号在左侧未能与其下面文本行的左侧边界对齐,导致段首出现“缺损”。

文本左边界标点无伸出的排版结果

作为对比,下图是经过微调使得左引号向左偏移半个字款后的排版结果。

文本左边界标点无伸出的排版结果

同样,落在右侧边界的标点也应该向右伸。下图截取自《Word 排版艺术》一书,是 Word 无法进行右侧边界标点伸出处理的排版结果。右侧边界竖向看起来,像是被咬去一块。ConTeXt MkIV 对西文标点的边界伸出进行了很好的处理,而中文标点像是后娘养的……右侧边界上的标点排版结果与 MS Word 差不多。

右侧标点未伸出的排版示例

作为对比,下图给出右侧标点伸出的排版示例。

右侧标点伸出的排版示例

hack 的必要性

既然 ConTeXt MkIV 现在对中文排版并不友好,而我们如果容忍这一点,那就真的对不起 Knuth 所说的“我从来也不期盼 TeX 会成为一个万能的排版工具,让大家使用它可以来做一些“快速而脏”的东西;我只是将其视为一种只要你足够用心就能得到最好结果的东西”。

因此,必须对 ConTeXT MkIV 的字体机制进行 hack。

我 hack 的结果就是 zhfonts 模块。zhfonts 项目位于:https://github.com/liyanrui/zhfonts

虽然 http://garfileo.is-programmer.com/posts/23740 已经给出了详细的使用说明,但是我觉得有一份简单点的使用说明会更接地气。

zhfonts 安装与简单用法

假设你的 ConTeXt Standalone 安装在 ~/context 目录。如果不知道怎么安装 ConTeXt Standalone,那只能证明你没有阅读“睦邻友好的 ConTeXt Standalone ”。

安装 zhfonts 的步骤如下:

$ mkdir -p ~/context/tex/texmf-local/tex/context/third
$ cd ~/context/tex/texmf-local/tex/context/third
$ git clone https://github.com/liyanrui/zhfonts.git

装完后,需要使用 context --generate 刷新一下 ConTeXt MkIV 的“文件数据库”,以使得 context 命令在编译 .tex 文件时能够找到 zhfonts 模块文件所在位置。

$ source ~/context/tex/setuptex # 开启 ConTeXt 运行环境
$ context --generate

这样,zhfonts 便安装完毕,但是它还不能用。因为没有中文字体。

安装中文字体

我已将 zhfonts 所用的所有中文字体打包为 fonts.tar.gz 并传至百度网盘,下载地址:http://pan.baidu.com/s/1hrQcI ,提取密码:2wpm

下载 fonts.tar.gz 后,安装字体过程如下:

$ tar zxvf fonts.tar.gz
$ cp -r fonts ~/context/tex/texmf-local/

然后刷新 ConTeXt MkIV 的环境(请确定已开启 ConTeXt MkIV 运行环境),即更新 ConTeXt 的文件数据库以及字体库:

$ context --generate
$ mtxrun --script fonts --reload

测试 zhfonts 是否可用

下面,我给出一份测试 zhfonts 的最小示例:

\usemodule[zhfonts]
\starttext
测试 English 与中文。
\stoptext

再给出一份比较全面又漂亮的 ConTeXt 入门示例,但是你需要去百度网盘下载,地址为:http://pan.baidu.com/s/1c0FJGvI

Just for fun!

结语

我不能担保 zhfonts 的长期有效性。虽然这三年多以来,它虽有小恙,但迄今还算有效。由于 ConTeXt MkIV 的开发还在进行中,因此 zhfonts 也就不可能会稳定下来。我一边担忧 zhfonts 的挂掉,一边希望有更强大的 ConTeXt 中文 hacker 来拯救世界……

zhfonts 模块的一些内幕,请参考:

[0] ConTeXt MkIV 中文标点压缩与边界对齐的处理方案
[1] ConTeXt MkIV 中文标点间距压缩问题的解决方案
[2] CJK 字符结点的判定
[3] 寻找标点符号及其包围盒
[4] 走弯路了
[5] 如何创建 LuaTeX 结点
[6] ConTeXt 模块参数的获取
[7] MkIV:重新做了一份 zhfonts.tex 兼谈 LuaTeX “编程”
[8] zhfonts 有一些更新

阅读 3.2k

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

NULL

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