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 path
やevery 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>}
の実行に置き換えられる.
.style
はpgfkeys
においてhandlerと呼ばれる特殊なキーの1種であり,他のキーを用いて新しいキーを定義するのに利用できる.
これは,pgfkeys
のキーを TikZ のスタイルとして利用する上では,すでに定義されたスタイルから新しいスタイルを定義するということに読み替えられる.