Zensical Markdown 速查
本页是本站(Zensical 0.0.57)全部写作语法的对照教程:每个语法先给「写法」源码,再给实际渲染效果。给课页补内容时照抄即可。标准 Markdown 基础压缩在最前面,Zensical 扩展从「提示块」开始。
怎么读这页
有围栏代码框的地方:框内是你要写的源码,框下方(或右侧)是渲染效果。
本站已启用的扩展都配好了,写法直接用;个别未启用的功能在最后一节标明。
基础 Markdown
标题与文字
| # 一级标题(每页只写一个,带课号)
## 二级标题 ### 三级标题 #### 四级标题
**粗体** *斜体* ***粗斜体*** ~~删除线~~ `行内代码`
|
渲染效果:粗体 斜体 粗斜体 删除线 行内代码
中文标题加锚点
中文标题的自动锚点不可靠。需要被页内链接跳转的标题,用属性写法显式指定锚点(本页多个标题都这么做了):
| ## 提示块 Admonition { #admonition }
|
跳转写法:[跳到提示块](#admonition)。
链接
| [站内页面用相对 .md 路径](../s/l04.md)
[带锚点跳转](../index.md#how-to-add)
[外部链接带悬停提示](https://zensical.org "Zensical 官网")
|
渲染效果:并查集(S-L04) | 首页·课程大纲 | 外部链接带悬停提示
永远用相对 .md 链接
不要写 HTML 地址、不要写 /s/l14/ 这种绝对路径——Zensical 会把 .md 链接翻译成正确的目标地址,换域名也不怕。
列表
| - 无序列表项
- 嵌套项(缩进 4 空格,不是 2!)
1. 有序列表项
续行同样缩进 4 空格
|
-
无序列表项
- 嵌套项(Python Markdown 方言:一律 4 空格缩进)
-
有序列表项
- 有序嵌套
- 序号可以不连续,渲染时自动重排
任务列表
定义列表
| `DSU`
: 并查集(Disjoint Set Union):处理不相交集合的合并与查询。
`LIS`
: 最长上升子序列(Longest Increasing Subsequence)。
|
DSU
- 并查集(Disjoint Set Union):处理不相交集合的合并与查询。
LIS
- 最长上升子序列(Longest Increasing Subsequence)。
表格(含对齐)
| | 算法 | 复杂度 | 适用 |
| :--- | :---: | ---: |
| Dijkstra | `O(m log n)` | 非负权 |
| Floyd | `O(n^3)` | 多源、n≤500 |
|
分隔行 :--- 左对齐、:---: 居中、---: 右对齐。渲染效果:
| 算法 |
复杂度 |
适用 |
| Dijkstra |
O(m log n) |
非负权 |
| Floyd |
O(n^3) |
多源、n≤500 |
引用与脚注
| > 引用一行
> > 可以嵌套引用
正文里引用脚注[^1]。
[^1]: 脚注内容。多行时换行缩进 4 空格。
|
引用一行
嵌套引用
悬停这个脚注试试(本站开启了脚注悬浮预览):Python Markdown 用 4 空格缩进。
提示块 Admonition
写法:!!! 类型 ["标题] 起头,内容缩进 4 空格。共 12 种类型:
| !!! note "自定义标题"
内容缩进 4 空格,可包含任意 Markdown。
|
自定义标题
内容缩进 4 空格,可包含任意 Markdown。
12 种类型一览
折叠块(??? / ???+)
| ??? tip "默认收起,点击展开"
???+ note "加 + 号默认展开"
|
默认收起,点击展开
收起的内容藏在这里。
加 + 号默认展开
一进来就是展开状态。
无标题块
| !!! warning ""
空标题 = 只剩彩色条,适合一句话提醒。
|
侧边浮动块
| !!! info inline end "浮在右侧"
必须写在它旁边那段文字**之前**。
随后的正文会环绕浮动块;空间不足(手机)时自动变全宽。
|
随后的正文会环绕浮动块;空间不足(比如手机屏)时自动变全宽。这里多写几个字让环绕效果更明显:CSP 初赛以客观题为主,复赛以编程题为主,模板库为两者服务。
嵌套提示块
GitHub 风格 Callouts(可移植)
| > [!NOTE]
> GitHub、GitLab 上同样认识的提示块写法。
|
渲染效果——标记必须全大写,否则 GitHub 不渲染:
Note
GitHub、GitLab 上同样认识的提示块写法,两边显示效果一致。
五种 GitHub 标准类型:[!NOTE]、[!TIP]、[!WARNING]、[!IMPORTANT]、[!CAUTION]。本站启用了 Quotes 扩展,12 种 admonition 类型也都可以用 callout 写法(如 > [!BUG])。
内容标签页 Content Tabs
| === "C++"
``` cpp
#include <bits/stdc++.h>
using namespace std;
// 并查集:路径压缩 + 按大小合并,单次操作均摊近似 O(alpha(n))
struct DSU {
vector<int> fa, sz;
DSU(int n) : fa(n), sz(n, 1) { iota(fa.begin(), fa.end(), 0); }
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool merge(int x, int y) {
x = find(x); y = find(y);
if (x == y) return false; // 已在同一集合
if (sz[x] < sz[y]) swap(x, y);
fa[y] = x; sz[x] += sz[y];
return true;
}
bool same(int x, int y) { return find(x) == find(y); }
};
```
=== "Python"
``` python
print("hello")
```
|
=== "标签名" 起头、内容缩进 4 空格;同名标签全站联动(点一个,全站同名的一起切):
代码块 Code Blocks
常用选项
| ``` cpp title="hello.cpp" linenums="1" hl_lines="4"
...
|
| - `title="..."` 块标题(常放文件名);`hl_lines="4"` 高亮第 4 行,多行 `"2 5"`,区间 `"3-5"`
- **行号全站默认开启**;需要指定起始行号时用 `linenums="1"`
- 复制按钮、划词选择按钮全站已启用
- 单块关闭复制用属性写法:```` { .python .no-copy }`(语言前必须带点)
``` cpp title="hello.cpp" linenums="1" hl_lines="4"
#include <iostream>
using namespace std;
int main() {
cout << "Hello, CSP!" << endl;
return 0;
}
|
行内代码高亮
| 行内代码前加 `#!语言`:`#!python range()`、`#!cpp sort(v.begin(), v.end())`
|
行内代码前加 #!语言:range()、sort(v.begin(), v.end())
嵌入代码文件(本站核心用法)
templates/ 下的代码是唯一真源,页面不复制代码,用 snippet 语法嵌入(路径相对 templates/):
| ``` cpp
#include <bits/stdc++.h>
using namespace std;
// 并查集:路径压缩 + 按大小合并,单次操作均摊近似 O(alpha(n))
struct DSU {
vector<int> fa, sz;
DSU(int n) : fa(n), sz(n, 1) { iota(fa.begin(), fa.end(), 0); }
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool merge(int x, int y) {
x = find(x); y = find(y);
if (x == y) return false; // 已在同一集合
if (sz[x] < sz[y]) swap(x, y);
fa[y] = x; sz[x] += sz[y];
return true;
}
bool same(int x, int y) { return find(x) == find(y); }
};
```
|
实际效果(下面这块就是真实嵌入的 templates/s/l04/union-find.cpp,改代码文件这里自动变):
| #include <bits/stdc++.h>
using namespace std;
// 并查集:路径压缩 + 按大小合并,单次操作均摊近似 O(alpha(n))
struct DSU {
vector<int> fa, sz;
DSU(int n) : fa(n), sz(n, 1) { iota(fa.begin(), fa.end(), 0); }
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool merge(int x, int y) {
x = find(x); y = find(y);
if (x == y) return false; // 已在同一集合
if (sz[x] < sz[y]) swap(x, y);
fa[y] = x; sz[x] += sz[y];
return true;
}
bool same(int x, int y) { return find(x) == find(y); }
};
|
图标与 Emoji
| emoji::smile: :rocket: :bulb: :tada:
图标(路径的 / 换成 -)::lucide-database: :material-check: :octicons-zap-16: :fontawesome-solid-paper-plane: :simple-github:
带尺寸/提示::lucide-zap:{ .lg .middle } :lucide-database:{ title="数据结构" }
|
emoji:

图标五套可用(lucide / material / octicons / fontawesome / simple):
带修饰:
front matter 里的图标
页面文件开头写 icon: lucide/database(这里用斜杠路径),图标显示在左侧导航和顶栏标签上。查图标名:lucide.dev。
文字格式扩展
| ==高亮== ^^下划线插入^^ ~~删除~~
H~2~O 下标 A^T^ 上标 ++ctrl+alt+del++ 按键
|
渲染效果:高亮 | 下划线插入 | 删除 | H2O | ATA | Ctrl+Alt+Del
卡片网格 Grid
| <div class="grid cards" markdown>
- :lucide-zap:{ .lg .middle } **Dijkstra**
---
堆优化单源最短路
[S-L14 最短路](../s/l14.md)
- :lucide-database:{ .lg .middle } **并查集**
---
路径压缩 + 按大小合并
[S-L04 并查集](../s/l04.md)
</div>
|
--- 在卡片内画分隔线;首图标的 { .lg .middle } 是卡片标题专用尺寸。首页和本站各分类卡片就是它。渲染效果:
通用网格 <div class="grid" markdown> 可包任意块(tabs、代码块混排),块后加 { .card } 变卡片。
Mermaid 图表
| ``` mermaid
graph LR
A[读题] --> B{有思路?};
B -->|是| C[套模板];
B -->|否| D[看解析];
D --> A;
```
|
渲染效果(支持明暗两套配色):
graph LR
A[读题] --> B{有思路?};
B -->|是| C[套模板];
B -->|否| D[看解析];
D --> A;
按钮
| [普通按钮](#grid){ .md-button }
[主按钮](../s/l14.md){ .md-button .md-button--primary }
[带图标](#code){ .md-button }
|
渲染效果:
普通按钮
主按钮
带图标
工具提示与缩写
| [悬停有提示的链接](https://example.com "我是提示文字")
*[DSU]: Disjoint Set Union,并查集
|
定义缩写后,全页出现这个词的地方悬停都会出提示:这里的 DSU 和 DSU 都试试。链接悬停提示见基础·链接一节。
图片进阶(语法备查)
图片文件放 docs/ 下,用相对路径引用。对齐、宽高、懒加载、明暗切换:
| { align=right } 左 align=left / 右 align=right(无居中)
{ width="300" }
{ loading=lazy }
 
|
带题注(figure 写法):
| <figure markdown="span">
{ width="300" }
<figcaption>题注文字</figcaption>
</figure>
|
数学公式(KaTeX 已配置)
行内公式 $...$(或 \(...\)),块级公式 $$...$$ 独立成段(或 \[...\]):
| 行内:复杂度 $O(n \log n)$,递推式 $a_n = a_{n-1} + a_{n-2}$
块级:
$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$
|
渲染效果——行内:复杂度 \(O(n \log n)\),递推式 \(a_n = a_{n-1} + a_{n-2}\)
\[
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
\]
使用注意
- 渲染库 KaTeX 走 jsdelivr CDN,离线预览时公式会显示原文;
- 单个
$ 会被当作公式定界符:正文里要显示美元符号时,放进行内代码($100)最稳妥;
- 定界符只扫描普通文本,代码块、行内代码里的
$ 不会触发公式。
Front matter 页面元信息
每页文件开头可写元信息(三条横线包围):
| ---
title: 自定义页面标题 # 覆盖 nav/h1 推断的标题
description: 页面摘要 # 进 <meta> 标签
icon: lucide/zap # 导航图标(斜杠路径)
status: new # 侧边栏徽标:new / deprecated
hide:
- navigation # 隐藏左侧导航
- toc # 隐藏右侧目录
---
|
本站尚未启用 / 已知坑
| 功能 |
状态 |
说明 |
代码标注 # (1)! |
不可用 |
官网有文档但 0.0.57 实测不渲染(见下)。想解释代码用行内注释或正文列表 |
图片题注 /// caption |
未启用 |
用上面的 <figure> 写法替代 |
Directives(@if/@var/@use) |
付费 |
Zensical Spark 功能,不要使用 |
代码标注的语法(留档,当前版本别用):
| ``` cpp
int x = 1; // (1)!
```
1. 标注内容
|
GitHub callouts 的完整教程已移至「提示块」一节:GitHub 风格 Callouts。