CTeX-org / ctex-kit

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

xeCJK: 硬换行+空格+引号会影响间距 #536

Closed stone-zeng closed 3 years ago

stone-zeng commented 4 years ago
\documentclass{article}
\usepackage{xeCJK}
\begin{document}

% 有换行,「2」前后无空格,引号前面有空格 -> 有 bug
填空。\\
第2自然段写林, “林”的特点是颜色绿。

\mbox{}

% 有换行,「2」后无空格,引号前面有空格 -> 有 bug
填空。\\
第 2自然段写林, “林”的特点是颜色绿。

\mbox{}

% 有换行,「2」前后无空格,引号前面无空格 -> 无 bug
填空。\\
第2自然段写林,“林”的特点是颜色绿。

\mbox{}

% 有换行,「2」前后有空格,引号前面有空格 -> 无 bug
填空。\\
第 2 自然段写林, “林”的特点是颜色绿。

\mbox{}

% 有换行,「2」前后无空格,无引号 -> 无 bug
填空。\\
第2自然段写林, 林的特点是颜色绿。

\mbox{}

% 无换行,「2」前后无空格,引号前面有空格 -> 无 bug
第2自然段写林, “林”的特点是颜色绿。

\end{document}

image

log 中给出的信息(意料之中)是

Underfull \hbox (badness 10000) in paragraph at lines ...
RuixiZhang42 commented 4 years ago

可以用

\showboxdepth=1 \showboxbreadth=9999 \showlists

诊断问题。出现 bug 的两处,可以找到如下内容:

.\TU/FandolSong-Regular(0)/m/n/10 ,
.\rule(0.0+0.0)x-6.92
.\penalty -10000
.\glue(\rightskip) 0.0
\penalty 150
\glue(\baselineskip) 2.26003
\hbox(7.81+1.80998)x345.0, glue set 247.29001fil
.\rule(0.0+0.0)x-5.85
.\TU/FandolSong-Regular(0)/m/n/10 “林

这个 \penalty -10000 等同于 plain TeX 的 \break,即强制换行(同时还拉开所有的 glue,又为了「不丑到整个段落」,拉开的还只有这一行),见 The TeXbook Exercise 14.33。

初步分析是 xeCJK「吞掉空格」之后(closing 到 boundary 到 opening)还了一个不该还的 penalty。