日期:2013-09-30  浏览次数:20699 次

TeX 排版中文字体嵌入问题,兼谈不拘大节的中文字体设计

原文:http://yulewang.spaces.live.com/blog/cns!5C815C994ABB661E!262.entry

低于 18 周岁的小朋友们请不要看此文,会被吓到的。如果你和中国的字体公司有联系,请把我所描述的问题转告给他们。

考完作文后,在上海小歇,除了吃喝玩乐加上逛街还有被导师虐着写文章,本人看两眼G词以外,就是在尝试处理中文 TeX 用户几年来不断抱怨的关于 TeX 产生的 pdf 文档中文字体看上去太细的问题。

这个问题的来龙去脉是这样的。很久以前,大家都需求用 dvips 或者 dvipdfm 来转换 TeX 产生的 dvi 文件为 pdf 文件,这个路径很麻烦,需求把一个中文 trueype 字体转为大约一百多个 Type1 字体,然后再把这些字体的 Subfont 给嵌入到文档中。南韩的一个数学家 Cho,由于不满意 TeX 的这种情况,因此写了一个 dvipdfm 程序的扩展,名为 dvipdfmx。dvipdfmx 可以直接嵌入 CID 的 TrueType 和 OpenType 字体,不需求把字体分割成许多个 subfont,产生的 pdf 文件小巧,而且比原先的方法在阅览器下渲染速度快,质量比较高。因此得到了中日韩用户的喜爱。但是许久以来,中文用户不断抱怨一个问题,就是貌似由 dvipdfmx 产生的文档,在 Adobe 公司官方的 Acrobat Reader 下,显得发虚,严重地影响阅读,而相反的字体,如果不用 dvipdfmx,比如使用 cairo、quartz 或者 word2007 进行转化,产生的 pdf 就没有这个问题。如果文章中都是中文,那只不过是难以阅读而已。而如果是中文和英文混排的,而英文部分又比较正常,比如使用了 Times 字体或者 Palatino 字体,则整个 type block 就显得斑驳,一眼看到的都是突出的英文,所以不断以来,我们都建议用户使用本来就细得要命的默认的 Computer Modern 字体,以使得文档不至于失调。

几年来,从来没有人认真地研讨过这个问题,南韩的用户都觉得 dvipdfmx 产生的 pdf 质量不错,由于他们使用的随 KTUG 定制的发行版发布的字体本来就比较粗,而中国的用户如果使用 Windows 下的中易公司的宋体,即 simsun,则相当不能忍,方正公司的字体,比如书宋,则稍微好一点,但怎样也好不过 Adobe 公司的 OpenType 字体 Adobe Songti Std Light。若干年前,jjgod 同学写过一篇文章比较了几十个中文字体,他是使用了 dvipdfmx 输出的结果的视觉效果来评价字体的质量,结果一个相当好的字体,方正博雅宋,由于在阅览器中显示过细,被他认为不如方正书宋。而几年当前,这个问题被泛化,当今,TeX 正在走向国际化,如今的 TeX 曾经支持 Unicode 和各种高级的字体格式,也全面从 dvi 时代过渡到 pdf 时代,目前两大炒作得很热的 TeX 引擎,都和 dvipdfmx 扯上了关系。 XeTeX 直接使用了 dvipdfmx 的一个变种,xdvipdfmx 来产生 pdf,而 LuaTeX,则用 dvipdfmx 的代码替换掉部分产原先 pdfTeX 的代码,来产生 pdf。这就导致,目前所有的先进的 TeX 系统,在 CID 字体嵌入方面的代码,是近亲关系,所有产生的中文 pdf,都虚得离谱,LuaTeX 尤甚。

我在去年和今年,不断使用 LuaTeX 引擎和 ConTeXt 格式,写各种包括论文以内的文档,在使用的过程中,发现了不少问题,就开始和开发者交流。几个月来,报告了不少 bug,其中一些,还给出了补丁。此外,我和 ConTeXt 开发者 Hans 等 TeX 专家讨论,试图让最新的 ConTeXt 和 LuaTeX 来支持中文排版。其他事情,还包括为ConTeXt 的用户们提供 FreeBSD 操作系统的 TeX 二进制文件。因此,我和 LuaTeX 与 ConTeXt 的开发者(其实是同一拨人),有很频繁的联系,也彼此保持着不错的关系。开发者们也很勤快地修复着我汇报的各种 bug,这也使我能够很好地使用这些软件进行各种文档(学术论文、技术文档)的排版。今年考完作文后,我暂时可以小歇一下,同时由于 LuaTeX 的开发者们刚刚搞定了一项新功用,mplib,也有空余的时间。因此,我们就有时间来讨论和处理这个由来已久的问题。

我一开始写信给 LuaTeX 的开发者,Taco Hoekwater,之所以不写给 dvipdfmx 开发者 Cho 而发给他,由于我和他熟,而且 Taco 这两年来,勤勤恳恳地写代码,我比较置信他处理问题的效率。有时候一个 bug 提交给他他不到几十分钟就曾经 fix 了。结果 Taco 看了好几天,一无所获,于是,Taco 协助我把信转给了当今世界上几个重要的大牛,预备来专家会诊。这个会诊的医师阵容庞大,技术高超,随便举几团体:dvipdfmx 开发者 Cho,LuaTeX 开发者 Taco,外加 XeTeX 开发者 Jonathan Kew。不久当前,话说解铃还需系铃人,Cho 找到了一个可能的问题。他把 pdf 文件解开,细心观察 cairo 输出了 LuaTeX 输出中字体嵌入部分的参数,发现某个数值 StemV,相差悬殊。使用编辑器修正解开的 pdf,将 StemV 调整到相反,两个 pdf 文件登时就差不多了(虽然还有些许差别,但是这个就是最重要的要素之一)。