如何为矩阵条目自动设置 \phantom{-}?

如何为矩阵条目自动设置 \phantom{-}?

我想要一种方法来自动设置按符号对齐的矩阵项。例如,输出

\begin{bmatrix}
    1&1&-1\\
    -1&1& 1\\
    1&-1& 1
\end{bmatrix}

与输出相同

\begin{bmatrix}
    \phantom{-}1&\phantom{-}1&-1\\
    -1&\phantom{-}1& \phantom{-}1\\
    \phantom{-}1&-1& \phantom{-}1
\end{bmatrix}

这可能吗?

答案1

这里还有两个建议。第一个在概念上与 Sebastiano 的回答非常相似(可以看作是他的补充)。你r也可以将列类型设置为与mathtools包一起。第二个建议基于这个非常好的答案,它解决了一个非常相关的问题。它确实可以满足您的要求,即,\phantom{-}如果没有减号,则插入一个,并且有两种变体,一种带有c,一种带有l列(我认为后者更有意义)。

\documentclass{article}
\usepackage{mathtools}
\usepackage{array}% for second solution 
\makeatletter
\def\CheckMinus\ignorespaces{\@ifnextchar-{}{\phantom{-}}}
\makeatother
\newcolumntype{I}{>{\CheckMinus}c}
\newcolumntype{J}{>{\CheckMinus}l}

\begin{document}
\begin{enumerate}
 \item Just mathtools and change column type to \texttt{r}.
\[
\begin{bmatrix*}[r]
    1&1&-1\\
    -1&1& 1\\
    1&-1& 1
\end{bmatrix*}\quad\text{and}\quad\begin{bmatrix*}[r]
    12&1&-12\\
    -1&1& 12\\
    1&-12& 1
\end{bmatrix*}
\]
 \item Insert \verb|\phantom{-}| if there is no minus and use \texttt{c} column.
\[
\begin{bmatrix*}[I]
    1&1&-1\\
    -1&1& 1\\
    1&-1& 1
\end{bmatrix*}\quad\text{and}\quad\begin{bmatrix*}[I]
    12&1&-12\\
    -1&1& 12\\
    1&-12& 1
\end{bmatrix*}
\]
 \item Insert \verb|\phantom{-}| if there is no minus and use \texttt{l} column.
\[
\begin{bmatrix*}[J]
    1&1&-1\\
    -1&1& 1\\
    1&-1& 1
\end{bmatrix*}\quad\text{and}\quad\begin{bmatrix*}[J]
    12&1&-12\\
    -1&1& 12\\
    1&-12& 1
\end{bmatrix*}
\]
\end{enumerate}
\end{document}

在此处输入图片描述

答案2

环境使用一个通用宏来启动对齐。此宏中有,默认情况下将单元格内容居中。全局更改该默认设置的一种快速方法是使用 而amsmath不是或load和 do重新定义该宏。[pbBvV]?matrix\env@matrix\array{*\c@MaxMatrixCols c}rcetoolbox\patchcmd\env@matrix{c}{r}{}{}

或者,您可以重新定义\env@matrix为使用一个参数进行对齐,并修补使用它的环境以检查此类可选参数。这本质上就是mathtools的星号环境所做的。

在下面的代码中,我使用循环一次性修补所有环境(使用一个默认值),但如果您想要不同的行为,您可以有选择地更改它们。

此外,如果您使用r右对齐单元格,则数字将右对齐(谢谢,Sherlock),如果两个数字的宽度不同(例如-1-12),则它们的最右端将对齐,而不是减号。要对齐减号,您可以使用J在中定义(和未定义)的列类型薛定谔的猫的答案

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}
\usepackage{array}
\usepackage{etoolbox}
\makeatletter
\def\env@matrix[#1]{\hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{*\c@MaxMatrixCols #1}}
\@tfor\@temp:=\matrix\pmatrix\bmatrix\Bmatrix\vmatrix\Vmatrix\do
  {\expandafter\patchcmd\@temp
     {\env@matrix}
     {\@ifnextchar[%]   default V
        \env@matrix{\env@matrix[J]}}
     {}{\FAILED}}
% From Mr. Cat's answer: https://tex.stackexchange.com/a/522747/134574
\newcolumntype{J}{>{\CheckSign}l}
\def\CheckSign\ignorespaces{%
  \@ifnextchar-{}{\@ifnextchar+{}{\phantom{-}}}}
\makeatother
\begin{document}
\[
\begin{bmatrix}
    1&1&-1\\
    -1&1& 1\\
    1&-1&-12\\
    1&-1&+12
\end{bmatrix}
\]
\end{document}

答案3

您可以使用该spalign包。这里有一个适合您请求的示例。

在此处输入图片描述

%% Compile and read me!
\documentclass[a4paper,12pt]{article}
\usepackage{spalign}
\begin{document}
\[ \spalignmat[r]{-1 1 -1; -1 1 1; 1 -1 1} \]
\end{document}

相关内容