为什么 LaTeX 要区分命令和环境?
或者:为什么我们需要环境?
我之所以问这个问题,是因为我正在定义一些自定义命令(例如\question{}
和\answer{}
),但我不太确定是否使用 -way\newcommand
或\newenvironment
-way(两者都有效)。区别似乎在于我的自定义命令是否支持表格和图形以及其他“复杂”的内容。
(如果我将其与 HTML/CSS 进行比较,那么所有东西都是标签(或 CSS 类或 ID),并且可以指定(或默认)为内联或非内联。但除此之外,它们之间并没有真正的区别。似乎 HTML/CSS 格式的底层模型更简单,因此更容易理解和使用。)
答案1
正如 Phillippe 所说,环境通常是最适合这种情况的。要理解原因,您需要了解 TeX 读取参数的方式。对于命令
\foo{<stuff>}
<stuff>
TeX在扩展 之前会读取 的所有内容\foo
。如果 很大,这可能是一个问题<stuff>
。此外,一旦 TeX 读取了一个参数,就很难甚至不可能更改类别代码(这些在 TeX 中很重要!)。特别是,在任意参数中,逐字材料都很难可靠地处理。
有了环境,LaTeX 就可以不是一次性读取所有内容。\begin{foo}
设置完成后,环境会正常排版,而不会一次性读取所有内容。这使得逐字逐句地包含内容成为可能,并避免 TeX 的内存被填满太多。我还要指出的是,LaTeX 将每个环境都划分为一个组,这就是为什么
\begin{center}
\bfseries
Text
\end{center}
保持字体更改本地化。
(经常与 HTML/CSS 进行比较,忽略了 HTML 模型出现的时间远晚于 LaTeX 模型的事实,也忽略了排版模型的要求与使用 HTML 在屏幕显示的要求不同的事实。)
答案2
对于练习、答案或定理等内容,您应始终优先使用环境而不是命令。您使用命令可以做的事情,您始终也可以使用环境来做(例如,使用环境包中的值是固定的,反之亦然。例如,你可以在大多数环境中使用逐字内容,但不能在命令中使用。
答案3
您可以将环境视为由两个命令组成:a) 位于开头的内容和 b) 位于结尾的内容。这提供了一个方便的用户界面。一个这样的例子是\begin{enumerate}
... \end{enumerate}
。如果您为此编写了一个宏,则需要发送所有items
as 参数,这对用户来说不太方便。
您与 HTML/CSS 的比较不适用于此处。使用 HTML,每个标签都有开始和结束,您说<h1></h2>
。然后使用内联 css 或外部工作表进行样式设置。在这种情况下,TeX/LaTeX 使用统一语言同时完成这两项工作。LaTeX 也可以编程,而使用 HTML 则需要 JavaScript。习惯 TeX/LaTeX 确实需要时间,但最终结果非常令人满意。