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