3招玩转source-han-sans-ttf定制:修改字体家族名、增删字重、调优hinting参数完整指南
【免费下载链接】source-han-sans-ttfA (hinted!) version of Source Han Sans项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf
source-han-sans-ttf 是一个为思源黑体(Source Han Sans)构建带 hinting 的 TTF 版本的开源项目。掌握本文的 3 招——修改字体家族名、增删字重、调优 hinting 参数,你就能把默认输出的 SHSTTF 字体改造成完全贴合自己需求的定制字体。
📦 项目简介:为什么要做思源黑体 TTF 版
思源黑体官方发行的是 OTF(CFF 轮廓)格式的 .ttc 集合文件。而 TTF(TrueType 二次曲线轮廓)在部分旧系统、移动端和一些设计/浏览器环境中的兼容性更好,嵌入也更方便。
本项目的最大卖点在描述里一句话就写明了:A (hinted!) version of Source Han Sans——它不仅转成 TTF,还为每个字形生成了专业的 hinting 指令,让字体在 Windows 等小字号场景下依然清晰锐利。
项目一次构建可产出7 个字重(ExtraLight、Light、Normal、Regular、Medium、Bold、Heavy)× 多个地区版本(简中、繁中、日、韩、港澳),构建流程分 4 个阶段:拆分 ttc 并重命名 → 转 TTF 并做基础 hinting → 用 Chlorophytum 生成精细 hint → 打包 ttc/压缩包,全部由 verdafile.js 调度(关键阶段定义见 verdafile.js#L10-L24)。
🛠️ 快速开始:一键安装与构建步骤
准备工作很简单,只需两样:
- 最新版本的AFDKO(提供 otf2otc、otc2otf、otf2ttf、ttfautohint 等工具)
- Node.js
拿到代码后执行:
git clone https://gitcode.com/gh_mirrors/so/source-han-sans-ttf cd source-han-sans-ttf npm install npm run build all⏰ 注意:README 特别提醒,全量构建可能耗时数小时,请耐心等待。构建系统带有构建日志与自跟踪机制(verdafile.js#L22-L24),未变化的阶段不会重复执行。产物输出在out/ttf/(单字体)和out/ttc/(集合文件),版本来自 package.json 的version字段。
🏷️ 第一招:修改字体家族名
默认构建出的字体在菜单里显示的名字叫SHSTTF。想改成自己的名字,只需要改一个文件:config.json。
它里面有两处和"名字"直接相关(见 config.json#L2-L19):
| 配置项 | 作用 |
|---|---|
naming.familyName | 各语言环境下字体菜单显示名(en_US、zh_CN、ja_JP 等 6 种语言) |
prefix | 影响输出文件名(如 ShsTtf-SC-Bold.ttc)和PostScript 名 |
naming.version/naming.copyright | 写入字体的版本号与版权信息 |
README 给出的官方做法是:修改config.json的naming.FamilyName各条目(影响菜单名)和prefix属性(影响文件名与 PostScript 名),然后重新构建。
真正执行写名的逻辑在 renaming/index.js 中:构建时会为 6 种语言分别写入偏好家族名(Preferred Family)、子族样式名、完整字体名、Unique ID 以及 PostScript 名(核心函数见 renaming/index.js#L56-L73)。它还内置了兼容老系统的处理逻辑——非"标准四样式"(Regular/Bold/Italic/Bold Italic)的字重会自动并入家族名,比如ExtraLight会被缩写成XLight以防名称溢出。
💡 小贴士:字体家族名决定你在 Word、Figma 等软件菜单里看到什么;PostScript 名则影响 PDF 嵌入时的字体引用,两者分开设置,互不干扰。
⚖️ 第二招:增删字重
想只构建 Regular 和 Bold 两个常用字重来节省时间?或者想加入新的字重?答案仍然在 config.json 的weights数组(config.json#L6):
"weights": ["ExtraLight", "Light", "Normal", "Regular", "Medium", "Bold", "Heavy"]增删规则只需记住三件事:
- 改数组:
weights决定构建哪些字重,verdafile.js#L148-L153 中的hint-all任务就是遍历它逐字重执行的。 - 源文件要对应:每个字重都需要 src/ 目录下同名的源文件,如
SourceHanSans-Bold.ttc(文件名由sourcePrefix拼接字重得到)。 - hinting 配置要对应:每个字重必须有一个同名的 hint-config/ 配置文件(如
hint-config/Bold.json),否则该字重的精细 hinting 阶段会因缺少依赖而失败。
所以最简单的"删字重"玩法就是:把weights改成["Regular", "Bold"]后重新构建,其余文件原封不动。
⚙️ 第三招:调优 hinting 参数
这是进阶玩家的主场。每个字重一份独立的 hinting 配置(共 7 份,位于 hint-config/ 目录),结构分为三段"通道"(pass):
- CJK 汉字/韩文通道:用
@chlorophytum/hm-ideograph插件处理康熙部首、CJK 统一表意文字(含 A–F 区扩展)、韩文音节,并跟踪日文常用字表(jp78/jp83/jp90/jp04/hojo)等 OpenType 特性; - 平假名通道与片假名通道:分别对假名施加不同的斜线容差参数。
最值得动手的参数是 hint-config/Normal.json 中的这几项(各字重的标准值见下表):
| 字重 | CANONICAL_STEM_WIDTH(标准字宽/em) |
|---|---|
| ExtraLight | 0.029 |
| Light | 0.04 |
| Normal | 0.06 |
| Regular | 0.067 |
| Medium | 0.072 |
| Bold | 0.097 |
| Heavy | 0.105(另有密集字形专用值 0.072,见 hint-config/Heavy.json#L45-L48) |
核心思路:
- CANONICAL_STEM_WIDTH:hint 引擎认定的"标准笔画宽度"。字重越粗,值越大。若你自定义字重后发现小字号下笔画偏细或发虚,就按字重粗细微调这个值。
- DoOutlineDicing + OutlineDicingStepLength:轮廓"切割"开关与步长,影响字形被吸附到像素网格时允许的变形粒度,一般保持 0.06 即可。
- SLOPE_FUZZ 系列:假名斜笔画的吸附容差,平假名用 0.175、片假名用 0.03(对比 hint-config/Normal.json#L73-L79 与 hint-config/Normal.json#L106-L112),可针对渲染效果单独调整。
构建时,verdafile.js#L127-L147 的group-hint任务会读取对应字重的 JSON,并以全部 CPU 核心数为并行作业数(verdafile.js#L258),hint 结果会缓存到hint-cache-{weight}.gz,同参数重复构建不会重算。
❓ 常见问题
改个名字要等几个小时吗?不会。构建系统会按依赖跟踪缓存各阶段产物,只改naming时只有重命名及后续轻量阶段会重跑,最慢的 hinting 指令生成阶段不会因改名而重来。
改了 hinting 配置没生效?确认改的是对应字重的 JSON 文件(文件名与字重一一对应),并重新执行npm run build all。
构建依赖报错找不到 otf2ttf / ttfautohint?说明 AFDKO 未安装或版本过旧,请升级到最新版 AFDKO 后重试。
🎯 总结
source-han-sans-ttf 的定制玩法其实就围绕三份文件展开:config.json 管名字和字重清单,hint-config/ 管渲染精细度,verdafile.js 管构建流水线。改配置 → 重新构建 → 拿到专属的思源黑体 TTF,就是这么简单。动手试试吧!
【免费下载链接】source-han-sans-ttfA (hinted!) version of Source Han Sans项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考