Markdown 是一种轻量级的「标记语言」,他的目标是实现「易读易写」。它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果。

句段

一个 Markdown 段落是由一个或者多个连续的文本行组成,他的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行。比方说,若某一行只包含空格和制表符,则该行也会被视为空行)。普通句段之间若要强制换行(Manual Line Break),可以在自然换行行尾追加两个(或以上)空格来实现。

标题

在 Markdown 中,标题有两种形式,类 Setext 和类 atx 形式。

1)类 Setext 的形式是利用底线的形式,利用=表示最高级标题,-表示第二级标题。

1
2
3
4
这是一级标题
==========
这是二级标题
----------

2)类 atx 形式,若一段文字被定义为标题,只需要在前面添加#即可。需要注意#后面需要添加一个空格。atx 形式标题一共有六种,分别是:

1
2
3
4
5
6
# 这是一级标题
## 这是二级标题
### 这是三级标题
#### 这是四级标题
##### 这是五级标题
###### 这是六级标题

区块引用

在我们写作中会经常引用别人的文字,这时候引用就显得十分重要,Markdown 的引用非常简单,只需要在文字前面加上>即可。例如:

1
2
3
> 这是引用
> 这是引用
> 这是引用

效果如下:

这是引用
这是引用
这是引用

也可以偷懒,只在段落的开始添加一个>即可。例如:

1
2
3
> 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用
>  
> 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用

效果如下:

这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用

这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用 这是引用

引用也支持嵌套引用,只要根据层次前面加上相应的>即可。例如:

1
2
3
4
5
>>> 嵌套引用
>
>> 嵌套引用
>
> 嵌套引用  

效果如下:

嵌套引用

嵌套引用

嵌套引用

引用的区块内可以包含其他的 Markdown 元素。例如:

1
2
3
4
> 1. 第一个列表
> 2. 第二个列表
>
> ## header

显示效果如下:

  1. 第一个列表
  2. 第二个列表

列表

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

无序列表

无序列表使用*,-,+作为列表标记。

1
2
3
* 列表
* 列表
* 列表

等同于:

1
2
3
- 列表
- 列表
- 列表

等同于:

1
2
3
+ 列表
+ 列表
+ 列表

显示效果都是:

  • 列表
  • 列表
  • 列表

有序列表

有序列表使用数字加一个英文句点。例如:

1
2
3
1. 有序列表
2. 有序列表
3. 有序列表

在有序列表中很重要的一点是列表标记中使用的数字并不影响最后的输出结果(但是建议从1开始)。例如:

1
2
3
1. 有序列表
1. 有序列表
1. 有序列表

或者:

1
2
3
3. 有序列表
2. 有序列表
1. 有序列表

输出结果都是:

  1. 有序列表
  2. 有序列表
  3. 有序列表

列表小技巧

1)列表项目标记通常是放在最左边,但是其实也可以缩进,最多 3 个空格,项目标记后面则一定要接着至少一个空格或制表符。

要让列表看起来更漂亮,你可以把内容用固定的缩进整理好:

1
2
3
4
5
6
7
*   轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。
    那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。
    软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!
*   那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。
    寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。
    但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!
    悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。

也可以偷懒写成:

1
2
3
4
5
6
7
*   轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。   
那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。   
软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!  
*   那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。  
寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。   
但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!   
悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。  

显示效果都是:

  • 轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。
    那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。
    软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!
  • 那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。
    寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。
    但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!
    悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。

2)列表项目可以包含多个段落,每个项目下的段落都必须缩进 4 个空格或是 1 个制表符。例如:

1
2
3
4
5
6
7
8
-   轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。
    那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。
    软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!

    那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。
    寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。
    但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!
-   悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。

也可以比较懒惰,写成:

1
2
3
4
5
6
7
8
-   轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。
那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。
软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!

    那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。
寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。
但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!
-   悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。

显示效果都是:

  • 轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。 那河畔的金柳, 是夕阳中的新娘; 波光里的艳影, 在我的心头荡漾。 软泥上的青荇, 油油的在水底招摇; 在康河的柔波里, 我甘心做一条水草!

    那榆荫下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻间, 沉淀着彩虹似的梦。 寻梦?撑一支长篙, 向青草更青处漫溯; 满载一船星辉, 在星辉斑斓里放歌。 但我不能放歌, 悄悄是别离的笙箫; 夏虫也为我沉默, 沉默是今晚的康桥!

  • 悄悄的我走了, 正如我悄悄的来; 我挥一挥衣袖, 不带走一片云彩。

3)项目代码中也可能出现异常,例如下面这种情况:

1
1.    What a great season.

显示效果却是:

  1. What a great season.

这与我们想要的结果不同,也就是在行首出现数字-句点-空白,要避免这样的状况,可以在句点前面加上反斜杠来解决。

1
1973\. What a great season.

1973. What a great season.

代码区块

插入代码对程序员来说是一个必不可少的功能,插入代码的方式有两种,一种通过缩进的形式添加代码块,另一种是通过 “`” 包裹代码。

行内代码

行内代码可以 `code`(封闭的反引号)实现,例如:

1
c 语言中的`printf()`函数

显示效果:

c 语言中的printf()函数

代码块

  • 在句段的行首插入 1 个 tab 或 4 个空格,则表示代码块。
  • 在句段行首和行末用三个反引号换行闭包(若支持语法高亮可在行首三个反引号后添加 YAML 语言标识)。
  • 如果要在代码区段内插入反引号,你可以用多个反引号来开启和结束代码区段。

例如:

1
2
3
    print(‘Hello world!’);
    print(‘Hello world!’);
    print(‘Hello world!’);

或者

1
2
3
4
5
```c
print(Hello world!);
print(Hello world!);
print(Hello world!);
```

显示效果:

1
2
3
print("Hello world!");
print("Hello world!");
print("Hello world!");

注意

在代码区段内,& 和尖括号都会被自动地转成 HTML 实体,这使得插入 HTML 原始码变得很容易。例如:

1
Please don't use any `<blink>` tags.

显示效果如下:

Please don’t use any <blink> tags.

分隔线

可以使用三个以上的星号*,减号-或者底线_来建立一个分隔线,行内不能有其他东西,也可以在星号或者减号中加插入空格,下面的方法都可以创建分割线:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
* * *
***
*****************
- - -

---

-----------------
_ _ _
___
________________
  • 采用减号-分割时,最好空格隔开或上面空一行,不然三个以上连续的减号会误将上一行文字升级为二级标题!

符号

转义符号

转义符号:使用反斜杠(\)转义输入 Markdown 标记符号的愿意字符,例如*,-,>等。Markdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
\   反斜线
`   反引号
*   星号
_   底线
{}  花括号
[]  方括号
()  括弧
#   井字号
+   加号
-   减号
.   英文句点
!   惊叹号

字符实体

字符实体:普通段落一般都是顶格开始,无法使用空格或 tab 来缩进,如果硬要输入空格显示占位缩进效果,可以嵌入空格对应的 HTML Entity 实体码。HTML 转义字符串(Escape Sequence),即字符实体(Character Entity)。字符实体由三部分构成:

  • 1、第一部分是一个&(ampersand)符号;
  • 2、第二部分是实体(Entity)名字,或者是#加上实体编号(Entity Code);
  • 3、第三部分是一个分号;(semicolon)。

例如:

普通自然行行首敲 2 个空格无占位缩进效果。
    该行行首添加了 4 个不断行的空白格:no-break space(&nbsp;&#160;
    该行行首添加了 4 个半方大的空白:en space(&ensp;&#8194;
    该行行首添加了 4 个全方大的空白:em space(&emsp;&#8195;

文本格式

文本格式包括强调、加粗、突出、下划线、删除线、脚标等增强修饰和丰富表现。

强调(斜体)

强调(斜体):星号(*)或下划线(_)包围的文字将会显示斜体,例如:

1
2
Some of these words *are emphasized*.    
Some of these words _are emphasized_.   

显示效果为:

Some of these words are emphasized.
Some of these words are emphasized.

加粗

加粗:两个星号(**)或者两个下划线(__)包围的需要特别强调的文字将会加粗显示,例如:

1
2
Use two asterisks for **strong emphasis**.  
Use two asterisks for __strong emphasis__.  

显示效果为:

Use two asterisks for strong emphasis.
Use two asterisks for strong emphasis.

如果你的 * 和 _ 两边都有空白的话,它们就只会被当成普通的符号。

链接

自动链接

自动链接:Markdown 支持以比较简短的自动链接形式来处理网址和电子邮件信箱,只要是用尖括号包起来,Markdown 就会自动把它转成链接。一般网址的链接文字就和链接地址一样。对于 HTTP(s) 协议开头的超链接地址,甚至无需添加尖括号明示,也会生成自动链接。例如:

1
2
<http://example.com/>  
http://example.com/  

http://example.com/
http://example.com/

文字

Markdown支持两种形式的超文本链接语法格式:行内式和参考式两种形式。不管是哪一种,链接文字都是用方括号[]来标记。

行内式

行内式: 只要在方块括号后面紧接着圆括号并插入链接网址即可在一行内构建链接,其语法格式为 [text](url)。如果你还想要加上链接的 title(鼠标放在上边会显示标题),只要在网址后面用双引号把 title 文字包起来即可。例如:

1
2
3
[Google](www.google.com)

[Google](www.google.com "Google")

显示结果为:

Google

Google

参考式

参考式: 参考式的链接是在链接文字的括号后面再接上另一个方括号,在第二个方括号里面填入用以辨识链接的标记 id,然后在其他地方给出该标记 id 真正的链接地址。

  • 先定义参考 refid:[text][refid]
  • 再定义 refid 所指:[refid]:URL

例如:

1
2
[Google][1]  
[1]: www.google.com "Google(Optional)"

显示效果为:

[Google][1]
[1]: www.google.com “Google(Optional)”

注意:

  • 参考式的链接可以选择性地在两个方括号中间加上一个空格,如 [text] [refid]
  • 链接辨别标签可以有字母、数字、空白和标点符号,但是并不区分大小写 [text][a] 等同于 [text][A]
  • 隐式链接标记功能让你可以省略指定链接标记,这种情形下,链接标记会视为等同于链接文字,要用隐式链接标记只要在链接文字后面加上一个空的方括号,例如 [Google][]

图片

Markdown 使用一种和链接很相似的语法来标记图片,同样也允许两种样式: 行内式和参考式。
不同的是,需要在链接文字方括号之前添加一个感叹号!,其语法格式为 ![alt_text](url),HTML 等效源码为 <img src="url" alt="text" />,其中 alt_text 可以置空。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
行内式:

![Alt text](/path/to/img.jpg)

![Alt text](/path/to/img.jpg "Optional title")

参考式:

![Alt text][id]  
[id]: url/to/image  "Optional title attribute"

在 Markdown 图片标记![]()外面再嵌套一层[]()即可建立图片超链接,点击图片即可跳转到链接地址,大概为[![](img_url)](ref_url)

锚点

网页中,锚点其实就是页内超链接,也就是链接本文档内部的某些元素,实现当前页面中的跳转。比如我这里写下一个锚点,点击回到目录,就能跳转到目录。 在目录中点击这一节,就能跳过来。还有下一节的注脚。这些根本上都是用锚点来实现的。

显示效果为: 跳转到标题

目录

关于目录生成,只要文章是按照 Markdown 语法写作的,在需要生成目录的地方写[TOC]即可生成目录,但并非所有的 Markdown 解析器都支持该功能。

表格

表格语法说明:

  • |-:之间的多余空格会被忽略,不影响布局。
  • 默认标题栏居中对齐,内容居左对齐。
  • -:表示内容和标题栏居右对齐,:-表示内容和标题栏居左对齐,:-:表示内容和标题栏居中对齐。
  • 内容和|之间的多余空格会被忽略,每行第一个|和最后一个|可以省略,-的数量至少有一个。
1
2
3
4
| 一个普通标题 | 一个普通标题 | 一个普通标题 |
| ------| ------ | ------ |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |
一个普通标题 一个普通标题 一个普通标题
短文本 中等文本 稍微长一点的文本
稍微长一点的文本 短文本 中等文本
1
2
3
4
| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |
左对齐标题 右对齐标题 居中对齐标题
短文本 中等文本 稍微长一点的文本
稍微长一点的文本 短文本 中等文本

参考文章: