轻松改变 \DeclarePairedDelimiter 的行为

轻松改变 \DeclarePairedDelimiter 的行为

看到答案后这个问题我意识到我更喜欢 Juan A. Navarro 的回答方式:

  • ie, \DeclarePairedDelimiter{\parens}{\lparen}{\rparen}frommathtools是一个很棒的工具,它能给你
    • \parens{…}不能调整高度,
    • \parens*{…},可自动调整高度,
    • \parens[\bigg]{…},其结果是您指定的大小。
  • \newdelimcommand{\parens}{\lparen}{\rparen}从我链接的答案中得到
    • \parens{…}自动调整高度,
    • \parens*{…},不调整高度,
    • \parens[bigg]{…},其结果是您指定的大小。

我更喜欢第二种工作方式,而不是mathtools。但是,您获得的间距是错误的(就像您使用\left(而不是 一样\biggl()。我尝试使用\usepackage{mleftright} \mleftrightJuan A. Navarro 的代码,但没有成功。所以我的问题是

我怎样才能获得我链接的答案的样式但具有正确的间距(如mathtools)?

可能交换mathtools带星号和不带星号的行为(加上bigg而不是\bigg)更容易,或者重写 Juan A. Navarro 的代码更容易。

编辑: 嗯,我读到了这里, 进而这里。最后一个完全回答了我的问题,只是带星号的版本不起作用。

以下是代码:

\documentclass{scrartcl}
\usepackage{mathtools}
\usepackage{etextools}
\usepackage{ifthen}

\makeatletter
    \newcommand{\DeclarePairedDelimiterCase}[2]{%
        \newcommand#1[1][]{%
            \ifthenelse{\equal{##1}{normal}}%
            {#2}%
            {%
                \ifthenelse{\equal{##1}{big}\OR\equal{##1}{Big}\OR\equal{##1}{bigg}\OR\equal{##1}{Bigg}}%
                {\expandnext{#2[}{\csname##1\endcsname}]}%
                {#2*}%        % standard case using \left and \right
            }%
        }%
    }
    \newcommand{\DeclarePairedDelimiterY}[4][Temp]{%
        \expandafter\DeclarePairedDelimiter\csname#2#1\endcsname{#3}{#4}%
        \expandnext{\expandnext{\DeclarePairedDelimiterCase}{\csname#2\endcsname}}{\csname#2#1\endcsname}%
    }
    \newcommand{\DeclarePairedDelimiterXY}[6][Temp]{%
        \expandafter\DeclarePairedDelimiterX\csname#2#1\endcsname[#3]{#4}{#5}{#6}%
        \expandnext{\expandnext{\DeclarePairedDelimiterCase}{\csname#2\endcsname}}{\csname#2#1\endcsname}%
    }
\makeatother
\DeclarePairedDelimiterY{set}{\lbrace}{\rbrace}
\DeclarePairedDelimiter{\pa}{\lparen}{\rparen}

\begin{document}

\begin{align*}
    \liminf \set*{\sum}
\end{align*}

\end{document}

然后我得到的lim inf{*}∑却不是我想要的lim inf{∑}

编辑2: 我意识到我之前使用过的那个有一些我确实需要的额外选项:

  • \parens{…}并且\parens[auto]{…}应该是自动调整大小。
  • \parens*{…}并且\parens[base]{…}应该是基本的(没有缩放)。
  • 其余部分如我之前所述\parens[bigg]{…},以便手动缩放。

答案1

我仍然认为应该\left使用\right真的需要,任何形式的自动化都是不好的。

不过,这里有一个简单的在职的你的宏的实现,我称之为\xDeclarePairedDelimiter

\documentclass{scrartcl}
\usepackage{mleftright,xparse}

\NewDocumentCommand\xDeclarePairedDelimiter{mmm}
 {%
  \NewDocumentCommand#1{som}{%
   \IfNoValueTF{##2}
    {\IfBooleanTF{##1}{#2##3#3}{\mleft#2##3\mright#3}}
    {\mathopen{##2#2}##3\mathclose{##2#3}}%
  }%
 }
\xDeclarePairedDelimiter{\set}{\lbrace}{\rbrace}

\begin{document}

\begin{align*}
&\liminf \set{\sum}\\
&\liminf \set*{\sum}\\
&\liminf \set[\big]{\sum}\\
&\liminf \set[\Big]{\sum}
\end{align*}

\end{document}

在此处输入图片描述

答案2

让我容易地改变行为,而无需定义新的命令,例如\xDeclarePairedDelimiter

\documentclass[12pt]{article}

\usepackage{mathtools}
\usepackage{etoolbox}


\DeclarePairedDelimiter{\avg}{\langle}{\rangle}

\newcommand\swapifbranches[3]{#1{#3}{#2}}
\makeatletter
\MHInternalSyntaxOn
\patchcmd{\DeclarePairedDelimiter}{\@ifstar}{\swapifbranches\@ifstar}{}{}
\MHInternalSyntaxOff
\makeatother

\DeclarePairedDelimiter{\mean}{\langle}{\rangle}


\begin{document}

$\avg{\displaystyle\sum_0^1}$  $\avg*{\displaystyle\sum_0^1}$

$\mean{\displaystyle\sum_0^1}$ $\mean*{\displaystyle\sum_0^1}$

\end{document}

结果

相关内容