%20%E5%90%8C%E3%81%98%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
このコード
\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
\right
breqn
\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) \bigl
s の方が好ましいと考えており、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