我使用这个命令来缩写我的符号
\NewDocumentCommand{\Lp}{O{p}O{\mathbb{R}^d}O{[- \infty, \infty]}}%
{L^{#1}(#2, #3)}
我为每个参数设置了一个默认值,大多数情况下我只需要更改第一个参数,如下所示
\Lp[1]
但有时我只需要改变第二个,就像这样
\Lp[p][E]
我觉得这有点多余,我想避免重写第一个参数,而只是将其保留为我设置的默认值(实际上这不仅仅是“第一个参数问题”,在某些情况下我只需要更改第三个参数等等)。我觉得很自然的表示法是
\Lp[][E]
\Lp[1][][\mathbb{R}]
其中“ []
”的意思是“分配默认值”,但这样做我很容易得到一个空白。我想知道是否有这样做的语法,如果没有,那么实现它的最佳实践是什么(我猜应该在 中使用一些“if-then-else” \NewDocumentCommand
)。
答案1
具有多个连续可选参数的命令的经典示例是
\parbox[<outer alignment>][<vertical dimension>][<inner alignment>]{<width>}{<text>}
其中第三个可选参数只有在第二个可选参数存在时才有意义。如果第二个和第三个可选参数位于之后,语法可能会更好{<width>}
,但几乎一直都是这样。
在您的情况下,参数完全彼此独立,因此您的可选参数序列会显得笨拙。
定义一个键值语法更适合您的情况,而且并不是很困难。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\ExplSyntaxOn
\keys_define:nn { fral/lp }
{
e .tl_set:N = \l__fral_lp_exponent_tl,
s .tl_set:N = \l__fral_lp_space_tl,
i .tl_set:N = \l__fral_lp_interval_tl,
e .initial:n = p,
s .initial:n = \mathbb{R}^d,
i .initial:n = {[-\infty,\infty]},
}
\NewDocumentCommand{\Lp}{O{}}
{
\group_begin: % not to clobber initial values
\keys_set:nn { fral/lp } { #1 }
L^{\l__fral_lp_exponent_tl}(\l__fral_lp_space_tl,\l__fral_lp_interval_tl)
\group_end:
}
\ExplSyntaxOff
\begin{document}
$\Lp$
$\Lp[e=1]$
$\Lp[e=2,s=X,i={[1,2]}]$
$\Lp[i={[1,2]},e=2,s=X]$
\end{document}