使用重新定义的 bmatrix 和 align 环境进行编译错误

使用重新定义的 bmatrix 和 align 环境进行编译错误

我刚刚花了几个小时寻找这里最后一个例子中编译错误的原因:

\documentclass[a4paper,draft=true, headsepline=on, twoside
, 11pt,
]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{amsmath}


%matrix environment redef
\makeatletter
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}
\makeatother






\begin{document}

\begin{equation*}
  \begin{bmatrix}
     & b 
  \end{bmatrix}
\end{equation*}

\begin{align*}
  \begin{bmatrix}
   ~  & b 
  \end{bmatrix}
\end{align*}

\begin{align*}
  \begin{array}{cc}
     & b 
  \end{array}
\end{align*}  


\begin{align*}
  \begin{bmatrix}
     & b 
  \end{bmatrix}
\end{align*}  


\end{document}

如果我没有像这里讨论的那样重新定义 bmatrix 环境,则不会出现错误: 这个增广矩阵的宏如何工作?

但是,错误似乎只会出现在这种特殊情况下,即使用 align 环境,矩阵的第一列中有空条目。你知道这些错误是从哪里来的吗?我不知道,但如果以后出现类似问题,这肯定会有所帮助。

答案1

由于矩阵中第一个单元格为空,对可选参数的扫描会使对齐解析器感到困惑。

您比较幸运,因为xparse

\documentclass[a4paper,draft=true, headsepline=on, twoside
, 11pt,
]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{amsmath,xparse}

%matrix environment redef
\makeatletter
\RenewDocumentCommand\env@matrix{O{*\c@MaxMatrixCols c}}{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}
\makeatother

\begin{document}

\begin{align*}
  \begin{bmatrix}
     & b 
  \end{bmatrix}
\end{align*}

\end{document}

答案2

您可以添加额外的支撑层以确保前瞻安全。

\documentclass[a4paper,draft=true, headsepline=on, twoside
, 11pt,
]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{amsmath}


%matrix environment redef
\makeatletter
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
  \hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{#1}}

\renewenvironment{bmatrix}
{{\ifnum`}=0 \fi\left[\env@matrix}
{\endmatrix\right]\ifnum`{=0 \fi}}
\makeatother






\begin{document}

\begin{equation*}
  \begin{bmatrix}
     & b 
  \end{bmatrix}
\end{equation*}

\begin{align*}
  \begin{bmatrix}
   ~  & b 
  \end{bmatrix}
\end{align*}

\begin{align*}
  \begin{array}{cc}
     & b 
  \end{array}
\end{align*}  


\begin{align*}
  \begin{bmatrix}
     & b 
  \end{bmatrix}
\end{align*}  


\end{document}

相关内容