圏論の可換図式を TikZ(tikz-cd)で描く
はじめに
圏論の議論では、対象と射の関係を可換図式で示します。これを LaTeX できれいに組むための定番が tikz-cd パッケージです。TikZ ベースなので、フォントも数式も本文とそろい、ベクターで拡大に強い図になります(グラフィカルモデルやブロック線図も同じ考え方です)。
tikz-cd の基本
\usepackage{tikz-cd}
図は tikzcd 環境の中に、対象を行列のように並べて書きます。セルの区切りは &、行の区切りは \\。各対象から出る射は \arrow(省略形 \ar)で、向きを r(右)l(左)d(下)u(上)の組み合わせで指定します。
\begin{tikzcd}
A \arrow[r, "f"] \arrow[d, "g"'] & B \arrow[d, "h"] \\
C \arrow[r, "k"'] & D
\end{tikzcd}
出力例:可換な四角形。$h \circ f = k \circ g$ が成り立つことを図で示す。
- ラベルは
"..."で矢印に付ける - ラベル文字列の直後に
'(プライム)を付けると、矢印の反対側にラベルが出る("g"'は左向き矢印の左側) - 行間・列間は環境オプション
row sep=large/column sep=smallなどで調整する
矢印の装飾
射の種類に応じて矢印の見た目を変えられます。
| 指定 | 見た目 | 用途 |
|---|---|---|
hook | ↪ | 単射(モノ射) |
two heads | ↠ | 全射(エピ射) |
dashed | 破線 | 一意に定まる射、存在を主張する射 |
"\\sim" / "\\cong" をラベルに | ≅ の注記 | 同型 |
Rightarrow | ⇒ | 自然変換 |
bend left / bend right | 曲線 | 平行な射を避ける |
shift left / shift right | 平行移動 | 2 本の平行な射(イコライザなど) |
完全列の例
\begin{tikzcd}
0 \arrow[r] & A \arrow[r, hook, "i"] & B \arrow[r, two heads, "p"] & C \arrow[r] & 0
\end{tikzcd}
出力例:短完全列 $0 \to A \hookrightarrow B \twoheadrightarrow C \to 0$。$i$ は単射、$p$ は全射。
実例:引き戻しと普遍性
引き戻し(プルバック)
角の記号 \lrcorner を phantom(描画されない)ノードとして対角位置に置き、very near start で角に寄せます。amssymb が必要です。
\begin{tikzcd}
P \arrow[r, "p_2"] \arrow[d, "p_1"']
\arrow[rd, phantom, "\lrcorner", very near start]
& B \arrow[d, "g"] \\
A \arrow[r, "f"'] & C
\end{tikzcd}
出力例:引き戻し。左上の $\lrcorner$ が「この四角は引き戻し」を表す慣例記号。
普遍性(積)
破線の一意な射を中央に描きます。
\begin{tikzcd}[column sep=large, row sep=large]
& X \arrow[ld, "x"'] \arrow[rd, "y"] \arrow[d, dashed, "\exists!\,u"] & \\
A & A\times B \arrow[l, "\pi_A"] \arrow[r, "\pi_B"'] & B
\end{tikzcd}
出力例:積の普遍性。任意の $x, y$ に対して $\pi_A \circ u = x$、$\pi_B \circ u = y$ を満たす $u$ がただ一つ存在する。
素の TikZ で描く場合
tikz-cd を使わず、matrix ライブラリで対象を並べ、\path ... edge で射を引くこともできます。
\usetikzlibrary{matrix}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=3em, column sep=3em] {
A & B \\
C & D \\
};
\path[-stealth]
(m-1-1) edge node[above] {$f$} (m-1-2)
(m-1-1) edge node[left] {$g$} (m-2-1)
(m-1-2) edge node[right] {$h$} (m-2-2)
(m-2-1) edge node[below] {$k$} (m-2-2);
\end{tikzpicture}
同じ図は書けますが、矢印の曲げ・単射記号・角記号などをすべて手で用意することになります。可換図式なら tikz-cd を使うほうが短く、読みやすいというのが実際のところです。素の TikZ が要るのは、図式に自由な装飾や座標指定を混ぜたいときです。
運用
amsmath/amssymbを読み込む(\lrcorner、\rightarrowtailなど)- 図が増えたら
standaloneで 1 枚ずつ別ファイルにし、本文から\input - ビルドの回し方は latexmk、環境の固定は TeX Live 入りコンテナの記事にまとめてある
- この記事の図は、上のコードを
standaloneでコンパイルしdvisvgmで SVG 化したもの
関連記事
- 確率的生成モデルのグラフィカル表現を TikZ で描く — ノードとプレートの記法
- 制御系のブロック線図を TikZ で描く — ブロックと配線の記法
- 深層学習の代表的なモデル図を TikZ で描く — MLP・CNN・Transformer・RNN
- 状態遷移図を TikZ で描く — automata ライブラリで状態機械を描く
- LaTeX Beamer で発表スライドを作る — 図をスライドに載せる
- latexmk — 図を含む文書のビルド
まとめ
- 可換図式は
tikz-cd。tikzcd環境に対象を並べ、\arrow[方向, "ラベル"]で射を引く。 - ラベルの
'で反対側、hook/two heads/dashedで射の種類を表す。 - 引き戻しの角記号は
phantomノード+\lrcorner、一意な射はdashed。 - 素の TikZ でも書けるが、可換図式に限れば
tikz-cdのほうが短く確実。
矢印まわりの語彙(向き・ラベル位置・装飾)を一度覚えれば、たいていの図式は数行で書けます。