在矩阵环境中使用显示样式分数

在矩阵环境中使用显示样式分数

我想在以下环境\dfrac中使用该命令:bmatrix

\documentclass{article}
\usepackage{amsmath}

\begin{document}

\[
\begin{bmatrix}
  \dfrac{\partial f}{\partial x}
  \\
  \dfrac{\partial f}{\partial y}
\end{bmatrix}
\]

\end{document}

不幸的是,人们会得到非常丑陋的间隔元素,这些元素不能完全适合矩阵括号

如果不指定魔法线跳过值,解决此问题的正确方法是什么?

答案1

您可以\strut在其中粘贴一些 s (括号的高度+深度):

\documentclass{article}
\usepackage{mathtools}
\begin{document}
\[
  \begin{bmatrix}
    \dfrac{\strut\partial f}{\strut\partial x}
    \\
    \dfrac{\strut\partial f}{\strut\partial y}
  \end{bmatrix}
\]
\end{document}

在此处输入图片描述

答案2

这个答案由三部分组成:

  • 手动调整垂直间距的解决方案,
  • 经过修改的解决方案\arraystretch可以自动将括号正确地置于矩阵的中心(与原始解决方案不同\arraystretch!),
  • 对于丑陋的默认间距的解释。

简单的答案

这里有两个问题:

  1. 间距很难看——矩阵条目实际上重叠轻微地。

  2. 矩阵条目不完全适合括号内。

问题 #2 实际上是设计使然,因为默认\delimitershortfall5pt,这意味着大多数5pt条目都没有被括号“覆盖”。因此,一个简单的解决方案(手动调整垂直空间,如 Gonzalo 的回答第一部分)是

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\[
  \setlength{\delimitershortfall}{0pt}
  \begin{bmatrix}
    \dfrac{\partial f}{\partial x}
    \\[2ex]
    \dfrac{\partial f}{\partial y}
  \end{bmatrix}
\]
\end{document}

更优美的矩阵

(的重新定义\delimitershortfall是显示公式的局部。)值得注意的是,添加更少的垂直空间,比如说0.5ex毫无效果;我将在答案的末尾解释这一点。

使用\arraystretch

如果你的矩阵有很多行,\\[2ex]每次添加都会很烦人,而且当你想要调整间距时也会很麻烦。在这种情况下,使用 percusse 的想法\arraystretch很棒原则。问题是,正如 percusse 发现的那样:\arraystretch在矩阵顶部添加的空间比在底部添加的空间更多。如果你取一个很大的值,这一点就变得非常明显,比如\renewcommand{\arraystretch}{2.5}
\arraystretch 示例

Gonzalo 在他的回答的第二部分中提出了手动调整的方法,但如果它开箱即用就更好了!原因的特殊行为\arraystretch在于它的实现,它适用于文本数组,但不适用于数学数组,正如我在答案最后解释的那样。

在下面的代码中,我提供了一个\CenteredArraystretch命令,它将所需的作为强制参数\arraystretch。在图片中\renewcommand{\arraystretch}{2.5},我比较了\CenteredArraystretch{2.5}\CenteredArraystretch{2.1}。我认为后者是相当令人满意的:

三个版本的比较

请注意,\arraystretch您通常不需要再进行\delimitershortfall任何修改!该代码通过侵入 LaTeX 来工作array,需要etoolbox进行修补\@mkpream

\documentclass{article}
\usepackage{amsmath,etoolbox}
\makeatletter
\newif\ifcenter@asb@\center@asb@false
\def\center@arstrutbox{%
    \setbox\@arstrutbox\hbox{$\vcenter{\box\@arstrutbox}$}%
    }
\newcommand*{\CenteredArraystretch}[1]{%
    \ifcenter@asb@\else
      \pretocmd{\@mkpream}{\center@arstrutbox}{}{}%
      \center@asb@true
    \fi
    \renewcommand{\arraystretch}{#1}%
    }
\makeatother
\newcommand*\testvector{
    \begin{bmatrix}
      \dfrac{\partial f}{\partial x}
      \\
      \dfrac{\partial f}{\partial y}
    \end{bmatrix}
    }
\begin{document}
\[
  \renewcommand{\arraystretch}{2.5}
  \testvector
  \CenteredArraystretch{2.5}
  \testvector
  \CenteredArraystretch{2.1}
  \testvector
\]
\end{document}

为什么默认间距这么难看?

轻微的原因是重叠\partial稍微突出其边界框;在图像中我只显示顶部和底部:
\partial 的边界框

但为什么默认情况下两个分数会直接叠在一起呢?原因在于bmatrix基于 LaTeX的 实现array。(普通的 TeX会在分数之间\matrix放置一个垂直空格!)1pt

工作原理如下array:每行获得一个最低限度高度和最低限度深度,由 的高度和深度定义\strutbox。如果您的条目的实际高度和深度较大,则 不起作用\strutbox。(这是 displaystyle 分数的情况。)然后行将彼此叠放在一起,没有额外的垂直空间。只有当行中的实际材料具有“通常”较小的高度和深度时,此实现才会产生良好的间距。

现在我可以解释为什么\\[0.5ex]在我的答案的第一部分中没有效果:简单地说,只是添加到( )0.5ex的深度,并且加起来仍然小于( )的深度。因此,只有添加更多的垂直空间才会产生效果!\strutbox3.6pt\dfrac{\partial f}{\partial x}6.86pt3.26pt

此外,我可以解释为什么\arraystretch在矩阵顶部添加了太多空间:LaTeX 将的高度和深度都增加了\strutbox因子\arraystretch。现在的重点是高度(8.4pt)远大于深度(3.6pt),因此,在矩阵顶部添加了一个,而只\arraystretch在底部添加了一个。对于文本数组,这应该是可以的,但在矩阵中,事物往往相对于数学轴垂直居中(例如分数和积分),因此当它们变大时,它们的高度和深度会相等地增加。28.4pt3.6pt

我不知道的是为什么上面的实现array是在 LaTeX 中选择的。我猜对于文本数组来说,它很有意义,但对于矩阵来说,它似乎不是最佳的。

答案3

您可以使用可选参数\\添加垂直空间和一些零宽度规则来增加分隔符的长度:

\documentclass{article}
\usepackage{mathtools}

\begin{document}

\[
\begin{bmatrix}
  \dfrac{\partial f}{\partial x}\rule{0pt}{1.7em}
  \\[1em]
  \dfrac{\partial f}{\partial y}\rule[-1.2em]{0pt}{0em}
\end{bmatrix}
\]

\end{document}

基于 percusses 的想法,您可以定义一个新环境,增加\arraystretch并为最后一行添加一些额外空间。我的示例中的第一个(可选)参数控制 的重新定义\arraystretch;第二个(强制)参数控制最后一行后的间距:

\documentclass[12pt]{article}
\usepackage{mathtools}

\newcommand\myfact{}
\newenvironment{Mybmatrix}[2][1.8]
  {\renewcommand\myfact{#2}\renewcommand{\arraystretch}{#1}\begin{bmatrix}}
  {\\[-\myfact em]\mbox{}\end{bmatrix}}
\begin{document}

\[
\begin{Mybmatrix}{2}
  \dfrac{\partial f}{\partial x}
  \\
  \dfrac{\partial f}{\partial y}
\end{Mybmatrix}
\]

\end{document}

然而,我不知道这个定义有多么“稳健”。

答案4

的环境nicematrix有两个键cell-space-top-limit,并cell-space-bottom-limit受 的参数cellspacetoplimitcellspacebottomlimit的启发cellspace。还有一个键cell-space-limit可以修复这两个参数。

\documentclass{article}
\usepackage{amsmath}
\usepackage{nicematrix}

\begin{document}

\[
\begin{bNiceMatrix}[cell-space-limits=2pt]
  \dfrac{\partial f}{\partial x}
  \\
  \dfrac{\partial f}{\partial y}
\end{bNiceMatrix}
\]

\end{document}

上述代码的输出

相关内容