zhfonts:ConTeXt MkIV 中文支持的 Hacking

背景

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

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

  • 对中文字体中的西文字符,可以指定替换字体,即 Fallback 机制。node

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

标点间距

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

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

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

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

标点在文本边界的伸出

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

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

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

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

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

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

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

右侧标点伸出的排版示例

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 有一些更新

相关文章
相关标签/搜索