如何把 7 个字重装进 1 个文件:思源黑体可变字体完整实践指南
如何把 7 个字重装进 1 个文件:思源黑体可变字体完整实践指南
【免费下载链接】source-han-sansSource Han Sans | 思源黑体 | 思源黑體 | 思源黑體 香港 | 源ノ角ゴシック | 본고딕项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans
一个文件覆盖 ExtraLight(250)到 Heavy(900)共 7 个字重——这就是思源黑体可变字体给泛 CJK 排版提供的能力。它是 Adobe 与 Google 共同维护的开源字体项目,仓库里保留了重建静态字体与可变字体的全部源材料。本文基于仓库内真实文件,讲清楚可变字体如何写 CSS、如何从源码构建,以及它的取舍在哪。
🪶 一条 wght 轴:单文件如何覆盖 250 到 900
两个极端母版加一张插值表
可变字体(Variable Font)不存 7 套轮廓,只存 ExtraLight 与 Heavy 两个端点,中间字重由渲染端实时插值。设计空间文件 Masters/designspaces/SourceHanSans-VF.designspace 里,<source>只指向两份文件:SourceHanSansVF-ExtraLight.otf与SourceHanSansVF-Heavy.otf。
轴的定义如下:
<axis default="250" maximum="900" minimum="250" name="weight" tag="wght"> <map input="400" output="390" /> <!-- Regular --> <map input="900" output="1000" /> <!-- Heavy --> </axis>map标签负责外部字重值到内部插值坐标的换算:Regular(400)对应内部坐标 390,Heavy(900)被拉伸到 1000,为插值留足空间。
7 个具名实例
<instances>里列出 7 个标准点位:ExtraLight(250)、Light(300)、Normal(350)、Regular(400)、Medium(500)、Bold(700)、Heavy(900)。Masters/STAT.fea 再把这些点位注册进 STAT 表,操作系统字体菜单因此能正常显示每个实例的名称,思源黑体可变字体在旧版软件里也会退化成这 7 个具名版本而不是乱序。
按投放范围分组的 3 套设计空间
- 通用版:
Masters/designspaces/下 5 个文件,SourceHanSans-VF.designspace及 SC(简体)、TC(繁体)、K(韩文)、HC(繁体·港)各一; - 子集版:Masters/designspaces/Subset/ 下按 CN、HK、JP、KR、TW 地区拆分的 5 个文件;
- 半角版:Masters/designspaces/HW/ 下 5 个文件,适配日文中混排半角拉丁字符的场景。
仓库根目录的FontMenuNameDB.VF、FontMenuNameDB.VF.SUBSET、FontMenuNameDB.VF.HW三份菜单名文件与上述三组一一对应。
📦 文件布局:可变字体源文件都在哪里
VF 源文件只出现在 4 个字重目录
Masters/ExtraLight/VF/与Masters/Heavy/VF/:插值两端,各含cidfont.VF.<地区>.unhinted与features.VF.<地区>成对文件;Masters/Regular/OTC/VF/与Masters/Bold/OTC/VF/:半角可变字体的两端,文件名为cidfont.VF.HW.<地区>.unhinted。
.unhinted后缀表示尚未加 hinting(hinting 是一套改善小字号屏幕渲染的指令表),构建后可在后处理步骤补上。
每个字重目录都是完整一套源码
ExtraLight 到 Heavy 的 7 个字重目录里各有三类文件:cidfont.ps.*(CFF 轮廓数据)、features.*(OpenType 特性)、cidfontinfo.*(字体元信息)。仓库根目录还有 10 个UniSourceHanSans*-UTF32-H文件,是 Unicode 到 CID 的映射表,COMMANDS.txt 中的构建命令通过-ch参数引用它们。
构建文档入口
COMMANDS.txt 记录了全部静态字体的makeotf命令行;文件末尾注明:可变 OTF 应改用 build/ 目录下的两个脚本构建。
🛠️ 两种接入方式:Web 端写 CSS,或从源码构建
方式 A:用 @font-face 声明可变字体
拿到构建好的字体文件后,声明如下(font-weight区间要与设计空间的 wght 范围 250 900 一致,否则浏览器会吸附到最近的具名实例,平滑过渡失效):
@font-face { font-family: "Source Han Sans VF"; src: url("./SourceHanSansSC-VF.otf") format("opentype"); font-weight: 250 900; font-display: swap; } h1 { font-family: "Source Han Sans VF", sans-serif; font-weight: 620; /* 250–900 间任意值,不限 7 个预设点 */ }方式 B:从源码构建可变字体
先安装 AFDKO(Adobe Font Development Kit for OpenType,字体构建工具链),再获取源码:
git clone https://gitcode.com/gh_mirrors/so/source-han-sans cd source-han-sans接着按顺序执行 build/ 下两个脚本:build-source-otfs.py先生成 ExtraLight 与 Heavy 两个母版 OTF,build/buildVFs.py 再生成全部可变字体:
python build/build-source-otfs.py python build/buildVFs.pybuildVFs.py内部调用 AFDKO 的buildcff2vf,依次处理 15 个设计空间(通用 5 + 子集 5 + 半角 5),输出默认写入 designspaces 目录,可用-o改到别处。
常见问题:只想构建简体中文一份怎么办
不必跑满 15 个,直接对单个设计空间执行:
buildcff2vf --omit-mac-names -d Masters/designspaces/SourceHanSansSC-VF.designspace这与buildVFs.py中 SC 分支单次循环执行的命令一致,-d即指定设计空间文件路径。
⚠️ 边界与代价:哪些情况别用可变字体
单文件体积并非零成本
思源黑体可变字体要完整保存 ExtraLight 与 Heavy 两端轮廓数据。泛 CJK 字体字形量大,单个可变 OTF 往往比一个字重的静态子集 OTF 更大。若产品只用 2~3 个字重,多个静态字体文件的总体积反而可能更小。
兼容与渲染
可变字体依赖渲染端支持 OpenType 1.8 的可变表;较老的浏览器与部分办公套件只能使用具名实例。源文件均为.unhinted版本,若要在小尺寸屏幕上保证渲染质量,构建后需补充 hinting 工序。
组合建议
- Web 端需要全部字重:用 1 个可变字体文件,1 次请求、1 份缓存;
- 桌面单字重或嵌入设备:用对应字重目录的静态子集 OTF,构建命令都在 COMMANDS.txt。
下一步建议
先执行buildcff2vf -d Masters/designspaces/SourceHanSansSC-VF.designspace拿到简体中文一份,加载到浏览器字体测试页里,把 font-weight 从 250 拖到 900,确认思源黑体可变字体在任意中间值下笔画都能平滑插值;之后再按Masters/designspaces/下Subset与HW两个子目录里的文件,逐个构建地区子集或半角版本。
【免费下载链接】source-han-sansSource Han Sans | 思源黑体 | 思源黑體 | 思源黑體 香港 | 源ノ角ゴシック | 본고딕项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考