我想在以下环境\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
!), - 对于丑陋的默认间距的解释。
简单的答案
这里有两个问题:
间距很难看——矩阵条目实际上重叠轻微地。
矩阵条目不完全适合括号内。
问题 #2 实际上是设计使然,因为默认\delimitershortfall
为5pt
,这意味着大多数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}
:
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
稍微突出其边界框;在图像中我只显示顶部和底部:
但为什么默认情况下两个分数会直接叠在一起呢?原因在于bmatrix
基于 LaTeX的 实现array
。(普通的 TeX会在分数之间\matrix
放置一个垂直空格!)1pt
工作原理如下array
:每行获得一个最低限度高度和最低限度深度,由 的高度和深度定义\strutbox
。如果您的条目的实际高度和深度较大,则 不起作用\strutbox
。(这是 displaystyle 分数的情况。)然后行将彼此叠放在一起,没有额外的垂直空间。只有当行中的实际材料具有“通常”较小的高度和深度时,此实现才会产生良好的间距。
现在我可以解释为什么\\[0.5ex]
在我的答案的第一部分中没有效果:简单地说,只是添加到( )0.5ex
的深度,并且加起来仍然小于( )的深度。因此,只有添加更多的垂直空间才会产生效果!\strutbox
3.6pt
\dfrac{\partial f}{\partial x}
6.86pt
3.26pt
此外,我可以解释为什么\arraystretch
在矩阵顶部添加了太多空间:LaTeX 将的高度和深度都增加了\strutbox
因子\arraystretch
。现在的重点是高度(8.4pt
)远大于深度(3.6pt
),因此,在矩阵顶部添加了一个,而只\arraystretch
在底部添加了一个。对于文本数组,这应该是可以的,但在矩阵中,事物往往相对于数学轴垂直居中(例如分数和积分),因此当它们变大时,它们的高度和深度会相等地增加。2
8.4pt
3.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
受 的参数cellspacetoplimit
和cellspacebottomlimit
的启发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}