「この図式は可換である」——数学でもっとも短く、もっとも重い一文かもしれません。書き下せば数行かかる等式の集まりが、この一言に収まります。可換図式は、対象を点に、写像を矢印に置き換え、同じ二つの対象を結ぶどの有向経路も、合成すると同じ写像になると主張する道具です。LaTeX でこれを描く現在の標準は \usepackage{tikz-cd}(環境名はハイフンのない tikzcd)で、単純な長方形の格子で足りるなら AMS の amscd もいまだ現役です。このページでは可換正方形をゼロから組み立て、ラベルを矢印の上下に振り分け、矢印を曲げ、最後に「どちらを読み込むべきか」に答えます。
「図式が可換である」とは何を主張しているのか
可換であるとは、始点と終点が同じ有向経路がすべて同じ合成を与えるということです。四隅に A・B・C・D を置き、上辺に f(A から B へ)、右辺に β(B から D へ)、左辺に α(A から C へ)、下辺に g(C から D へ)を描いた正方形なら、「可換である」という主張は β∘f = g∘α というただ一本の等式と同じ内容になります。三角形なら等式が一本、正方形も一本、立方体なら面の数だけ六本——それが一枚の絵に畳み込まれます。図が大きくなるほど、絵が抱える情報と、それを等式で書き下したときの分量の差は開いていきます。可換図式は装飾ではなく、記法の圧縮なのです。
この圧縮がもっとも効くのが 図式追跡(diagram chasing) です。ホモロジー代数の五項補題や蛇の補題の証明は、どこかの角にある対象から元をひとつ取り、矢印に沿って押し出しながら図の中を歩き回る、という形で進みます。可換性は、その歩みの一歩ごとに「どちらの道を通っても同じ場所に着く」ことを保証する規則として働きます。だから図は絵であると同時に、証明を進める盤面でもあります。この描き方が数学の書き方として定着したのは 1945 年の圏論創始の論文以降ですが、その経緯と矢印記号そのものについては矢印のページで扱っています。
図式そのものが数式なので、置き場所は別行立ての数式です。\[ … \] か equation 環境に入れると、独立した行として中央に置かれます。組むためのパッケージは歴史的に何種類も書かれてきました——xypic、diagram、kuvio など——が、いま新しく書くなら選択肢は実質二つです。汎用作図パッケージ TikZ の上に建てられた tikz-cd と、AMS の amscd。以降はこの二つを順に見ていきます。
\usepackage{tikz-cd} と tikzcd 環境——ハイフン一つの落とし穴
プリアンブルに \usepackage{tikz-cd} と書き、本文では \begin{tikzcd} … \end{tikzcd} で囲みます。パッケージ名にはハイフンがあり、環境名にはありません。 取り違えると ! LaTeX Error: File 'tikzcd.sty' not found. になり、逆に読み込みを忘れたまま環境だけ書くと ! LaTeX Error: Environment tikzcd undefined. が出ます。TikZ をすでに読み込んでいるなら \usetikzlibrary{cd} でも同じものが手に入ります。CTAN の現行版は 1.0(2021 年 5 月 4 日)、保守は Augusto Stoffel。矢じりは専用のライブラリとして同梱されており、Computer Modern の矢印に形を合わせて描かれています——本文と図の矢印が別物に見えないのはそのためです。
tikzcd の中身は tabular や matrix とまったく同じ書き方——セルを & で区切り、行を \\ で改める——で書きます。各セルが図の節点になり、中身は自動的に数式モードで組まれるので $ は要りません。そこに \arrow を書き足すと矢印が生えます。短い別名 \ar は完全に同じ命令です。矢印は 出発するセル に書き、角括弧の中で行き先を 方向キー で指定します。r が右、l が左、u が上、d が下。これらは文字列として連ねられ、[rd] なら右下へ斜めに、[rr] なら二つ隣まで届きます。一つのセルから何本出しても構いません。
\usepackage{tikz-cd} % package has a hyphen; environment does not
\[
\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、左辺と右辺にはそれぞれ下向きの α と β が引かれます。& が縦の区切り、\\ が横の区切りで、行列としての骨組みだけを見れば A & B \\ C & D の四文字にすぎません。矢印はその骨組みに後から差し込んだ注釈のようなもので、対象の位置は矢印の書き方に一切影響されません——これが tikzcd の設計のいちばん気持ちのよい点です。
矢印の上と下にラベルを置く——"f" と "f"' の違い
オプションの中に 引用符でくくった文字列 を書けばラベルになり、閉じ引用符の直後に アポストロフィ ' を足すと反対側へ移ります。位置の決まりかたは「上/下」ではなく 進行方向に向かって左 です。右向きの矢印なら左は上——だから \arrow[r, "f"] は f を上に、\arrow[r, "f"'] は下に置きます。下向きの矢印なら左は左側——だから \arrow[d, "\alpha"] は α を左に、\arrow[d, "\alpha"'] は右に置きます。四通りを丸暗記する必要はなく、「進行方向の左」という一つの規則で全部説明がつきます。
一本の矢印にラベルを何枚でも載せられ、それぞれに固有のオプションを付けられます。"\phi" near start は始点寄り、"\eta" near end は終点寄り、そして "h" description はラベルを矢印の 真上に載せて 線のほうを背景色で切り抜きます——短い矢印に長い名前を付けたいときの定石です。ラベル本文やそのオプションにコンマが入る場合は波括弧で守ります("{(x,y)}")。中身は数式モードなので、普通の語句を入れたいときは amsmath の \text{…} を使います。
\[
\begin{tikzcd}
A \arrow[r, "\phi" near start, "\psi"', "\eta" near end] & B \\
X \arrow[r, "h" description] \arrow[rd] & Y \\
& Z
\end{tikzcd}
\]矢印を曲げる・同じ二点に二本引く
bend left と bend right を使い、角度を変えたければ bend left=25 のように書きます。曲げたい理由はたいてい一つで、同じ二つの対象のあいだに写像が二本ある からです。随伴、ホモトピー同値、余等化子の対——どれも二本の矢印が要りますが、まっすぐ引くと重なって一本にしか見えません。曲げれば両方が読めます。曲げずに平行にずらしたいだけなら shift left と shift right(既定 0.56ex)が向いていて、こちらは矢印を直線のまま横へ寄せます。なお「左」はいつも進行方向基準なので、bend left は矢印から見て左へ膨らみます。
立体的な図——三次元の立方体を平面に潰したもの——では、奥の辺と手前の辺が交差します。そのとき crossing over を付けると、その矢印の下に背景色の太い線が先に引かれ、手前を通っているように見えます。矢印は 書かれた順に描かれる ので、下をくぐらせたい矢印が先に来ている場合は、あとのセルから from=uu のように逆向きに指定して描画順をずらします。この二つを知っているかどうかで、立方体の図の仕上がりがまるで変わります。
\[
\begin{tikzcd}
A \arrow[r, bend left=25, "f"] \arrow[r, bend right=25, "g"'] & B
\end{tikzcd}
\qquad
\begin{tikzcd}
A \arrow[dr] & B \arrow[dl, crossing over] \\
C & D
\end{tikzcd}
\]線種と矢じりも、\arrow のオプションにキーを足すだけで切り替わります。名前の付けかたは二系統で、hook や two heads のように 形を説明する短い名前 と、dashrightarrow のように 既存の LaTeX 命令からバックスラッシュを取った名前 です。後者を知っていると、探さなくても当てられます。複数指定して重ねることもでき、\arrow[r, tail, two heads, dashed] は尾つき・二又・破線の矢印を一本で作ります。よく使うキーを次にまとめます。
| キー | 効果 |
|---|---|
hook | 始点側に鈎(⊂)を付ける。包含・単射に |
hook' | 鈎を反対側に付けた版 |
tail | 始点に尾を付ける。単射のもう一つの表記 |
two heads | 矢じりを二重にする。全射に |
dashed | 破線にする。「一意に存在する写像」の慣用表記 |
dotted | 点線にする。TikZ 由来のキー |
squiggly | 波線の矢印 |
equal | 矢印の代わりに二重線(等号)を引く |
maps to | 根元に縦棒を付ける(\mapsto の ↦ に相当) |
Rightarrow | 二重線の矢印。2 射(自然変換)に |
dashrightarrow | \dashrightarrow と同じ形(命令名からバックスラッシュを取った例) |
bend left | 進行方向の左へ弧を描く。bend left=25 で角度指定 |
bend right | 進行方向の右へ弧を描く |
shift left | 曲げずに真横へずらす(既定 0.56ex)。平行な二本に |
crossing over | 下に背景色の太線を敷き、手前を通っているように見せる |
phantom | 矢印を不可視にする。ラベルだけ残るので格子の外に記号を置ける |
description | ラベルオプション。ラベルを線の上に載せ、背景色で線を切り抜く |
ラベルとして同型記号を載せるのもよくある書き方で、\arrow[r, dashed, "\simeq"] は破線の矢印の上に ≃ を置きます(\sim でも同様)。そして tikz-cd は TikZ の上に建っているので、color=…、dotted、in=…/out=… といった TikZ のキーもそのまま受け付けます。表現の幅は事実上 TikZ 全体に及ぶ——ただしそれは、迷ったときに tikz-cd のマニュアルではなく TikZ のマニュアルを引く必要がある、という意味でもあります。
間隔を詰める・引き戻しの角印 ⌜ を置く
間隔は環境の省略可能引数で決めます。\begin{tikzcd}[column sep=large, row sep=small] のように書き、寸法(2em など)でも名前(tiny/small/large/huge)でも指定でき、縦横まとめてなら sep です。ラベルが長い辺だけ広げたいことは実際よくあるので、この二つのキーは覚えておく価値があります。
引き戻し(ファイバー積)の正方形に打つ小さな角印 ⌜ には、専用のキーがありません。定石は 不可視の矢印にラベルだけ載せる ことです。\arrow[rd, phantom, "\ulcorner", very near start] と書くと、phantom が矢印を消し、残ったラベルが左上隅の内側に置かれます(押し出しなら \lrcorner を右下寄りに)。ここでひとつ罠があり、\ulcorner は LaTeX 標準の記号ではなく AMSFonts のものなので、\usepackage{amssymb} を忘れると ! Undefined control sequence. で止まります。phantom のラベルは中央揃え・\textstyle の原寸で組まれるため、小さくしたいときは \scriptstyle を明示します。
\usepackage{amssymb} % \ulcorner comes from AMSFonts, not core LaTeX
\[
\begin{tikzcd}[column sep=large, row sep=large]
P \arrow[r, "p"] \arrow[d, "q"'] \arrow[rd, phantom, "\ulcorner", very near start]
& X \arrow[d, "f"] \\
Y \arrow[r, "g"'] & Z
\end{tikzcd}
\]amscd の CD 環境で足りるのはどんなときか
図が斜め矢印のない長方形の格子で、しかもビルドに TikZ を引き込みたくないとき——amscd の出番はそこです。\usepackage{amscd} で読み込むと、提供されるのは CD 環境 ただ一つ。amsmath バンドルの一部で、現行版は v2.1(2017 年 4 月 14 日)、依存するのは amsgen だけです。おもしろいのはこのパッケージ自身の説明で、AMS-TeX 2.x の可換図式機能を再現したものだと断ったうえで、「単純な長方形の図しか扱えず、斜め矢印やより凝った機能はない」 と明記し、さらに「多くの利用者はもっと強力な図式パッケージのほうが向いているだろう」と述べて diagram・xypic・kuvio の名前まで挙げています。冒頭で読者を他所へ送り出すパッケージは、そう多くありません。
中身は tikz-cd と同じく & と \\ の行列ですが、矢印はすべて @ で始まる特別な綴りで書きます。横は @>>>(右)と @<<<(左)、縦は @VVV(下、V は vertical)と @AAA(上、A を上向きの矢じりに見立てたもの)。二重線の等号は横が @=、縦が @|。矢印を置かない格子点には「空矢印」@. を入れて桁を合わせます。横の矢印は同じ行の対象と対象のあいだに、縦の矢印は対象の真下の行に書きます。
ラベルは矢印を構成する文字の あいだ に挟みます。そしてここに、amscd のラベルの振る舞いを一気に説明してくれる事実があります。AMS の解説によれば、最初の > と二番目の > のあいだの内容は 上付き(superscript) として、二番目と三番目のあいだの内容は 下付き(subscript) として組まれる、というのです。だから @>f>> は f が上、@>>g> は g が下、@>f>g> は上下ともに付きます。ラベルが小さく出るのも当然で、amscd の矢印は要するに 上下に添字を付けた、とても幅の広い関係子 なのです。縦矢印も同じ規則で、添字が左右に出るだけ——@VfVV は下向き矢印の左に f、@VVfV は右に f を置きます。
| 綴り | 意味 |
|---|---|
@>>> | 右向きの矢印 |
@<<< | 左向きの矢印 |
@VVV | 下向きの矢印(V は vertical) |
@AAA | 上向きの矢印(A を上向きの矢じりと見る) |
@>f>> | 右向き矢印の上に f(上付きの位置) |
@>>g> | 右向き矢印の下に g(下付きの位置) |
@>f>g> | 上に f、下に g |
@VfVV | 下向き矢印の左に f |
@VVfV | 下向き矢印の右に f |
@= | 横方向の二重線(等号) |
@| | 縦方向の二重線(@\vert も同じ) |
@. | 空矢印。矢印を置かない格子点の桁合わせに |
\usepackage{amscd}
\[
\begin{CD}
A @>f>> B \\
@V\alpha VV @VV\beta V \\
C @>>g> D
\end{CD}
\]これは tikz-cd の例とまったく同じ正方形です。左辺の α は @V\alpha VV で矢印の左に、右辺の β は @VV\beta V で矢印の右に置いてあり、二本のラベルが正方形の外側を向くようそろえています。下辺は @>>g> なので g は矢印の下です。CD 環境も数式モードなので、tikz-cd と同じく別行立ての数式に入れます。次は AMS のマニュアルに載っている例で、\End が \operatorname 相当の作用素名として定義されている前提です。
% from the AMS amscd manual; \End must be defined as an operator name
\[
\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 を載せた矢印。中央の行が縦の矢印二本を作り、左列は無ラベル、右列は矢印の右に End P。下の行は @= で二つの対象を二重線で結びます。ラベルを波括弧で囲った {\End P} は、複数トークンのラベルを一つの塊にまとめるためです。なお、どうしても amscd の枠内で太い矢印・破線・両向き矢印や色が欲しくなったら、拡張版の amscdx(v2.2x、2019 年)がそれらを足してくれます——ただし 長方形しか描けないという制限はそのまま です。
tikz-cd と amscd はどう使い分けるか
判断はほぼ一問で終わります——斜めの矢印が要るか。要るなら amscd は候補から外れます。長方形の格子だけなら、依存が軽く記述も短い amscd で十分です。以下がその一問を少し細かくしたものです。
- 斜め矢印・曲線が要る →
tikz-cd。amscdは水平と垂直だけで、斜めは原理的に引けません。 - 矢じりや線種を細かく変えたい(単射
hook/tail、全射two heads、破線、二重線) →tikz-cd。 - 単純な長方形の図で足り、依存を軽くしたい →
amscd。TikZ を読み込まないぶん組版が速く、プリアンブルも短いままです。 - 記法の好み:
amscdの@>f>>は短いが独特。tikz-cdの\arrow[r, "f"]は長いが、半年後に読み返しても意味が分かります。 - 出力経路:
tikz-cdの図は DVI ビューアで正しく表示されません。pdflatex・lualatex・xelatexのように PDF を直接出すエンジンか、DVI から PDF/PS に変換する経路が前提です。amscdにこの制約はありません。 - そもそも図が要るか: 対象が二つで矢印が一本なら、
amsmathの\xrightarrow{f}を本文に書くだけで済みます。
最後に、古い文書を引き継いだときのための注意を二つ。tikz-cd には引用符記法が登場する前の書式 \arrow[オプション]{方向}{ラベル}(たとえば \arrow{r}{f})が残っていて、後方互換のためいまも動きます。\rar・\dar・\uar・\lar(および \drar などの斜め版)という短縮命令もあり、\rar は \arrow{r} と同じです。どちらも新規に書くなら避け、\arrow[r, "f"] の一本槍にしておくほうが、あとで自分を助けます。