Qing Lee
Qing Lee
按照目前 jiazhu 包的处理方式,例子可以等价精简为 ```TeX % !TeX program = pdftex \noindent \vrule width \hsize height 1pt \relax \goodbreak\quad\special{} \hrule \bye ``` `\goodbreak` 相当于在夹注结尾插入的 `\@@_good_break:` ,`\special` 相当于例子中设置的颜色。 `\@@_good_break:` 不是很必要,可以考虑在 `jiazhu` 中删去。颜色的话,考虑增加一个 `color`...
``` texdoc xecjk ```  应该是半角标点后的弹性长度缩放权重过大,导致看起来不协调。可以试试设置 `RubberPunctSkip` 为 `false`。
这样的话,`zhmCJK` 和 `ctex` 的 luatex 模块也要跟着改才好。
@leo-liu `ctex` 和 `zhmCJK` 我已经提交新版本到 CTAN 上了,`zhmCJK` 你也去提交一个新版本吧,我不是 `zhmCJK` 登记在案的提交者,我提交的话会费些周折。
xeCJK 会在字符与边界之间插入一些很小的 `\kern` 用于判断状态,这是从 CJK 包继承下来的技术。 只有边界是诸如 `\relax` 等不可展开的 primitive 时,以上机制才会起作用。如果边界是 `hbox`、`glue`、`whatsit` 等 TeX 项目时,这个机制就会失效。 我们可以在边界前后手动保存和恢复 xeCJK 用于判断的 `\kern` 来部分解决问题。可以参考 `GEB.cls` 中的 `\@@_save_node:` 和 `\@@_restore_node:` https://github.com/qinglee/GEB/blob/de8719725d4326bccfbd91ab251443aa4dc065a5/GEB.cls#L1568-L1598 用法与 LaTeX 内核的 `\@bsphack`...
内层有 `\parindent` 是否为 `0pt` 的判断一方面是出于兼容旧文档的考虑,因为那时没有 `autoindent` 选项,要想关闭自动调整段首缩进的功能,只能设置 `\parindent` 为 `0pt`。 另一方面,LaTeX 的一些结构是通过特殊的段落来实现的,一般都会将 `\parindent` 设置为 `0pt`,比如 `\@arrayparboxrestore`,`\centering` 这些。如果我们移除内层判断,就需要不断打补丁设置 `autoindent` 为 `false`,也并不「优雅」。 综合以上考虑,我认为还是保留内层判断比较好。
当初实现 xeCJK 的标点处理的时候,只简单考虑了简体中文的一般情况。对于繁体中文、日文、韩文和严肃的简体中文排版,标点处理的实现都亟需改进。 这方面问题(包括 #347, #382, #443, #456, #481 等)涉及 xeCJK 中比较基础的部分,需要通盘考虑,包括实现更为灵活的字符类处理机制和提供更加简单易用的标点符号处理接口。相关的代码都需要大改重构,但限于我的时间精力和兴趣,一直没有着手处理。「又不是不能用」XD
目前 `xeCJK` 中对破折号的处理确实是比较粗糙的,仅仅是保证破折号中间不会出现空白的情况,没有考虑到要占两个字宽和新字体的合字功能。大致看了一下上面的新算法,思路肯定是正确的,只需要处理一些实现的细节。
ruby 包会引入 CJK 包,CJK 包与 xeCJK 冲突。暂时的解决方法是 ```TeX %!TEX TS-program=xelatex \documentclass{article} \usepackage[UTF8]{ctex} \ExplSyntaxOn \ctex_at_begin_package:nn { ruby } { \tl_set:cn { [email protected] } { 9999/99/99 } } \ctex_at_end_package:nn { ruby }...