TikZ の基本

TikZ(ティクス)は、LaTeX の中に直接コードで図を描くための、最も標準的なベクター作図システムです。座標や線、円、矢印、ノードを文章と同じソースに書き、本文と同じフォント・同じ品質で図が組み上がります。外部の作図ソフトを行き来せず、図が文章の一部として再現可能になる——それがこのページの主題です。

PGF と TikZ

まず名前の整理から。土台にあるのが PGF(Portable Graphics Format) で、ドライバの違い(PDF か DVI か)を吸収しながら実際に線を引く 低水準のグラフィックスエンジン です。生の PGF を直接書くのは骨が折れます。そこで、人が気持ちよく書けるように PGF の上にかぶせた フロントエンド(マクロ層)が TikZ です。どちらも Till Tantau が作りました。

名前の TikZ は 「TikZ ist kein Zeichenprogramm」(TikZ は作図プログラムではない)というドイツ語の頭字語で、GNU 流の自己言及的な命名です。読み方は公式には定まっておらず「ティクス」「ティクツ」「ティク・ズィー」などと呼ばれます。実務上は「PGF/TikZ」とひとまとめに語られ、私たちが書くのはほとんど TikZ の側です。

使い始めるのは簡単で、プリアンブルに \usepackage{tikz} と書くだけ。これで PGF も一緒に読み込まれます。pdfLaTeX・LuaLaTeX・XeLaTeX ではそのまま使えます。pLaTeX・upLaTeX のように DVI を経由するときだけ、ドライバ(通常 dvipdfmx)をクラスオプションで指定しておきます。

document.tex
\documentclass{article}   % pLaTeX なら \documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
We are working on
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}.
\end{document}

これは本文「We are working on」に続けて、原点を通る水平線と垂直線(小さな十字)を文中に描き、最後にピリオドを打ちます。図が文字と同じ行に溶け込むのが TikZ の感触です。

tikzpicture 環境

図はすべて **tikzpicture 環境**(\begin{tikzpicture}\end{tikzpicture})の中に描きます。これが一枚の絵を入れる「画用紙」で、中に作図コマンドを並べていきます。環境名のあとの角括弧には、その絵全体に効くオプションを書けます(例: [scale=2] で 2 倍、[thick] で全体を太線に)。

一行だけの小さな図なら、環境を開かずに **\tikz{...} や、命令ひとつだけの \tikz \draw ...; という行内形でも書けます。いずれの形でも、絶対に忘れてはいけない約束がひとつ。各作図コマンドはセミコロン ; で終える** ことです。セミコロンが「このパスはここまで」という区切りで、書き忘れるとエラーになります。初心者がいちばんつまずくのがここです。

latex
% 行内(インライン)
\tikz \draw (0,0) -- (1.5,0);

% 環境(複数のコマンド)
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);
\end{tikzpicture}

パスを描く——座標とパス操作

TikZ の作図は パス(path) を中心に回ります。パスとは「点から点へどう進むか」を書いた経路で、それをどう見せるかを命令の名前で選びます。**\draw は経路を線でなぞり(ストローク)、\fill は閉じた経路の内側を塗り、\filldraw は塗ってから枠線も描き、\path** は経路を定義するだけで何も描きません(後で参照する座標やノードを置くときに使います)。

点の指定(座標)には三通りあります。直交座標 (x,y) は既定の単位がセンチメートルで、(1,2) は右へ 1 cm・上へ 2 cm。単位は (1cm,2pt) のように明示もできます。極座標 (角度:半径)(30:1cm) のように「30 度の向きに 1 cm」を表します。そして座標に名前を付けておけば(名前付き座標)、あとから名前で呼び出せます。相対指定もでき、++(1,0) は現在地から右へ 1 cm 進んで現在地も更新、+(1,0) は更新せずに基準点からの相対だけを表します。

パス操作が経路の「進み方」を決めます。**-- は直前の点から次の点へ 直線**(路線図の駅間のように (a) -- (b) と並べる)。**rectangle は 2 点を対角とする長方形、circle は中心からの円、ellipse は楕円、arc は円弧、grid は格子(方眼)。曲線は .. controls ..**(ベジエ曲線)か、後述する to[bend] で描きます。閉じた図形を作るには末尾に -- cycle を付けて始点へ戻します。

形の引数は角括弧 [...] のキー=値で書くのが現在の作法です。円は circle [radius=10pt]、楕円は ellipse [x radius=20pt, y radius=10pt]、円弧は arc [start angle=0, end angle=30, radius=3mm](0 度から 30 度まで、半径 3 mm の弧)。grid には [step=.5cm] で目盛り間隔を指定します。次の例は薄い方眼の上に、原点中心・半径 1 cm の円と、原点から (1,1) への直線を描きます。

latex
\begin{tikzpicture}
  \draw[step=.5cm, gray, very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (0,0) circle [radius=1cm];
  \draw (0,0) -- (1,1);
  \fill[blue!20] (0,0) rectangle (0.5,0.5);
\end{tikzpicture}

この絵は、(-1.4,-1.4) から (1.4,1.4) まで 0.5 cm 刻みの灰色の薄い方眼を背景に、原点中心の円、原点から右上 (1,1) への斜め線、そして原点から 0.5 cm 四方を薄い青で塗った小さな正方形を重ねたものになります。blue!20 は「青 20 %」を意味し、白と混ぜた淡い青です。

ノード——文字と図形を置く

ノード(node) は、指定した座標に 文字や図形を置く 仕組みで、図にラベルを付けるときの主役です。基本形は \node[オプション] (名前) at (座標) {中身};。オプションには draw(枠を描く)、circlerectangle(形)、fill=blue!20(塗り)などを並べます。丸括弧の 名前 がこのノードの呼び名になり、あとで (名前)(名前.north) のように位置を参照できます。

実務で頻出するのが、ノードを先に名前付きで置き、そのあと名前どうしを線でつなぐ という型です。座標を直接書く代わりにノード名で結べるので、配置を変えても線が自動的に追随します。

latex
\begin{tikzpicture}
  \node (a) at (0,0)   [draw, circle, fill=blue!20] {A};
  \node (b) at (2.5,0) [draw, circle, fill=blue!20] {B};
  \draw[->] (a) -- (b);
\end{tikzpicture}

この絵は、淡い青で塗った円の中に「A」と「B」を入れたノードを横に 2.5 cm 離して置き、A から B へ矢印付きの直線を引きます。線はノードの縁で自然に止まり、円にめり込みません。

ノードはパスの 途中 にも置けます。\draw (a) -- (b) node[midway] {ラベル}; のように書くと、a から b への線の 中点midway)にラベルが乗ります。abovebelow を足せば線の上下にずらせます。線に説明を添えるとき定番の書き方です。

オプションとスタイル

線の見た目は角括弧の オプション で細かく操れます。よく使うのは、太さの thin / thick / very thick、色の redblue!50、破線の dashed や点線の dotted、角を丸める rounded corners、そして矢印です。矢印は **->(終端に矢じり)、<-(始端)、<->**(両端)。じつは「- を含む未知のオプション」はすべて矢印指定と解釈される、というのが TikZ の割り切った設計です。

オプション意味
thick / very thick線を太く(ultra thick まである)
red, fill=blue!50線の色・塗りの色(!n で濃さ)
dashed / dotted破線・点線
rounded corners折れ線の角を丸める
->, <-, <->終端・始端・両端の矢じり
scale=2その図(や経路)を 2 倍に拡大

同じ装飾を何度も書くなら、スタイルとして名前を付けて使い回す のが定石です。\tikzset{名前/.style={...}} でプリアンブルに定義しておくか、tikzpicture のオプションにその場で定義します。たとえば次は「help lines」というスタイルを定義し、方眼に適用します。

latex
\tikzset{help lines/.style={color=blue!50, very thin}}

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \draw[thick, red, ->, rounded corners] (0,0) -- (1,2) -- (3,2);
\end{tikzpicture}

この絵は、(0,0) から (3,2) までの薄い青の方眼の上に、原点から (1,2)、さらに (3,2) へと折れ曲がる赤い太線を引き、折れ角は丸め、終端に矢じりを付けたものです。スタイルにしておけば、very thinthin に直すだけで方眼全体の見え方をまとめて変えられます。

ライブラリ——必要な機能を読み込む

TikZ の本体は意図的に小さく保たれ、専門的な機能は ライブラリ に分かれています。プリアンブルで \usetikzlibrary{...} と必要なものだけ読み込みます(複数はカンマ区切り)。よく使うものを挙げます。

  • arrows.meta** — 豊富で調整可能な矢じり(-{Stealth}-{Latex} など)。旧来の arrows は非推奨で、今はこちらを使います。
  • positioning** — ノードを相対配置。right=of abelow=1cm of b のように「あのノードの右」「あのノードの 1 cm 下」と書けます。
  • calc** — 座標の計算。($(a)+(1,0)$) で「a の右 1 cm」、($(a)!0.5!(b)$) で「a と b の中点」を求められます。
  • shapes** — 円や四角以外の豊富なノード形状(ひし形・星・吹き出しなど)。shapes.geometric などに細分。
  • decorations** — 経路を波線・ジグザグ・ブレースなどに装飾。decorations.pathmorphing ほか。
  • patterns** — 塗りをハッチング(斜線・点)などの模様にする。
  • fit** — 複数のノードを囲む箱を自動で作る。
  • backgrounds** — 図の背景レイヤーに枠や下地を描く。
  • matrix** — ノードを格子状(行列状)に整列。graphdrawing は自動レイアウト(LuaTeX 必須)。

次の例は arrows.metapositioning を組み合わせた小さなフローチャートです。最初のノードだけ座標を与え、残りは「右」「下」と相対指定で並べ、Stealth 型の矢じりでつなぎます。

document.tex
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning}

\begin{tikzpicture}[node distance=1cm, every node/.style={draw, rounded corners}]
  \node (start)            {Start};
  \node (proc)  [right=of start] {Process};
  \node (end)   [right=of proc]  {End};
  \draw[-{Stealth}] (start) -- (proc);
  \draw[-{Stealth}] (proc)  -- (end);
\end{tikzpicture}

この絵は、角を丸めた枠のノード「Start」「Process」「End」を 1 cm 間隔で左から右に並べ、Stealth 型のシャープな矢じりで順につないだ横並びのフローチャートになります。every node/.style で全ノードに共通の見た目を一括指定しているのがポイントです。

コンパイル時間と externalize

TikZ の図は LaTeX が一本ずつ計算して描くため、複雑な図や枚数が多い文書では コンパイルが目に見えて遅く なります。とくにプロットや密な格子は重くなりがちです。

対策の定番が externalize ライブラリ です。\usetikzlibrary{external} を読み込み \tikzexternalize を宣言すると、各 tikzpicture を一度だけ個別の PDF に書き出して キャッシュ します。次回以降、図の中身が変わらなければ計算をやり直さず、できあがった PDF を貼り込むだけ。最初の処理は時間がかかりますが、その後の編集サイクルが劇的に速くなります(図を直すと自動で再生成されます)。大きな図は別ファイルに切り出して standalone クラスで単独コンパイルする手もあります。