tikz
9
总安装量
9
周安装量
#32780
全站排名
安装命令
npx skills add https://github.com/igbuend/grimbard --skill tikz
Agent 安装分布
codex
9
opencode
9
gemini-cli
8
claude-code
8
github-copilot
8
kimi-cli
8
Skill 文档
TikZ/PGF â Vector Graphics & Diagrams
CTAN: https://ctan.org/pkg/pgf
Manual: texdoc tikz (~1300 pages)
Setup
\usepackage{tikz}
% Load libraries as needed:
\usetikzlibrary{arrows.meta, calc, positioning, decorations.pathmorphing,
patterns, shapes.geometric, shapes.misc, fit, backgrounds,
automata, trees, mindmap, circuits.logic.US}
Basic Drawing
Minimal Example
\begin{tikzpicture}
\draw (0,0) -- (2,0) -- (2,2) -- cycle; % triangle
\end{tikzpicture}
Path Operations
| Operation | Syntax | Example |
|---|---|---|
| Line | -- |
(0,0) -- (1,1) |
| Horizontal-vertical | -| | `(0,0) – |
| Vertical-horizontal | |- | `(0,0) |
| Curve | .. controls .. .. |
(0,0) .. controls (0.5,1) .. (1,0) |
| Smooth curve | to[out=..,in=..] |
(0,0) to[out=90,in=180] (2,1) |
| Arc | arc |
(0,0) arc (0:90:1cm) start:end:radius |
| Circle | circle |
(0,0) circle[radius=1] |
| Ellipse | ellipse |
(0,0) ellipse[x radius=2, y radius=1] |
| Rectangle | rectangle |
(0,0) rectangle (2,1) |
| Grid | grid |
(0,0) grid (3,3) |
| Parabola | parabola |
(0,0) parabola (2,2) |
| Sin/Cos | sin/cos |
(0,0) sin (1,1) |
| Plot | plot |
plot[domain=0:3] (\x, {\x^2}) |
| Cycle | cycle |
close path back to start |
Path Actions
| Command | Effect |
|---|---|
\draw |
Stroke the path |
\fill |
Fill the path |
\filldraw |
Fill and stroke |
\path |
Invisible path (for coordinates, nodes) |
\clip |
Clip subsequent drawing to path |
\shade |
Gradient fill |
\shadedraw |
Gradient fill + stroke |
\node |
Shorthand for \path node |
\coordinate |
Shorthand for \path coordinate |
Common Draw Options
\draw[
color=blue, % or just: blue
line width=1pt, % or: thin, thick, very thick, ultra thick
dashed, % or: dotted, dash dot, dash dot dot
dash pattern={on 3pt off 2pt},
rounded corners=5pt,
-> % arrow tip (see arrows section)
opacity=0.5,
double,
double distance=2pt,
] (0,0) -- (2,2);
Common Fill Options
\fill[
fill=blue!20, % 20% blue
fill opacity=0.5,
pattern=north lines, % requires patterns library
pattern color=gray,
] (0,0) rectangle (2,1);
Coordinate Systems
% Cartesian (default)
(2, 3)
% Polar (angle:radius)
(45:2cm)
% Relative (shift from last point)
++(1,0) % move reference point
+(1,0) % don't move reference point
% Named
\coordinate (A) at (1,2);
\draw (A) -- (2,3);
% Intersection (calc library)
\usetikzlibrary{calc}
($(A)!0.5!(B)$) % midpoint of A and B
($(A)!0.5!90:(B)$) % midpoint rotated 90°
($(A) + (1,2)$) % A shifted by (1,2)
($(A)!1cm!(B)$) % 1cm from A toward B
% Perpendicular coordinates (A -| B) = (x of B, y of A)
(A |- B) % (x of A, y of B)
% Barycentric
(barycentric cs:A=1,B=1,C=1) % centroid
Nodes
Basic Nodes
\node (name) at (0,0) {Text};
% Node options
\node[
draw, % draw border
fill=yellow!20,
rectangle, % shape (default)
circle,
ellipse,
rounded corners,
minimum width=2cm,
minimum height=1cm,
inner sep=5pt, % padding
outer sep=2pt, % margin
text=red,
font=\bfseries\small,
align=center, % for multi-line: use \\ in text
text width=3cm,
anchor=north, % positioning anchor
rotate=45,
] (mynode) at (1,2) {Hello\\World};
Node Anchors
north west north north east
ââââââââââââ
west â center â east
ââââââââââââ
south west south south east
Also: base, mid, text, and angle anchors like 45, 135.
Nodes on Paths
\draw (0,0) -- node[above] {label} (3,0);
\draw (0,0) -- node[midway, sloped, above] {sloped text} (3,2);
\draw (0,0) -- node[pos=0.3, below] {at 30\%} (3,0);
\draw (0,0) to[out=90,in=0] node[near start, left] {A} (2,2);
Common Shapes (requires libraries)
\usetikzlibrary{shapes.geometric, shapes.misc}
\node[diamond, draw] {D};
\node[star, draw, star points=5] {S};
\node[regular polygon, regular polygon sides=6, draw] {Hex};
\node[trapezium, draw] {T};
\node[cylinder, draw, shape border rotate=90] {DB};
\node[cloud, draw, cloud puffs=10] {Cloud};
\node[cross out, draw] at (0,0) {};
\node[strike out, draw] at (0,0) {};
Arrows
\usetikzlibrary{arrows.meta}
% Arrow tips (arrows.meta syntax)
\draw[->] (0,0) -- (1,0); % default
\draw[-Stealth] (0,0) -- (1,0); % filled triangle
\draw[-Latex] (0,0) -- (1,0); % larger filled
\draw[-{Stealth[length=5mm]}] (0,0) -- (1,0);
\draw[{Latex[red]}-{Latex[blue]}] (0,0) -- (1,0); % colored
\draw[-{>[scale=2]}] (0,0) -- (1,0);
% Common tips: >, Stealth, Latex, To, Circle, Square, |, Hooks
% Modifiers: [length=..], [width=..], [open], [fill=..], [scale=..]
Styles
% Define in preamble or tikzpicture options
\tikzset{
mybox/.style = {draw, fill=blue!20, rounded corners, minimum width=2cm},
myarrow/.style = {-Stealth, thick, red},
highlight/.style = {fill=yellow, draw=orange, line width=2pt},
}
% Use
\node[mybox] {Box};
\draw[myarrow] (0,0) -- (1,1);
% Style with parameters
\tikzset{
box/.style = {draw, fill=#1!20, minimum width=1.5cm},
box/.default = blue,
}
\node[box] {Blue}; % default
\node[box=red] {Red}; % override
% every node/.style applies to all nodes
\begin{tikzpicture}[every node/.style={font=\small}]
Foreach Loops
% Basic
\foreach \x in {0,1,2,3}
\draw (\x, 0) circle (0.3);
% With step
\foreach \x in {0,0.5,...,3}
\fill (\x,0) circle (1pt);
% Multiple variables
\foreach \x/\y in {0/A, 1/B, 2/C}
\node at (\x, 0) {\y};
% Counter
\foreach \x [count=\i] in {a,b,c,d}
\node at (\i, 0) {\x};
% Evaluate
\foreach \x [evaluate=\x as \y using \x*\x] in {1,...,5}
\fill (\x, \y/5) circle (2pt);
% Remember
\foreach \x [remember=\x as \lastx (initially 0)] in {1,...,5}
\draw (\lastx, 0) -- (\x, 0);
Scopes and Transformations
\begin{tikzpicture}
\draw (0,0) -- (1,0);
\begin{scope}[shift={(2,0)}, rotate=45, scale=0.5, red, thick]
\draw (0,0) -- (1,0) -- (1,1) -- cycle;
\end{scope}
% Transformations
% shift={(x,y)}, xshift=1cm, yshift=2cm
% rotate=45, rotate around={45:(1,1)}
% scale=2, xscale=2, yscale=0.5
% xslant=0.5, yslant=0.5
\end{tikzpicture}
Clipping
\begin{tikzpicture}
\clip (0,0) circle (1.5cm);
% Everything below is clipped to the circle
\fill[blue!30] (-2,-2) rectangle (2,2);
\draw[step=0.5, gray] (-2,-2) grid (2,2);
\end{tikzpicture}
Layers (backgrounds library)
\usetikzlibrary{backgrounds}
\begin{tikzpicture}
\node[draw, fill=white] (A) {Foreground};
\begin{pgfonlayer}{background}
\fill[yellow!30] (A.south west) rectangle (A.north east);
\end{pgfonlayer}
\end{tikzpicture}
Pics
\tikzset{
myshape/.pic = {
\draw (-0.5,-0.5) rectangle (0.5,0.5);
\draw (0,0) circle (0.3);
}
}
\begin{tikzpicture}
\pic at (0,0) {myshape};
\pic[rotate=45, scale=1.5] at (2,0) {myshape};
\end{tikzpicture}
Decorations
\usetikzlibrary{decorations.pathmorphing, decorations.markings, decorations.text}
% Wavy/zigzag lines
\draw[decorate, decoration={zigzag, amplitude=2mm, segment length=5mm}]
(0,0) -- (4,0);
\draw[decorate, decoration={snake, amplitude=1mm}]
(0,0) -- (4,0);
\draw[decorate, decoration={coil, aspect=0.5}]
(0,0) -- (4,0);
\draw[decorate, decoration={random steps, segment length=3mm}]
(0,0) -- (4,0);
% Brace
\draw[decorate, decoration={brace, amplitude=5pt}]
(0,0) -- (3,0) node[midway, above=5pt] {label};
% Text along path
\draw[decorate, decoration={text along path, text={Hello World}}]
(0,0) .. controls (1,1) .. (3,0);
% Markings (arrows along path)
\draw[decoration={markings, mark=at position 0.5 with {\arrow{>}}},
postaction={decorate}]
(0,0) -- (3,0);
Patterns
\usetikzlibrary{patterns}
\fill[pattern=north east lines] (0,0) rectangle (2,1);
\fill[pattern=crosshatch dots, pattern color=blue] (0,0) circle (1);
% Available: north east lines, north west lines, horizontal lines,
% vertical lines, crosshatch, dots, crosshatch dots,
% fivepointed stars, sixpointed stars, bricks, checkerboard
Common Diagram Patterns
Flowchart
\usetikzlibrary{arrows.meta, shapes.geometric, positioning}
\tikzset{
startstop/.style = {rectangle, rounded corners, draw, fill=red!20,
minimum width=3cm, minimum height=1cm},
process/.style = {rectangle, draw, fill=blue!20,
minimum width=3cm, minimum height=1cm},
decision/.style = {diamond, draw, fill=green!20,
minimum width=3cm, minimum height=1cm, aspect=1.5},
io/.style = {trapezium, trapezium left angle=70, trapezium right angle=110,
draw, fill=orange!20, minimum width=3cm, minimum height=1cm},
arrow/.style = {thick, -Stealth},
}
\begin{tikzpicture}[node distance=1.5cm]
\node[startstop] (start) {Start};
\node[io, below=of start] (input) {Input $x$};
\node[decision, below=of input] (decide) {$x > 0$?};
\node[process, below left=of decide] (neg) {$y = -x$};
\node[process, below right=of decide] (pos) {$y = x$};
\node[io, below=2cm of decide] (output) {Output $y$};
\node[startstop, below=of output] (stop) {Stop};
\draw[arrow] (start) -- (input);
\draw[arrow] (input) -- (decide);
\draw[arrow] (decide) -| node[near start, above] {No} (neg);
\draw[arrow] (decide) -| node[near start, above] {Yes} (pos);
\draw[arrow] (neg) |- (output);
\draw[arrow] (pos) |- (output);
\draw[arrow] (output) -- (stop);
\end{tikzpicture}
Tree
\begin{tikzpicture}[
level 1/.style={sibling distance=4cm},
level 2/.style={sibling distance=2cm},
every node/.style={draw, circle, minimum size=8mm},
edge from parent/.style={draw, -Stealth},
]
\node {1}
child { node {2}
child { node {4} }
child { node {5} }
}
child { node {3}
child { node {6} }
child { node {7} }
};
\end{tikzpicture}
Graph / Network
\usetikzlibrary{positioning}
\begin{tikzpicture}[
vertex/.style={draw, circle, fill=blue!20, minimum size=8mm},
edge/.style={thick},
>=Stealth,
]
\node[vertex] (a) at (0,2) {A};
\node[vertex] (b) at (2,3) {B};
\node[vertex] (c) at (4,2) {C};
\node[vertex] (d) at (2,0) {D};
\draw[edge] (a) -- node[above left] {3} (b);
\draw[edge] (b) -- node[above right] {2} (c);
\draw[edge] (a) -- node[below left] {7} (d);
\draw[edge] (c) -- node[below right] {1} (d);
\draw[edge] (b) -- node[right] {4} (d);
\end{tikzpicture}
Finite Automaton / State Machine
\usetikzlibrary{automata, positioning}
\begin{tikzpicture}[shorten >=1pt, node distance=2.5cm, on grid, auto,
every state/.style={draw, minimum size=1cm}]
\node[state, initial] (q0) {$q_0$};
\node[state, right=of q0] (q1) {$q_1$};
\node[state, accepting, right=of q1] (q2) {$q_2$};
\path[->]
(q0) edge node {a} (q1)
(q0) edge [loop above] node {b} ()
(q1) edge node {a,b} (q2)
(q1) edge [bend left] node {b} (q0)
(q2) edge [loop above] node {a} ();
\end{tikzpicture}
Mind Map
\usetikzlibrary{mindmap}
\begin{tikzpicture}[mindmap, grow cyclic,
every node/.style={concept, execute at begin node=\hskip0pt},
concept color=blue!40,
level 1/.append style={level distance=4cm, sibling angle=90},
level 2/.append style={level distance=2.5cm, sibling angle=45},
]
\node {Main Topic}
child[concept color=red!40] { node {Sub 1}
child { node {Detail A} }
child { node {Detail B} }
}
child[concept color=green!40] { node {Sub 2}
child { node {Detail C} }
}
child[concept color=orange!40] { node {Sub 3} }
child[concept color=purple!40] { node {Sub 4} };
\end{tikzpicture}
Block Diagram / System Diagram
\usetikzlibrary{positioning, arrows.meta, fit}
\begin{tikzpicture}[
block/.style={draw, rectangle, fill=blue!10, minimum height=1cm,
minimum width=2cm, align=center},
sum/.style={draw, circle, minimum size=6mm},
>=Stealth, thick,
]
\node[sum] (sum) {};
\node[block, right=1.5cm of sum] (ctrl) {Controller\\$G_c(s)$};
\node[block, right=1.5cm of ctrl] (plant) {Plant\\$G(s)$};
\node[block, below=1cm of plant] (fb) {Sensor\\$H(s)$};
\draw[->] ++(-1.5,0) -- node[above] {$R(s)$} (sum);
\draw[->] (sum) -- node[above] {$E(s)$} (ctrl);
\draw[->] (ctrl) -- (plant);
\draw[->] (plant) -- ++(2,0) node[above left] {$Y(s)$};
\draw[->] (plant.east) ++(1,0) |- (fb);
\draw[->] (fb) -| (sum) node[near end, left] {$-$};
\node at (sum) {$\Sigma$};
\end{tikzpicture>
Venn Diagram
\begin{tikzpicture}
\fill[red!20] (0,0) circle (1.5cm);
\fill[blue!20] (1.5,0) circle (1.5cm);
\begin{scope}
\clip (0,0) circle (1.5cm);
\fill[purple!30] (1.5,0) circle (1.5cm);
\end{scope}
\draw (0,0) circle (1.5cm) node[left=1cm] {$A$};
\draw (1.5,0) circle (1.5cm) node[right=1cm] {$B$};
\node at (0.75, 0) {$A \cap B$};
\end{tikzpicture}
Timeline
\begin{tikzpicture}
\draw[thick, -Stealth] (0,0) -- (10,0);
\foreach \x/\year/\event in {
1/2020/Founded,
3/2021/v1.0,
5.5/2022/IPO,
8/2023/Global%
}{
\draw (\x, -0.15) -- (\x, 0.15);
\node[above=3pt] at (\x, 0.15) {\footnotesize \year};
\node[below=3pt, align=center, text width=1.5cm] at (\x, -0.15) {\footnotesize \event};
}
\end{tikzpicture}
Circuit (Logic Gates)
\usetikzlibrary{circuits.logic.US}
\begin{tikzpicture}[circuit logic US, every circuit symbol/.style={thick}]
\node[and gate] (and1) at (2,1) {};
\node[or gate] (or1) at (4,0.5) {};
\draw (0,1.25) node[left] {$A$} -- (and1.input 1);
\draw (0,0.75) node[left] {$B$} -- (and1.input 2);
\draw (and1.output) -- (or1.input 1);
\draw (0,0) node[left] {$C$} -- (or1.input 2);
\draw (or1.output) -- ++(1,0) node[right] {$Y$};
\end{tikzpicture}
Commutative Diagram (Math)
\usetikzlibrary{positioning}
\begin{tikzpicture}[>=Stealth, node distance=2cm]
\node (A) {$A$};
\node (B) [right=of A] {$B$};
\node (C) [below=of A] {$C$};
\node (D) [right=of C] {$D$};
\draw[->] (A) -- node[above] {$f$} (B);
\draw[->] (A) -- node[left] {$g$} (C);
\draw[->] (B) -- node[right] {$h$} (D);
\draw[->] (C) -- node[below] {$k$} (D);
\end{tikzpicture}
Plot (built-in, no pgfplots)
\begin{tikzpicture}[scale=0.8]
\draw[->] (-0.5,0) -- (4.5,0) node[right] {$x$};
\draw[->] (0,-0.5) -- (0,3.5) node[above] {$y$};
\draw[blue, thick, domain=0:4, samples=100]
plot (\x, {sqrt(\x)});
\foreach \x in {1,...,4}
\draw (\x, 0.1) -- (\x, -0.1) node[below] {\x};
\foreach \y in {1,2,3}
\draw (0.1, \y) -- (-0.1, \y) node[left] {\y};
\end{tikzpicture}
Positioning Library
\usetikzlibrary{positioning}
% Relative positioning (preferred over manual coordinates)
\node[right=of A] (B) {B}; % default separation
\node[right=1.5cm of A] (B) {B}; % custom distance
\node[above right=1cm and 2cm of A] (B) {B}; % separate x/y
% Available: above, below, left, right,
% above left, above right, below left, below right
Fit Library
\usetikzlibrary{fit}
% Draw a box around multiple nodes
\node[draw, dashed, fit=(A) (B) (C), inner sep=5pt, label=above:Group] {};
Calc Library Key Operations
\usetikzlibrary{calc}
% Midpoint
($(A)!0.5!(B)$)
% Point 1cm from A toward B
($(A)!1cm!(B)$)
% Projection of C onto line AB
($(A)!(C)!(B)$)
% Rotated point: midpoint of AB rotated 90° around A
($(A)!0.5!90:(B)$)
% Vector addition
($(A) + (1,2)$)
% Scalar multiply
($2*(A) - (B)$)
% let syntax for complex calculations
\draw let \p1 = ($(B)-(A)$),
\n1 = {veclen(\x1,\y1)}
in (A) circle (\n1);
Externalizing (Caching) Figures
% In preamble â compiles each tikzpicture once, reuses PDF
\usetikzlibrary{external}
\tikzexternalize[prefix=tikz-cache/]
% To skip a figure:
\tikzexternaldisable
\begin{tikzpicture} ... \end{tikzpicture}
\tikzexternalenable
Requires --shell-escape flag: pdflatex --shell-escape main.tex
Common Pitfalls
| Problem | Cause | Fix |
|---|---|---|
| “Dimension too large” | Coordinates too big | Use scale or smaller coords |
| Missing arrow tips | Forgot arrows.meta library |
\usetikzlibrary{arrows.meta} |
| Node text cut off | Node too small | Add minimum width, text width |
positioning not working |
Forgot library | \usetikzlibrary{positioning} |
| Nodes overlap | Using at instead of relative |
Use right=of with positioning lib |
foreach errors |
Special chars in body | Wrap body in {} |
| Path not closing | Forgot cycle |
End path with -- cycle |
| Slow compilation | Complex figures | Use external library for caching |
| Math in nodes | $ conflicts |
Use $...$ inside node text normally |
| Colors not found | Missing xcolor | TikZ loads xcolor; use \usepackage[dvipsnames]{xcolor} before tikz for extra colors |
Tips
- Use
positioninglibrary â never hardcode coordinates for node layouts \tikzsetin preamble for reusable styles across figuresevery node/.style,every path/.stylefor consistent appearance- Use
\begin{scope}to limit option scope name path=X+name intersections(intersections library) to find crossing points- For standalone figures:
\documentclass[tikz]{standalone} spylibrary for magnification insetspgfplotstablefor data-driven diagrams (see pgfplots skill)