Skip to content

xeCJK:命令边界处的间距应由实际输出字符类别决定(长期追踪) #992

Description

@Liam0205

Note

本 issue 取代 #491,长期跟踪 xeCJK 在命令边界处的中西文及行内公式间距。#491 中的历史讨论、定点修复和图片仍保留作参考。

问题

命令夹在中文、西文、数字或行内公式之间时,边界间距应由命令实际排出的内容决定,并与去掉外层命令后的直接输入一致。

  • 首个或末个可见内容属于西文或数字时,对应边界应与直接输入这些内容一致;
  • 首个或末个可见内容属于中文时,对应边界应与直接输入中文一致;
  • 命令中包含行内公式时,应与直接输入同一公式一致,不能把公式改用西文字母作为比较基准;
  • 中西文混合输出应分别按照首、尾内容判断;
  • 没有可见输出的命令不应改变前后内容之间的边界。

比较时需要覆盖命令左右有无源码空格的四种组合,即 00100111。判定不能只看总宽度:一侧多出的间距可能与另一侧缺少的间距互相抵消;默认词间空格也可能恰好与 CJKecglue 等宽。因此测试同时使用左右混合方向、可区分间距和节点/断行回归。

当前状态

逐命令结果记录在命令边界状态表中。每个编号分别列出 xCJKecglue=falsexCJKecglue=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 策略。

维护方式

发现新的命令或边界组合时:

  1. 以相同可见内容的直接输入作为比较基准;
  2. 分别设置 xCJKecglue=falsexCJKecglue=true
  3. 在每种设置下检查 00100111 四种源码空格组合;
  4. 同时使用默认间距和可区分宽度的自定义间距;
  5. 左右边界分别检查;涉及可伸缩间距时再检查节点和实际断行;
  6. 修复合并并从 master 复验后,更新状态表、具体 MWE、截图和回归测试。

当所有已知且可以实现的组合都有回归测试,无法实现的组合也都有机制说明、支持边界和可用的规避方法时,可以关闭本 issue。

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions