我对 LaTeX 还不太熟悉,因为我习惯使用更传统的面向对象编程语言,如 Java、C 或 Python,所以这让我很烦,因为它似乎是 LaTeX 非常基本的语法。我想知道是否有适合这种语法水平的通用资源,因为我觉得这对编写 LaTeX 包也很有用。
我有点困惑LaTeX 中{}
和之间的区别[]
是什么,因为似乎两者都是指定参数的一种方式,但似乎其他 LaTeX 可以在 内部工作{}
。我想说{}
只是一个语法块,但它与面向对象中的用法不太类似,这可能就是为什么我想跳转到语法块的原因。
最终,就我所见,LaTeX 与标记的共同点比面向对象编程多得多,因此与 OOP 进行比较可能并不总是有意义的。话虽如此,我还是忍不住注意到\command{something}
函数调用(或者甚至可能是 C 宏用法)本质上是一种功能类比,这可能也有点涉及到定义命令。我很想知道这是否与 LaTeX 命令定义有任何联系,或者这是否纯粹是巧合的相似性,并且有完全不同的含义和解释。
答案1
LaTeX 使用{ ... }
来表示必需的命令的参数,而[ ... ]
是可选的。 的使用{ ... }
来自底层 TeX 设置(或者至少它通常是按照 DE Knuth 的想法设置的)。因此例如
\documentclass{article}
和
\documentclass[11pt]{article}
是有效的 LaTeX,因为第一个参数是可选的(方括号),而第二个参数是必需的。因此,如果您执行类似以下操作,则会收到(低级)错误
\documentclass[11pt] % Oops, no mandatory argument!
\begin{document}
正如评论中指出的那样,在某些情况下可以看到( ... )
和的配对,因为它们提供了一种标记特定类型参数的方法。在 LaTeX 内核中,用于指定图片模式下材料的坐标,其他软件包会采用这种坐标。这种用法可能最为人所知,它使用这些分隔符来显示与制作演示幻灯片时命令的叠加性质相关的参数。< ... >
( ... )
< ... >
beamer
关于命令,请注意 LaTeX 是用 TeX(一种宏扩展语言)编写的,并使用各种原语(内置函数),其中一些原语通过扩展工作。因此,虽然有时人们会谈论 LaTeX 中的“函数”,但这是非正式的,不应按字面意思理解。
答案2
从用户的角度来看(我不是程序员),正如 Joseph Wright 所解释的那样,要点是{}
通常是一个强制参数,而是 []
一个可选参数,但除了例外情况(例如:\only<2>{...}
在 Beamer 中),我还要指出,它{...}
可以不是任何命令的参数,而是一个由类别代码 1 和 2 的标记分隔的组,可以限制任何命令的范围,除非另有明确说明,以便在组之外恢复旧值。
换句话说,{
和}
不仅是宏的参数分隔符,而且相当于\bgroup
和命令,与 TeX 基元和\egroup
类似(但不等同)。\begingroup
\endgroup
例如,命令 \em
不带任何可选或强制参数。只会影响后面的任何文本,但您可以将此效果包含在组中,因此{\em text} text
相当于\bgroup\em text \egroup text
和\emph{text} text
但不等同于\em{text} text
。最后一种情况看起来像带有强制参数的命令,但只是一个没有参数的命令后跟一个组。
分组和嵌套分组的效果对于新手来说并不总是很明显。有些像“ word {word} word
”没有任何效果,还有“ word {word }word
”但与 不同word {word } word
,最重要的是,你应该理解为什么有些代码或\def\xx{yy} \xx
可以\def\xx{yy} {\xx}
工作,但却{\def\xx{yy}} \xx
会产生致命错误。
有关组的更多信息,请运行 texdoc texbytopic
并参阅第 10 章 (分组,第 105 页)。
另一方面,方括号一开始会让人困惑, 当不是某些命令的可选参数时与分组相比{...}
,因为与花括号不同,它们通常不是活动字符,因此 [ ... ]
对于新手来说可能会令人惊讶,因为它不是某种分组,而只是文本“[...]”。正如西格蒙德弗洛伊德所说,有时括号只是一个括号。