撤消上一次垂直跳过

撤消上一次垂直跳过

我想了解方框和跳跃的大小,所以我决定直接在其他文本上方排版文本。我不想使用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页:

例外:规则框前后不插入行间粘连。您也可以通过设置\nointerlineskipbetween 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}

相关内容