コードDE描画

プログラミングで図を描く練習

【LaTeX】【tikz入門】ループを使用する方法3選

数式を出力できるLaTeXには線や円、グラフなどの図形を描くことができるtikzパッケージが存在する。

例えば線分を何本も描いたりすると、数値やオプションが違うだけで似たような命令を使うことが多い。

同じようなコマンドが続くとコードが長くなってしまう。そこで、似たような処理を繰り返す場合にループ処理を使って一度にコマンドを記述する方法がある。

ここではループの基本的な使い方について取り上げる。

準備

tikzパッケージを使用するためには、プリアンブル(\\begin\{document\}の前)に次のように記述して、tikzパッケージを使えるようにさせる。

\usepackage{tikz}

ここでエラーが出る場合は、使っている環境にtikzパッケージがインストールされていないので、別途インストールする必要がある。

具体例

1変数のループ

tikzでループを使用する構文は次の通りである。

\drawまたはfillまたはfilldraw \変数 in  {価のリスト}{処理内容};

\\変数を含む処理内容値のリストの内容で順番にループして処理をする。

変数の値のリストはカンマ,で区切る。

例として、左から順に青色が薄くなっていく円の描画をループを使用して記述する。

\begin{tikzpicture}
\foreach \x in {0,1,2,3,4,5}
{
    \fill [blue,opacity=1-0.2*\x] (2*\x,0) circle [radius=1];
}
\end{tikzpicture}
  • 実行結果

1変数のループ
1変数のループ

上の例で次のように色を混ぜる構文にカッコを使うとエラーになる。

  • \[red!\\x*2!blue\]
  • \[red!(\\x*2)!blue\]
  • \[red!\{\\x*2\}!blue\]
  • \[red!\{(\\x*2)\}!blue\]

2変数のループ

次のように変数をスラッシュ/で区切ると、1つのループの中で複数の変数をループできる。

tex 変数x/変数y in {値x1/値y1,値x2/値y2}

例として、色のついた円を描く。

\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];
}
\end{tikzpicture}
  • 実行結果

2変数のループ
2変数のループ

上の\\iroのように、変数の名前は複数のアルファベットでも良い。

変数x値x1,値x2に順に置き換わり、変数y値y1,値y2に順に置き換わる。変数が3つ以上でも同様にスラッシュで変数を区切り、カンマでリストを作る。

スラッシュの数を変数とリストで合わせないとエラーになる。また、スラッシュとカンマの順番を間違えないように注意が必要である。

変数リストを省略

ループで使われる変数の値のリストに規則性がある場合、次のように3つのピリオド...で記述を省略できる。

\変数 in {値1,値2,...,値n}

例として、八芒星を描く。

\begin{tikzpicture}
\foreach \x in {0,45,90,...,315}
{
    \draw (22.5+\x:2) -- (157.5+\x:2);
}
\end{tikzpicture}
  • 実行結果

変数リストを省略
変数リストを省略

省略できる表現は以下のとおりである。

  • 等差数列
    • 順列:1,...,6 -> 1,2,3,4,5,6
    • 逆列:6,...,1 -> 6,5,4,3,2,1
    • 等差順列:0,2,...,10 -> 0,2,4,6,8,10
    • 等差逆列:10,8,...,0 -> 10,8,6,4,2,0
  • アルファベット列
    • 順列:a,...,f -> a,b,c,d,e,f
    • 逆列:f,...,a -> f,e,d,c,b,a
    • 等差順列:a,d,...,z -> a,d,g,j,m,p,s,v,y
    • 等差 逆列:z,w,...,a -> z,w,t,q,n,k,h,e,b

リストの省略方法は次のようになっている。上の構文

\変数 in {値1,値2,...,値n}

において、値2から値nを越えるまで、差分値2-値1の等比列が作成される。値1がないい場合は差分1とみなされる。

また、前後の値は無視されるため、等比数列や階差数列は作れない。

  • 等比数列は作れない:2,4,...,32 -> 2,4,8,12,16,20,24,28,32
  • 階差数列は作れない:1,3,6,...,21 -> 1,3,6,9,12,15,18,21

変数x変数yがともに数字の場合はリストの作成がうまくいかないことがある。

変数が2つ以上のループではこのような省略が使えない

次のような記述はエラーとなる。

\x/\y in {0/100,2/80,...,10/0}

まとめ

ループを扱う構文は次の通りである。

  • 不規則なリストでループ
\foeach \x in {値1,値2,値3,値4...}
{
    コマンド
}
  • 等差規則のあるリストでループ
\foeach \x in {値1,値2,...,値n}
{
    コマンド
}
  • 複数の変数でループ
\foeach 変数x/変数y in {値x1/値y1,値x2/値y2}
{
    コマンド
}
  • 複数の変数でリストの省略はできない

参考リンク

tikz wiki   

追記

ウェブ系のLaTeXであるKaTeXなど、一部の環境では\\iftrue,\\iffalse構文が使えない。そのため筆者はワードプレスのquicklatex環境を使用している。