这里,则称astrut
定义为:
\rule[-.3\baselineskip]{0pt}{\baselineskip}
但是,如果我这样做:
\newlength{\strutheight}
\settoheight{\strutheight}{\strut}\printlength{\strutheight}
\printlength{\baselineskip}
它打印:
8.39996pt 12.0pt
8.39996
等于0.7*12
。但是,我不明白的是,根据其定义,支柱的高度应该是\baselineskip
,因为-.3\baselineskip
仅指垂直对齐偏移。为什么 会\settoheight
产生\strut
这种行为?
答案1
的高度所有的 \strut
是,但它比基线\baselineskip
低。其深度加上其高度总计为:0.3\baselineskip
\baselineskip
\documentclass{article}
\begin{document}
\newlength{\strutheight}
\newlength{\strutdepth}
\settoheight{\strutheight}{\strut}
\settodepth{\strutdepth}{\strut}
$\the\strutheight+\the\strutdepth=\the\baselineskip$
\end{document}
这将打印8.39996pt + 3.60004pt = 12.0pt
。
在 TeX 中,框的“高度”不是其总高度,而是高于基线的高度,而“深度”是框低于基线的量。当您这样做时,\settoheight
您只会获得框的高度,而不是总高度。
您可以画出它\strut
的高度和深度来查看:
\documentclass{article}
\begin{document}
\fboxsep0pt
\fboxrule0.1pt
\fbox{\strut}
\fbox{\rule{0pt}{0.7\baselineskip}}
\fbox{\rule[-0.3\baselineskip]{0pt}{0.3\baselineskip}}
\end{document}
答案2
那么,的定义\strut
是
% latex.ltx, line 594:
\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
代码\rule[-0.3\baselineskip]{0pt}{\baselineskip}
是一种不太有效的说法\unhcopy\strutbox
,但本质上是一样的。支柱的一部分是以下基线,用于处理带有降部字符(如p
或 )y
。
每当处理命令时就会\strutbox
更新:\fontsize
% latex.ltx, line 2808:
\def\set@fontsize#1#2#3{%
\@defaultunits\@tempdimb#2pt\relax\@nnil
\edef\f@size{\strip@pt\@tempdimb}%
\@defaultunits\@tempskipa#3pt\relax\@nnil
\edef\f@baselineskip{\the\@tempskipa}%
\edef\f@linespread{#1}%
\let\baselinestretch\f@linespread
\def\size@update{%
\baselineskip\f@baselineskip\relax
\baselineskip\f@linespread\baselineskip
\normalbaselineskip\baselineskip
\setbox\strutbox\hbox{%
\vrule\@height.7\baselineskip
\@depth.3\baselineskip
\@width\z@}%
\let\size@update\relax}%
}
因此,这\strutbox
是一个包含零宽度规则的框,其高度为基线跳过的 70%,深度为基线跳过的 30%。
\ht\strutbox
您可以通过以下方式访问当前尺寸\dp\strutbox
:
\documentclass{article}
\begin{document}
\the\ht\strutbox\ (height)
\the\dp\strutbox\ (depth)
\the\dimexpr\ht\strutbox+\dp\strutbox\ (total)
\the\baselineskip\ (baselineskip)
\end{document}