Wie kann ich erzwingen, dass die Trennzeichen \left, \right trotz Zeilenumbrüchen automatisch (!) die gleiche Größe haben?

Wie kann ich erzwingen, dass die Trennzeichen \left, \right trotz Zeilenumbrüchen automatisch (!) die gleiche Größe haben?

This code

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

erzeugt die folgende Ausgabe:

Bildbeschreibung hier eingeben

Die beiden Trennzeichen haben unterschiedliche Größen. Ein gängiger Trick, um passende Größen zu erhalten, ist die Verwendung \vphantomwie folgt:

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

Das Ergebnis ist folgende:

Bildbeschreibung hier eingeben

Ein solcher Ansatz

  • wird schnellKomplexwenn die Anzahl der Zeilenumbrüche zunimmt;
  • Istnicht wartbarüberhaupt (denn wenn sich der Inhalt einer Zeile ändert, \vphantommuss möglicherweise auch das Argument geändert werden, um die gewünschte Ausgabe zu erhalten).

Alternativer Ansatz 1: Bestimmen Sie die Trennzeichen manuell (mithilfe von \bigund dergleichen). Leider ist auch das nicht sehr wartungsfreundlich.

Alternativer Ansatz 2: Verwenden einer vom breqnPaket bereitgestellten mathematischen Umgebung, die Zeilenumbrüche zwischen zwei \left/ \right-Trennzeichen zulässt und sich um die Größe der Trennzeichen kümmert. Ich möchte jedoch breqnnach Möglichkeit vermeiden, dass .


Fällt Ihnen eine Möglichkeit ein, verbundene \left/ right\-Trennzeichen trotz Zeilenumbrüchen automatisch gleich groß zu machen, ohne (explizit) den \vphantomTrick anzuwenden? Idealerweise sollte die Lösung für mehrere verschachtelte Trennzeichenpaare funktionieren. Im Folgenden sollten beispielsweise die inneren Trennzeichen und die äußeren Trennzeichen gleich groß sein:

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

Antwort1

Das folgende Beispiel verwendet das Paket, zrefum die Größe der mathematischen Formel in Beschriftungen zu speichern. Das Paket mleftrightwird verwendet, um den zusätzlichen horizontalen Abstand um \leftund zu reduzieren \right.

Innerhalb eines komplexen Mathematikblocks können die folgenden Makros verwendet werden:

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

Die Makros können verschachtelt werden. Das <label>wird benötigt, um die Trennzeichenpaare zu identifizieren. Innerhalb des Mathematikblocks (Mathematikumgebung, ...) müssen die Namen für die Paare eindeutig sein. Danach kann <label>der Mathematikblock aufgerufen werden. Er gibt die Namen frei und sie können wiederverwendet werden.\mzreset<label>

Beispieldatei:

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

Ergebnis

Antwort2

Obwohl ich denke, dass a) \bigls vorzuziehen sind und b) die Vergrößerung Ihrer Trennzeichen genauso wichtig ist wie die manuelle Silbentrennung und gelegentliche \enlargethispages ganz am Ende des Korrekturlesens, werden Sie vielleicht feststellen, dass dies die Wartung etwas erleichtert:

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

Zumindest erspart es die manuelle Wiederholung des Größenarguments. Ich bin sicher, wenn man genügend Lust hätte, könnte es auch erweitert werden, um eine variable Anzahl von Zeilen zu verarbeiten.

Antwort3

Vielleicht erwähnenswert: Das nathPaket unterstützt dies, obwohl es leider mit vielen anderen Paketen inkompatibel ist.

Direkt aus der Dokumentation übernommen, mit einigen Änderungen (*):

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

Die Ausgabe:

Ausgabe

Siehe auch:

(*): Mit nathsind $$und \[genau gleichwertig. Andernfalls $$ ... $$wird die LaTeX-Syntax nicht unterstützt, sieheWarum ist \[ ... \] $$ ... $$ vorzuziehen?.

Antwort4

Da diese Frage gerade hochgestuft wurde und es eine akzeptierte Antwort darauf gibt, halte ich es für in Ordnung, auch eine Antwort hinzuzufügen, die ConTeXt verwendet, da das für einige Benutzer von Interesse sein könnte.

In ConTeXt werden Formeln standardmäßig auf mehrere Zeilen aufgeteilt, und es können Unterbrechungen in Zäunen auftreten. Manuelle Zeilenumbrüche werden mit vorgenommen \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

eine Formel, die über zwei Zeilen verläuft, innerhalb des Zauns geteilt

verwandte Informationen