【LaTeX】【tikz】ループと分岐を組みあわせて描画する例5選
数式を扱えるLaTeXには、線や円などを描けるtikzパッケージがある。
コマンドを使って描画するのだが、似た様な図形を何度も描くことがある。
その様な場合に便利なループや条件分岐を扱うための構文が存在する。
ここではループの中で条件分岐を使った描画の具体例を5つ示す。
今回は次の4つの構文を扱う。
- ifnum
- ifodd
- pgfmathparse
- pgfmathresult
準備
tikzパッケージを使用するためには、プリアンブル(\\begin\{document\}
の前)に次のように記述して、tikzパッケージを使えるようにさせる。
\usepackage{tikz}
ここでエラーが出る場合は、使っている環境にtikzパッケージがインストールされていないので、別途インストールする必要がある。
具体例
ifコマンドのみを使って単純な条件分岐
ifnumコマンドと不等号を使用
数値を比較して条件分岐を実装する構文がifnumコマンドでアル。次のような文法になっている。
\ifnum数値1比較演算子数値2 真の場合に実行する \else 偽の場合に実行する \fi
以下に不等号を使用 した例を示す。
\begin{tikzpicture} \foreach \x/\iro in {0/red,60/orange,120/yellow,180/green,240/blue,300/purple} { \fill [\iro] (\x:2) circle [radius=1] node [text=\ifnum\x<60 white\else\ifnum\x>180white\else black\fi\fi] {\LARGE{hello}}; } \end{tikzpicture}
- 実行結果
角度で文字色を分けた。角度xが$0<x<240$の時は白、それ以外は黒にした。オプションに空白や改行が入るとエラ〜になるため、条件分機の部分を1行で記述している。
使用できる比較演算子は次の3つである。
- 大なり:$>$
- 小なり:$<$
- イコール:$=$
イコールを含んだ不統合は使用出来ない。そのような条件を使いたい場合は、elseを利用する。
ifnumコマンドと等号を使用
上記のように0/red
と数字と文字列の2篇数を1つのループ出使った場合、数字をイコールで比較するとエラーになる場合がある。
その場合は以下のように数字のみ改めてループを作って処理をする。
\begin{tikzpicture} \foreach \x/\iro in {0/red,60/orange,120/yellow,180/green,240/blue,300/purple} { \fill [\iro] (\x:2) circle [radius=1]; } \foreach \x in {0,60,...,300} { \def\iro{\ifnum\x=180black\else\ifnum\x=120black\else\ifnum\x=60black\else white\fi\fi\fi} \node [text=\iro] at (\x:2) {\LARGE{hello}}; } \end{tikzpicture}
- 実行結果
ifoddコマンド
数値が偶数か奇数かを判断する条件分岐コマンドが特別に用意されている。文法は次の通りである。
\ifodd数値 奇数の場合 \else 偶数の場合 \fi
具体例として、斜めからの立方体の見取図を描。
\begin{tikzpicture} \foreach \x in {0,...,6} { \draw [\ifodd\x dashed\fi] (0,0) -- (30+\x*60:2); \draw (30+\x*60:2) -- ({30+(\x+1)*60}:2); } \end{tikzpicture}
- 実行結果
ifコマンドとpgfmathコマンドを使って複雑な条件分岐
数式を使う
条件に数式を使うことでより複雑な条件を作ることができる。
まず次のようなコマンドを使って数式を定義する。
\pgfmathparse{数式}
上記のコマンドの使用後に次のようなコマンドを使うと計算結果を取得できる。
\pgfmathresult
以下に計算式を使った一例を示す。mod関数は剰余を求める計算式である。
\begin{tikzpicture} \foreach \x in {0,...,10} \foreach \y in {0,...,15} { \pgfmathparse{int(mod(\x-\y+16,4))} \foreach \i/\iro in {0/red,1/yellow,2/green,3/blue} { \ifnum\pgfmathresult=\i \fill [\iro] (\x*0.5,\y*0.5) circle (0.1); \fi } } \end{tikzpicture}
- 実行結果
使える関数を以下列挙する。
- 論理演算関数
- and
- or
- not
- 三角関数
- sin
- cos
- tan
- 三角関数の逆関数
- asin
- acos
- atan
- 三角関数の逆数関数
- sec
- cosec
- cot
- ハイパボリック関数
その他の関数
ここで次のような注意事項がある。
論理演算子の引数は0をfalse,1をtrueとして扱う。戻り値は0、1のいずれかとなる
- 三角関数や逆三角関数は度数ではなくラジアンで扱う。tikzパッケージ全体と異なるので注意
- 自然対数はlogではなくlnであり、log関数は存在しない
論理演算式を使う
以下のように論理式を使うと、複雑な条件を作ることができる。
\begin{tikzpicture} \foreach \x in {0,...,10}{ \foreach \y in {0,...,15}{ % x%3=0 & y%5=0 \pgfmathparse{and(equal(mod(\x,3),0), equal(mod(\y,5),0))} \ifnum\pgfmathresult=1 \def\iro{yellow} \fi % x%3=0 & y%5!=0 \pgfmathparse{and(equal(mod(\x,3),0), not(equal(mod(\y,5),0)))} \ifnum\pgfmathresult=1 \def\iro{blue} \fi % x%3!=0 & y%5=0 \pgfmathparse{and(not(equal(mod(\x,3),0)), equal(mod(\y,5),0))} \ifnum\pgfmathresult=1 \def\iro{red} \fi % not( x%3=0 | y%5=0 ) \pgfmathparse{not(or((equal(mod(\x,3),0), equal(mod(\y,5),0)))} \ifnum\pgfmathresult=1 \def\iro{black} \fi \fill [\iro] (\x*0.5,\y*0.5) circle (0.1); } } \end{tikzpicture}
- 実行結果
まとめ
tikzパッケージでのループの中で条件分岐する構文は次の2つである。
ifnum数値1比較演算子数値2
ifodd数値
また、次のような構文で複雑計算をすることができる。
```tex \pgfmathparse{数式} \ifnum\pgfmathresult=数値 コマンド \else コマンド \fi
### 参考リンク [tikz wiki](https://texwiki.texjp.org/?TikZ) [texマクロwiki](https://texwiki.texjp.org/?TeX入門%2Fマクロの作成)