快速业务通道

TeX 排版中文字体嵌入问题(转载)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-19
,我比较相信他解决问题的效率.有时候一个 bug 提交给他他不到几十分钟就已经 fix 了.结果 Taco 看了好几天,一无所获,于是,Taco 帮助我把信转给了当今世界上几个重要的大牛,准备来专家会诊.这个会诊的医师阵容庞大,技术高超,随便举几个人:dvipdfmx 开发者 Cho,LuaTeX 开发者 Taco,外加 XeTeX 开发者 Jonathan Kew.不久以后,话说解铃还需系铃人,Cho 找到了一个可能的问题.他把 pdf 文件解开,仔细观察 cairo 输出了 LuaTeX 输出中字体嵌入部分的参数,发现某个数值 StemV,相差悬殊.使用编辑器修改解开的 pdf,将 StemV 调整到相同,两个 pdf 文件顿时就差不多了(虽然还有些许差别,但是这个就是最重要的因素之一).

问题顿时有了突破性的进展,比较 LuaTeX 产生的 pdf 和 dvipdfmx 产生的 pdf,发现 LuaTeX 的 StemV 数值大得多,不久 Taco 就发现,这是 LuaTeX 的某个 bug 导致的.该 bug 当天就得到了修正,这样产生的 pdf 就和 dvipdfmx 一样了.但是修正以后事实上得到的 pdf 依然很细.cairo 产生的 pdf 文件,一律取成了相同的默认数值,看上去宋体表现还不错.而 dvipdfmx 的 TrueType 字体的 StemV 数值到底是怎么产生的呢?它经验性地依赖于一个拟合公式:

stemv = (os2->usWeightClass/65)*(os2->usWeightClass/65) 50

其中,os2->usWeightClass 是字体中 pfmtable 中的信息,是一个数值.这个数值在字体设计的时候就被定了下来,一般和字体的 weight 有关:比如 Light 就是 300,500 表示 Medium,而 800 则表示 Extra Bold.该数值决定了 StemV 的数值,也就是说,如果这个字体越粗,那么 StemV 数值就越大,在阅览器中渲染,就会越虚,合情合理.但是当我们打开中易公司的中文字体,方正公司的字体,还有华文字体,我们失望地发现,他们都取了同样的数值:400.

于是这个问题,如果扯开拟合公式本来结果就偏大不说,其他的就应该怪罪到中文字体设计上来了.像 Simsun 字体,并不比 AdobeSongStd-Light 粗多少,甚至更细,取一个 400 的值本来就不合理.其次,中易字体不管黑体还是宋体,都取相同的数值,怎么都说不过去.相同的也发生在方正字体上,方正宋黑,方正书宋,小标宋,也都取相同的数值.这个基本上是不可能让软件来自动判断的问题,本该是字体公司仔细勘酌的,现在却被信手赋值.按照现在的状况,软件不可能自动判断这个值,黑体就是比宋体取值大.

解决这个问题,也只能让用户自己设定了,不久以后 LuaTeX 用户可以通过修改 Fonttable 来实现,dvipdfmx 开发者称,今后会在 map 文件中,让用户指定数值. XeTeX 开发者估计可能会像先前指定伪粗,伪斜一样的语法来定义这个数值,不过目前没有收到任何他的计划.这个估计就是我们能采用的唯一不是办法的办法,不过终归而言,这个问题被解决了,今后只要仔细调整参数,就能得到渲染效果得当的 pdf 文件.

类似的中文字体乱设参数的例子还有很多,此前 yindian 同学,提到了XeTeX 的一个 bug,导致没有办法产生正确的 pdf,后来发现这个根本不是 bug,完全也是字体设计公司乱设字体参数导致的.后来 jjgod 同学 hack 了一下 xdvipdfmx 总算差不多解决该问题.该问题的详细信息,请参考 XeTeX 的邮件列表,该主题内容在http://tug.org/pipermail/xetex/2007-October/007536.html,和后续的讨论.

中文字体设计不拘小节也让我也想到了另一个问题,用先前,中文用户使用 XeTeX,需要频繁地切换中英文字体,后来 XeTeX 开发者不得不提供了一个机制来让字体切换变得不那么折腾.而我和 ConTeXt 开发者交流中文排版问题,还要煞费苦心地讲怎么切换,需要编程实现复杂的虚拟字体机制来实现.这个都归罪于中文字体普遍地缺乏高质量的英文部分,仔细看看 simsun 或者 simhei 的英文部分,就可以看出有多么夸张了.

如果说这个问题的原因是中国的字体公司,向来没

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号