在这段代码中:
\documentclass{ctexart}
\usepackage{xeCJKfntef}
\NewDocumentCommand{\mycmd}{mm}{#1\quad#2}
\NewDocumentCommand{\mycme}{m}{\makebox[3em][s]{#1}}
\NewDocumentCommand{\mycmf}{m}{\begin{CJKfilltwosides}[b]{3em}#1\end{CJKfilltwosides}}
\begin{document}
\mycmd 余华是我文学上的老师。
\mycme{余华}是我文学上的老师。
\mycmf{余华}是我文学上的老师。
\end{document}
使用xelatex
编译后,会得到由\mycme
产生的Underfull \hbox (badness 10000)
警告。
根据 TeXBook Chapter 14 的这段描述:
可知是盒子内的伸缩情况与实际的伸缩能力的比值过高,超过了$\sqrt[3]{100}$,但是反过来看这个\mycme
的定义,我只是希望它能制作一个宽度为3个汉字宽度的水平盒子,并且能够装下两个汉字,然后使用分散对齐,在这种情况下,其中的伸缩情况与伸缩能力的比值是如何计算的呢?或者说,这个警告是如何产生的呢?
可参考的定义(latexdef -s \makebox
)如下:
% latex.ltx, line 14452:
\DeclareRobustCommand\makebox{%
\leavevmode
\@ifnextchar(%)
\@makepicbox
{\@ifnextchar[\@makebox\mbox}}%
Windows系统下:
\makebox
总宽3em,而汉字占2em,故实际伸长占1em,换算成绝对尺寸,在ctex默认的时候,应该是五号中易宋体,根据ctex手册节5.2表4,字体尺寸为10.5bp,故实际伸长10.5bp;\CJKglue
,即\hskip 0pt plus 0.08\baselineskip
,而ctexart
文档类默认的行距因子是1.3,所以最大伸长能力是0.08\baselineskip=10.5bp*1.3*0.08=1.092bp
;Underfull \hbox (badness 10000)
来警告。这样计算正确吗?
@u101077 just curious: 行距因子会影响水平粘连(?)
@u70550 我搞错了,
\baselineskip
是基础行距,所以0.08\baselineskip
就是0.08倍基础行距的意思,与行距因子无关。这样的话,比值是12.5?@u101077 使用 ctex 时,
\baselineskip
与字体大小的关系是b=f*1.2*1.3
,可参看 ctex 的文档,所以最终的比值是 8.x。@u10307
这个?
这么理解的话:
0.08\baselineskip=10.5bp*1.2*1.3*0.08=1.3104bp
.所以比值是10.5bp/1.3104bp=8.0128... .
所以水平粘连真的跟行距因子有关了???
@u101077 对。其实也不难想象,行距更大文字间距也可以相应变大。
虽然我不是很明白上面的讨论,但是
\hskip 0pt plus 0.08\baselineskip
依赖于\baselineskip
进而依赖于行距因子
有点反直觉了...也许对于更大的行距,更大的文字间距才更加match?
@u70550 这样想的话,这个
\baselineskip
用于\CJKglue
就很巧妙了,不是吗?@u10307 但是,我还是疑惑
b=f*1.2*1.3
里的1.2
是什么?@u101077 在

ctex
里搜1.2
((^_^)):