Pal3love / dream-han-cjk

Dream Han Sans & Serif: open source pan-CJK font families with enormous range of weights.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请问如果只需要修正行高,应该如何操作?

ernestyao opened this issue · comments

感谢作者,找了很长时间,终于在这里发现了思源系列字体行高问题的解决方法。想再请教一下,如何只基于原字体修改行高?一方面是今后如果字体更新比较方便,另一方面也想尽量减少对原字体的更改。
再次感谢

你好,修行高对应的代码在 script/trim_head_ymax_ymin.py 里面,大意是将hhea表中的ascenderdescender分别覆盖head表中的ymaxymin参数。直接对思源 TTF 字体应用这个 Python 脚本就可以了。需要注意的是,此方法对 OTF 字体无效。Adobe 软件会读取 OTF 字体中的CFF表来计算 OTF 字体的行高。

感谢答复。我刚刚针对.ttc类型改了您的代码并试了一下,修改应该是成功了,但似乎没有解决问题,请问是TTC又有什么特殊情况吗?只能改逐个的TTF文件?

import sys
from fontTools.ttLib.ttCollection import TTCollection

def main():
    if len(sys.argv) < 2:
        print("Usage: python3 trim_head_ymax_ymin.py <fontfile.ttc>", file = sys.stderr)
        sys.exit(2)
    fontPath = sys.argv[1]
    collection = TTCollection(fontPath)
    for i, font in enumerate(collection):
        font["head"].yMax = font["hhea"].ascender
        font["head"].yMin = font["hhea"].descender
    collection.save(fontPath)

if __name__ == "__main__":
    sys.exit(main())

那个脚本不能直接用在 ttc 文件上,建议先将 ttc 文件解包成 ttf,用完脚本之后再反向打包回 ttc。很多命令行工具都可以解包和打包 ttc 文件,比如 Adobe 提供的 AFDKO 套件里面的 otc2otf(解包)和otf2otc(打包)。

otc2otf用法:

otc2otf <旧 ttc 字体>

otf2otc用法:

otf2otc -o <新 ttc 字体> <ttf 字体 1> <ttf 字体 2> <...以此类推>

感谢。继续请教,VF字体也能通过修改head表处理吗?官方的SourceHanSerif-VF.ttf.ttc,我用otc2otf`拆开后再修改,似乎没有生效(合并回ttc或者是单独安装其中一个ttf都仍然有行高问题)。
另外,感谢更新了新版字体,看来只能先用着梦源了😄

VF 的情况更加复杂一些,因为字框是随 delta 动态改变的,软件内部应该有别的算法计算行高,我没做过太多研究。可变字体的head表仅适用于默认实例(instance),对 delta 插值生成的结果无效。对于思源 VF 来说,默认实例是最细的那个字重。

好的。感谢分享。网上对这个问题的讨论感觉挺少的,看来目前您这个项目已经是最好的选择了。再次感谢