%20%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
這段程式碼
\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
以下範例使用 packagezref
來記住標籤中數學公式的大小。封裝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) \bigl
s 更好,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}
輸出:
也可以看看:
(*): 與nath
then$$
和\[
完全等價。否則$$ ... $$
是不支援的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