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}生産を使用しています(アブ)、 の代わりに(a | b). (つまり、\given記号は完全に省略されます)。ただし、\paren[\big]{a \given b}またはを使用する\paren*{a \given b}と問題なく動作します。

何か案は?

前もって感謝します。

答え1

@egreg が述べているように、これは周囲のフェンスに対して\MHemptyに再定義されているためです。これは通常、 which がグループとして動作し、 this がローカライズされることによって行われます。ラッパーの定義により、とグループ化はなくなり、スケーラーがない場合に が を指すようになり、 が中間部分を処理するようになります。\@gobble\mathopen/close{...}\@gobble\mathopen/close\delimsize\MHempty\@gobble

グループ化せずにこれを機能させる最も簡単な方法は、外側のフェンスで使用した後に元\MHemptyに戻すことです。{}

以下のコードは動作するようです。

次のリリースでは、自動スケール、非スケール、スケールの 3 つのラッパーが用意されますが、非スケールでは\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}

関連情報