将带有可选参数的成对分隔符命令切换为 \DeclaredPairedDelimiter

将带有可选参数的成对分隔符命令切换为 \DeclaredPairedDelimiter

我有以下命令:

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

在此处输入图片描述

相关内容