类似问题:我怎样才能制作具有均匀列间距的类似矩阵?
下面的代码编写/阅读/维护起来很简单,但看起来很糟糕。
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\begin{document}
\begin{equation*}
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*}
\end{equation*}
\end{document}
这是因为负号在第一列和第二列之间增加了额外的空间,但没有在第二列和第三列之间增加额外的空间。
人们可以天真地在每一列中放置一个\phantom{-}
,但这也不正确。
\begin{equation*}
\begin{bmatrix*}[r]
\phantom{-}1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & \phantom{-}1
\end{bmatrix*}
\end{equation*}
这是因为我们不需要在每列左侧留出额外的空间,而是需要每列之间留出均等的空间。
\begin{gather*}
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*} \\
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & \phantom{-}1
\end{bmatrix*}
\end{gather*}
好多了。(第二个,与上面的原始版本相比。)
然而,在较大的矩阵中,这很容易变得难以阅读并且维护起来相当麻烦。 是否有一些简单的方法可以告诉它在第 1 和第 2 列、第 2 和第 3 列、第 3 和第 4 列...之间放置相同数量的空间(例如,在右侧之间)?
理想情况下,我希望矩阵主体除了内容之外不包含任何其他内容:
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
答案1
这是使用新环境的版本。对于第一列,使用brmatrix
标准列,对于其他列,我们使用新的列类型,该列类型也将内容右对齐,但使用固定宽度。如果内容可能比单元格宽并与其他列重叠,则会出现问题,因此添加了一个用于直接设置单元格宽度的可选参数。r
M
\@brcolwidth
第一个案例中使用标准,其他案例中使用bmatrix
新案例的完整示例:brmatrix
\documentclass{article}
\usepackage{array}
\usepackage{amsmath}
\usepackage{mathtools}
\newcolumntype{M}[1]{>{\hbox to #1\bgroup\hss$}l<{$\egroup}}
\makeatletter
\newcommand\@brcolwidth{0.67em}
\newenvironment{brmatrix}{%
\left[%
\hskip-\arraycolsep
\new@ifnextchar[\@brarray{\@brarray[\@brcolwidth]}%
}{%
\endarray
\hskip -\arraycolsep
\right]%
}
\def\@brarray[#1]{\array{r*\c@MaxMatrixCols {M{#1}}}}
\makeatother
\begin{document}
\begin{equation*}
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*}
\end{equation*}
\begin{equation*}
\begin{brmatrix}
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{brmatrix}
\end{equation*}
\begin{equation*}
\begin{brmatrix}
-1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & -1
\end{brmatrix}
\end{equation*}
\begin{equation*}
\begin{brmatrix}[2em]
123 & 0 & 0 \\
0 & -12 & 0 \\
0 & 0 & 12345
\end{brmatrix}
\end{equation*}
\end{document}
输出:
答案2
基本方法与前,即使用\makebox
,只不过我尽可能地实现了自动化。
的主要缺点mymatrix
是您必须指定列数。请注意,最小间距仍为2\arraycolsep
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{array}
\usepackage{collcell}
\newlength{\mycolwidth}
\settowidth{\mycolwidth}{$-1$}
\newcommand{\mybox}[1]{\makebox[\mycolwidth][r]{$#1$}}
\newcolumntype{R}{>{\collectcell\mybox}r<{\endcollectcell}}
\newenvironment{mymatrix}[1]% #1 = total number of columns
{\count1=#1\relax
\advance\count1 by -1
\left[\array{@{}r*{\number\count1}R@{}}}%
{\endarray\right]}
\begin{document}
\begin{equation*}
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*}
\begin{mymatrix}{3}
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{mymatrix}
\end{equation*}
\end{document}
答案3
这是一个自动化版本,BMatrix
它采用可选的对齐参数,调整除第一列之外的所有BMatrix
环境,使其宽度等于条目的最大值。
\documentclass{article}
\usepackage{mathtools,collcell,eqparbox}
\newcounter{BMatrix}
\newlength{\maxwd}
\newcommand{\setmaxwd}[1]{%
\eqmakebox[BM-\theBMatrix][\BMalign]{$#1$}%
}
\MHInternalSyntaxOn
\newenvironment{BMatrix}[1][c]{
\def\BMalign{#1}
\stepcounter{BMatrix}
\left[\hskip -\arraycolsep
\MH_let:NwN \@ifnextchar \MH_nospace_ifnextchar:Nnn
\array{ #1 *{\numexpr\c@MaxMatrixCols-1} {>{\collectcell\setmaxwd}#1<{\endcollectcell}}}
}{
\endarray \hskip -\arraycolsep
\right]
}
\MHInternalSyntaxOff
\makeatother
\begin{document}
\begin{gather*}
\texttt{bmatrix*[c]} \\
\begin{bmatrix*}[c]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*}
\qquad
\begin{bmatrix*}[c]
123 & 0 & 0 \\
0 & -12 & 0 \\
0 & 0 & 12345
\end{bmatrix*} \\
\texttt{BMatrix[c]} \\
\begin{BMatrix}[c]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{BMatrix}
\qquad
\begin{BMatrix}[c]
123 & 0 & 0 \\
0 & -12 & 0 \\
0 & 0 & 12345
\end{BMatrix} \\
\texttt{bmatrix*[r]} \\
\begin{bmatrix*}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{bmatrix*}
\qquad
\begin{bmatrix*}[r]
123 & 0 & 0 \\
0 & -12 & 0 \\
0 & 0 & 12345
\end{bmatrix*} \\
\texttt{BMatrix[r]} \\
\begin{BMatrix}[r]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{BMatrix}
\qquad
\begin{BMatrix}[r]
123 & 0 & 0 \\
0 & -12 & 0 \\
0 & 0 & 12345
\end{BMatrix}
\end{gather*}
\end{document}
第 2 列及更高列中的每个条目都设置在一个\eqmakebox
带有唯一BMatrix
标签的eqparbox
包裹然后确保这些条目的宽度相同,并带有适当的对齐说明符。宽度计算使用文件.aux
,并且可能需要多次编译(首先)。第一列保持不变。