fix(xeCJK): 修复 fntef 周期装饰的相位与接点#1024
Conversation
🔍 PR 审查
未发现需要修改的问题。无重叠路径仅作用于波浪线和斜删除线,普通形式、减号形式的端点处理及窄片段保护逻辑一致;新增回归覆盖了标点、字号、换行、弹性间距和宽图案配窄正文等关键场景。 验证说明已完成完整 diff、相关 ulem 调用路径、测试输入与预期基线的静态审计,并通过 本次审查由 Codex 主链路 (gpt-5.6-sol) 完成。 |
|
已核实,Bot 未提出需要修改的问题。补充运行证据:固定提交 |
🔍 PR 审查
未发现需要修改的问题。周期装饰的内部重叠已被清零,减号形式的首尾留白也得到保留;新增回归覆盖了跨行、标点、不同字号、相邻装饰及窄片段场景。 验证限制尝试运行 xeCJK 的相关 本次审查由 Codex 主链路 (gpt-5.6-sol) 完成。 |
🔍 PR 审查
未发现需要修改的问题。新的波浪线与斜删除线单元按字号缩放,并保留既有的 leaders 与端点几何; 验证说明已检查完整 diff 与工作树、相关调用路径、测试基线及 本次审查由 Codex 主链路 (gpt-5.6-sol) 完成。 |
|
已核实,本轮 Bot 审查没有提出 blocking、important 或 minor 问题。补充其 runner 缺少 TeX 工具链的验证缺口:固定提交 |
ee8e275 to
b836d8e
Compare
🔍 PR 审查
周期装饰的常规路径覆盖较完整,但新增末段状态不能安全支持项目已声明允许的 fntef 嵌套。 重要建议 (1)
验证限制已完成完整 diff、当前工作树及相关 llmdoc 的静态审查,并执行 本次审查由 Codex 主链路 (gpt-5.6-sol) 完成。 |
问题
xeCJKfntef基于ulem把正文拆成多个装饰片段。原来的\CJKunderwave使用固定字号的lasy6波浪符号,\CJKxout使用数学字体中的斜线;装饰单元的宽度与正文字号、字宽和实际伸缩后的
CJKglue没有稳定比例。正文片段、中文字间距和命令端点又会分别排出 leaders,因此在字符、标点、相邻命令和
换行处可能出现相位跳变、局部过密、连接断开或左右不均。
这个问题同时有三项约束:同一行的波浪线或斜线必须共享相位;相邻带
-命令之间必须有明确断口;整段装饰必须始终相对正文居中。只清零
\UL@pixel、只缩短图案周期,或只更换 leader 类型,都不能同时满足这三项约束。
下面三张图由同一份单页 MWE编译得到。三次编译使用相同的字体、字号、正文、150 mm × 105 mm 页面和 600 dpi 渲染;三张 PNG 都是 3544 × 2481 像素,差别只有所加载的 xeCJK 提交。
01d5624a)\leaders方案(bd3edb54)44a7be68)-命令之间没有断口修改
l3draw绘制宽1em/4的图案;振幅、高度和线宽随当前
em缩放,常规全角字符每字约容纳四个周期,斜删除线不再依赖数学字体。\leaders。正文片段、固定或伸缩后的CJKglue以及换行后的片段落在同一个相位网格上;外层水平位移不会让各片段重新选择相位。
可见范围。普通形式相对正文左右各外伸半周期;带
-形式左右各内缩半周期。两种形式都不改变正文宽度和断行,相邻带
-命令之间恰好留下一个周期的断口。-形式首段后的第一个可断CJKglue,在断点两侧各放一个净宽为零的半周期连接。不换行时两半相接;换行时分别止于上一行末尾和下一行开头。裁切内部的
leaders 前加入 penalty 10000,避免 PDF 的
gsave/grestore被拆到两行。ulem会追加随后删除的结尾语法空格;实现结合\UL@spfactor哨兵与装饰片段宽度区分它、正文中的真实源码空格和普通后续片段。空参数、空分组以及不产生节点的
正文继续保持零宽、零高、零深,不会凭空留下一个装饰周期;真实源码空格仍按原宽度
排版并绘制装饰。
l3draw会把负纵坐标归一化成盒子高度,绘图盒本身的 depth 为零。默认斜线约高.93em,使用时整体下移.09em,实际覆盖约为基线下.09em至基线上.84em,使斜线同时覆盖常见全角汉字的高度和深度。
\quad、显式\hskip和CJKglue都继续使用普通 leaders 路径。underwave/symbol只有保持默认值时才进入上述处理;用户自定义波浪符号继续使用历史
\xleaders行为。字体、字号和伸缩胶水
补充矩阵 MWE覆盖:
-形式;CJKglue和换行。在这组常见全角 CJK 字体中,字体和字重主要影响异常是否醒目;字号、非一 em 字宽、
标点、特殊盒子和实际胶水宽度会直接参与几何计算。本 PR 不要求伸缩后的
CJKglue恰好是图案周期的整数倍。
验证
fntef-phase01把 XDV 转为不压缩 PDF,再由 Lua 读取页面横坐标,检查相位、普通/带
-形式的对称端点、固定/伸缩胶水、相邻命令断口和普通显式跳距。fntef-underline-offset固定真正的l3draw图案在 8pt、10.53937pt、15pt 下的宽、高、深;同时检查空参数、空分组、不产生节点的正文和真实源码空格。节点与换行
回归使用同尺寸轻量盒子检查 leaders、裁切结构和断行行为。
l3build check,113/113 通过。l3build doc通过,生成 243 页xeCJK.pdf和 51 页xunicode-symbols.pdf;日志确认加载工作树生成的xeCJKfntef.sty。pdftotext -raw和-layout下都只包含正文,没有波浪线、斜线或自定义装饰字符。
git diff --check通过。Closes #1012