ctex宏包ziju命令的问题
ziju命令有3个问题:
问题1:
如上图,因为感觉宋体太密了,所以我用ziju命令(ziju{0.1})微调了一下宋体的字距。但是因为xeCJK的默认设置AllowBreakBetweenPuncts是禁止的,所以曰后面的:“不允许断开,导致上一行又额外空了一个字,但是空出来的间距,由于ziju命令默认计算出来的plus xxxx太小了(plus xxxx应该是少算了一个字的间距),所以无法均匀分布。
问题2:
使用CTeX的文档类(比如ctexbook)时,由于ctex-engine-xetex.def中\l__ctex_ccglue_skip会更新\CJKglue的值,
\cs_new_protected:Npn \ctex_update_ccglue:
{
\cs_set_protected:Npn \CJKglue
{ \skip_horizontal:N \l__ctex_ccglue_skip }
}
会导致xeCJK的CJKglue选项设置无效。搞得我花了很长时间找原因。
这个问题如果不好修改,建议在xeCJK的文档中的CJKglue选项中说明,在直接使用CTeX的文档类时,字距用ziju命令修改。
问题3:
还是如问题1的图。我是左右文白对照的双栏排版,使用的是paracol宏包。但是ctexbook.cls中的\ctex_update_ziju:命令中,使用的还是\linewidth。在双栏排版时,\linewidth是不正确的。这个也会导致ziju的glue计算不正确。
更正:\linewidth是对的,我搞错了。
ziju命令有3个问题: 问题1:
如上图,因为感觉宋体太密了,所以我用
ziju命令(ziju{0.1})微调了一下宋体的字距。但是因为xeCJK的默认设置AllowBreakBetweenPuncts是禁止的,所以:“不允许断开,导致上一行又额外空了一个字,但是空出来的间距,由于ziju命令默认计算出来的plus xxxx太小了(plus xxxx应该是少算了一个字的间距),所以无法均匀分布。
不知道是你打错字了还是什么情况,这个「在」字没显示出来。
不是打错字了,左边是文言文,是没有”在“字的。可以看文字版和扫描版的对比。
上面我自己修改了ziju命令后的排版结果。
附MWE:
\documentclass[zihao=5]{ctexbook}
\setCJKmainfont{SimSun}
\begin{document}
\noindent\ziju{0.1}{这这是一个这是一个这是一个,这是一个这是一个这是一个这是一个:“测试”这是一个测试}
\end{document}

附MWE:
\documentclass[zihao=5]{ctexbook} \setCJKmainfont{SimSun} \begin{document} \noindent\ziju{0.1}{这这是一个这是一个这是一个,这是一个这是一个这是一个这是一个:“测试”这是一个测试} \end{document}
这个和第一张图片里的空隙不一样大吧?如果是按这张图里的效果那似乎没有问题?
是的,刚才那个MWE有点问题,我刚刚发现了,准备删掉……/捂脸 这次的MWE是真的可以了:
\documentclass[zihao=5]{ctexbook}
\usepackage{paracol}
\usepackage{geometry}
\geometry{a4paper,includehead=true,top=2.6cm,left=2.3cm,bottom=2.6cm,right=2.3cm}
\xeCJKsetup{PunctStyle=banjiao}
% 消除Overfull \hbox (0.1pt too wide) in paragraph at lines xxx--xxx告警
\sloppy
\setCJKmainfont{SimSun}
\setlength{\columnsep}{1.5em}
\begin{document}
\begin{paracol}{2}
\switchcolumn[0]*
\zihao{-4}\ziju{0.1}\indent{红楼梦是一部具,有世界影响力的:“人情小说,中国封建社会的百科全书。”}
\switchcolumn[1]
\zihao{5}\indent{红楼梦是一部具,有世界影响力的:“人情小说,中国封建社会的百科全书。”}
\end{paracol}
\end{document}

使用
CTeX的文档类(比如ctexbook)时,由于ctex-engine-xetex.def中\l__ctex_ccglue_skip会更新\CJKglue的值,\cs_new_protected:Npn \ctex_update_ccglue: { \cs_set_protected:Npn \CJKglue { \skip_horizontal:N \l__ctex_ccglue_skip } }会导致xeCJK的
CJKglue选项设置无效。搞得我花了很长时间找原因。
@ostaith 你说得对,目前 \ziju 算出来的 \l__ctex_ccglue_skip 不够好(plus 减少、出现了 minus 部分),在栏宽较窄、(因遵守标点禁则)断行位置较少时,会出现你截图里的问题。可以直接设置 CJKglue 来绕过,例如 \xeCJKsetup{CJKglue=\hskip .1\ccwd plus .08\baselineskip}(例子有简化):
\documentclass{ctexart}
\xeCJKsetup{PunctStyle=banjiao}
\begin{document}
\def\theccglue{\expandafter\the\csname l__ctex_ccglue_skip\endcsname}
\def\test#1{{#1 ccluge skip = \theccglue\par
红楼梦是一部具,有世界影响力的:“人情小说,中国封建社会的百科全书。”\par}}
\hsize=225.4pt
\zihao{-4}\sloppy
\test{}
\test{\ziju{.1}}
\test{\xeCJKsetup{CJKglue=\hskip .1\ccwd plus .08\baselineskip}}
\end{document}

PS:\indent 命令不接受参数,所以(在你例子中)无需使用 \indent{<文字>}。实际上那两处 \indent 可以省略,因为 ctex 保证了每个段落都有首行缩进。
texdoc xecjk

应该是半角标点后的弹性长度缩放权重过大,导致看起来不协调。可以试试设置 RubberPunctSkip 为 false。
但是将RubberPunctSkip设置为false或者minus后,又会有一堆的Underfull告警,类似于这样的:
Underfull \hbox (badness 10000) in paragraph at lines 292--292
\TU/SimSun(0)/m/n/12.045 曰: “请 与 子 论 功 可 乎? ”| 田 文 曰: “可。 ”| 起
[]
有鱼跟熊掌兼得的办法么?
在行长较短时,无论排版西文还是中文,就是会因为可断行位置不足而产生不少 underfull \hbox 信息,建议忍一忍。