我多次使用只有一行或一列的矩阵。例如:
\begin{pmatrix}1 \\ 2 \\ 3 \end{pmatrix}
\begin{pmatrix}1 & 2 & 3 \end{pmatrix}
macro
因此我认为用 a或 a来缩短表达式会很有用newcommand
。到目前为止我失败了,但我不明白为什么。这是一个最小的例子:
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\newcommand{\pmone}[1]{\begin{pmatrix}#1 \end{pmatrix}}
\newcommand{\pmtwo}[2]{\begin{pmatrix}#1 \\ #2\end{pmatrix}}
\newcommand{\pmTtwo}[2]{\begin{pmatrix}#1 & #2\end{pmatrix}}
\begin{document}
$\pmtwo{1,2}$
\end{document}
我收到以下错误:! Missing $ inserted.
<inserted text>
$
l.12 $ \pmtwo{1,2}$
但是当我将其改为时,pmone{1}
它按预期工作。这是为什么?
(我明白,除了定义 pmone、pmtwo 等之外,还有一种方法可以使其成为以数字作为参数的函数,但不必为此烦恼。我只会使用最多 5 个数字,所以没有必要。)
答案1
这是因为\pmtwo
,使用大括号可以正确工作。您有两个数字[2]
,即和{#1}
,{#2}
并且\pmtwo
不需要逗号:因此$\pmtwo{1}{2}$
。
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{mathtools}
\usepackage{amssymb}
%\newcommand{\pmone}[1]{\begin{pmatrix}#1 \end{pmatrix}}
\newcommand{\pmtwo}[2]{\begin{pmatrix}{#1} \\ {#2}\end{pmatrix}}
%\newcommand{\pmTtwo}[2]{\begin{pmatrix}#1 & #2\end{pmatrix}}
\begin{document}
$\pmtwo{1}{2}$
\end{document}
答案2
您可以定义\pmrow{1,2,3}
和\pmcol{3,4,5,6}
宏:
\documentclass[12pt]{article}
\usepackage{amsmath}
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\pmrow#1{\def\tmpsep{&}\def\tmp{}\pmrowA #1,,}
\def\pmcol#1{\def\tmpsep{\\}\def\tmp{}\pmrowA #1,,}
\def\pmrowA#1,{\ifx,#1,\begin{pmatrix}\tmp\end{pmatrix}\else
\ifx\tmp\empty\else\addto\tmp{\tmpsep}\fi\addto\tmp{#1}\expandafter\pmrowA\fi}
\begin{document}
$\pmrow{1,2,3}$, $\pmcol{3,4,5,6}$
\end{document}
我添加了$\pmtwo{1,2}$
OP 给出的不起作用的原因解释。\pmtwo
定义为具有两个参数的宏#1
,#2
并且它的用法$\pmtwo{1,2}$
扫描1.2
到#1
和$
到#2
,并且宏扩展为
\begin{pmatrix}1,2 \\ $\end{pmatrix}
我们$
在原始模板中拥有第二个模板。此模板由(打开数学模式)\halign
打开,然后关闭它,然后模板尝试通过第三个模板关闭数学模式(但它打开了新的数学模式)。然后结束模板出现在数学模式中。TeX 尝试通过在错误恢复期间插入第四个模板来关闭此数学模式。它说明了这种插入:。$
$
$
$
! Missing $ inserted