无法使用快捷宏生成嵌套矩阵

无法使用快捷宏生成嵌套矩阵

我使用\arr宏作为环境的快捷方式bmatrix。此外,我使用破解版的bmatrix(参见:制作“增强”系数矩阵的最佳方法是什么?),以便更容易地排版增广矩阵。

理论上,\arr{SOMETHING}应该等于\begin{bmatrix}SOMETHING\end{bmatrix},而且大多数情况下确实如此。例如,

\[
\arr   {  2 &  5 }
\arr   {  1 \\ 2 },
\arr   {  1 &  3 }
\arr   {  1 \\ 2 }
\]

生产

在此处输入图片描述

然而,当我把上面的几行放在另一行里面\arr,为了得到一个嵌套矩阵,它就爆炸了

\[
\arr{
\arr   {  2 &  5 }
\arr   {  1 \\ 2 } \\
\arr   {  1 &  3 }
\arr   {  1 \\ 2 }
}
\]

在此处输入图片描述

出现错误“不完整的 \ifdim”,而

\begin{bmatrix}
  \begin{bmatrix}
    2 & 5
  \end{bmatrix}
  \begin{bmatrix}
    1 \\ 2
  \end{bmatrix}
  \\
  \begin{bmatrix}
    1 & 3
  \end{bmatrix}
  \begin{bmatrix}
    1 \\ 2
  \end{bmatrix}
\end{bmatrix}

作品

在此处输入图片描述

为什么?

下面是代码

\documentclass[a4paper,11pt]{article}
\usepackage{amsmath}
\usepackage{marvosym}
\usepackage{wasysym}
\usepackage{amssymb}

\makeatletter

% https://tex.stackexchange.com/questions/2233/
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols r]{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}

\newcommand{\arr}[2][\@empty]{%
  \setbox\@tempboxa\hbox{#1}
  \ifdim\wd\@tempboxa=0pt
  \begin{bmatrix}#2\end{bmatrix}
  \else
  \begin{bmatrix}[#1]#2\end{bmatrix}
  \fi
}

\makeatother


\begin{document}

\[
\arr   {  2 &  5 }
\arr   {  1 \\ 2 },
\arr   {  1 &  3 }
\arr   {  1 \\ 2 }
\]
% \[
% \arr{
% \arr   {  2 &  5 }
% \arr   {  1 \\ 2 } \\
% \arr   {  1 &  3 }
% \arr   {  1 \\ 2 }
% }
% \]
% \[
% \begin{bmatrix}
%   \begin{bmatrix}
%     2 & 5
%   \end{bmatrix}
%   \begin{bmatrix}
%     1 \\ 2
%   \end{bmatrix}
%   \\
%   \begin{bmatrix}
%     1 & 3
%   \end{bmatrix}
%   \begin{bmatrix}
%     1 \\ 2
%   \end{bmatrix}
% \end{bmatrix}
% \]
\end{document}

编辑:未简化的定义\arr如下:

\newcommand{\arr}{\@ifstar\arr@star\arr@nostar}
\newcommand{\arr@nostar}[2][\@empty]{%
  \setbox\@tempboxa\hbox{#1}\ifdim\wd\@tempboxa=0pt
  \begin{bmatrix}#2\end{bmatrix}
  \else \begin{bmatrix}[#1]#2\end{bmatrix} \fi
}
\newcommand{\arr@star}[2][\@empty]{%
  \setbox\@tempboxa\hbox{#1}\ifdim\wd\@tempboxa=0pt
  \begin{matrix}#2\end{matrix}
  \else \begin{matrix}[#1]#2\end{matrix} \fi
}

答案1

\setbox是一种很容易出错的方法来测试参数是否为空,但在这里我认为你根本不需要测试:

\documentclass[a4paper,11pt]{article}
\usepackage{amsmath}
\usepackage{marvosym}
\usepackage{wasysym}
\usepackage{amssymb}

\makeatletter

% http://tex.stackexchange.com/questions/2233/
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols r]{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}


\newcommand{\arr}{\@ifstar\arr@star\arr@nostar}

\newcommand{\arr@star}[2][*\c@MaxMatrixCols r]{%
  \begin{matrix}[#1]#2\end{matrix}%
}

\newcommand{\arr@nostar}[2][*\c@MaxMatrixCols r]{%
  \begin{bmatrix}[#1]#2\end{bmatrix}%
}



\makeatother


\begin{document}

\[
\arr   {  2 &  5 }
\arr   {  1 \\ 2 },
\arr   {  1 &  3 }
\arr   {  1 \\ 2 }
\]
 \[
 \arr{
 \arr   {  2 &  5 }
 \arr   {  1 \\ 2 } \\
 \arr   {  1 &  3 }
 \arr   {  1 \\ 2 }
 }
 \]
% \[
% \begin{bmatrix}
%   \begin{bmatrix}
%     2 & 5
%   \end{bmatrix}
%   \begin{bmatrix}
%     1 \\ 2
%   \end{bmatrix}
%   \\
%   \begin{bmatrix}
%     1 & 3
%   \end{bmatrix}
%   \begin{bmatrix}
%     1 \\ 2
%   \end{bmatrix}
% \end{bmatrix}
% \]
\end{document}

相关内容