xeCJK:命令边界处的间距应由实际输出字符类别决定(长期追踪)
@Liam0205 is already working on this.
Since Jul 18, 2026.
- Dominant language
- TeX
- Stars
- 1.1k
- Forks
- 128
- Avg merge
- 1h 25m
- Merged PRs (30d)
- 5
Description
[!NOTE]
本 issue 取代 #491,长期跟踪 xeCJK 在命令边界处的中西文及行内公式间距。#491 中的历史讨论、定点修复和图片仍保留作参考。
问题
命令夹在中文、西文、数字或行内公式之间时,边界间距应由命令实际排出的内容决定,并与去掉外层命令后的直接输入一致。
- 首个或末个可见内容属于西文或数字时,对应边界应与直接输入这些内容一致;
- 首个或末个可见内容属于中文时,对应边界应与直接输入中文一致;
- 命令中包含行内公式时,应与直接输入同一公式一致,不能把公式改用西文字母作为比较基准;
- 中西文混合输出应分别按照首、尾内容判断;
- 没有可见输出的命令不应改变前后内容之间的边界。
比较时需要覆盖命令左右有无源码空格的四种组合,即 00、10、01 和 11。判定不能只看总宽度:一侧多出的间距可能与另一侧缺少的间距互相抵消;默认词间空格也可能恰好与 CJKecglue 等宽。因此测试同时使用左右混合方向、可区分间距和节点/断行回归。
当前状态
逐命令结果记录在命令边界状态表中。每个编号分别列出 xCJKecglue=false 和 xCJKecglue=true;候选内容与直接输入使用相同的选项值。
- 普通命令分别在
xCJKecglue=false/true与默认/5pt/1pt 可区分间距下检查;四种配置均为 320/320 通过。 - 命令内行内公式分别检查“中·公式·中”“中·公式·西”“西·公式·西”“西·公式·中”;四种配置均为 272/272 通过。
command-boundary01执行 1668 个普通命令断言,command-boundary-math01执行 5504 次公式比较;当前 xeCJK 标准回归为 109/109 通过。- 原编号 28 的
\mbox{$x$}已并入编号 7\mbox的四个公式列,后续编号随之递补;\(x\)和\ensuremath{x}分别列为编号 30、31。 - #1003 已由 PR #1005 修复;#1002 已由 PR #1009 修复并关闭。上述公式结果从 PR #1009 合并后的
master1b77613b重新验证。
状态表中的 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。
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.