《Lua in ConTeXt》02:ConTeXt 计算机
倘若计算机里有个 ConTeXt 可以用,就可以认为它也是一台计算机,是计算机里的计算机。
用于编写 TeX 源文件(例如 hello.tex)的任何一种文本编辑器,都可视为「ConTeXt 计算机」的终端。context
命令可将 TeX 源文件里的内容输出到 PDF 文件,于是可将 PDF 文件视为 ConTeXt 计算机的显示器。
单有输入和输出的机器,还称不上计算机,但是倘若在输入里能够编程,那这个机器就肯定是计算机。我们可以在 TeX 源文件里编程,所用的编程语言最早是 TeX 语言。我以前写过一篇没打算写完的文章「TeX 编程」,其中的任何示例代码皆能基于以下格式的 TeX 源文件由 context
命令解释并执行
\starttext
这里可以放任何示例代码
\stoptext
需要说明的是,含有 \starttext ... \stoptext
的 TeX 源文件应当称为 ConTeXt 源文件。TeX 和 ConTeXt 的关系,类似于马和马车的关系。直接骑马也是可以的,但是坐马车会舒服很多。TeX 是 ConTeXt 的内核。像 ConTeXt 这样的马车还有一个,叫 LaTeX,也许听说过它的人要比听说过 ConTeXt 的人更多。
21 世纪了,现代人可以在 TeX 文档里用 Lua 语言编程。因此这份文档的名字就叫作 ConTeXt 里的 Lua。
Lua 语言本身并不依赖 ConTeXt,使用它可以为我们所熟悉的由一堆硬件组成的计算机编写程序。当 ConTeXt 的开发者将 Lua 语言解释器/编译器嵌入到了 ConTeXt 计算机之后,使用 Lua 语言编写程序时,可以使用 ConTeXt 计算机里大量的资源,这意味着 Lua 语言得到了显著强化。
例如,倘若使用 Lua 编写一个可以生成 PDF 文件的 Hello world 程序,在硬件架构的计算机里,这样的程序可能需要成百甚至上千行代码,而在 ConTeXt 计算机里,只需要三行代码,例如:
\starttext
\ctxlua{context("Hello world!")}
\stoptext
这个程序与上一章里的
\starttext
Hello world!
\stoptext
等价,但是前者出现了真正的 Lua 代码
context("Hello world!")
这行代码调用了 ConTeXt 计算机里的 Lua 函数 context
(注意,它不是 context
命令,二者仅仅是恰好同名而已),该函数将字符串 "Hello world!"
输出到了 TeX 文件,然后 ConTeXt 计算机将 ConTeXt 源文件的内容输出至 PDF 文件。
也许通过以下图示,能够理解上述的一切:
ConTeXt 计算机的输入和输出现在,可以忘记 ConTeXt 是计算机了,它只是一个程序。我们与它的任何交互,就是通过一条非常简单的 context
命令:
$ context 你的 ConTeXt 源文件
不过,在一个使用着硬件体系的计算机用户看来,Hardware the parts of a computer that can be kicked.(硬件,计算机中可剔除的部分。)