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 文件顿时就差不多了(虽然还有些许差别,但是这个就是最重要的因素之一)。