【Markdown 从入门到精通】

语法规则是 Markdown 的核心,本节我们就来学习一下 Markdown 的基础语法,记不住不要紧,小伙伴们可以在用到的时候及时查阅,反复练习即可。用不了几天,你一定会掌握的!

在前面《三分钟成为 Markdown 专家》提到,目前有许多 Markdown-like language,还有一个提供无歧义语法规范的 CommonMark 项目。这就导致了各种存在差异的 Markdown 的语法,对初学者来说造成疑惑,比如在一个 Markdown 编辑器这么写没问题,换一个编辑器就不行了。

所以在学习 Markdown 语法之前,我们需要知道 Markdown 语法其实分为基础语法和扩展语法。基础语法基本上与 CommonMark Spec 一致(毕竟 CommonMark 还没成为真正的标准,只能说是参考标准,不过对于用户来说并没有什么影响,更多的影响在于对 Markdown 解释器的实现)。扩展语法则由不同的软件工具支持,包括 CommonMark 标准没有规定的上标、下标、高亮、删除线、任务列表、表格、块图等等,因此不同的 Markdown 编辑器可能会不一样。比较流行的扩展语法是 GFM(GitHub Flavored Markdown),即 Github 风格的 Markdown。

下面我们来看看 Markdown 的基础语法都有哪些?

# 段落与换行

Markdown 语法中的段落由一行或多行文本组成,不同的段落之间使用空行来标记。(空行是 CommonMark Spec 规定的,但有些编辑器可能没有遵守,建议习惯性在段落间增加空行。)

语法说明:

  • 如果行与行之间没有空行,则会被视为同一段落;
  • 如果行与行之间有空行,则会被视为不同段落;
  • 空行是指行内什么都没有,或者只有空格和制表符;

# 标题

Markdown 提供了两种标题风格:ATX headings 和 Setext headings。

# ATX 风格标题

Markdown 语法中使用 # 号标记标题。支持六级标题:

# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

语法说明:

  • 在行首插入 # 号即可将该行标记为标题;
  • # 号的个数表示了标题的等级;
  • 为提高兼容性,建议在 # 号后面加一个空格。

# Setext 风格标题

另外,还可以在标题下方添加 =- 表示一级和二级标题。

一级标题
========
二级标题
--------

语法说明:

  • Setext 风格只支持 2 级标题;
  • 底线的数量不限,但是为了避免歧义,建议使用连续三个符号;
  • ===--- 要紧跟在标题文字下方,不能有空行。

# 列表

Markdown 语法支持有序列表和无序列表。

  • 有序列表由 “数字 + 英文句号 + 空格 + 列表内容” 标记
  • 无序列表由 “星号 / 加号 / 减号 + 空格 + 列表内容” 标记

# 有序列表

1. 首先是...
2. 然后是...
3. 最后是...

语法说明:

  • 数字后面紧跟英文句号,然后必须添加一个空格;
  • 列表项之间可以不加空行。

# 无序列表

无序列表支持使用星号 * 、加号 + 、减号 - 三种风格进行标记。

* 刘备
* 关羽
* 张飞
+ 刘备
+ 关羽
+ 张飞
- 刘备
- 关羽
- 张飞

语法说明:

  • 上面三种标记的结果是一样的,但是同一个列表需要使用同一种标记;
  • *+- 后面必须添加一个空格。

# 列表嵌套

列表支持嵌套,且有序列表和无序列表可以相互嵌套。

+ 第一层列表
	+ 第二层列表
		+ 第三层列表
	+ 第二层列表2
		1. A
		2. B

语法说明:

  • 层与层之间使用 TAB 键缩进来标记;
  • 列表之间不需要添加空行;
  • Markdown 标准没有对嵌套级数进行限定,但不宜过多(不美观)。

# 引用

单行引用

> 一分耕耘一分收获

多行引用

> 一分耕耘一分收获
> 是啊

语法说明:

  • 段落前加小于号 > 表示引用;
  • > 后面的空格不是必须的(个人感觉加上更美观);
  • 多行引用在每一行开头添加 > 即可;
  • 引用也可以嵌套;
  • 引用里面可以添加标题、列表等内容。

# 分隔线

分割线也有三种风格,分别是星号 * 、减号 - 和下划线 _

***
---
___

语法说明:

  • 需要使用至少三个以上的同样的标记符;
  • 行内不能有其他字符;
  • 可以在标记符中间加上空格(为了避免歧义,不建议)
  • 建议在分隔线上下插入空行(如果 --- 上面有文字,会解析为标题)。

# 粗体和斜体

粗体使用两个星号 ** 或两个下划线 __ 包裹。

**Hello**
__World__

斜体则使用一个星号 * 或一个下划线 _ 包裹。

*Hello*
_World_

# 代码

Markdown 支持两种代码标记语法:行内代码和代码块。

# 行内代码

在行内引用一段代码,只需要使用反引号(TAB 键上面那个)进行包裹。

`print("hello, world!")`

# 代码块

代码块使用三个反引号进行包裹,并且可以在第一行反引号后面添加编程语言名称,帮助 Markdown 解释器进行解析。

```python 代码
print("hello, world!")
return
```

# 图片

![图片替代文字](图片地址)

语法说明:

  • “图片替代文字” 中的内容是可选的,在图片无法正常加载时会显示该内容;
  • “图片地址” 可以是本地图片,也可以是网络图片(URL);
  • 本地图片支持相对地址和绝对地址(为了便于打包和分享,建议使用相对地址)。

示例:

![本地图片](images/20201124032511.png)
![网络图片](https://img-home.csdnimg.cn/images/20201124032511.png)

# 链接

Markdown 支持多种链接语法,包括行内式链接、参考链接、自动链接。

# 行内式链接

行内式链接是在行内需要进行链接标记的文字后面直接添加链接地址,使用方括号 [] 包裹链接文字,圆括号 () 包裹链接地址。格式如下:

[链接文字](链接地址 "Title")

语法说明:

  • 方括号和圆括号之间不能有空格;
  • Title 在链接地址后使用单引号或双引号括起来,是鼠标停留在链接时显示的文字,可以省略。

示例:

[百度一下](https://www.baidu.com/ "点点看")

# 参考式链接

与行内式链接不同,参考式链接将链接文字和链接地址分开,通过一个链接标记来匹配。语法格式如下:

[链接文字][链接标记]
[链接标记]: 链接地址 "Title"

语法说明:

  • 链接标记可以是字母、数字、标点符号的组合;
  • 链接标记不区分大小写;
  • 链接内容(链接地址那行)可以放在当前文件的任意位置(通常放在末尾);
  • Title 在链接地址后使用单引号或双引号括起来。

示例:

[Markdown][1] 是一门轻量级标记语言。
[1]: https://zh.wikipedia.org/wiki/Markdown

# 自动链接

如果想直接显示 URL 链接地址或邮箱地址,使用尖括号 <> 包裹起来就会自动转换为超链接。

我的网站 <https://luhuadong.com>
我的邮箱 <luhuadong@163.com>

# 转义

由于 Markdown 使用了一些符号作为标记,这时候如果想在文章中显示该字符,就需要使用反斜杠 \ 进行转义了。

比如:

显示星号 \*
显示减号 \-
显示尖括号 \< \>
显示反斜杠 \\

好啦,Markdown 的基础语法大概就是这些,是不是很简单?

把上述示例复制到你的 Markdown 编辑器中看看效果吧,下一节我们将介绍一些常见的 Markdown 的扩展语法。