我需要知道 lrbox 的高度,然后才能在代码中使用。出于某种原因,我的代码给出了奇怪的不正确的值。
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\newsavebox{\jhbin}
\begin{lrbox}{\jhbin}
\par\begin{tabular}{c}
Jim Hef{}feron\\
Many lines is\\ comming.
\end{tabular}
\end{lrbox}
\newlength{\heightofhw}
\settoheight{\heightofhw}{\hbox{\jhbin}}
Wrong Height = \the\heightofhw
\usebox{\jhbin}
\end{document}
有什么想法可以做到正确吗?
答案1
里面\par
什么lrbox
也不做。
为什么身高“错误”?因为你没有测量它。你只是测量了某个随机角色的身高。
如果你查看日志文件,你会看到该行\jhbin=\box46
。
如果您尝试,会发生什么\hbox{\jhbin}
?您会得到一个句点。为什么?因为 ASCII 46 就是句点。如果您定义其他保存框,您将得到不同的字符。
由于实施的原因,\newsavebox{\jhbin}
实际上存储在\jhbin
一个数字中;如果单独使用,这将使用当前字体打印具有该数字的字符。
你可以这样做\settoheight{\heightofhw}{\usebox{\jhbin}}
,但也许你不想要这个,而是真实的框的高度。tabular
默认情况下,A 的排版一半在基线上方,一半在基线下方(实际上,比基线上方的一半略高一点)。
如果你这样做
\begin{lrbox}{\jhbin}
\begin{tabular}[b]{c}
Jim Hef{}feron\\
Many lines is\\ comming.
\end{tabular}
\end{lrbox}
\settoheight{\heightofhw}{\usebox{\jhbin}}
Right Height = \the\heightofhw
你得到
右高度 = 32.39996pt
因为使用此[b]
选项,表格的底行将位于基线上。当然
\setlength{\heightofhw}{\ht\jhbin}
更简单。
但是,由于底部的“g”,因此这不是表格的完整垂直尺寸。您可以使用以下方法获取完整垂直尺寸
\setlength{\heightofhw}{\dimexpr\ht\jhbin+\dp\jhbin\relax}
这将给出36pt
(因为表格有三行)。
答案2
为什么要将盒子放在 中\hbox
?\hbox
显然会“吞掉”高度。 可以使用 来检索盒子的高度\ht
。\settoheight
内部使用它,如果您已经有一个盒子,则无需使用它。 因此,结果是您只需要
\heightofhw=\ht\jhbin
如同
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\newsavebox{\jhbin}
\begin{lrbox}{\jhbin}
\par\begin{tabular}{c}
Jim Hef{}feron\\
Many lines is\\ comming.
\end{tabular}
\end{lrbox}
\newlength{\heightofhw}
\heightofhw=\ht\jhbin
Height = \the\heightofhw
\usebox{\jhbin}
\end{document}