答案1
如果你定义
\newcommand{\M}[3]{M(#1 \times #2, #3)}
那么输入语法应该是
\M{2}{2}{\mathbb{R}}
和不是
\M{2,2,\mathbb{R}}
这确实重现了奇怪的输出,并且可能还重现了一些错误消息。
例子:
\documentclass{article}
\usepackage{amsmath,amssymb}
\newcommand{\RR}{\mathbb{R}} % the reals
\newcommand{\M}[3]{M(#1\times #2,#3)}
\begin{document}
Good syntax \verb|\M{2}{2}{\RR}| yields $A\in\M{2}{2}{\RR}$
Bad syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$
\end{document}
你能让这个显然更简单的语法发挥作用吗?是的。
\documentclass{article}
\usepackage{amsmath,amssymb}
%\usepackage{xparse}% not needed for LaTeX 2020-10-01 or later
\newcommand{\RR}{\mathbb{R}} % the reals
\NewDocumentCommand{\M}{>{\SplitArgument{2}{,}}m}{\MLONG#1}
\NewDocumentCommand{\MLONG}{mmm}{M(#1\times #2,#3)}
\begin{document}
Good new syntax \verb|\M{2,2,\RR}| yields $A\in\M{2,2,\RR}$
\end{document}
秘密在哪里?预处理器\SplitArgument{2}{,}
告诉 LaTeX 读取参数(该参数应包含两个逗号),并将其传递#1
为
{<a>}{<b>}{<c>}
当参数为 时<a>,<b>,<c>
。因此,我们可以将转换后的参数输入到\MLONG
读取三个标准参数的函数中。
答案2
答案3
正如其他答案所指出的,问题在于您需要\M{2}{2}{R}
在文档中写入才能使用宏。
可以理解您想避免以这种方式编写,因为花括号很难输入。egreg 展示了一种使用现代 LaTeX 减少(但不消除)花括号的方法。
如果你想使用类似于你在问题文本中写的方式的语法,另一种方法是旧的 TeX 样式定义
\def\M(#1x#2,#3){M(#1 \times #2, \mathbb{#3})}
然后您就可以\M(2x2,R)
在文档中写入内容了。