使用 reDeclarePairedDelimiterInnerWrapper 時缺少中間分隔符

使用 reDeclarePairedDelimiterInnerWrapper 時缺少中間分隔符

我使用\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}

相關內容