这个问题是关于诸如 之类的粘连的语义0pt plus -1fill
,其中 前面的系数fill
是负数。以下最小示例显示了我尝试通过经验弄清楚这一点:
\documentclass{article}
\begin{document}
\noindent
\framebox[80pt]{\hskip 0pt plus 1fill 2 \hskip 0pt plus 2fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill 1 \hskip 0pt plus 1fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill 0.1 \hskip 0pt plus 0.1fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill $-0.5$ \hskip 0pt plus -0.5fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill $-1$ \hskip 0pt plus -1fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill $-2$ \hskip 0pt plus -2fill} \\
\framebox[80pt]{\hskip 0pt plus 1fill $m2$ \hskip 0pt minus 2fill}
\end{document}
输出如下:
比较 -2 和 m2 行,我们发现plus -2fill
确实与 不同minus 2fill
。-0.5 行对我来说很有意义。我说我希望两个空间的比率为 -0.5,看起来 tex 就是这样做的。左侧的空间为正,而右侧的空间为负,大约是其一半。
我不明白的是 -1 和 -2 的结果。它们似乎无法从前面的示例逻辑地推断出来。这只是数据结构内部实现的某种产物,比如整数溢出之类的东西吗?
-------------- 后来添加的材料 -------------
经过更多的尝试,我想我至少理解得更清楚了一点。此代码产生以下输出。
\documentclass{article}
\begin{document}
\newcommand{\foo}[1]{%
\noindent{}$#1$\hfill%
\framebox[20pt]{\hskip 0pt plus 1fill{}.\hskip 0pt plus #1fill}%
\hfill\par%
}
\foo{-0.5}\foo{-0.6}\foo{-0.7}\foo{-0.8}\foo{-0.9}\foo{-1}
\foo{-1.1}\foo{-1.2}\foo{-1.3}\foo{-1.4}\foo{-1.5}
\end{document}
这是有道理的,因为它试图在左侧放置一定量的空白 L,在右侧放置一定量的空白 R,使得 L+R=w 和 R/L=x,其中 w=20 pt,x 是数字,例如上述代码中的 -0.5。这些方程的解是 L=w/(1+x),这就是我们所看到的图形。对我来说仍然有点奇怪的是它如何处理 x=-1,因为没有解。
有关的:TeX 无穷数的数学描述?
答案1
让我们从第四个开始研究例子,因为前三个没有问题。我将用吨文本的自然宽度和瓦要求的宽度。
第四和第六个例子
自从吨<瓦,胶水必须伸展才能填充瓦–吨。可用的拉伸是无限的(fill
单位),细分为1fill
和-0.5fill
。因此拉伸比为0.5,这意味着((瓦–吨)/0.5)*1 将进入第一个胶水和((瓦–吨)/0.5)*(-0.5) 将进入第二个粘连。这当然意味着文本将超出框架范围。
第六个示例类似,但负胶水会比正胶水更宽,因此文本会粘在框架的左侧。
第五个例子
这里我们的情况有所不同。在链接的问题中,我描述了\advance
粘合寄存器上的操作。当 TeX 构建一个盒子时,它会使用以下操作将可用的粘合相加:是7和然后应用函数γ。因此,两个fill
无穷大相互抵消,并且正常的胶水被添加到\framebox[80pt]{...}
复活,因此您可以获得与 相同的结果\framebox[80pt]{$-1$}
。
当您说\makebox[80pt]{<text>}
(框架无关紧要)时,LaTeX 基本上会将其翻译为\hbox to 80pt{\hfil<text>\hfil}
。如果胶合中的拉伸分量<text>
抵消,就像这里的情况一样,这两个\hfil
命令将起作用,因为没有更高阶的无限胶合可以取代它们。您会收到一条Underfull \hbox
消息
\framebox[80pt][s]{\hskip 0pt plus 1fill $-1$\hskip 0pt plus -1fill}
因为该[s]
选项会让 LaTeX 不\hfil
从任一端插入。
第七个例子
由于胶水必须伸展,因此minus
忽略组件。因此结果与您执行的操作相同\framebox[80pt]{\hfill m2}
(因为\hfill
相当于\hskip0pt plus 1fill
)。