我有以下命令:
\newcommand{\norm}[2][]{%
\ifx\nosuchcommandipromise#1\nosuchcommandipromise
{\lVert #2 \rVert}%
\else
{\lVert #2 \rVert}_{#1}%
\fi
}
我想要切换到使用\DeclaredPairedDelimiter
或其变体之一。但是 - 似乎这些不允许定义带有可选参数的命令。
我遗漏了什么?或者 - 我该怎么做?
答案1
这是一个解决方案:\mynorm
具有两个可选参数和一个强制参数:第一个可选参数可以是*
(附加到命令名称)或[\big]
或[\Big]
,&c。第二个可选参数是下标,在其“自然”位置(在强制参数之后)。
但是,我建议使用另一种构造\DeclarePairedDelimiterXPP
方法,这样您就不必键入下标了。我给出了 1 范数、2 范数、p 范数和 sup 范数的命令。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse, etoolbox}
\newcommand*{\dd}{\mathop{\kern0pt\mathrm{d}}\mkern-2mu{}}
\DeclarePairedDelimiter{\normaux}\lVert\rVert
\NewDocumentCommand\mynorm{somO{}}{%
\IfBooleanTF{#1}
{\normaux*{#3}_{#4}}%
{\IfNoValueTF{#2}{\normaux{#3}_{#4}}{\normaux[#2]{#3}_{#4}}}%
}%
\DeclarePairedDelimiterXPP\onenorm[1]{}\lVert\rVert{_1}{\ifblank{#1}{\:\cdot\:}{#1}}%
\DeclarePairedDelimiterXPP\twonorm[1]{}\lVert\rVert{_2}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterXPP\pnorm[1]{}\lVert\rVert{_p}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterXPP\supnorm[1]{}\lVert\rVert{_\infty}{\ifblank{#1}{\:\cdot\:}{#1}}
\begin{document}
$\mynorm{\dfrac XY}[2]\qquad\mynorm*{\dfrac XY}[2]$\bigskip
$\mynorm[\Big]{X^Y}[∞]\qquad\mynorm{X^Y}[2]\qquad\mynorm[\big]{X^Y}$\bigskip
$ \supnorm{f + g} \le \supnorm{f} + \supnorm{g}$\bigskip
$\displaystyle\pnorm{f} = \biggl(\int_0^1 f(t)\dd t \biggr)^{\!\!\frac{1}{p}}$
\end{document}