方法:如果参数是数值...否则

方法:如果参数是数值...否则

我正在尝试创建一个微分命令。目前我有以下内容:

\newcommand{\diff}[1][]{%
  \def\ArgI{{#1}}%
  \diffRelay%
}
\newcommand{\diffRelay}[2][]{%
  \frac{\textnormal{d}^{#1}\ArgI}{\textnormal{d}#2^{#1}}%
}

这让我可以像\diff{x}, diff[y]{x}, diff[y][2]{x}创建 diff-by-x、diff-y-by-x、y-by-x 的二阶导数。要简单地写出任何东西的 n 阶导数,我必须使用\diff[][n]{x}

我正在寻找一种方法来检查第一个可选参数是否是数字,这样我就可以省略空参数来创建第 n 个导数:

\newcommand{\diff}[1][]{%
  \def\ArgI{{#1}}%
  \diffRelay%
}
\newcommand{\diffRelay}[2][]{%
  \if \ArgI is numerical % better: \and #1 is empty
    \frac{\textnormal{d}^{\ArgI}}{\textnormal{d}#2^{\ArgI}}%
  \else
    \frac{\textnormal{d}^{#1}\ArgI}{\textnormal{d}#2^{#1}}%
}

答案1

我认为你想要这样的东西(它实际上测试一系列数字,结果为>0,所以不要使用[000];-)

\documentclass{article}

\newcommand{\diff}[1][]{%
  \def\ArgI{#1}%
  \diffRelay%
}
\def\eatrelax#1\relax{}
\newcommand{\diffRelay}[2][]{%
  \expandafter\eatrelax\ifnum0=0\ArgI\relax% is numerical % better: \and #1 is empty
    \frac{\textnormal{d}^{#1}\ArgI}{\textnormal{d}#2^{#1}}%
  \else\relax
    \frac{\textnormal{d}^{\ArgI}}{\textnormal{d}#2^{\ArgI}}%
 \fi
}

\begin{document}

$\diff[2]{x}$

$\diff[y]{x}$

$\diff[y][2]{x}$

\end{document}

答案2

我认为你不需要对数字进行测试。我建议使用不同的语法:

\der[<function>]{<variable>}[<order>]

具有两个可选参数;如果省略第一个参数,则得到运算符,否则得到导数;第二个参数是导数的顺序。

使用xparse起来很容易;第一个可选参数具有空的默认值,而我们\IfNoValueTF对第二个参数使用测试,以避免空上标添加不必要的\scriptspace

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\der}{O{}mo}{%
  \IfNoValueTF{#3}
    {\frac{\mathrm{d}#1}{\mathrm{d}#2}}
    {\frac{\mathrm{d}^{#3}#1}{\mathrm{d}#2^{#3}}}%
}

\begin{document}
\[
\der[y]{x}\quad
\der[y]{x}[2]\quad
\der[y]{x}[n]\quad
\der{x}\quad
\der{x}[2]\quad
\der{x}[n]
\]
\end{document}

在此处输入图片描述

相关内容