在矩阵环境中不能使用带方括号的命令

在矩阵环境中不能使用带方括号的命令

我定义了一个使用方括号的命令,当我在矩阵环境中使用它时,该命令不会被解析。我在这里偶然发现了一个解决问题的方法:

数组环境中的方括号“[”

即放在{}我的命令周围。但我不明白为什么\\[]会出现这个问题,因为我甚至没有使用它。但请注意,如果我加载,amsmath则修复将不再有效。

  1. 这一切该如何解释?为什么amsmath修复失败?
  2. 为什么我能够在align环境中毫无问题地使用我的命令?
  3. 除此之外,还有哪些环境matrix会受到影响?
  4. 我可以调整我的定义(同时保留方括号)以使其更加强大吗?

关于编码风格:这实际上是我编写的另一个宏的简化版本。对于该宏,有效输入是:\func \func[A] \func[A][B] \func[A][] \func[][B]。所以我有多个可选参数。实际的宏还使用括号作为指定附加信息的方式。所有这些都相当复杂,这就是我转向的原因http://www.ctan.org/tex-archive/support/newcommand来帮助我生成代码。因此,此宏的样式遵循生成的输出newcommand.py,这就是为什么我想要修复我提供的代码,而不是一个全新的解决方案。

示范:

\documentclass{minimal}
\usepackage{amsmath} % loading this actual causes the solution to fail
\makeatletter
\def\democmdr{%
  \@ifnextchar[{\csname democmdr@i\endcsname}
               {\csname democmdr@i\endcsname[]}
    }%
\expandafter\def\csname democmdr@i\endcsname[#1]{%
  0#10
}%
\makeatother
\begin{document}
\setlength{\parindent}{0pt}
$\democmdr[5] \qquad \begin{matrix}\democmdr[5]\end{matrix}$ \\ % does not work
$\democmdr[5] \qquad \begin{matrix}{\democmdr[5]}\end{matrix}$ % works
\begin{align*}
\democmdr[5] % works even though \\ can be used in this environment
\end{align*}
\end{document}

快速更新:事实证明,加载amsmath破坏了我提到的解决方案。

答案1

你的问题不是方括号:而是环境的定义matrix。如果你这样做,\show\matrix你会得到

> \matrix=macro:
#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 }}}\,.
l.14 \show\matrix

其中最重要的是#1。底层\matrix宏抓取一个参数,因此在您的情况下\democmdr。这将宏与任何后续参数隔离开来(请注意,它后面跟着\crcr),因此永远不会找到它们。

amsmath重新定义束,这样\matrix问题就消失了。然后,代码中的错误就暴露出来了:你有一个杂散空间。在

\def\democmdr{%
  \@ifnextchar[{\csname democmdr@i\endcsname}
               {\csname democmdr@i\endcsname[]}
    }%

第三个参数后插入了一个空格,\@ifnextchar因为您没有用%

\def\democmdr{%
  \@ifnextchar[%]
    {\csname democmdr@i\endcsname}
    {\csname democmdr@i\endcsname[]}%
 }

(我重新格式化了一下,使参数更清晰。)这显示了amsmath加载的包,因为它重新定义\@ifnextchar为不忽略空格。这是因为\\[]业务原因,但适用于其他情况。当您拥有跳过空格的内核定义时\@ifnextchar,您的错误是“不可见的”。

因此我建议您删除那个杂散空间并要求该amsmath包。

相关内容