改行にかかわらず、\left、\right 区切り文字を自動的に (!) 同じサイズにするにはどうすればよいでしょうか?

改行にかかわらず、\left、\right 区切り文字を自動的に (!) 同じサイズにするにはどうすればよいでしょうか?

このコード

\documentclass{article}

\usepackage{amsmath}

\begin{document}
\begin{align*}
\begin{split}
    z = \left( a + b + c \right. \\ 
        \left. + \frac{d}{e} \right)
\end{split} 
\end{align*}
\end{document}

次の出力が生成されます。

ここに画像の説明を入力してください

2 つの区切り文字のサイズは異なります。サイズを一致させるための一般的な方法は、\vphantom次のようにすることです。

\documentclass{article}

\usepackage{amsmath}

\begin{document}
\begin{align*}
\begin{split}
    z = \left( a + b + c +\vphantom{\frac{d}{e}}\right. \\  
        \left. + \frac{d}{e} \right)
\end{split} 
\end{align*}
\end{document}

次のような出力が生成されます。

ここに画像の説明を入力してください

しかし、そのようなアプローチは

  • 急速に複雑な改行の回数が増えるにつれて;
  • 維持できないまったく変更しないでください (行の内容が変更された場合、目的の出力を取得するには の引数\vphantomも変更する必要がある場合があります)。

代替アプローチ 1: 区切り文字のサイズを手動で設定する (\bigなどを使用)。残念ながら、これもあまり保守性が高くありません。

代替アプローチ 2: パッケージによって提供される数学環境を使用します。これにより、2 つの/区切り文字breqn間の改行が許可され、区切り文字のサイズが調整されます。ただし、可能であれば は使用しないようにしたいと思います。\left\rightbreqn


\leftトリックを(明示的に)使用せずに、関連する/right\区切り文字を改行に関係なく自動的に同じサイズにする方法を思いつきますか\vphantom? 理想的には、このソリューションは複数のネストされた区切り文字のペアに対して機能するはずです。 たとえば、次の例では、内側の区切り文字は同じサイズで、外側の区切り文字も同じサイズである必要があります。

\left( \left( ... \right. \right. \\
\left. \left. ... \right) \right)

答え1

次の例では、パッケージを使用してzref、ラベル内の数式のサイズを記憶します。パッケージは、mleftright追加の水平方向の間隔を および で減らすために使用され\leftます\right

複雑な数式ブロック内では、次のマクロを使用できます。

\mzleft{<label>}{<left delimiter>}{<math formula>}
\mzright{<label>}{<math formula>}{<right delimiter>}

マクロはネストできます。<label>区切り文字のペアを識別するには が必要です。数学ブロック (数学環境など) 内では、<label>ペアの名前は一意である必要があります。数学ブロックが\mzreset呼び出された後、名前が解放され<label>、再利用できるようになります。

サンプルファイル:

\documentclass{article}

\usepackage{amsmath}
\usepackage{mleftright}
\usepackage{zref-base}

\makeatletter
\zref@newprop{mzheight}[0pt]{\the\ht\z@}
\zref@newprop{mzdepth}[0pt]{\the\dp\z@}
\newcount\c@@mz
\newcommand*{\the@mz}{mz\the\c@@mz}
\newcommand*{\@mz@list}{}    
\let\@mz@do\relax
\newcommand*{\mzreset}{%
  \begingroup
    \def\@mz@do##1{%
      \global\expandafter\let\csname mz@##1\endcsname\relax
    }%
    \@mz@list
    \global\let\@mz@list\@empty
  \endgroup
}
\newcommand*{\mzleft}[3]{%
  \@ifundefined{mz@#1}{%
    \global\advance\c@@mz\@ne
    \expandafter\xdef\csname mz@#1\endcsname{\the@mz}%
    \xdef\@mz@list{\@mz@list\@mz@do{#1}}%
  }{}%
  \expandafter\let\expandafter\@mz\csname mz@#1\endcsname
  \mleft#2%
  \expandafter\mathpalette\expandafter{%
    \expandafter\@mzleft\expandafter{\@mz}%
  }{#3}%
  \mright.\kern-\nulldelimiterspace
}
\newcommand*{\mzright}[3]{%
  \kern-\nulldelimiterspace
  \@ifundefined{mz@#1}{%   
    \@latex@warning{Missing \string\mzleft{#1}}%
    \mleft.#2\mright#3%
  }{%
    \expandafter\let\expandafter\@mz\csname mz@#1\endcsname
    \mleft.%
    \expandafter\mathpalette\expandafter{%
      \expandafter\@mzright\expandafter{\@mz}%
    }{#2}%
    \mright#3%
  }%
}   
\newcommand*{\@mzleft}{%
  \@mzleftright lr%
}
\newcommand*{\@mzright}{%
  \@mzleftright rl%
}
\newcommand*{\@mzleftright}[5]{%
  \sbox0{$\m@th#4{}#5{}$}%
  \ifmeasuring@
  \else
    \begingroup
      \let\@auxout\@mainaux
      \zref@labelbyprops{#3#1}{mzheight,mzdepth}%
    \endgroup
  \fi
  \zifrefundefined{\@mz #2}{%
  }{%
    \dimen@=\zref@extract{#3#2}{mzheight}\relax
    \ifdim\dimen@>\ht0 %
      \ht0=\dimen@
    \fi
    \dimen@=\zref@extract{#3#2}{mzdepth}\relax
    \ifdim\dimen@>\dp0 %
      \dp0=\dimen@
    \fi
  }%   
  \copy0\relax
}
\makeatother

\begin{document}
\begin{align*}
\begin{split}
    z = \mzleft{a}({ a + b + c +} \\
        \mzright{a}{{}+ \frac{d}{e}})
\end{split} 
\end{align*}   

\mzreset

\begin{align*}
\begin{split}
    z = \mzleft{a}{[}{%
          a + b + \frac{c}{d} +
          \mzleft{b}{(}{
            \int_0^\infty \mathrm{d}x
          }   
        } \\  
        \mzright{b}{
          + y}{)
        }
        \mzright{a}{
          + \frac{\displaystyle\sum_{i=0}^{100}i}{e}
        }{]}
\end{split}   
\end{align*}  
\end{document}

結果

答え2

私は、a) \bigls の方が好ましいと考えており、b) 区切り文字を大きくすることは、\enlargethispage校正の最後に手動でハイフンを付けたり、時々 s を入れたりするのと同じくらい重要だと思いますが、次のような方法の方が少しは保守しやすくなるかもしれません。

\newcommand\SPLIT[2]{%
  \left( #1\vphantom{#2}\right. \\
  \left. \vphantom{#1}#2\right) \\
}

\begin{align*}
  \begin{split}
    z= \SPLIT{a + b + c +}{d +\frac{d}{e}}
  \end{split}
\end{align*}

少なくとも、サイズ指定の引数を手動で繰り返す手間が省けます。十分な意欲があれば、可変数の行も処理できるように拡張できると思います。

答え3

言及する価値があるかもしれません:nathパッケージはこれをサポートしていますが、残念ながら他の多くのパッケージとは互換性がありません。

ドキュメントからそのまま引用し、一部変更を加えました(*)。

%! TEX program = lualatex
\documentclass{article}
\usepackage{nath}
\begin{document}
\[
\sin 2nx = 2n \cos x [\sin x \\
\qquad + \sum_{k = 1}^n (-4)^k
\frac{(n^2 - 1^2)(n^2 - 2^2) \dots (n^2 - k^2)}{(2k - 1)!}
\sin^{2k - 1} x]
\]
\end{document}

出力:

出力

参照:

(*):nath$$\[完全に等価です。それ以外の場合は$$ ... $$サポートされていないLaTeX構文です。\[ ... \] が $$ ... $$ よりも好ましいのはなぜですか?

答え4

この質問はちょうど押し上げられ、受け入れられた回答があるので、一部のユーザーの興味を引くかもしれないので、ConTeXt を使用する回答も追加してもよいと思います。

ConTeXt では、数式はデフォルトで行に分割され、フェンス内で改行されることがあります。手動の改行は で行います\breakhere

\starttext
\samplefile{tufte}

\startformula[align=slanted,margin=2em]
    \int_0^1 \frac{x^9}{(x^2+1)^{16}} \dd x 
    = \int_0^1 \left[
         \frac{x} {(x^2+1)^{12}}
        -\frac{4x}{(x^2+1)^{13}}
        +\frac{6x}{(x^2+1)^{14}}
        \breakhere
        -\frac{4x}{(x^2+1)^{15}}
        +\frac{x} {(x^2+1)^{16}}
        \right] \dd x
\stopformula

\samplefile{douglas}
\stoptext

フェンスの内側で分割された2行にわたる式

関連情報