在程序开发中遇到了需要对字体文件中部分字符进行替换和将多个字体合并成一个字体的工作。发现了一个开源软件 FontForge 很好用。
FontForge官网:
https://fontforge.org/
※安装时要注意, 一定要使用管理员身份运行,否则软件运行过程中会崩溃。
这个软件有很多功能简单记录一下编辑字形和合并字体。
通常我们说的字体就是字符到字形的映射,字符不外是一个数(通常是Unicode代码点),而字形则是一个图像。现在计算机排版用的字形一般是矢量图(由于位图在缩放时锯齿严重,现在一般不用位图字体了),并且轮廓由一些分段二次(如TrueType字体)或三次(如OpenType字体)闭曲线组成。

在上图中有三条水平线,中间的是基线,通常排版一行文字时会把各字形的基线对齐。上面两条线间的距离称为【上高】,下面两条线间的距离称为【下深】,【上高】 + 【下深】 = 【全字大小】,这几个参数是字体的重要几何参数,适用于字体中所有字形,在排版时会用于计算行高。
每个字形可以有不同的宽度,这在排版时也会被用于决定为字符预留多宽的空间,在拉丁字符中一般以“M”对应的字形最宽,故“M”的宽度(em)经常作为相对长度单位
大写拉丁字符对应的字形一般轮廓高度大致相同且下方大致对齐基线
除b、d、f、h、k、l、t外其它小写拉丁字符对应的字形轮廓一般上方大致对齐(不考虑i、j的点),其它字形轮廓上方则一般与大字的轮廓大致上方对齐,故“x”的高度(ex)也经常作为相对长度单位
除g、j、p、q、y外其它小写拉丁字符对应的字形轮廓一般大致下对齐到基线,其它字形轮廓下方则一般大致对齐到下深线
一个字形的轮廓可以超出上高线、下深线或者左右边界,只要不是太夸张一般也能显示,但可能与其它字形或上下划线相交

上图更深入地解构了轮廓的组成,其中轮廓用黑色线表示,曲线上标记了一些点:
用圆形标记的是曲线点,它两侧的曲线段有公共切线,用紫色和粉蓝色线段表示,线段的另一端点叫控制点,用叉标记。当使用二次曲线时,一对相邻曲线点有一个公共的控制点;但使用三次曲线时没有这限制。即使你不了解样条函数理论也容易看出,两个曲线点间的二或三次曲线段可以由这两个曲线点加上一或两个控制点确定。
用菱形标记的是水平或垂直曲线点,它与曲线点类似,但该点处切线必须水平或垂直。
用三角形标记的是切点,它的一侧是直线,另一侧不是直线段。
用方形标记的是不光滑点,它两侧的曲线段在该点可以有不同的切线。
1.编辑字形:
打开或创建一个字体文件,或FontForge的工程文件,然后就会显示字形索引,即每个字符对应的字形(没有的话显示浅灰色的叉)。

双击其中一个单元格就可以对字形进行编辑。


和一般的编辑软件差不多,有很多可以利用的小工具。

为了避免低级错误,可以在“基础”菜单中“校验”中选择“验证”(针对整个字体)或“发现问题”(针对选中的字形)来检查常见错误。为了压缩字体大小,可以在“基础”菜单中选“简化”,但简化后最好再选“增加极值点”。
确认修改正确后,可以在“文件”菜单中选择“保存”为sfd文件,或者选择“生成字体”生成Opentype、Truetype、Postscript或SVG等格式的字体。
在上方菜单中选择 “元素” -> “字体信息” 可以查看和修改字体的各种参数,除了版权信息外,比较常用的有“一般”选项卡中的“上高”、“下深”、“M字大小”和“倾斜角”,还有“查找”选项卡中设置替换处理(用于连写、重音等等)。


在“尺寸”菜单中可设置字形宽度、左边距(左边界到轮廓的距离,可以负)和右边距(轮廓到右边界的距离,可以负)。另外也可以通过在字形编辑器中拖动左右边界线来设置。通常来说。对称的轮廓应该有相同的左右边距。

2.合并字体
想要合并字体时,需要打开一个文件作为主字体,选择菜单中的 “元素” -> “合并字体” ,再去选中要合入的字体,注意在主字体中已经存在的字形不会被合入。

合并时要注意不同字体的参数,特别基础的是要注意全字大小、上高、下深。
尽量调整到同一或能照顾到各种字体的展示。
理论上全字大小可以向下调整,这样还能缩减字体文件体积,但只是理论上,尽量还是将小数值向上调整。
可以右键单元格然后“清除”掉不需要的字形。

还可以查看字形信息。

确认无误后可以生成字体文件。

生成前选择你想要的字体文件格式。
