CTeX-org / ctex-kit

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

jiazhu 宏包排版时前后字距不均 #619

Open ChihSee-Hsie opened 2 years ago

ChihSee-Hsie commented 2 years ago

如题,我在使用 upLaTeX 排版时用到了 jiazhu.sty,感觉比较好,惟其夹注前后字距发生了变化,具体见下图:

Untitled

可见其第一行夹注之前是密排,夹注之后到行末「不寐」二字变成分散对齐。我想这可能与 jiazhu.sty 在插入夹注时需要断行有关,但尚不知如何解决。有方家能解答此惑者,我在此预致谢忱。

RuixiZhang42 commented 2 years ago

这是 jiazhu 宏包算法上的局限。简单来说,每当需要插入新夹注的时候,就得知道该行的正文还剩余多少空间;剩余空间足够的话就直接把新夹注放在这一行,剩余空间不足的话就得对新夹注做折行的处理。

jiazhu 宏包借用「行间公式」(相当于 \[...\])来获取这个信息,结果就是某种「贪心算法」:一旦出现新夹注,新夹注前面的正文就会变成「段落的最后一行」,从而左对齐(直排就是顶对齐),自然就是密排;而新夹注后面的正文则是在剩余的空间里排布,若剩余空间不足整数个字,则多余的空白只会均摊到这些「后面的正文」中去。同一行连续出现好几个夹注的时候,多余的空白只会均摊到「最后一个正文片段」。在你的例子中,最后一个正文片段仅有两个字,所以多余的空白会全部集中在这两个字之间^1,尤其明显。

目前,我想不到什么算法能够代替「行间公式」,所以你能尝试的解决方案就是手动微调。假设你的例子中:正文一行 17 字、夹注字号为正文一半,字距不均的那行正文有 13 字、两个夹注占据两个正文字空间,一共就是 15 字,余下空白加到夹注的 beforeskipafterskip 即可。例如:

...汎\jiazhu[beforeskip=0.5em plus 1pt minus 1pt,afterskip=0.5em plus 1pt minus 1pt]{芳梵反}%
彼柏舟亦汎其流耿耿\jiazhu[beforeskip=0.5em plus 1pt minus 1pt,afterskip=0.5em plus 1pt minus 1pt]{古幸反}%
不寐...
ChihSee-Hsie commented 2 years ago

感谢回复。我在想这种特殊排版有没有可能用编译多次的方式解决——第一次只计算出盒子的长度,第二次将盒子作为一个元素与字符共同排版,往中间填字。

我并不了解 LaTeX 编译的底层逻辑,这只是一个粗浅的想法。但 LaTeX 生成各种标签以及目录都需要编译两次甚至三次,是否有可能提供借鉴呢?