为什么 \parbox 的 \settoheight 不起作用?

为什么 \parbox 的 \settoheight 不起作用?

考虑以下代码:

\documentclass[a4paper]{letter}
\usepackage{calc}
\usepackage{printlen}

\newsavebox{\foobox}
\newlength{\fooboxheight}

\savebox{\foobox}{
    \parbox[t]{\textwidth}{Line 1\\Line 2\\Line 3\\Line 4}
}
\settoheight{\fooboxheight}{\usebox{\foobox}}

\begin{document}

\usebox{\foobox}


Address box height: \printlength{\fooboxheight} \uselengthunit{mm} \printlength{\fooboxheight}

\end{document}

\fooboxheight是 7pt / 2mm,比 的高度小很多\parbox!这是为什么?我应该怎么做才能得到 的真实高度\parbox

有趣的是,如果\parbox被 包围\frame,则一切正常。

答案1

插入线条

\showthe\ht\foobox
\showthe\dp\foobox

一切都会清楚:的高度\foobox确实是 6.83331pt,正如您所发现的那样。另一方面,深度是 36pt。请注意,框具有高度和深度,从框的基线测量。在这种情况下,发生这种情况是因为您使用了\parbox[t]。如果您切换到,\parbox[b]事情可能会更像您预期的那样,至少就高度计算而言。但是,当然,框的基线可能不在您需要的位置。

答案2

calc软件包还提供了命令\totalheightof\settototalheight,“totalheight”是高度和深度的总和。

答案3

这是因为[t]选项。它将官方parbox基线设置为第一行的基线。因此,height框的高度是第一行的高度。其余部分现在是官方的一部分depth

您需要的是所谓totalheightheight+ width。没有用于此的原始函数,因此没有\settototalheight。但是,如果您已经在保存框中拥有材料,则无论如何都不需要使用这些宏,但可以使用\ht\dp\wd获取保存框的高度、深度和宽度。

可以totalheight使用“calc”包来计算:

\usepackage{calc}
%...
\setlength{\fooboxheight}{\ht\foobox+\dp\foobox}

或者使用 eTeX 原语\dimexpr

\setlength{\fooboxheight}{\dimexpr\ht\foobox+\dp\foobox}

相关内容