考虑以下代码:
\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
。
您需要的是所谓totalheight
的height
+ width
。没有用于此的原始函数,因此没有\settototalheight
。但是,如果您已经在保存框中拥有材料,则无论如何都不需要使用这些宏,但可以使用\ht
和\dp
来\wd
获取保存框的高度、深度和宽度。
可以totalheight
使用“calc”包来计算:
\usepackage{calc}
%...
\setlength{\fooboxheight}{\ht\foobox+\dp\foobox}
或者使用 eTeX 原语\dimexpr
:
\setlength{\fooboxheight}{\dimexpr\ht\foobox+\dp\foobox}