使 DeclarePairedDelimiter 切换带星号和不带星号的版本

使 DeclarePairedDelimiter 切换带星号和不带星号的版本

我多次利用了这个答案这里,展示了如何切换成对分隔符命令的星号版本和非星号版本(导致常规版本自动调整分隔符的大小)。

\DeclarePairedDelimiter\abs{\lvert}{\rvert}

\makeatletter
\let\oldabs\abs
\def\abs{\@ifstar{\oldabs}{\oldabs*}}
\makeatother

但是现在,在几乎每个文档中都包含的预标题中,我已经堆叠了几个这样的命令,并且对于每个命令,我都有另外两行用于切换版本的命令。

有没有好的方法来改变\DeclarePairedDelimiter自身,以便它从一开始就切换两者?(这也意味着,这会破坏任何依赖关系吗?)

答案1

这很简单:只需抽象重新定义。

\makeatletter
\newcommand{\WronglyDeclarePairedDelimiter}[3]{%
  \expandafter\DeclarePairedDelimiter\csname RIGHT\string#1\endcsname{#2}{#3}%
  \newcommand#1{%
    \@ifstar{\csname RIGHT\string#1\endcsname}
            {\csname RIGHT\string#1\endcsname*}%
  }%
}
\makeatother

此后,该声明

\WronglyDeclarePairedDelimiter\abs{\lvert}{\rvert}

将定义命令\abs来做你想要的错误的事情。

当你认识到为什么这是错误的,你只需要移除它Wrongly,你就会再次走上正确的道路。;-)

一个“更好”的程序,使用与原始命令相同的语法(但\abs它本身将使用自动或可选参数版本),因此你不需要荒谬的\abs*[\big]{a}

\documentclass{article}
\usepackage{mathtools}

\makeatletter
\newcommand{\WronglyDeclarePairedDelimiter}[3]{%
  \expandafter\DeclarePairedDelimiter\csname RIGHT\string#1\endcsname{#2}{#3}%
  \newcommand#1{%
    \@ifstar{\csname RIGHT\string#1\endcsname}
            {\@ifnextchar[{\csname RIGHT\string#1\endcsname}
                          {\csname RIGHT\string#1\endcsname*}%
            }%
  }%
}
\makeatother

\WronglyDeclarePairedDelimiter\abs{|}{|}

\begin{document}

$\abs{\dfrac{1}{2}}$

$\abs[\Big]{\dfrac{1}{2}}$

$\abs*{\dfrac{1}{2}}$

\end{document}

答案2

试用版,无任何保证,通过内部切换两个版本。(代码是从mathtools.sty;-) '偷' 来的)

\documentclass{article}

\usepackage{xparse}
\usepackage{mathtools}


\makeatother
\ExplSyntaxOn
\renewcommand*\DeclarePairedDelimiter[3]{%
  \@ifdefinable{#1}{
    \MT_delim_default_inner_wrappers:n{#1}
    \@namedef{MT_delim_\MH_cs_to_str:N #1 _star:}##1
      %{\mathopen{}\mathclose\bgroup\left#2 ##1 \aftergroup\egroup\right #3}%
      { \@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn}%
           {\left#2}{##1}{\right#3} }%
    \@xp\@xp\@xp
      \newcommand
        \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname
        [2][\\@gobble]
        {
          %\mathopen{\@nameuse {\MH_cs_to_str:N ##1 l} #2} ##2
          %\mathclose{\@nameuse {\MH_cs_to_str:N ##1 r} #3}}
          \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn}%
             {\@nameuse {\MH_cs_to_str:N ##1 l} #2}
             {##2}
             {\@nameuse {\MH_cs_to_str:N ##1 r} #3}
        }
    \DeclareRobustCommand{#1}{
      \@ifstar
        {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}}
        {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}}
    }
  }
}
\ExplSyntaxOff
\makeatother

\DeclarePairedDelimiter\abs{\lvert}{\rvert}



\begin{document}
$\abs{-5}$

$\abs*[\Bigg]{-5}$
\end{document}

答案3

为了将这些信息放在同一个地方并节省其他人的精力,按照上述 egreg 的回答,我让这个X版本正常工作\NewPairedDelimiterX。我在下面保留了他的示例,以便更容易在两者之间来回查看。

宣言:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tells DeclarePairedDelimiter to create functions that are automatically sized.
% Starred version is not automatically sized. Both version allow an overriding input.
% Auto sizing:  \abs{x}
% Override:     \abs[\big]{x}
% Not sized:    \abs*{x}
% Override:     \abs*[\big]{x}
%
% Defines two commands, for example: PAIREDabs, abs
% abs checks for a star or options and then calles the right version of PAIREDabs
\makeatletter
\newcommand{\NewPairedDelimiter}[3]{%
  \expandafter\DeclarePairedDelimiter\csname PAIRED\string#1\endcsname{#2}{#3}%
  \newcommand#1{%
    \@ifstar{\csname PAIRED\string#1\endcsname}
            {\@ifnextchar[{\csname PAIRED\string#1\endcsname}
                          {\csname PAIRED\string#1\endcsname*}%
            }%
  }%
}
\newcommand{\NewPairedDelimiterX}[4]{%
  \expandafter\DeclarePairedDelimiterX\csname PAIREDX\string#1\endcsname[2]{#2}{#3}{#4}%
  \newcommand#1{%
    \@ifstar{\csname PAIREDX\string#1\endcsname}
            {\@ifnextchar[{\csname PAIREDX\string#1\endcsname}
                          {\csname PAIREDX\string#1\endcsname*}%
            }%
  }%
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


定义:

\NewPairedDelimiterX{\innerp}{\langle}{\rangle}{#1,#2}


使用:

$\innerp{ax}{y}$

相关内容