LaTeXにおけるTikZによるベクターグラフィックス描画技法

基本図形とパス制御

TikZはLaTeX環境内で宣言的に図形を記述するためのパッケージです。座標系を定義し、直線・直角経路・基本形状を組み合わせることで複雑な構造を描けます。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw[thick, ->] (-1,0) -- (6,0) node[right] {$x$};
  \draw[thick, ->] (0,-1) -- (0,6) node[above] {$y$};
  
  \draw[red, line width=1.2pt] (1,1) |- (3,2); % 垂直→水平
  \draw[blue, line width=1.2pt] (1,1) -| (3,2); % 水平→垂直
  
  \draw[green!60!black] (4,2) circle [radius=0.8];
  \draw[orange, thick] (2,4) ellipse [x radius=1.5, y radius=0.6];
  \draw[purple] (0.5,3) rectangle (2.5,5);
  
  \draw[cyan] (0,0) -- (1,1 |- 3,2); % 座標交点の自動計算
  \draw[brown, dashed] (4,4) -- (5,4.5) -- (5.5,3.5) -- cycle; % 閉じた多角形
\end{tikzpicture}
\end{document}

曲線表現と関数プロット

円弧・三角関数・ベジェ曲線は、パラメータ指定や制御点(control points)を用いて柔軟に描画できます。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw[magenta, thick] (0,0) arc [start angle=30, end angle=150, radius=2];
  
  \draw[blue, domain=0:3.1415] plot ({\x}, {sin(\x r)}) node[right] {sin};
  \draw[red, domain=0:3.1415] plot ({\x+2}, {cos(\x r)}) node[right] {cos};
  
  \draw[green!50!black, ultra thick] 
    (0,0) .. controls (1.5,3) and (3,3) .. (4,0);
\end{tikzpicture}
\end{document}

グリッド・塗りつぶし・パラメトリック描画

背景グリッドの生成、形状の内部塗りつぶし、および数学関数のグラフ化は、描画オプションと `plot` コマンドで実装します。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw[step=0.5, gray!30] (-4,-4) grid (4,4);
  \draw[->, >=stealth] (-4.5,0) -- (4.5,0);
  \draw[->, >=stealth] (0,-4.5) -- (0,4.5);
  
  \draw[thick, cyan, samples=120, domain=-180:180] 
    plot ({2*cos(\x)}, {1.2*sin(\x)});
  
  \filldraw[fill=yellow!70!orange, draw=blue, line width=1.5pt] 
    (-1.2,-1.2) rectangle (1.2,1.2);
\end{tikzpicture}
\end{document}

座標変換・スタイル・矢印制御

拡大・回転・平行移動・せん断変形はオプションキーワードで適用できます。矢印先端の形状は `arrows.meta` ライブラリで統一設定が可能です。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[>=Latex]
  \draw[->] (0,0) -- (2.5,0);
  \draw[->>] (3,0.2) -- (5.5,0.2);
  
  \draw[help lines] (0,0) rectangle (1,1);
  \draw[rotate=45, scale=0.75] (0,0) rectangle (1,1);
  \draw[shift={(3,0)}] (0,0) rectangle (1,1);
  \draw[xslant=0.6, shift={(5,0)}] (0,0) rectangle (1,1);
  
  \draw[thick, rounded corners=4mm] 
    (-1,2) -- (1,2.4) -- (1.8,0.8) -- (0.3,0.4) -- cycle;
\end{tikzpicture}
\end{document}

ノード配置とアンカー指定

テキストや形状を囲むノードは、相対位置・アンカー・カスタムスタイルを組み合わせて配置できます。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \node[circle, fill=teal, text=white] (N1) at (0,2) {Node A};
  \node[rectangle, draw, minimum width=1.2cm, minimum height=0.8cm] 
      (N2) [right=1cm of N1] {Box};
  
  \draw (N1.east) -- (N2.north west);
  
  \node[draw, below right=6pt of N2] (N3) {Offset};
  \draw[dashed] (0,0) -- (N3.south);
  
  \node[ellipse, draw=gray, fill=lime!30, font=\bfseries] at (4,0) {Styled};
\end{tikzpicture}
\end{document}

セグメントと頂点のラベル付け

パスの途中に座標を定義し、その位置にノードを配置することで、図形の幾何学的注釈を付与できます。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw[thick]
    (0,0) coordinate (P1) node[left] {$P_1$}
    -- node[sloped, above] {Edge $\alpha$}
    (3,2) coordinate (P2) node[above right] {$P_2$}
    -- node[sloped, below] {Edge $\beta$}
    (4,0) coordinate (P3) node[right] {$P_3$}
    -- node[left] {Edge $\gamma$} cycle;
\end{tikzpicture}
\end{document}

反復処理と条件分岐による描画

`\foreach` ループと TeX の条件分岐を組み合わせることで、アルゴリズム的な図形生成が可能になります。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \foreach \r in {1,2,3,4}{
    \foreach \c in {1,...,\r}{
      \pgfmathparse{Mod(\r+\c,2)==0 ? "green!20" : "red!20"}
      \fill[\pgfmathresult, rounded corners=2pt] 
          (\c, -\r) rectangle ++(0.9,0.9);
      \node at (\c+0.45, -\r+0.45) {\tiny $(\r,\c)$};
    }
  }
\end{tikzpicture}
\end{document}

tikzmathによる数値演算と変数管理

`tikzmath` ライブラリを導入すると、内部で変数宣言・関数定義・制御構造を実行し、その結果を外部の描画コマンドに渡せます。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
  \tikzmath{
    real \baseVal;
    \baseVal = 8;
    for \idx in {1,...,5}{
      \baseVal = \baseVal * 1.15;
      {
        \node[circle, draw, fill=blue!15, minimum size=0.7cm] 
            at (\idx, \baseVal/4) {\idx};
        \draw[dotted] (\idx,0) -- (\idx, \baseVal/4);
      };
    };
  }
  \draw[->] (-0.5,0) -- (6,0);
  \draw[->] (0,-0.5) -- (0,4);
\end{tikzpicture}
\end{document}

応用事例:多層ネットワークの自動配置

計算ロジックを `tikzmath` 内に閉じ込め、層ごとのノード数・間隔・接続線を一括生成します。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
  \tikzmath{
    function placeNode(\px,\py,\rcol){
      \node[circle, draw=\rcol, fill=white, minimum size=0.6cm] at (\px,\py) {};
    };
    function linkNodes(\x1,\y1,\x2,\y2){
      \draw[gray!60, thick] (\x1,\y1) -- (\x2,\y2);
    };
    \nInput = 3;
    \nHidden1 = 5;
    \nHidden2 = 4;
    \nOutput = 2;
    \xGap = 2.2;
    \yStep = 0.75;
    
    for \i in {0,...,\nInput-1}{
      \yp = (\i - (\nInput-1)/2) * \yStep;
      placeNode(0, \yp, black);
    };
    for \j in {0,...,\nHidden1-1}{
      \yp = (\j - (\nHidden1-1)/2) * \yStep;
      placeNode(\xGap, \yp, teal);
      for \i in {0,...,\nInput-1}{
        \ya = (\i - (\nInput-1)/2) * \yStep;
        linkNodes(0, \ya, \xGap, \yp);
      };
    };
    for \k in {0,...,\nHidden2-1}{
      \yp = (\k - (\nHidden2-1)/2) * \yStep;
      placeNode(2*\xGap, \yp, orange);
      for \j in {0,...,\nHidden1-1}{
        \yb = (\j - (\nHidden1-1)/2) * \yStep;
        linkNodes(\xGap, \yb, 2*\xGap, \yp);
      };
    };
    for \m in {0,...,\nOutput-1}{
      \yp = (\m - (\nOutput-1)/2) * \yStep;
      placeNode(3*\xGap, \yp, red);
      for \k in {0,...,\nHidden2-1}{
        \yc = (\k - (\nHidden2-1)/2) * \yStep;
        linkNodes(2*\xGap, \yc, 3*\xGap, \yp);
      };
    };
  }
  \node[below=0.6cm] at (0, -2.8) {入力層};
  \node[below=0.6cm] at (2.2, -2.8) {隠れ層1};
  \node[below=0.6cm] at (4.4, -2.8) {隠れ層2};
  \node[below=0.6cm] at (6.6, -2.8) {出力層};
\end{tikzpicture}
\end{document}

タグ: tikz latex-typesetting pgfmath vector-graphics technical-drawing

8月22日 09:27 投稿