![eqnarray 真的过时了吗?](https://linux22.com/image/325451/eqnarray%20%E7%9C%9F%E7%9A%84%E8%BF%87%E6%97%B6%E4%BA%86%E5%90%97%EF%BC%9F.png)
我刚刚学到eqnarray 与 align一般情况下应该避免这种情况eqnarray
。好的,所以我开始查看我的文档以摆脱它并(按照建议)改用包中的某些环境amsmath
。但是,我遇到了两种情况,这种更改产生的输出(IMHO)比使用更差eqnarray
。这可能是由于我缺乏如何正确执行此操作的知识,但首先我将展示两种情况:
第一个是用于证明界限的(不)等式序列(在运行时复杂性分析中很常见)。此处的这个用于表明 2^n 的增长速度不会快于 n!。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{eqnarray*}
2^n & = & \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{ times}}\\
& \stackrel{n > 3}{=} & 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = & 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& < & 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = & 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& \stackrel{n > 3}{\leq} & 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots \cdot n\\
& = & n!
\end{eqnarray*}
\end{document}
它产生以下输出:
这些是我尝试使用amsmath
包中的某些环境:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
2^n & = \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{ times}}\\
& \stackrel{n > 3}{=} 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& < 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& \stackrel{n > 3}{\leq} 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots \cdot n\\
& = n!
\end{align*}
\[
\begin{aligned}
2^n & = && \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{ times}}\\
& \stackrel{n > 3}{=} && 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = && 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& < && 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = && 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& \stackrel{n > 3}{\leq} && 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots \cdot n\\
& = && n!
\end{aligned}
\]
\begin{alignat*}{2}
2^n & = && \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{ times}}\\
& \stackrel{n > 3}{=} && 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = && 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& < && 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = && 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& \stackrel{n > 3}{\leq} && 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots \cdot n\\
& = && n!
\end{alignat*}
\end{document}
相应的输出存在以下缺陷:
align
:
关系符号和它们连接的术语之间的空间减小使得识别此证明中的步骤变得更加困难。虽然人们可以争论在这里更多的空间是否是一件好事(我在一份提倡避免使用“总体一致性”的文件中读到eqnarray
,我并不完全同意这一点——我认为可读性比一致性更重要,而一致性在大多数情况下支持可读性,但可能并非总是如此),我认为建立的关系没有以\stackrel
居中的方式对齐在其他关系符号下方绝对不是最好的事情。后一点也是所有其他尝试使用该amsmath
包的环境的缺陷(这是可以预料到的,因为这些环境只提供左对齐或右对齐的列,而不是居中——至少我没有找到提供居中列的类似环境)。
aligned
:
虽然关系符号右侧的空间较大,但左侧的空间却较小。
alignat
:
这甚至比现在更糟糕,aligned
因为现在不仅关系符号左右之间的间距不同,而且我们构建的关系符号\stackrel
和下一个术语之间几乎没有空格。
第二种情况是将替换定义为方括号中以逗号分隔的替换列表(这种符号在术语重写或逻辑编程中非常常见)。如果这些定义太长,以至于我们需要将其拆分,则包的环境无法正确amsmath
对齐第二行,同时保持符号左右两侧的相同空间量=
:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{eqnarray*}
\sigma & = & [x_1/t_1,x_2/t_2,\\
& & x_3/t_3,x_4/t_4]
\end{eqnarray*}
\begin{align*}
\sigma & = [x_1/t_1,x_2/t_2,\\
& x_3/t_3,x_4/t_4]
\end{align*}
\begin{align*}
\begin{split}
\sigma & = [x_1/t_1,x_2/t_2,\\
& x_3/t_3,x_4/t_4]
\end{split}
\end{align*}
\[
\begin{aligned}
\sigma & = && [x_1/t_1,x_2/t_2,\\
& && x_3/t_3,x_4/t_4]
\end{aligned}
\]
\begin{alignat*}{2}
\sigma & = && [x_1/t_1,x_2/t_2,\\
& && x_3/t_3,x_4/t_4]
\end{alignat*}
\end{document}
eqnarray
:
align
:
这里,使用和不使用 的两个版本split
输出相同。周围的间距=
一致,但第二行的对齐方式错误。
aligned
:
这里,对齐没问题,但是间距不一致。
alignat
:
再次,对齐没问题,但间距不一致。
所以我的问题是:如何处理这两种情况,而不使用eqnarray
产生至少与使用它的版本一样可读的输出,并且使用相似(或更少)的代码量?
当然,人们可以array
相应地使用和定制它,但这样做有什么意义呢?而不是使用现有的eqnarray
?此外,在对齐不等号处的拆分方程(与我的第二种情况类似)唯一的答案建议\phantom
结合使用来align
修复对齐。虽然这当然是可能的,但肯定比eqnarray
在上述情况下使用更繁琐。
答案1
无论如何,的输出eqnarray
都是错误的,而且对此几乎无能为力。还请考虑,如果涉及hyperref
或 ,则它不适用于交叉引用。cleveref
不,没有理由使用它。
第一个例子可以使用以下方法处理array
:
\documentclass{article}
\usepackage{amsmath,array}
\begin{document}
\begin{equation*}
\renewcommand{\arraystretch}{1.5}
\begin{array}{@{} r @{} >{{}} c <{{}} @{} l @{} }
2^n
& = & \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{ times}}\\
& \overset{n>3}{=} & 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = & 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& < & 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& = & 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4 \text{ times}}\\
& \overset{n>3}{\leq} & 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots \cdot n\\
& = & n!
\end{array}
\end{equation*}
A better proof, by induction, is
\begin{alignat*}{2}
2^4 &= 16 < 4! = 24 \\
2^{n+1} &= 2\cdot 2^n &\quad&\text{for $n>3$} \\
&< 2\cdot n! &\quad&\text{induction hypothesis}\\
&< (n+1)\cdot n! \\
&= (n+1)!
\end{alignat*}
\end{document}
第二个例子更简单:使用一个好的对齐点:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\sigma =[ &x_1/t_1,x_2/t_2,\\
& x_3/t_3,x_4/t_4]
\end{align*}
\end{document}
可以容纳更多线路:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\sigma = [ &x_1/t_1,x_2/t_2, \\
& x_3/t_3,x_4/t_4] \\
\tau = [ &y_1/t_1] \\
\psi = [ &x_1/t_1,x_2/t_2,\\
& x_3/t_3,x_4/t_4]
\end{align*}
\end{document}
答案2
使用\mathclap
:
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begingroup
\advance\thickmuskip by 5mu % 5mu = 5/18 em
\begin{align*}
2^n &= \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n \text{
times}}\\
& \stackrel{\mathclap{n > 3}}{=} 2 \cdot 2 \cdot 2 \cdot 2 \cdot \underbrace{2
\cdot 2 \cdot
\ldots \cdot 2}_{n - 4 \text{ times}}\\
& = 16 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4
\text{ times}}\\
& < 24 \cdot \underbrace{2 \cdot 2 \cdot \ldots \cdot 2}_{n - 4
\text{ times}}\\
& = 1 \cdot 2 \cdot 3 \cdot 4 \cdot \underbrace{2 \cdot 2 \cdot
\ldots \cdot 2}_{n - 4 \text{ times}}\\
& \stackrel{\mathclap{n > 3}}{\leq} 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 \cdot \ldots
\cdot n\\
& = n!
\end{align*}
\endgroup
\end{document}