字形边界与字体排版指标的差别
通过尾部、空轮廓与复合变换的例子,解释怎样保留完整独立 SVG 资产,而不把声明指标当作实际排版结果。
被切掉的尾部说明了什么
原作者描述字体内可见的尾部在导出 SVG 时被切掉,并询问能否保持字体不变而导出完整边界。它指出了资产边界需求,却不能证明问题一定来自 ascent/descent、hmtx 或某版 FontForge;原完整字体未提供。
对示例 ID2,真实曲线从 y=-900 延伸到约402.083333,而存储控制点上界为1600,全字体 ascent为700、descent为-200。曲线极值、控制点范围与全局行指标回答不同问题,不能相互替换。
三种边界与一种声明指标
SVG 保留原 glyf 设计网格,而不是把轮廓 xMin 自动搬到 hmtx 的左侧边距。报告同时保留声明指标,便于使用者决定资产与排版怎样衔接。缩放、反射、shear、多层复合和二次曲线的中间点都需要完整参与边界计算。
| 字段 | 实际含义 | 不代表 |
|---|---|---|
| storedControlBounds | glyf 存储的控制点 bbox | 真实二次曲线极值 |
| bbox | 完整展开曲线极值;空轮廓 null | 字体行高或排版范围 |
| viewBox | Y 反转、留边与向外数值保护 | 无损数值运算或像素渲染 |
| advanceWidth / leftSideBearing | 原 hmtx 声明值 | hinting/USE_MY_METRICS 的有效布局 |
空轮廓和未覆盖是不同状态
空格或 .notdef 可能合法但没有轮廓:emptyOutline=true、bbox=null、commands=[],SVG 无 path,canvas 为 max(1,advance)×1。没有覆盖的码位则显式 covered=false,不自动选择 .notdef 或合成一个 SVG。
Unicode 优先表与有限 Apple 表决定码位请求。Mac Arabic/Hebrew 的方向或字体变体不能简单剥离,也不能用 ISO 替代;缺乏上下文就明确不支持,可转用确认后的字形 ID。
把完整产物交给下一步
摆放轮廓资产时使用完整导出的曲线;后续排版需要字体声明指标时,再单独读取这些指标。有界界面预览便于检查请求,下载 ZIP 才包含全部所选字形与码位状态。
- 先用支持的静态单 face TTF,按十进制 ID 或 U+ 码位选择;不支持格式不会自动转换。
- 下载 ZIP 中每个 SVG 和 report.json;表格只有前200行,长单元格前2000 UTF-16单位,20,000字符以上复制为明确摘要。
- 最多16MiB输入、2000选择、2000字形、200k命令/展开点/访问、深度32,逻辑32MiB与实际ZIP33,766,552B共同约束;组合预算并非互相保证。
- 不执行指令、不安装/改写字体、不做塑形、kerning、栅格化或字体完整性认证。错误或取消无部分 ZIP;修正后用同一原件恢复。
参考资料
- 完整字体字形 SVG 导出需求
Lance Pollard 的第一人称尾部裁剪与保持字体不变的需求;原字体未附,不宣称复现。
- Apple post 字形名称格式
名称格式正确性依据,不作为需求证明。
- Unicode Apple 字符映射
使用完整官方表及许可;Arabic/Hebrew 方向/多标量/变体只采用明确有限范围。
本分类工具使用说明
展开工具,查看操作步骤、可调选项和支持范围,再直接进入工作区。
静态字体字形 SVG 导出从支持的静态 TrueType 字体选取字形或码位,导出完整曲线边界的 SVG 和含名称、声明指标与码位状态的 JSON ZIP。
完整曲线资产需要曲线边界,而不只是字体行高。先确认支持格式和选取方式,再查看未覆盖状态并下载完整 ZIP。
操作步骤
- 选择一份支持的静态 TTF;字体原件保持不变。
- 输入字形 ID 或 Unicode 码位,设置整数留边。两个列表的并集决定输出字形。
- 核对选中字形、未覆盖码位和指标范围;下载 ZIP 查看每个 SVG 与完整 JSON。
可调选项
- 字形 ID 列表
- 按需要填写
十进制 ID,以空白或逗号分隔;如 2,3。可留空并使用码位。
- Unicode 码位列表
- U+0041
如 U+0041 U+1F600 或 65;映射缺失会显示为未覆盖。
- SVG 留边(字体单位)
- 0
0–4,096 的整数;留边作用于曲线边界,不修改原字体或声明指标。
能力与限制
- 仅单 face 的 sfnt 0x00010000 静态 TTF:glyf 二次曲线及有限无环 XY 仿射复合字形;原件最多 16MiB。CFF/CFF2、TTC、WOFF/WOFF2、可变、彩色、位图或内嵌 SVG 字体、点对齐复合字形与 cmap 2/8/10/14 不支持。
- ID 为十进制非负整数;码位为十进制或 U+ 加 1–6 位十六进制字符,以空白或逗号分隔。两个列表合计最多 2,000 项,分别不允许重复;不支持范围缩写。码位须为 Unicode scalar;映射不到非零字形时显式记录未覆盖,不生成替代字形。留白只省略该列表;至少指定一项。
- 最多选中 2,000 个字形、200,000 条 M/L/Q/Z 命令、200,000 个展开控制点、200,000 次组件访问、32 层复合深度。SVG 留边为 0–4,096 个字体单位。完整 SVG+JSON 合计最多 32MiB;2000 SVG+report.json 共 2001 个成员,STORE ZIP 最多 33,766,552 字节。组合输入可能先触及另一项预算。
- 坐标保留原 glyf 设计网格,SVG 反转 Y 轴;曲线边界由 float64 推导并显式向外加数值保护,不是无损数值运算。advance/lsb 为原 hmtx 声明值;不应用 USE_MY_METRICS、hinting、排版塑形、kerning 或栅格化布局。不会执行字体指令,也不校验全字体 checksum 或安装完整性。
- cmap 支持 0/4/6/12/13;先选有限 Unicode 优先表,Mac 字符映射只支持已声明的 Apple 表和语言/编码组合,不以 ISO 或未知语言回退猜测。Arabic/Hebrew 的方向、重复、多标量或字体变体歧义会原子提示不支持;可改用有效字形 ID。post 1/2/2.5/3 支持名称;post 4/未知格式、非 ASCII 自定义名称、保留索引及非法 XML 控制字符不支持。名称中的 TAB/LF/CR 保留,CR 在 SVG 中写为 。
- 表格预览前 200 个字形,并将长单元格限定为前 2,000 个 UTF-16 单位。JSON 超过 20,000 字符时复制的是明确摘要;ZIP 中 report.json、每个 SVG、全部命令、声明指标与码位状态始终完整。空轮廓保留 emptyOutline、bbox=null 和无 path SVG,不伪造曲线。