简介
简介
环境配置
代码类型: tikz
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
...
\end{tikzpicture}
\end{document}可用宏包
%%AvailablePackages%%
The following packages are available in \usepackage{}:
- chemfig
- tikz-cd
- circuitikz
- pgfplots
- array
- amsmath
- amstext
- amsfonts
- amssymb
- tikz-3dplot
宏包用途示例
- 3D线图:
\usepackage{tikz-3dplot} - 网格图:
\usepackage{pgfplots} - 电路:
\usepackage{circuitikz} - 交换图:
\usepackage{tikz-cd} - 有机化学:
\usepackage{chemfig}
说明: 当前本库插件版本为 Obsidian TikZJax 0.5.2, 以上 package 均可以写入\usepackage{}. 本轮列出的opacity,fill opacity,\clip,\foreach,\fill和\filldraw对照案例也已由用户确认能够成功绘图. package 可用说明插件能够加载它; 若某幅复杂图仍然失败, 应检查该图使用的具体命令, 计算范围和组合方式.
禁止使用
\documentclass{article}
会导致报错- tikz 代码内的可见文本 (如
\node,\draw标注) 禁止出现中文汉字
TikzJax 渲染时缺少中文字体, 中文会显示为乱码. 图内文字一律使用英文, 数学公式或符号 (如union,$H(X)$) . - tikz 代码内禁止出现"并集/交集" 等用途的图形绘制
韦恩图中的并集 (联合熵) 等"整体区域" 不作为图形元素绘制, 仅通过文字标注或外围文档说明. - 填充色禁止过于鲜艳 (如
red!50以上的高浓度纯色) 且禁止使用fill opacity
鲜艳填充会与白色文字重叠导致看不清. 区域填充统一使用低浓度淡色 (red!10,green!10,blue!18等) , 文字始终使用默认黑色. 这里禁止fill opacity是本库新图的视觉规范, 不是渲染能力判断; 现有透明填充示例能够渲染, 不因此机械删除. - 区域区分禁止仅依赖填充色深浅
在 darkmode 下, 低浓度淡色填充与深色背景融为一体, 文字 (自动变灰) 与底色过于接近, 导致区域与标签均不可辨. 必须叠加斜线/网格填充 (\clip+\foreach \draw, 见"斜线/图案填充" 节) : 用线条方向区分区域, 如 H(X|Y) NW-SE, H(Y|X) NE-SW, I(X;Y) 竖直. 线条颜色可用red!80等中高浓度, 因为线条本身就是信息载体, 不依赖底色亮度.
配置项
颜色
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], 如: 圆柱的底部,顶部,边界 用实线绘制, 没有明确指定则不调整颜色 - 相交平面可以用透明填充表现覆盖关系, 也可以用轮廓, 虚实线或斜线区分; 综合案例见后文"相交平面" .
填充方法
斜线填充和纯色填充都已确认能够成功绘图. 这里需要判断的是哪一种更适合表达当前内容, 而不是哪一种"能不能渲染" .
| 方法 | 优点 | 适合情况 | 注意事项 |
|---|---|---|---|
| 斜线/图案填充 | 不依赖背景亮度; 多个区域可用不同方向区分 | 韦恩图, 信息图, 需要兼顾 darkmode 的区域区分 | 需要 \clip 限定边界; 线条过密会遮挡文字并增加代码量 |
| 纯色填充 | 画面简洁; \fill / \filldraw 代码短 | 单一区域, 文字较少, 浅色填充已经足够清楚 | 新图使用低浓度淡色; 不要只靠颜色深浅表达多个区域 |
A. 斜线填充
%%HatchingFills%%
当区域必须在浅色和深色主题下都能区分, 或者多个区域需要表达不同语义时, 优先使用斜线或网格. 基本写法是先用 \clip 限定封闭区域, 再用 \foreach 和 \draw 画平行线, 最后补画边界.
圆形区域
下面用圆形展示最简单的剪裁和斜线填充:
代码说明
- 斜线填充:
- 在
\begin{scope} ... \end{scope}内先用\clip限定区域, 再用\foreach绘制平行线, 线条就不会越过目标边界. - 循环范围要覆盖整个剪裁区域, 但不要为了"保险" 画过多线条; 线条过密会遮挡标签, 也会让代码难以调整.
- 上面圆形例子中的线段从左端较低的位置连到右端较高的位置, 因此视觉上是向右上方倾斜.
- 在
- 旋转箭头:
- 在普通平面坐标中,
arc[start angle=0,end angle=45]绘制的是 逆时针方向的小箭头.
- 在普通平面坐标中,
B. 纯色填充
%%SolidColorFills%%
简单的封闭区域使用 \fill 或 \filldraw. 纯色填充的优势是代码短, 画面干净; 缺点是在 darkmode 下, 低浓度填充可能和背景融在一起, 多个区域也很难只靠色深稳定区分.
简单纯色区域
下面的 \filldraw 案例已确认能够成功渲染:
对于 circle, rectangle 或 ... -- cycle 这类简单封闭路径, 直接使用 \fill / \filldraw 比先剪裁再填充更容易阅读和修改. 这是代码组织上的选择, 不表示 \clip 无法渲染, 也不表示 \filldraw 一定更快.
已有透明填充示例
以下 opacity / fill opacity 代码也已确认能够渲染, 保留用于理解和维护现有图形. 但是, 新建需要在 darkmode 下阅读的区域图时, 仍按本库视觉规范使用低浓度纯色并配合边界或斜线, 不复制透明填充作为默认模板.
% 填充阴影区域
\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}标准绘图原则
✅ 2D: 确保 y 轴范围受控, 避免 TikzJax 计算溢出
✅ 3D: 固定 \tdplotsetmaincoords{80}{120}, 只绘制关键轮廓
✅ 曲线: 使用 smooth 和 samples=100, 提高解析精度
✅ 颜色: 新图使用低浓度淡色, 保证文字和边界清楚; 多个区域不能只靠颜色深浅区分
✅ 阴影: 单一, 简单的纯色区域优先用 filldraw; 需要兼顾 darkmode 或区分多个区域时, 用局部 clip + foreach 绘制方向不同的斜线
多边形
%%Polygon%%
多边形最简单的写法是依次连接各顶点, 最后用 cycle 闭合路径:
示例
本部分集中放置综合案例. 前面的章节只保留用于说明单一写法的最小例子; 这里的案例可以同时使用坐标轴, 循环, 节点, 填充, 标注或立体视角.
宏包应用
前面的宏包清单中, tikz-3dplot 已有多组立体图案例. 下面补充 pgfplots, circuitikz, tikz-cd 和 chemfig 的实际用法.
网格函数图
%%pgfplots%%
电路图
%%circuitikz%%
- 开头声明:
\usepackage{circuitikz} - 默认使用european标准:
\ctikzset{resistor = european}
常用元件
- 电阻使用
R, 电感使用L, 电容使用C。 - 电压源使用
V, 电流源使用I。 l=用于添加元件标签,l_=用于把标签放到元件另一侧。european使用欧洲标准电阻符号,cute inductors使用弧线式电感符号。--直接连接两点, 表示普通导线;to[元件]在两点之间放置元件。*-*在元件两端标出连接点,-*只在终点标出连接点。\node[circ] at (x,y) {};用于单独标出分支节点。
下面分别画出五种常用元件, 便于直接对照元件名称和代码。
串联电路与并联支路
下面把五种元件放入同一个电路。电阻和电感串联, 电容与电流源分别接在上下导线之间。
星形与三角形网络
这个案例对照星形电阻网络和三角形电阻网络, 同时展示端点标注, 元件标签位置和等价关系箭头。
含开关的电阻电容电路
这个案例展示电压源, 多个电阻, 电容, 开关, 电流方向和电荷标注在同一电路中的安排方式。
交换图
%%tikz-cd%%
有机结构式
%%chemfig%%
区域填充
三角形区域
这个案例综合使用坐标轴, 边界, 斜线填充和方程标注.
环形扇区
这个案例综合使用变量, 圆弧路径, 剪裁, 循环填充和边界重绘.
平面图
%%2D%%
立体图
%%3D%%
**必须导入 \usepackage{tikz-3dplot} 包. **
相交平面
下面两种画法都已确认能够渲染. 透明填充能直接表现覆盖关系; 轮廓和交线在深色主题或需要打印时更容易保持边界清楚.
透明填充版:
轮廓版:
透明圆柱面
这个案例综合使用 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%%
自动机状态转移图
%%TikZAutomaton%%
五边形状态图
%%PentagonStateDiagram%%
这个案例不是重复讲解多边形边界, 而是综合使用极坐标, 循环, 节点和箭头, 把五个状态排列成五边形.
带前导状态的环形状态图
%%RingStateDiagram%%
失败原因汇总
本节按症状记录排查方向. 前面的斜线, 纯色, 透明填充和相交平面案例都已确认能够渲染, 因此不能再把 opacity, clip 或 filldraw 本身当作失败原因; 遇到失败时应检查具体参数, 计算范围, 路径复杂度和命令组合.
多边形旧例失败原因
- 代码块写成
latex, Obsidian 只显示源码, 不会交给 TikZJax 渲染. - 部分代码缺少
\usepackage{tikz},\begin{document}或tikzpicture外壳. - 其余代码依赖
standalone, PSTricks,auto-pst-pdf, 或者包含本库禁止的\documentclass, 不属于当前 TikZJax 环境.
这些问题与多边形本身无关, 因此删除失效旧例, 保留一个最小多边形例子, 并把可渲染的五边形状态图放在综合示例中.
1. 计算溢出
- 问题: 高次幂, 多项式计算导致 TikzJax 计算失败.
- 解决方案:
- 限制
y轴范围:max(y_{\min}, min(y_{\max}, f(x))) - 降低幂次: 尝试分解或近似表示.
- 限制
2. 超出坐标轴范围
- 问题: 曲线部分超出可视范围, 导致图像部分缺失或溢出.
- 解决方案:
- 手动设置
x和y轴范围, 例如domain=0.5:4.5, ymin=-2, ymax=2.
- 手动设置
3. 网格图失败
%%pgfplots%%
- 问题:
pgfplotspackage 可以加载, 但某幅图仍可能因坐标范围, 表达式或axis内的具体设置失败. - 解决方案:
- 先缩小坐标范围, 简化表达式并检查
axis设置. - 仍然失败时, 再改用核心 TikZ 的
\draw plot, 或预计算点值后手动绘制.
- 先缩小坐标范围, 简化表达式并检查
4. 计算精度问题
- 问题: 某些
plot计算 TikzJax 解析失败. - 解决方案:
- 增加
samples, 如samples=100. - 复杂计算分步执行, 或使用
foreach逐点绘制.
- 增加
5. 立体图视角错误
%%3D%%
- 问题: 3D 视角不符合需求, 导致
x, y, z轴方向不正确. - 解决方案:
- 设定
\tdplotsetmaincoords{80}{120}统一标准视角. - 只绘制主要轮廓, 去除
surf填充.
- 设定
6. 颜色兼容问题
%%TikZJax%%
- 问题: 某些
colormap,opacity设置可能导致 TikzJax 解析失败. - 解决方案:
- 出现失败时, 先逐项去掉
colormap或透明度设置, 判断具体是哪一项引起. - 本轮透明填充案例已确认能够渲染, 所以不能看到
opacity就直接判错; 如果只是 darkmode 下显示不清, 再改用轮廓, 线型, 标注或斜线.
- 出现失败时, 先逐项去掉
7. 复杂阴影填充失败
- 问题: 过大的剪裁范围, 过密的循环或复杂路径可能导致 TikZJax 解析失败.
- 解决方案:
- 简单纯色封闭区域直接用
\fill/\filldraw. - 需要手动画图案时, 可以在局部
scope中用\clip, 再执行规模适中的\foreach \draw; 失败时先减小范围和循环次数.
- 简单纯色封闭区域直接用
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]