{some-expression}\over{another-expression}
和 有什么区别
\frac{some-expression}{another-expression}
?
哪一个更好?
答案1
该命令\over
是所谓的“原始”命令,可在 Plain TeX 和 LaTeX 中使用。\frac
是一个仅限 LaTeX 的命令,它建立在\over
宏的基础上,以提供一些不太可能引发意外错误的东西,如果用户没有正确处理命令的语法\over
。
假设您已经amsmath
加载了该包,则\frac
命令定义如下:
\DeclareRobustCommand{\frac}[2]{{\begingroup#1\endgroup\@@over#2}}
其中\@@over
是amsmath
的内部版本\over
。请注意, 的第一个参数\frac
(分子)被小心地包裹在\begingroup
...\endgroup
结构中,并且整个命令的“内容”被一对花括号包围。花括号的作用是消除由于不完全谨慎地使用命令\over
本身而可能产生的潜在歧义。
如果你是 LaTeX 用户,没有理由不使用这个\frac
命令——和不直接使用该命令的几个好理由\over
。简而言之,如果您使用 LaTeX,请使用\frac
。
答案2
后者更可取。它纠正了在某些情况下可能以不好的方式表现出来的行为。LaTeX 定义是
\def\frac#1#2{{\begingroup #1\endgroup\over #2}}
在某些情况下,分子的分配也会影响分母。使用标准 LaTeX 命令很难生成它,但你可以比较
\[
\fam0 a\over b
\]
和
\[
\frac{\fam0 a}{b}
\]
在第一种情况下,“a”和“b”都将是直立的,这可能不是所期望的。
另一个反对该\over
语法的相关论点是,它与 LaTeX 格格不入,因为 LaTeX 总是先使用命令,然后使用参数,从不使用“中缀”语法。此外,它会自动提供分组numerator\over denominator
,避免出现以下错误:
1\over 2 \over 3
更新
\frac
从 2019-10-01 版本的 LaTeX 开始,使用的定义\DeclareRobustCommand
作为程序的一部分,以删除尽可能多的脆弱命令:
% latex.ltx, line 4705:
\DeclareRobustCommand\frac[2]{{\begingroup#1\endgroup\over#2}}
过去,由于内存限制,不可能使所有命令都具有鲁棒性。这些考虑不再是问题。
该软件包因其修改后的定义amsmath
已使用多年。\DeclareRobustCommand
\frac
答案3
在amsmath 软件包用户指南p.14 内容如下:
原始广义分数命令
\over
,\overwithdelims
,\atop
,\atopwithdelims
,\above
,\abovewithdelims
如果与 amsmath 包一起使用,则会产生警告消息,原因在技术说明.tex。
并且在关于 amsmath 包的技术说明第 2 页:
TeX 基元的不寻常语法不仅在 LaTeX 中显得格格不入,而且这种语法似乎是造成 TeX 数学排版功能最严重缺陷的原因之一:数学公式中任何给定点的当前数学样式直到公式结束才能确定,因为后面的广义分数命令可能会改变前面材料的数学样式。
(...)
这些广义分数命令的语法还会产生其他不良后果,只有当您编写一些用于数学的非平凡宏时,这些后果才会变得明显。例如,就目前的情况而言,您无法在数学中测量任何对象的大小,除非您
\mathchoice
通过离开并重新进入数学模式\hbox{$
(这会导致\everymath
与 和相关的复杂性\mathsurround
)。而且,似乎对当前数学风格的不确定性是允许使用 mu 单位来\vrule
在构建复合符号或符号时制作垂直支柱的唯一障碍。等等。
答案4
在某些情况下,我发现\over 不需要花括号,而 \frac 需要。
\[ P(n,m) = {n! \over (n-m)!} \] <!-- { } for {n! \over (n-m!)} -->
\[ n! \over (n-m)! \]
\[ P(n,m) = \frac{n!}{(n-m)!} \] <!-- { } for \frac {} {} -->
\[ \frac{n!}{(n-m)!} \]