Markdown语法大全

Markdown基础语法,高级语法以及速记

Markdown 是一种轻量级的标记语言,可用于在纯文本文档中添加格式化元素。其设计宗旨是易于编写,更重要的是,易于阅读。该篇涵盖了从基础文本格式化到高级表格、数学公式及速记技巧,旨在帮助您快速掌握这种轻量级标记语言

1. Markdown背景

1.1 Markdown的发展历史

Markdown 是由 John Gruber 于 2004 年创建的一种轻量级标记语言,如今已成为世界上最流行的标记语言之一。到了2008年的时候,Stack Overflow的联合创始人 Jeff Atwood 推其成为 Stack Overflow的编辑方式,并且非常认同其设计;Github也在2009年左右开始使用Markdown

注记

Stack Overflow是一个全球最大的程序设计领域问答网站,由Jeff Atwood和Joel Spolsky于2008年创立。它采用问答(Q&A)形式,供程序员提出、解答编程问题,是工程师解决代码难题和分享技术知识的社群核心平台

  • 2012年公司组织一起制定出 Markdown的标准规范和其实现的标准测试用例

  • 2014年标准化项目最初被命名为 Standard Markdown,旨在创建一个包含 600 多个测试用例的严格规范,以确保所有兼容的实现都能产生完全相同的输出。然而,这一举动遭到了 Markdown 创始人 John Gruber 的强烈反对。他认为这个新标准偏离了他最初的哲学,为了规避冲突并继续推进标准化进程,项目在 2014 年 正式更名为 CommonMark。

  • 2016 年,互联网工程任务组(IETF)发布了 RFC 7763。这份文件正式为 Markdown 定义了媒体类型 text/markdown。这意味着 Markdown 文件在互联网上拥有了正式的“身份证”,操作系统和浏览器可以更准确地识别和处理它。

  • 2017年,在 CommonMark 的基础上,GitHub 增加了一些非常实用的扩展功能,如表格、任务列表、删除线等,这些功能深受开发者喜爱,被称为 GitHub Flavored Markdown (GFM)。

Markdown 已经形成了一个以 CommonMark 为核心,各种扩展(Flavors)为分支的健康生态

核心:CommonMark 保证了基础语法的稳定与统一

扩展:
- GFM:成为技术文档和开发者社区的事实标准
- Microsoft Learn Markdown:增加了你提到的 > [!NOTE] 警报框等扩展,服务于其庞大的文档平台
- 其他:还有许多其他扩展,如支持数学公式的 LaTeX、支持脚注的 Pandoc Markdown 等

在AI时代,markdown语法以及类markdown语法已经成为了金标准

1.2 Markdown原理

Markdown 的底层其实并不神秘,它的核心本质可以概括为三个关键词:纯文本、解析规则和抽象语法树(AST)

markdown

  1. 物理底层:纯文本

Markdown 文件在硬盘上存储时,和你写的 .txt 文件没有任何区别

  • 编码:它通常使用 UTF-8 编码,这意味着它可以在任何操作系统(Windows, Mac, Linux)上被打开和读取,不会出现乱码
  • 内容:它只包含人类可读的字符。比如你想加粗,你实际上是在文本里输入了两个星号 **。计算机在底层看到的只是字符 * 的 ASCII 或 Unicode 码,而不是“加粗”这个指令
  • 跨平台性:因为它只是纯文本,所以它极其轻量,且永远不会因为软件版本更新而打不开
  1. 逻辑底层:解析与转换
  1. 解析器会逐行扫描你的文本,利用正则表达式或状态机来识别特定的符号模式
  2. 这是 Markdown 最核心的底层技术。解析器不会直接把文本变成 HTML,而是先把它转换成一种树状的数据结构,叫做 抽象语法树 (Abstract Syntax Tree, AST)
  3. 渲染 (Rendering),渲染器会遍历这棵 AST 树,根据规则把每个节点“翻译”成目标格式(通常是 HTML)

设计哲学

  • 内容:通过纯文本编写,永久保存,用不过时
  • 样式:由渲染器(如浏览器、Typora、VS Code)通过 CSS 动态决定。这意味着同一份 Markdown 文件,在 GitHub 上显示一种风格,在你的笔记软件里显示另一种风格,但内容永远不变

1.2 Markdown解析引擎的发展历史

随着 Markdown 语法的不断扩展(从纯文本到支持表格、数学公式、流程图等),解析器不得不从简单的字符串替换升级为复杂的抽象语法树(AST)构建

  1. 早期阶段:正则表达式与“蛮力”替换 (2004 - 2010)

在 Markdown 诞生初期,解析器的核心逻辑非常简单直接:正则表达式(Regular Expression)

  • 鼻祖:Markdown.pl (2004)

John Gruber 发布的第一个 Markdown 解析器是用 Perl 编写的 Markdown.pl。它的逻辑非常直观:定义一系列正则规则,按顺序扫描文本并进行替换

  • 代表引擎:Showdown (2007)

这是最早的 JavaScript 版本解析器,它将 Markdown 带入了浏览器端。Showdown 沿用了正则替换的思路

  1. 转折阶段:标准化与 AST 的引入 (2011 - 2015)

随着 GitHub Flavored Markdown (GFM) 的兴起和 CommonMark 标准的制定,开发者意识到正则表达式已经无法满足需求,必须引入编译器技术中的抽象语法树(AST)

  • 过渡者:Marked (2011)

Marked 是 GitHub 上非常早期的 JS 解析器。早期版本主要依赖正则,性能极高但兼容性一般。后期为了支持 CommonMark 标准,它也不得不引入更复杂的解析逻辑,甚至重构底层

  • 革新者:CommonMark.js / cmark (2014)

John MacFarlane 2014年时候最早创建的,他同时也是标准制定人之一,还是 Pandoc的作者。将Markdown文档解析成 抽象语法树(AST),并通过渲染(AST)转换成 HTML 或者 XML

  1. 现代阶段:PEG 与插件化生态 (2015 - 至今)

在现代,解析引擎不仅要快,还要极度灵活,支持各种“方言”(如数学公式、流程图)。解析表达式文法(PEG)和高度模块化的 AST 处理器成为了主流。

  • 技术流派:PEG (Parsing Expression Grammar)
  • 生态霸主:markdown-it (2014+)(Remarkable 是2014年左右的开源项目,目前已更新很少了;Markdown-it 是 Remarkable 核心两个作者后面开的开源项目,同时借鉴参考了 MacFarlane 的 Commonmark 的一些实现,也是功能、扩展性都非常不错的 Markdown解析引擎)

当前趋势

  • 双向绑定:现代编辑器(如 Typora, Obsidian)不仅需要将 Markdown 转为 HTML,还需要将 HTML 操作(如光标定位)映射回 Markdown 源码,这对 AST 的精确度提出了更高要求

  • WYSIWYG(所见即所得):解析器不再只是生成 HTML 字符串,而是直接生成可编辑的 DOM 节点或虚拟 DOM

1.3 Markdown优势

  1. 专注于文字内容
  2. 纯文本,易读易写,可以方便地纳入版本控制;
  3. 语法简单,没有什么学习成本,能轻松在码字的同时做出美观大方的排版
  • Markdown 无处不在。StackOverflow、CSDN、掘金、简书、GitBook、有道云笔记、V2EX、光谷社区等。主流的代码托管平台,如 GitHub、GitLab、BitBucket、Coding、Gitee 等等,都支持 Markdown 语法,很多开源项目的 README、开发文档、帮助文档、Wiki 等都用 Markdown 写作

  • Markdown 是纯文本可移植的。几乎可以使用任何应用程序打开包含 Markdown 格式的文本文件。如果你不喜欢当前使用的 Markdown 应用程序了,则可以将 Markdown 文件导入另一个 Markdown 应用程序中。

  • Markdown 是独立于平台的。你可以在运行任何操作系统的任何设备上创建 Markdown 格式的文本

注记

Markdown 入门的最佳方式就是多使用它。由于有大量免费工具的存在,上手 Markdown 是很方便的。比较遗憾的一点是各平台可能采用不同语言实现的 Markdown 解析引擎,或采用同一解析引擎的不同版本,而且可能有不同程度的定制与扩展,这导致在不同平台上使用 Markdown 写作时体验并不完全一致

1.4 Markdown创作的工具

  • 现代编辑器 VSCode/Atom
  • 传统编辑器 Vim/Sublime Text/Notepad++/Emacs
  • Markdown 文档生成器 Typora/Mark Text
  • IDE 自带编辑器 IntelliJ IDEA / Android Studio / WebStorm
  • 专用编辑器 Ulysses / Mou / 妙言 / Markpad
  • 在线编辑器等

2. 基础语法和拓展语法

Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。

注记

轻量级标记语言(Lightweight Markup Language, LML)是一类通过简单的纯文本符号来定义文档格式的语言

它的核心理念是:让文档的源代码在未被渲染(即没有转换成漂亮排版)的情况下,依然易于阅读和编写

2.1 标题语法

要创建标题,请在单词或短语前面添加井号 (#),#的数量代表了标题的级别,相当于己几级标题

注记

很早之前还有在文本下面添加任意数量的== 号来标识一级标题,或者-- 号标识二级标题,但现在这种方式已经过时了

Markdown Syntax Output
# Heading 1

Heading 1

## Heading 2

Heading 2

### Heading 3

Heading 3

#### Heading 4

Heading 4

##### Heading 5
Heading 5
###### Heading 6
Heading 6

拓展语法

通过创建带有数字符号(#)和自定义标题ID的[标准链接]((/basic-syntax/links.html),可以链接到文件中具有自定义ID的标题。

这个主要是配合链接的用法来超链接到某篇文章某个标题,方便快速跳转

2.2 文本语法

  • 基础:文本的常规处理(加粗;倾斜,引用块,有序列表,无序列表)
  • 拓展:脚注,标题编号,定义列表,删除线,任务列表
  1. 段落语法

要创建段落,请使用空白行将一行或多行文本进行分隔

重要

不要用空格(space)或制表符(tabs)来缩进段落,Markdown 会把你缩进的文本解释为代码块,而不是普通的段落。

  1. 换行(Line Break)

几乎每个 Markdown 应用程序都支持两个或多个空格进行换行,称为 结尾空格(trailing whitespace) 的方式,但这是有争议的,因为很难在编辑器中直接看到空格,并且很多人在每个句子后面都会有意或无意地添加两个空格。

几乎每个 Markdown 应用程序都支持另一种换行方式:HTML 的 <br> 标签

  1. 文字语法

常见的粗体,倾斜,上标,下标,删除线和代码块

Markdown Syntax Output
*italics*, **bold**, ***bold italics***
italics, bold, bold italics
superscript^2^ / subscript~2~
superscript2 / subscript2
~~strikethrough~~
strikethrough
`verbatim code`
verbatim code

这些强调语法是可以交叉使用的,例如 ***bold italics*** 会显示为粗斜体

2.3 引用语法

块引用(Blockquote)是 Markdown 中一种用于突出显示特定内容的语法,它会在视觉上将引用的文本与正文区分开来。 通常用于引用他人的话语、文章或作为文档中的提示、备注和警告。

在段落行首使用>符号,并在其后加一个空格,即可创建一个块引用

# 单段落引用
> This is a blockquote with one line of text.

# 多段落引用
> This is a blockquote with two lines of text.
>
> This is the second line.

# 嵌套引用
> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.

# 带其他元素的引用
> #### The quarterly results look great!
>
> - Revenue was off the chart.
> - Profits were higher than ever.
>
>  *Everything* is going according to **plan**.

2.4 列表语法

可以讲多个条目组织成有序或无序列表

  1. 有序列表

要创建有序列表,请在每个列表项前添加数字并紧跟一个英文句点。数字不必按数学顺序排列,但是列表应当以数字 1 起始

列表markdown
Markdown语法 效果
1. First item
2. Second item
3. Third item
4. Fourth item
1. First item
2. Second item
3. Third item
4. Fourth item
1. First item
1. Second item
1. Third item
1. Fourth item
  1. First item

  2. Second item

  3. Third item

  4. Fourth item

1. First item
2. Second item
3. Third item
    1. Indented item
    2. Indented item
4. Fourth item
  1. First item

  2. Second item

  3. Third item

    1. Indented item

    2. Indented item

  4. Fourth item

  1. 无序列表

要创建无序列表,请在每个列表项前添加一个星号、加号或减号,并紧跟一个空格

Markdown语法 效果
* First item
* Third item
* Fifth item
  • First item
  • Second item
  • Fourth item
markdown | + First item | + Second item | + Third item + Fourth item | + Fifth item | + Sixth item | | | |
- Second item
- Fourth item
- Sixth item
  • First item
  • Third item
  • Fifth item
提示

要在保留列表连续性的同时在列表中添加另一种元素,请将该元素缩进四个空格或一个制表符,如下例所示,可以添加各种语法

  • 引用块>
  • 代码块
  • 图片
  • 其他列表
*   This is the first list item.
*   Here's the second list item.

    I need to add another paragraph below the second list item.

*   And here's the third list item.

预览效果如下:

  • This is the first list item.

  • Here’s the second list item.

    I need to add another paragraph below the second list item.

  • And here’s the third list item.

  1. 定义列表

一些Markdown处理器允许您创建术语及其对应定义的定义列表。要创建定义列表,请在第一行上键入术语。在下一行,键入一个冒号,后跟一个空格和定义

First Term
: This is the definition of the first term.

Second Term
: This is one definition of the second term.
: This is another definition of the second term.
  1. 任务列表

任务列表使您可以创建带有复选框的项目列表。在支持任务列表的Markdown应用程序中,复选框将显示在内容旁边。要创建任务列表,请在任务列表项之前添加破折号-和方括号[ ],并在[ ]前面加上空格。要选择一个复选框,请在方括号[x]之间添加 x

- [x] Write the press release
- [ ] Update the website
- [ ] Contact the media

2.5 代码块语法

要将单词或短语表示为代码,也就是显示成代码的格式,就是将词包裹在(`)中

Use the `printf()` function.

预览效果如下:

Use the printf() function.

  1. 转义反引号

如果你要表示为代码的单词或短语中包含一个或多个反引号,则可以通过将单词或短语包裹在双反引号(``)中。

``Use the `printf()` function.``

预览效果如下:

Use the `printf()` function.

  1. 围栏代码块

Markdown基本语法允许您通过将行缩进四个空格或一个制表符来创建代码块。但是现在很多处理器或者编辑器都可以使用(```)来作为围栏代码块,方便直接

```markdown
This is a code block.
```

这就是最简单的代码块

2.6 分隔线语法

要创建分隔线,请在单独一行上使用三个或多个星号 (***)、破折号 (—) 或下划线 (___) ,并且不能包含其他内容。

***
---
___

预览效果如下:




三个分隔线渲染效果看起来是一样的

2.7 链接语法

链接文本放在中括号内,链接地址放在后面的括号中,链接title可选。

超链接Markdown语法代码:[超链接显示名](超链接地址 "超链接title")

这是一个链接 [Markdown语法](https://markdown.com.cn)

渲染效果如下:这是一个链接 Markdown语法

给链接加Title

链接title是当鼠标悬停在链接上时会出现的文字,这个title是可选的,它放在圆括号中链接地址后面,跟链接地址之间以空格分隔。

这是一个链接 [Markdown语法](https://markdown.com.cn "最好的markdown教程")

网站和Email地址

使用尖括号可以很方便地把URL或者email地址变成可点击的链接

<https://markdown.com.cn>
<fake@example.com>

带格式化的链接

强调 链接, 在链接语法前后增加星号。 要将链接表示为代码,请在方括号中添加反引号

I love supporting the **[EFF](https://eff.org)**.
This is the *[Markdown Guide](https://www.markdownguide.org)*.
See the section on [`code`](#code).

引用类型链接

引用类型的链接的第一部分使用两组括号进行格式设置。第一组方括号包围应显示为链接的文本。第二组括号显示了一个标签,该标签用于指向您存储在文档其他位置的链接。

尽管不是必需的,可以在第一组和第二组括号之间包含一个空格。第二组括号中的标签不区分大小写,可以包含字母,数字,空格或标点符号

  1. 链接的第一部分格式 [hobbit-hole][1]
  2. 链接的第二部分格式
    • 放在括号中的标签,其后紧跟一个冒号和至少一个空格
    • 链接的URL,可以选择将其括在尖括号中
    • 链接的可选标题,可以将其括在双引号,单引号或括号中
I went to the [hobbit-hole][1].

[1]: https://en.wikipedia.org/wiki/Hobbit#Lifestyle "A hobbit-hole is the home of a hobbit"

2.8 图片语法

要添加图像,请使用感叹号 (!), 然后在方括号增加替代文本,图片链接放在圆括号里,括号里的链接后可以增加一个可选的图片标题文本。

插入图片Markdown语法代码:![图片alt](图片链接 "图片alt")

figure-alt 是鼠标放置在图片上时显示的图片信息文字,主要是用来图片未加载时提示图片信息内容

链接图片

给图片增加链接,请将图像的Markdown 括在方括号中,然后将链接添加在圆括号中

[![沙漠中的岩石图片](/assets/img/shiprock.jpg "Shiprock")](https://markdown.com.cn)

2.9 转义字符

要显示原本用于格式化 Markdown 文档的字符,请在字符前面添加反斜杠字符\

常见的需要转义的符号

\ 反斜杠
` 代码符号
* 星号
_ 下划线
{ } 花括号
[ ] 方括号
( ) 括号
# 标题符
+ - 列表符
. 点
! 图片符
| 表格符

Markdown会自动帮你转义普通文本,但如果看起来像HTML或语法,就按语法解析

2.10 内嵌HTML标签

对于 Markdown 涵盖范围之外的标签,都可以直接在文件里面用 HTML 本身。如需使用 HTML,不需要额外标注这是 HTML 或是 Markdown,只需 HTML 标签添加到 Markdown 文本中即可。

注记

出于安全原因,并非所有 Markdown 应用程序都支持在 Markdown 文档中添加 HTML。

对于 HTML 的块级元素 <div><table><pre><p>,请在其前后使用空行(blank lines)与其它内容进行分隔。尽量不要使用制表符(tabs)或空格(spaces)对 HTML 标签做缩进,否则将影响格式。

在 HTML 块级标签内不能使用 Markdown 语法。例如 <p>italic and **bold**</p> 将不起作用。

2.11 表格

要添加表,请使用三个或多个连字符(—)创建每列的标题,并使用管道(|)分隔每列。您可以选择在表的任一端添加管道

| Syntax      | Description |
| ----------- | ----------- |
| Header      | Title       |
| Paragraph   | Text        |

这是最基础的表格,后来可升级到对齐,百分比,表头,表格嵌套等高级表格