我定义了一个使用方括号的命令,当我在矩阵环境中使用它时,该命令不会被解析。我在这里偶然发现了一个解决问题的方法:
即放在{}
我的命令周围。但我不明白为什么\\[]
会出现这个问题,因为我甚至没有使用它。但请注意,如果我加载,amsmath
则修复将不再有效。
- 这一切该如何解释?为什么
amsmath
修复失败? - 为什么我能够在
align
环境中毫无问题地使用我的命令? - 除此之外,还有哪些环境
matrix
会受到影响? - 我可以调整我的定义(同时保留方括号)以使其更加强大吗?
关于编码风格:这实际上是我编写的另一个宏的简化版本。对于该宏,有效输入是:\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
包。