LaTeX Tikz 绘图积累
Tikz 绘图的内容非常复杂,目前没有精力去仔细学习,只是简单记录一些可能用到的例子。一部分例子是我自己绘制的,更多的则是参考的网上公开资料。
Tikz 相关教程例如:TikZBolg。
有一些在线绘图工具可以可视化绘制简单图形,并导出 Tikz 代码,例如:Mathcha。
对于更复杂的需求,可以使用专业的矢量图绘制软件(例如 Inkscape) 绘制并导出 Tikz 代码。
函数图像

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass{article} |
线性代数

1 | \documentclass{article} |
几何图像

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |
一维空间离散网格

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |
二维空间离散网格
下图应该是用其它专业软件制作后转换为 tikz 的,代码参考 https://arxiv.org/abs/2502.20883。

1 | \documentclass[border=2mm]{standalone} |
tikz 批注公式
可以利用 tikz
宏包在给数学公式加上背景颜色以及标注。(受到 synercys/annotated_latex_equations
的启发)





实现原理比较复杂:
- 在公式环境中通过
\tikzmarknode命令留下绘图锚点; - 在
tikzpicture环境中绘制标注,需要利用前面留下的绘图锚点; - 使用
figure环境包裹公式和标注作为浮动体(否则标注可能会与其他段落混杂在一起,难以保持合适间距)。
完整源码如下 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241\documentclass{article}
\usepackage{amsmath}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\pagestyle{empty}
\begin{document}
\begin{figure}[htbp]
\centering
\vspace{2\baselineskip}
\begin{equation*}
\rho
\left(
\frac{\partial \mathbf{u}}{\partial t}
+
\tikzmarknode{uconv}{\colorbox{Bittersweet!20}{$\mathbf{u}\cdot\nabla \mathbf{u}$}}
\right)
=
-\tikzmarknode{gradp}{\colorbox{OliveGreen!20}{$\nabla p$}}
+
\tikzmarknode{visc}{\colorbox{Orange!40}{$\mu \nabla^2 \mathbf{u}$}}
+
\tikzmarknode{f}{\colorbox{RoyalBlue!20}{$\mathbf{f}$}}
\end{equation*}
\begin{tikzpicture}[overlay,remember picture,>=stealth,
nodes={align=left,inner ysep=1pt},<-]
% Convective term
\path (uconv.south) ++ (0,-1.0em)
node[anchor=north east,color=Bittersweet!85] (uconv_text)
{\scriptsize convective acceleration};
\draw[color=Bittersweet] (uconv.south) |- (uconv_text.north west);
% Pressure gradient
\path (gradp.north) ++ (0,1.0em)
node[anchor=south east,color=OliveGreen!85] (gradp_text)
{\scriptsize pressure gradient force};
\draw[color=OliveGreen] (gradp.north) |- (gradp_text.south west);
% Viscous diffusion
\path (visc.south) ++ (0,-1.0em)
node[anchor=north west,color=Orange!85] (visc_text)
{\scriptsize viscous diffusion term};
\draw[color=Orange] (visc.south) |- (visc_text.north east);
% Body force
\path (f.north) ++ (0,1.0em)
node[anchor=south west,color=RoyalBlue!85] (f_text)
{\scriptsize body force};
\draw[color=RoyalBlue] (f.north) |- (f_text.south east);
\end{tikzpicture}
\vspace{1.5\baselineskip}
\caption{Annotated Navier–Stokes momentum equation.}\label{fig:ns_annotated}
\end{figure}
\begin{figure}[htbp]
\centering
\vspace{2\baselineskip}
\begin{equation*}
\partial_t f + \tikzmarknode{transport}{\colorbox{Bittersweet!20}{$v \cdot \nabla_x f$}}
+ \tikzmarknode{acceleration}{\colorbox{OliveGreen!20}{$\frac{F}{m} \cdot \nabla_v f$}}
=
\tikzmarknode{collision}{\colorbox{RoyalBlue!20}{$C(f)$}}.
\end{equation*}
\begin{tikzpicture}[overlay,remember picture,>=stealth,
nodes={align=left,inner ysep=1pt},<-]
\path (transport.south) ++ (0,-1.0em)
node[anchor=north east,color=Bittersweet!85] (transport_text)
{\scriptsize transport};
\draw[color=Bittersweet] (transport.south) |- (transport_text.north west);
\path (acceleration.south) ++ (0,-1.0em)
node[anchor=north west,color=OliveGreen!85] (acceleration_text)
{\scriptsize acceleration};
\draw[color=OliveGreen] (acceleration.south) |- (acceleration_text.north east);
\path (collision.north) ++ (0,1.0em)
node[anchor=south west,color=RoyalBlue!85] (collision_text)
{\scriptsize collision};
\draw[color=RoyalBlue] (collision.north) |- (collision_text.south east);
\end{tikzpicture}
\vspace{1.5\baselineskip}
\caption{Annotated Boltzmann equation.}\label{fig:boltzmann_annotated}
\end{figure}
\begin{figure}[htbp]
\centering
\vspace{2\baselineskip}
\begin{align*}
& \partial_t f
+
\tikzmarknode{vp_transport}{\colorbox{Bittersweet!20}{$v\cdot\nabla_x f$}}
+
\tikzmarknode{vp_force}{\colorbox{OliveGreen!20}{$E\cdot\nabla_v f$}}
=
0,
\\
& E = -\nabla_x \phi,
\quad
-\Delta_x \phi = \int f\,dv - \rho_0.
\end{align*}
\begin{tikzpicture}[overlay,remember picture,>=stealth,
nodes={align=left,inner ysep=1pt},<-]
% Transport
\path (vp_transport.north) ++ (0,1.0em)
node[anchor=south east,color=Bittersweet!85] (vp_transport_text)
{\scriptsize transport};
\draw[color=Bittersweet] (vp_transport.north) |- (vp_transport_text.south west);
% Force term
\path (vp_force.north) ++ (0,1.0em)
node[anchor=south west,color=OliveGreen!85] (vp_force_text)
{\scriptsize acceleration};
\draw[color=OliveGreen] (vp_force.north) |- (vp_force_text.south east);
\end{tikzpicture}
\vspace{1.5\baselineskip}
\caption{Annotated Vlasov–Poisson equation.}
\end{figure}
\begin{figure}[htbp]
\centering
\vspace{2\baselineskip}
\begin{equation*}
\varepsilon\,
\partial_t I
+
\tikzmarknode{rte_transport}{\colorbox{OliveGreen!20}{$\Omega\, \partial_x I$}}
=
\tikzmarknode{rte_relax}{\colorbox{RoyalBlue!20}{$\frac{\sigma^s}{\varepsilon}(\langle I\rangle - I)$}}
-
\tikzmarknode{rte_absorb}{\colorbox{Orange!40}{$\varepsilon\,\sigma^a I$}}
+
\tikzmarknode{rte_source}{\colorbox{YellowGreen!35}{$\varepsilon\,Q$}}
\, .
\end{equation*}
\begin{tikzpicture}[overlay,remember picture,>=stealth,
nodes={align=left,inner ysep=1pt},<-]
% Transport
\path (rte_transport.south) ++ (0,-1.0em)
node[anchor=north east,color=OliveGreen!85] (rte_transport_text)
{\scriptsize transport};
\draw[color=OliveGreen] (rte_transport.south) |- (rte_transport_text.north west);
% Collision relaxation
\path (rte_relax.north) ++ (0,1.0em)
node[anchor=south east,color=RoyalBlue!85] (rte_relax_text)
{\scriptsize scattering};
\draw[color=RoyalBlue] (rte_relax.north) |- (rte_relax_text.south west);
% Absorption term
\path (rte_absorb.south) ++ (0,-1.0em)
node[anchor=north west,color=Orange!85] (rte_absorb_text)
{\scriptsize absorption};
\draw[color=Orange] (rte_absorb.south) |- (rte_absorb_text.north east);
% Source term
\path (rte_source.north) ++ (0,1.0em)
node[anchor=south west,color=YellowGreen!95] (rte_source_text)
{\scriptsize source term};
\draw[color=YellowGreen] (rte_source.north) |- (rte_source_text.south east);
\end{tikzpicture}
\vspace{1.4\baselineskip}
\caption{Annotated one-dimensional radiative transfer equation in diffusive scaling.}
\end{figure}
\begin{figure}[htbp]
\centering
\vspace{2\baselineskip}
% Scaled TRT equation
\begin{align*}
\frac{\varepsilon}{c}\partial_t I
+
\tikzmarknode{transport}{\colorbox{OliveGreen!20}{$\Omega\cdot\nabla_x I$}}
={} &
\tikzmarknode{relax}{\colorbox{RoyalBlue!20}{$\frac{\sigma^s}{\varepsilon} \left(\frac{\phi}{4\pi}-I\right)$}}
-
\tikzmarknode{abs}{\colorbox{Orange!40}{$\varepsilon\,\sigma^a I$}}
+
\tikzmarknode{emit}{\colorbox{YellowGreen!35}{$\varepsilon\,\sigma^a B(T)$}} .
\\
C_v\,\partial_t T
={} &
\tikzmarknode{couple}{\colorbox{Plum!25}{$\sigma^a(\phi-4\pi B(T))$}} .
\end{align*}
\begin{tikzpicture}[overlay,remember picture,>=stealth,
nodes={align=left,inner ysep=1pt},<-]
% Transport
\path (transport.north) ++ (0,1.0em)
node[anchor=south east,color=Bittersweet!85] (transport_text)
{\scriptsize transport};
\draw[color=Bittersweet] (transport.north) |- (transport_text.south west);
% relaxation
\path (relax.north) ++ (0,1.0em)
node[anchor=south west,color=RoyalBlue!85] (relax_text)
{\scriptsize scattering};
\draw[color=RoyalBlue] (relax.north) |- (relax_text.south east);
% absorption
\path (abs.north) ++ (0,1.0em)
node[anchor=south west,color=Orange!85] (abs_text)
{\scriptsize absorption};
\draw[color=Orange] (abs.north) |- (abs_text.south east);
% emission
\path (emit.north) ++ (0,1.0em)
node[anchor=south west,color=YellowGreen!85] (emit_text)
{\scriptsize material thermal emission};
\draw[color=YellowGreen] (emit.north) |- (emit_text.south east);
% coupling
\path (couple.south) ++ (0,-1.0em)
node[anchor=north west,color=Plum!85] (couple_text)
{\scriptsize radiation--material coupling};
\draw[color=Plum] (couple.south) |- (couple_text.north east);
\end{tikzpicture}
\vspace{1.5\baselineskip}
\caption{Scaled thermal radiative transfer equations in diffusive scaling.}
\end{figure}
\end{document}
tikz-cd 交换图

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |
数据结构

1 | \documentclass[border=2mm]{standalone} |

1 | \documentclass[border=2mm]{standalone} |
关于树结构,还可以使用专门的宏包
forest

1 | \documentclass[border=2mm]{standalone} |

1 | % This file is from Weihao Xia, Jing-Hao Xue. A Survey on 3D-aware Image Synthesis. https://arxiv.org/abs/2210.14267 |
补充:PDF 转 PNG
提供一个基于 gs 将 PDF 格式的图片转换为 PNG 的脚本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将当前目录下所有 PDF 转成高分辨率 PNG,每页单独输出,保留原文件名
DPI=600
# 遍历当前目录下所有 PDF 文件
for pdf in *.pdf; do
# 去掉扩展名
filename="${pdf%.pdf}"
# 使用 Ghostscript 转 PNG,每页生成一个文件,带页码
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r$DPI -sOutputFile="${filename}-%d.png" "$pdf"
echo "Converted $pdf -> ${filename}-%d.png"
done
echo "All PDFs converted to high-resolution PNG."