ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Iosevka 29.1.0 变更深度解读:namingOverride 命名覆盖、西里尔字形修复与新增字符

Iosevka 29.1.0 变更深度解读:namingOverride 命名覆盖、西里尔字形修复与新增字符 Iosevka 29.1.0 变更深度解读namingOverride 命名覆盖、西里尔字形修复与新增字符【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/IosevkaIosevka 29.1.0 是一次以「字形正确性与定制能力」为核心的小版本更新它在构建管线中引入了对字体命名Name 表的完整覆盖机制namingOverride同时修复了多个西里尔、拉丁扩展字母在衬线slab与本地化形式下的字形缺陷并新增一个修饰符字符。本文以 changes/archives/29.x/29.1.0.md 为骨架结合packages/font-glyphs与packages/font的源码实现逐条还原每项变更的底层原理并给出可直接套用的私有构建配置示例帮助读者理解并复现这些改动。新功能通过namingOverride全面覆盖字体命名#227529.1.0 最核心的新增能力是「命名覆盖」。此前私有构建只能通过family等少量字段控制菜单名称而本次更新允许用户在构建计划中声明 Name 表中的全部信息字段包括版权、厂商、设计师、许可证甚至版本号。配置入口与底层数据流在 doc/custom-build.md 中namingOverride被定义在buildPlans.方案名之下。其数据流在构建管线中清晰可循构建入口 verdafile.mjs 将bp.namingOverride直接注入构建参数随后 packages/font/src/naming/index.mjs 中的createNamingDictFromArgv通过展开运算符把...argv.namingOverride合并进命名字典最终由assignFontNames写入字体各 Name ID。直接映射到 Name 表的字段以下是文档列出的、会直接写入 Name 表的字段对应setInformaticNames的实现见 packages/font/src/naming/index.mjs字段Name ID含义copyright0版权声明manufacturer8厂商名称designer9设计师名称description10字体描述urlVendor11厂商 URLurlDesigner12设计师 URLlicense/licence13许可证描述两种拼写均可licenseURL/licenceURL14许可证 URL两种拼写均可sampleText19字体样例文本version5Version String版本号必须遵循 SemVer如1.0.0vendorIdTagOS/2 表四字符厂商 ID其中version的处理有明确约束在 setVersion 中版本字符串需通过semver.parse校验且minor/patch不能超过 99否则抛出RangeError: Version number overflow写入时还会同步换算head.fontRevision。源码同时支持license与licence、licenseURL与licenceURL两套拼写packages/font/src/naming/index.mjs兼容英式与美式用法。copyright等字段还支持{{currentYear}}占位符会被替换为当前年份见 ancNameEntry。menuNameMap自定义菜单样式名除直接字段外namingOverride还支持menuNameMap子配置用于定制字重/字宽/倾斜在菜单中的显示名称结构如下weight字重数值到完整名称的映射width字宽数值到完整名称的映射slope倾斜值normal/italic/oblique到名称的映射weightShort/widthShort/slopeShort对应的短名称映射用于超长 Family 名的截断场景。默认映射表定义在 packages/font/src/naming/index.mjs例如字重100默认映射为Thin、700映射为Bold字宽7默认映射为Extended。未在映射中指定的值会沿用默认名称因此只需覆盖想改的条目。文档中的完整示例[buildPlans.IosevkaCustom.namingOverride.menuNameMap.width] 7 Expanded [buildPlans.IosevkaCustom.namingOverride.menuNameMap.widthShort] 7 Exp该配置会把字宽 7 在菜单中显示为 Expanded、短名显示为 Exp。从实现看合并采用「默认表 覆盖表」的展开方式createNamingDictFromArgv即{ ...WidthToMenuMap, ...argv.namingOverride?.menuNameMap?.width }保证未覆盖条目安全回退。样式名的最终拼装逻辑在getStyle/getShortStyle中权重名 字宽名 斜体名全为空的组合回退为Regular。西里尔字母字形修复29.1.0 包含多项针对西里尔字母在特定风格slab、本地化形式、特定变体组合下的修复均与packages/font-glyphs的变体选择逻辑直接对应。大写 EFU0424保加利亚本地化形式在 slab 下的改进保加利亚语本地化形式要求大写 EFФU0424使用区别于标准希腊 Phi 的「分裂环形」笔画结构。该字形定义在 packages/font-glyphs/src/letter/greek/phi.ptlcyrl/EfU0424通过CapitalPhiShape true生成本地化形式cyrl/Ef.BGR则以para.advanceScaleMM为框架重建并分别向下/向上延伸出基线以下与顶线以上的锚点。本次更新优化了 slab衬线风格下该本地化字形的视觉表现让衬线风格与无衬线风格保持一致的「Ф」本地化观感。西里尔 KOPPAU0480..U0481下伸部衬线跟随 C/c西里尔 KOPPA大写 U0480、小写 U0481此前在C/c启用带衬线变体时不会自动获得下伸部衬线。修复后KOPPA 的衬线形态将跟随C/c的衬线变体自动出现。其变体绑定位于 packages/font-glyphs/src/letter/latin/c.ptlselect-variant cyrl/Koppa 0x480 (follow -- C/topSerif) select-variant cyrl/koppa 0x481 (follow -- c/topSerif)从源码结构看KOPPA 的字形由C派生c.ptl中if [not styBot] : create-glyph cyrl/koppa.\(suffix)使用与c相同的轮廓构造路径因此本次修复本质上是让「下伸部衬线」这一属性随topSerif变体同步传递确保cv变体组合下字形不出现「衬线缺失」的破绽。小连字 EN GHEU04A5顶右衬线自动启用当cyrl/en选择tailed-top-left-serifed变体时小写西里尔连字 нгU04A5现在会自动获得顶右衬线。该连字在 packages/font-glyphs/src/letter/latin/upper-h.ptl 中通过EnGheShape构造其衬线参数serifTR -- serifGhe表明顶右衬线top-right serif与 Ghe 衬线共享开关本次修复正是补全了tailed-top-left-serifed组合下该衬线未被正确传递的问题。同类小写连字如cyrl/engheU04A5均通过follow -- cyrl/en继承大写形态的衬线决策upper-h.ptl。西里尔 Lower Emcv74默认形态分派cv74西里尔小写 м的默认形态现在按衬线风格分派sans 下使用flat-bottom-seriflessslab 下使用flat-bottom-serifed。其变体入口位于 packages/font-glyphs/src/letter/latin/upper-m.ptlselect-variant cyrl/em 0x43C (shapeFrom -- smcpM)结合params/variants.toml中flat-bottom-serifless与flat-bottom-serifed两个阶段variants.toml的存在可以推断29.1.0 之后cyrl/em的衬线变体不再与字母整体衬线风格脱节默认即可获得与当前serifs设置匹配的字形无需手动指定cv74。拉丁与希腊字母修复拉丁小写 S 带卷曲U1DF1E衬线变体字形修复U1DF1ELATIN SMALL LETTER S WITH CURL此前在衬线serifed变体下存在轮廓破损。该字符在 packages/font-glyphs/src/letter/latin/s.ptl 中通过跟随sSwash变体生成select-variant sCurlyTail 0x1DF1E (follow -- sSwash)SSwashU2C7E与sSwashU023F定义在同文件相邻位置s.ptl说明 S WITH CURL 与 S SWASH 共用卷尾轮廓骨架。本次修复针对的是该骨架在衬线变体下的断点broken geometry问题属于纯轮廓层面修正不影响变体选择逻辑。拉丁大写 BETAUA7B4下伸部衬线自动化UA7B4LATIN CAPITAL LETTER BETA此前需要手动指定才能获得下伸部衬线29.1.0 起该衬线的出现变为自动。字形在 packages/font-glyphs/src/letter/latin/upper-b.ptl 中注册select-variant latn/Beta 0xA7B4从代码结构看latn/Beta与B的大写字形构造共享轮廓逻辑upper-b.ptl中if (!bs) : create-glyph latn/Beta.\(suffix)本次变更使 BETA 的下伸部衬线遵循与B一致的衬线规则避免用户在使用衬线风格时手动补救。倒置希腊小写 IOTAU2129移除无尾变体U2129TURNED GREEK SMALL LETTER IOTA的「无尾」tailless变体被移除。该字符由 packages/font-glyphs/src/letter/latin/lower-il.ptl 中的CreateTurnedLetter生成CreateTurnedLetter turniota 0x2129 grek/iota HalfAdvance (XH / 2)其基础源字形为希腊小写 iota以 x-height 一半的高度旋转 180° 而成。移除无尾变体后该字符在不同cv组合下的形态趋于一致减少变体矩阵中的冗余分支。Latin-1 长音符U00AF加宽U00AFMACRON长音符被整体略微加宽以改善其在多语言排版中的视觉比例。长音符的基础字形macronAbove定义于 packages/font-glyphs/src/marks/above.ptl其横向范围为markMiddle - markExtend * 1.5到markMiddle markExtend * 1.5本次更新调整了markExtend相关的度量参数使横杠两端更舒展与上方标记系统的其他元素保持协调。渲染几何修复heavy oblique 准等宽下的带尾 i/l29.1.0 修复了在heavy重字重 oblique斜体且开启quasi-proportional准等宽时带尾tailed形态的i/l出现的几何破损。准等宽模式在 Iosevka 中拥有独立的度量体系packages/font-glyphs中大量使用para.isQuasiProportional分支切换笔画位置与宽度逻辑例如 lower-il.ptl 中define xMiddleT : if (para.isQuasiProportional Body ! ILBody.PhoneticLeft) xMiddleTCenter xMiddleTMono即准等宽下i/l的笔画中点采用居中Center而非等宽Mono布局。本次修复针对的是该分支在 heavy 字重 oblique 双重叠加时尾部轮廓的断点问题属于 lower-il.ptl 中i/l构造逻辑的度量修正不影响变体名称。新增字符修饰符字母右下角UA71A29.1.0 新增字符MODIFIER LETTER LOWER RIGHT CORNER ANGLEUA71A用于音韵学注音中的右下角标记。该字符在 packages/font-glyphs/src/auto-build/transformed-jobs-data.ptl 中注册list 0xA71A invNegate其字形由invNegate反向否定符变换派生即通过旋转/镜像既有标记类字形得到从而复用已调校的笔画度量保证与字体整体风格一致。构建字体后可在私有使用区之外的音标扩展区Phonetic Extensions Supplement 一带直接使用该字符。升级与验证建议命名覆盖的完整用法在private-build-plans.toml中为方案加入[buildPlans.方案名.namingOverride]段先设置直接字段copyright、designer、license等再按需配置menuNameMapversion务必使用 SemVer 格式且minor/patch≤ 99。验证衬线修复构建时设置serifs slab并开启cv74、cyrl/en tailed-top-left-serifed等变体检查 U0424BGR 本地化、U0480/U0481、U04A5 的字形是否自动获得正确衬线。字形覆盖回归本次多项修复涉及follow变体链如 KOPPA 跟随C/topSerif、S WITH CURL 跟随sSwash升级后建议用字体验证工具逐字符核对相应码位确认自定义cv组合未引入新的衬线缺失。版本信息核对构建完成后可在字体属性中确认 Name ID 5版本号、13许可证、11/12URL是否与namingOverride配置一致这是验证命名覆盖是否生效最直接的检查点。29.1.0 的全部改动均可通过仓库源码逐条追溯namingOverride的合并与写入逻辑在 packages/font/src/naming/index.mjs各字形修复分布在 packages/font-glyphs/src/letter 与 packages/font-glyphs/src/marks 之下完整的变更列表见 changes/archives/29.x/29.1.0.md。【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/Iosevka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表