How can I force \left, \right delimiters to automatically (!) have the same size despite line breaks?
The following example uses package zref
to remember the size of the math formula in labels. Package mleftright
is used to reduce the additional horizontal spacing by \left
and \right
.
Inside a complex math block, the following macros can be used:
\mzleft{<label>}{<left delimiter>}{<math formula>}
\mzright{<label>}{<math formula>}{<right delimiter>}
The macros can be nested, The <label>
is needed to identify the pairs of delimiters. Inside the math block (math environment, ...) the <label>
names for the pairs must be unique. After the math block \mzreset
can be called. It frees the <label>
names and they can be reused.
Example file:
\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}
While I think that a) \bigl
s are preferable, and b) biglifying your delimiters is right up there with manual hyphenation and occasional \enlargethispage
s at the very end of proofreading, you may find that something like this makes them slightly more maintainable:
\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*}
At least, it saves the manual repetiton of the sizing argument. I'm sure if one were sufficiently inclined, it could be extended to handle a variable number of lines, too.