字形的环肥燕廋——Fontforge中调整字宽三法

Application|http://blog.bs2.to/EdwardLee|EdwardLee 2007-10-27 20:45:07

在制作字体时,除非使用 METAFONT 可能由参数来使同一个函式产生不同形状的笔画表现,不然的话,一般的字体编辑器就只能一个字一个字去手动修改。但 Fontforge 有让字的笔画变胖或变廋的功能。当然,要应用在笔画复杂的中文字的时候,可能会出错,需要手动去调整。

在 Fontforge 中要调整字的字宽(长扁)的方法约有三种:

The scale tool
Expand Stroke
Meta Font

一、The scale tool篇

在我们使用 fontforge 编辑一个字体文件的时候,针对各别的某一个字,使用鼠标双击那个字,就会出现三个窗口: Outline Glyph View、Layers 及 Tools 三个窗口。含字框的那个是 Outline Glyph View window。有 Layer 字眼的是 Layer window,有一些奇怪符号的是 Tools window。在 Tools window 里头有许多不同功能的工具,预设选项会停在 Pointer 那个工具上。

我们要先以 Pointer 工具来圈选所要处理的范围,按住鼠标左键不放就可以拉出整个字的范围,或者在字框上连续单击三次也会选取整个字框,这时所选取的部份会呈反白(反黄),这就是我们的工具所要作用的范围。

然后,我们选用 Tools 窗口上的 Scale 工具,在字框上按住鼠标左键不放,就可以移动,让字框做上下左右的缩放,在鼠标左键尚未放开时,会有原字框的背景框(绿色)做为基准。

或者,我们可以在 Scale tool 上双击,这时会弹出一个 Transform 的窗口,我们可以填入 X 轴及 Y 轴方向的缩放比率(百分比),填好数据,按 OK 就会自动调整。

需注意的是,此时这个被缩放的字框在整个字的相对位置已经变更,我们有需要调整它的所在相对位置。在所选取的反白尚未消失的时候,我们换回 Pointer 工具,使用鼠标按住字框上的点(呈黄色显示那些点)就可以拖拉至适当的位置。或者,反白尚未消失的时候,使用上下左右方向键亦可以调整它的位置,通常,微调的时候,使用方向键会比较适当,鼠标不容易控制细微的位置。

一个字如果含有多个部件,每个部件的字框是独立的话,那么可以单独对这个部件做缩放的动作。

显然的,在 scale 之后会发现,笔画变细或变粗了,和原来的其它字比较起来会不一致,这时我们可以去调整单独的各个线段,由于此时是属于微调的情形,因此使用方向键会比较适当,你可以使用 Pointer 工具,click 某一线段后(这一线段或曲线会反白),然后以方向键来调整它的粗细或反曲点的方向。

当然,眼睛常常会受骗,为了和其它字比较,可以将这个字的前后几个字反白起来,然后由功能选单上的 [Window] => [New Metrics Window] 和其它字做比较。

fontforge script 的 Scale() 函式也是可以做同样的缩放调整,它有几个参数供使用。另外就是含有较复杂算法的 Expand Stroke 及 Meta Font 的功能了。

#p#副标题#e#

二、Expand Stroke篇

这个功能在 fontforge 菜单上的 [Element] => [Expand Stroke...] 中,先选取要作用的字后,就可以选取这个功能,它会弹出一个窗口出来。

一般使用的话,我们要调整的只是 Stroke Width 及 Remove Internel Contour。其中要小心的是,如果字有封闭的其它区域,例如“日”、“月”这类的中文字,那么 remove contour 要很小心,因为它的内外 contour 在不同的封闭区域的方向性可能是不同的,这会造成内外易位,原本想去除内框,结果去除了外框。这时我们可以以手动的方式去移除里头的 contour 或者使用下面会讨论到的关闭 Cleanup Self Intersetc 功能。在 FontForge 20061008-ML 以后的版本,已经修正上述『月』会删错内外 contour 的bug,但最好在使用这个功能前先执行 CorrectDirection 的功能。

小提示:Stroke Width 指的是 stroke 两 curve 之间的距离,它的单位是 em unit,是一种相对值。em size 愈大,则它的“刻度”会分得愈细,因此 em unit 就会愈小。相反的,em size 愈小,它的“刻度”每单位就变大了。

我们并没有 remove contour,所以原 contour 还在。我们可以双击于不需要的 outline 上,它会呈现反白,然后按 Ctrl-x 来消除它。这里要注意的是,在 expand 的过程,会产生一些多余的点,我们可以使用 [Element] => [Simplify] 来消除它,这里右边的那个结果,是经过 simplify 的。

有些字,例如:“天”,它没有其它的独立封闭区域,那就可以直接 Remove Internel Contour 而无需手动去删掉不需要的部份。

要手动去删也是很麻烦,这时可以把 Cleanup Self Intersetc 关闭,再把 Remove Internel Contour 打开,这样就不会搞错 contour 的方向性了。

当然,这样扩大后,仍然要和其它的字配合,否则整个字各部份的粗细比例会不一致。通常在 Scale 后,再来配合使用 Expand Stroke 来调整粗细,这是我个人常在使用的方式。

Expand Stroke 功能还有另外的“副产品”,那就是中空字(镂空字),只要 expand 时,不把 contour 消除,就会产生中空字的效果。

这是因为双重的 contour 重叠在一起所造成的效果。

另外一个作用(其实这才是这个功能的最原始、最主要的作用),就是把某一线段,转换成一个完整的 outline 笔画。

这样就会把一个线段转换成一个完整的笔画 outline,而且可以选择笔画未端要使用什么样的形式。那么交叉的线段或曲线也可以吗?当然是可以的,但要自行消除 Overlap,[Elemnt] => [Overlap] = [Remove Overlap]。

如果对Expand stroke的工作原理有兴趣的话,请参考:http://fontforge.sf.net/pfaeditmath.html#Stroke

fontforge script 亦提供 ExpandStroke() 函式,这是一样的功能,只不过由 script 来命令列操控而已。通常先是由 GUI 试着操作,可行的话,再改由 script 来执行,这样效率会比较好。

那么,也可以缩小吗?也是可以,只要把 Stroke Width 设成负数就可以了。不过,这个动作很秏系统资源,所以,要考虑所需要的处理时间,尤其是要同时处理很多字的时候,并不适当,这时可以考虑 Meta Font 的 thin 功能,这将在下面介绍。

#p#副标题#e#

三、Meta Font篇

这个功能在菜单上的 [Element] => [Meta Font...] 上,这个功能选项要在 PostScript 字体,例如 Type 1/CFF 等,才会有,在 TrueType 的字体是没有的。所以,要使用这个功能,字体 outline 曲线要使用三次曲线(cubic spline,ps 字体使用),而不能使用二次曲线(quadratic spline,TrueType 字体使用),所以 [Element] => [Font Info..] => [General] 中,Quadratic Splines 的选项要关掉,不能打开。

使用 cubic splines,在曲线操控上会比较方便灵活,而万一要产生 TTF 时,fontforge 会自动转换成 quadratic splines,这点不用担心。所以,一般编辑字体,建议不要把 Quadratic Splines 选项打开,这样对于 outline 微调控制上会比较灵活。

这个 Meta Font 功能,和 Knuth 的 METAFONT 完全无关,只不过某些功能上类似而已,因此借用 Meta Font 的名称。

这个功能只是在调整 Stem 及 Contour 的放大倍率。

它有预设调整好的四项功能:Embolden、Thin、Condense 及 Expand。但用于中文字的话,可能要减小调整的幅度,否则容易造成字框扭曲。而且,这个功能目前 bug 还很多,通常还是需要手动加以调整(Thin 功能较不需要调整)。

其中原字框会置放于 background(绿色的部份),需要手动自行消除,[Edit] => [Clear Backgound],转换后的字框才是置于前景。从中可以看得出来,某些部份已经有扭曲的现象,需要手动去调整。而且 Meta Font 的功能,会改变 glyph width 的宽度,需要手动去设定回来,[Metrics] => [Set Width]。否则和其它的字的字宽会不一样,这点和 Scale 及 Expand Stroke 的功能不同。字框所在的相对位置也可能需要调整,[Metrics] => [Center in Width]。

好了,fontforge 将字缩放的三种方法就介绍到此。但对于笔画复杂的中文字,并没有想象中容易处理,有时会造成 fontforge internel error,甚至程序当掉。这可能需要使用 fontforge 的朋友努力参与、回报来改进,但一般用途的话,fontforge 的确是一个不可多得的字体编辑自由软件,尤其它有 fontforge script,可以自动化处理,相当方便。

当然,以中文几万个字来说,光靠 fontforge,那么可能需要许多的人力、时间。所以,自由软件社群,要 from scratch 来产生自由字体供社群大众自由使用的话,恐怕还需要其它的工具的帮忙才行,这就得靠大家努力思考一个具体可行的造字方式及其整个流程了。

Quadrat

Quadrat