Setspace 包改变了 \abovedisplayskip 的行为

Setspace 包改变了 \abovedisplayskip 的行为

当使用包装spacing中的环境时setspace,似乎橡胶长度被忽略\abovedisplayskip\belowdisplayskip

\documentclass{article}
\usepackage[nopar]{lipsum}
\usepackage{setspace}

\flushbottom
\begin{document}
%\begin{spacing}{1.0}
\setlength{\abovedisplayskip}{12pt plus 1000pt}%
\setlength{\belowdisplayskip}{12pt plus 1000pt}%
\lipsum[1]
\par
\lipsum[2]
%
\[a^2+b^2=c^2\]
%
\lipsum[3]
\par
\lipsum[4]
%
\[
\begin{array}{c}a\\b\\c\\d\\e\\f\\g\\h\\i\end{array}
\]
%\end{spacing}
\end{document}

我的 MWE 的设计使得第二个具有非常高数组的公式强制出现令人不快的分页符。由于和中的橡胶长度很大\abovedisplayskip\belowdisplayskip因此在第一个公式周围引入了大量空间,而不是分散段落。这种行为符合预期。(附带问题:当我在之前设置长度时,为什么它不起作用\begin{document}?)

在此处输入图片描述

但是,当我添加环境开始和结束的两行注释掉的行时spacing,出于某种原因,橡胶长度被忽略了。当我输出长度值时,橡胶在那里,但空间就是不想伸展。

在此处输入图片描述

无论传递给spacing环境的拉伸值是多少,都会发生这种情况。(1.0 的扩展显然是无意义的,仅用于说明)。我该怎么做才能纠正此行为?

答案1

至于为什么答案很简单:这个setspace包确实

\everydisplay\expandafter{%
  \the\everydisplay
  \abovedisplayskip \displayskipstretch\abovedisplayskip
  \belowdisplayskip \displayskipstretch\belowdisplayskip
  \abovedisplayshortskip \displayskipstretch\abovedisplayshortskip
  \belowdisplayshortskip \displayskipstretch\belowdisplayshortskip
}

这意味着如果\displayskipstretch具有数值,则拉伸和收缩组件将被终止。如果没有\begin{spacing}{1.0}, 的最终扩展为\displayskipstretch空,因此不会发生终止。

我们需要删除错误的位并重建\everydisplay。以下假设拉伸和收缩分量是有限的。

\documentclass{article}
\usepackage[nopar]{lipsum}
\usepackage{setspace}

\newcommand{\addstretchshrink}[1]{%
  \if\relax\displayskipstretch\relax
    % there is no factor, don't add plus and minus
  \else
    plus \displayskipstretch\gluestretch#1
    minus \displayskipstretch\glueshrink#1
  \fi
}
\def\fix#1\abovedisplayskip#2\displayskipstretch\belowdisplayshortskip#3\fix{%
  \everydisplay{#1#3
    \abovedisplayskip = \displayskipstretch\abovedisplayskip \addstretchshrink\abovedisplayskip
    \belowdisplayskip = \displayskipstretch\belowdisplayskip \addstretchshrink\belowdisplayskip
    \abovedisplayshortskip = \displayskipstretch\abovedisplayshortskip \addstretchshrink\abovedisplayshortskip
    \belowdisplayshortskip = \displayskipstretch\belowdisplayshortskip \addstretchshrink\belowdisplayshortskip
  }%
}
\expandafter\fix\the\everydisplay\fix

\flushbottom

\begin{document}
\begin{spacing}{1.0}
\setlength{\abovedisplayskip}{12pt plus 1000pt}%
\setlength{\belowdisplayskip}{12pt plus 1000pt}%
\lipsum[1]
\par
\lipsum[2]
%
\[a^2+b^2=c^2\]
%
\lipsum[3]
\par
\lipsum[4]
%
\[
\begin{array}{c}a\\b\\c\\d\\e\\f\\g\\h\\i\end{array}
\]
\end{spacing}
\end{document}

相关内容