测量线/列的“实际”高度(作为 \baselineskip 的倍数)

测量线/列的“实际”高度(作为 \baselineskip 的倍数)

我试图在设置线条时测量几行的高度。我认为线条的“实际”高度是基线跳跃,例如 12p 文档的高度为 14.5pt。但是,当我设置文本来vbox测量其高度时,我得到一行的高度为 10.7pt,两行的高度为 25pt。但它不应该分别是 14.5pt 和 29pt 吗?下面的 MWE 澄清了我的意思。

如何测量行高为高度的倍数baselineskip?我想要实现的是明确测量一个框中的行数。我认为一个聪明的策略是测量总高度并除以基线跳跃。

\documentclass[12pt]{scrartcl}

\usepackage{lipsum,lmodern,xspace}

\newcommand{\boxheight}[1]{%
 \newdimen\height
 \setbox0=\vbox{#1}
 \height=\ht0 \advance\height by \dp0
 #1
}

\begin{document}

\boxheight{\noindent A box with one line is \the\height\xspace high}

\vspace{3ex}

\boxheight{\noindent A box with \\ two lines is \the\height\xspace high}

\vspace{3ex}

\noindent The `real' height of one line is \the\baselineskip.

\end{document}

在此处输入图片描述

答案1

vbox 的高度是最后一行的深度与第一行的高度之间的距离。第一行没有额外的 baselineskip,因此您获得的只是一行的总高度(高度 + 深度),而对于两行,您只能获得它们之间的一个 baselineskip,等等。您应该能够通过在第一行的\strut开头和最后一行的结尾添加 来解决这个问题。
但是,如果您在中间更改字体大小,这将无法正常工作。为此,可以更改内部字体大小宏以\strut在任何大小更改之前和之后自动添加 s。

\documentclass[12pt]{scrartcl}

\usepackage{lipsum,lmodern}

\newdimen\height

\newcommand{\boxheight}[1]{%
 \setbox0=\vbox{\strut#1\strut}%
 \height=\ht0 \advance\height by \dp0
 #1%
}

\begin{document}

\boxheight{\noindent A box with one line is \the\height\space high}

\vspace{3ex}

\boxheight{\noindent A box with \\ two lines is \the\height\space high}

\vspace{3ex}

\noindent The `real' height of one line is \the\baselineskip.

\end{document}

给出:

一行的框高为 14.49998pt

一个有两条线的框高为 28.99998pt

一行的“实际”高度是 14.5pt。

我猜想,这个微小的差异是由于舍入误差造成的。

答案2

线的高度是不是基线跳过,一般来说。基线\baselineskip彼此分开是因为 TeX 在行之间添加了垂直空间。添加深度不足以获得\baselineskip

让我们看一下您的第一个例子:该行包含

 A box with one line is \the\height{} high

构造的高度\vbox是行中上升部分的最大高度,深度是下降部分的最大高度。在此特定情况下,您将“A”的高度添加到“p”(或“g”)的深度,分别为 8.38399pt 和 2.33331pt,总计 10.7173pt,这与报告的完全一致。

通过在框的开始和结束处添加,可以确保基线的倍数(除非\lineskiplimit机制开始起作用) :\strut

\documentclass[12pt]{scrartcl}

\usepackage{lmodern}

\newdimen\myheight
\newcommand{\boxheight}[1]{%
 \setbox0=\vbox{\strut#1\strut}
 \myheight=\ht0 \advance\myheight by \dp0
 #1}

\begin{document}

\boxheight{\noindent A box with one line is \the\height{} high}

\vspace{3ex}

\boxheight{\noindent A box with \\ two lines is \the\height{} high}

\vspace{3ex}

\noindent The `real' height of one line is \the\baselineskip.

\end{document}

这是结果(与预期值的偏差是由于 TeX 的二进制内部算法的工作方式造成的)

在此处输入图片描述

请注意\newdimen\myheight(不要使用\heightLaTeX 中保留的)应该去外部的定义\boxheight

相关内容