我正在尝试创建一个微分命令。目前我有以下内容:
\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}