
Iosevka 32.2.0Quasi-Proportional 宽度体系下 M 宽小写字母、f 连字与保加利亚西里尔 Ef 的排版调优【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/IosevkaIosevka 32.2.0 的更新日志changes/archives/32.x/32.2.0.md虽然条目不多却集中展示了 Iosevka 构建系统中一个典型的工程化排版问题如何在「准等宽Quasi-Proportional」字族中对 M 宽M-width字符做有规律的进度宽度压缩。读完本文你将理解 32.2.0 三处变更各自针对哪些字符、为何需要这些微调以及这些行为在当前 Iosevka 构建管线中由哪些参数与源码逻辑实际驱动从而能在自定义构建custom build时预判不同宽度家族的排版效果。32.2.0 变更全景根据 changes/archives/32.x/32.2.0.md本版本共包含三项变更使 M 宽的小写大写形式small-capital字符在 Quasi-Proportional 字族下略变窄使拉丁小写连字 ffUFB00至 fflUFB04在 Quasi-Proportional 字族下略变窄优化保加利亚西里尔文大小写 EfU0424、U0444的字形。前两项都指向同一套机制Quasi-Proportional 字族的「差异化进度宽度缩放」体系第三项则是一次与保加利亚正字法相关的字形精修。下面分节展开。变更一M 宽 small-capital 字符在 Quasi-Proportional 下变窄原文档列出受影响的 16 个字符及码位完整清单如下字符码位说明LATIN LETTER SMALL CAPITAL OEU0276拉丁小写大写形式 OEGREEK SMALL LETTER SANU03FB希腊小写 Sigma 的独立形式CYRILLIC SMALL LETTER EMU043C西里尔小写 мCYRILLIC SMALL LETTER EM WITH TAILU04CE带尾形的 мLATIN LETTER SMALL CAPITAL AEU1D01拉丁小写大写形式 AELATIN LETTER SMALL CAPITAL MU1D0D拉丁小写大写形式 MLATIN LETTER SMALL CAPITAL WU1D21拉丁小写大写形式 WGREEK LETTER SMALL CAPITAL PSIU1D2A希腊小写大写形式 ΨTELEPHONE SIGNU2121电话符号形状为小写大写 MFACSIMILE SIGNU213B传真符号 FXM 宽CYRILLIC SMALL LETTER SOFT EMUA667西里尔软 м用于乌克兰语等LATIN LETTER SMALL CAPITAL TURNED MUA7FA翻转 M 的小写大写形式MODIFIER LETTER SMALL CAPITAL AAU10780修饰字母小写大写 AAMODIFIER LETTER SMALL CAPITAL OEU107A3修饰字母小写大写 OEMODIFIER LETTER CYRILLIC SMALL EMU1E03B修饰字母西里尔 м这份清单的共同点很清晰这些字符在字形宽度分类上都属于「M 宽」级别——即比常规字符宽、但比 M 本尊MM 宽窄一档。small-capital 字符常出现在数学排版、语言学标注、国际单位与通讯符号如ℳ、℣中在等宽字族中它们的宽度不影响对齐但在 Quasi-Proportional 字族中进度宽度advance width的差异会真实影响文本的自然度。32.2.0 的调整让这一整族字符的宽度与字形实际视觉宽度更匹配避免出现「字形瘦了、字距没瘦」的松散感。背后的机制advanceScale 参数族Iosevka 的 Quasi-Proportional 字族并非手工逐个调整字距而是由一组「进度宽度缩放因子」统一驱动。在 params/parameters.toml 中可以看到基础定义# Diversed advance width scale factors, used in quasi-proportional families advanceScaleMM 1 # Extra-wide letters advanceScaleM 1 # M-like letters advanceScaleT 1 # T-like letters (with serifs) advanceScaleF 1 # f-like letters advanceScaleI 1 # i-like letters (with serifs/tails) advanceScaleII 1 # Extra-narrow letters (like i without serifs/tails) advanceScaleSp 1 # Whitespace characters而真正启用 Quasi-Proportional 的预设位于同文件 params/parameters.toml# Quasi-proportional [spacing-quasi-proportional] spacing 3 isQuasiProportional true advanceScaleMM 1.5 # 9/6 advanceScaleM 1.3333333333333 # 8/6 advanceScaleT 1.1666666666666 # 7/6 advanceScaleF 0.8333333333333 # 5/6 advanceScaleI 0.6666666666666 # 4/6 advanceScaleII 0.5 # 3/6 advanceScaleSp 0.5833333333333 # 7/12几个要点缩放因子以 UPM 基准宽度为「6」的分母来取整MM 宽字符拿到 9 单位、M 宽 8 单位、T 宽 7 单位窄字 f/i 分别压到 5、4、3 单位空格为 7/12。这种「有理数比值」设计保证了同一字符族在不同字重下的宽度关系稳定可预测。advanceScaleM对应的正是 32.2.0 第一条变更作用的「M 宽」字符带small-capital 字符在构建中被归入该宽度类别后其进度宽度随advanceScaleM收缩。还存在一个「仅宽字扩展」的变体 spacing-quasi-proportional-extension-only只保留 MM/M/T 的加宽f/i/空格保持等宽适合更保守的宽度变化偏好。这些参数并非静态配置从源码结构看构建管线支持按权重/字宽曲线对指标参数做插值覆盖packages/param/src/metric-override.mjs 中validMetricOverrideFields白名单即包含了advanceScaleSp等字段配合blend插值函数允许自定义构建在斜体/不同权重下动态计算缩放因子。变更二ff/ffi/ffl/ffl 连字在 Quasi-Proportional 下变窄原文档第二条变更Make LATIN SMALL LIGATURE FF (UFB00) ... LATIN SMALL LIGATURE FFL (UFB04) slightly narrower under Quasi-Proportional.即ff、fi、fl、ffi、ffl五个连字全部纳入宽度调整。这里的源码证据非常直接在 packages/font-glyphs/src/auto-build/composite.ptl 中这些连字通过createPhoneticLigatures按宽度类别分组建模createPhoneticLigatures ToLetter phonetic1 para.advanceScaleM 2 stdShrink 1 : list list 0xFB00 { f f } null list 0xFB01 { f/compLigLeft1 dotlessi/compLigRight } null list 0xFB02 { f/compLigLeft3 l/compLigRight } null createPhoneticLigatures ToLetter phonetic2 para.advanceScaleMM 2 stdShrink 1 : list ... list 0xFB05 { longs/compLigLeft t/compLigRight } null list 0xFB06 { s/compLigLeft t/compLigRight } null createPhoneticLigatures ToLetter phonetic3 [mix 1 para.advanceScaleM 2] 3 stdShrink 1 : list list 0xFB03 { f/compLigLeft2 f/compLigLeft1 dotlessi/compLigRight } null list 0xFB04 { f/compLigLeft4 f/compLigLeft3 l/compLigRight } null从中可以看出UFB00UFB02ff/fi/fl作为「双 f 结构」的连字整体归入phonetic1类别进度宽度按para.advanceScaleM缩放——即与 M 宽字符同一档UFB03/UFB04ffi/ffl是三段结构用[mix 1 para.advanceScaleM 2]在 1.0 与 M 宽之间取折中避免三段字形被过度压缩UFB05/UFB06st 连字等则按advanceScaleMM归入更宽一档。因此「让 ff…ffl 在 Quasi-Proportional 下略变窄」在实现层面等价于让这些连字从原来的等宽进度宽度切换到跟随advanceScaleM的差异化进度宽度。这也解释了为何 32.2.0 把 small-capital 与 f 连字放在同一次变更中——它们共享同一宽度缩放通道是同一类「M 宽带」排版一致性问题的两次收口。变更三保加利亚西里尔 Ef 字形优化Optimize glyphs for Bulgarian Cyrillic Capital/Small Letter Ef (U0424,U0444).U0424Ф/U0444ф在不同斯拉夫地区书写传统中形态不同俄语传统下大写 Ф 左右两弧近似对称、形似西格玛的镜像变体而保加利亚书写传统下大写 Ф 的左弧常带一个向下的钩descender hook小写 ф 的写法也略有差异。Iosevka 作为覆盖全 Unicode 的等宽字体需要为地区性变体提供字形或 OpenType 变体支持本次变更即是对这一字形形态的打磨。它不涉及宽度体系属于字形级glyph-level的形状优化与 32.2.0 中另外两项宽度调优相互独立。如何在当前仓库中验证这些行为上述机制在当前仓库中都有可查证的锚点便于进一步深入参数与预设params/parameters.toml 的[spacing-quasi-proportional]段给出了全部缩放因子的实际取值也是理解 32.2.0 两条宽度变更的入口。字体构建入口packages/font/src/build-font/index.mjs 中buildFont依据para.isQuasiProportional走assignFontNames命名分支并调用buildGlyphs(para)生成字形宽度缩放因子正是在这一阶段经由para传入字形构建。连字宽度类别packages/font-glyphs/src/auto-build/composite.ptl 列出了 ff/fi/fl/ffi/ffl 等连字的分组与缩放因子绑定。递归构建中的宽度回退packages/font-glyphs/src/auto-build/recursive-build.ptl 在派生子字形构建时会把forkedPara的各advanceScale*重置为 1避免缩放被叠加——这解释了为何只有顶层连字/字符受 Quasi-Proportional 影响而字形内部的复合部件不会被重复压缩。适用前提与限制32.2.0 的所有宽度变更仅在 Quasi-Proportional及其衍生变体字族中生效在等宽Monospace字族中所有字符共享同一进度宽度这些调整不会出现。缩放因子的具体数值来自仓库当前版本的 params/parameters.toml随版本演进可能变化引用时以对应版本的实际配置为准。字符级影响范围以 changes/archives/32.x/32.2.0.md 列出的码位清单为准该清单描述的是 32.2.0 当时的受影响集合后续版本可能继续扩充或调整。小结Iosevka 32.2.0 是一份小而典型的「宽度一致性」更新日志16 个 M 宽 small-capital 字符与 5 个 f 系列连字被统一纳入 Quasi-Proportional 的advanceScaleM缩放带保加利亚西里尔 Ef 则完成了一次地区字形精修。从文档追溯到 params/parameters.toml 的参数定义与 packages/font-glyphs/src/auto-build/composite.ptl 的连字构建代码可以看到 Iosevka 用「参数化的宽度类别」而非逐字符手工调整来实现准等宽排版——这正是其构建系统可定制、可预测的核心所在。【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/Iosevka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考