简介
简介
环境配置
代码类型: tikz
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
...
\end{tikzpicture}
\end{document}可用package
The following packages are available in \usepackage{}:
- chemfig
 - tikz-cd
 - circuitikz
 - pgfplots
 - array
 - amsmath
 - amstext
 - amsfonts
 - amssymb
 - tikz-3dplot
 
部分package示例
- 3D线图: 
\usepackage{tikz-3dplot} - 网格图: 
\usepackage{pgfplots} - 电路: 
\usepackage{circuitikz} - 交换图: 
\usepackage{tikz-cd} - 有机化学: 
\usepackage{chemfig} 
禁止使用
\documentclass{article}
会导致报错
配置项
颜色
TikZ 内置了一些常见的颜色方案,方便绘图时使用。这些颜色可以直接引用,也可以通过 xcolor 包扩展。以下是主要内置颜色方案:
常用颜色
- 基础颜色:
-blackwhiteredgreenbluecyanmagentayellow
 - 灰度颜色(通过数值指定,
0表示黑,1表示白):gray(例如gray!50表示 50% 灰色)
 
混合颜色
- TikZ 支持颜色混合,语法为 
color1!percentage!color2。 例如:red!50!blue:红色和蓝色各占 50%。green!30!white:绿色占 30%,白色占 70%。
 
其他内置颜色
通过加载 xcolor 扩展包,可以使用更多颜色:
- 自然颜色: 
brownlimeorangepinkvioletpurpletealolive
 - Web 颜色(需要 
dvipsnames选项支持):AquamarineNavyBlueSkyBlueEmeraldPeriwinkleSepia
 
自定义颜色
你也可以通过以下方式定义自定义颜色:
- RGB 模式:
\definecolor{mycolor}{rgb}{0.2, 0.4, 0.6} - HTML 颜色代码:
\definecolor{mycolor}{HTML}{1A2B3C} - CMYK 模式:
\definecolor{mycolor}{cmyk}{0.1, 0.2, 0.3, 0.4} 
应用方式
在 TikZ 中,可以通过以下方式应用颜色:
- 改变线条颜色:
\draw[red] (0,0) -- (1,1); - 改变填充颜色:
\fill[blue] (0,0) rectangle (1,1); - 组合颜色属性:
\draw[fill=yellow,draw=red] (0,0) circle (1cm); 
通过这些内置和扩展颜色,几乎可以满足大多数绘图需求
方向参数
- above
 - below
 - left
 - right
 
定义变量
定义: \def\angleA{30}
 使用: \draw[thick] (0,0) -- ({1*cos(\angleA)},{1*sin(\angleA)});
2D图
- 定义变量的范围: 
\draw[domain= 0:1,smooth,variable=\x] 
3D图
旋转体
- 观察角:
% 设置 3D 视角(俯仰角 80° 通常是固定的; 水平旋转角 120°, 或90°)\tdplotsetmaincoords{80}{120} - 实线绘制边缘
\draw[smooth, thick],
根据水平旋转角 120°, 绘制另一边120°+180°=300° ,两条边. - 根据俯仰角, 可能会调整, 如: 
- 110度, 按感觉改的, 120°-10°=110°
 - 另一条边也是因为倾斜视图的原因, 120°+180°+10°=310°
 
 - 虚线绘制主平面投影
\draw[dashed] - 仅有实体形状才使用加粗
\draw[smooth, thick], 如: 圆柱的底部,顶部,边界 用实线绘制, 没有明确指定则不调整颜色 - 相交平面使用 填充透明度0.2: 
\fill[black!20,opacity=0.2] 
填充方法
在 TikzJax 环境中,不同的填充有不同的最佳实践:
A. 纯色填充 (Solid Color Fills)
原则:优先使用 \fill 或 \filldraw。
 说明:对于简单的封闭图形(如 circle, rectangle 或 ... -- cycle 路径),直接使用 \fill 命令填充颜色。这比 clip 方式更直接,解析负担更小。
 示例:
 代码段
% 正确做法
\fill[blue!50] (0,0) rectangle (2,2);
\draw[thick, red] (0,0) -- (1,1) -- (0,1) -- cycle;B. 斜线/图案填充 (Hatching/Pattern Fills)
原则:必须使用 \clip 配合 \foreach。
 说明:这是在 TikzJax 中实现图案填充的唯一标准方法。先用 \clip 和一个精确的封闭路径来定义剪裁区域,然后在这个区域内部用 \foreach 绘制一系列足够大的平行线。
 示例:
 代码段
% 这是实现斜线填充的【标准范式】
\begin{scope}
  \clip (0,0) circle (1); % 1. 用精确路径剪裁
  \foreach \i in {-1.5,-1.2,...,1.5} { % 2. 在内部绘制足够大的线条
    \draw[red!70] (-1.5,\i) -- (1.5,\i);
  }
\end{scope}
\draw (0,0) circle (1); % 3. 最后绘制边界斜线填充
这类多边形斜线填充的核心实现方法是:使用 \clip 限定填充区域,再用 \foreach 搭配 \draw 逐条绘制平行斜线。
三角形
不规则多边形填充
利用指定轮廓线进行 clip, 从而避免了不规范的遮挡操作
代码优化点:
- 斜线填充: 
- 不能使用 
\foreach在\clip内部,因此 使用\clip限制区域,然后绘制一系列平行线,保证它们只出现在圆内部。 - 这里的 
\foreach \y in {-1.5,-1.2,...,1.5}产生 从左到右的斜线。 
 - 不能使用 
 - 旋转箭头: 
- 直接用 
arc[start angle=0,end angle=45]绘制 顺时针旋转的小箭头。 
 - 直接用 
 
颜色填充
% 填充阴影区域
\begin{scope} \clip (0,-1.5) rectangle (1,0); \fill[black!20,opacity=0.7] plot[domain=0.01:1,smooth]({\x}, {ln(\x)}) -- (1,0) -- (0,0) -- cycle; \end{scope}% 内层
\draw[fill=red!80,fill opacity=0.5] 
	plot[variable=\t,domain=\thetaEdgeB:\thetaEdgeA,smooth] ({2*cos(\t)},{2*sin(\t)},{2}) 
 -- plot[variable=\t,domain=\thetaEdgeA:\thetaEdgeB,smooth] ({cos(\t)},{sin(\t)},{1}) 
 -- cycle;标准绘图原则
✅ 2D:确保 y 轴范围受控,避免 TikzJax 计算溢出
 ✅ 3D:固定 \tdplotsetmaincoords{80}{120},只绘制关键轮廓
 ✅ 曲线:使用 smooth 和 samples=100,提高解析精度
 ✅ 颜色:仅用黑白,避免 colormap 和 fill opacity
 ✅ 阴影:尽量 filldraw 而非 clip,减少 TikzJax 解析负担
Polygon
You can use the geometric shapes given by the shapes.geometric library
\usetikzlibrary{shapes.geometric}
\begin{tikzpicture}[mystyle/.style={draw,shape=circle,fill=blue}]
\def\ngon{5}
\node[regular polygon,regular polygon sides=\ngon,minimum size=3cm] (p) {};
\foreach\x in {1,...,\ngon}{\node[mystyle] (p\x) at (p.corner \x){};}
\foreach\x in {1,...,\numexpr\ngon-1\relax}{
  \foreach\y in {\x,...,\ngon}{
    \draw (p\x) -- (p\y);
  }
}
\end{tikzpicture}One short tikz code without use of a library.
\documentclass[border=7mm]{standalone}
\usepackage{tikz}
\begin{document}
\foreach \n in {3,...,7}
  \tikz\foreach \i in {1,...,\n}
    \fill (\i*360/\n:1) coordinate (n\i) circle(2 pt)
      \ifnum \i>1 foreach \j in {\i,...,1}{(n\i) edge (n\j)} \fi;
\end{document}For fun, a short code with pst-poly gets the desired result:
\documentclass[svgnames]{standalone}
\usepackage{pst-poly}
\usepackage{auto-pst-pdf}
\begin{document}
\psset{unit=3.5cm, dimen=middle, linejoin=1, dotsize=12pt}
\begin{pspicture}(-1,-1)(1,1)
    \providecommand{\PstPolygonNode}{\psdots[dotsize=12pt, linecolor=SteelBlue](1;\INode)
    }
    \rput(0,0){\PstPentagon[PolyName=A, linecolor=LightSteelBlue, linewidth=1.2pt] }
    \rput(0,0){\PstPentagon[PolyName=A, PolyOffset=2] }
\end{pspicture}
\end{document}Upgrade: An improved version, which itself calculate all necessary data from given number of nodes and angle of the first node position:
\documentclass[border=3mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}[
 every node/.style={draw,shape=circle,fill=blue,text=white}]
%%%% variable data data
\def\numpoly{8}%number of nodes
\def\startangle{30}%direction of the first node
\def\pradious{33mm}
%------- calculations of the positions angles
\pgfmathparse{int(\startangle+360/\numpoly)}%
    \let\nextangle=\pgfmathresult
\pgfmathparse{int(\startangle-360/\numpoly+360)}%
    \let\endtangle=\pgfmathresult
%--- nodes
    \foreach \i [count=\ii from 1] in {\startangle,\nextangle,...,\endtangle}
\path (\i:\pradious) node (p\ii) {\ii};
%--- interconnections
    \foreach \x in {1,...,\numpoly}
        \foreach \y in {\x,...,\numpoly}
\draw (p\y) -- (p\x);
    \end{tikzpicture}
\end{document}案例
2D
3D
必须需要导入 \usepackage{tikz-3dplot} 包!
真实边缘轮廓的角度为 \tdplotsetmaincoords{80}{120} 后者120和其补角: 120+180, 这两个线是真实视角边缘轮廓线
3D直角坐标平面案例
- 表 (a) 方程组有解的情形
 
| 图形 | 几何意义 | 代数表达 | 
|---|---|---|
| 1 | 三张平面相交于一点 | |
| 2 | 三张平面相交于一条直线 | ,且 中任意两个向量线性无关 | 
| 3 | 两张平面重合,第三张平面与之相交 | ,且 中有两个向量线性相关 | 
| 4 | 三张平面重合 | 
- 表 (b) 方程组无解的情形
 
| 图形 | 几何意义 | 代数表达 | 
|---|---|---|
| 5 | 三张平面两两相交,且交线相互平行 | ,且 中任意两个向量都线性无关 | 
| 6 | 两张平面平行,第三张平面与它们相交 | ,且 中有两个向量线性相关 | 
标准旋转体填充
以后旋转体都严格按照这个模式进行
树状图
纵向
横向
在 tikz 画横向树时,默认情况下 兄弟节点(sibling nodes)会均匀分布,但如果一个分支有更多层次的节点,而另一个分支较浅,TikZ 可能会 将较浅的分支的节点与较深分支的部分节点重叠。
解决方案
- 使用 
level distance让层级间距适应不同深度level distance设定层间距离,但 TikZ 不能自动为深度不同的子树调整距离。- 可以 单独设置特定层级的 
sibling distance以避免重叠。 
 - 增加 
sibling distance以避免重叠sibling distance控制同一级别节点的水平间隔。- TikZ 默认让兄弟节点 均匀分布,但我们可以 手动增加间隔。
 
 - **手动调整特定子树的 `level distance 
- 可以 为不同的层级设置不同的 
level distance让它们分布得更合理。 
 - 可以 为不同的层级设置不同的 
 
其他案例
一个失败的案例, 原因是忘记导入 \usepackage{tikz-3dplot} 包了, 加上就好
Automaton
tikz绘制自动机的状态转移图示例:
多边形
example
绘图失败原因汇总
1. 计算溢出
- 问题:高次幂、多项式计算导致 TikzJax 计算失败。
 - 解决方案: 
- 限制 
y轴范围:max(y_{\min}, min(y_{\max}, f(x))) - 降低幂次:尝试分解或近似表示。
 
 - 限制 
 
2. 超出坐标轴范围
- 问题:曲线部分超出可视范围,导致图像部分缺失或溢出。
 - 解决方案: 
- 手动设置 
x和y轴范围,例如domain=0.5:4.5, ymin=-2, ymax=2。 
 - 手动设置 
 
3. TikzJax 不支持 pgfplots
- 问题:在 Obsidian 中,
pgfplots不能直接使用。 - 解决方案: 
- 只用 
\draw plot,不要\addplot和\begin{axis}。 - 预计算点值并手动绘制。
 
 - 只用 
 
4. 计算精度问题
- 问题:某些 
plot计算 TikzJax 解析失败。 - 解决方案: 
- 增加 
samples,如samples=100。 - 复杂计算分步执行,或使用 
foreach逐点绘制。 
 - 增加 
 
5. 3D 视角错误
- 问题:3D 视角不符合需求,导致 
x, y, z轴方向不正确。 - 解决方案: 
- 设定 
\tdplotsetmaincoords{80}{120}统一标准视角。 - 只绘制主要轮廓,去除 
surf填充。 
 - 设定 
 
6. 颜色与 TikzJax 兼容问题
- 问题:某些 
colormap、opacity设置可能导致 TikzJax 解析失败。 - 解决方案: 
- 避免 
colormap,只用black!50、gray。 - 使用 
pattern代替fill opacity。 
 - 避免 
 
7. 复杂阴影填充失败
- 问题:
clip可能导致 TikzJax 解析异常。 - 解决方案: 
- 先用 
\clip限制区域,再\fill。 - 避免 
clip,改用filldraw手动绘制封闭区域。 
 - 先用 
 
8. 关键点与标注
- 问题:关键点未标记,导致数学分析不直观。
 - 解决方案: 
- 使用 
\node[below]明确标注关键点(如x=1,2,3,4)。 - 方程统一放置在右上角:
\node[anchor=west]。 
 - 使用 
 
9. 忘记导入3d包
- 问题:忘记导入3d包,导致无法加载3d图形。
 - 解决方案:使用 
\usepackage{tikz-3dplot}导入tikz-3dplot包 
10. 坐标轴
- 坐标轴绘制, 不要使用白色: 
\draw[->,white]在黑暗模式下会看不清 
绘图经验总结
1. 轴刻度
- X 轴、Y 轴刻度需完整标注,避免遗漏关键点:
\foreach \x in {1,2,3} { \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$}; } 
2. 分段函数绘制
- 端点处理: 
- 闭区间(取值): 
\filldraw (x,y) circle (2pt); - 开区间(不取值): 
\draw[fill=white] (x,y) circle (2pt); 
 - 闭区间(取值): 
 - 避免错误连接,分段独立绘制:
\draw[thick] (a,b) -- (c,d); % 正常直线 \draw[thick,->] (a,b) -- (c,d); % 延伸部分 
3. 标注
- 紧靠对应函数段落,避免放远处:
\node[above] at (0.5,2) {$Y=2\ (X\leq1)$}; 
4. 绘图范围控制
- 局部调整,避免全局修改,保证 X<0 和 X>3 不受影响。
 - 箭头 (
->) 只用于表示无限延伸。 
5. 代码结构
- 顺序:坐标轴 → 刻度 → 线条 → 端点 → 标注。
 - 使用 
scale=1确保显示正常:\begin{tikzpicture}[scale=1]