当文档处于双倍行距模式时,cases 命令内的内联间距

当文档处于双倍行距模式时,cases 命令内的内联间距

对于期刊投稿,我们显然必须使用双倍行距模式。但我不想使用多分支案例命令占用更多的页面空间,默认情况下,每个分支之间都会有双倍行距。显然,可以使用\\[-xpt],但这非常笨拙和脆弱,会弄乱当前行和下一行之间的空间。我想知道是否有一个包或一个好的宏可以以强大的方式缩小间隙管理左括号的垂直高度。这是一个 MWE,其中cases命令中的默认间距太荒谬了。谢谢!

\documentclass{amsart}
\usepackage{lipsum}
\usepackage{setspace}
\begin{document}
\doublespacing
\lipsum[1]
$x = 
\begin{cases} 
a & \text{if } x < -3 \\
b & \text{if } -2 < x < 0 \\
c & \text{if } 0 < x < 2 \\
d & \text{if } x > 2 
\end{cases}
$
\lipsum[1]
\end{document}

答案1

这是一个重新定义环境的版本,cases用于在环境中临时切换到单行间距。额外的定义\new@setfontsize只需要抑制关于在数学模式下设置文本命令的警告;否则它与原始定义相同。

如果有必要,这种模式应该很容易适应其他数学环境。

\documentclass{amsart}
\usepackage{lipsum}
\usepackage{setspace}

\makeatletter
\newcommand\new@setfontsize[3]{%
    \ifx \protect \@typeset@protect \let \@currsize #1\fi \fontsize {#2}{#3}\selectfont
}
\let\orig@setfontsize\@setfontsize
\let\orig@cases\cases
\let\endorig@cases\endcases

\renewenvironment{cases}{%
    \let\@setfontsize\new@setfontsize
    \setstretch{\setspace@singlespace}%
    \let\setfontsize\orig@setfontsize
    \orig@cases
}{%
    \endorig@cases
}
\makeatother

\begin{document}
\doublespacing
\lipsum[1]
$x = 
\begin{cases} 
a & \text{if } x < -3 \\
b & \text{if } -2 < x < 0 \\
c & \text{if } 0 < x < 2 \\
d & \text{if } x > 2 
\end{cases}
$
\lipsum[1]
\end{document}

在此处输入图片描述

答案2

我认为,与重新定义cases使用\singlespacing或相比\setstretch{1},正确设置 更好\arraystretch

可能也应该对 做类似的事情array,但可以\fixarraystretch{<factor>}在任何地方使用。

\documentclass{amsart}
\usepackage{lipsum}
\usepackage{setspace}
\usepackage{xfp,etoolbox}

\makeatletter
\patchcmd{\env@cases}
  {\def\arraystretch{1.2}}
  {\fixarraystretch{1.2}}
  {}{}
\makeatother
\newcommand{\fixarraystretch}[1]{%
  \edef\arraystretch{\fpeval{#1/(\baselinestretch)}}%
}

\begin{document}
\doublespacing
\lipsum[1]
$x = 
\begin{cases} 
a & \text{if } x < -3 \\
b & \text{if } -2 < x < 0 \\
c & \text{if } 0 < x < 2 \\
d & \text{if } x > 2 
\end{cases}
$
\lipsum[1]
\end{document}

在此处输入图片描述

最后再说一句:使用双倍行距提交已经是过去的习俗了;现在每个人都会收到 PDF 文件,留出注释空间是没有意义的;它只会妨碍在屏幕上阅读文档。

答案3

您可以通过在环境定义中\baselinestretch重新设置为来实现这一点。这是段落中行与行之间距离的乘数(也是环境行与行之间的距离),它被设置为。1casescases1.667\doublespacing

要修补cases,您可以将以下代码片段添加到序言中:

\usepackage{etoolbox}
\AtBeginEnvironment{cases}{\renewcommand\baselinestretch{1}\selectfont}

示范

\documentclass{amsart}
\usepackage{lipsum}
\usepackage{setspace}

\usepackage{etoolbox} %% <- added
\AtBeginEnvironment{cases}{\renewcommand\baselinestretch{1}\selectfont} %% <- added

\begin{document}
\doublespacing
\lipsum[1]
$x = 
\begin{cases} 
a & \text{if $x < -3$} \\
b & \text{if $-2 < x < 0$} \\
c & \text{if $0 < x < 2$} \\
d & \text{if $x > 2$}
\end{cases}
$
\lipsum[1]
\end{document}

输出


笔记:

  • 只有在调用之后,更改\baselinestretch才会生效,这就是该命令存在的原因。\selectfont
  • 简单地放入 环境\renewcommand\baselinestretch{1}\selectfont内部cases是行不通的,因为其范围仅限于环境的第一个单元。

相关内容