我正在使用\DeclarePairedDelimiter
(from mathtools
) 定义一个\paren
宏,如下所示:
\providecommand{\given}{\:\vert\:}
\DeclarePairedDelimiterX\paren[1]{(}{)}{%
\renewcommand{\given}{\:\delimsize\vert\:}#1%
}
这按预期工作。但是,按照以下答案这个问题,我用来\reDeclarePairedDelimiterInnerWrapper
固定后面的下标/上标的位置:
\reDeclarePairedDelimiterInnerWrapper{\paren}{nostar}{#1#2#3}
现在使用\paren{a \given b}
产品(ab), 代替(a | b). (即\given
完全省略符号)。但是使用\paren[\big]{a \given b}
或 也\paren*{a \given b}
可以正常工作。
有任何想法吗?
提前致谢。
答案1
正如 @egreg 提到的,这是由于\MHempty
被重新定义\@gobble
为周围的围栏。这通常是通过\mathopen/close{...}
充当组来完成的,并且这\@gobble
是本地化的。随着包装器的定义,\mathopen/close
和分组消失了,并且当没有缩放器时\delimsize
指向的是现在吃掉中间部分的那个。\MHempty
\@gobble
使其不进行分组工作最简单的方法是在外部围栏中使用后将其设置\MHempty
回。{}
下面的代码似乎有效。
请注意,在下一个版本中将有三个包装器,自动缩放、非缩放和缩放,其中非缩放将不会使用,\mathopen/close...
当\mathopen/close{...}
不使用缩放器时会产生副作用。
\documentclass[a4paper]{memoir}
\usepackage{mathtools}
\MHInternalSyntaxOn
\makeatletter
\def\MHempty{}
\def\DeclarePairedDelimiterX#1[#2]#3#4#5{%
\@ifdefinable{#1}{
\MT_paired_delimx_arg_test:n{#2}
\MT_delim_default_inner_wrappers:n{#1}
\@xp\@xp\@xp
\newcommand
\@xp\csname MT_delim_\MH_cs_to_str:N #1 _star:\endcsname
[#2]
{
\begingroup
\def\delimsize{\middle}
%\mathopen{}\mathclose\bgroup\left#3 #5 \aftergroup\egroup\right#4
\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn}
{\left#3}{#5}{\right#4}
\endgroup
}
\@xp\@xp\@xp
\newcommand
\@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname
[1][\MHempty]
{
\begingroup
\def\delimsize{##1}
\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_inner:}
}
\@xp\@xp\@xp
\newcommand
\@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar_inner:\endcsname
[#2]
{
%\mathopen{%
% \let\MHempty\@gobble
% \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #3}
%#5
%\mathclose{%
% \let\MHempty\@gobble
% \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #4}
\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn}
{
\let\MHempty\@gobble
\@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #3
\def\MHempty{}
}
{#5}
{
\let\MHempty\@gobble
\@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #4
\def\MHempty{}
}
\endgroup
}
\DeclareRobustCommand{#1}{
\@ifstar
{\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}}
{\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}}
}
}
}
\makeatother
\MHInternalSyntaxOff
\providecommand{\given}{\:\vert\:}
\DeclarePairedDelimiterX\paren[1]{(}{)}{%
\renewcommand{\given}{\:\delimsize\vert\:}
#1%
}
\reDeclarePairedDelimiterInnerWrapper{\paren}{nostar}{#1#2#3}
\begin{document}
\[
\paren{ a \given b }
\]
\end{document}