![测量线/列的“实际”高度(作为 \baselineskip 的倍数)](https://linux22.com/image/257218/%E6%B5%8B%E9%87%8F%E7%BA%BF%2F%E5%88%97%E7%9A%84%E2%80%9C%E5%AE%9E%E9%99%85%E2%80%9D%E9%AB%98%E5%BA%A6%EF%BC%88%E4%BD%9C%E4%B8%BA%20%5Cbaselineskip%20%E7%9A%84%E5%80%8D%E6%95%B0%EF%BC%89.png)
我试图在设置线条时测量几行的高度。我认为线条的“实际”高度是基线跳跃,例如 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
(不要使用\height
LaTeX 中保留的)应该去外部的定义\boxheight
。