负胶水语义

负胶水语义

这个问题是关于诸如 之类的粘连的语义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)。

相关内容