CTeX-org / ctex-kit

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

夹注包:夹注之后行末单字不能自动断行 #634

Closed chianjin closed 1 year ago

chianjin commented 1 year ago

又要麻烦 @qinglee 兄了。

夹注之后行末单字不能断行

我猜想应该是某种禁则阻止了行末单字后自动断行,翻看 xeCJK 等文档,未找到相关说明。请问该如何解决。

chianjin commented 1 year ago

经过尝试,发现导致出现这种情况的表面原因了。我在尝试设置字体大小为营造尺三分,换算为9.6mm,如果直接以 9.6mm 来设置 \fontsize 就会出现这种情况。

以 1 inch = 72.27pt 换算,9.6mm 相当于 27.31465 pt,以 1 inch =72 pt 换算,相当于 27.21260 pt。尝试了 27.3pt,结果仍然出现上述问题。尝试 27pt 、27.2pt 没问题。扩大范围尝试发现,与整数部分无关,只要小数部分在某些特定值的附近就会出现上述情况。

可能是浮点运算误差导致的问题。

很有意思的一个现象。

chianjin commented 1 year ago

当然,本人并了解底层的算法实现,猜测是浮点数转换时的精度问题,这个问题在计算机技术当中很常见。这种转换误差对结果一般不会有很严重的影响,即使有也很少见,除非时一些特殊情况。

如果这个问题真的是因为浮点数精度问题,我也算头一会遇到显著影响的例子。

chianjin commented 1 year ago

也有可能是底层算法在某些数值点上有发散趋势,当然都是我猜测的。

qinglee commented 1 year ago

夹注包中与此相关的是 \__jiazhu_good_break: ,你可以尝试清空此命令看一下

\cs_set_eq:NN \__jiazhu_good_break: \prg_do_nothing:

如果还不行,就得提供完整例子具体分析。

chianjin commented 1 year ago

感谢答复。清空 \__jiazhu_good_break:命令,不能解决问题。

行宽是直接由字符尺寸和每行字数计算后设置的,最初设置是字符大小 9.6mm,每行 21 字符。又试验了不同字符大小和每行字数组合,结果各不相同,除了发现与整数部分无关之后,没有其他什么规律。所以,我倾向认为是浮点数转换以及后期计算结果截断造成的。

还好问题并不大,通过微调字符尺寸即可避免,微调也是很小的,在 0.01pt 量级,也就几微米到几十微米。肉眼看不出来,按 600dpi 算,一个像素到不了。

所以,就不纠结了。

chianjin commented 1 year ago

看了下 jiazhu.sty里代码,\__jiazhu_good_break:是处理夹注与正文之间的断行。

现在这个问题是,夹注后正文第一个字符之后的断行,应该与\__jiazhu_good_break:没有直接的关系。

RuixiZhang42 commented 1 year ago

行末单字无法断行,是因为单字前面没有可伸展的空白。

具体来说,若想要在单字后顺利断行,该单字必须顶格,而唯一的办法是拉伸该单字与其前面夹注之间的空白。但若此空白无法伸展,那么TeX就找不到合法的断行点,从而硬要放俩字而导致overfull。

解决方法是为afterskip增加弹性(为了对称可以为beforeskip加上同样的弹性),例如:afterskip=0pt plus 0.1em这样。