据我所见,\matrix
这是一个 TeX 命令,但我似乎找不到有关它的文档。
它在 MathJax 中有效,所以我想知道它是否可以在 LaTeX 中使用。
即这是有效的 MathJax:
$$
\left[
\matrix
{
newx.x&newy.x&newz.x \\
newx.y&newy.y&newz.y \\
newx.z&newy.z&newz.z
}
\right]
$$
正如所见数学.stackexchange。
在我的 LaTeX 编辑器(底层使用 MiKTeX)中,我必须使用\begin{matrix} .. \end{matrix}
,所以我想知道该\matrix
命令发生了什么。
答案1
除了已经提供的一些方法外,这里还有许多在 LaTeX 中创建矩阵的方法。使用
array
将物品放置在固定的行/列环境中的结构;\begin{matrix}...\end{matrix}
来自amsmath
包裹,它允许您自己指定矩阵分隔符(使用\left
和\right
);pmatrix
、bmatrix
、Bmatrix
以及上述的变体(也来自)vmatrix
,分别将分隔符固定为、、、和;Vmatrix
amsmath
( )
[ ]
{ }
| |
|| ||
\bordermatrix{...}
这是一个 TeX 命令,将指定行和列索引;\kbordermatrix{...}
与上面的类似,但提供了更大的灵活性;- 这
blkarray
包裹以及相关blockarray
环境block
来构建你的矩阵。
以下是展示一些不同样式的示例文件:
\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\usepackage{kbordermatrix}% http://www.hss.caltech.edu/~kcb/TeX/kbordermatrix.sty
\usepackage{blkarray}% http://ctan.org/pkg/blkarray
\begin{document}
\[
\begin{array}{lc}
\verb|array| & \left(\begin{array}{@{}ccc@{}}
a & b & c \\
d & e & f \\
g & h & i
\end{array}\right) \\[15pt]
\verb|matrix| & \left(\begin{matrix}
a & b & c \\
d & e & f \\
g & h & i
\end{matrix}\right) \\[15pt]
\verb|pmatrix| & \begin{pmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{pmatrix} \\[15pt]
\verb|bmatrix| & \begin{bmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{bmatrix} \\[15pt]
\verb|Bmatrix| & \begin{Bmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{Bmatrix} \\[15pt]
\verb|vmatrix| & \begin{vmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{vmatrix} \\[15pt]
\verb|Vmatrix| & \begin{Vmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{Vmatrix} \\[15pt]
\verb|bordermatrix| & \bordermatrix{\text{corner}&c_1&c_2&\ldots &c_n\cr
r_1&a_{11} & 0 & \ldots & a_{1n}\cr
r_2& 0 & a_{22} & \ldots & a_{2n}\cr
r_3& \vdots & \vdots & \ddots & \vdots\cr
r_4& 0 & 0 &\ldots & a_{nn}} \\[15pt]
\verb|kbordermatrix| & \kbordermatrix{\text{corner}&c_1&c_2&\ldots &c_n\cr
r_1&a_{11} & 0 & \ldots & a_{1n}\cr
r_2& 0 & a_{22} & \ldots & a_{2n}\cr
r_3& \vdots & \vdots & \ddots & \vdots\cr
r_4& 0 & 0 &\ldots & a_{nn}} \\[25pt]
\verb|blkarray| & \begin{blockarray}{[cc]c\}}
11 & 22 & 33 \\
1 & 2 & 3 \\
\begin{block}{(ll)l\}}
11 & 22 & 33 \\
1 & 2 & 3 \\
\end{block}
1 & 2 & 3
\end{blockarray}
\end{array}
\]
\end{document}
答案2
您不应该使用\matrix{
,但\begin{matrix}
和\end{matrix}
由包提供amsmath
。
答案3
强烈建议使用 amsmath 的矩阵功能。但是,回答你的问题:你可以\matrix
在 中找到 的定义plain.tex
:
\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
\ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
\mathstrut\crcr\noalign{\kern-\baselineskip}
#1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
有关的:
\def\pmatrix#1{\left(\matrix{#1}\right)}
您可以plain.tex
在命令提示符下输入
kpsewhich plain.tex
例如,在当前标准的 Windows TeX Live 安装中
c:/texlive/2011/texmf-dist/tex/plain/base/plain.tex
\matrix
在 TeX 手册和其他各种 TeX 文档中有记录。LaTeX 文档主要涉及matrix
amsmath 的更现代环境。
答案4
该命令\matrix
在 LaTeX 内核中定义
% latex.ltx, line 4509:
\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
\ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
\mathstrut\crcr\noalign{\kern-\baselineskip}
#1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
\def\pmatrix#1{\left(\matrix{#1}\right)}
(使用的 LaTeX 版本是LaTeX2e <2018-12-01>
)。
与plain.tex
% plain.tex, line 1093:
\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
\ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
\mathstrut\crcr\noalign{\kern-\baselineskip}
#1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
\def\pmatrix#1{\left(\matrix{#1}\right)}
我们看不出有任何区别。
原因是历史原因:LaTeX 首次发布时,它整合了 的大部分内容plain.tex
,以便于从一种切换到另一种。此外,原始 LaTeX 内核对数学的支持非常基本:除了普通的 TeX 结构外,它仅提供displaymath
、equation
和。该环境eqnarray
及其带星号的配套产品旨在替代和(但不是最好的替代品)。eqnarray*
eqnarray
eqalignno
eqalign
当amsmath
它被发现时(最初名为),出现了一个问题:用于 plain.tex 的amslatex
原始插件应该获得 LaTeX 语法。当然存在冲突:如果加载了,则使用LaTeX 内核支持的 的文档将受到影响。对于和 也类似。amstex.tex
\matrix ... \endmatrix
\begin{matrix}...\end{matrix}
\matrix{...}
amsmath
\pmatrix{...}
\begin{pmatrix}...\end{pmatrix}
确实amsmath
有
\renewenvironment{matrix}{%
\matrix@check\matrix\env@matrix
}{%
\endarray \hskip -\arraycolsep
}
\def\env@matrix{\hskip -\arraycolsep
\let\@ifnextchar\new@ifnextchar
\array{*\c@MaxMatrixCols c}}
\newcount\c@MaxMatrixCols \c@MaxMatrixCols=10
\def\matrix@check#1{%
\@xp\ifx\csname\@currenvir\endcsname#1%
\else\matrix@error#1%
\@xp\@gobble
\fi
}
\def\matrix@error#1{%
\@amsmath@err{%
Old form `\string#1' should be \string\begin{\@xp\@gobble\string#1}%
}{%
`\string#1{...}' is old Plain-TeX syntax whose use is
ill-advised in LaTeX.%
}%
}
\renewenvironment{pmatrix}{%
\left(%
\matrix@check\pmatrix\env@matrix
}{
\endmatrix\right)%
}
这是什么意思?我们知道\begin{foo}
首先进行一些记录,包括定义\@currenvir
为mean foo
,然后执行\foo
,因此用定义时“开始部分”中给出的标记替换它。在\matrix
和的情况下\pmatrix
,\matrix@check
执行;此命令检查当前环境名称是否与matrix
或匹配pmatrix
;如果文档使用了\begin{matrix}
或,则为真\begin{pmatrix}
,但如果使用了纯 TeX 语法\matrix{...}
或,则为假\pmatrix{...}
。在后一种情况下,会引发错误,并且\matrix
或的参数\pmatrix
会被吞噬,以允许完成 LaTeX 运行。
这种冲突实际上并不是那么严重:每个大量使用数学的文档都应加载amsmath
并使用\begin{matrix}
或\begin{pmatrix}
语法。
顺便说一句,这有一个后果;如果想要matrix
使用“大男子主义编程风格”进行构建,环境不应该像这样定义
\newenvironment{foomatrix}
{<something at the beginning>\matrix}
{\endmatrix<something at the end>}
因为这会触发\matrix@error
。相反
\makeatletter
\newenvironment{foomatrix}
{<something at the beginning>\env@matrix}
{\endmatrix<something at the end>}
\makeatother
amsmath
应该使用;例如,
\newenvironment{bmatrix}{\left[\env@matrix}{\endmatrix\right]}
使用 MathJax,两个都
\matrix{ 1 & 0 \cr 0 & 1 }
和
\begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix}
是允许的。该实现实际上并不\begin
像在 LaTeX 中那样“扩展”,因此可以自由地使用其他技巧。