不拘小节的中文字体设计(2)
作者:yulewang 来源:live <-> evil 发布时间:2009-05-21 10:44:00
问题顿时有了突破性的进展,比较 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 的英文部分,就可以看出有多么夸张了。
如果说这个问题的原因是中国的字体公司,向来没有很好的英文字体设计基础,同时对这个问题也不加以重视,那么中文标点的设计,就没有丝毫的可以开罪的地方了,这个问题直接导致用户和开发者都非常为难。我们知道,高质量的中文排版,标点并不是占据一个中文字符的位置,而要比中文字符略小。同时,标点之间需要存在压缩,比如逗号后紧紧跟随的关门引号,需要使用类似 kerning 的特性把两个 glyph 的距离减小。另外,类似破折号和省略号,其实应该放在一个 glyph 中而不应该分开。而现在所有的中文字体的糟糕程度,竟然到所有的标点符号都占用一个中文字符距离的程度。本来这个问题如果中文字体设计得当,使用默认的排版算法,就基本上能够解决一般的中文的排版问题,而现在糟糕的设计就使得排版软件的设计难上加难。首先我们需要重新定义一系列的新算法和新规则,然后需要手工赋值去确定标点的大小和两个标点连在一起时候的压缩程度。更麻烦的是,不同字体中的相同的 glyph,比如逗号或者句号,往往会在这个 box 的不同的位置,大小也会千差万别。调好了中易宋体的冒号和开门引号,把相同的数值使用到中易的隶书中,顿时两个符号就会挤在一起,这就使得如果不针对每一个字体仔细调整,高质量的中文排版就几乎不可能。我寒假和 ConTeXt 的开发者交流中文排版问题时,这个麻烦搞得头都大了,而这个问题本来就是该在字体公司设计字体时就解决的。
排版软件的开发,永远不是一个软件的事情,它牵扯到政府规范,字体设计,文档标准和字体标准的制定。往往如果排版软件不能做出令人满意的结果,很可能是由于其他非排版软件的因素造成的。Adobe 或者 LinoType 大公司出品的英文字体,往往都会有较高的水准,正是因为设计者已经仔细调整好字体中的各项参数,使得用户使用排版软件默认的方案,就能够做出很好的作品,偶尔遇到需要的 glyph 找不到,或者某个 kerning 长度不理想,打开 fontforge 之类的字体软件,也能方便快速地调校从而满足自己的需要。中文字体的设计,离开这个标准还很远很远,有很长一段路要走。
猜你喜欢
- 使用在Safari和WebKit中可用的CSS高级特性,你可以为你的网站和网络应用带来一个新的级别的令人兴奋的东西。WebKit是Safar
- 今天给大家讲的是ASP给图片加水印的知识ASP给图片加水印是需要组件的…常用的有aspjpeg和中国人自己开发的wsImage…前者有30天
- <% SoFia_DbName="jiaoyou&qu
- 用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对
- PRD的作用之一在于,保留产品设计初衷,期望达到什么样的目的,起到事后验证的效果。产品初衷需要做到利益最大化,找最大的蛋糕,为最大目标人群服
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 仿照常见的那个图片变换flash做的效果,纯js。不过滤镜变换只对应ie,ff只能看到一般的切换。这个js做的效果最早在sina看到,这里把
- 在这篇文章中,我将努力揭开Mobile Web开发的神秘面纱,换句话说,也就是为了移动设备上的用户体验可以被接受,代码得怎么设计。我将阐述“
- 经常会看到这种弹出层背景变暗的效果,感觉手痒于是自己写了一个基于jquery的弹出层类。我习惯先写好结构和样式,然后再写js交互效果。结构定
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- 如何制作一个文本文件编辑器?我们也来做一个:newdoc.asp<%@ Language=VBScript %&g
- SQL Server的作业调度来建立自动备份的方法◆1、进入企业管理器中->管理->sql server代理->作业;◆2
- 格式:Download.asp?FileName=要下载的文件名 代码如下:Dim Stream Dim Co
- 很多人可能发现,无论是在sql 2000, 还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以, 当我们在处理下列要求时,会比
- 简洁的隐藏垂直菜单在hover时将内容展开。这样的效果在JS里有很多个版本,但这个可以说是绝无仅有的CSS版本。此菜单可以在IE5.5,IE
- 网络上有很多个性化的404页面,但是404页面不仅仅是个性化展示,404页面本来目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用
- 来由:最近的工作一直是学校设计教程的开发,都是自己根据理论知识加一些实际工作经验相结合写的教程,所以不会咬文嚼字,文笔也不一定非常专业和流畅
- 在异步应用程序中发送和接收信息时,可以选择以纯文本和 XML 作为数据格式。掌握 Ajax 的这一期讨论另一种有用的数据格式 JavaScr
- 字体设计是人类商业活动的需求,它随着时代和科学技术的进步而不断地变化着。被广泛应用于网络生活的各个方面。现代字体设计在电脑技术的应用中已经深
- asp使用SQL语句,查询数据库中的第10-20条记录的l方法,两种sql语句写法如下:1、select top 10 * from tab