【Markdown】Markdown基本语法

本文将系统介绍Markdown的语法,从零开始。

本文是教程而非参考书,所以一些内容会讲得更细。

本文的教程都基于VS Code的语法支持,其他编辑器可能不支持本文提到的部分语法或支持本文没有提到的语法,请谅解!

请注意,由于Markdown的作者的反对标准化立场,每家的Markdown渲染和语法支持可能都不同。现在主流的一种标准是GitHub Flavored Markdown,简称GFM。其中有一些对标准Markdown的修改和添加。

2023/02/04更新:除了GFM,还有一些比较规范的Markdown标准比如Pandoc's Markdown

但不管是哪种标准,基本的写法是不会变的。

正文

在Markdown中,正文的编辑虽然看起来和Word或其他软件类似,但是仍然有区别。比如,一般的Markdown段落前没有空两格(都是定格写),并且也不是单纯靠换行分段。

在Markdown中,分段有三种方式:

  • 在段落末尾插入两个空格再换行:

    1
    2
    这是第一个自然段,末尾有两个空格可能不好显示。  
    这是第二个自然段。

  • 在段落末尾插入<br>

    1
    2
    3
    这是第一个自然段。<br>
    这是第二个自然段,这段可能长一点。<br>
    这是第三个自然段。<br>如果你喜欢,在这个`<br>`后不需要换行也可以分段。<br>比如这样。

  • 每个自然段后插入空行,也就是每个自然段都被空行包围:

    1
    2
    3
    4
    5
    6
    7
    这是第一个自然段。

    这是第二个自然段。

    这是第三个自然段。

    以下可能还有很多自然段但是我不想写了。
    我更喜欢这种空行分段的方式,把每一个自然段用空行分隔开,让整体的.md文件更易于阅读。

.md文件中的空行除了分开自然段以外对渲染结果没有影响。所以如果需要在结果中有空行也需要单独的技巧。

  • 其一就是利用刚刚提到的<br>。它就相当于在Word中的Enter键,可以起到结束当前段落(即使当前段落是空的)的作用:

    1
    2
    3
    4
    5
    6
    7
    8
    这是一个自然段,现在我希望下面有一些空白(空行),我可以这么写:
    <br>
    也可以这么写来得到更多的空行:
    <br><br>
    或者每一个`<br>`分开写:
    <br>
    <br>
    这样也可以有两行空行。

    时刻记住,<br>就像Word中的Enter键一样,需要换行分段找它肯定没问题。

  • 其二则是在需要空行的地方插入&nbsp;,注意是这六个字符都要(不要漏了最后的分号;):

    1
    2
    3
    4
    5
    6
    7
    8
    相较于`<br>``&nbsp;`不能多个写在同一行(多个写在同一行也只会空一行)。比如接下来的空行是正确的。
    &nbsp;
    这下就空行成功了。但是接下来也只会空一行。
    &nbsp;&nbsp;
    如果要空两行还请分开写。
    &nbsp;
    &nbsp;
    这样才是空两行。

标题

在标题文本的一行开头输入若干(1~6个)#号,在添加一个空格

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

由于本文的目录原因,不方便直接在本文中插入标题,还请各位自己尝试。也可以看看本文自带的一些标题看看效果。

加粗、斜体与下划线、删除线

这些常见的字体样式都有对应的写法。

加粗

将需要加粗的字段用**包裹:

1
这一段中某些字是**加粗**的。

加粗可以选择字段后通过快捷键Ctrl+B实现。

斜体

和加粗类似,不过是一个星号*

1
这一段中某些字是*倾斜*的。

加粗可以选择字段后通过快捷键Ctrl+I实现。

下划线

下划线稍微不同,需要在字段前加入<u>,在后面加入</u>

1
这一段中某些字是<u>划线</u>的。

删除线

和加粗倾斜类似,用两个波浪线~~包裹:

1
这一段中某些字是~~谢~~写错了的。

样式组合

这三种样式(粗体、斜体、下划线)可以自由组合,但是个人习惯将下划线的标记<u></u>放到最外面:

1
这一段中某些字**很粗还~~撮~~错啦**,有些字 ***又粗又斜***,有些字<u>*斜还划线*</u>,有些字则<u>***无比重要***</u>

有些时候可能会出现错误,比如上面的有些字 ***又粗又斜***,这里需要一个空格将特殊文本和普通文本分开。但是这种情况在不同的编辑器上不一定出现,还请自行判断。

分隔线

在文中单独一行添加---来设置分隔线:

1
2
3
4
5
这是一段,接下来我想要一个分隔线。

---

这是分隔线下面咯。

分隔线的上面一行一定要是空行。如果不是,则在某些编辑器/渲染器中会将它视为标题。

某些编辑器不支持在文章的第一行增加分隔线,因为这实际上不是分隔线而是Front Matter的语法,但由于本文是新手教程,所以不会牵扯相关内容,还请自行搜索。

链接

可以直接将网址插入文中,自动生成链接,但这要求网址必须以http://https://开头:

https://www.baidu.com

似乎这种格式在这个博客的页面不支持,但是在我本地的VS Code是可以的。

如果希望在文本出添加超链接,可以将文本用[]括起来,然后紧接着在后面添加()包裹的网址。

1
一些搜索引擎包括[百度](https://baidu.com)、[谷歌](https://google.com)等。

Markdown还支持添加鼠标放上超链接显示的文字,需要在网址后面添加空格然后添加用""包围的提示文本:

1
一些搜索引擎包括[百度](https://baidu.com "全球最大的中文搜索引擎")、[谷歌](https://google.com "全球最大的搜索引擎")等。

电脑端将鼠标放在超链接文字上即可看到悬浮提示。

Markdown中的所有特殊符号都必须是西文半角符号,形如!?.,{[()]}"''"这种。而中文全角符号,形如!?。,【()】“‘’”的则无法支持,会被视作正文而非特殊标记。

引用式链接

你可能注意到,按照一般的链接格式书写的源文件会丢失一些可读性,因为太长的网址会阻碍阅读。所以Markdown还支持将网址统一在一个地方写出而非无序地插入在文段中。

比如下面的写法:

1
程序员经常访问的网站除了[百度](https://www.baidu.com)、[谷歌](https://www.google.com)等搜索引擎以外,还有[GitHub](https://github.com "全球最大的开源代码托管网站")等代码托管网站。

就可以写成:

1
2
3
4
5
6
程序员经常访问的网站除了[百度][baidu]、[谷歌][google]等搜索引擎以外,还有[GitHub][github]等代码托管网站。

[baidu]: https://www.baidu.com
[google]: https://www.google.com
[github]: https://www.github.com "全球最大的开源代码托管网站"

注意到原本行内应该写链接的位置被另一个方括号[]代替,其中写的是一个索引,而对应的网址则单独列出。在渲染时,渲染器会查找每一个索引对应的网址并正确渲染。

同一个索引可以在全文中多次引用,并且链接可以插入在文章的任何地方(一般喜欢写在文末)

使用引用式链接无疑增强了文章的可读性。在某些渲染器的加持下,我们还能更进一步——尝试省略第二个(索引)的方括号:

1
2
3
4
5
程序员经常访问的网站除了[百度]、[谷歌]等搜索引擎以外,还有[GitHub]等代码托管网站。

[百度]: https://www.baidu.com
[谷歌]: https://www.google.com
[GitHub]: https://www.github.com "全球最大的开源代码托管网站"

某一些渲染器支持这种语法(比如在VS Code中)。

代码块和行内代码

下面我将介绍如何在Markdown文件中漂亮地插入代码。

代码块

程序员在浏览文档的时候可能常见这种精美的代码块(很适合抄代码):

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}

在Markdown中如果要创建这种代码块,只需要用反引号“`”,在英文状态下按 Tab 上面 1左边那个键,也就是中文的中黑点“·”那个键。

连用三个反引号将代码块包裹,注意反引号单独一行:

1
2
3
```
a + b
```

如果要指定代码的语言让代码有语法高亮,则在开始的反引号后面注明语言。比如c cpp java markdown python html 等等:

1
2
3
```python
print("Hello Markdown Code Block!")
```

如果代码块中是Markdown代码,且其中还有代码块(嵌套),则最内层的代码块用三个反引号,往外每层多一个反引号。比如以下是上面代码块教程的源文件的一部分:

1
2
3
4
5
6
7
连用三个反引号将代码块包裹,注意反引号单独一行:

````markdown
```
a + b
```
````

行内代码

如果想在一行中添加等宽字体书写的部分,可以使用行内代码。行内代码不支持高亮,但是很适合用来:

  • 引用代码中的某一部分,比如func()
  • 模拟按键的效果,比如Ctrl+CShift
  • 用来强调这是原文而非我自己写的部分,用于分隔,比如:_config.yml

行内代码很简单,只需要像倾斜一样,将需要的字段用反引号“`”包围:

1
2
3
任务管理器的快捷键是`Ctrl+Tab+Esc`

代码中的`getDate()`函数会获取当天的日期。

列表

Markdown支持的列表包括无序列表有序列表,也支持多级列表。

无序列表

在项目所在的行的开头添加-*后添加空格

1
2
3
4
5
6
7
8
9
今天要做的事:
- 购物车下单
- 买菜
- 遛狗

明天要做的事:
* 等快递
* 自己做饭
* 遛狗

渲染效果


今天要做的事:

  • 购物车下单

  • 买菜

  • 遛狗

明天要做的事:

  • 等快递

  • 自己做饭

  • 遛狗

有序列表

在项目所在行的开头添加数字、英文句号.和空格

1
2
3
4
把大象放进冰箱的步骤:
1. 打开冰箱
2. 把大象放进去
3. 关上冰箱

渲染效果


把大象放进冰箱的步骤:

  1. 打开冰箱

  2. 把大象放进去

  3. 关上冰箱

多级列表

通过添加缩进,可以创建多级列表。多级列表也可以有序和无序的嵌套:

1
2
3
4
5
6
7
8
9
10
11
12
13
把大象放进冰箱的步骤:
1. 打开冰箱
- 往外拉门
- 小心冰箱门上的东西
2. 把大象放进去
- 小心冰箱很冷
- 保鲜层:4℃
- 冷藏层:0℃
- 冷冻层:-24℃
- 小心冻伤大象
3. 关上冰箱门
1. 推门
2. 小心夹手

渲染效果


把大象放进冰箱的步骤:

  1. 打开冰箱

    • 往外拉门

    • 小心冰箱门上的东西

  2. 把大象放进去

    • 小心冰箱很冷

      • 保鲜层:4℃

      • 冷藏层:0℃

      • 冷冻层:-24℃

    • 小心冻伤大象

  3. 关上冰箱门

    1. 推门

    2. 小心夹手

引用

谁会不喜欢一个漂亮而高级的引用块呢?

在需要标记为引文的段落的开头添加一个右尖括号(大于号)>。注意,在这里,空行也要标记,否则会分开引用块:

1
2
3
4
5
6
7
8
9
10
在「人是否要吃饭」这个问题上,已经有人做出了系统论述:

>人是动物,不能进行光合作用,所以要通过从外界摄取能量来为维持自身生长发育。
>
>有句俗话说的是“人是铁,饭是钢,一顿不吃饿的慌”,但是吃饭却不仅仅是为了填饱我们的肚子,食物还会供给我们身体所需要的各种能量,人的活动离不一这些能量,这就好比是汽车如果没有了汽油就跑不起来了的道理一样,人如果没有了食物也就不存在任何生命活动了,从小到大人的身体及各个组织都在生长发育,而县城也在不断的更新,这就需要许多来自于食物当中的营养物质来满足人的各个组织的发育及更新。
>
>所以说人吃饭为了填饱肚子只是表面的一种现象,吃饭其实就是为了维持人体的正常活动,维持人的生命及健康。
>
>科学上来说就是身体无时无刻都在消耗能量维持身体的生命活力,身体的消化器官——胃和肠道,没有足够的食物转换能量,则身体会发出能量缺乏的信号,吃饭的目的则是补充能量以供日常消耗所需。干体力活的人吃得比常人多也是这个原因。

在引用块中,理论上上面的绝大多数语法都能正常使用,但是这还是取决于渲染器的支持程度。

写在后面

以上就是Markdown的常见语法了,非常感谢你能看到这里!其他的语法对特定渲染器的依赖程度更大我就不想讲了,有需要可以自行搜索。


【Markdown】Markdown基本语法
https://garythenoob.github.io/06markdown_grammar_book/
作者
GarytheNoob
发布于
2023年1月27日
更新于
2023年8月2日
许可协议