我通过以下方式为上确界范数定义了一个宏
\DeclarePairedDelimiter{\supnorm}{\|}{\|_\infty}
效果很好。但是,一旦我想放置上标,例如
\supnorm{f}^2
事情看起来很有趣,因为 2 出现后符号。然而,我希望事情看起来更像你通过
\|f\|_\infty^2
当然,也可以通过使用
\newcommand{\supnorm}[1]{\|#1\|_\infty}
但这样就失去了 \DeclarePairedDelimiter 的出色功能,而我真的开始非常喜欢它了。有什么想法可以结合两者的优点吗?
答案1
更新:
现在有了 提供的所有选项\DeclarePairedDelimiter
!查看新定义(不使用xparse
):
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}
\makeatletter
\newcommand{\@supnormstar}[1]{\norm*{#1}_\infty}
\newcommand{\@supnormnostar}[2][]{\norm[#1]{#2}_\infty}
\newcommand{\supnorm}{\@ifstar\@supnormstar\@supnormnostar}
\makeatother
例如以下代码:
\[\supnorm{\frac{\sqrt5-1}{2}}^2\]
\[\supnorm*{\frac{\sqrt5-1}{2}}^2\]
\[\supnorm[\big]{\frac{\sqrt5-1}{2}}^2\]
会给你:
答案2
您需要获取\infty
分组的外部。这将涉及重新执行选项:
\documentclass[a4paper]{memoir}
\usepackage{mathtools,xparse}
\DeclarePairedDelimiter{\supnormX}{\lVert}{\rVert}
\DeclareDocumentCommand\supnorm{ s o m }{%
\IfBooleanTF{#1}{% starred
\supnormX*{#3}_\infty
}{% not starred
\IfNoValueTF{#2}{% no []
\supnormX{#3}_\infty
}{% data in []
\supnormX[#2]{#3}_\infty
}
}
}
\begin{document}
\[
\supnorm{A}^2
\]
\end{document}
答案3
\DeclarePairedDelimiter
这是我使用不同名称的不同的实现。
\documentclass[a4paper]{memoir}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand{\xDeclarePairedDelimiter}{mmmO{}}
{
\NewDocumentCommand{#1}{sO{}m}
{
\IfBooleanTF{##1}
{
\egreg_paired_delimiter_expand:nnnn {#2}{#3}{##3}{#4}
}
{
\egreg_paired_delimiter_fixed:nnnnn {##2}{#2}{#3}{##3}{#4}
}
}
}
\cs_new_protected:Npn \egreg_paired_delimiter_expand:nnnn #1 #2 #3 #4
{% Fix the spacing issue with \left and \right (D. Arsenau, P. Stephani and H. Oberdiek)
\mathopen{}
\mathclose\c_group_begin_token
\left#1
#3
\group_insert_after:N \c_group_end_token
\right#2
\tl_if_empty:nF {#4} { \c_math_subscript_token {#4} }
}
\cs_new_protected:Npn \egreg_paired_delimiter_fixed:nnnnn #1 #2 #3 #4 #5
{
\mathopen{#1#2}#4\mathclose{#1#3}
\tl_if_empty:nF {#5} { \c_math_subscript_token {#5} }
}
\ExplSyntaxOff
%% the final optional argument to \xDeclarePairedDelimiter
%% is a subscript to the right fence
\xDeclarePairedDelimiter{\supnormX}{\lVert}{\rVert}[\infty]
\begin{document}
\[
\supnormX{A}^2\quad
\supnormX[\big]{A}^2\quad
\supnormX[\Big]{A}^2\quad
\supnormX[\bigg]{A}^2\quad
\supnormX[\Bigg]{A}^2\quad
\supnormX*{\frac{A}{2}}^2
\]
\end{document}
由于 daleif 表示有兴趣扩展这个想法,我添加了一种使用键值接口定义宏的方法。主要(内部)函数保持不变。
\documentclass[a4paper]{memoir}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand{\KDeclarePairedDelimiter}{mm}
{
\__egreg_delimiter_clear_keys: % reset to the default
\keys_set:nn { egreg/delimiters } { #2 }
\use:x % we want to expand the values of the token variables set with the keys
{
\exp_not:n {\NewDocumentCommand{#1}{sO{}m} }
{
\exp_not:n { \IfBooleanTF{##1} }
{
\exp_not:N \egreg_paired_delimiter_expand:nnnn
{ \exp_not:V \l_egreg_delimiter_left_tl }
{ \exp_not:V \l_egreg_delimiter_right_tl }
{ \exp_not:n { ##3 } }
{ \exp_not:V \l_egreg_delimiter_subscript_tl }
}
{
\exp_not:N \egreg_paired_delimiter_fixed:nnnnn
{ \exp_not:n { ##2 } }
{ \exp_not:V \l_egreg_delimiter_left_tl }
{ \exp_not:V \l_egreg_delimiter_right_tl }
{ \exp_not:n { ##3 } }
{ \exp_not:V \l_egreg_delimiter_subscript_tl }
}
}
}
}
\keys_define:nn { egreg/delimiters }
{
left .tl_set:N = \l_egreg_delimiter_left_tl,
right .tl_set:N = \l_egreg_delimiter_right_tl,
subscript .tl_set:N = \l_egreg_delimiter_subscript_tl,
}
\cs_new_protected:Npn \__egreg_delimiter_clear_keys:
{
\keys_set:nn { egreg/delimiters } { left=.,right=.,subscript={} }
}
\cs_new_protected:Npn \egreg_paired_delimiter_expand:nnnn #1 #2 #3 #4
{% Fix the spacing issue with \left and \right (D. Arsenau, P. Stephani and H. Oberdiek)
\mathopen{}
\mathclose\c_group_begin_token
\left#1
#3
\group_insert_after:N \c_group_end_token
\right#2
\tl_if_empty:nF {#4} { \c_math_subscript_token {#4} }
}
\cs_new_protected:Npn \egreg_paired_delimiter_fixed:nnnnn #1 #2 #3 #4 #5
{
\mathopen{#1#2}#4\mathclose{#1#3}
\tl_if_empty:nF {#5} { \c_math_subscript_token {#5} }
}
\ExplSyntaxOff
\KDeclarePairedDelimiter{\supnormX}{
left=\lVert,
right=\rVert,
subscript=\infty
}
\begin{document}
\[
\supnormX{A}^2\quad
\supnormX[\big]{A}^2\quad
\supnormX[\Big]{A}^2\quad
\supnormX[\bigg]{A}^2\quad
\supnormX[\Bigg]{A}^2\quad
\supnormX*{\frac{A}{2}}^2
\]
\end{document}
答案4
这只是我为自己的包裹做无耻的广告,语义。(请注意,SemanTeX 是一个相当重的软件包,它牺牲了速度来换取灵活性。因此,此解决方案将比此处介绍的其他解决方案慢得多。不过,您仍需要一个很多才能感受到差异。
\documentclass{article}
\usepackage{semantex}
% You will need a recent update of it
\NewVariableClass\MyVar
\NewObject\MyVar\norm[
left par=\lVert,
right par=\rVert,
arg keyval=false,
define keys[1]={
{default}{ output options={sep lower={#1}} },
},
]
\begin{document}
$ \norm{x} $,
$ \norm[par=\big]{x} $,
$ \norm[par=auto]{ \frac{1}{2} } $
$ \norm[2]{x} $
$ \norm[\infty]{x} $,
$ \norm[\infty,par=\big]{x} $,
$ \norm[\infty,par=auto]{\frac{1}{2}} $
\NewObject\MyVar\supnorm[copy=\norm,\infty]
$ \supnorm{x} $,
$ \supnorm[par=\big]{x} $,
$ \supnorm[par=auto]{\frac{1}{2}} $
\end{document}