简介
简介
环境配置
代码类型: 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
包扩展。以下是主要内置颜色方案:
常用颜色
- 基础颜色:
-black
white
red
green
blue
cyan
magenta
yellow
- 灰度颜色(通过数值指定,
0
表示黑,1
表示白):gray
(例如gray!50
表示 50% 灰色)
混合颜色
- TikZ 支持颜色混合,语法为
color1!percentage!color2
。 例如:red!50!blue
:红色和蓝色各占 50%。green!30!white
:绿色占 30%,白色占 70%。
其他内置颜色
通过加载 xcolor
扩展包,可以使用更多颜色:
- 自然颜色:
brown
lime
orange
pink
violet
purple
teal
olive
- Web 颜色(需要
dvipsnames
选项支持):Aquamarine
NavyBlue
SkyBlue
Emerald
Periwinkle
Sepia
自定义颜色
你也可以通过以下方式定义自定义颜色:
- 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);
通过这些内置和扩展颜色,几乎可以满足大多数绘图需求
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]
斜线填充
在 Obsidian 的 TikZ 环境(tikzjax) 下,斜线填充不能使用 \foreach
循环或者 patterns
,因此可以用 \clip
加 \fill
来手动绘制斜线填充。下面是修正后的 tikzjax 兼容代码:
代码优化点:
- 斜线填充:
- 不能使用
\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
TikZ 绘图失败原因与解决方案总结
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]
在黑暗模式下会看不清
TikZJax 绘图经验总结
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]