如上图,对于 $Ff(x)$
这种不太高的行间公式,其与上下文的垂直间距比下面的 $\frac{p}{q}$
还大,这一点让我感到别扭。
从我的测试来看,这个现象并不是 \abovedisplay(short)skip
和 \belowdisplay(short)skip
造成的,而是因为行距。让我们看一下消除 \abovedisplay(short)skip
和 \belowdisplay(short)skip
的效果:
\documentclass{article}
\makeatletter
\renewcommand\normalsize{%
\@setfontsize\normalsize{10pt}{10pt}%
\abovedisplayskip 0pt
\abovedisplayshortskip 0pt
\belowdisplayshortskip 0pt
\belowdisplayskip 0pt
}
\linespread{2}
% \everydisplay{\linespread{1}\selectfont}
\usepackage{amsmath}
\begin{document}
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
Ff(x)
\]
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
\frac{p}{q}
\]
text text text text text text text text text text text
\begin{align*}
b &= c \\
&= d
\end{align*}
text text text text text text text text text text text text text text text text text text text text text text text text
\end{document}
为了让效果明显,我增加了行距。可以看到,高度较低的行间公式与上下文的间距看起来更大,就是行距带来的。
为了让行间公式最高处与上文的垂直间距等于行间公式最低处与下文的垂直间距,需要做以下两步:
\documentclass{article}
\makeatletter
\renewcommand\normalsize{%
\@setfontsize\normalsize{10pt}{10pt}%
\abovedisplayskip 0pt
\abovedisplayshortskip 0pt
\belowdisplayshortskip 0pt
\belowdisplayskip 0pt
}
\linespread{2}
\everydisplay{\linespread{1}\selectfont}
\usepackage{amsmath}
\begin{document}
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
Ff(x)
\]\par\nointerlineskip\@doendpe
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
\frac{p}{q}
\]\par\nointerlineskip\@doendpe
text text text text text text text text text text text
\begin{align*}
b &= c \\
&= d
\end{align*}\par\nointerlineskip\@doendpe
text text text text text text text text text text text text text text text text text text text text text text text text
\end{document}
此时再设置 \abovedisplay(short)skip
和 \belowdisplay(short)skip
,效果就不别扭了:
\documentclass{article}
\makeatletter
\renewcommand\normalsize{%
\@setfontsize\normalsize{10pt}{10pt}%
\abovedisplayskip 6pt
\abovedisplayshortskip 0pt
\belowdisplayshortskip 6pt
\belowdisplayskip 6pt
}
\linespread{1.36}
\everydisplay{\linespread{1}\selectfont}
\usepackage{amsmath}
\begin{document}
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
Ff(x)
\]\par\nointerlineskip\@doendpe
text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
\frac{p}{q}
\]\par\nointerlineskip\@doendpe
text text text text text text text text text text text
\begin{align*}
b &= c \\
&= d
\end{align*}\par\nointerlineskip\@doendpe
text text text text text text text text text text text text text text text text text text text text text text text text
\end{document}
现在我的问题总结如下:
老生常谈的问题。ams 的 align(*) 环境比较特殊,会额外修改 \abovedisplay(short)skip, \belowdisplay(short)skip
的值。 如果想整体修改,可以使用 hook. 此外,对于多行公式内部的行间距也会受字体字号影响,可以用 \jot
整体修改,或者使用 \\[<num>]
局部修改
\documentclass{article}
\usepackage{amsmath,lipsum,}
\AddToHook{env/align*/before}{\vskip-3.5ex}
\AddToHook{env/align*/after}{\vskip-0.5ex}
\jot=-0.2ex
\begin{document}
\lipsum[1][1-2]
\[
Ff(x)
\]
\lipsum[1][1-2]
\[
\frac{p}{q}
\]
\lipsum[1][1-2]
\begin{align*}
b &= c \\
&= d
\end{align*}
\lipsum[1][1-2]
\end{document}
你有点误解我的意思,不过你给的
\AddToHook
倒是给了我灵感。amsmath
包提供了两条命令:后续的各种公式环境都以这两条命令开始或结束,因此我可以重定义
\dollardollar@end
为\def\dollardollar@end{$$\par\nointerlineskip\@doendpe}
,这样就可以消除所有行间公式与下一行的 ‘interlineskip’。我测试是有效的,但是我不清楚这样做是否会带来问题。