我一直在尝试使用 LaTeX,试图真正深入了解间距的工作原理。以下是我一直在尝试的一段愚蠢的代码:
\documentclass[]{article}
% Draw a raised \hrulefill
\newcommand{\hmidrule}[1]
{\leavevmode \leaders
\hbox{\rule[#1]{1pt}{.4pt}}
\hfill \kern0pt }
% Draw a divider with a given ornament in the middle
\newcommand\divider[2][0.33em]
{\par\noindent\hmidrule{#1}{#2}\hmidrule{#1}\par}
\begin{document}
\divider{\large\ A\ }
%%
{\hspace*{\fill}
\huge {This is the First and Last Line.}
\hspace*{\fill}} % <--- Keep this line in mind!
%%
\divider{\large\ $\Omega$\ }
\end{document}
这产生了我所期望的结果:居中文本顶部和底部的间距最小。
然后我输入了\par
这一行:
% ...
\huge {This is the First and Last Line.}
\hspace*{\fill}\par} % <--- Added `\par` here.
%%
% ...
我预计不会发生任何变化,因为结束这个段落不会造成任何变化;该段落已经在那里结束了,但我还认为它可以在居中文本下方切实地添加一些垂直空间。
然而,结果是这样的:垂直空间前居中文本!
我真的不明白为什么会发生这种情况。为什么在文本后添加此命令会导致文本前出现空格?是不是因为 LaTeX 试图将其格式化为段落文本?如果是这样,为什么在我添加之前它没有在那里添加空格\par
?
如果有任何其他反馈,我们将非常感激。
我正在使用 pdfLaTeX 在 Overleaf 上编译我的代码。使用 XeTeX 也会出现同样的结果。
答案1
区别在于,带有 的\par
段落设置了相对于 的baselineskip \huge
,而没有则不设置。
如果您想要精确控制装饰规则和标题之间的间距,最好的方法是使用 禁用过渡时的行间距\nointerlineskip
。
我提供了一个不同的定义\divider
,避免猜测维度的需要。
\documentclass[]{article}
% Draw a divider with a given ornament in the middle
\newlength{\dividerht}
\newcommand{\hmidrule}{%
\leaders\hrule
height \dimexpr0.5\dividerht+0.2pt
depth \dimexpr-0.5\dividerht+0.2pt
\hfill\kern0pt
}
\newcommand\divider[1]{%
\par\noindent
\settoheight{\dividerht}{#1}%
\par\noindent\hmidrule{#1}\hmidrule\par
}
\begin{document}
\divider{\large A}\nointerlineskip\vspace{6pt}
{\centering\huge This is the First and Last Line.\par}
\nointerlineskip\vspace{6pt}
\divider{\large $\Omega$}
\bigskip
\divider{\large A}\nointerlineskip\vspace{6pt}
{\centering\huge This is the First line and this title is so long that
it splits across lines.\par}
\nointerlineskip\vspace{6pt}
\divider{\large $\Omega$}
\end{document}
如果您希望底部规则相对于标题底线的基线有间距,则需要删除深度:
\divider{\large A}\nointerlineskip\vspace{6pt}
{\centering\huge This is the First line and this title is so long that
it splits across lines.\par}
\vspace{-\prevdepth}\nointerlineskip\vspace{6pt}
\divider{\large $\Omega$}