交换带星号和不带星号的命令的定义

交换带星号和不带星号的命令的定义

我不喜欢\abs*当我想让绝对值的垂直线自动调整大小时必须使用。我几乎总是想让它调整大小,所以想交换这两个命令的定义,但不确定该怎么做。我下面的尝试被注释掉了,因为它无法编译。

我想不出在什么情况下我会想要使用不调整大小的版本,但万一将来出现某些极端情况,我不想失去它。或者,是否有一个好的理由不进行这种交换,而是将所有出现的 更改\abs\abs*

\documentclass{article}

\usepackage{amsmath}
\usepackage{mathtools}

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

%\let\oldabs{\abs}%
%\let\oldabs*{\abs*}%
%\let\abs{oldabs*}%
%\let\abs*{\oldabs}%

\begin{document}
Not sure why this is the default behavior, but it is:
\[\abs{\frac{1}{2}}\]

Would prefer to get this behavior using \textbackslash{abs},
instead of having to use \textbackslash{abs*}.
\[\abs*{\frac{1}{2}}\]
\end{document}

答案1

您可以重新定义\abs来调用原始命令的相反版本:

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

(您注释的尝试不起作用的原因是,从技术上讲,*不是宏名称的一部分,而是由宏本身使用或类似命令读取的\@ifstar\@ifnextchar

答案2

如果您不想使用星级版本,只需定义\abs即可。\def

\def\abs#1{\left\lvert#1\right\rvert}

答案3

我遇到了同样的问题,并为此写了一个解决方法:一个宏\DeclarePairedDelimiterY,请参阅这个问题。但请注意,你必须更换行

{\csname#1Temp*\endcsname{##2}}%

{\csname#1Temp\endcsname*{##2}}%

然后你可以\abs定义

\DeclarePairedDelimiterY{abs}{\lvert}{\rvert}

其中 的反斜杠\abs被省略。然后:

  • \abs{x}扩展为\left\lvert x\right\rvert
  • \abs[normal]{x}扩展为\lvert x\rvert
  • \abs[big]{x}扩展为\bigl\lvert x\bigr\rvert
  • \abs[Big]{x}扩展为\Bigl\lvert x\Bigr\rvert
  • \abs[bigg]{x}扩展为\biggl\lvert x\biggr\rvert
  • \abs[Bigg]{x}扩展为\Biggl\lvert x\Biggr\rvert

与原始命令相比,您省略了,等的\DeclarePairedDelimiter反斜杠。\big\Big

(不幸的是,在我发布自己的问题之前我没有找到你的问题......)

答案4

您可以修补内部定义

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

结果

相关内容