对我来说,全局声明变量会使项目变得混乱。尤其是当需要声明许多变量时。
此外,在本地声明变量将节省我们的时间,因为我们不需要确保变量是否已声明。
我不知道这在 TeX 中是否是一种不好的做法。
\documentclass{minimal}
\newcommand\Average[5]{%
\newcount\Total%
\Total\numexpr#1+#2+#3+#4+#5\relax%
\number\numexpr\Total/5\relax%
}
\begin{document}
The average of 1, 2, 3, 4, 5 is \Average{1}{2}{3}{4}{5}.
\end{document}
答案1
我已经在我的博客,但为了回答这个问题,我会做一些编辑并在这里发布要点。
一、标准\newcount
,,\newtoks
ETC函数全局分配。因此
\begingroup
\newcount\mycount
\endgroup
会永久占用寄存器,即使\mycount
在组结束时消失。埃泰克斯套餐提供\loccount
,,\loctoks
ETC.,这确实释放了组末尾的分配。所以
\begingroup
\loccount\mycount
\endgroup
至少不会消耗寄存器。但是,还存在其他问题。
在大多数语言中,局部变量是某个函数的局部变量,而嵌套函数有自己独立的局部变量。在 TeX 中,情况有所不同,因为它是一种宏语言,只有分组才能使事物成为局部变量。因此,类似这样的代码
\def\BadIdea{%
\loccount\mycount
...
}
不会破坏\mycount
插入的材料的末尾\BadIdea
。另一方面,事物将在组内起作用,因此这样做
\def\BetterIdea{%
\begingroup
\loccount\mycount
....
\endgroup
}
将按预期销毁\mycount
。但是,通过执行以下操作可以获得大致相同的效果
\newcount\mycount
\def\BetterIdea{%
\begingroup
....
\endgroup
}
甚至(如果你知道它是安全的)
\def\BetterIdea{%
\begingroup
\@tempcnta=<value>
....
\endgroup
}
IE使用通用临时寄存器。
由于 TeX 的局部变量与组有关,而不是与宏有关,我认为最佳做法仍然是全局分配并在本地使用。戴上我的 LaTeX3“帽子”,我要指出的是,我们确实尝试了一些本地分配,当我们解决问题时,我们发现这有点像一场噩梦。