100 行间公式与上下文的垂直间距问题

发布于 2025-09-07 15:08:25

image.png
如上图,对于 $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}

image.png
为了让效果明显,我增加了行距。可以看到,高度较低的行间公式与上下文的间距看起来更大,就是行距带来的。

为了让行间公式最高处与上文的垂直间距等于行间公式最低处与下文的垂直间距,需要做以下两步:

  • 将行间公式的行距设置为 1;
  • 消除行间公式与下一行文本的“interlineskip”。
\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}

image.png
此时再设置 \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}

image.png

现在我的问题总结如下:

  1. 虽然可以对行间公式环境进行封装,但一个个封装起来工作量太大了,有没有便捷方法?
  2. 有没有其他框架下更好的解决方案?

查看更多

关注者
0
被浏览
137
1 个回答
shadow
shadow 1天前
这个人懒得不得了,竟然啥也没写

老生常谈的问题。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}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览