减少支持多行内容的数学环境的行距

减少支持多行内容的数学环境的行距

singlespacing我正在尝试将文档中“支持多行内容的数学环境”的行距减少到onehalfspacing。我正在使用setspacemathtools包。

添加:我说的“支持多行内容的数学环境”是指任何允许排版多行内容的数学环境,无论它们是处于内联数学模式还是显示数学模式。例如,这包括matrix内联数学模式中的环境。

我目前的两步解决方案是

  1. \linespread{1}\selectfont在每个数学环境的开头创建一个宏,可以通过这种方式进行修复,并且
  2. 为步骤 1 无法修复的问题编写特殊补丁。

该解决方案产生以下 MWE:

\documentclass[draft]{article}
\usepackage[nodisplayskipstretch]{setspace}
\setstretch{2}% more text spacing just for exaggeration
\usepackage{mathtools}

\usepackage{etoolbox}
% Let the patches begin!
\makeatletter
\def\mathlinespread{\setspace@singlespace}% 1 by default, can be changed
\newcommand*\RestoreMathEnvironmentLeading[1]{%
  \AtBeginEnvironment{#1}{%
    \linespread{\mathlinespread}\selectfont\ignorespaces}}
% TeX
\RestoreMathEnvironmentLeading{array}
% amsmath
\RestoreMathEnvironmentLeading{matrix}
\RestoreMathEnvironmentLeading{pmatrix}
\RestoreMathEnvironmentLeading{bmatrix}
\RestoreMathEnvironmentLeading{Bmatrix}
\RestoreMathEnvironmentLeading{vmatrix}
\RestoreMathEnvironmentLeading{Vmatrix}
\RestoreMathEnvironmentLeading{cases}
\RestoreMathEnvironmentLeading{aligned}
\RestoreMathEnvironmentLeading{alignedat}
\RestoreMathEnvironmentLeading{gathered}
% special care
\patchcmd{\start@gather}
  {\collect@body}
  {\linespread{\mathlinespread}\selectfont\collect@body}
  {}{}
\patchcmd{\start@align}
  {\collect@body}
  {\linespread{\mathlinespread}\selectfont\collect@body}
  {}{}
\patchcmd{\start@multline}
  {\collect@body}
  {\linespread{\mathlinespread}\selectfont\collect@body}
  {}{}
\patchcmd{\gather@split}
  {\spread@equation}
  {\linespread{\mathlinespread}\selectfont\spread@equation}
  {}{}
% mathtools
\RestoreMathEnvironmentLeading{matrix*}
\RestoreMathEnvironmentLeading{pmatrix*}
\RestoreMathEnvironmentLeading{bmatrix*}
\RestoreMathEnvironmentLeading{Bmatrix*}
\RestoreMathEnvironmentLeading{vmatrix*}
\RestoreMathEnvironmentLeading{Vmatrix*}
\RestoreMathEnvironmentLeading{cases*}
\RestoreMathEnvironmentLeading{dcases}
\RestoreMathEnvironmentLeading{dcases*}
\RestoreMathEnvironmentLeading{rcases}
\RestoreMathEnvironmentLeading{rcases*}
\RestoreMathEnvironmentLeading{drcases}
\RestoreMathEnvironmentLeading{drcases*}
\RestoreMathEnvironmentLeading{multlined}
\RestoreMathEnvironmentLeading{lgathered}
\RestoreMathEnvironmentLeading{rgathered}
\makeatother

\begin{document}
Subarray and small matrices are not affected by \verb|\setstretch{2}|
to start with:
$\begin{psmallmatrix*}[r] -a & b \\ c & -d \end{psmallmatrix*}$ and
\[
\sum_{\substack{i=1\\i\neq j}}^n x_i
\]
With my patches, matrices and cases work fine in inline math mode:
$\begin{Vmatrix} -a & b \\ c & -d \end{Vmatrix}$,
$\begin{drcases*} -a & Words \\ c & Text \end{drcases*} = f(x)$.
If I patch \verb|\env@matrix| and \verb|\env@cases| directly, then the
patches only apply to \verb|amsmath|'s environments, not to
\verb|mathtools|.

Here are some inner multi-line math environments:
\begin{equation}
\begin{split}
a_1, a_1, a_1, a_1, \\
a_1, a_1, a_1, \\
a_1, a_1, \\
\end{split} \quad
\begin{gathered}
a_1, a_1, a_1, a_1, \\
a_1, a_1, a_1, \\
a_1, a_1, \\
\end{gathered} \quad
\begin{lgathered}
a_1, a_1, a_1, a_1, \\
a_1, a_1, a_1, \\
a_1, a_1, \\
\end{lgathered}
\end{equation}
And an outer:
\begin{align}
a & = b + c \\
  & = d + e + f
\end{align}
\begin{singlespace}
Note that \verb|\RestoreMathEnvironmentLeading{split}| will not work!
Yet the method applies to \verb|aligned|, \verb|alignedat|, \verb|gathered|,
\verb|multlined|, \verb|lgathered| and \verb|rgathered|.
Also, the patch for \verb|split| happens after \verb|\collect@body|,
while those for \verb|gather|, \verb|align|, \verb|multline| happen before
\verb|\collect@body|.

Note that \verb|aligned| and \verb|alignedat| can be fixed by patching
\verb|\start@aligned| right before \verb|\spread@equation|, exactly like
\verb|split|. However, I only know how to fix \verb|gathered| by using
\verb|\RestoreMathEnvironmentLeading{gathered}|. The patching code is
structurally inconsistent anyway.
\end{singlespace}

\end{document}

插图

尽管我认为我已经涵盖了所有环境(有些人可能认为问题已经解决),但我对我的解决方案并不满意,原因有 3:

  1. 事实证明align*是一个伪环境,因此需要一个特殊补丁。但\start@gather\start@align和的三个特殊补丁\start@multline一个split,前三项发生 \collect@body而最后一个 \collect@body. 为什么不一致?
  2. 事实证明,matrix和 的朋友amsmath也是伪环境,因此只需修补 即可修复它们\env@matrix。 同样适用于cases通过修补\env@cases; 对于alignedalignedat通过修补\start@aligned。 但是,如果使用,这些补丁的位置会有所不同,我担心这会导致不良的副作用。
  3. 原因 2 中的方法不适用于matrix*和 的朋友,cases*以及 的朋友mathtools。另外,我找不到以这种方式修补的方法gatheredamsmath请注意,\end{gathered}实际上是\endaligned,再次,一个伪环境)。

有没有更好、更一致的方法来减少这些“支持多行内容的数学环境”的行距?

添加:我说的“更好、更一致”是指数量最少且结构一致的斑块

您可能已经注意到,我的解决方案中省略了subarray(包括\substack)、smallmatrix朋友和环境。对于前两个环境,行距是根据(手册第 33 页)设置的。这可以防止更改它们的行距,这是理想的。对于,我永远不会使用。eqnarray\baselineskip...amsmathsetspaceeqnarrayeqnarray

在我看来,最简洁的解决方案是修补代码统治\\


这里有一个详尽的列表(我猜?)“支持多行内容的数学环境”,由该mathtools包提供(以及由; 和 TeX 本身amsmath加载的包):mathtools

TeX

  • array

amsmath

  • matrix,,,,,,;pmatrixbmatrixBmatrix​​vmatrixVmatrix
  • cases
  • alignedalignedat
  • gathered
  • gather和朋友;
  • align和朋友;
  • multline和朋友;
  • split

mathtools

  • matrix*,,,,,,;pmatrix*bmatrix*Bmatrix*​​vmatrix*Vmatrix*
  • cases*,,,,,,,dcasesdcases*rcasesrcases*drcasesdrcases*
  • multlined
  • lgatheredrgathered

相关内容