図式を描くパッケージtikz-cdの紹介.その名の通り内部でTikZを使う.
はじめに
tikz-cdは次のような図式を書くためのパッケージです.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvg0bI72moYwhJl8JWzRU5-JqiFGp_RRB3AS1KV6Wxzagj1eH3SCKucl2J4-H1s0QEup1snYjjsD-894XrwKWZJoxVloMMUnpRuQs4TFpufJDvnnxPU0HO1ZU69Yq6sCcNFgSIhHx7dKY/s1600/tikzcd.png)
よく使われるのが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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsfx8NTBuxc-q5lgR4ZddCl9y8QS2kj4YL_oSpufgCdowPE086Zmb1zMTK2luF3Ml7nU8C4-RSWcfbUSn6gHnRr5qOmXMpy6A1Uls1uhHRWjZBLrfRH2IOOlQMqiO9VSUoJl3vsXgn-NY/s1600/tikzcd.png)
ラベルの直後に'
を入れると,ラベルのつく場所がひっくり返ります.
\begin{tikzcd}
A \arrow[r,hookrightarrow] & B
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGxGBxs4x7N3z3TeJdVTSpFREDUg6iRDbr8vfG8agXeUL2_zffak4kbQBHB12Dp9aRaHn-OJ2bEa2ZLwwZbm_MubrY-JH-JXo5UMWRjoDh_ZJWwJkFM5C5wwEDhdWrba5hJpoN8E9Iouc/s1600/tikzcd.png)
LaTeXでの\hookrightarrow
に対応.普段の矢印出力命令はそのままオプションとして指定できることがあります.
\begin{tikzcd}
A & \arrow[l,hookrightarrow] B \arrow[r,hookleftarrow] & C & D\arrow[l,hook']
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXMPhyphenhyphenkvPLZ9iXQN0Mm2EsJqW_SevNkaay9Wbben_zV4xgJ7TkorfyUj3M7jM7PQKHl_fspSUbamBJpXg7Mn58R3SY74oFIPO1deZhi-VVv2acVcNxA68M-t4Cmpd7jSJsRwuBLLV91TY/s1600/tikzcd.png)
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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB9zJO74XIGDL27EHCggREYGwR34mSdkqa0DPs4WjKLaB53iYpusSBD-1mRFHq4dW_CMU39auKKBQNX-jPqE4xvTV98hGl5a4zWQCLfEWIXapOzNl_1difFoccC-gPX_wRhWNNJ8X7_kI/s1600/tikzcd.png)
矢印(じゃないのもあるけど)を色々と.
\begin{tikzcd}
A \arrow[r,"f" description] & B
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj9vAXDlQyC18cZHGM4FcCawZrbTaYGj4C3EKOMjOuqXwbjXUrxILl0CtJ4JM823eB8Vga9u8_ydPhEKgH7kRvcmde0Tu9ZQjlAJ1V3Qo-VzMw_jYSVk3pAbMDYx5EsXJy1uPsu9FE1AA/s1600/tikzcd.png)
間に挟むときはこれ.
\begin{tikzcd}
A\arrow[rd,"\sim" sloped] & \\
& B
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSW3bc9LHLXUtDx2UkYDVNrpR21FJiGK0yF4ndgbdyBGMdFyYY0VwBhmmZzg4ATaJoQl2AyUlTrdNffmzvcLZVEgew1IWEXgtWRwrFVOUQ-aBnLQ4aKGdO2FPTXLZu6lOU66yEbSh_oZA/s200/equation.png)
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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPbt2o_jwFxYjlGJbxJDq-KHx7MJkZpfppnTD1wPN6ali9Lpay8knsjBwQv-kDcy1GuY_IMqVGuxljOZ4AnYom3oM9ris15OtZ531dXDOsEWDyG0ROUVEg03ddAXVooDabdGrZNkqvoKE/s1600/tikzcd.png)
矢印をずらしたいとき.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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO27E_69RMncvL9al0SANFA5wXISKzz7O18-3ZEKiyJmI4T4112bv94k8co-1KIApSf6CYIjVVDIxbhT330qqknG0CfBLDo7hLd6taP9sVyYAstLm7eP4NMFNNUC8pJ5csrIgcd8UK-OA/s1600/tikzcd.png)
これでもずらせる.これは縦横独立.
\begin{tikzcd}
A \arrow[r,bend right] & B \arrow[l,bend right]
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSSgS1S2EW7D6GSufnjrx7CGzwTDiEBI2dnb-HSgxX-2_SQcQChTkEntfNQ-gcKd3K_2Q4ENatsxFwGCcj8I9tOoYm1hDoao0eEoFvm5_tXzw5uly6b2_LAMO9lu6BQk8R02cH0KLJbV8/s1600/tikzcd.png)
少し迂回する矢印.bend right=90
とかすると矢印が出入りする位置を調整できる.
\begin{tikzcd}
A\arrow[loop right,"f"]
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb9nlySJ4xdAsVybjr9cF6tjd1nSAJ8E-jDnWjoqERShMIljn9MHTHRJL69ohw5k6LtEVJSo4wFikGRY6XWjBY5dI0hvA8Kch2gnfx-oilCK8oMBgTD2DmjvFwIYKlkkbgyQEXQnVU_l0/s0/eq.png)
自分に戻ってくる矢印.戻ってくるのでr
とかの方向の指定は不要です.loop above
とすると上で回る.loop below
,loop left
がある.in=135,out=45,loop
とすると,左上から出て右上に戻ってくる矢印になる.
\begin{tikzcd}
A \arrow[r,phantom,"\ni"] & a
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrp7m1hJXLykHodwRVvOBAfbBuhyRnWu7mKCdp5AKyC8XtOdRScCoyP-LFIJ8HdbHjT1jYIB87ggWeYM8KGW0oWqP8AWtrKqiSrTAIxegLoDHF4hyphenhyphen2FERqJehh7zGYmnRtLzepXA1PYFk/s1600/equation.png)
phantom
を指定すると矢印が消えて,代わりに真ん中にラベルが現れる.
\begin{tikzcd}
A\arrow[r,very near start,"f"] & B \arrow[r,pos=0.8,"g"] & C
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPY_m8AIYlyn119BYE11OOLHALHcZTBHOs-tixnKGGVwqx7TkaORJtmSQbdwS00phFc7aVDuuGC_vgJzGE3x2qz81XH6cea5J0NeIf-b9zjGmSGpIp62RL9rZ6tv-QjSmkhYgskTO2T8I/s1600/equation.png)
ラベルの場所を変更する.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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-kvAlazhy-eHSMMFhsN9WopWg1dOTUIzDEBX0TD8P27nxchCcbHYOlwkUKUpUkOl7t70S1lKWQx8WxqmMIqDNtSipAaoTcy-q4nmrjcFtnOZkw6HN5vYB_Ui8gbzSnW0hn7D2rUt9eWc/s200/equation.png)
矢印につけた空のラベルに名前をつけて(それぞれF,Gとつけた)その間に矢印を引く.Fの矢印にbelow
を指定しているので(空の)ラベルは矢印の下についています.これがないとちょっとかっこ悪い.""'{name=F}
でもよい.オプションが一つなので省略できるので,""' name=F
でもよい.
\begin{tikzcd}
A\arrow[rd] & B\arrow[ld,crossing over]\\
C & D
\end{tikzcd}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQD6mfhguUKUNujJvt8TuuhDoHJP14RPcPCXMKg-FQbYoxT_hN_QYIVrxsSWU87_K_Qw7baKE5aFeGAJIagpcoJ_xI0dH_jNFK14uOix8QT-y3FVZJZcjR-lnDB4Gxm2MIf7CNF_ImGVk/s200/equation.png)
矢印を重ねる.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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghu4S1hiueHM7S9OzPde4Y5uTYwTurNd17Qpg78dsyNkXiv3dhG-4AhhKDl9qVJ-H8sTrHxj7XULkJf1mDwB2Rx7CFwGMPoF3TfFv4Tb-irUGr7Be98LH_V8cxsGmXv1sJnej96rF3Iso/s1600/equation.png)
間を広げるならばrow sep
とcolumn 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}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKA1gVbh-0zhXMIFLTiN3DcVyvehTE5NQS1d2Uv23Y8IMZi9c52VcqGTAEzvOXJDlWmm_w-jJSX19qJlUTXOZorhJT7RQ9gld1zOHKEM0hHln2_SZYWx9KSrq2PKNcyNS5jKDO9Nr55BU/s1600/equation.png)
前のは全体に広げちゃうけど,これは個々に指定できます.相対的な値を指定します.[-.5cm]
は他より0.5cm短くするということ.
インライン
インラインで図式書きたいこととかありますよね.例えばこんなん.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMV7a5t0NNQUIGvMBsXR9j6Moa-y4u-OIq-wC8Qs2PFNkQC-ti4TMrgxVVhm7v8O_Rru_uCEshitpP_ozM9QvCayCu6Jhsv6xiU_0Y5h6cS7Fa51x5A_BfqfoYEaWSbeRCVlkUPykxnpo/s400/equation.png)
これは次のように出しました.
埋め込み$\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の
\matrix
をmatrix of nodes
オプション付きで使っています.ので,各頂点には|[<オプション>]|
でオプションを与えることができます.例えばこんな感じ.\begin{tikzcd} |[shape=circle,draw]| A\arrow[r] & |[fill=pink]| B \end{tikzcd}
0 件のコメント:
コメントを投稿
コメントの追加にはサードパーティーCookieの許可が必要です