我正在学习使用xparse
可选参数构建命令。但我遇到了问题:
我想创建一个名为\topcat
并输出的命令:
\mathcal{O} if no argument is specified
\mathcal{O}^{#1} if we specify \topcat[op]
我尝试使用类似的东西:
\NewDocumentCommand{\topcatm}{o}{#1}{$\mathcal{O}$^{\IfValueTF{#1}}}
如果有人能给我一些建议就太好了,因为xparse
我试图阅读xparse
CTAN 但发现它相当难懂。
答案1
xparse
乍一看可能会有点令人困惑,因为它的语法与 不同\newcommand
。
语法是
\NewDocumentCommand{\macroname}{argument specifiers}{%
expansion code
}
参数说明符非常有用。如果请求的是可选参数,并且没有给出默认值,那么o
很可能是正确的选择,否则使用O{default}
(用默认值替换默认值 ;-))
现在,如果o
使用,命令\IfValueTF
或\IfValueT
或\IfValueF
决定是否给出可选参数。(应用哪一个取决于具体需求。如果不确定,请使用\IfValueTF
。)
(如果没有使用上述任何宏\IfValueTF
,则相关参数的替换‘文本’是-NoValue-
如果可选参数被指定为o
类型并且在宏调用中被省略)
用法是
\IfValueTF{#1}{true code}{false code}
尽管 OP 的试用代码可能有效,但^{\IfValueTF{#1}...}
我不推荐这种语法,只是为了清晰的原因。
这是一个有效版本,但是我删除了$...$
字符。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}
\NewDocumentCommand{\topcatm}{o}{%
\IfValueTF{#1}{%
\mathcal{O}^{#1}%
}{%
\mathcal{O}%
}%
}
\begin{document}
$ \topcatm$
$\topcatm[foo]$
\end{document}
xparse
提供了使用不同选项的功能delimiters
,例如<>
或()
作为可选参数,使用d
或D
说明符代替o
或O