2015年7月9日

LaTeXで可換図式:tikz-cd

図式を描くパッケージtikz-cdの紹介.その名の通り内部でTikZを使う.

はじめに

tikz-cdは次のような図式を書くためのパッケージです.

よく使われるのがXy-pic\xymatrixですが,それと非常に似た書式で記述が可能です.TikZのライブラリの一つです.

使い方

W32TeX,TeX Liveのどちらにも入っているので,ある程度新しい環境ならば既にインストールされていると思います.プリアンブルは次のようにします.

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\usetikzlibrary{cd}

[dvipdfmx]はドライバ指定です.platex + dvipdfmx以外を使う場合は,それに応じて正しく指定してください.tikz-cd.styというのが用意されていたりもするので,次でもできます(古くからの方法).

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz-cd}

とりあえず

tikzcd環境で使います.さきほどのソースは次の通り.

\begin{tikzcd}
A \arrow[r,"f"]\arrow[rd] & B \arrow[d,"g"]\\
& C
\end{tikzcd}

ディスプレイにしたい場合は,

\[
\begin{tikzcd}
A \arrow[r,"f"]\arrow[rd] & B \arrow[d,"g"]\\
& C
\end{tikzcd}
\]
のようにさらに\[\]で囲めばよいでしょう.tabularのような表組みで並べ,\arrowで矢印を引きます.\arrowの書式は
\arrow[<option>]
で,optionで矢印に関する様々な指定を行います.ほぼ必須となるのが矢印の方向です.
\arrow[r]
で,右方向への矢印を引きます.\arrow[l]で左,\arrow[u]で上,\arrow[d]で下です.右下は\arrow[rd],右右下は\arrow[rrd]等々…….他にも色々なオプションを指定できます(下で説明).

矢印にラベル(上のfやgなど)を加えたいならば,""で囲んでoptionに指定します.上の

\arrow[r,"f"]
でfがラベルとしてついています.このように,複数のオプションを指定する場合はカンマで区切ります.ラベルにオプションを与えるには,直後に連ねます.例えば
\arrow[r,"f" red]
でfが赤くなります.複数のオプションを指定するときは,"f"{near start,red}とします.なお,たまにエラーが発生します.例えば\arrow[r,"(x)"]とするとエラーになります.\arrow[r,"{(x)}"]のように{}で囲うと解決します.

いくつかオプションを例とともに紹介します.

\begin{tikzcd}
A \arrow[r,"f"] & B \arrow[r,"g"'] & C
\end{tikzcd}

ラベルの直後に'を入れると,ラベルのつく場所がひっくり返ります.

\begin{tikzcd}
A \arrow[r,hookrightarrow] & B
\end{tikzcd}

LaTeXでの\hookrightarrowに対応.普段の矢印出力命令はそのままオプションとして指定できることがあります.

\begin{tikzcd}
A  & \arrow[l,hookrightarrow] B \arrow[r,hookleftarrow] & C & D\arrow[l,hook']
\end{tikzcd}

hookrightarrowを左向きにやると上みたいに微妙になります.「hookleftarrowを逆向きに引く」ことでいい感じの出力になりますが,逆方向に引くのが直感的でないので,最後の指定がよいでしょう.なお,\arrow[r,hookrightarrow]\arrow[r,hook]とも書くことができます.これに'をつけて「ひっくり返した」のが上の指定.といっても何でも'をつけたらひっくり返ると言うわけじゃなくて,上はhook'で一つのオプションです.\arrow[l,hookrightarrow']と指定できるわけじゃない.

\begin{tikzcd}
A \arrow[r,dash] & B \arrow[r,equal] & C \arrow[r,dotted] & D \arrow[r,dashed] & E
\end{tikzcd}

矢印(じゃないのもあるけど)を色々と.

\begin{tikzcd}
A \arrow[r,"f" description] & B
\end{tikzcd}

間に挟むときはこれ.

\begin{tikzcd}
A\arrow[rd,"\sim" sloped] & \\
& B
\end{tikzcd}

slopedをつけると,ラベルがいい感じに傾いてくれる.

\begin{tikzcd}
A \arrow[d,shift left=1.5ex] \arrow[r,shift right=1.5ex] & B\\
C \arrow[u,shift left=1.5ex] & D \arrow[lu,shift left=1.5ex]
\end{tikzcd}

矢印をずらしたいとき.A --> Cの矢印はleftといいながら右にずれていますが,まぁそういうものです.

\begin{tikzcd}
A \arrow[r,yshift=0.7ex] & B \arrow[l,yshift=-0.7ex]\\
C \arrow[u,xshift=1.5ex]
\end{tikzcd}

これでもずらせる.これは縦横独立.

\begin{tikzcd}
A \arrow[r,bend right] & B \arrow[l,bend right]
\end{tikzcd}

少し迂回する矢印.bend right=90とかすると矢印が出入りする位置を調整できる.

\begin{tikzcd}
A\arrow[loop right,"f"]
\end{tikzcd}

自分に戻ってくる矢印.戻ってくるのでrとかの方向の指定は不要です.loop aboveとすると上で回る.loop belowloop leftがある.in=135,out=45,loopとすると,左上から出て右上に戻ってくる矢印になる.

\begin{tikzcd}
A \arrow[r,phantom,"\ni"] & a
\end{tikzcd}

phantomを指定すると矢印が消えて,代わりに真ん中にラベルが現れる.

\begin{tikzcd}
A\arrow[r,very near start,"f"] & B \arrow[r,pos=0.8,"g"] & C 
\end{tikzcd}

ラベルの場所を変更する.very near startはそのまま「スタート地点のすぐ近く」.他にはat start, very near start, near start, midway, near end, very near end, at endが使えます.pos=は数値で指定する方法.0から1までの値を指定します.

\begin{tikzcd}
A\arrow[r,bend left=50,""{name=F,below}]\arrow[r,bend right=50,"" name=G]\arrow[Rightarrow,from=F,to=G,"\alpha"] & B
\end{tikzcd}

矢印につけた空のラベルに名前をつけて(それぞれF,Gとつけた)その間に矢印を引く.Fの矢印にbelowを指定しているので(空の)ラベルは矢印の下についています.これがないとちょっとかっこ悪い.""'{name=F}でもよい.オプションが一つなので省略できるので,""' name=Fでもよい.

\begin{tikzcd}
A\arrow[rd] & B\arrow[ld,crossing over]\\
C & D
\end{tikzcd}

矢印を重ねる.AからDに伸びる矢印を上にしようとしてそちらにだけcrossing overを書こうとしてもうまく行きません.これは「上に重ねる矢印は後から描く必要がある」という制約によります.Dの位置に\arrowを書くことにして,fromキーにより始点を修正するとよいでしょう.または\arrow[ul,leftarrow]と逆向きに矢印を引いても同じです.

\begin{tikzcd}
A & B\arrow[ld]\\
C & D\arrow[from=ul,crossing over] % ulの位置,つまりAの位置からここに矢印を引く
\end{tikzcd}
\begin{tikzcd}[row sep=0.1cm,column sep=5cm]
A\arrow[r]\arrow[d] & B\arrow[d]\\
C\arrow[r] & D
\end{tikzcd}

間を広げるならばrow sepcolumn sepをオプションで与えます.具体的な数字以外にも,tiny, small, scriptsize, normal, large, hugeを与えることもできます.

\begin{tikzcd}
A\arrow[r]\arrow[d] &[2cm] B\arrow[d]\arrow[r] & C\arrow[d]\\
D\arrow[r]\arrow[d] & E\arrow[r]\arrow[d] & F\arrow[d]\\[-.5cm]
D\arrow[r] & E\arrow[r] & F\\
\end{tikzcd}

前のは全体に広げちゃうけど,これは個々に指定できます.相対的な値を指定します.[-.5cm]は他より0.5cm短くするということ.

インライン

インラインで図式書きたいこととかありますよね.例えばこんなん.

これは次のように出しました.

埋め込み$\begin{tikzcd}[cramped,sep=small]Z\arrow[hook,r,"i"] & X\end{tikzcd}$を考える.

tikzcd環境はインラインでも問題なく使えますが,前後に大きめの空きが入ります.これをcrampedで抑制します.更に対象同士の空きがデフォルトだと大きいのでsep=smallで小さくしています.矢印次第で短くなりすぎるので適宜調整を.数式環境にくるまなくても内部で数式は使えるのですが,数式前後の二分空きが入らなくなってしまうので$で囲んでいます.

beamerと

beamerと使うとエラーが出ます.次の二つの解決方法があります.

  • frame環境にfragileオプションをつける.fragileオプションについてはbeamerのマニュアルかここを参照.

    \begin{frame}[fragile]
    \begin{tikzcd}
    A \arrow[r] & B
    \end{tikzcd}
    \end{frame}
    
  • tikzcd環境にampersand replacement=\&オプションをつけ,tikzcd環境内で使う&を全て\&にする.

    \begin{frame}
    \begin{tikzcd}[ampersand replacement=\&]
    A \arrow[r] \& B
    \end{tikzcd}
    \end{frame}
    

    このエラーは,tikzcd環境内では一時的に&の役割が変わる(「アクティブになる」)ことに起因しているので,その文字を変更することが対処しています.変更先は\&である必要はなく,好きな命令にできます.例えばampersand replacement=\ampersandとしても動きます.なお,この方法は以下のように「tikzcd内に他の&が現れる」時にも有効です.

    % \usepackage{amsmath}
    \begin{tikzcd}[ampersand replacement=\&]
    F \arrow[r,"{\begin{pmatrix}a & b\end{pmatrix}}"] \& 
    \begin{pmatrix}
    F & F
    \end{pmatrix}
    \end{tikzcd}
    

WYSIWYG

tikzcd-editorを使えば,WYSIWYGで可換図式を描くことができます.もちろんtikz-cdのコードを吐き出せます.ここから利用可能です.

マニュアル

コマンドプロンプトから

texdoc tikz-cd
でマニュアルが開けます.物足りない場合は見てください.

Tikzとの関係

Tikzに既に詳しい変人むけ注意.

  • \arrowのオプションはTikzの\pathに回されます.ので,\pathで使えるオプションが自由に使えます.
  • 内部ではTikzの\matrixmatrix of nodesオプション付きで使っています.ので,各頂点には|[<オプション>]|でオプションを与えることができます.例えばこんな感じ.
    \begin{tikzcd}
    |[shape=circle,draw]| A\arrow[r] & |[fill=pink]| B
    \end{tikzcd}

蛇の補題が描きたい

TikZワールドへ

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です