近期沉迷用墨水屏读小说,用的是「方正细金陵」「喜鹊宋体」两款刻本风格的宋体,看古代背景的故事很有感觉。缺点是这两个字体在同一字号下比我其他常用的字体小一圈,每次换字体都要手动调整字号,不是很方便。在GPT老师帮助下 写了个 命令行版本的FontForge 脚本,将字体整体放大约 1.1 倍来解决这个问题。

# xique_enlarge_112.pe — 放大 112% + 修正垂直度量(legacy 脚本)
# 用法:
#   fontforge -lang=ff -script xique_enlarge_112.pe "原字体.ttf" "输出.ttf"

if ($argc < 3)
  Print("Usage: fontforge -lang=ff -script xique_enlarge_112.pe input.ttf output.ttf")
  Quit(1)
endif

infile = $1
outfile = $2

Print(">>> Opening: " + infile)
Open(infile)

# 重命名,避免与原字体冲突
SetFontNames("XiQueSong-Plus112", "XiQueSong Plus 112", "Regular")

# 等比放大 112%(可改 108–115%)
SelectAll()
Scale(112, 112)

# 读取放大后全局包围盒并取整(SetOS2Value 需要整数)
bbox = GetFontBoundingBox()          # [xmin, ymin, xmax, ymax]
ymin = Floor(bbox[1])
ymax = Ceil(bbox[3])

# OS/2 / hhea 垂直度量(通用做法:Win 用极值正数;Typo/hhea 对齐,LineGap=0)
SetOS2Value("WinAscent",        ymax)
SetOS2Value("WinDescent",      -ymin)   # 正数
SetOS2Value("WinAscentIsOffset", 0)
SetOS2Value("WinDescentIsOffset",0)

SetOS2Value("TypoAscent",       ymax)
SetOS2Value("TypoDescent",      ymin)   # 负数
SetOS2Value("TypoLineGap",      0)

SetOS2Value("HHeadAscent",      ymax)
SetOS2Value("HHeadDescent",     ymin)   # 负数
SetOS2Value("HHeadLineGap",     0)

Print(">>> Generating: " + outfile)
# 如需“空 DSIG”可改为:Generate(outfile, "", "dummy-dsig")
Generate(outfile)

Print(">>> Done")
Quit(0)


把上述代码保存为enlarge.pe文件,把字体和脚本放到一个文件夹里,从文件夹进入终端,然后在bash中执行

fontforge -lang=ff -script enlarge.pe "xique.ttf" "xique_plus112.ttf"
  • enlarge.pe 脚本名称
  • "xique.ttf" 要处理的字体名称
  • "xique_plus112.ttf" 处理后的字体名称

处理后的字体同样字号下大了一圈