Markdown 语法指南

Markdown 语法指南

这篇文章把本站目前能稳定使用的 Markdown / MDX 写法集中到一起。普通文章可以写成 .md,需要导入组件、写 JSX,或直接使用 Astro 组件时,就写成 .mdx

Frontmatter

每篇文章开头都需要 YAML frontmatter。本站内容集合会读取这些字段来生成标题、日期、分类、标签、封面图和语言路由。

src/content/blog/zh/example.md
---
title: '文章标题'
description: '文章摘要,会出现在列表和 SEO 描述中。'
date: 2026.05.02
updated: 2026.05.03
category: Engineering
tags: [astro, markdown]
lang: zh
cover: '../../../assets/blog-placeholder-about.jpg'
draft: false
---

titledescriptiondate 是必填字段。中文文章放在 src/content/blog/zh/lang: zh 可以保留,方便生成脚本和人工识别。

标题与目录

文章页会自动把 h2h6 收进右侧目录,所以正文里通常从二级标题开始写。

Markdown
## 二级标题

### 三级标题

#### 四级标题

##### 五级标题

###### 六级标题

三级标题示例

四级标题示例

五级标题示例
六级标题示例

段落、换行和分隔线

段落之间留一个空行即可。
如果要在同一段里强制换行,可以在行尾加两个空格,或直接使用 <br>

Markdown
第一段文字。

第二段文字。  
这一行会接在第二段内部换行。

---

行内格式

常用行内格式都可以直接写:

Markdown
**粗体**_斜体_***粗斜体***~~删除线~~`inline code`

[站内链接](/zh/posts/markdown-syntax-guide)
[外部链接](https://astro.build)

也支持自动链接:https://github.github.com/gfm

渲染效果:

粗体斜体粗斜体删除线inline code

站内链接 外部链接

也支持自动链接:https://github.github.com/gfm

行内代码还可以指定语言,使用 Shiki 高亮:

Markdown
`console.log("Hello World"){:js}`

渲染效果:console.log("Hello World")

列表

Markdown
- 无序列表
- 第二项
  - 嵌套项目
  - 另一个嵌套项目

1. 有序列表
2. 第二步
3. 第三步

- [x] 已完成
- [ ] 未完成
- [!] 重要
- [?] 疑问
- [+] 新增
- [*] 高亮
- [i] 信息
- [-] 取消

渲染效果:

  • 无序列表
  • 第二项
    • 嵌套项目
    • 另一个嵌套项目
  1. 有序列表
  2. 第二步
  3. 第三步
  • 已完成
  • 未完成
  • 重要
  • 疑问
  • 新增
  • 高亮
  • 信息
  • 取消

本站支持的 checkbox 标记:

标记含义图标
[ ]待办默认空框
[x] / [X]已完成默认对勾
[/]进行中bi:circle-half
[-]已取消bi:dash
[>]已转发tabler:arrow-big-right-filled
[<]已排期bi:calendar-plus-fill
[?]疑问bi:question-lg
[!]重要bi:exclamation-lg
[*]星标bi:star-fill
["] / [“] / [”]引用bi:quote
[l]位置tabler:map-pin-filled
[b]书签bi:bookmark-fill
[i]信息bi:info-lg
[S]金额bi:currency-dollar
[I]想法tabler:bulb-filled
[p] / [P]优点tabler:thumb-up-filled
[c] / [C]缺点tabler:thumb-down-filled
[w] / [W]胜利tabler:trophy-filled
[u]上升tabler:trending-up
[d]下降tabler:trending-down
[+]新增bi:plus-lg
[B]Bugbi:bug-fill
[a]闹钟bi:alarm-fill
[n] / [N]笔记bi:file-earmark-text-fill
[R]Reviewtabler:letter-r
[L]喜欢tabler:heart-filled

渲染预览:

  • 待办
  • 已完成
  • 已完成(大写)
  • 进行中
  • 已取消
  • 已转发
  • 已排期
  • 疑问
  • 重要
  • 星标
  • 引用
  • 弯引号
  • 位置
  • 书签
  • 信息
  • 金额
  • 想法
  • 优点
  • 优点(大写)
  • 缺点
  • 缺点(大写)
  • 胜利
  • 胜利(大写)
  • 上升
  • 下降
  • 新增
  • Bug
  • 闹钟
  • 笔记
  • 笔记(大写)
  • Review
  • 喜欢

引用

Markdown
> 写博客最好的时间是刚解决完问题的时候。  
> 第二好的时间是忘掉之前。

写博客最好的时间是刚解决完问题的时候。
第二好的时间是忘掉之前。

引用里也可以包含 粗体斜体、链接、脚注和行内代码。

图片

图片可以使用相对路径引用 src/assets 里的文件,也可以使用外部 URL。

Markdown
![博客占位图](../../../assets/blog-placeholder-about.jpg)

博客占位图

表格

Markdown
| 语法 | 用途 | 示例 |
| --- | --- | --- |
| `_text_` | 斜体 | _text_ |
| `**text**` | 粗体 | **text** |
| `` `code` `` | 行内代码 | `code` |
语法用途示例
_text_斜体text
**text**粗体text
`code`行内代码code

脚注

Markdown
这里有一个脚注引用。[^note]

[^note]: 脚注在常规宽度显示在文末脚注区,宽屏显示为靠近引用位置的左侧边注。

这里有一个脚注引用。1 脚注在常规宽度显示在文末脚注区,宽屏显示为靠近引用位置的左侧边注。

HTML 元素

Markdown 中可以穿插少量 HTML。本站样式里已经照顾了这些常见元素:

Markdown
<abbr title="Graphics Interchange Format">GIF</abbr>

H<sub>2</sub>O

X<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup>

Press <kbd>Ctrl</kbd> + <kbd>K</kbd>

Use <mark>highlight</mark> for emphasis.
GIF

H2O

Xn + Yn = Zn

Press Ctrl + K

Use highlight for emphasis.

代码块

普通代码块会使用 Shiki 高亮,并自动带复制按钮。支持的常用语言包括 astrobashcsshtmljsjsxjsonmdmdxnpmshtstsxvueyaml

Markdown
```ts
const message: string = "Hello";
console.log(message);
```
TypeScript
const message: string = "Hello";
console.log(message);

代码块标题

Markdown
```ts title="hello.ts"
export function hello(name: string) {
  return `Hello, ${name}`;
}
```
hello.ts
export function hello(name: string) {
  return `Hello, ${name}`;
}

行号

Markdown
```js lineNumbers
const value = 1;
console.log(value);
```

```js lineNumbers=8
function main() {
  return "line numbers start at 8";
}
```
JavaScript
const value = 1;
console.log(value);
JavaScript
function main() {
  return "line numbers start at 8";
}

高亮、Diff 和 Focus

可以使用 Shiki transformer 注释控制特定行或单词的样式。

Markdown
```tsx
const framework = "Astro"; // [\!code highlight]

// [\!code word:static]
const benefit = "static output";

console.log("old"); // [\!code --]
console.log("new"); // [\!code ++]

return benefit; // [\!code focus]
```
React
const framework = "Astro";

const benefit = "static output";

console.log("old");
console.log("new");

return benefit;

代码块 Tabs

相邻代码块只要都带 tab="...",就会自动合并成一个 Tab 组。

Markdown
```ts tab="pnpm"
pnpm add astro
```

```bash tab="npm"
npm install astro
```

```bash tab="yarn"
yarn add astro
```
TypeScript
pnpm add astro

步骤

在连续标题后加 [step],或直接使用数字前缀,可以把它们渲染成带编号的步骤。这个标记或数字前缀不会出现在可见标题里,同一个编号也会显示在文章目录中。

使用 [step]

Markdown
## 标题二 [step]

这里是第一组步骤的主说明,可以放安装前置条件、目标或注意事项。

### 子标题一 [step]

子步骤可以继续写正文,用来展示更细的执行项。

### 子标题二 [step]

第二个子步骤会和上一个子步骤保持同级编号。

## 标题三 [step]

回到二级步骤后,编号会延续外层步骤。

标题二

这里是第一组步骤的主说明,可以放安装前置条件、目标或注意事项。

子标题一

子步骤可以继续写正文,用来展示更细的执行项。

子标题二

第二个子步骤会和上一个子步骤保持同级编号。

标题三

回到二级步骤后,编号会延续外层步骤。

使用数字前缀

Markdown
## 1. 标题二

数字前缀写法适合从别的文档迁移过来,渲染后会移除标题里的数字。

### 1. 子标题一

子步骤的数字也会重新由渲染器生成。

### 2. 子标题二

你可以专注写结构,不需要手动维护最终的圆点样式。

## 2. 标题三

外层步骤会继续显示为第二步。

标题二

数字前缀写法适合从别的文档迁移过来,渲染后会移除标题里的数字。

子标题一

子步骤的数字也会重新由渲染器生成。

子标题二

你可以专注写结构,不需要手动维护最终的圆点样式。

标题三

外层步骤会继续显示为第二步。

数学公式

本站启用了 remark-mathrehype-katex,可以写行内公式和块级公式。

Markdown
行内公式:$$c = \pm\sqrt{a^2 + b^2}$$

```math
\int_a^b f(x)\,dx
```

行内公式:c=±a2+b2c = \pm\sqrt{a^2 + b^2}

abf(x)dx\int_a^b f(x)\,dx

Callout

.md.mdx 都可以使用 <Callout>,也可以使用类似 Docusaurus / Fumadocs Remark Admonition 的 ::: 语法。支持的名称包括 notetipinfowarnwarningcautiondangererrorsuccessidea

MDX
<Callout title="提示" type="tip">

这里可以继续写 **Markdown**,也可以放链接、列表、代码块或数学公式。

</Callout>

JSX 写法

<Callout> 适合在 MDX 中使用。note / tip / info 会渲染成信息样式,warn / warning / caution 会渲染成警告样式,danger / error 会渲染成错误样式。

Admonition 写法

Admonition 写法来自 Docusaurus,Fumadocs 的 remarkDirectiveAdmonition 也支持这种迁移语法。标题可以省略,也可以写在方括号里,标题中可以包含行内 Markdown。

Markdown
:::tip[带 `Markdown` 的标题]

这里会渲染成 callout。

:::

Cards

.md.mdx 都可以使用 <Cards> / <Card>href 会把卡片变成链接,外部链接会自动加安全属性;icon 可以传 Lucide 图标名。

MDX
<Cards>
  <Card
    title="Astro"
    description="内容优先的静态站点框架"
    href="https://astro.build"
    icon="Rocket"
  >
    适合写博客、文档和作品集。
  </Card>
  <Card title="本站组件" description="无链接卡片" icon="BookOpen">
    也可以只作为内容分组使用。
  </Card>
</Cards>

Astro

内容优先的静态站点框架

适合写博客、文档和作品集。

本站组件

无链接卡片

也可以只作为内容分组使用。

MDX 组件

.mdx 是 Markdown 的超集,可以导入 Astro 组件并直接使用。组件默认会渲染成静态 HTML;只有组件自己声明客户端脚本时才会带交互。

MDX
import Button from '../../../components/Button.astro';

<Button link="/" text="回到首页" />
回到首页

也可以手写代码块 Tab 组件,适合需要给 Tab 传更复杂属性时使用。

MDX
<CodeBlockTabs defaultValue="astro">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="astro" label="Astro" active />
    <CodeBlockTabsTrigger value="css" label="CSS" />
  </CodeBlockTabsList>

  <CodeBlockTab value="astro" active>
    ```astro
    ---
    const name = "Astro";
    ---

    <h2>{name}</h2>
    ```
  </CodeBlockTab>

  <CodeBlockTab value="css">
    ```css
    h2 {
      color: currentColor;
    }
    ```
  </CodeBlockTab>
</CodeBlockTabs>
Astro
---
const name = "Astro";
---

<h2>{name}</h2>

写作建议

  • 正文从 ## 开始写,让文章标题只来自 frontmatter。
  • 同一个主题尽量拆成短段落,目录会更好扫。
  • 代码块能写语言就写语言;需要解释文件时加 title="file.ts"
  • 需要强调注意事项时优先用 <Callout>,需要组织相关链接时用 <Cards>
  • 有明确顺序的教程步骤用 [step] 标题。
  • 纯内容文章用 .md;需要导入组件或写 JSX 时用 .mdx
  • 后续如果新增、调整或移除 Markdown / MDX 格式支持,要同步更新 CLAUDE.mdAGENTS.md,并同时更新这篇中文指南和英文指南。

Footnotes

  1. 脚注在常规宽度显示在文末脚注区,宽屏显示为靠近引用位置的左侧边注。

Yi Liu

© 2026 Yi Liu

GitHubRSS