TikZ
非常に高度な図表を作図できる
install
$ tlmgr install pgf
構文
描画環境
$ \tikz command;
;でコマンドを区切る
コマンド中のスペース・改行は無視される
例示コードの注意点
以下、特に断りがない限りheader.texを先頭につけて実行しているものとする
code:header.tex
\def\pgfsysdriver{pgfsys-ximera.def}
\usepackage{tikz}
\draw [help lines] (0,0) grid (3,3);は方眼を引くコマンド code:grid.tikz(tex)
\begin{document}
\quad
\end{document}
help linesは組み込みのスタイル
$ \tikzset{help lines/.style={gray,very thin}}
を実行したのと等価
TODO: 変数を示す記法を:variableから<variable>に変える
manualも後者を採用している
\path (:command1) (:command2) ...
他の命令は、制御構文を除くと全てこれのaliasかsub commandでできている
TikZは略記法で構成されている面が強いtakker.icon
どの記法がどの記法の略記なのかを知ると、記法に馴染みやすいし応用も効く
名前はofficial manualに倣った
新しいpathの始点を(:coordinate)に打つ
現在座標から:coordinateまで線を引く
現在座標と:cordinateを対角線上に配置した長方形を引く
今の座標を中心に、半径:radiusの円を引く
circleには楕円を書くoptionもある
arc[start angle=<start>,end angle=<end>,delta angle=<delta>,radius=<radius>]arc operation 現在座標は中心ではなく端点になることに注意
start angle,end angle,delta angleは、どれか1つを略してもいい
全部あるときはdelta angleが無視される
radiusのかわりにx radius,y radiusを設定してもいい
楕円になる
略記法にarc(<start>:<end>:<radius>)があるが、分かりづらいので推奨されていない
to[options]
出ていくときと入ってくるときの角度を指定して描く曲線
等角度で入出するときはbend left=:angleかbend right=:angleを入れる
別の角度にしたいときは、in=:angle, out=:angleで設定する
grid (:coordinate)
graph:グラフを書く
plot:函数描画
pic:特殊な描画コマンド
やや特殊な命令
node (:name) at (:coordinate) {:node_contents}
:coordinateにテキスト:node_contentsを配置し、この座標に:nameと名付ける
:nameと:coordinateは省略可
:coordinateを省略すると現在座標になる
(後述)
:<animation attribute>
などなど
pathを実際に描画したり塗りつぶしたりしたいときは、[]に描画オプションを入れる
pathを定義するだけ
drawなどの描画方法(actionと呼ぶ?)を[]に指定することで初めて見た目に反映される
[]は\path ...のどこに入れてもいいし、複数入れてもいい
ただし、drawはcircleの前に設定しないと描画されない
code:circles.tikz(tex)
\begin{document}
\begin{tikzpicture}
\end{tikzpicture}
\end{document}
同じ\path内でoptionsを書くとき
最初に書いたoptionの値がdefault value扱いされる
circle命令の直後に座標を置くときは、空でもいいので[]を挟まないと文法エラーになるようだ
--命令などなら[]不要
描画オプションを指定した\pathはaliasが用意されている \clip=\path[clip]指定した領域のみ表示 official manualの"Part III TikZ ist kein Zeichenprogramm"に\path記法の仕組みが解説されている options(HTMLでいう属性に相当)は[]の中に書く
,区切りであり、option nameには空白を入れられることに注意
例えば\path[use as bounging box]はuse as bounging boxが一つのoptionである
Node
\path nodeと等価
$ node (:name) at (:coordinate) {:node_contents};
at (:coordinate)と(:name)は順不同
at (:coordinate)を省略すると、最後に\path命令が利用した座標に設定される
初期状態だと原点$ (0,0)
\pathの途中に入れたときは、その時の座標が使われる 例
code:node.tikz(tex)
\begin{document}
\begin{tikzpicture}
\node {O};
\draw (1,1) node {A} rectangle node {Label} (2,2) node {B} ;
\end{tikzpicture}
\end{document}
node {O}は直前になんの命令も無いので、原点に配置される
node {A}は$ (1,1)の直後に記述されているので、$ (1,1)に設定される
node {Label}はrectangle命令の直後なので、rectangleが指定する座標である長方形の中央に設定される
この場合だと$ (1.5,1.5)かな
code:node2.tikz(tex)
\begin{document}
\begin{tikzpicture}
\draw (1,1) node at (1,1.5) {A} node {B} rectangle (2,2) node {C} node {D} ;
\end{tikzpicture}
\end{document}
at (:coordinate)で座標を上書きできる
効果は当該nodeにしか発生しない
$ Aは上書きした座標に表示されているが、$ Bには元々の座標$ (0,0)が適用されている
それぞれoptionに書き換えられる
code:node3.tikz(tex)
\begin{document}
\begin{tikzpicture}
\nodedraw (A) at (1,1) {A}; \end{tikzpicture}
\end{document}
shape=:shape_nameoptionでNodeの形を決める
defaultはrectangle
shape=は省略可
rectangle,circle,coordinateのどれかを入れる
code:node-shape.tikz(tex)
\begin{document}
\begin{tikzpicture}
\end{tikzpicture}
\end{document}
coordinateは大きさが0でnode contentsが空のnode
後述する
ラベル(=node contents)をつける
ラベルを付けたい対象の次にnode[:position]{:label}をつける
座標(A)のほか、線--などにもつけられる
label=:labeloptionでラベルを作れる
node contentsとは別。つまり両方設定できる
Nodeと線で結ばれたラベルを作る
これもnode contentsとは別
code:node-path.tikz(tex)
\begin{document}
\begin{tikzpicture}
\nodedraw (A) at (0,0) {A}; \nodedraw (B) at (1.5,1.5) {B}; \end{tikzpicture}
\end{document}
また\nodeは大きさがあるため、配置が微妙に異なる
等価なコマンド
coordinate=node[coordinate]=node[shape=coordinate]
\coordinate=\path coordinate=\path node[coordinate]=\node[coordinate]
$ \coordinate (:name) at (:coordinate);
座標の記法
構文
(:coordinate_system cs::key-values)
いくつかの座標系は略記法がある
標準で用意されている座標系
xy平面座標
(canvas cs:x=2cm,y=1.5cm)
略記:(2cm,1.5cm)
3次元直交座標
(xyz cs:x=2cm,y=1.5cm,z=3.4cm)
略記:(2cm,1.5cm,3.4cm)
(canvas polar cs:angle=30,radius=1cm)
略記:(30:1cm)
(barycentric cs:A=1,B=1)
node nameしか指定できないみたい
xyz polar
よくわからないtakker.icon
xy polar
よくわからないtakker.icon
node
事前に定義したnodeの座標を参照する
(node cs:name=A)
略記:(A)
(node cs:name=A,anchor=north)
略記:(A.north)
(node cs:name=A,angle=-30)
略記:(A.-30)
anchorとanghleはどちらか一方のみ指定できる
(perpendicular cs:horizontal line through={(2,1)}, vertical line through={(3,4)}
略記:(2,1 -| 3,4)もしくは(3,4 |- 2,1)
code:perpendicular.tikz(tex)
\begin{document}
\begin{tikzpicture}
\path (2,1) coordinate (A) nodebelow {A}; \path (3,2) coordinate (B) noderight {B}; \draw (A) -- (perpendicular cs:horizontal line through={(A)},vertical line through={(B)});
\nodebelow at (A -| B) {C}; \end{tikzpicture}
\end{document}
接線を引ける\nodeはshape=coordinateとshape=circleのみ
透視投象の座標系three point perspective(略記:ttp) etc.
他の座標から計算
2点間の中点
calcを使う場合:($(A)!0.5!(B)$)
重心座標を使う場合:(barycentric cs:A=1,B=1)
相対位置指定
基準の位置と受け手側の配置位置、2点の位置関係から決定する
標準機能
code:relative-position.tikz(tex)
\begin{document}
\begin{tikzpicture}
\end{tikzpicture}
\end{document}
above系は、基準となる座標のどこに配置するかを決める
aboveなら基準の上に来る
above=.3cmなどで間隔を調整できる
anchorは配置するオブジェクトの基準点を決める
defaultは多分オブジェクトによって違う
標準機能だけで相対指定する
code:relative-position2.tikz(tex)
\begin{document}
\begin{tikzpicture}
\tikzset{ball/.style={draw, circle},indicator/.style={thick,<->}};
\def\l{2cm}
\nodeball (A) at (0,0) {A}; \nodeball (B) at (0,\l) {B}; \drawdashed (B.north) -- (J.north); \end{tikzpicture}
\end{document}
交点に設定
stealth-で線の始端に矢印
-stealthで線の終端に矢印
stealth-stealthで線の両端に矢印
矢印はstealth以外にもいろいろ選べる
code:graphs.tikz(tex)
\usetikzlibrary {graphs}
\begin{document}
\tikz \graph { a -> {b, c} -> d };
\end{document}
styling
CSSに相当するもの
:style_name/.style={...}
...に、[]内に入れているものを書く
local application
各\pathもしくは\begin{tikzpicture}の[]に入れる
,区切りで定義する
style名には半角スペースも使用可能
改行できないので注意
global application
改行可能
スタイルには引数を設定できる
#1, #2, ...が変数名
1変数までは設定無しに使用可能
2変数以上使いたいときは、/.styleを/.style 2 argsに置き換える
2は使いたい変数の数を入れる
計算
実数の計算はdefaultで可能
座標内で括弧()を使った計算式を書くときは、計算式全体を{}で囲む
例
$ \draw (1, 1) -- ({(3 + 4) / 2}, -5 / 2)
それ以外は囲む必要なし
from onlyamsmathのmanualのAcknowledgement
回転させたラベルをつける
例:中央まわり90°回転
nodeのanchorがdefaultでeastなので、文字列の真ん中に来るようanchor=southを指定する必要がある
TikZ環境全体の回転拡大縮小
色
色合成や数値指定の書式はxcolorに従う
\usetikzlibrary{optics, calc}が必要
code:tex
\draw ultra thick (1,1) -- (1,2) -- (2,2) -- (2,1) -- cycle; https://gyazo.com/2e0de2c61e345eb21aef2410c2abe6d4
2024-01-29 13:25:30 曲芸。非推奨
opticsは光学レンズの図を描くためのpackage。矢印を描くためのpackageではない 繰り返し処理
拡張機能の詰め合わせ
うーん、まあ使うほどでもないかな
実用的な図
平面座標上に円や寸法、数式を書き込む
角度の記号を出すやつ?
ほかにも描画できるっぽい?
code:2d-rotate.tikz(tex)
\usetikzlibrary{angles,quotes}
code:2d-rotate.tikz(tex)
\begin{document}
% \clip (0,0) rectangle (5,5);% 切り抜き
\tikzset{axis/.style={thick,->}};
\drawaxis (-1,0) -- (4,0) noderight {$x$};% x軸 \coordinate (O) at (0,0);
\coordinate (A) at (1,2);
\coordinate (O) at (3/4,3/2);
\coordinate (B) at (2,3/2);
\coordinate (C) at (2,2/3);
\tikzset{arrow angle/.style={draw=black,->,very thick,angle eccentricity=1.4,angle radius=#1}};
\end{tikzpicture}
\end{document}
code:2d-circle.tikz(tex)
\usetikzlibrary{angles}
\usetikzlibrary{quotes}
\usepackage{amsmath}
\def\bm#1{\boldsymbol{#1}}
\begin{document}
% \clip (0,0) rectangle (5,5);% 切り抜き
\coordinate (O) at (0,0);
\coordinate (A) at (5/2,12/2);
\coordinate (B) at (4/2,-3/2);
\coordinate (C) at (77/65,21/65);
\fill (A) circle (2pt) noderight {$\mathrm{A}(5,12)$};% 点 \fill (B) circle (2pt) noderight {$\mathrm{B}(4,-3)$};% 点 \fill (C) circle (2pt) noderight {$\mathrm{C}$};% 点 \draw (O)--(A);
\draw (O)--(B);
\draw (C)--(5/13,12/13);
\draw (C)--(4/5,-3/5);
\end{tikzpicture}
\end{document}
code:parabora.tikz(tex)
\usepackage{amsmath}
code:parabora.tikz(tex)
\begin{document}
% \clip (0,0) rectangle (5,5);% 切り抜き
\coordinate (O) at (0,0);
\coordinate (Q) at (2,2);
\coordinate (R) at (2,4);
\coordinate (P) at (1*1.2,2*1.2);
\draw (2,0) nodebelow {$t$}; \draw (R)--(2,0);
\end{tikzpicture}
\end{document}
条件分岐
何故かエラーを吐くことが多くて疲れたtakker.icon
目的の条件式を作っても計算してくれない
文法を理解していないのかも
整数と比較するときは、int()で整数型に明示的に変換しないといけなかったようだ
プログラムあるあるだけどさあ……こんなの気づかないって。
References
滅茶苦茶長い
officical manualをLWarpでHTMLに変換したもの animationを使ったTIkZの図もSVGに変換されててすごいtakker.icon
原理から解説しているもの
広範囲に渡る、TikZを使ったpackagesの紹介
作例集もある
うまい書き方の模索も少し載っている
有向グラフの作り方
原理的な話はない
事例集
topicごとに見れる
平面幾何問題の図