strut 和 baselineskip 之间的关系

strut 和 baselineskip 之间的关系

这里,则称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}

在此处输入图片描述

相关内容