第 8 章:超越文本——图表与公式
Markdown 的魅力不仅在于其简洁的文本格式化能力,更在于它能够通过扩展语法支持复杂的图表绘制和数学公式编写。本章将带你探索如何在 Markdown 文档中直接创建专业的流程图、时序图,以及编写复杂的数学公式,让你的文档从纯文本跃升为专业的技术文档。
为什么需要图表和公式?
图表的价值
在技术文档和学术写作中,图表具有不可替代的作用:
- 直观表达:复杂的逻辑关系一图胜千言
- 提升理解:视觉化信息更容易被理解和记忆
- 专业呈现:精美的图表提升文档的专业度
- 标准化:统一的图表风格保证文档一致性
公式的重要性
数学公式在科学、工程、经济等领域必不可少:
- 精确表达:数学语言的严谨性和准确性
- 国际通用:数学符号是全球通用的语言
- 专业标准:学术论文和技术文档的基本要求
- 美观排版:专业的公式排版提升阅读体验
传统方案的局限
❌ 传统方式的问题:
- 需要专门的绘图软件(Visio、Lucidchart)
- 图片文件管理复杂
- 修改困难,需要重新编辑和导出
- 版本控制困难
- 文件体积大
- 不同平台兼容性问题
✅ 代码绘图的优势:
- 纯文本描述,易于版本控制
- 修改简单,只需编辑代码
- 风格统一,自动渲染
- 文件体积小
- 跨平台兼容
- 可以与文档内容同步维护
8.1 Mermaid.js:代码绘图的革命
Mermaid.js 是一个基于 JavaScript 的图表库,它允许你使用简单的文本语法来创建复杂的图表。它的核心理念是"代码即图表",让图表的创建和维护变得像编写代码一样简单。
Mermaid 的核心优势
1. 简单易学
<!-- 传统流程图需要拖拽和连线 -->
<!-- Mermaid 只需要简单的文本描述 -->
graph TD
A[开始] --> B{判断条件}
B -->|是| C[执行操作]
B -->|否| D[结束]
C --> D
2. 版本控制友好
# Git 可以轻松追踪图表的变更
- 添加新节点
- 修改连接关系
- 调整节点标签
- 所有变更都有完整的历史记录
3. 自动布局
# Mermaid 自动处理:
- 节点位置计算
- 连线路径优化
- 避免重叠
- 美观的默认样式
4. 广泛支持
# 支持平台:
- GitHub/GitLab(原生支持)
- VS Code(插件支持)
- Typora(内置支持)
- Notion(部分支持)
- 各种静态网站生成器
Mermaid 的基本语法
语法结构:
```mermaid
图表类型 方向
节点定义
连接关系
样式设置
```
支持的图表类型:
| 类型 | 关键词 | 用途 |
|---|---|---|
| 流程图 | graph 或 flowchart | 业务流程、算法逻辑 |
| 时序图 | sequenceDiagram | 系统交互、API 调用 |
| 甘特图 | gantt | 项目管理、时间规划 |
| 类图 | classDiagram | 面向对象设计 |
| 状态图 | stateDiagram | 状态机、生命周期 |
| 饼图 | pie | 数据分布、比例关系 |
| 用户旅程图 | journey | 用户体验设计 |
| Git 图 | gitgraph | 版本控制流程 |
8.1.1 流程图(Flowchart)入门
流程图是最常用的图表类型,用于描述业务流程、算法逻辑或决策过程。
基础语法
1. 图表方向
```mermaid
# 从上到下(默认)
graph TD
# 从下到上
graph BT
# 从左到右
graph LR
# 从右到左
graph RL
2. 节点形状
```mermaid
graph TD
A[矩形节点]
B(圆角矩形)
C([椭圆形])
D{菱形决策}
E>旗帜形]
F[[子程序]]
G[(数据库)]
H((圆形))
```
渲染效果:
graph TD
A[矩形节点]
B(圆角矩形)
C([椭圆形])
D{菱形决策}
E>旗帜形]
F[[子程序]]
G[(数据库)]
H((圆形))
3. 连接线类型
```mermaid
graph TD
A --> B %% 实线箭头
C --- D %% 实线
E -.-> F %% 虚线箭头
G -.- H %% 虚线
I ==> J %% 粗线箭头
K === L %% 粗线
```
渲染效果:
graph TD
A --> B
C --- D
E -.-> F
G -.- H
I ==> J
K === L
4. 连接线标签
```mermaid
graph TD
A -->|是| B
A -->|否| C
B -.->|异步| D
C ==>|同步| D
```
渲染效果:
graph TD
A -->|是| B
A -->|否| C
B -.->|异步| D
C ==>|同步| D
实际应用示例
示例1:用户登录流程
```mermaid
graph TD
Start([用户访问登录页]) --> Input[输入用户名和密码]
Input --> Validate{验证信息}
Validate -->|验证成功| Success[登录成功]
Validate -->|验证失败| Error[显示错误信息]
Error --> Input
Success --> Dashboard[跳转到仪表板]
%% 样式定义
classDef successClass fill:#d4edda,stroke:#155724,color:#155724
classDef errorClass fill:#f8d7da,stroke:#721c24,color:#721c24
classDef processClass fill:#e2e3e5,stroke:#383d41,color:#383d41
class Success successClass
class Error errorClass
class Input,Validate,Dashboard processClass
```
渲染效果:
graph TD
Start([用户访问登录页]) --> Input[输入用户名和密码]
Input --> Validate{验证信息}
Validate -->|验证成功| Success[登录成功]
Validate -->|验证失败| Error[显示错误信息]
Error --> Input
Success --> Dashboard[跳转到仪表板]
classDef successClass fill:#d4edda,stroke:#155724,color:#155724
classDef errorClass fill:#f8d7da,stroke:#721c24,color:#721c24
classDef processClass fill:#e2e3e5,stroke:#383d41,color:#383d41
class Success successClass
class Error errorClass
class Input,Validate,Dashboard processClass
示例2:软件开发流程
```mermaid
graph TD
A[需求分析] --> B[系统设计]
B --> C[编码实现]
C --> D[单元测试]
D --> E{测试通过?}
E -->|否| C
E -->|是| F[集成测试]
F --> G{集成测试通过?}
G -->|否| B
G -->|是| H[用户验收测试]
H --> I{验收通过?}
I -->|否| A
I -->|是| J[部署上线]
J --> K[运维监控]
%% 子图分组
subgraph 开发阶段
A
B
C
end
subgraph 测试阶段
D
E
F
G
H
I
end
subgraph 运维阶段
J
K
end
```
渲染效果:
graph TD
A[需求分析] --> B[系统设计]
B --> C[编码实现]
C --> D[单元测试]
D --> E{测试通过?}
E -->|否| C
E -->|是| F[集成测试]
F --> G{集成测试通过?}
G -->|否| B
G -->|是| H[用户验收测试]
H --> I{验收通过?}
I -->|否| A
I -->|是| J[部署上线]
J --> K[运维监控]
subgraph 开发阶段
A
B
C
end
subgraph 测试阶段
D
E
F
G
H
I
end
subgraph 运维阶段
J
K
end
流程图最佳实践
1. 清晰的命名
```mermaid
%% ✅ 好的命名
graph TD
UserInput[用户输入数据]
ValidateData{验证数据格式}
SaveToDatabase[(保存到数据库)]
%% ❌ 不好的命名
graph TD
A[输入]
B{验证}
C[(保存)]
```
2. 合理的布局
```mermaid
%% ✅ 清晰的层次结构
graph TD
Start([开始])
Process1[处理步骤1]
Decision{判断条件}
Process2[处理步骤2]
End([结束])
Start --> Process1
Process1 --> Decision
Decision -->|是| Process2
Decision -->|否| End
Process2 --> End
```
3. 适当的分组
```mermaid
graph TD
subgraph 前端处理
A[用户界面]
B[数据验证]
C[请求发送]
end
subgraph 后端处理
D[接收请求]
E[业务逻辑]
F[数据库操作]
end
A --> B
B --> C
C --> D
D --> E
E --> F
```
8.1.2 时序图(Sequence Diagram)入门
时序图用于描述系统中不同对象之间的交互过程,特别适合展示 API 调用、系统间通信等场景。
基础语法
1. 参与者定义
```mermaid
sequenceDiagram
participant A as 用户
participant B as 前端应用
participant C as 后端API
participant D as 数据库
```
2. 消息类型
```mermaid
sequenceDiagram
A->>B: 同步调用
A-->>B: 异步调用
A-xB: 同步调用(丢失)
A--xB: 异步调用(丢失)
A-)B: 异步调用(无箭头)
B-->>A: 返回消息
```
渲染效果:
sequenceDiagram
A->>B: 同步调用
A-->>B: 异步调用
A-xB: 同步调用(丢失)
A--xB: 异步调用(丢失)
A-)B: 异步调用(无箭头)
B-->>A: 返回消息
3. 激活框
```mermaid
sequenceDiagram
A->>+B: 开始处理
B->>+C: 调用服务
C-->>-B: 返回结果
B-->>-A: 处理完成
```
渲染效果:
sequenceDiagram
A->>+B: 开始处理
B->>+C: 调用服务
C-->>-B: 返回结果
B-->>-A: 处理完成
4. 注释和循环
```mermaid
sequenceDiagram
A->>B: 请求数据
Note over A,B: 这是一个注释
loop 每5秒
B->>C: 检查状态
C-->>B: 返回状态
end
alt 成功
B-->>A: 返回数据
else 失败
B-->>A: 返回错误
end
```
渲染效果:
sequenceDiagram
A->>B: 请求数据
Note over A,B: 这是一个注释
loop 每5秒
B->>C: 检查状态
C-->>B: 返回状态
end
alt 成功
B-->>A: 返回数据
else 失败
B-->>A: 返回错误
end
实际应用示例
示例1:用户注册流程
```mermaid
sequenceDiagram
participant User as 用户
participant Frontend as 前端应用
participant Backend as 后端API
participant DB as 数据库
participant Email as 邮件服务
User->>Frontend: 填写注册信息
activate Frontend
Frontend->>Frontend: 客户端验证
alt 验证通过
Frontend->>Backend: POST /api/register
activate Backend
Backend->>DB: 检查用户是否存在
DB-->>Backend: 查询结果
alt 用户不存在
Backend->>DB: 创建新用户
DB-->>Backend: 用户创建成功
Backend->>Email: 发送验证邮件
Email-->>Backend: 邮件发送成功
Backend-->>Frontend: 注册成功
Frontend-->>User: 显示成功消息
else 用户已存在
Backend-->>Frontend: 用户已存在错误
Frontend-->>User: 显示错误消息
end
deactivate Backend
else 验证失败
Frontend-->>User: 显示验证错误
end
deactivate Frontend
```
渲染效果:
sequenceDiagram
participant User as 用户
participant Frontend as 前端应用
participant Backend as 后端API
participant DB as 数据库
participant Email as 邮件服务
User->>Frontend: 填写注册信息
activate Frontend
Frontend->>Frontend: 客户端验证
alt 验证通过
Frontend->>Backend: POST /api/register
activate Backend
Backend->>DB: 检查用户是否存在
DB-->>Backend: 查询结果
alt 用户不存在
Backend->>DB: 创建新用户
DB-->>Backend: 用户创建成功
Backend->>Email: 发送验证邮件
Email-->>Backend: 邮件发送成功
Backend-->>Frontend: 注册成功
Frontend-->>User: 显示成功消息
else 用户已存在
Backend-->>Frontend: 用户已存在错误
Frontend-->>User: 显示错误消息
end
deactivate Backend
else 验证失败
Frontend-->>User: 显示验证错误
end
deactivate Frontend
示例2:微服务架构中的订单处理
```mermaid
sequenceDiagram
participant Client as 客户端
participant Gateway as API网关
participant Order as 订单服务
participant Payment as 支付服务
participant Inventory as 库存服务
participant Notification as 通知服务
Client->>+Gateway: 创建订单请求
Gateway->>+Order: 转发订单请求
Order->>+Inventory: 检查库存
Inventory-->>-Order: 库存充足
Order->>+Payment: 处理支付
Payment-->>-Order: 支付成功
par 并行处理
Order->>+Inventory: 扣减库存
Inventory-->>-Order: 库存扣减成功
and
Order->>+Notification: 发送订单确认
Notification-->>-Order: 通知发送成功
end
Order-->>-Gateway: 订单创建成功
Gateway-->>-Client: 返回订单信息
Note over Client,Notification: 整个流程在分布式环境中完成
```
渲染效果:
sequenceDiagram
participant Client as 客户端
participant Gateway as API网关
participant Order as 订单服务
participant Payment as 支付服务
participant Inventory as 库存服务
participant Notification as 通知服务
Client->>+Gateway: 创建订单请求
Gateway->>+Order: 转发订单请求
Order->>+Inventory: 检查库存
Inventory-->>-Order: 库存充足
Order->>+Payment: 处理支付
Payment-->>-Order: 支付成功
par 并行处理
Order->>+Inventory: 扣减库存
Inventory-->>-Order: 库存扣减成功
and
Order->>+Notification: 发送订单确认
Notification-->>-Order: 通知发送成功
end
Order-->>-Gateway: 订单创建成功
Gateway-->>-Client: 返回订单信息
Note over Client,Notification: 整个流程在分布式环境中完成
时序图最佳实践
1. 清晰的参与者命名
```mermaid
%% ✅ 描述性的命名
sequenceDiagram
participant WebApp as Web应用
participant AuthService as 认证服务
participant UserDB as 用户数据库
%% ❌ 模糊的命名
sequenceDiagram
participant A
participant B
participant C
```
2. 合理使用激活框
```mermaid
%% ✅ 明确的生命周期
sequenceDiagram
A->>+B: 开始处理
B->>+C: 调用服务
C-->>-B: 返回结果
B->>B: 内部处理
B-->>-A: 处理完成
```
3. 适当的注释说明
```mermaid
sequenceDiagram
A->>B: 发送请求
Note right of B: 验证请求参数
B->>C: 查询数据
Note over B,C: 数据库查询可能较慢
C-->>B: 返回数据
B-->>A: 响应结果
```
8.1.3 其他图表类型简介
Mermaid 支持多种图表类型,每种都有其特定的应用场景。
甘特图(Gantt Chart)
用于项目管理和时间规划:
```mermaid
gantt
title 项目开发计划
dateFormat YYYY-MM-DD
section 需求分析
需求收集 :done, des1, 2024-01-01,2024-01-05
需求分析 :done, des2, after des1, 5d
需求评审 :active, des3, after des2, 2d
section 系统设计
架构设计 : des4, after des3, 5d
详细设计 : des5, after des4, 7d
section 开发实现
前端开发 : dev1, after des5, 10d
后端开发 : dev2, after des5, 12d
测试 : test1, after dev1, 5d
```
渲染效果:
gantt
title 项目开发计划
dateFormat YYYY-MM-DD
section 需求分析
需求收集 :done, des1, 2024-01-01,2024-01-05
需求分析 :done, des2, after des1, 5d
需求评审 :active, des3, after des2, 2d
section 系统设计
架构设计 : des4, after des3, 5d
详细设计 : des5, after des4, 7d
section 开发实现
前端开发 : dev1, after des5, 10d
后端开发 : dev2, after des5, 12d
测试 : test1, after dev1, 5d
饼图(Pie Chart)
用于展示数据分布和比例关系:
```mermaid
pie title 网站流量来源
"搜索引擎" : 42.5
"直接访问" : 28.3
"社交媒体" : 15.7
"邮件营销" : 8.9
"其他" : 4.6
```
渲染效果:
pie title 网站流量来源
"搜索引擎" : 42.5
"直接访问" : 28.3
"社交媒体" : 15.7
"邮件营销" : 8.9
"其他" : 4.6
类图(Class Diagram)
用于面向对象设计:
```mermaid
classDiagram
Animal <|-- Duck
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
```
渲染效果:
classDiagram
Animal <|-- Duck
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
状态图(State Diagram)
用于描述状态机和生命周期:
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 待审核 : 提交审核
待审核 --> 已发布 : 审核通过
待审核 --> 草稿 : 审核拒绝
已发布 --> 已下线 : 下线
已下线 --> 已发布 : 重新发布
已发布 --> [*] : 删除
草稿 --> [*] : 删除
```
渲染效果:
stateDiagram-v2
[*] --> 草稿
草稿 --> 待审核 : 提交审核
待审核 --> 已发布 : 审核通过
待审核 --> 草稿 : 审核拒绝
已发布 --> 已下线 : 下线
已下线 --> 已发布 : 重新发布
已发布 --> [*] : 删除
草稿 --> [*] : 删除
Mermaid 学习资源
官方资源:
- 官方文档:mermaid.js.org/
- 在线编辑器:mermaid.live/
- GitHub 仓库:github.com/mermaid-js/…
- 示例画廊:mermaid.js.org/syntax/exam…
学习建议:
1. **从简单开始**:先掌握流程图和时序图
2. **多看示例**:参考官方文档中的示例
3. **实际应用**:在项目文档中使用
4. **逐步深入**:学习高级功能和样式定制
5. **工具支持**:选择支持 Mermaid 的编辑器
8.2 LaTeX 数学公式:专业的数学表达
LaTeX 是学术界和科学界广泛使用的排版系统,其数学公式语法已成为数学表达的标准。许多 Markdown 编辑器和平台都支持 LaTeX 数学公式,让你能够在文档中插入专业的数学表达式。
LaTeX 数学公式的优势
1. 专业美观
# 普通文本表示
E = mc^2
# LaTeX 公式表示
$E = mc^2$
# 效果对比明显,LaTeX 公式更加美观和专业
2. 标准规范
# LaTeX 是学术界公认的标准
- 期刊论文要求
- 学位论文规范
- 科技文档标准
- 国际通用格式
3. 功能强大
# 支持复杂的数学结构
- 分数、根号、积分
- 矩阵、向量、集合
- 希腊字母、特殊符号
- 上下标、重音符号
基本语法
行内公式和块级公式
行内公式:使用单个 $ 包围
这是一个行内公式:$E = mc^2$,它描述了质能关系。
渲染效果:
这是一个行内公式:,它描述了质能关系。
块级公式:使用双 $$ 包围
爱因斯坦的质能方程:
$$E = mc^2$$
其中 $E$ 是能量,$m$ 是质量,$c$ 是光速。
渲染效果:
爱因斯坦的质能方程:
其中 是能量, 是质量, 是光速。
常用数学符号
1. 上标和下标
$x^2$ # x的平方
$x_1$ # x下标1
$x^{2y}$ # x的2y次方
$x_{i+1}$ # x下标i+1
$x_1^2$ # x下标1的平方
渲染效果:
, , , ,
2. 分数
$\frac{1}{2}$ # 二分之一
$\frac{x+1}{x-1}$ # 复杂分数
$\frac{\partial f}{\partial x}$ # 偏导数
渲染效果:
, ,
3. 根号
$\sqrt{2}$ # 根号2
$\sqrt[3]{8}$ # 三次根号8
$\sqrt{x^2+y^2}$ # 复杂根号
渲染效果:
, ,
4. 希腊字母
$\alpha, \beta, \gamma, \delta$ # 小写希腊字母
$\Alpha, \Beta, \Gamma, \Delta$ # 大写希腊字母
$\pi, \theta, \lambda, \sigma$ # 常用希腊字母
$\Omega, \Phi, \Psi, \Xi$ # 大写希腊字母
渲染效果:
5. 运算符
$\pm, \mp$ # 加减号
$\times, \div$ # 乘除号
$\cdot, \ast$ # 点乘、星号
$\leq, \geq$ # 小于等于、大于等于
$\neq, \approx$ # 不等于、约等于
$\in, \notin$ # 属于、不属于
$\subset, \supset$ # 子集、超集
$\cap, \cup$ # 交集、并集
渲染效果:
复杂数学结构
1. 求和与积分
# 求和
$$\sum_{i=1}^{n} x_i$$
# 积分
$$\int_{0}^{\infty} e^{-x} dx$$
# 双重积分
$$\iint_{D} f(x,y) \, dx \, dy$$
# 极限
$$\lim_{x \to 0} \frac{\sin x}{x} = 1$$
渲染效果:
2. 矩阵
# 基本矩阵
$$
\begin{matrix}
a & b \\
c & d
\end{matrix}
$$
# 带括号的矩阵
$$
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
$$
# 带方括号的矩阵
$$
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
$$
# 行列式
$$
\begin{vmatrix}
a & b \\
c & d
\end{vmatrix}
$$
渲染效果:
基本矩阵
带括号的矩阵
带方括号的矩阵
行列式
3. 方程组
$$
\begin{cases}
x + y = 5 \\
2x - y = 1
\end{cases}
$$
# 带编号的方程组
$$
\begin{align}
f(x) &= ax^2 + bx + c \tag{1} \\
f'(x) &= 2ax + b \tag{2} \\
f''(x) &= 2a \tag{3}
\end{align}
$$
渲染效果:
实际应用示例
示例1:物理学公式
# 经典力学
**牛顿第二定律:**
$$F = ma$$
**动能公式:**
$$E_k = \frac{1}{2}mv^2$$
**万有引力定律:**
$$F = G\frac{m_1 m_2}{r^2}$$
**薛定谔方程:**
$$i\hbar\frac{\partial}{\partial t}\Psi(\mathbf{r},t) = \hat{H}\Psi(\mathbf{r},t)$$
**麦克斯韦方程组:**
$$\begin{align}
\nabla \cdot \mathbf{E} &= \frac{\rho}{\epsilon_0} \\
\nabla \cdot \mathbf{B} &= 0 \\
\nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\
\nabla \times \mathbf{B} &= \mu_0\mathbf{J} + \mu_0\epsilon_0\frac{\partial \mathbf{E}}{\partial t}
\end{align}$$
渲染效果:
牛顿第二定律:
动能公式:
万有引力定律:
薛定谔方程:
示例2:数学分析
# 微积分基本定理
**第一基本定理:**
如果 $f$ 在 $[a,b]$ 上连续,$F(x) = \int_a^x f(t) dt$,则:
$$F'(x) = f(x)$$
**第二基本定理:**
如果 $f$ 在 $[a,b]$ 上连续,$F$ 是 $f$ 的原函数,则:
$$\int_a^b f(x) dx = F(b) - F(a)$$
**泰勒级数:**
$$f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!}(x-a)^n$$
**欧拉公式:**
$$e^{i\theta} = \cos\theta + i\sin\theta$$
**傅里叶变换:**
$$\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} dx$$
渲染效果:
第一基本定理: 如果 在 上连续,,则:
第二基本定理: 如果 在 上连续, 是 的原函数,则:
泰勒级数:
欧拉公式:
示例3:统计学和概率论
# 概率分布
**正态分布概率密度函数:**
$$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}$$
**贝叶斯定理:**
$$P(A|B) = \frac{P(B|A)P(A)}{P(B)}$$
**中心极限定理:**
设 $X_1, X_2, \ldots, X_n$ 是独立同分布的随机变量,均值为 $\mu$,方差为 $\sigma^2$,则:
$$\frac{\bar{X}_n - \mu}{\sigma/\sqrt{n}} \xrightarrow{d} N(0,1)$$
**协方差矩阵:**
$$\Sigma = \begin{pmatrix}
\sigma_{11} & \sigma_{12} & \cdots & \sigma_{1n} \\
\sigma_{21} & \sigma_{22} & \cdots & \sigma_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
\sigma_{n1} & \sigma_{n2} & \cdots & \sigma_{nn}
\end{pmatrix}$$
渲染效果:
正态分布概率密度函数:
贝叶斯定理:
中心极限定理: 设 是独立同分布的随机变量,均值为 ,方差为 ,则:
协方差矩阵:
LaTeX 公式最佳实践
1. 合理使用行内和块级公式
# ✅ 正确使用
在讨论二次方程 $ax^2 + bx + c = 0$ 时,我们可以使用求根公式:
$$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$$
# ❌ 不当使用
在讨论二次方程时:$$ax^2 + bx + c = 0$$我们可以使用求根公式 $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$
2. 适当的空格和对齐
# ✅ 清晰的对齐
$$\begin{align}
f(x) &= ax^2 + bx + c \\
f'(x) &= 2ax + b \\
f''(x) &= 2a
\end{align}$$
# ❌ 没有对齐
$$f(x) = ax^2 + bx + c$$
$$f'(x) = 2ax + b$$
$$f''(x) = 2a$$
3. 清晰的变量说明
# ✅ 完整的说明
牛顿-拉夫逊迭代公式:
$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$
其中:
- $x_n$ 是第 $n$ 次迭代的近似值
- $f(x)$ 是目标函数
- $f'(x)$ 是 $f(x)$ 的导数
# ❌ 缺少说明
$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$
LaTeX 学习资源
在线工具:
- LaTeX 公式编辑器:www.codecogs.com/latex/eqned…
- MathJax 演示:www.mathjax.org/
- Detexify:detexify.kirelabs.org/classify.ht…
参考资料:
- LaTeX 数学符号表:oeis.org/wiki/List_o…
- MathJax 文档:docs.mathjax.org/
- KaTeX 支持的函数:katex.org/docs/suppor…
8.3 文档导出:从 Markdown 到多种格式
创建了包含图表和公式的 Markdown 文档后,你可能需要将其导出为不同的格式以满足各种需求。本节将介绍如何使用 Pandoc 和各种编辑器将 Markdown 文档导出为 PDF、HTML、Word 等格式。
为什么需要多格式导出?
不同场景的需求:
📄 **PDF** - 正式文档、学术论文、打印需求
🌐 **HTML** - 网页发布、在线文档、博客文章
📝 **Word** - 传统办公环境、协作编辑、格式要求
📊 **PowerPoint** - 演示文稿、会议汇报
📖 **EPUB** - 电子书制作、移动阅读
🖼️ **图片** - 社交分享、快速预览
格式特点对比:
| 格式 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| 格式固定、打印友好 | 编辑困难 | 正式文档、论文 | |
| HTML | 交互性强、样式丰富 | 需要浏览器 | 网页、在线文档 |
| Word | 编辑方便、兼容性好 | 格式可能变化 | 办公协作 |
| PowerPoint | 演示效果好 | 内容有限 | 会议演示 |
语雀:编辑和导出直观简洁易用
语雀支持丰富的图表和公式编辑,可以只编辑只预览和同时编辑预览,导出文档也支持多种格式,mermaid 画图等也可以直接保存图片。
支持插入的内容也是非常的丰富,基本能满足你所有的需求了
Pandoc:文档转换的瑞士军刀
Pandoc 是一个强大的文档转换工具,被誉为文档转换的"瑞士军刀",支持几十种文档格式之间的相互转换。
Pandoc 安装
Windows:
# 使用 Chocolatey
choco install pandoc
# 使用 Scoop
scoop install pandoc
# 或者从官网下载安装包
# https://pandoc.org/installing.html
macOS:
# 使用 Homebrew
brew install pandoc
# 使用 MacPorts
sudo port install pandoc
Linux:
# Ubuntu/Debian
sudo apt-get install pandoc
# CentOS/RHEL
sudo yum install pandoc
# Arch Linux
sudo pacman -S pandoc
基本转换命令
1. Markdown 转 HTML
# 基本转换
pandoc document.md -o document.html
# 包含 CSS 样式
pandoc document.md -o document.html --css style.css
# 自包含的 HTML(嵌入 CSS 和图片)
pandoc document.md -o document.html --self-contained
# 使用模板
pandoc document.md -o document.html --template template.html
2. Markdown 转 PDF
# 基本转换(需要 LaTeX 环境)
pandoc document.md -o document.pdf
# 使用特定的 PDF 引擎
pandoc document.md -o document.pdf --pdf-engine=xelatex
# 设置页面边距
pandoc document.md -o document.pdf -V geometry:margin=1in
# 使用中文字体
pandoc document.md -o document.pdf --pdf-engine=xelatex -V mainfont="SimSun"
3. Markdown 转 Word
# 基本转换
pandoc document.md -o document.docx
# 使用参考文档样式
pandoc document.md -o document.docx --reference-doc=template.docx
# 包含目录
pandoc document.md -o document.docx --toc
4. Markdown 转 PowerPoint
# 基本转换
pandoc document.md -o presentation.pptx
# 使用参考模板
pandoc document.md -o presentation.pptx --reference-doc=template.pptx
高级配置
1. 配置文件方式
创建 pandoc.yaml 配置文件:
# pandoc.yaml
input-files:
- document.md
output-file: document.pdf
pdf-engine: xelatex
variables:
geometry: margin=1in
fontsize: 12pt
mainfont: "Times New Roman"
CJKmainfont: "SimSun"
toc: true
toc-depth: 3
number-sections: true
highlight-style: github
使用配置文件:
pandoc --defaults pandoc.yaml
2. 自定义模板
创建 HTML 模板 template.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$title$</title>
<style>
body {
font-family: 'Source Han Sans', 'PingFang SC', sans-serif;
line-height: 1.6;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
h1, h2, h3 {
color: #2c3e50;
}
code {
background-color: #f8f9fa;
padding: 2px 4px;
border-radius: 3px;
}
pre {
background-color: #f8f9fa;
padding: 15px;
border-radius: 5px;
overflow-x: auto;
}
</style>
</head>
<body>
$if(title)$
<h1>$title$</h1>
$endif$
$if(author)$
<p><strong>作者:</strong>$author$</p>
$endif$
$if(date)$
<p><strong>日期:</strong>$date$</p>
$endif$
$if(toc)$
<div id="toc">
<h2>目录</h2>
$toc$
</div>
$endif$
$body$
</body>
</html>
3. 批量转换脚本
创建批量转换脚本 convert.sh:
#!/bin/bash
# 设置输入和输出目录
INPUT_DIR="./markdown"
OUTPUT_DIR="./output"
# 创建输出目录
mkdir -p "$OUTPUT_DIR/html"
mkdir -p "$OUTPUT_DIR/pdf"
mkdir -p "$OUTPUT_DIR/docx"
# 转换所有 Markdown 文件
for file in "$INPUT_DIR"/*.md; do
filename=$(basename "$file" .md)
echo "转换 $filename..."
# 转换为 HTML
pandoc "$file" -o "$OUTPUT_DIR/html/$filename.html" \
--template template.html \
--css style.css \
--toc \
--highlight-style github
# 转换为 PDF
pandoc "$file" -o "$OUTPUT_DIR/pdf/$filename.pdf" \
--pdf-engine=xelatex \
-V geometry:margin=1in \
-V mainfont="Times New Roman" \
-V CJKmainfont="SimSun" \
--toc \
--number-sections
# 转换为 Word
pandoc "$file" -o "$OUTPUT_DIR/docx/$filename.docx" \
--reference-doc=template.docx \
--toc
echo "$filename 转换完成"
done
echo "所有文件转换完成!"
编辑器内置导出功能
VS Code 导出
1. Markdown PDF 插件
安装 "Markdown PDF" 插件后:
1. 打开 Markdown 文件
2. 按 Ctrl+Shift+P 打开命令面板
3. 搜索 "Markdown PDF"
4. 选择导出格式:
- Markdown PDF: Export (pdf)
- Markdown PDF: Export (html)
- Markdown PDF: Export (png)
- Markdown PDF: Export (jpeg)
2. 配置导出选项
在 VS Code 设置中配置:
{
"markdown-pdf.format": "A4",
"markdown-pdf.orientation": "portrait",
"markdown-pdf.border.top": "1.5cm",
"markdown-pdf.border.bottom": "1cm",
"markdown-pdf.border.right": "1cm",
"markdown-pdf.border.left": "1cm",
"markdown-pdf.highlightStyle": "github",
"markdown-pdf.breaks": false,
"markdown-pdf.emoji": true
}
Typora 导出
Typora 提供了丰富的导出选项:
1. 导出菜单
文件 → 导出 → 选择格式:
- PDF
- HTML
- Word (.docx)
- OpenOffice (.odt)
- RTF
- EPUB
- LaTeX
- MediaWiki
- reStructuredText
2. 导出设置
在 Typora 偏好设置中配置导出选项:
**PDF 导出设置:**
- 页面大小:A4, Letter, Legal
- 页边距:自定义边距
- 页眉页脚:添加页码、标题
- 背景:白色或透明
**HTML 导出设置:**
- 样式:内联 CSS 或外部文件
- 代码高亮:选择高亮主题
- 数学公式:MathJax 或 KaTeX
- 图片:嵌入或链接
Obsidian 导出
1. 核心插件
启用 "发布" 核心插件:
设置 → 核心插件 → 发布 → 启用
功能:
- 发布到 Obsidian Publish
- 生成静态网站
- 自定义域名支持
2. 社区插件
安装导出相关插件:
**Pandoc Plugin**
- 集成 Pandoc 功能
- 支持多种格式导出
- 自定义导出模板
**Better Export PDF**
- 改进的 PDF 导出
- 更好的中文支持
- 自定义样式
**Webpage HTML Export**
- 导出为网页
- 保持链接结构
- 响应式设计
导出优化技巧
图表导出优化
1. Mermaid 图表
# 确保图表正确渲染
- 使用支持 Mermaid 的导出工具
- 检查图表语法正确性
- 考虑图表复杂度和可读性
# 替代方案
- 导出为 SVG 格式
- 转换为高分辨率图片
- 使用在线 Mermaid 编辑器
2. 数学公式
# LaTeX 公式导出注意事项
- 确保目标格式支持数学公式
- PDF 导出需要 LaTeX 环境
- HTML 导出需要 MathJax 或 KaTeX
- Word 导出可能需要手动调整
样式和格式优化
1. CSS 样式定制
创建自定义样式 style.css:
/* 文档整体样式 */
body {
font-family: 'Source Han Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;
line-height: 1.8;
color: #333;
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
}
/* 标题样式 */
h1 {
color: #2c3e50;
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
margin-top: 40px;
}
h2 {
color: #34495e;
border-bottom: 2px solid #ecf0f1;
padding-bottom: 8px;
margin-top: 30px;
}
h3 {
color: #7f8c8d;
margin-top: 25px;
}
/* 代码样式 */
code {
background-color: #f8f9fa;
color: #e83e8c;
padding: 2px 6px;
border-radius: 4px;
font-family: 'Fira Code', 'Consolas', monospace;
}
pre {
background-color: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 6px;
padding: 16px;
overflow-x: auto;
margin: 20px 0;
}
pre code {
background: none;
color: inherit;
padding: 0;
}
/* 表格样式 */
table {
border-collapse: collapse;
width: 100%;
margin: 20px 0;
}
th, td {
border: 1px solid #ddd;
padding: 12px;
text-align: left;
}
th {
background-color: #f8f9fa;
font-weight: 600;
}
tr:nth-child(even) {
background-color: #f8f9fa;
}
/* 引用样式 */
blockquote {
border-left: 4px solid #3498db;
margin: 20px 0;
padding: 10px 20px;
background-color: #f8f9fa;
font-style: italic;
}
/* 链接样式 */
a {
color: #3498db;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* 图片样式 */
img {
max-width: 100%;
height: auto;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
margin: 20px 0;
}
/* 数学公式样式 */
.MathJax {
font-size: 1.1em;
}
/* 打印样式 */
@media print {
body {
font-size: 12pt;
line-height: 1.6;
}
h1, h2, h3 {
page-break-after: avoid;
}
pre, blockquote {
page-break-inside: avoid;
}
img {
max-width: 100%;
page-break-inside: avoid;
}
}
2. Word 模板定制
创建 Word 参考文档 template.docx:
1. 在 Word 中创建新文档
2. 设置样式:
- 标题 1:字体 18pt,颜色深蓝
- 标题 2:字体 16pt,颜色中蓝
- 标题 3:字体 14pt,颜色浅蓝
- 正文:字体 12pt,行距 1.5
- 代码:等宽字体,背景灰色
3. 保存为 template.docx
4. 在 Pandoc 转换时使用 --reference-doc=template.docx
自动化导出工作流
GitHub Actions 自动导出
创建 .github/workflows/export.yml:
name: 文档导出
on:
push:
branches: [ main ]
paths: [ 'docs/**/*.md' ]
jobs:
export:
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v3
- name: 安装 Pandoc
run: |
sudo apt-get update
sudo apt-get install -y pandoc texlive-xetex texlive-fonts-recommended
- name: 安装中文字体
run: |
sudo apt-get install -y fonts-noto-cjk
- name: 导出文档
run: |
mkdir -p output/{html,pdf,docx}
for file in docs/*.md; do
filename=$(basename "$file" .md)
# 导出 HTML
pandoc "$file" -o "output/html/$filename.html" \
--template templates/template.html \
--css assets/style.css \
--toc --highlight-style github
# 导出 PDF
pandoc "$file" -o "output/pdf/$filename.pdf" \
--pdf-engine=xelatex \
-V CJKmainfont="Noto Sans CJK SC" \
--toc --number-sections
# 导出 Word
pandoc "$file" -o "output/docx/$filename.docx" \
--reference-doc=templates/template.docx \
--toc
done
- name: 上传导出文件
uses: actions/upload-artifact@v3
with:
name: exported-documents
path: output/
- name: 部署到 GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./output/html
本地自动化脚本
创建 export.py Python 脚本:
#!/usr/bin/env python3
import os
import subprocess
import argparse
from pathlib import Path
def export_document(input_file, output_dir, formats):
"""导出单个文档到多种格式"""
input_path = Path(input_file)
output_path = Path(output_dir)
filename = input_path.stem
# 创建输出目录
for fmt in formats:
(output_path / fmt).mkdir(parents=True, exist_ok=True)
print(f"导出 {filename}...")
# 导出 HTML
if 'html' in formats:
cmd = [
'pandoc', str(input_path),
'-o', str(output_path / 'html' / f'{filename}.html'),
'--template', 'templates/template.html',
'--css', 'assets/style.css',
'--toc', '--highlight-style', 'github'
]
subprocess.run(cmd, check=True)
print(f" ✓ HTML: {filename}.html")
# 导出 PDF
if 'pdf' in formats:
cmd = [
'pandoc', str(input_path),
'-o', str(output_path / 'pdf' / f'{filename}.pdf'),
'--pdf-engine=xelatex',
'-V', 'CJKmainfont=SimSun',
'--toc', '--number-sections'
]
try:
subprocess.run(cmd, check=True)
print(f" ✓ PDF: {filename}.pdf")
except subprocess.CalledProcessError:
print(f" ✗ PDF 导出失败: {filename}")
# 导出 Word
if 'docx' in formats:
cmd = [
'pandoc', str(input_path),
'-o', str(output_path / 'docx' / f'{filename}.docx'),
'--reference-doc=templates/template.docx',
'--toc'
]
subprocess.run(cmd, check=True)
print(f" ✓ Word: {filename}.docx")
def main():
parser = argparse.ArgumentParser(description='批量导出 Markdown 文档')
parser.add_argument('input', help='输入目录或文件')
parser.add_argument('-o', '--output', default='output', help='输出目录')
parser.add_argument('-f', '--formats', nargs='+',
choices=['html', 'pdf', 'docx'],
default=['html', 'pdf', 'docx'],
help='导出格式')
args = parser.parse_args()
input_path = Path(args.input)
if input_path.is_file():
# 单个文件
export_document(input_path, args.output, args.formats)
elif input_path.is_dir():
# 目录中的所有 Markdown 文件
md_files = list(input_path.glob('*.md'))
if not md_files:
print("未找到 Markdown 文件")
return
for md_file in md_files:
export_document(md_file, args.output, args.formats)
else:
print(f"路径不存在: {input_path}")
return
print("\n导出完成!")
if __name__ == '__main__':
main()
使用脚本:
# 导出单个文件
python export.py document.md
# 导出目录中的所有文件
python export.py docs/
# 只导出 HTML 和 PDF
python export.py docs/ -f html pdf
# 指定输出目录
python export.py docs/ -o exports/
本章小结
在这一章中,我们探索了 Markdown 超越纯文本的强大功能:
主要内容回顾
-
Mermaid.js 图表:
- 代码绘图的理念和优势
- 流程图:业务流程、算法逻辑
- 时序图:系统交互、API 调用
- 其他图表:甘特图、饼图、类图等
-
LaTeX 数学公式:
- 行内公式和块级公式
- 常用数学符号和结构
- 复杂公式的编写技巧
- 实际应用示例
-
文档导出:
- 语雀的功能丰富简单易用
- Pandoc 的强大转换能力
- 编辑器内置导出功能
- 样式和格式优化
- 自动化导出工作流
技术价值
📊 图表的价值
- 直观表达复杂逻辑
- 提升文档专业度
- 便于版本控制和维护
- 统一的视觉风格
🔢 公式的重要性
- 精确的数学表达
- 学术和技术标准
- 美观的排版效果
- 国际通用的符号系统
📄 多格式导出
- 满足不同场景需求
- 保持内容一致性
- 提高文档传播效率
- 支持协作和分享
最佳实践总结
-
图表设计:
- 保持简洁清晰
- 使用描述性的标签
- 合理的布局和分组
- 统一的样式风格
-
公式编写:
- 合理使用行内和块级公式
- 提供清晰的变量说明
- 注意公式的对齐和格式
- 考虑读者的理解水平
-
导出优化:
- 选择合适的导出工具
- 定制样式和模板
- 测试不同格式的效果
- 建立自动化工作流
下一步学习
在下一章中,我们将通过一个完整的项目 README 案例研究,学习如何将前面所学的知识综合运用,创建专业、完整的技术文档。
实践建议:尝试在你的项目文档中添加流程图和数学公式,体验代码绘图和公式编写的便利性,并尝试导出为不同格式以满足各种使用场景。