sankantsuのブログ

技術メモ・競プロなど

TikZ におけるスタイル指定と pgfkeys

概要

TikZ には,グラフィクスの見た目などを調整するための機構としてスタイルというものがある. この記事では,

  • グラフィクスの描画に特定のスタイルを適用する方法
  • 自分でスタイルを定義する方法
  • スタイルの機構そのもののベースとなっているpgfkeysライブラリの基本

について説明する.

  • 参考
    • texdoc tikz Section 12.4 (Using Graphic Options)
    • texdoc tikz Section 88 (Key Management)

スタイルを使う

TikZ にはグラフィクスの調整を行うためのスタイルが大量に定義されており,これを使うだけでかなりの部分の調整を行うことができる.

スタイルを使うには,\draw\nodeなど描画を行うコマンドに対して,\draw[<style name>]などのような形式で[...]内にスタイル名を指定する. 例えば,help linesというスタイルを指定すると,"幅0.2ptで灰色の線にする"という指定ができる.

\begin{tikzpicture}
    \draw             (0,1) -- (2,1);
    \draw[help lines] (0,0) -- (2,0);
\end{tikzpicture}

help linesを指定した下の線が通常よりも細くなっているのがわかる.

スタイルに対して引数を与えることができるものもある. その場合は,<style name>=<val>のような形式で指定を行う. 下の例では,line widthというスタイルに対して5ptという指定を行うことで線の太さを5ptにするという指定を行っている.

\tikz \draw [line width=5pt] (0,0) -- (1,0.1);

複数のスタイルを指定するには,スタイル名をカンマで区切って並べる.

自動で使われるスタイル

every pathevery nodeなど一部のスタイルは,path や node を描くとき明示的に指定しなくても自動で使われる.

スタイル指定を適用する範囲

スタイルは個別の描画コマンドに対して適用するだけではなく特定の範囲全体に対して適用したいという場合がある.

tikzpicture環境内でスタイルを適用する範囲を指定するためのscopeという環境が用意されている. scopeに対してスタイルを指定すると,範囲内のすべてのグラフィクスに対してこのスタイルが適用される.

tikzpicture環境全体にスタイルを適用するには,tikzpicutreに対してスタイルをオプション引数で渡せば良い.

また,プリアンブル中などで\tikzset{<style>,...}のように書くと,文書内のすべてのtikz環境に対してスタイルが適用される.

より広いスコープで指定したスタイルは,より狭いスコープにおける指定で上書きされる.

\begin{tikzpicture}[red]
    \draw (0,2) -- (3,2);
    \begin{scope}[blue]
        \draw             (0,1) -- (3,1);
        \draw[green,thin] (0,0) -- (3,0);
    \end{scope}
\end{tikzpicture}

スタイルの定義

標準で定義されているスタイルを用いるだけでも多くのことができるが,ある組み合わせを繰り返し使うような場合には,これを新しくスタイルとして定義すると便利である.

スタイルの定義は,スタイルの適用と同じようにコマンドのオプション引数に記述する. スタイルの定義は,次のような文法で行う.

<style name>/.style={<style>,...}

例えば,次の例では"太さ5ptで赤い点線にする"というスタイルをmy styleという名前で定義して使っている.

\begin{tikzpicture}[my style/.style={red,line width=5pt,dotted}]
    \draw [my style] (0,0) -- (3,0.1);
\end{tikzpicture}

/.append styleを使うことで,すでに定義されているスタイルに対してさらにオプションを追加することもできる.

\begin{tikzpicture}[help lines/.append style=blue!50]
    \draw              (0,0) grid +(2,2);
    \draw [help lines] (2,0) grid +(2,2);
\end{tikzpicture}

引数付きのスタイルの定義

.styleの定義の中に#1を含めると,引数を受け取ったとき#1が実際の引数で置き換えられる.

\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50}]
    \node [outline=red] at (0,1) {red};
    \node [outline=blue] at (0,0) {blue};
\end{tikzpicture}

スタイル指定の仕組み

<key>=<value>のようにスタイル指定を行ったとき,実際には内部で\pgfkeys{<key>=<value>}が実行されている.(引数なしの<key>なら,\pgfkeys{<key>})

もう少し正確には,必要に応じて<key>/tikz/<key>/pgf/<key>のように補完してから\pgfkeysを実行する. また,与えられた<key>color,allows,shapeの有効なオプション値になっていればその意味で解釈される.

従って,たとえば

\tikzset{red,line width=5pt}

という指定は,

\pgfkeys{/tikz/color=red,/tikz/line width=5pt}

と等価である.

pgfkeys

pgfkeysは,key-value ペアの管理を行うパッケージである. \usepackage{tikz}などとしたとき,pgfkeysも自動で読み込まれる.

単体で用いる場合には\usepackage{pgfkeys}をプリアンブルに書く.

pgfkeysにおいて,各キーの名前はUnixのパス名のような構造をもつ.(/tikz/line widthなど) tikzで定義されているキーは,/tikz/...という名前になっている.

各キーには呼び出されたときに実行されるコードが対応付けられており,<key>に対するコードは<key>/.code=<code>という形式で指定する. <code>内に#1を含めると,その部分は呼び出し時に与えられた引数で置き換えられる.

\pgfkeys{<key>=<value>}のようにキーを呼び出すと,実際に<key>/.codeに設定されたコードが実行される.

例えば,

\pgfkeys{/my key/.code=The value is '#1'.}
\pgfkeys{/my key=hi!}

を実行すれば,/my keyというキーに対してhi!という値でコードの呼び出しが行われ,

The value is 'hi!'.

と出力される.

handler key

<key>/.codeのように,ドットを含むようなキーは特殊なはたらきをもつ. これらのキーを handler と呼ぶ.

以下,いくつか重要な handler キーを説明する.

.default handler

.default ハンドラにより,引数のデフォルト値を設定できる.

\pgfkeys{/my key/.code=(#1)}
\pgfkeys{/my key/.default=hello}
\pgfkeys{/my key=hallo,/my key}

出力

(hallo)(hello)

.cd handler

<key>/.cdを実行することで,続くキーを<key>に対する相対パスで書けるようになる. より正確には,/で始まらないキーを書いたとき,キーの前に補完される default path を変更する.

\pgfkeys{/foo/bar/.code=This is foo bar}
\pgfkeys{/foo/.cd,bar}

出力

This is foo bar

\tikzsetは,.cdハンドラを用いて次のように書くのとだいたい同じ働きである.

\def\tikzset#1{\pgfkeys{/tikz/.cd,#1}}

.style handler

.styleを用いると,あるキーの実行がさらに他のキーの実行を呼び出すようにすることができる.

\pgfkeys{/a/.code=(a:#1)}
\pgfkeys{/b/.code=(b:#1)}
\pgfkeys{/my style/.style={/a=foo,/b=bar,/a=#1}}
\pgfkeys{/my style=wow}

この例では/my style=wowの呼び出しによってさらに/a=foo,/b=bar,/a=wowの3つのキーの呼び出しが行われ,次が出力される.

(a:foo)(b:bar)(a:wow)

動作を考えれば,<key>/.style={<key>=<value>,...}は,<key>/.code=\pgfkeysalso{<key>=<value>,...}と同じである. (\pgfkeysalso\pgfkeysとほぼ同じだが,すでに.cd等で変更された default path を引きつぐという点が異なる)

まとめ

TikZ では,\drawなどの描画コマンドのオプション引数[...]などに特定のキーワードを指定することでグラフィクスの見た目を調整するスタイルという機構が備わっている. スタイルはmy style/.style=...のような記法により,スタイルを自分で定義することもできる.

これらの機構の裏側ではpgfkeysというライブラリが用いられており,TikZ におけるスタイル<key>=<value>の指定は内部で\pgfkeys{<key>=<value>}の実行に置き換えられる.

.stylepgfkeysにおいてhandlerと呼ばれる特殊なキーの1種であり,他のキーを用いて新しいキーを定義するのに利用できる. これは,pgfkeysのキーを TikZ のスタイルとして利用する上では,すでに定義されたスタイルから新しいスタイルを定義するということに読み替えられる.