Chapter 08 / 10

Mermaid 图表与数学公式

在 Markdown 中用文字绘制图表(流程图/时序图/类图/ER 图)与嵌入 LaTeX 数学公式

Mermaid 简介

Mermaid 是一个基于文本的图表绘制工具,让你用类似 Markdown 的简单语法描述图表,由渲染引擎自动生成 SVG 图形。GitHub 从 2022 年 2 月起原生支持 Mermaid,无需任何插件。

为什么用 Mermaid 而不是图片
图片需要额外的绘图工具(draw.io、Lucidchart),难以版本控制,修改需要重新导出。Mermaid 代码可以像代码一样 diff、review、提交。架构图和流程图随代码一起演进,始终与实现保持同步。
Mermaid 的工作原理
Mermaid 代码块被解析后,交给 Mermaid.js 库(JavaScript)渲染为 SVG。GitHub/GitLab 在服务端渲染,VS Code 通过插件渲染,Obsidian 内置支持,Notion 也支持。
```mermaid
# 所有 Mermaid 图表都写在 mermaid 代码块内
graph TD
    A[开始] --> B{条件判断}
    B -->|是| C[执行操作]
    B -->|否| D[跳过]
    C --> E[结束]
    D --> E
```

流程图(Flowchart)

流程图是 Mermaid 最常用的图表类型,用于展示算法逻辑、业务流程、决策树等。

基本流程图

```mermaid
flowchart TD
    A([开始]) --> B[/获取用户输入/]
    B --> C{输入是否合法?}
    C -- 合法 --> D[(保存到数据库)]
    C -- 非法 --> E[显示错误提示]
    E --> B
    D --> F([结束])
```
([开始])
[/获取用户输入/]
{输入是否合法?}
合法 ↓
↓ 非法
[(数据库)]
[错误提示] → 循环回输入
([结束])

流程图方向

关键字方向适用场景
TD / TB从上到下(Top Down)树形结构、层级关系
LR从左到右(Left Right)流水线、CI/CD、时间序列
BT从下到上(Bottom Top)倒树形
RL从右到左(Right Left)较少使用

节点形状大全

语法形状适用场景
A[矩形]矩形处理步骤、操作(最常用)
A(圆角矩形)圆角矩形一般步骤
A{菱形}菱形判断/条件
A([体育场])椭圆开始/结束
A[[双边框]]子程序形函数调用、子流程
A[(圆柱体)]圆柱体数据库
A((圆形))圆形连接点
A[/平行四边形/]平行四边形输入/输出
A[\平行四边形\]反向平行四边形输入/输出
A[/梯形\]梯形特殊操作

连接线类型

语法样式含义
A --> B实线箭头普通流转
A --- B实线无箭头无向连接
A -.-> B虚线箭头可选/异步流转
A ==> B粗实线箭头主要/强调路径
A --"标签"--> B带标签的箭头条件说明
A -->|标签| B带标签的箭头条件说明(另一种写法)

完整流程图示例

```mermaid
flowchart LR
    subgraph 用户侧
        U([用户])
    end
    subgraph 服务端
        API[API 网关]
        Auth{认证通过?}
        DB[(数据库)]
        Cache[(Redis 缓存)]
    end

    U -->|HTTP 请求| API
    API --> Auth
    Auth -->|否| E[返回 401]
    Auth -->|是| Cache
    Cache -->|命中| U
    Cache -->|未命中| DB
    DB -->|查询结果| Cache
    DB -->|返回数据| U
```
用户 → API网关 → [认证通过?]
├── 否 → 返回 401
└── 是 → Redis缓存 → 命中 → 返回用户
└── 未命中 → 数据库 → 写缓存 → 返回用户

时序图(Sequence Diagram)

时序图展示多个系统/角色之间的交互时间顺序,是 API 文档、系统设计文档的标配。

```mermaid
sequenceDiagram
    actor 用户
    participant 前端 as 前端 (React)
    participant 网关 as API 网关
    participant 服务 as 后端服务
    participant DB as 数据库

    用户 ->> 前端: 点击登录按钮
    前端 ->> 网关: POST /auth/login {email, password}
    网关 ->> 服务: 转发请求
    服务 ->> DB: SELECT * FROM users WHERE email=?
    DB -->> 服务: 返回用户记录
    服务 ->> 服务: 验证密码 bcrypt
    alt 验证通过
        服务 -->> 网关: {token, user}
        网关 -->> 前端: 200 OK {token}
        前端 -->> 用户: 跳转到首页
    else 验证失败
        服务 -->> 网关: 401 Unauthorized
        网关 -->> 前端: 401 错误
        前端 -->> 用户: 显示"密码错误"
    end
```

时序图关键语法

语法含义线型
A ->> B: 消息同步请求实线 + 实心箭头
A -->> B: 消息响应/异步虚线 + 实心箭头
A -> B: 消息同步(无箭头)实线
A --> B: 消息响应(无箭头)虚线
A -x B: 消息失败/销毁实线 + X
actor A声明为"人"形角色人形图标
participant A as 别名带别名的参与者矩形
alt 条件/else/end条件分支区域框
loop 循环条件/end循环循环框
opt 可选/end可选操作虚线区域框
Note over A,B: 说明跨越多参与者的注释便利贴形状
activate A/deactivate A激活/停用(显示激活条)长条高亮

类图(Class Diagram)

类图用于展示面向对象设计中的类结构和关系,适合代码架构文档。

```mermaid
classDiagram
    class Animal {
        +String name
        +int age
        #String species
        -bool isAlive
        +makeSound() String
        +eat(food: Food) void
        +getAge() int
    }

    class Dog {
        +String breed
        +fetch(item: Item) void
        +bark() void
    }

    class Cat {
        +bool isIndoor
        +purr() void
        +scratch() void
    }

    class ServiceDog {
        +String serviceType
        +assist(person: Person) void
    }

    Animal <|-- Dog : 继承
    Animal <|-- Cat : 继承
    Dog <|-- ServiceDog : 继承
    Dog "1" *-- "many" Toy : 组合
    Cat "1" o-- "0..1" Owner : 聚合
```

类图的关系类型

语法关系含义
A <|-- B继承B 继承 A(泛化)
A *-- B组合A 包含 B(强关联,B 不能独立存在)
A o-- B聚合A 包含 B(弱关联,B 可独立存在)
A --> B关联A 使用 B
A -- B链接双向关联
A ..> B依赖A 依赖 B(虚线)
A ..|> B实现A 实现接口 B

类成员可见性

符号可见性
+public(公开)
-private(私有)
#protected(受保护)
~package(包级别)
$static(静态,加在成员前)
*abstract(抽象)

ER 图(Entity Relationship Diagram)

实体关系图用于数据库设计,展示表结构和表间关系:

```mermaid
erDiagram
    USER {
        int id PK
        string email UK "唯一邮箱"
        string name
        datetime created_at
    }

    ORDER {
        int id PK
        int user_id FK
        decimal total_amount
        string status
        datetime created_at
    }

    ORDER_ITEM {
        int id PK
        int order_id FK
        int product_id FK
        int quantity
        decimal unit_price
    }

    PRODUCT {
        int id PK
        string name
        decimal price
        int stock
    }

    USER ||--o{ ORDER : "下单"
    ORDER ||--|{ ORDER_ITEM : "包含"
    PRODUCT ||--o{ ORDER_ITEM : "属于"
```

ER 图基数符号

左侧右侧含义
||||恰好一个(1:1)
||o{一对零个或多个(1:N)
|||{一对一个或多个(1:1+)
}oo{多对多(N:M)
|oo|零或一(可选)

其他常用图表类型

甘特图(Gantt Chart)

```mermaid
gantt
    title 项目开发计划
    dateFormat YYYY-MM-DD
    section 设计阶段
        需求分析          :done,    des1, 2026-03-01, 2026-03-07
        UI 设计           :done,    des2, 2026-03-05, 2026-03-14
        数据库设计         :done,    des3, 2026-03-10, 2026-03-16
    section 开发阶段
        后端 API 开发      :active,  dev1, 2026-03-15, 20d
        前端开发           :         dev2, after dev1, 15d
        联调测试           :         dev3, after dev2, 7d
    section 上线阶段
        预发布测试         :crit,    rel1, after dev3, 3d
        正式上线           :crit,    rel2, after rel1, 1d
```

状态图(State Diagram)

```mermaid
stateDiagram-v2
    [*] --> 待支付
    待支付 --> 已支付 : 用户付款
    待支付 --> 已取消 : 超时取消
    已支付 --> 备货中 : 触发发货
    备货中 --> 已发货 : 发货完成
    已发货 --> 已签收 : 用户签收
    已签收 --> [*]
    已取消 --> [*]
    已发货 --> 退款中 : 申请退款
    退款中 --> 已退款 : 退款审核通过
    已退款 --> [*]
```

饼图

```mermaid
pie title 编程语言使用分布
    "JavaScript" : 35
    "Python"     : 28
    "Java"       : 15
    "TypeScript" : 12
    "Go"         : 6
    "其他"       : 4
```

数学公式(LaTeX / MathJax)

GitHub 从 2022 年起支持 LaTeX 数学公式,使用 MathJax 渲染(GitHub)或 KaTeX(Docusaurus/MkDocs 等)。

内联公式(行内公式)

用单个美元符号 $...$ 包裹(GitHub 支持):

著名的质能方程 $E = mc^2$ 由爱因斯坦提出。

二次方程的解为 $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$。

黄金比例 $\varphi = \frac{1+\sqrt{5}}{2} \approx 1.618$。

独立公式块

用双美元符号 $$...$$ 创建独立居中的公式块:

$$
\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n
$$

$$
\int_{-\infty}^{+\infty} e^{-x^2} dx = \sqrt{\pi}
$$

$$
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
=
\begin{pmatrix}
ax + by \\
cx + dy
\end{pmatrix}
$$

常用 LaTeX 语法速查

功能LaTeX 写法示例输出
上标x^{2} / x^2
下标x_{i} / x_ixᵢ
分数\frac{a}{b}a/b
平方根\sqrt{x}√x
n次根\sqrt[n]{x}ⁿ√x
求和\sum_{i=1}^{n} x_iΣxᵢ (i=1 to n)
乘积\prod_{i=1}^{n} x_iΠ
积分\int_a^b f(x)dx
偏导\partial f / \partial x∂f/∂x
无穷\infty
alpha 等希腊字母\alpha \beta \gamma \deltaα β γ δ
大写希腊字母\Sigma \Pi \Delta \OmegaΣ Π Δ Ω
约等于\approx
不等于\neq
小于等于\leq
大于等于\geq
属于\in
矩阵\begin{pmatrix}...\end{pmatrix}圆括号矩阵
分段函数\begin{cases}...\end{cases}大括号分段
文字\text{说明文字}公式中的中文/文字
粗体\mathbf{x}向量 x(粗体)

LaTeX 支持情况

平台内联 $ $块级 $$ $$备注
GitHub✅ 支持✅ 支持2022年起,使用 MathJax
VS Code(预览)需插件需插件Markdown+Math 插件
Obsidian✅ 内置✅ 内置使用 MathJax
Typora✅ 内置✅ 内置使用 MathJax/KaTeX
MkDocs Material需插件配置需插件配置arithmatex 插件
Docusaurus需配置需配置KaTeX 或 MathJax 插件
Jupyter Notebook✅ 内置✅ 内置使用 MathJax
WARNING如果你的 Markdown 文档发布到不支持 LaTeX 的平台,数学公式会显示为原始 $...$ 文本,非常难看。在选择使用数学公式之前,先确认目标平台是否支持。如果不支持,可以用截图图片代替,或者用 CodePen 渲染后截图。

Mermaid 的局限性与替代方案

Mermaid 适合

  • 流程图(中等复杂度)
  • 时序图(系统交互)
  • 类图(小型类结构)
  • ER 图(数据库设计)
  • 状态图(有限状态机)

考虑其他工具的情况

  • 极复杂图表(节点很多):draw.io / Excalidraw
  • 需要精确定位节点:drawio / Visio
  • 架构图(云服务图标):Diagrams.net + 图标库
  • 网络拓扑图:专业网络工具

小结

本章要点