即使结果相同,省略括号 {} 对 TeX 来说有多糟糕?

即使结果相同,省略括号 {} 对 TeX 来说有多糟糕?

有时写出括号和省略括号会产生相同的结果:

\tilde{\psi}  \mathrm{e}^{\mathrm{i} \pi}

对比

\tilde \psi   \mathrm e^{\mathrm i \pi}

或者(取自下面 Werner 的评论)

\frac{1}{2} vs \frac12

如果是这样,那么省略它们对我的代码质量有多大影响?当然,如果编译一对公式,则没有区别。但是,由于我忽略了 TeX 的工作原理,我的观点是:如果一个人用这些习惯编写长代码,

  1. 由于我没有按照 TeX 的预期进行书写,它是否会变得异常?
  2. 例如,它对长文档的编译速度有影响吗?有什么理由保留它们吗?

答案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 个\frac12vs实例,结果显示典型时间分别为 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$}

你会在输出中看到一个小错误(但没有错误消息):

enter image description here

原因是,\x在处理过程中突然转变为其组成部分,因此 LaTeX 在排版目录时看到的是$\mathrm log$,因此只选择“l”作为参数。

因此,LaTeX 手册声称所有参数都必须带有括号,即使从技术上讲这并不正确。

就我个人而言,我不会在所有这些情况下都使用括号,但每当单个标记是一个命令时,在省略括号之前最好三思而后行,因为即使它看起来有效,也可能并非如此。

答案4

似乎没有人提到过 latex 文件有时会自动转换为(例如) xml/mathml,并且此类转换器可能需要通过括号来确定范围,而 (la)tex 本身则不需要。

相关内容