我不喜欢\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}