Open ostaith opened 2 years ago
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
信息,建议忍一忍。
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
的值,会导致xeCJK的
CJKglue
选项设置无效。搞得我花了很长时间找原因。 这个问题如果不好修改,建议在xeCJK的文档中的CJKglue
选项中说明,在直接使用CTeX
的文档类时,字距用ziju
命令修改。问题3: 还是如问题1的图。我是左右文白对照的双栏排版,使用的是
paracol
宏包。但是ctexbook.cls
中的\ctex_update_ziju:
命令中,使用的还是\linewidth
。在双栏排版时,\linewidth
是不正确的。这个也会导致ziju
的glue
计算不正确。 更正:\linewidth
是对的,我搞错了。