语法:在宏中使用第二个参数,将第一个参数保留为默认值

语法:在宏中使用第二个参数,将第一个参数保留为默认值

我使用这个命令来缩写我的符号

\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}

在此处输入图片描述

相关内容