可交换图把对象作为点摆放,并用箭头表示对象之间的映射,使“沿任意路径得到的复合都相同”一眼可见。LaTeX 中排版这类图主要有两个工具:构建在 TikZ 之上的强大 tikz-cd,以及更简洁的 AMS 宏包 amscd。本页分别用二者排版一个可交换正方形,也就是最基本的可交换图,整理箭头方向、标签和线型的指定方法,并比较在什么场景下该选哪一个。
什么是可交换图
可交换图广泛用于代数、范畴论和拓扑学,用来一眼传达关系。最小的例子是可交换正方形:在四个角放置对象 A、B、C、D,上边是一条映射 f(从 A 到 B),下边是 g(从 C 到 D),左边是一条从 A 到 C 的映射,右边是一条从 B 到 D 的映射。“这个正方形可交换”只是说,从 A 到 D 的两条路径,也就是先走上边再沿右边向下的复合,以及先沿左边向下再走下边的复合,是同一个映射。
图本身也是数学内容,因此通常放在陈列数学环境中(\[ … \] 或 equation 环境)。历史上出现过许多用于此任务的宏包,如 xy/xypic、diagrams 等,但今天事实上的标准是 tikz-cd,它能轻松绘制曲线、斜向箭头以及复杂的多行图。不过,如果简单的矩形图已经足够,AMS 的 amscd 是轻量选择。下面依次介绍二者。
tikz-cd —— 现代选择
tikz-cd 是把通用绘图宏包 TikZ 调整为可交换图用途的宏包。它由 Florêncio Neves 编写,现在由 Augusto Stoffel 维护;当前 CTAN 版本为 1.0(2021 年 5 月)。在导言区用 \usepackage{tikz-cd} 加载(或先加载 TikZ,再用 \usetikzlibrary{cd})后,就能使用 tikzcd 环境。这个环境的内容像 LaTeX 的 tabular 一样写成矩阵:用 & 分隔单元格,用 \\ 换行。每个单元格都是放置图中“对象”的节点,并且全部自动以数学模式排版。
对象之间的箭头用 \arrow 命令绘制;短别名 \ar 的作用完全相同。在箭头起点所在的单元格中写 \arrow[…],并在方括号中指定目标和装饰。目标用方向键给出:r 表示右,l 表示左,u 表示上,d 表示下。这些字母可以连成字符串,例如 [rd] 指向右下一格(斜向)。
要给箭头加标签(映射名),就在选项中写一个带引号的字符串。\arrow[r, "f"] 表示“指向右侧相邻单元格、标签为 f 的箭头”。默认情况下,标签位于箭头左侧(相对于前进方向的左边);在带引号标签后立即加撇号 ' 会把它移到另一侧,写法如 "g"'。一根箭头也可以有多个标签,并可像 "f" near start 那样细调位置。下面是一个典型用法的小例子。
\[
\begin{tikzcd}
A \arrow[r, "\phi"] \arrow[rd] & B \\
& C
\end{tikzcd}
\]这会得到左上角 A、右上角 B、右下角 C:一条带标签 φ 的水平箭头从 A 指向右侧的 B,同时一条斜向箭头从 A 指向右下方的 C。注意 \arrow[r, "\phi"] 和 \arrow[rd] 都连续写在同一个 A 单元格中;一个单元格可以发出任意数量的箭头。
有了这些基础,就来排版开头提到的可交换正方形。把四个角 A、B、C、D 放成 2×2 矩阵,并画四根箭头:从 A 向右的 f,从 A 向下的左边,从 B 向下的右边,以及从 C 向右的 g。
\[
\begin{tikzcd}
A \arrow[r, "f"] \arrow[d, "\alpha"] & B \arrow[d, "\beta"] \\
C \arrow[r, "g"] & D
\end{tikzcd}
\]这会得到一个以 A、B、C、D 为四角的正方形:上边是向右的 f,下边是向右的 g,左边是向下的 α,右边是向下的 β。每个标签都放在默认侧,也就是相对于箭头方向的左侧。例如若想把右边的 β 放到另一侧(外侧),写 \arrow[d, "\beta"']。由于 tikzcd 环境内部是数学模式,若标签中需要普通文字,应在 tikz-cd 的标签选项中使用 \text{…}(来自 amsmath)。
tikz-cd 的最大优势在于可以细致改变箭头外观。线型、箭头头部和弯曲方式,只要在 \arrow 的选项中加入样式键即可切换。下表汇总常用项。多个样式可以同时指定并自由组合,例如 \arrow[r, tail, two heads, dashed]。
| 键 | 效果 |
|---|---|
hook | 在尾端加钩(⊂),表示包含或单射 |
two heads | 双箭头头部,表示满射 |
tail | 在起点加尾部(单射的另一种标记) |
dashed | 改为虚线(常表示唯一确定的映射) |
dotted | 改为点线(来自 TikZ 的键) |
equal | 绘制双线(等号)而不是箭头 |
bend left | 让箭头向左弯成弧线(用 bend left=20 指定角度) |
bend right | 让箭头向右弯成弧线 |
把表示同构的 \sim 或 \simeq 作为标签放到箭头上也很常见。例如 \arrow[r, dashed, "\simeq"] 会在虚线箭头上方放置同构符号 ≃。若想在同一对对象之间画两条不同的弧线,可分别使用 bend left 和 bend right。由于 tikz-cd 也能直接接受 TikZ 键(如 color=…、dotted、in=…/out=… 等),它的表达范围实际上覆盖了整个 TikZ。
有一点需要注意:tikzcd 图在 DVI 查看器中无法正确显示。请使用直接生成 PDF 的 pdflatex、lualatex、xelatex,或走 DVI 转 PDF/PS 的流程。还要注意,\arrow 有一种早于引号语法的旧写法 \arrow[…]{direction}labels(例如 \arrow{r}{f}),为了向后兼容仍可使用;但新文档中引号语法更易读,也更推荐。
amscd —— AMS 的简洁 CD 环境
amscd 是把 AMS-TeX 的可交换图功能移植到 LaTeX 的宏包,在导言区用 \usepackage{amscd} 加载。它只提供一个 CD 环境。与 tikz-cd 一样,内容用 & 和 \\ 写成矩阵;但 amscd 不依赖外部宏包(不需要 TikZ),只靠 TeX 排版即可运行,因此很轻量。不过它的设计有意保持简单:只能画水平和垂直箭头(见下文)。
所有箭头都写成以 @ 开头的特殊记号。水平箭头为 @>>>(向右)和 @<<<(向左);垂直箭头为 @VVV(向下,V 来自 vertical)和 @AAA(向上,把 A 看作向上的箭头)。等号(双线)水平方向用 @=,垂直方向用 @|(或 @\vert)。如果某个网格点不需要箭头,则放 @.(点)。水平箭头写在对象之间,也就是同一行的 & 位置;垂直箭头写在对象正下方的那一行。
标签写在构成箭头的字符之间。水平的 @>>> 有三个 > 分隔符,因此有两个插槽:第一个插槽(紧跟 @> 后)中的文字放在箭头上方,第二个插槽中的文字放在下方。因此 @>f>> 把 f 放上方,@>>g> 把 g 放下方,@>f>g> 则上方 f、下方 g。垂直的 @VVV 同理:@VfVV 把 f 放在向下箭头左侧,@VVfV 把 f 放在右侧(@AAA 也遵循同一规则)。
下面是 AMS amscd 手册中的可交换正方形示例。它假定 \End 已定义为算子名(相当于 \operatorname)。
\[
\begin{CD}
S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T \\
@VVV @VV{\End P}V \\
(S\otimes T)/I @= (Z\otimes T)/J
\end{CD}
\]在这张图中,第一行从左侧对象到右侧 T 画出一条水平箭头,并在上方放置标签 j。中间一行(@VVV 和 @VV{\End P}V)生成垂直箭头:左列是无标签的向下箭头,右列是右侧带标签 End P 的向下箭头。底行用 @=,也就是双线等号,连接两个对象。{\End P} 中的花括号用于把多记号标签组合成一个整体。
用 amscd 排版本页开头的 f/g/α/β 可交换正方形时,代码如下。左边和右边垂直箭头的标签按上文所述放在第一个插槽,也就是左侧。
\[
\begin{CD}
A @>f>> B \\
@VV\alpha V @VV\beta V \\
C @>g>> D
\end{CD}
\]这会得到一个以 A、B、C、D 为四角的正方形:上边是向右箭头 f,下边是向右箭头 g,左边是向下箭头 α,右边是向下箭头 β。它与 tikz-cd 示例是完全相同的图,区别只是记法使用 @ 拼写。由于 amscd 的 CD 环境是数学模式,也要把它放在陈列数学中(上面使用 \[ … \])。
该用哪一个
这两个宏包的适用范围明显不同。amscd 的 CD 环境只处理网格状(矩形)图;AMS 手册本身也明确说它只面向“简单矩形图,没有斜向箭头或更复杂功能”。这是它最大的限制。如果需要对角箭头、曲线或复杂的多行图,amscd 画不了,就应转向 tikz-cd(或 xy 系列)。
- 需要斜向箭头或曲线 →
tikz-cd。amscd只能水平/垂直,不能倾斜。 - 想精细控制箭头头部和线型(单射
hook、满射two heads、虚线、双线等) →tikz-cd。 - 普通矩形图足够/想减少依赖 →
amscd。它不加载 TikZ,轻量且快速。 - 记法偏好:
amscd的@>>>写法简洁但独特;tikz-cd的\arrow[r, "f"]较长,但对读者更直观。 - 输出路径:
tikz-cd在 DVI 查看器中不能正确显示,因此默认使用能生成 PDF 的引擎(pdfLaTeX 等);amscd没有这个限制。
经验法则是:如果论文中只是偶尔出现矩形图,amscd 已经足够,没有额外依赖,排版也快。如果图是核心内容,并且大量使用斜向映射、曲线或复杂箭头头部,就选择 tikz-cd。还要记住,对于“A → B”这样极简单的内容,往往根本不需要图式环境;使用 \xrightarrow{f}(来自 amsmath)这样的行内命令即可。