我对动态空间有疑问(根据文本高度动态调整 vspace) 并提示我应该使用可拉伸胶水。
使用 Google 搜索没有给我有用的答案。
如果有人能解释一下并给我一个简单的例子来理解它是如何工作的,我会很高兴。
答案1
在 TeX 中,任何胶水都由固定部分、可拉伸部分和可收缩部分组成。每个部分都可以为零。
表示粘连的一般形式是:<fixed part> plus <stretchable part> minus <shrinkable part>
。其中每个部分都可以用任何 TeX 单位(mm、cm、pt、em 等)表示。例如2cm plus 2mm minus 1mm
。
当组成一个包含胶合的盒子时,TeX 首先使用它们的“自然尺寸”,即固定部分(2cm
在上面的例子中)。如果生成的盒子未满,则 TeX 会扩展所有具有非零可拉伸部分的胶合,直到达到胶合中指定的量。在我们的例子中,胶合可以拉伸2mm
到最大值。如果盒子包含几个具有不同拉伸性的胶合,则每个胶合都会按给定的拉伸比例拉伸。如果在将所有胶合拉伸到最大值后盒子仍然未满,则会发出有关“盒子未满”的警告。
类似地,如果盒子太满,TeX 会尝试通过缩小胶合来减少空间。因此,在我们的示例中,最终插入的胶合可能在 1.9 厘米到 2.2 厘米之间变化,具体取决于包含该胶合的盒子的大小。
通常情况下,“外框”是页面,而粘连是段落或环境之间的垂直空间。LaTeX 设置这些空间总是有可伸缩的部分,这样 TeX 就可以调整这些粘连,并将页面的最后一行调整到底部。
更新:无限拉伸
plus
粘合部分可以通过以下关键字之一指定值“无穷大”:,fil
或fill
。filll
每个无穷大都“大于”前一个无穷大。这值得详细解释。
如果盒子中的所有粘连都具有有限可拉伸性(除了一个具有fil
可拉伸性的粘连),则整个盒子具有无限可拉伸性(它永远不会不充满),并且使盒子适应给定尺寸所需的所有拉伸都发生在该无限粘连处。这非常有用,例如,通过在垂直盒子之间插入,将垂直盒子中的第一行和最后一行分别“推”到顶部和底部\vskip 0pt 1fil
。在水平粘连的情况下,这可以用于将水平单词中的最后一个单词“推”到盒子的右边框上。
如果有两个同阶无限拉伸性的粘连(即:两者都有1fil
或两者都有1fill
或两者都有1filll
),则所需的拉伸将在这两个粘连之间平均分配。通过将一个无限粘连放在盒子的开头,将另一个无限粘连放在盒子的结尾,这对于将内容居中很有用。
如果其中一个无限大的阶比另一个高(比如,一个是 ,1fil
而另一个是1fill
),那么阶数较高的无限大将“获胜”并获得所有的拉伸,而另一个胶水则根本不会膨胀。
1
请注意,前面有一个fil
。此因子可以更改为任何其他数字,然后 TeX 会根据该因子按比例分配拉伸。因此,如果我们1fill
在框的开头有一个 粘连,2fill
在结尾处有另一个 粘连,则当框被拉伸时,第二个粘连会扩展两倍,结果是其他内容在框的前三分之一处“居中”。
TeX 提供了使用这些无限可拉伸粘连的一些快捷方式。您可以键入\vfil
等同于\vskip 0pt plus 1fil
和 ,类似地\vfill
,\hfil
(用于水平粘连)和\hfill
。
最后,无限可拉伸性也可以为负。在这种情况下,它会取消同一框中其他正无限可拉伸胶合的值。这种奇怪的胶合可用于实现某种“条件拉伸”,条件是正填充和负填充之间是否发生中断。如果发生中断,则扩展正填充并丢弃负填充。如果没有发生中断,则两个填充将相互取消,并且不会发生胶合扩展。\vfilneg
是 的简写\vskip 0pt -1fil
。
更新以下 MWE 展示了水平和垂直可拉伸胶水的不同示例:
\documentclass{article}
\begin{document}
\def\showhbox#1#2{\fboxsep=0pt\fbox{\hbox to #1{#2}}}
\long\def\showvbox#1#2{\parbox{3cm}{\fbox{\vbox to #1{#2}}}}
1. \showhbox{3cm}{Foo bar} space betwen words will be stretched beyond limits\par
2. \showhbox{3cm}{Foo\hfil bar} Same result, but without warning\par
3. \showhbox{3cm}{Foo bar\hfil} Flush left\par
4. \showhbox{3cm}{\hfil Foo bar} Flush right\par
5. \showhbox{3cm}{\hfil Foo bar\hfil} centered\par
6. \showhbox{3cm}{\hfil Foo \hfil bar\hfil} Evenly spaced\par
7. \showhbox{3cm}{\hfil Foo\hfil\hfil} "Centered" at first third\par
8. \showhbox{3cm}{\hfil Foo\hskip 0pt plus 2fil} Equivalent to the above\par
9. \showhbox{3cm}{\hfill Foo\hfil} The first fill "wins" the second fil, so flush right\par
\vskip 5mm
\showvbox{2cm}{Both\par at top}
\showvbox{2cm}{Top\vfil bottom}
\showvbox{2cm}{\vfil Both\par centered\vfil}
\showvbox{2cm}{\vskip 0pt plus 2fil 4 times more\par above than below\vskip 0pt plus 0.5fil}
\end{document}
输出结果如下:
更新无限收缩性
我们可以在粘合部分使用特殊关键字fil
,fill
和,但这是什么意思呢?有人可能会认为粘合的最小可能最终值为零,但实际上 TeX 可以继续将其缩小为负值。这些负值将导致负粘合分隔的框之间重叠。当为该部分指定一个时,粘合可以任意为负值。filll
minus
fil
minus
这对于重叠效果很有用,例如通过\rlap
或实现的效果\llap
(实际上是根据零宽度内的无限可收缩粘合定义的\hbox
)。
TeX 提供了 的快捷方式,\hss
相当于\hskip 0pt plus 1fil minus 1fil
。因此,这是一种可以无限拉伸和收缩的胶水,可用于制作特殊效果。例如,宏\centerline
定义为 ,\hbox
其宽度为 ,内容为{\hss#1\hss}
。使用\hss
代替 ,\hfill
可使行的内容大于行宽,在这种情况下,由于 ,这些内容将“溢出”到边距上,每个边距的量相同,这要归功于 和\hss
。
以下 MWE 展示了\hss
及其垂直对应部分的一些示例\vss
:
\documentclass{article}
\begin{document}
\def\showhbox#1#2{\fboxsep=0pt\fbox{\hbox to #1{#2}}}
\long\def\showvbox#1#2{\parbox{3cm}{\fbox{\vbox to #1{#2}}}}
Following boxes are all 2cm wide, no matter their contents:
1. \showhbox{2cm}{Foobar too long} ~~Overfull box warning\par
2. \showhbox{2cm}{\hss Foobar too long} ~~hss shrinks beyond zero, spilling to left\par
3. \showhbox{2cm}{Foobar too long\hss} ~~hss shrinks beyond zero, spilling to rigt\par
4. \showhbox{2cm}{\hss Foobar too long\hss} ~~Spills to left and right the same amount\par
\vskip 5mm
Following boxes are all 1cm tall, no matter their contents:
\vskip 5mm
\showvbox{1cm}{This is\par too much\par text\par and it spills out}
\showvbox{1cm}{\vss This is\par too much\par text\par and it spills out}
\showvbox{1cm}{\vss This is\par too much\par text\par and it spills out\vss}
\end{document}
结果: