我想定义一个命令\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}