%20el%20mismo%20tama%C3%B1o%20a%20pesar%20de%20los%20saltos%20de%20l%C3%ADnea%3F.png)
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:
Los dos delimitadores tienen tamaños diferentes. Un truco común para obtener tamaños coincidentes es usar \vphantom
así:
\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:
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,
\vphantom
es posible que el argumento de también deba modificarse para obtener el resultado deseado).
Enfoque alternativo 1: dimensionar manualmente los delimitadores (usando \big
y similares). Lamentablemente, eso tampoco es muy fácil de mantener.
Enfoque alternativo 2: utilizar algún entorno matemático proporcionado por el breqn
paquete, que permite saltos de línea entre dos delimitadores \left
/ \right
y 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 \vphantom
truco? 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 zref
para recordar el tamaño de la fórmula matemática en las etiquetas. El paquete mleftright
se utiliza para reducir el espacio horizontal adicional en \left
y \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 \mzreset
se 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}
Respuesta2
Si bien creo que a) \bigl
las s son preferibles y b) ampliar los delimitadores está a la altura de la separación de palabras manual y \enlargethispage
las 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 nath
paquete 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:
Ver también:
- Comandos automáticos izquierda y derecha
- Macro para \left( y \right)
- Incompatibilidades y alternativas a nath
(*): Con nath
then $$
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