10 用基于makebox命令定义的命令,为什么会报溢出的水平盒子警告?

发布于 2025-05-09 21:11:41

在这段代码中:

\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 的这段描述:
image.png
可知是盒子内的伸缩情况与实际的伸缩能力的比值过高,超过了$\sqrt[3]{100}$,但是反过来看这个\mycme的定义,我只是希望它能制作一个宽度为3个汉字宽度的水平盒子,并且能够装下两个汉字,然后使用分散对齐,在这种情况下,其中的伸缩情况与伸缩能力的比值是如何计算的呢?或者说,这个警告是如何产生的呢?
可参考的定义(latexdef -s \makebox)如下:

% latex.ltx, line 14452:
\DeclareRobustCommand\makebox{%
  \leavevmode
  \@ifnextchar(%)
    \@makepicbox
    {\@ifnextchar[\@makebox\mbox}}%

查看更多

关注者
0
被浏览
167
1 个回答
雾月
雾月 1天前
这家伙很懒,什么也没写!

xecjk 会在 cjk 文字之间插入 \CJKglue,这个值一般为 \hskip 0pt plus 0.08\baselineskip,这个 stretch 比较小,一般小于 1em,在宽度为 3em 时,两个汉字间需要插入的空白大于 cjkglue 的伸长部分,所以会报 warning。

英文空格会变成一个 glue,根据需要会使用 \spaceskip\xspaceskip;xecjk 的中文与西文之间会插入 \CJKecglue,都可以用于控制所插入的空白的 stretch 和 shrink。

CJKfilltwosides 就调整了 \CJKglue,使得空白可以无限伸长。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览