我想在包中的\\
环境实例内重新定义宏。但不尊重外部或内部的重新定义:bmatrix
amsmath
bmatrix
\\
bmatrix
\newcommand{\im}[1]{{
\renewcommand{\\}{;&}
\begin{bmatrix}#1\end{bmatrix}
}}
\newcommand{\im}[1]{
\begin{bmatrix}\renewcommand{\\}{;&}#1\end{bmatrix}
}
答案1
我没有尝试重新定义\\
,而是使用标记循环预先扫描 参数的标记\im
,并用标记替换;&
找到的每个实例\\
。所有其他标记都按其最初出现的方式回显。
\documentclass{article}
\usepackage{amsmath,tokcycle}
\newcommand{\im}[1]{{\resettokcycle
\Macrodirective{\ifx\\##1\addcytoks{;&}\else\addcytoks{##1}\fi}
\tokencyclexpress\begin{bmatrix}#1\end{bmatrix}\endtokencyclexpress
}}
\begin{document}
$\begin{bmatrix}a\\b\end{bmatrix}$
versus
$\im{a\\b}$
\end{document}
答案2
您更希望处理您的输入。expl3
它本质上是一行代码。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\im}{m}
{
\begin{bmatrix}
\seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
\seq_use:Nn \l_tmpa_seq { ; & }
\end{bmatrix}
}
\ExplSyntaxOff
\begin{document}
$\im{a\\b}$
\end{document}
不过,间距似乎有点奇怪。你可以考虑不是使用bmatrix
。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\im}{m}
{
\left[
\seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
\seq_use:Nn \l_tmpa_seq { {;} \mspace{\thickmuskip} }
\right]
}
\ExplSyntaxOff
\begin{document}
$\im{a\\b}$
\end{document}