圏論の可換図式を 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}
A から B へ f、A から C へ g、B から D へ h、C から D へ k。四角形が可換

出力例:可換な四角形。$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 から A、A から B へ単射 i、B から C へ全射 p、C から 0 への完全列

出力例:短完全列 $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}
P から A、P から B、A から C へ f、B から C へ g。左上の角に引き戻しを表す記号

出力例:引き戻し。左上の $\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 から A へ x、X から B へ y、X から A×B へ一意な破線の射 u。A×B から A へ π_A、B へ π_B

出力例:積の普遍性。任意の $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-cd。tikzcd 環境に対象を並べ、\arrow[方向, "ラベル"] で射を引く。
  • ラベルの ' で反対側、hook / two heads / dashed で射の種類を表す。
  • 引き戻しの角記号は phantom ノード+\lrcorner、一意な射は dashed。
  • 素の TikZ でも書けるが、可換図式に限れば tikz-cd のほうが短く確実。

矢印まわりの語彙(向き・ラベル位置・装飾)を一度覚えれば、たいていの図式は数行で書けます。

LaTeX組版・教材校正のご依頼・ご相談はコレクトコネクトへお問い合わせください。

← コラム一覧へ