CTeX-org / CTeX-org/ctex-kit

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

Open
#992 4 comments 1 reaction 1 assignee View on GitHub

@Liam0205 is already working on this.

Since Jul 18, 2026.

discussion package/xeCJK wishlist
Dominant language
TeX
Stars
1.1k
Forks
128
Avg merge
1h 25m
Merged PRs (30d)
5

Description

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

问题

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

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

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

当前状态

逐命令结果记录在命令边界状态表中。每个编号分别列出 xCJKecglue=falsexCJKecglue=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 合并后的 master 1b77613b 重新验证。

状态表中的 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。

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.