我想要一个数学简写命令,它接受一个可选参数,如果存在,则将其放入括号中,并且运算符也可以有一个下标。我该如何将下标和括号放在我想要的位置?
我希望它看起来像这个 MWE:
\documentclass{article}
\usepackage{amsmath}
\newcommand{\op}[1]
{
\operatorname{\mathrm{J}}(#1)
}
\begin{document}
\begin{tabular}{lllll}
$ \op $ &
$ \op{a} $ &
$ \op_f $ &
$ \op_f{a} $ &
$ \op{a}_f $ % probably doesn't make sense to use it like this
\\
$ \mathop{\mathrm J} $ &
$ \mathop{\mathrm J}(a) $ &
$ \mathop{\mathrm J}_f $ &
$ \mathop{\mathrm J}_f(a) $ &
$ \mathop{\mathrm J}_f(a) $
\end{tabular}
\end{document}
答案1
你可以用xparse
通过使用 进行打包\NewDocumentCommand
。但我不确定这是否是一个好主意,因为可选的大括号分隔参数非常不符合 LaTeX 风格,而且很容易在无意中将某些内容作为参数传入。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand{\op}{e{_}ge{_}}{%
\operatorname{J}%
\IfValueT{#1}{_{#1}}\IfValueT{#3}{_{#3}}%
\IfValueT{#2}{(#2)}%
}
\begin{document}
\begin{tabular}{lllll}
$ \op $ &
$ \op{a} $ &
$ \op_f $ &
$ \op_f{a} $ &
$ \op{a}_f $ % probably doesn't make sense to use it like this
\\
$ \mathop{\mathrm J} $ &
$ \mathop{\mathrm J}(a) $ &
$ \mathop{\mathrm J}_f $ &
$ \mathop{\mathrm J}_f(a) $ &
$ \mathop{\mathrm J}_f(a) $
\end{tabular}
\end{document}
在参数规范中,e{_}
表示可选参数,前面带有_
,g
表示可选{}
-分隔参数。
\IfValueT
用于测试是否提供了可选参数,然后采取相应措施。请参阅文档更多细节。
请注意,g
参数类型未列在顶部,因为它只是为了向后兼容而包含的,因为“现在应该很大程度上避免使用它们,因为在包中使用它们会导致用户界面不一致”(来自文档)。
答案2
您可以通过以下方式定义一个带有两个参数的新命令:
\newcommand{\op}[2]{\mathrm{J}_{#1}(#2)}
然后以 的形式写入命令\op{subscript}{argument}
。这种方法很好,但是如果您只想键入运算符,则必须写入\op{}{}
而不是
\op
,并且您不能直接在运算符上写上标(\op^2{}{}
例如,您不能写 )。
如果你将新运算符视为常规运算符(我的意思是像运算\sin
符),我的建议是在序言中写入
\DeclareMathOperator{\op}{\mathrm{J}}
只需将下标和参数写成\sin
,即 的形式\op_f(a)
。这样做的好处是\op
就像 一样处理\sin
,因此您可以直接在运算符上写下标和上标,如果参数不存在,则省略括号。