有时写出括号和省略括号会产生相同的结果:
\tilde{\psi} \mathrm{e}^{\mathrm{i} \pi}
对比
\tilde \psi \mathrm e^{\mathrm i \pi}
或者(取自下面 Werner 的评论)
\frac{1}{2} vs \frac12
如果是这样,那么省略它们对我的代码质量有多大影响?当然,如果编译一对公式,则没有区别。但是,由于我忽略了 TeX 的工作原理,我的观点是:如果一个人用这些习惯编写长代码,
- 由于我没有按照 TeX 的预期进行书写,它是否会变得异常?
- 例如,它对长文档的编译速度有影响吗?有什么理由保留它们吗?
答案1
(免责声明:问题清楚地说了“即使结果相同”,我的回答是,当结果相同时,结果就相同。然而,有很多例子表明,结果不一样,参见 Frank Mittelbach 的回答!)
我认为只有一个有效答案:从 TeX 的角度来看,如果没有差异,就没有差异(多么好的同义反复)。因此从 TeX 的角度来看,它并不“糟糕”。
正如评论中人们所说,第二点是关于代码对人类的可读性,这实际上取决于我们谈论的是哪种人。有些人对使用括号非常严格,而有些人像我一样习惯于省略括号,习惯于阅读诸如 、等\bar\theta
代码。\frac12
\frac1n
模仿大卫·卡莱尔的回答做什么\z@
?并呼应 egreg 的评论,以下是 MWE
\documentclass{article}
\def\a{\setbox0=\hbox{$\frac12\ \bar\theta$}\relax}% No braces
%\def\a{\setbox0=\hbox{$\frac{1}{2}\ \bar{\theta}$}\relax}% Braces
\def\b{\a\a\a\a\a\a\a\a\a\a}% 10
\def\c{\b\b\b\b\b\b\b\b\b\b}% 100
\def\d{\c\c\c\c\c\c\c\c\c\c}% 1,000
\def\e{\d\d\d\d\d\d\d\d\d\d}% 10,000
\def\f{\e\e\e\e\e\e\e\e\e\e}% 100,000
\def\g{\f\f\f\f\f\f\f\f\f\f}% 1,000,000
\def\h{\g\g\g\g\g\g\g\g\g\g}% 10,000,000
\begin{document}
abc \h
\end{document}
编译没有1 分 11 秒内完成和1 分 13 秒内完成括号。时间上存在微小差异(可能可以忽略不计)。这是在一台配备 AMD Turion 0.55GHz 的 Linux 机器上进行的。
更新:另一项测试,在较新的机器(Intel i5, 3.10GHz, linux)上使用 100M 个\frac12
vs实例,结果显示典型时间分别为 3m42s 与 3m52s,这是一个可以忽略不计的差异。\frac{1}{2}
100ns
\frac
答案2
LaTeX 书中{}
在所有情况下都一致使用全部示例使用了这种形式,a^{2}
尽管每个人都知道它a^2
同样有效,并且可以说改善了源的外观,但你总是会看到。
当接受参数的命令是宏并且参数必然是单个标记时,大多数人理所当然地会删除括号,因此
\newcommand\foo{abc}
\setlength\textwidth{10cm}
而不是
\newcommand{\foo}{abc}
\setlength{\textwidth}{10cm}
这现在实际上也是标准的 LaTeX 语法。
然而,单个无括号标记和括号组之间的等价性最一致的实现是宏。对于 TeX 基元,有时它们是等效的,有时不是。因此,你可以
\fbox{a} \fbox a
他们做同样的事情(虽然我永远不会做后者),但是
\hbox{a}
盒子a
,但是
\hbox a
生产
! Missing { inserted.
<to be read again>
a
更成问题的是,人们在某些地方省略了括号,而依赖于 TeX 原语的解析规则,当您稍后加载重新定义命令以提供额外功能的包时,该规则就会中断。
一个常见的例子是子脚本或上脚本。你可以去
$a^\frac12b$
产生 a 的一半乘以 b,但通常最好将字符重新定义^
为活动字符(或\mathcode"8000
字符),其定义由\def
或\newcommand
定义如果你这样做,任何正确支撑的用法仍然有效,但上面的例子将相当于
$a^{\frac}12b$
然后frac
会引发一个错误,指出它缺少参数。
诸如此类的用法
$a^{\frac{1}{2}}b$
无论 where 的参数是^
被解析为 TeX 原始上标还是宏,都可以起作用。
因此,如果用户忽略 LaTeX 手册中的规则,并且不总是使用括号参数,则会导致问题并限制软件包设计人员的范围。(标准 LaTeX2e\frac
和\mathrm
相关版本明确设计用于应对这种无括号上标的使用,理由是让用户满意可能比假设他们遵循说明更好。)
答案3
TeX 中有几个地方需要括号作为语法的一部分,但这些地方很少。当涉及到参数时,TeX 会接受单个标记而不使用括号,因此\mathrm i
如果“排版”的话,它会起作用。但试试这个:
\newcommand\x{log}
\tableofcontents
\section{$\mathrm \x$}
你会在输出中看到一个小错误(但没有错误消息):
原因是,\x
在处理过程中突然转变为其组成部分,因此 LaTeX 在排版目录时看到的是$\mathrm log$
,因此只选择“l”作为参数。
因此,LaTeX 手册声称所有参数都必须带有括号,即使从技术上讲这并不正确。
就我个人而言,我不会在所有这些情况下都使用括号,但每当单个标记是一个命令时,在省略括号之前最好三思而后行,因为即使它看起来有效,也可能并非如此。
答案4
似乎没有人提到过 latex 文件有时会自动转换为(例如) xml/mathml,并且此类转换器可能需要通过括号来确定范围,而 (la)tex 本身则不需要。