¿Cómo puedo forzar que los delimitadores \left, \right tengan automáticamente (!) el mismo tamaño a pesar de los saltos de línea?

¿Cómo puedo forzar que los delimitadores \left, \right tengan automáticamente (!) el mismo tamaño a pesar de los saltos de línea?

este codigo

\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}

produce el siguiente resultado:

ingrese la descripción de la imagen aquí

Los dos delimitadores tienen tamaños diferentes. Un truco común para obtener tamaños coincidentes es usar \vphantomasí:

\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}

que produce el siguiente resultado:

ingrese la descripción de la imagen aquí

Sin embargo, tal enfoque

  • se vuelve rápidamentecomplejoa medida que aumenta el número de saltos de línea;
  • esno mantenibleen absoluto (porque, si el contenido de una línea cambia, \vphantomes posible que el argumento de también deba modificarse para obtener el resultado deseado).

Enfoque alternativo 1: dimensionar manualmente los delimitadores (usando \bigy similares). Lamentablemente, eso tampoco es muy fácil de mantener.

Enfoque alternativo 2: utilizar algún entorno matemático proporcionado por el breqnpaquete, que permite saltos de línea entre dos delimitadores \left/ \righty se encarga del tamaño del delimitador. Sin embargo, me gustaría mantenerme alejado breqn, si es posible.


¿Se te ocurre una manera de hacer que los delimitadores \left/ asociados right\tengan automáticamente el mismo tamaño a pesar de los saltos de línea, sin usar (explícitamente) el \vphantomtruco? Idealmente, la solución debería funcionar para múltiples pares de delimitadores anidados. Por ejemplo, a continuación, los delimitadores internos deben tener el mismo tamaño y los delimitadores externos deben tener el mismo tamaño:

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

Respuesta1

El siguiente ejemplo utiliza paquete zrefpara recordar el tamaño de la fórmula matemática en las etiquetas. El paquete mleftrightse utiliza para reducir el espacio horizontal adicional en \lefty \right.

Dentro de un bloque matemático complejo, se pueden utilizar las siguientes macros:

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

Las macros se pueden anidar. <label>Es necesario identificar los pares de delimitadores. Dentro del bloque matemático (entorno matemático,...) los <label>nombres de los pares deben ser únicos. Después \mzresetse puede llamar al bloque matemático . Libera los <label>nombres y se pueden reutilizar.

Archivo de ejemplo:

\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}

Resultado

Respuesta2

Si bien creo que a) \bigllas s son preferibles y b) ampliar los delimitadores está a la altura de la separación de palabras manual y \enlargethispagelas s ocasionales al final de la revisión, es posible que algo como esto los haga un poco más fáciles de mantener:

\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*}

Al menos, ahorra la repetición manual del argumento de tamaño. Estoy seguro de que si uno estuviera lo suficientemente inclinado, también podría ampliarse para manejar un número variable de líneas.

Respuesta3

Vale la pena mencionarlo: el nathpaquete admite esto, aunque lamentablemente es incompatible con muchos otros paquetes.

Tomado directamente de la documentación, con algunas modificaciones (*):

%! 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}

La salida:

producción

Ver también:

(*): Con naththen $$y \[son exactamente equivalentes. De lo contrario, $$ ... $$la sintaxis de LaTeX no es compatible; consulte¿Por qué es preferible \[ ... \] a $$ ... $$?.

Respuesta4

Dado que esta pregunta acaba de ser eliminada y hay una respuesta aceptada, creo que está bien agregar también una respuesta que use ConTeXt, ya que eso podría interesar a algunos usuarios.

En ConTeXt, las fórmulas se dividen de forma predeterminada en líneas y puede haber rupturas en las vallas. Los saltos de línea manuales se realizan con \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

una fórmula que se ejecuta en dos líneas, divididas dentro de la valla

información relacionada