
我使用\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), 代替(一|二)。 (即該\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...
not \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}