TikZ/PGF

PGF (Portable Graphics Format) は,Till Tantau(Beamerのオリジナルの開発者) および Mark Wibrow, Christian Feuersänger を中心として開発されている TeX 用の描画パッケージです。 PGF のフロントエンドとして一般的には TikZ (TikZ ist kein Zeichenprogramm = "TikZ is not a drawing program") を使用します。 Beamer が基礎としている描画エンジンも PGF です。

また,R や gnuplot と連携させて描画することもできます。



はじめに

TikZ/PGF が提供する tikzpicture 環境は,LaTeX 標準の picture 環境と同様に TeX 文書中に描画コマンドを直接書き込むものですが,かなり高度な描画機能を持っています。 (→図版の例はこちらを参照。) TikZ/PGF 自身に付属するライブラリで機能が拡充されるほか,TikZ/PGF を利用して高度な描画を行うパッケージも数多く作られています。 TikZ/PGF を利用するパッケージには PGFPlots, TikZ-dependency, tkz-euclide などがあります。 同じく高度な描画機能を持っている PSTricks との大きな違いは,PostScript (PS) を経由せずに PDF を作成できる点です。

TikZ/PGF は LaTeX だけでなく plain TeX と ConTeXt にも対応していますが,以下では LaTeX の場合について記述します。

TikZ の読み方 → てぃくす

TikZ の発音について,“公式”のものは特に定められていないようです。 実際に使われる発音としては,Tik- は /tik/(ティク)で,-Z は /s/ か /ts/ か“Zの文字名”で読まれています。

初期設定

DVI 出力のエンジン(pTeX,upTeX)で TIkZ(tikz パッケージ)を読み込む場合は,文書クラスのオプション(グローバルオプション)でドライバを指定する必要があります。

% pLaTeX で dvipdfmx を使う場合の例
\documentclass[dvipdfmx,a4paper]{jsarticle}% ドライバ dvipdfmx を指定する
\usepackage{tikz}

ドライバをグローバルに指定すると不都合な場合は,事前に graphicx と xcolor の両パッケージを当該のドライバ指定で読み込むといいでしょう。(なお,先の例においても,PGF 自体により graphicx と xcolor は読み込まれています。)

\docuemntclass[a4paper]{jsarticle}
\usepackage[dvipdfmx]{graphicx,xcolor}% ドライバ指定のため
\usepackage{tikz}

※graphicx と xcolor の両方を読み込まないと,一部のドライバ設定が失敗する可能性があります。

PDF 出力のエンジン(pdfTeX,LuaTeX,XeTeX)の場合は,ドライバ指定は不要です。

% LuaLaTeX を使う場合の例
\documentclass[a4paper]{ltjsarticle}% ドライバ指定無し
\usepackage{tikz}

TikZ/PGF は dvips, dvipdfmx, dvisvgm, pdfTeX, LuaTeX, XeTeX などをサポートしています。dviout や xdvi はサポートしていません。 なお,TikZ/PGF の機能を 100% サポートしているのは pdfTeX と LuaTeX ですが,最近のバージョンでは dvipdfmx でもほぼすべての機能が使えます。(トラブルシューティングを参照)

ドライバを前もって指定する方法

文書クラスやパッケージの実装コードの中で,TikZ/PGF のドライバを事前に指定しておきたいという場合は,\pgfsysdriver マクロにドライバのファイル名(pgfsys-XXX.def という形式)を定義します。なお,plain TeX で TikZ を使用する場合のドライバ指定も,この方法で行います。

\def\pgfsysdriver{pgfsys-dvipdfmx.def} % dvipdfmx の場合
\def\pgfsysdriver{pgfsys-dvips.def}    % dvips の場合
\def\pgfsysdriver{pgfsys-dvisvgm.def}  % dvisvgm の場合
\def\pgfsysdriver{pgfsys-pdftex.def}   % pdfTeX, LuaTeX, LuajitTeX の場合。最も高機能
\def\pgfsysdriver{pgfsys-xetex.def}    % XeTeX の場合

その他のドライバファイルについては,付属のマニュアルを参照してください。

マニュアルについて

TikZ/PGF には

が付属しています。 TikZ/PGF のマニュアルはコマンドラインから

texdoc tikz

を実行することで表示できます。 TeX Live 2018 に付属している TikZ/PDF のマニュアルは ver 3.0.1a August 29, 2015 で古いマニュアルなので上記の新しいマニュアルに更新してください。 マニュアルの前半には 70 ページにも及ぶチュートリアルがあるので,学習を始めるのは比較的容易です。 ところが,示されているコードには必要なライブラリの読み込み指示が徹底されていないなどの不備があり,マニュアルにある例をコピー&ペーストしてもエラーが出て動作しないことがあります。

たとえば,チュートリアルの p.40 (ver 3.0.1 の場合) にある「パスの交錯」のセクションでは,説明の本文には「intersections ライブラリ」について言及されているものの,例にはその設定が記述されていないため,そのままではエラーが出ます。 プリアンブルに

\usetikzlibrary{intersections}

と設定しておく必要があります。

仕様の改訂とともにマニュアルはアップデートされていますが,前半のチュートリアルなどには以前の仕様の書式が用いられていることがあります。(たとえば円を描く書式。)

基本的な用法

各コマンド(とそのオプション)を視覚的にまとめたドキュメント VisualTikZCTAN に公開されています。簡潔で便利です。

基本的な使い方

インライン形式で図を本文の一部に入れるときは

\tikz 1行コマンド;

とします。 コマンドの終了は「;」(セミコロン)です。

独立した環境の中に複雑な(複数の)コマンドを記す場合は

\begin{tikzpicture}[環境オプション]
  コマンド;
  コマンド;
	…;
\end{tikzpicture}

とします。 各コマンドは「;」(セミコロン)で終了します。

TikZ/PGF の拡張

ライブラリの読み込み

TikZ/PGF は初期設定の段階でも高い描画力がありますが,付属のライブラリを読み込むことでさらに多彩な表現力を得ます。 ライブラリには,たとえば背景パターンを塗る patterns,交点を求める intersections,座標計算をする calc,矢印の種類を増やす arrows,パスを飾る decorations,角度記号を描く angles などがあります。 ライブラリを用いるときは,tikz パッケージを読み込んだ後で

\usetikzlibrary{intersections, calc}

などとします。

色指定の方法

pgf パッケージは内部で xcolor パッケージを読み込みますので,以下の色名が使用可能です。

red,green,blue,cyan,magenta,yellow,black,gray,white,darkgray,lightgray,brown,lime,olive,orange,pink,purple,teal,violet

TikZ/PGF での色指定は基本的にxcolorの形式を踏襲しますので,色指定の際に複数の色をブレンドしたものを使用することができます。 たとえば,red!30!gray は「30%の red+70%の gray」の意味します。 単に red!30 とした場合は,white とのブレンドと解釈されます。 3色以上のブレンドも可能です。

新しい色を新規に定義するときは,以下の書式で定義します。(pgf とは独立した xcolor パッケージに基づくので,tikzpicture環境以外でも使用可能です。)

\colorlet{NewColor}{red!30!gray}

デフォルトで使える色名は19色ですが,dvipsnames オプションを用いると使える色名が68色増えます。(svgnames オプションを用いると色名が151色,x11namesを用いると色名が317色増えます。詳細はxcolorのマニュアルを参照してください。) このオプションを使用したい場合は,xcolor パッケージをオプションつきで読み込むか,あるいはプリアンブルに以下を記述します。

\PassOptionsToPackage{dvipsnames}{xcolor} % tikz パッケージよりも前に読み込みます。

簡単な図形描画の例

\documentclass[dvipdfmx]{jsarticle}% 適切なドライバ指定が必要
\usepackage[svgnames]{xcolor}% tikzより前に読み込む必要あり
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (10,4);%(0,0)から(10,4)までの"細線の方眼"

%%直線の例
\draw (0,0) -- (2,1)  [rounded corners]--(2,2) -- (0,2) [sharp corners] --  (0,1)-- (1,1);
   %点(0,0), (2,1), (2,2), (0,2), (0,1), (1,1)を結ぶ"線分"で,(2,2)と(0,2)では"滑らか"
\draw [orange, thick] (1,2.5) -- ++(35:2cm);
   %(1,2.5)を始点として35°の方向に2cmの"オレンジ色の太い線分"
\draw [very thick] (0,3) rectangle (1.5,4);
   %(0,3)を左下,(1.5,4)を右上とする"極太の長方形"
\draw (1.5,0) -| (2.5,1.5);
   %(2,0)と(3,1.5)をまっすぐ結ばずに"横線と縦線のみで結ぶ"

%%円,楕円,扇形
\draw [red, thick] (3,3) circle (1);
   %(3,3)を中心とする半径1の"赤い太線の円"(古い書式で,現在は非推奨)
\fill [green!80] (4,3) circle [x radius=1cm, y radius=5mm, rotate=30];
   %中心(4,3),横1cm,縦5mmの"楕円を30°傾け緑80%で塗った図形"(推奨されている新しい円の書式)
\filldraw [fill=blue, opacity=.5, draw=Indigo] (5,0)  arc (0:45:2) --(3,0)--cycle;
   %(5,0)を出発点に半径2の弧を0°から45°まで描き,(3,0)を経由して出発点まで線分で戻って囲んだ"透明度50%の青で塗った扇形"
%%放物線,サインカーブ,曲線,ベジェ曲線
\draw (5,4) parabola bend (7,2) (8,4);
   %(5,4)を始点とし(7,2)を頂点とする放物線と(7,2)を頂点とし(8,4)を終点とする"放物線"
\draw [thick] (5,1) sin (6,2) cos (7,1) sin (8,0) cos (9,1);
   %(5,1)から始まり,(6,2),(8,0)を頂点として(9,1)で終わる"太線のサインカーブ"
\draw [purple, thick] (6,3) to [out=75, in=90] (8,2);
   %(6,3)から75°の角度で出発し,90°の角度で終点(8,3)に至る"紫の太い曲線"
\draw [purple, thin, bend right = 30] (6,3) to (8,2);
   %2点(6,3)と(8,2)を結ぶ"右に膨らんだ紫の細い曲線"(30°の角度で始点を出発し,150°の角度で終点に至る)
\draw [ultra thick] (8,1) .. controls (10,2) and (10,3.5) ..(9,4);
   %始点(8,1),終点(9,4)で方向点がそれぞれ(10,2)と(10,3)である"超極太の3次ベジェ曲線"
\draw [->, very thin]    (8,1) -- (10,2); \draw[<-, very thin] (10,3.5) -- (9,4);
   %上のベジェ曲線の"→つき方向線を示した細線"
\end{tikzpicture}

%%関数による描画(マニュアルp.329の例)
\begin{tikzpicture}[domain=0:4]%グラフの描画領域は0≦x≦4
\draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
\draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$};%横軸(x軸)
\draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};%縦軸
\draw[color=red] plot (\x,\x) node[right] {$f(x) =x$};
   %一次関数 y=x の赤線
% \x r means to convert '\x' from degrees to _r_adians:
\draw[color=blue] plot (\x,{sin(\x r)}) node[right] {$f(x) = \sin x$};
   %三角関数 y=sin x の青線(度数表記→ラジアンに変換)
\draw[color=orange] plot (\x,{0.05*exp(\x)}) node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
   %指数関数 y=0.05e^x のオレンジの線
\end{tikzpicture}
\end{document}

なお,長さの基本単位はデフォルトでは「cm」と見なされます。

上の例の各図形の書式についての簡単な説明(( )とあるのは座標表示,[ ]とあるのはオプション)

  1. 方眼の書式
  2. 直線の書式
  3. 円,楕円,弧(扇形)の書式
  4. 放物線,サインカーブ,曲線,ベジェ曲線の書式
  5. 関数による描画

スタイルの設定

同じオプションを繰り返し用いたい場合,自分でスタイルを定義することができます。globalに用いたい場合は,プリアンブルでスタイル名を定義します。

\tikzset{ スタイル名/ .style={各種オプションの設定}}

環境の中でのみ用いる場合は,環境の冒頭で以下のように定義します。

[ スタイル名/ .style={各種オプションの設定}]

複数のスタイルを定義する場合は,1つの[ ]の中で,各スタイルを「,」(コンマ)で区切って定義します。

デフォルト値を設定した上で,パラメーターを用いてその都度変えられるようにも設定できます。

\begin{tikzpicture}
[new grid/.style ={help lines,color=#1!50},%パラメーター#1を設定
new grid/.default=blue]%パラメーターのデフォルト値
\draw[new grid] (0,0) grid (1.5,2);%青50%の方眼(デフォルト値)
\draw[new grid=red] (2,0) grid (3.5,2);%赤50%の方眼
\end{tikzpicture}

点,そして交点の設定

点や線の「設定」「命名」「ラベル」

点(ノード)に名前を付け,ラベルを設定することができます。 \coordinate は \path coordinate の短縮形で,\node は \path node の短縮形です。 点を設定するだけのときは以下のように用います。(点の名前) や (座標) の順番は問いません。

\coordinate (点の名前) at (座標);
\node [オプション] (点の名前) at (座標) {ラベル}; %すでに設定された点の名前を(座標)の位置に置くことができます。

\draw や \fill など,パスを描いている途中で点やラベルを設定するときは,「\」から「;」までのあいだに coordinate または node を記述します。(このとき「\」を改めてつける必要はありません。) (座標) は node が設定された時点での座標が自動的に適用され,「at (座標)」は省略できます。

coordinate は座標を設定するだけですが,node は設定した座標にラベルを設定します。 node が設定するラベルはデフォルトでは (座標) の真上に置かれますが,オプションで「少しずらす」ことができます。 above, below, right, left が使用可能で,below=2mm などと細かく指定することもできます。

node はそれ自体に大きさがあり,色や形も指定できます。 \node に位置をずらすオプションをつけると,指定された座標には node の端点が置かれることになり,node 自体の座標は \coordinate で座標を指定した場合とは少しズレます。 なお,coordinate とは実際には「大きさゼロでラベルが空白の node」のことです。

node の主なオプション

[オプション] をつける位置は,パスの中では自由です

\begin{tikzpicture}
\draw [help lines] (0,0) grid (3.5,2.5);%(0,0)から(3.5,2.5)までの"細線の方眼"
\coordinate (O) at (0,0) node at (O) [left] {$O$}; %(0,0)に点Oを設定し,その左に$O$と記載する
\coordinate (A) at (1,2); %(1,2)に点Aを設定する
\node (B) at (2,2) [above] {$B$} ; %(2,2) の上方にノードBを設定し,$B$と記載する
\node (C) [fill=white, draw, text=red, circle] at (3,2) {C}; %(2,2)に白塗りした円形のノードCを設定する

\coordinate (D) at (3,1) node at (D) [label=right:Dの右横] {};
   %(D)には「大きさ」がなく,その位置に無名のノードが置かれ,右にラベルがある
%\node (D) at (3,1) [label=right:Dの右横] {};
   %(D)には「大きさ」をもった無名のノードがおかれ,その右にラベルがある
\fill (O) circle (2pt) (A) circle (2pt) (D) circle (2pt); %点O,A, Dに黒丸をつける(1つの\fillで複数の点を対象にできる)

\draw (O) -- (A) node [above] {$A$}; %線分OAを描き,その上方にノードを設定して$A$と記載する(ノード自体は無名)
\draw [->] (O)--(B); %矢印OBを描く(Bが(2,2)の上方にあること,ノードBに大きさがあることに注目)
\draw [->] (O)--(C); %矢印OCを描く(矢印はノードCの輪郭まで)
\draw (O)--(D);%(D)の設定を\coordinateでしたか\nodeでしているかで線の長さが異なる
\end{tikzpicture}

直交する2つの直線の交点

2点P,Qがあるとして,Pを通る垂直な線とQを通る水平な線との交点は

((Pの座標) |- (Qの座標))

で示されます。 同様に,Pを通る水平な線とQを通る垂直な線との交点は

((Pの座標) -| (Qの座標))

となります。

\begin{tikzpicture}
\draw [help lines] (0,0) grid (4.5,3.5);%(0,0)から(4.5,3.5)までの"細線の方眼"
\coordinate (O) at (0,0) node [below] at (O) {O};
\coordinate (A) at (3,0) node [below]at (A) {A};
\coordinate (B) at (1,2) node [above right] at (B) {B};

\fill [red] (A -| B) circle (2pt) node [above] {A{\verb\-|\}Bの点};
\fill [blue] (A |- B) circle (2pt) node [above] {A{\verb\|-\}Bの点};
\fill (O) circle (2pt);
\fill (A) circle (2pt);
\fill (B) circle (2pt);
\end{tikzpicture}

任意のパスの交点

intersectionsライブラリを読み込んでおく必要があります。 ライブラリの読み込みは,tikzパッケージを読み込んだ後で

\usetikzlibrary{intersections}

とします。

[name path=○○]で2つの図形に名前を付け,[name intersections={of=○○ and ○○}]で交点を設定します。 交点の名前は,デフォルトでは intersection-n(n は1,2,3,…)という名前が順に付けられますが,name intersections オプションに by={○,□,…} とリストを与えて設定することもできます。(交点の総数はオプションで得られるので,後述のforeachと組み合わせて全交点にそれぞれラベルを付けることもできます。マニュアル参照。)

以下の1つ目の例では,やや傾いた長方形(rectangle)と楕円(ellipse)の交点が半透明な赤い点で示されます。 2つ目の例では,2曲線の交点を順に3つ a, b, c と名前を付けて,ラベルを付けてます。

\documentclass[dvipdfmx]{jsarticle}% 適切なドライバ指定が必要
\usepackage{tikz}
\usetikzlibrary{intersections, calc}
\begin{document}
\begin{tikzpicture}[every node/.style={opacity=1, black}]

%1つ目の図

\begin{scope}
\draw [help lines] grid (3,2);
\draw [name path=rectangle, rotate=10] (0.5,0.5) rectangle +(2,1);
\draw [name path=ellipse] (2,0.5) ellipse (0.75cm and 1cm);
\fill [red, opacity=0.5, name intersections={of=rectangle and ellipse}]
(intersection-1) circle (2pt) node [above right] {1} %第1の交点
(intersection-2) circle (2pt) node [below right] {2};%第2の交点
\end{scope}

%ここから2つ目の図

\begin{scope}[xshift=5cm]
\clip (-2,-2) rectangle (2,2);
\draw [name path=curve 1] (-2,-1) .. controls (8, -1) and (-8, 1) .. (2,1);
\draw [name path=curve 2] (-1,-2) .. controls (-1,8) and (1, -8) .. (1,2);
\fill [red, opacity=0.5, name intersections={of= curve 1 and curve 2, by={a, b, c}}]
(a) circle (2pt) node [above left] at (a) {a}
(b) circle (2pt) node [above right] at (b) {b}
(c) circle (2pt) node [below left] at (c) {c};
\end{scope}
\end{tikzpicture}
\end{document}

計算による座標設定(例:三角形の重心と垂心を求めてみる)

calc ライブラリを読み込むことで,簡単な座標計算ができます。

  1. 座標の四則演算
    座標をk倍したり,x座標,y座標に増減を加えることができます。
    ($k*(座標) + (x,y)$)
  2. 線分の内分
    線分ABを t:1-t (0<t<1) で内分した点の座標は以下のようになります。
    ($(Aの座標)!t!(Bの座標)$)
    tに負の数字または1より大きい数字を指定することも可能で,このときは外分点になります。
  3. 線分を回転してから内分
    線分ABをα°回転させてから u:1-u で内分した点の座標は,以下で求められます。
    ($(Aの座標)!u!α:(Bの座標)$) 
    αに 90 を指定すれば,Aを通りABに垂直な線上の点を指定することになります。
  4. 内分点を距離で指定
    線分AB上で,Aからの距離が 1cm の点の座標は以下の計算で求まります。
    ($(Aの座標)!1cm!(Bの座標)$) 
    回転させたときも同様で,線分ABをAの周りにα°回転させ,Aからの距離が1cmの点の座標は以下のようになります。
    ($(Aの座標)!1cm!α:(Bの座標)$)
  5. 線分に垂線を下ろす
    点Pから線分ABに垂線を下ろした足の座標は,以下のようになります。
    ($(Aの座標)!(Pの座標)!(Bの座標)$)
  6. 計算で求めた座標に,さらに計算を続けることができます。
    たとえば,線分ABの中点から垂直に1cm離れた点は以下の計算で求まります。
    ($(Aの座標)!.5!(Bの座標)!1cm!90:(B)$)

三角形の重心と垂心を求める例。

\documentclass[dvipdfmx]{jsarticle}% 適切なドライバ指定が必要
\usepackage{tikz}
\usetikzlibrary{intersections, calc}
\begin{document}
\begin{tikzpicture}
\begin{scope}%△OABの重心を求める
\draw [help lines] (0,0) grid (4.5,3.5);%(0,0)から(4.5,3.5)までの"細線の方眼"
%△OABの頂点を設定
\coordinate (O) at (0,0) node [below] at (O) {O};
\coordinate (A) at (4,0) node [below]at (A) {A};
\coordinate (B) at (3,3) node [above right] at (B) {B};
%各辺の中点を計算
\coordinate (C) at ($(O)!.5!(A)$) node at (C) [below]  {C};%OAの中点
\coordinate (D) at ($(A)!.5!(B)$) node at (D) [above right]  {D};%ABの中点
\coordinate (E) at ($(B)!.5!(O)$) node at (E) [above left]  {E};%BOの中点
%中点であることを示す
\node [circle, draw, inner sep=2pt] at ($(O)!.5!(E)$) {};
\node [circle, draw, inner sep=2pt] at ($(B)!.5!(E)$) {};
\node at ($(A)!.5!(D)$) {×};
\node at ($(B)!.5!(D)$) {×};
\draw (O) to [out=-20, in=200] (C);
\draw (C) to [out=-20, in=200] (A);
%線分を引く
\draw (O)--(A)--(B)--cycle;
\draw [red] (O)--(D) [name path=line 1];
\draw [blue] (A)--(E) [name path=line 2];
\draw [green] (B)--(C);
%各点に黒丸をつける
\fill (O) circle (2pt);
\fill (A) circle (2pt);
\fill (B) circle (2pt);
\fill (C) circle (2pt);
\fill (D) circle (2pt);
\fill (E) circle (2pt);
\fill [name intersections={of=line 1 and line 2}] (intersection-1) circle (2pt) node [above] {重心};
\end{scope}
%
\begin{scope}[xshift=5cm]%△OABの垂心を求める
\draw [help lines] (0,0) grid (4.5,3.5);%(0,0)から(4.5,3.5)までの"細線の方眼" 
%三角形の頂点を設定
\coordinate (O) at (0,0) node [below] at (O) {O};
\coordinate (A) at (4,0) node [below] at (A) {A};
\coordinate (B) at (3,3) node [above right] at (B) {B};
%各頂点からの垂線の足を計算
\coordinate (C) at ($(O)!(B)!(A)$) node at (C) [below] {C};%BからOAに下ろした垂線の足
\coordinate (D) at ($(A)!(O)!(B)$) node at (D) [right] {D};%OからABに下ろした垂線の足
\coordinate (E) at ($(O)!(A)!(B)$) node at (E) [above left] {E};%AからOBに下ろした垂線の足
%線分を引く
\draw (O)--(A)--(B)--cycle;
\draw [red] (O)--(D);
\draw [name path=line 1, green] (B)--(C);
\draw [name path=line 2, blue] (A)--(E);
%C,D,Eに直角記号をつける
\draw ($(C)!5pt!(B)$) -| ($(C)!5pt!(A)$);
\draw ($(D)!5pt!(O)$)--($(D)!5pt!(O)!5pt!90:(D)$)--($(D)!5pt!(B)$);
\draw ($(E)!5pt!(A)$)--($(E)!5pt!(A)!5pt!90:(E)$)--($(E)!5pt!(O)$);
%各点に黒丸をつける
\foreach \P in {A,...,E,O} \fill (\P) circle (2pt);
\fill [name intersections={of=line 1 and line 2}] (intersection-1) circle (2pt) node [below left] {垂心};
\end{scope}
\end{tikzpicture}
\end{document}

角度記号をつける例。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\usetikzlibrary{calc, quotes, angles}%quotesは角度のラベルオプション内に記述するために使用
\begin{document}
%直角記号の付け方の例1(calc ライブラリ必須)
\begin{tikzpicture}
 \draw
 (20:3cm) coordinate (A) node[right] {A}
 -- (0,0) coordinate (O) node[below left] {O}
 -- (110:2cm) coordinate (C) node[above left] {C};
 \coordinate (P) at ($(O)!.3cm!(A)!.3cm!90:(A)$);%直角記号の頂点の設定
 \draw[thick, red] ($(O)!(P)!(A)$)--(P);
 \draw[thick, red] ($(O)!(P)!(C)$)--(P);
\end{tikzpicture}
%直角記号の付け方の例2(calc ライブラリ必須)
\begin{tikzpicture}
 \draw
 (20:3cm) coordinate (A) node[right] {A}
 -- (0,0) coordinate (O) node[below left] {O}
 -- (110:2cm) coordinate (C) node[above left] {C};
 \draw[thick, red] ($(O)!8pt!(A)$)--($(O)!8pt!(A)!8pt!90:(A)$)--($(O)!8pt!(C)$);
\end{tikzpicture}
%一般の角度記号の付け方(3.0.0以降,angles ライブラリ必須)
\begin{tikzpicture}
 \draw
 (3,-1) coordinate (A)
 -- (0,0) coordinate (B)
 -- (2,2) coordinate (C)
 pic["$\alpha$",draw=orange, <->, very thick, angle eccentricity=1.2, angle radius=1cm] {angle=A--B--C};
%線分の長さを示す例
 \draw (B).. controls ($(B)!.2!(C)!10pt!90:(C)$) and ($(B)!.8!(C)!10pt!90:(C)$) .. (C) node [midway, sloped, fill=white] {$a$};
 \draw (A).. controls ($(A)!.2!(B)!10pt!90:(B)$) and ($(A)!.8!(B)!10pt!90:(B)$) .. (B) node [midway, sloped, fill=white] {$b$};
\end{tikzpicture}
\end{document}

2点間の距離を計算する(例:三角形の外心と内心を求めてみる)

veclen(x,y)によってベクトル(x,y)の大きさが求められます。 パスの記述の途中で let を用いると,数字レジスタ \n,ポイントレジスタ \p, \x, \y が使用可能となります。 「=」の左側に置くとそのレジスタに数値または座標が代入されます。 「=」の右側に置かれたレジスタは,その中身が展開されます。 \x, \y はそれぞれ \p の x 成分,y 成分です。

\path let \p1 = ○○, \n1 = □□ in (レジスタを含んだ)コマンド

これらを利用すると,点Aを中心として点Bを通る円は,以下のように書けます。

\draw let \p1 = ($(Bの座標) - (Aの座標)$), %
     \n1 = {veclen(\x1,\y1)} %ベクトル\p1の大きさを \n1 に代入
     in circle [at=(Aの座標), radius=\n1];

through ライブラリを\usetikzlibrary{through}で読み込んであれば,上のような円はもっと簡単に書けます。 (円形のノードの半径を拡大して望む点の座標を通るように設定します。)

\node [draw, circle through=(Bの座標)] at (Aの座標) {};

三角形の外心と内心を求める例。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\usetikzlibrary{intersections, calc, through}
\begin{document}
\begin{tikzpicture}
\begin{scope}%△OABの外心を求める
\draw [help lines] (0,0) grid (4.5,3.5);%(0,0)から(4.5,3.5)までの"細線の方眼"
%三角形の頂点を設定し,三角形を描く
\coordinate (O) at (0,0) node [below] at (O) {O};
\coordinate (A) at (4,0) node [below] at (A) {A};
\coordinate (B) at (3,3) node [above right] at (B) {B};
\draw (O)--(A)--(B)--cycle;
%各辺の垂直二等分線およびその交点(=外心)
\draw ($(O)!.5!(A)!1cm!90:(O)$)--($(O)!.5!(A)!4cm!90:(A)$) [name path=line 1, red];
\draw ($(A)!.5!(B)!1cm!90:(A)$)--($(A)!.5!(B)!4cm!90:(B)$) [name path=line 2, green];
\draw ($(B)!.5!(O)!1cm!90:(B)$)--($(B)!.5!(O)!4cm!90:(O)$) [name path=line 3, blue];
\fill [name intersections={of=line 1 and line 2}] (intersection-1) circle (2pt) node (P) [label=left:外心] {};
\draw ($(O)!.5!(A)!5pt!(A)$) |- ($(O)!.5!(A)!5pt!90:(A)$);%直角記号
%各点に黒丸をつける
\foreach \P in {O,A,B} \fill (\P) circle (2pt);
%外心円(半径はOPの距離)
\node [draw, circle through=(O)] at (P) {};
\end{scope}
%
\begin{scope}[xshift=5cm]%△OABの内心を求める
\draw [help lines] (0,0) grid (4.5,3.5);%(0,0)から(4.5,3.5)までの"細線の方眼"
%三角形の頂点を設定し,三角形を描く
\coordinate (O) at (0,0) node [below] at (O) {O};
\coordinate (A) at (4,0) node [below] at (A) {A};
\coordinate (B) at (3,3) node [above right] at (B) {B};
\draw (O)--(A)--(B)--cycle;
%各辺上で一定の長さの点を設定する
\coordinate (s) at ($(O)!1cm!(A)$);
\coordinate (t) at ($(O)!1cm!(B)$);
\coordinate (u) at ($(A)!1cm!(O)$);
\coordinate (v) at ($(A)!1cm!(B)$);
\coordinate (w) at ($(B)!1cm!(O)$);
\coordinate (z) at ($(B)!1cm!(A)$);
%内角の二等分線
\draw (O)--($5*(s)!.5!(t)$) [name path=line O, red];
\draw (A)--($(u)!.5!(v)!-4!(A)$) [name path=line A, green];
\draw (B)--($(z)!.5!(w)!-4!(B)$) [name path=line B, blue];
%角の二等分線の交点(=内心)
\fill [name intersections={of=line O and line B}] (intersection-1) circle (2pt) node (P) [label=left:内心] {};
%各点に黒丸をつける
\foreach \P in {O,A,B} \fill (\P) circle (2pt);
%内心円(半径はPからOAに下ろした垂線の長さ)
\draw let \p1=($(O)!(P)!(A)-(P)$), \n1={veclen(\x1,\y1)} in circle [at=(P), radius=\n1];
\end{scope}
\end{tikzpicture}
\end{document}

繰り返し処理,変数

繰り返し処理は,\foreachおよび\breakforeachで実行します。 これは,tikz パッケージが読み込む pgffor パッケージの中で定義されているもので,pgfとは独立に用いることもできます。(つまり tikzpicture 環境以外でも使用可能です。)

繰り返し処理の書式は,以下のようになります。

\foreach \変数 [オプション] in {変域リスト} {(\変数 を含む)コマンド}

この式によって,{変域リスト} に含まれる要素の数だけ {コマンド} が繰り返され,その度に「\変数」に {変域リスト} の各要素が順繰りに代入されたコマンドが実行されます。

たとえば,左の式は,それぞれ右のような結果となります。

・\foreach \x in {1, 2, 3, 4} {A-\x, } →(出力)A-1, A-2, A-3, A-4, 
・\foreach \angle in {0, 90, 180, 270} {$\cos\angle^\circ$ } →(出力)cos 0° cos 90° cos 180° cos 270°
・\foreach \名前 in {太郎, 次郎, 花子, 桜子} {\名前{さん},} →(出力)太郎さん,次郎さん,花子さん,桜子さん,
・{1, 2, ..., 10} → {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} と解釈
・{1, 3, ..., 10} → {1, 3, 5, 7, 9} と解釈
・{a, b, c, 1, 2, ..., 6, d, e, ..., h} → {a, b, c, 1, 2, 3, 4, 5, 6, d, e, f, g, h} と解釈
・{a, ..., e} → {a, b, c, d, e} と解釈
・{Z, X, ..., M} → {Z, X, V, T, R, P, N} と解釈

基本的な描画例

%目盛り付き座標軸
\begin{tikzpicture}
\draw[thick, ->] (-1,0) -- (5,0) node [below] {$x$};%x軸
\draw[thick, ->] (0,-1) -- (0,5) node [left] {$y$};%y軸
\node at (0,0) [anchor=north east] {O};
\foreach \x in {1,2,3,4}
   \draw (\x cm,.2) -- (\x cm,0) node[anchor=north] {$\x$};
\foreach \y in {1,2,3,4}
   \draw (.2,\y cm) -- (0,\y cm) node[anchor=east] {$\y$};
\end{tikzpicture}
%時計の例(2変数指定の例)
\begin{tikzpicture}
\draw[very thick] (0,0) circle (2cm);%時計の外周
\foreach \angle / \label in 
  {0/3, 30/2, 60/1, 90/12, 120/11, 150/10, 180/9, 210/8, 240/7, 270/6, 300/5, 330/4} 
  { 
   \draw (\angle:1.8cm) -- (\angle:2cm); 
   \node at (\angle:1.5cm) {\textsf{\label}}; 
  } 
\foreach \angle in {0,90,180,270} 
   \draw[thick] (\angle:1.7cm) -- (\angle:2cm); 
\draw[line width=3pt, cap=round] (0,0) -- (145:0.8cm);%短針
\draw[line width=3pt, cap=round] (0,0) -- (30:1.2cm);%長針
\end{tikzpicture}%

図画のみの出力

TikZ/PGF で作成した図画を含んだソースファイルから,図画のみを別ファイルに抽出できます。

dvips または LuaTeX または pdfTeX を用いると,ちょうどその画像の大きさの ps ファイルまたは pdf ファイルが得られます。 dvipdfmx を用いた場合は,コマンドラインから pdfcrop を最後に適用することで画像の大きさちょうどの pdf を得られます。

  1. プリアンブルに追加
  2. 画像部分に追加
  1. uplatex → dvipdfmx → pdfcrop
  2. uplatex → dvips
  3. lualatex

ソースコードへの追加記述

  1. プリアンプルへの追加
    プリアンプルに以下のコードを追加します。filename は,tex ファイル自体の名前です(拡張子の .tex などは含めません)。
    \pgfrealjobname{filename}
  2. 図画部分への追加
    tikz 環境の前後に pgf のコマンドを以下のように書き足します。filename-fig1 は,それぞれの図画につける任意の名前です。
    \beginpgfgraphicnamed{filename-fig1}
    \begin{tikzpicture}
    ...
    \end{tikzpicture}
    \endpgfgraphicnamed

コンパイル

ソースコード(tex ファイル)をコンパイルするときに,以下のオプションをつけて実行します。 それぞれの図画に対し,--jobname オプションをつけてコンパイルします。 なお,以下の例では拡張子(.tex など)をつけてますが,省略しても各コマンドは「よきにはからって」くれます。

$ uplatex --jobname=filename-fig1 filename.tex

これで,図画だけを含んだ filename-fig1.dvi が作成されます。

  1. dvipdfmx を使用する場合
    $ dvipdfmx filename-fig1.dvi
    $ pdfcrop filename-fig1.pdf
    これで,図画の大きさちょうどの pdf ファイルが作成されます。 余白を入れるには pdfcrop に --margins オプションを用います。以下の例では,周囲に 3bp の余白を入れています。
    $ pdfcrop --margins 3 filename-fig1.pdf
    (4方向の余白を指定するには <左> <上> <右> <下> と指定します。数字を2つ指定した場合は<右><下>の余白になります。)
  2. dvips を使用する場合
    $ dvips filename-fig1.dvi
    これで,図画の大きさちょうどの ps ファイルが作成されます。
  3. LuaLaTeX を使用する場合
    $ lualatex --jobname=filename-fig1 filename.tex
    これだけで,図画の大きさちょうどの pdf ファイル(filename-fig1.pdf)が作成されます。

トラブルシューティング

TikZ 対応エディタ

関連リンク

TikZ/PGF を利用・拡張するもの

使用例や解説

ChangeLog


Last-modified: 2018-11-03 (土) 00:45:53 (18d)