请问如果只需要修正行高,应该如何操作?
ernestyao opened this issue · comments
感谢作者,找了很长时间,终于在这里发现了思源系列字体行高问题的解决方法。想再请教一下,如何只基于原字体修改行高?一方面是今后如果字体更新比较方便,另一方面也想尽量减少对原字体的更改。
再次感谢
你好,修行高对应的代码在 script/trim_head_ymax_ymin.py 里面,大意是将hhea
表中的ascender
和descender
分别覆盖head
表中的ymax
和ymin
参数。直接对思源 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 来说,默认实例是最细的那个字重。
好的。感谢分享。网上对这个问题的讨论感觉挺少的,看来目前您这个项目已经是最好的选择了。再次感谢