我怎样才能强制 \left、\right 分隔符自动(!)具有相同的大小,尽管有换行符?

我怎样才能强制 \left、\right 分隔符自动(!)具有相同的大小,尽管有换行符?

此代码

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

产生以下输出:

在此处输入图片描述

这两个分隔符的大小不同。获取匹配大小的常用技巧是使用\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:使用包提供的一些数学环境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) \bigls 是更好的选择,并且 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}

输出:

输出

也可以看看:

(*):与naththen$$\[完全等价。否则,$$ ... $$是不支持的 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

一条跨越两条线的公式,在栅栏内分开

相关内容