在新命令中返回数学值

在新命令中返回数学值

因此,我尝试构造一个命令来调用另一个命令,以便更轻松地输入,但出于某种原因,我无法让命令正确返回内容。这是我所拥有的

\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更清楚地标记数字的结束,但在其他情况下,当需要完全可扩展性时,不应使用它(这里不是这种情况)。

我还去掉了不必要的牙套。

相关内容