Note
本 issue 取代 #491 ,长期跟踪 xeCJK 在命令边界处的中西文及行内公式间距。#491 中的历史讨论、定点修复和图片仍保留作参考。
问题
命令夹在中文、西文、数字或行内公式之间时,边界间距应由命令实际排出的内容决定,并与去掉外层命令后的直接输入一致。
首个或末个可见内容属于西文或数字时,对应边界应与直接输入这些内容一致;
首个或末个可见内容属于中文时,对应边界应与直接输入中文一致;
命令中包含行内公式时,应与直接输入同一公式一致,不能把公式改用西文字母作为比较基准;
中西文混合输出应分别按照首、尾内容判断;
没有可见输出的命令不应改变前后内容之间的边界。
比较时需要覆盖命令左右有无源码空格的四种组合,即 00、10、01 和 11。判定不能只看总宽度:一侧多出的间距可能与另一侧缺少的间距互相抵消;默认词间空格也可能恰好与 CJKecglue 等宽。因此测试同时使用左右混合方向、可区分间距和节点/断行回归。
当前状态
逐命令结果记录在命令边界状态表 中。每个编号分别列出 xCJKecglue=false 和 xCJKecglue=true;候选内容与直接输入使用相同的选项值。
状态表中的 MWE 均指向具体、可直接编译的 .tex 文件,不以目录、README 或“同上”代替。公式矩阵的四个入口为:
xCJKecglue=<glue> 会同时把 CJKecglue 设为该 <glue>,并启用 xCJKecglue。因此不为这一简写复制整张矩阵,只用独立回归测试检查它与显式设置 CJKecglue=<glue>, xCJKecglue=true 的结果相同。CJKspace 是另一项独立设置,不与 xCJKecglue 做全组合。
状态表只反映已经合并到 master 并重新验证的实现。未合并修复的测试结果应留在相应 PR 中,不能提前把红叉改成绿勾。
已知限制
TeX 的 glue 节点不记录它来自源码空格还是显式 \hskip。两者参数完全相同时,xeCJK 无法可靠区分;需要保留显式 glue 时,可以在它前面加入 \kern0pt,阻止边界恢复逻辑把它当作源码空格处理。
当前表格证明已经登记的命令与直接输入一致,不表示 xeCJK 可以推断任意用户宏的输出。新的命令仍需先确定其可见内容和比较基准,再选择相应的 capture/register 策略。
维护方式
发现新的命令或边界组合时:
以相同可见内容的直接输入作为比较基准;
分别设置 xCJKecglue=false 和 xCJKecglue=true;
在每种设置下检查 00、10、01、11 四种源码空格组合;
同时使用默认间距和可区分宽度的自定义间距;
左右边界分别检查;涉及可伸缩间距时再检查节点和实际断行;
修复合并并从 master 复验后,更新状态表、具体 MWE、截图和回归测试。
当所有已知且可以实现的组合都有回归测试,无法实现的组合也都有机制说明、支持边界和可用的规避方法时,可以关闭本 issue。
Note
本 issue 取代 #491,长期跟踪 xeCJK 在命令边界处的中西文及行内公式间距。#491 中的历史讨论、定点修复和图片仍保留作参考。
问题
命令夹在中文、西文、数字或行内公式之间时,边界间距应由命令实际排出的内容决定,并与去掉外层命令后的直接输入一致。
比较时需要覆盖命令左右有无源码空格的四种组合,即
00、10、01和11。判定不能只看总宽度:一侧多出的间距可能与另一侧缺少的间距互相抵消;默认词间空格也可能恰好与CJKecglue等宽。因此测试同时使用左右混合方向、可区分间距和节点/断行回归。当前状态
逐命令结果记录在命令边界状态表中。每个编号分别列出
xCJKecglue=false和xCJKecglue=true;候选内容与直接输入使用相同的选项值。xCJKecglue=false/true与默认/5pt/1pt 可区分间距下检查;四种配置均为 320/320 通过。command-boundary01执行 1668 个普通命令断言,command-boundary-math01执行 5504 次公式比较;当前 xeCJK 标准回归为 109/109 通过。\mbox{$x$}已并入编号 7\mbox的四个公式列,后续编号随之递补;\(x\)和\ensuremath{x}分别列为编号 30、31。master1b77613b重新验证。状态表中的 MWE 均指向具体、可直接编译的
.tex文件,不以目录、README 或“同上”代替。公式矩阵的四个入口为:xCJKecglue=false、默认间距;xCJKecglue=false、5pt/1pt;xCJKecglue=true、默认间距;xCJKecglue=true、5pt/1pt。xCJKecglue=<glue>会同时把CJKecglue设为该<glue>,并启用xCJKecglue。因此不为这一简写复制整张矩阵,只用独立回归测试检查它与显式设置CJKecglue=<glue>, xCJKecglue=true的结果相同。CJKspace是另一项独立设置,不与xCJKecglue做全组合。状态表只反映已经合并到
master并重新验证的实现。未合并修复的测试结果应留在相应 PR 中,不能提前把红叉改成绿勾。已知限制
TeX 的 glue 节点不记录它来自源码空格还是显式
\hskip。两者参数完全相同时,xeCJK 无法可靠区分;需要保留显式 glue 时,可以在它前面加入\kern0pt,阻止边界恢复逻辑把它当作源码空格处理。当前表格证明已经登记的命令与直接输入一致,不表示 xeCJK 可以推断任意用户宏的输出。新的命令仍需先确定其可见内容和比较基准,再选择相应的 capture/register 策略。
维护方式
发现新的命令或边界组合时:
xCJKecglue=false和xCJKecglue=true;00、10、01、11四种源码空格组合;master复验后,更新状态表、具体 MWE、截图和回归测试。当所有已知且可以实现的组合都有回归测试,无法实现的组合也都有机制说明、支持边界和可用的规避方法时,可以关闭本 issue。