我想了解方框和跳跃的大小,所以我决定直接在其他文本上方排版文本。我不想使用textpos
或类似的东西。我想弄清楚我需要多大的跳跃才能回到原来的位置。我希望绿色、红色和蓝色的方框完美重叠。
\documentclass{article}
\usepackage{color}
\newbox{\boxA}
\newlength{\skipA}
\savebox{\boxA}{\parbox{\textwidth}{\color{green}Hello\par World}}
\settoheight{\skipA}{\usebox{\boxA}}%
\newbox{\boxB}
\newlength{\skipB}
\savebox{\boxB}{\parbox{\textwidth}{\color{red}Hello\par World}}
\settoheight{\skipB}{\usebox{\boxB}}%
\begin{document}
\usebox{\boxA}\par\vspace{-\skipA}
\usebox{\boxB}\par\vspace{-\skipB}
\parbox{\textwidth}{\color{blue}Hello\par World}
\end{document}
答案1
有许多这里涉及的因素有很多。其中最主要的是行间粘连;Knuth 使用术语“粘连”来表示手动或自动地堆叠属于段落一部分的框时。
我们先看一个简单的案例。
\sbox{\boxA}{World}\sbox{\boxB}{World}
\usebox{\boxA}\par
\usebox{\boxB}
第一行底部与第二行底部之间的距离将等于\baselineskip
(如果强制使用十点大小,则默认值为 12pt)。在这种情况下,TeX 将在两行之间插入一个垂直粘连,其值等于\baselineskip
与高度之差\boxB
。
使用不同的输入,例如
\sbox{\boxA}{planet}\sbox{\boxB}{planet}
\usebox{\boxA}\par
\usebox{\boxB}
插入的胶水是\baselineskip
“行星”的高度与深度(上一行)。如果该差异小于阈值(包含在参数中\lineskiplimit
),则将存在一个校正因子。
因此,要使线条重叠,你只需要说
\sbox{\boxA}{planet}\sbox{\boxB}{planet}
\usebox{\boxA}\par\vspace{-\baselineskip}
\usebox{\boxB}
因为这些盒子不会触发校正因素的插入。
的情况则\sbox{\boxA}{\parbox{\textwidth}{Hello\par World}}
完全不同,因为 TeX 将 视为一个\parbox
独特的对象,其高度的计算方式似乎很奇怪:取“表观总高度”(即,如果框位于其中最后一行的基线,则框的高度)并将其除以二;假设X是这样得到的长度,而d是最后一行的深度\parbox
;框的高度将是X+ 2.5pt,深度X– 2.5 分 +d。 因此
\usebox{\boxA}\par\usebox{\boxA}
做触发插入校正因子:两个盒子一个堆叠在另一个之上,TeX\lineskip
在它们之间插入粘连(默认 1pt)。因此,为了准确备份,您必须将 的深度\boxA
、其高度和相加\lineskip
:
\usebox{\boxA}\par\vspace{-\dp\boxA}\vspace{-\lineskip}\vspace{-\ht\boxA}
\usebox{\boxA}
(使用低级命令\ht
和直接访问框的尺寸更容易\dp
)。
为什么会有这种奇怪的计算?答案需要知道\vcenter
,但这并不重要。一旦知道了所涉及的盒子的高度和深度,在正常情况下很容易预测最终结果。
2.5pt 是从哪里来的?这不是一个通用值:这是针对 10pt 大小的 Computer Modern 字体的。实际值是排版时分数线与基线的距离$\frac{1}{2}$
。\vcenter
基元将框垂直居中于此数学轴. 数学轴的高度是当前数学符号字体中的一个参数。
答案2
要理解boxes
你应该避免parbox
你的例子失败,因为你没有调整parbox
。接下来你有一个跨行跳过——所以你需要\nointerlineskip
TeXBook第79页:
例外:规则框前后不插入行间粘连。您也可以通过设置
\nointerlineskip
between boxes 来禁止行间粘连。
要获取盒子的高度、深度或宽度,您还可以使用:
\wd\boxname % width of the box
\ht\boxname % height of the box
\dp\boxname % depth of the box
根据dp
您所看到的,盒子可以具有深度。
在示例中我只更改了前两个框。
\documentclass{article}
\usepackage{color}
\newbox{\boxA}
\newlength{\skipA}
\savebox{\boxA}{\parbox[b]{\textwidth}{\color{green}Hello\par World}}
\settoheight{\skipA}{\usebox{\boxA}}%
\newbox{\boxB}
\newlength{\skipB}
\savebox{\boxB}{\parbox[b]{\textwidth}{\color{red}Hello\par World}}
\settoheight{\skipB}{\usebox{\boxB}}%
\fboxsep=0pt
\begin{document}
\fbox{\usebox{\boxA}}\par\vspace{\dimexpr-\skipA-2\fboxrule\relax}\nointerlineskip
\fbox{\usebox{\boxB}}
\end{document}