CTeX-org / ctex-kit

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

ctex宏包ziju命令的问题 #606

Open ostaith opened 2 years ago

ostaith commented 2 years ago

ziju命令有3个问题: 问题1: image 如上图,因为感觉宋体太密了,所以我用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是不正确的。这个也会导致zijuglue计算不正确。 更正:\linewidth是对的,我搞错了。

stone-zeng commented 2 years ago

ziju命令有3个问题: 问题1: image 如上图,因为感觉宋体太密了,所以我用ziju命令(ziju{0.1})微调了一下宋体的字距。但是因为xeCJK的默认设置AllowBreakBetweenPuncts是禁止的,所以:“不允许断开,导致上一行又额外空了一个字,但是空出来的间距,由于ziju命令默认计算出来的plus xxxx太小了(plus xxxx应该是少算了一个字的间距),所以无法均匀分布。

不知道是你打错字了还是什么情况,这个「在」字没显示出来。

ostaith commented 2 years ago

image image 不是打错字了,左边是文言文,是没有”在“字的。可以看文字版和扫描版的对比。 上面我自己修改了ziju命令后的排版结果。

ostaith commented 2 years ago

附MWE:

\documentclass[zihao=5]{ctexbook}
\setCJKmainfont{SimSun}
\begin{document}
\noindent\ziju{0.1}{这这是一个这是一个这是一个,这是一个这是一个这是一个这是一个:“测试”这是一个测试}
\end{document}

image

stone-zeng commented 2 years ago

附MWE:

\documentclass[zihao=5]{ctexbook}
\setCJKmainfont{SimSun}
\begin{document}
\noindent\ziju{0.1}{这这是一个这是一个这是一个,这是一个这是一个这是一个这是一个:“测试”这是一个测试}
\end{document}

image

这个和第一张图片里的空隙不一样大吧?如果是按这张图里的效果那似乎没有问题?

ostaith commented 2 years ago

是的,刚才那个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}

image

muzimuzhi commented 2 years ago

使用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}

image

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

qinglee commented 2 years ago
texdoc xecjk

image

应该是半角标点后的弹性长度缩放权重过大,导致看起来不协调。可以试试设置 RubberPunctSkipfalse

ostaith commented 2 years ago

但是将RubberPunctSkip设置为false或者minus后,又会有一堆的Underfull告警,类似于这样的:

Underfull \hbox (badness 10000) in paragraph at lines 292--292
\TU/SimSun(0)/m/n/12.045 曰: “请 与 子 论 功 可 乎? ”|  田 文 曰: “可。 ”|  起
 []

有鱼跟熊掌兼得的办法么?

muzimuzhi commented 2 years ago

在行长较短时,无论排版西文还是中文,就是会因为可断行位置不足而产生不少 underfull \hbox 信息,建议忍一忍。