列间距均匀的矩阵

列间距均匀的矩阵

类似问题:我怎样才能制作具有均匀列间距的类似矩阵?


下面的代码编写/阅读/维护起来很简单,但看起来很糟糕。

\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标准列,对于其他列,我们使用新的列类型,该列类型也将内容右对齐,但使用固定宽度。如果内容可能比单元格宽并与其他列重叠,则会出现问题,因此添加了一个用于直接设置单元格宽度的可选参数。rM\@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,并且可能需要多次编译(首先)。第一列保持不变。

答案4

环境{bNiceMatrix}nicematrix一个键columns-width=auto,它为矩阵的所有列施加相同的宽度(以及一个r用于右侧对齐的键)。

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

$\begin{bNiceMatrix}[r,columns-width=auto,right-margin]
1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1 
\end{bNiceMatrix}$

\end{document}

上述代码的输出

相关内容