如果将 a\rule
放置在文本行下方,则会在行和规则之间插入一些空间。通常,无论是否实际插入文本(参见图,右列,第 1/2 行)或没有插入文本(左列),空间量似乎都会精确地增加当前字体大小的高度差。但是,如果规则的高度超出字体高度,则行之间会有一些额外的空间(第 3 行)。
这个空间有多大?
(最后一行的目的是为了快速证明第 1-3 行两列的间距相同结果是独立实现的。)
\documentclass{article}
\usepackage{calc}
\usepackage{array}
\usepackage{xparse}
\renewcommand{\arraystretch}{3.5}
\newlength{\mydepth}
\newlength{\myheight}
\newlength{\mywidth}
\newlength{\colwidth}
\newsavebox{\mybox}
\sbox{\mybox}{\Huge ipsum}
\settodepth{\mydepth}{\Huge ipsum}
\settowidth{\mywidth}{\Huge ipsum}
\setlength{\colwidth}{\mywidth+2em}
%typeset \mybox underlined with a rule of mandatory height #3,
%and place an optional text #2 either right or left of the rule,
%as indicated by a star (#1).
\DeclareDocumentCommand{\placebox}{s o m}{
\begin{minipage}[b]{\mywidth+2em}%
\IfBooleanTF{#1}{%
\rule[-\mydepth]{2em}{\mydepth}%
\usebox{\mybox}\\%
\IfValueTF{#2}{#2}{}%
\rule{\mywidth+1em}{#3}%
}{%else invert left/right placement
\usebox{\mybox}%
\rule[-\mydepth]{2em}{\mydepth}\\%
\rule{\mywidth+1em}{#3}%
\IfValueTF{#2}{#2}{}%
}%fi
\end{minipage}%
}%
\begin{document}
\begin{tabular}{b{\colwidth}b{\colwidth}}
\placebox{1mm} & \placebox*[\Huge A]{1mm}\\[2em]
\placebox{1mm} & \placebox*[A]{1mm}\\
\placebox{2mm} & \placebox*[A]{2mm}\\
\placebox{4mm} & \placebox*[A]{4mm}\\
\end{tabular}
\end{document}
答案1
为了理解这种行为,有必要了解 TeX 基本规则。这些规则使用三个维度高度、宽度和深度来定义:
\vrule height1pt width 1pt depth0pt fjord\par
\hrule height1pt width 100pt depth0pt fjord
LaTeX 定义\rule
使用这些伪装的原语如下:
\def\rule{\@ifnextchar[\@rule{\@rule[\z@]}} width height raised
\def\@rule[#1]#2#3{%
\leavevmode
\hbox{%
\setlength\@tempdima{#1}%
\setlength\@tempdimb{#2}%
\setlength\@tempdimc{#3}%
\advance\@tempdimc\@tempdima
\vrule\@width\@tempdimb\@height\@tempdimc\@depth-\@tempdima}}
如果我们首先使用 TeX 基元构造一个示例,
\vrule height1pt width 1pt depth0pt fjord
\hrule height1pt width 100pt depth0pt fjord
我们得到
我们得到了与 LaTeX 规则不同的行为,因为它们是在水平模式下排版的,并且 TeX 根据需要添加了正常的 parskip。
\rule{1pt}{1pt}fjord fjord fjord fjord\par
\rule{30pt}{1pt}fjord fjord fjord fjord
完全最小
\documentclass{article}
\parindent0pt
\parskip0pt
\begin{document}
\vrule height0.4pt width 1pt depth0pt fjord\par
\hrule height0.4pt width 30pt depth0pt fjord
\rule{1pt}{1pt}fjord fjord fjord fjord\par
\rule{30pt}{1pt}fjord fjord fjord fjord
\end{document}
示例中的剩余空间量通常为 LaTeX plus 的 lineskip \parskip
。改变 parskip 值以查看行如何移动。请注意,两者都从字母的基线开始规则。