ConTeXt 是建立在 TeX 之上的第二个成熟的文档准备系统。它与 LaTeX 属于同一家族——都是“格式”——但其设计理念却截然不同:一致的 \setup... 命令家族可以对外观进行精细控制,并且 MetaPost 绘图是深度集成的。它是 LaTeX 的替代品,特别适合复杂的布局和自动排版。
什么是 ConTeXt
到目前为止我们看到的 pdfTeX、XeTeX 和 LuaTeX 都是引擎——进行处理的程序。 ConTeXt 位于不同的层:与 LaTeX 一样,它是一种 格式,是由 TeX 宏组装而成的命令系统。它是由荷兰的 Hans Hagen 和他的公司 PRAGMA ADE(高级文档工程)自 1990 年代以来开发的,最初是作为他们自己的出版工作的生产工具。这个名字来源于“text with TeX”——con-tex-t。
它的位置有点令人困惑:虽然 ConTeXt 不是 pdfTeX/XeTeX 意义上的“引擎”,但介绍性材料通常将其与引擎和格式一起列出。更准确的说法是,它是在引擎上运行的 LaTeX 的兄弟。它建立在相同的 TeX 基础上,提供了一种不同的文档编写方式。
它与 LaTeX 有何不同
LaTeX 是一种将大量第三方软件包的功能连接在一起的文化,而 ConTeXt 是高度集成和整体的。颜色、布局、字体、目录、脚注——它们都是从一开始就设计在一起的。因此,您花更少的时间思考“我应该为此添加哪个包,它会与另一个包冲突吗?”,并且复杂的页面布局更容易干净地控制。这种整合是其核心优势。
界面也一致。几乎所有外观都是通过 以 \setup... 开头的设置命令结合 key=value 选项来指定的。正文字体大小为\setupbodyfont,纸张大小为\setuppapersize,段落间距为\setupwhitespace,等等——命名和语法都非常规则。几乎不需要记住什么特别的“语法”,并且设置保持清晰。
标记本身也与 LaTeX 不同。正文 - LaTeX 的 \begin{document}…\end{document} - 被包裹在 \starttext … \stoptext 中,一个部分是 \startsection … \stopsection(或者仅用于标题的 \section)。环境用匹配的 \start…/\stop… 对表示,这是 ConTeXt 习惯用法。
学习材料的收集方式也不同。 LaTeX 知识分散在世界各地无数的书籍、问答网站和软件包手册中,而 ConTeXt 文档相对集中 - 官方 ConTeXt wiki (contextgarden) 和入门知识,例如 *ConTeXt:一次游览*。社区以同样的方式聚集:年度 ConTeXt 会议让开发人员和用户面对面,设计和实现讨论往往会回流到官方材料中。
MkII / MkIV / LMTX 谱系
ConTeXt 分为三个主线,每个主线都与一代底层引擎相匹配。它们都是“ConTeXt”,但它们运行在具有不同内部结构的不同引擎上。
- MkII — 最古老的线路,在 pdfTeX 上运行(对于日语等脚本,则在 XeTeX 上运行)。现在它已被冻结并仅进行维护。
- MkIV — 在 LuaTeX 上运行的 Lua 时代重写。它于 2007 年推出,利用 Unicode、OpenType 字体和 Lua 脚本。它也基本上被冻结了。
- LMTX (内部 MkXL) — 当前推荐的线路,在 LuaMetaTeX 上运行。自 2019 年推出以来,积极的开发仍在继续。
这里的关键部分是LuaMetaTeX。它是 Hans Hagen 和 ConTeXt 开发人员专门为 ConTeXt 重建的 精益引擎,作为 LuaTeX 的后继者。它故意从 LuaTeX 中剥离 PDF 输出(后端)、字体处理和许多原语**,将它们留在 ConTeXt (Lua) 端实现——这是一个大胆的设计。它不依赖于外部库,不需要复杂的构建生态系统,并且可以轻松地跨操作系统进行移植:一个精简的、独立的后继者。
LuaMetaTeX 由 ConTeXt 组本身维护,目前 ConTeXt (LMTX) 实际上是唯一真正使用它的东西。如果您刚开始使用 ConTeXt,LMTX 是标准选择。
深度 MetaPost 集成
如果没有与 MetaPost 的融合,ConTeXt 的记录就不完整。 MetaPost 是一种用于精确数字的编程语言,源自 Knuth 的 METAFONT。 ConTeXt 在其核心嵌入了 MPlib — MetaPost 变成了一个可重用的库,由 Taco Hoekwater 和 Hans Hagen 于 2007 年分离出来 — 因此您可以直接在文档中编写 MetaPost 代码,并在同一编译过程中动态绘制图形。
在较旧的 MkII 中,在运行时绘制图形要么会减慢 TeX 的运行速度,要么需要在运行之间生成中间 PostScript 文件。 MPlib 在运行时直接使这成为可能,从而产生了明显的 ConTeXt 绘图文化,其中甚至页面元素(规则、背景、装饰)都是使用 MetaPost 动态生成的。
一个最小的例子
为了感受一下,这里是编译的最小 ConTeXt 文档。主体从 \starttext 运行到 \stoptext。没有像 LaTeX 的 \documentclass 那样强制文档类声明;您可以使用 \setup... 命令在顶部设置所需的任何外观。
\setuppapersize[A4]
\setupbodyfont[12pt]
\starttext
\startsection[title=はじめに]
Hello, \ConTeXt! 数式もそのまま組めます:
\startformula
E = mc^2
\stopformula
\stopsection
\stoptext这里 \setuppapersize 选择 A4,\setupbodyfont 设置 12pt 正文,\startsection 打开标题为“简介”的部分。显示的方程为 \startformula … \stopformula。角色与LaTeX的\section{…}和\[ … \]相匹配,但你可以看到写作风格遵循\start…/\stop…的习惯用法。
# ConTeXt は context コマンドで処理する / compile with the context command
context first-context.tex
# => first-context.pdf重要的一点是,您不要在这里运行 pdflatex 或 lualatex 。 ConTeXt 不是 LaTeX 格式,即使文件仍可能以 .tex 结尾;将其交给 context 命令。将“使用 context main.tex 构建此文档”放入 README 中,以便协作者和 CI 不会意外使用 LaTeX 命令。
LaTeX 和 ConTeXt 并排
对于那些习惯了 LaTeX 的人来说,这里并排列出了一些具有代表性的习语。思想相似,但词汇和约定不同。
| LaTeX | ConTeXt | 目标 |
|---|---|---|
\begin{document} | \starttext | 开始正文 |
\section{…} | \section{…} / \startsection | 一个章节标题 |
\[ … \] | \startformula … \stopformula | 显示的方程 |
geometry など | \setuppapersize 和其他 \setup... | 纸张和布局 |
什么时候选择它
- 精心设计或自动化的布局。复杂的页面设计或从数据批量生成的排版受益于其一致的控制。
- 演示文稿。 它具有专用的幻灯片模式,MetaPost 可以构建动态装饰。
- 从 XML 发布。 ConTeXt 具有强大的 XML 处理设施,并且擅长直接读取和排版 XML 的工作流程。
- 嵌入绘图。 通过集成 MetaPost,图形和文本可以存在于单一来源中。
不过,也有一些警告。该社区比 LaTeX 的小得多,并且第三方软件包也较少。日志模板、教程和积累的问答比 LaTeX 更有限。因此,在实践中,大多数学术用户仍然选择 LaTeX 作为论文和论文。将 ConTeXt 视为非常适合其工作类型的专用选项。
如何获得
ConTeXt 随标准发行版 TeX Live 一起提供,并且自 TeX Live 2023 起就包含了 LuaMetaTeX 引擎,因此正常的 TeX Live 安装也会为您提供 LMTX(当前的 TeX Live 是 2026 版本)。相反,如果您想跟踪最新的 ConTeXt,通常的路线是该组织自己的 ConTeXt 独立版(现在作为 LMTX 分发) — 一个轻量级、仅包含 ConTeXt 的捆绑包,经常更新。
开始 ConTeXt 的第一章
在尝试 ConTeXt 时,请抛开 LaTeX 寻找更多软件包的习惯。首先使用 \starttext、\startsection 和 \startitemize 构建正文,然后将边距、字体和标题外观收集到顶部的 \setup... 命令中。随着章节的增长添加样式;设置不包含在散文中,以后更改页面设计意味着只能在一个地方查找。
- 当所需模板为 LaTeX 时,期刊提交应保留 LaTeX。
- 小册子、教材和目录(您拥有页面设计)受益于 ConTeXt 的集成设置模型。
- 数字与散文的来源相同是尽早尝试 MetaPost 集成的一个很好的理由。