因此,我尝试构造一个命令来调用另一个命令,以便更轻松地输入,但出于某种原因,我无法让命令正确返回内容。这是我所拥有的
\documentclass[12pt]{article}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{mathtools}
\newcommand{\mfunction}[4] {
\def \lnum{#4}
\ifnum\lnum=0
{M_{{#1}_{{#2},{#3}}}}
\else
{M_{{#1}_{{#2},{#3}}^{k}}}
\fi
}
\newcommand{\man}[3][0] {\mfunction{A}{#2}{#3}{#1}}
\newcommand{\mbn}[3][0] {\mfunction{B}{#2}{#3}{#1}}
\newcommand{\mdn}[3][0] {\mfunction{D}{#2}{#3}{#1}}
\begin{document}
\begin{align*}
\man[1]{n}{l} \coloneqq \{a\}\\
\mbn{n}{k} \coloneqq \{b\} \\
\mdn{n-1}{k} \coloneqq \{d\}
\end{align*}
\end{document}
出现错误,我在有 '\end{align*}' 的地方缺少 '$' 和 '}' 符号。奇怪的是,当我将代码直接放入我的“quick”命令中时,我得到了正确的输出。因此,有效的代码是:
\documentclass[12pt]{article}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{mathtools}
\newcommand{\man}[3][0] {{M_{{A}_{{#2},{#3}}^{#1}}}}
\begin{document}
\begin{align*}
\man[1]{n}{l} \coloneqq \{a\}
\end{align*}
\end{document}
为什么第一个版本不起作用而第二个版本起作用?我的定义/if 语句是否出了问题,导致新命令返回非预期的数据?
谢谢。
答案1
删除 后的空行\def \lnum{#4}
。
答案2
空行将转换为\par
,这在align
和所有数学显示环境中都是非法的。
您的代码中还存在一些其他问题:
\documentclass[12pt]{article}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{mathtools}
\newcommand{\mfunction}[4]{%
\ifnum#4=0\relax
M_{#1_{#2,#3}}%
\else
M_{#1_{#2,#3}^{k}}%
\fi
}
\newcommand{\man}[3][0] {\mfunction{A}{#2}{#3}{#1}}
\newcommand{\mbn}[3][0] {\mfunction{B}{#2}{#3}{#1}}
\newcommand{\mdn}[3][0] {\mfunction{D}{#2}{#3}{#1}}
\begin{document}
\begin{align*}
\man[1]{n}{l} \coloneqq \{a\}\\
\mbn{n}{k} \coloneqq \{b\} \\
\mdn{n-1}{k} \coloneqq \{d\}
\end{align*}
\end{document}
无需定义\lnum
,因为您可以#4
直接在中使用\ifnum
。我还添加了%
保护会产生空格的行尾。这里不是绝对必要的,因为宏将在数学模式下使用,其中空格被忽略,但这是个好习惯,因为对于要在文本模式下使用的宏,空格是重要的。
您可以选择
\ifnum#4=0\relax
和
\ifnum#4=0
(没有%
);\relax
更清楚地标记数字的结束,但在其他情况下,当需要完全可扩展性时,不应使用它(这里不是这种情况)。
我还去掉了不必要的牙套。