CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
966 stars 124 forks source link

xeCJK 宏包中一系列`\xeCJK_clear_Boundary_and_CJK_toks:`命令是否没有必要? #608

Closed SainoNamkho closed 2 years ago

SainoNamkho commented 2 years ago

想要得到一个Boundary,那么之前已经从CJK和全角标点进入其他类别了,我看实现里全部都插入了\egroup,这些清空的操作似乎全部无效

RuixiZhang42 commented 2 years ago

我一开始也以为「Clear Boundary」是没有必要的,推断方式与你完全一致,等到我实际尝试重构 newxeCJK 时才发现它的必要性。

简单一例:\par 中文\par。第一步就是从 Boundary 进入 CJK 的「中」,但并不是直到「文」之后才回到 Boundary。读入「中」之后,再读「文」,这时根据「CJK 到 CJK」,中间就要插入 \CJKglue。这一步结束之后,就要看 \CJKglue 跟「文」之间插入什么了,所以才必须要清除「边界到 CJK」之间的东西。

也正因为清除的必要性,才发现了 XeTeX 引擎层面的一个 bug:直接将 inter-char token register 赋空值会直接让 XeTeX 陷入死循环,所以才赋 \prg_do_nothing:。不过这个 bug 已经在 2020 被 Clerk Ma 修好了,现在可以赋空值,但是这个 fix 好像引入了新的 bug(我遇到过,清空了进入边界的 register 之后,会吞掉边界的输入的空格)。

qinglee commented 2 years ago

有必要,如楼上所说,不清除的话,会陷入死循环。