跳转至

Zensical Markdown 速查

本页是本站(Zensical 0.0.57)全部写作语法的对照教程:每个语法先给「写法」源码,再给实际渲染效果。给课页补内容时照抄即可。标准 Markdown 基础压缩在最前面,Zensical 扩展从「提示块」开始。

怎么读这页

有围栏代码框的地方:框内是你要写的源码,框下方(或右侧)是渲染效果。 本站已启用的扩展都配好了,写法直接用;个别未启用的功能在最后一节标明。

基础 Markdown

标题与文字

1
2
3
# 一级标题(每页只写一个,带课号)
## 二级标题    ### 三级标题    #### 四级标题
**粗体**  *斜体*  ***粗斜体***  ~~删除线~~  `行内代码`

渲染效果:粗体 斜体 粗斜体 删除线 行内代码

中文标题加锚点

中文标题的自动锚点不可靠。需要被页内链接跳转的标题,用属性写法显式指定锚点(本页多个标题都这么做了):

## 提示块 Admonition { #admonition }

跳转写法:[跳到提示块](#admonition)

链接

1
2
3
[站内页面用相对 .md 路径](../s/l04.md)
[带锚点跳转](../index.md#how-to-add)
[外部链接带悬停提示](https://zensical.org "Zensical 官网")

渲染效果:并查集(S-L04)首页·课程大纲外部链接带悬停提示

永远用相对 .md 链接

不要写 HTML 地址、不要写 /s/l14/ 这种绝对路径——Zensical 会把 .md 链接翻译成正确的目标地址,换域名也不怕。

列表

1
2
3
4
- 无序列表项
    - 嵌套项(缩进 4 空格,不是 2!)
1. 有序列表项
   续行同样缩进 4 空格
  • 无序列表项

    • 嵌套项(Python Markdown 方言:一律 4 空格缩进
  • 有序列表项

    1. 有序嵌套
    2. 序号可以不连续,渲染时自动重排

任务列表

- [x] 已完成
- [ ] 待办
  • 已完成任务
  • 待办任务
    • 嵌套也支持

定义列表

1
2
3
4
5
`DSU`
:   并查集(Disjoint Set Union):处理不相交集合的合并与查询。

`LIS`
:   最长上升子序列(Longest Increasing Subsequence)。
DSU
并查集(Disjoint Set Union):处理不相交集合的合并与查询。
LIS
最长上升子序列(Longest Increasing Subsequence)。

表格(含对齐)

1
2
3
4
| 算法 | 复杂度 | 适用 |
| :--- | :---: | ---: |
| Dijkstra | `O(m log n)` | 非负权 |
| Floyd | `O(n^3)` | 多源、n≤500 |

分隔行 :--- 左对齐、:---: 居中、---: 右对齐。渲染效果:

算法 复杂度 适用
Dijkstra O(m log n) 非负权
Floyd O(n^3) 多源、n≤500

引用与脚注

1
2
3
4
5
6
> 引用一行
> > 可以嵌套引用

正文里引用脚注[^1]。

[^1]: 脚注内容。多行时换行缩进 4 空格。

引用一行

嵌套引用

悬停这个脚注试试(本站开启了脚注悬浮预览):Python Markdown 用 4 空格缩进1

提示块 Admonition

写法:!!! 类型 ["标题] 起头,内容缩进 4 空格。共 12 种类型:

1
2
3
!!! note "自定义标题"

    内容缩进 4 空格,可包含任意 Markdown。

自定义标题

内容缩进 4 空格,可包含任意 Markdown。

12 种类型一览

Note

note(默认,常规说明)

Abstract

abstract(摘要)

Info

info(信息)

Tip

tip(技巧)

Success

success(成功)

Question

question(问题)

Warning

warning(警告)

Failure

failure(失败)

Danger

danger(危险)

Bug

bug(缺陷)

Example

example(示例)

Quote

quote(引用)

折叠块(??? / ???+)

??? tip "默认收起,点击展开"
???+ note "加 + 号默认展开"
默认收起,点击展开

收起的内容藏在这里。

加 + 号默认展开

一进来就是展开状态。

无标题块

!!! warning ""
    空标题 = 只剩彩色条,适合一句话提醒。

空标题 = 只剩彩色条,适合一句话提醒。

侧边浮动块

1
2
3
4
5
!!! info inline end "浮在右侧"

    必须写在它旁边那段文字**之前**。

随后的正文会环绕浮动块;空间不足(手机)时自动变全宽。

浮在右侧

必须写在它旁边那段文字之前

随后的正文会环绕浮动块;空间不足(比如手机屏)时自动变全宽。这里多写几个字让环绕效果更明显:CSP 初赛以客观题为主,复赛以编程题为主,模板库为两者服务。

嵌套提示块

外层

缩进一层。

内层

再缩进一层(每层 4 空格)。

GitHub 风格 Callouts(可移植)

> [!NOTE]
> GitHub、GitLab 上同样认识的提示块写法。

渲染效果——标记必须全大写,否则 GitHub 不渲染:

Note

GitHub、GitLab 上同样认识的提示块写法,两边显示效果一致。

Warning

警告类。

Tip

提示类。

五种 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 空格;同名标签全站联动(点一个,全站同名的一起切):

#include <iostream>
int main() { std::cout << "CSP!\n"; }
print("CSP!")

代码块 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

1
2
3
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): GitHub

带修饰:

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 图表

1
2
3
4
5
6
7
``` mermaid
graph LR
  A[读题] --> B{有思路?};
  B -->|是| C[套模板];
  B -->|否| D[看解析];
  D --> A;
```

渲染效果(支持明暗两套配色):

graph LR
  A[读题] --> B{有思路?};
  B -->|是| C[套模板];
  B -->|否| D[看解析];
  D --> A;

按钮

1
2
3
[普通按钮](#grid){ .md-button }
[主按钮](../s/l14.md){ .md-button .md-button--primary }
[带图标](#code){ .md-button }

渲染效果:

普通按钮 主按钮 带图标

工具提示与缩写

[悬停有提示的链接](https://example.com "我是提示文字")
*[DSU]: Disjoint Set Union,并查集

定义缩写后,全页出现这个词的地方悬停都会出提示:这里的 DSU 和 DSU 都试试。链接悬停提示见基础·链接一节。

图片进阶(语法备查)

图片文件放 docs/ 下,用相对路径引用。对齐、宽高、懒加载、明暗切换:

1
2
3
4
![说明](../assets/img.png){ align=right }      左 align=left / 右 align=right(无居中)
![说明](img.png){ width="300" }
![说明](img.png){ loading=lazy }
![亮色版](light.png#only-light) ![暗色版](dark.png#only-dark)

带题注(figure 写法):

1
2
3
4
5
6
7
<figure markdown="span">

![说明](img.png){ width="300" }

<figcaption>题注文字</figcaption>

</figure>

数学公式(KaTeX 已配置)

行内公式 $...$(或 \(...\)),块级公式 $$...$$ 独立成段(或 \[...\]):

1
2
3
4
5
6
行内:复杂度 $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 页面元信息

每页文件开头可写元信息(三条横线包围):

1
2
3
4
5
6
7
8
9
---
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 功能,不要使用

代码标注的语法(留档,当前版本别用):

1
2
3
4
5
``` cpp
int x = 1;  // (1)!
```

1.  标注内容

GitHub callouts 的完整教程已移至「提示块」一节:GitHub 风格 Callouts


  1. 脚注内容。与 CommonMark 不同,Python Markdown 的续行/块内容一律缩进 4 空格。