singlespacing
我正在尝试将文档中“支持多行内容的数学环境”的行距减少到onehalfspacing
。我正在使用setspace
和mathtools
包。
添加:我说的“支持多行内容的数学环境”是指任何允许排版多行内容的数学环境,无论它们是处于内联数学模式还是显示数学模式。例如,这包括matrix
内联数学模式中的环境。
我目前的两步解决方案是
\linespread{1}\selectfont
在每个数学环境的开头创建一个宏,可以通过这种方式进行修复,并且- 为步骤 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:
- 事实证明
align*
是一个伪环境,因此需要一个特殊补丁。但\start@gather
、\start@align
和的三个特殊补丁\start@multline
与一个split
,前三项发生前\collect@body
而最后一个后\collect@body
. 为什么不一致? - 事实证明,
matrix
和 的朋友amsmath
也是伪环境,因此只需修补 即可修复它们\env@matrix
。 同样适用于cases
通过修补\env@cases
; 对于aligned
和alignedat
通过修补\start@aligned
。 但是,如果使用,这些补丁的位置会有所不同,我担心这会导致不良的副作用。 - 原因 2 中的方法不适用于
matrix*
和 的朋友,cases*
以及 的朋友mathtools
。另外,我找不到以这种方式修补的方法gathered
(amsmath
请注意,\end{gathered}
实际上是\endaligned
,再次,一个伪环境)。
有没有更好、更一致的方法来减少这些“支持多行内容的数学环境”的行距?
添加:我说的“更好、更一致”是指数量最少且结构一致的斑块。
您可能已经注意到,我的解决方案中省略了subarray
(包括\substack
)、smallmatrix
朋友和环境。对于前两个环境,行距是根据(手册第 33 页)设置的。这可以防止更改它们的行距,这是理想的。对于,我永远不会使用。eqnarray
\baselineskip...
amsmath
setspace
eqnarray
eqnarray
在我看来,最简洁的解决方案是修补代码统治\\
。
这里有一个详尽的列表(我猜?)“支持多行内容的数学环境”,由该mathtools
包提供(以及由; 和 TeX 本身amsmath
加载的包):mathtools
TeX
array
;
amsmath
matrix
,,,,,,;pmatrix
bmatrix
Bmatrix
vmatrix
Vmatrix
cases
;aligned
,alignedat
;gathered
;gather
和朋友;align
和朋友;multline
和朋友;split
;
mathtools
matrix*
,,,,,,;pmatrix*
bmatrix*
Bmatrix*
vmatrix*
Vmatrix*
cases*
,,,,,,,dcases
;dcases*
rcases
rcases*
drcases
drcases*
multlined
;lgathered
,rgathered
;