TeX/LaTeX 的语法

TeX/LaTeX 的语法

{} 和 [] 进行某种分组,逗号似乎也很特殊。作为一名程序员,我发现仅凭咒语使用 Latex 令人沮丧。我想知道它到底是如何工作的。

TeX/LaTeX 的语法到底是什么?
它是如何解析的?
Latex 只是引入了新命令还是也改变了语法?
或者也许局部改变语法是 Tex 的固有特性?

答案1

对于程序员,我建议阅读《TeX by Topic》一书(可免费访问http://www.eijkhout.net/tbt/)。我认为这将为您的一般问题提供最佳答案(在我看来,这些问题确实有点对于这个网站来说,我建议您阅读 TbT,然后针对特定方面提出更有针对性的问题)。

但是,您提到了几个细节,所以让我尝试回答它们。{} 是词汇的:

\def\hello{world}
{\def\hello{hello}
\hello}
\hello

输出:“hello world”。

分组如下正方形括号是一种假象。 一些LaTeX 中的命令以“如果下一个字符是 [,则吞掉其余字符直到 ] 并将其用作第一个参数”开头。例如,如果您要传递的内容中包含方括号,则这可能会导致问题:

\newcommand{\hello}[2][hello]{#1 #2}
\hello{world}
\hello[greetings]{world}
\hello[Greetings [1] to the]{world}

生产

hello world
greetings world
Greetings [1 worldo the]world

因为最后一行“hello”的第一个参数是“Greetings [1]”。

(这可以通过使用括号进行正确分组来解决,\hello[{Greetings [1] to the}]{world}效果很好)。

我从未听说过逗号是特殊符号。你能举个例子吗?

答案2

我建议阅读 Donald Knuth 的《The TeXbook》,至少有两个原因:

  1. 阅读它是一种极大的享受。Knuth 的写作风格非常清晰且具有解释性。更不用说他是 TeX 的作者。
  2. 它有一章非常精彩,几乎完全回答了你的问题:“第 7 章。TeX 如何读取你输入的内容。”

我认为这本书是有关 TeX 低级特性的最佳著作。

答案3

优秀TeX 按主题分类已经提到过了,如果你是一名寻求启发的程序员,我会从这里开始。你需要记住的是,TeX 处理的是带有类别代码的标记。在分组的情况下,通常{}分别是带有类别代码 1(开始组)和 2(结束组)的标记。因此 TeX 将在读取时开始一个组{,并在读取时结束该组}

对于简单的宏,例如

\newcommand*\example[1]{Stuff with #1}

参数可以是单个标记或单个组。因此

\example{stuff}

将吸收“东西”作为#1,但

\example stuff

只会挑选‘stuff’中的‘s’,因为‘s’是一个标记。

[LaTeX 在...中引入了可选参数的概念]。正如 Andrew 指出的那样,这不是通过分组实现的,因此可能会产生奇怪的结果。您可以解决这个问题:例如,查看 xparse 如何管理可选参数。LaTeX 还使用(...)作为坐标参数,但同样没有分组。

正如我所说,类别代码很重要。ConTeXt 使用[和而不是和]进行分组。因此,您需要担心的不是字符,而是标记(包括类别代码)。这是一个相当特定于 TeX 的概念,因此查看{}TeX 按主题分类TeXbook是掌握它的好方法。

答案4

自从TeX 按主题分类电子书已经提到与程序员特别相关,我认为不提的话就太过分了TeX:程序这是 Knuth 文学编程哲学的一个绝佳范例(或许是巅峰之作);我充其量只是一个业余程序员,我发现很容易就能深入阅读我想要的部分(我也非常关心解析,而现在不太关心布局),而忽略其余部分。

正如胡安·纳瓦罗所提到的,需要警告的是,任何想要从实际的“编译”中分离出清晰的解析视图的想法本身,很快就会破灭。人们希望从现代观点来看待排版过程的不同部分,但这些部分却无可救药地混杂在一起;这至少是人们说 TeX 是糟糕的编程语言克里斯·罗利主张采用现代方法来分离应该分离的东西(人们喜欢塔科·霍克沃特做了一些美好的事情,这些事情应该算作朝着这个方向迈出的步伐,尽管我不确定这是否是他们的本意)。

相关内容