向自定义数学表达式添加可选参数(作为指数)

向自定义数学表达式添加可选参数(作为指数)

我想定义一个命令\bigO,如果我输入类似的内容,\bigO[3]{\epsilon}它会给出$\mathcal{O}(\epsilon^3)$,并且如果我省略可选参数并将\bigO{\epsilon}其默认为$\mathcal{O}(\epsilon)$

目前,我有类似这样的代码:\newcommand{\bigO}[2][1]{\mathcal{O}(#2^#1)},如果我想让默认指数(即)1明确出现,那么它就可以工作。但如果我不想1在默认情况下出现在指数中,该怎么办?

答案1

您可以使用标志值来表示“无值”。在这种情况下,由于它是用于排版,因此使用空默认值并进行测试是相当安全的:

\newcommand\bigO[2][]%
  {\mathcal{O}(#2\if\relax\detokenize{#1}\relax\else^{#1}\fi)}
$\bigO{\epsilon}$ and $\bigO[3]{\epsilon}$

或者您可以使用\NewDocumentCommand,并测试是否给出了可选参数\IfValueT

\NewDocumentCommand \bigOo { o m }
  {\mathcal{O}(#2\IfValueT{#1}{^{#1}})}
$\bigOo{\epsilon}$ and $\bigOo[3]{\epsilon}$

或者如果您想要更自然的语法,您可以使用e参数类型:

\NewDocumentCommand \bigOoh { m e^ }
  {\mathcal{O}(#1\IfValueT{#2}{^{#2}})}
$\bigOoh{\epsilon}$ and $\bigOoh{\epsilon}^3$

以下是包含所有三个版本的文档:

\documentclass{article}
\begin{document}

\newcommand\bigO[2][]%
  {\mathcal{O}(#2\if\relax\detokenize{#1}\relax\else^{#1}\fi)}
$\bigO{\epsilon}$ and $\bigO[3]{\epsilon}$

\NewDocumentCommand \bigOo { o m }
  {\mathcal{O}(#2\IfValueT{#1}{^{#1}})}
$\bigOo{\epsilon}$ and $\bigOo[3]{\epsilon}$

\NewDocumentCommand \bigOoh { m e^ }
  {\mathcal{O}(#1\IfValueT{#2}{^{#2}})}
$\bigOoh{\epsilon}$ and $\bigOoh{\epsilon}^3$

\end{document}

在此处输入图片描述

相关内容