我想要一种方法来自动设置按符号对齐的矩阵项。例如,输出
\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}
r
c
etoolbox
\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}