作为一名学习数媒专业的学生,对我来说排版并不算什么难事,但有时我也不想在排版美化上花太多时间,并且也有很多不是设计类专业的人也需要一个无需过多设计就能达到不错视觉效果,或者说可读性的文档。现在的一个通用解决方式便是Markdown,这个轻量标记语言确实挺好用,包括这篇博客也是拿它进行攥写的。

接下来就正式进入内容。

Markdown基本语法

Markdown的语法整体是比较简单的,如果不算上LaTex这些高级语法的话,学习md(Markdown的缩写)应该花不了多少时间。所以这里就先介绍一些简单的语法吧。

针对本博客内语法的展示,除了使用博客本身的渲染效果外,通过截图展示的渲染效果均使用Typora的Github主题。各位在学习或者编写Markdown时也可以用自己喜欢的Markdown编辑器。

文件类型

在正式开始语法介绍前,我们得清楚Markdown(之后简称md)的文件类型。md作为一名轻量标记语言,它的文件格式为.md,这个文件本质上就是一个文本文件,因此如果愿意,直接拿.txt编写md也是完全没问题的。

md的效果渲染主要依靠市面上的各种md编辑器、渲染器完成,因此md在不同渲染器的渲染效果可能会有所不同。

段落

md里边最简单的语法实际上是段落,它的写法如下:

所以,这就是段落。

Ok,这是另一个段落

在这篇博客内看到的所有正文(包括这一段),都是使用的相同语法,所以这里我就不放图片展示了。

标题

一篇文章,一篇博客总是少不了标题的,而在md中,标题的语法非常简单,我们先来看一级标题:

# 一级标题

那么二级标题、三级标题甚至往后呢?

## 二级标题

### 三级标题

...

###### 六级标题

####### 七级标题(并不支持)

标题

#的数量能够决定标题的级数,md支持编写者定义1~6级标题,标题从1级到6级的字体大小逐级递减。一般来说,我们只会用到其中的1~4级标题,但是由于博客的特殊性,一级标题在博客攥写时一般也不使用,因此在博客下常用的就是2~4级标题了(这只是个人拙见)。

图片和链接

图片和链接二者虽然并不相同,但在md中,它们的语法却颇为相似,我们先来看看二者的语法:

[这是一个链接](https://www.bilibili.com)
![这是一张图像](D:\桌面文件\物理超度.jpg)

图片和链接

可以发现,二者语法只是相差了一个半角叹号!,但是实现的效果却截然不同。当然,这里图片的路径我使用的绝对路径,实际上我们也可以使用相对路径和链接来引用图片。现在,我们假设在桌面的test文件夹下有如下内容:

/text
- test.md
- /img
test.png

我们要做的,就是将img下的图像用相对路径和绝对路径两种方式进行引用,然后在网络上随便找个图像链接,作为我们的第三个示例:

![相对路径](./img/test.png)
![绝对路径](C:\Users\ziran6959\Desktop\test\img\test.png)
![网络链接](https://www.bilibili.com/favicon.ico)

图片的引用方式

可以发现,我们先是分别用相对路径和绝对路径引用了同一张图片,然后我们再在网络上找到了B站的Icon链接并进行了引用。在二者语法中[]内都是填写一个任意文本,图片引用语法中,[]内的文本会在图片丢失时显示,而链接语法中的[]
则是链接的文本。()内的内容都是其引用(指向)的地址,这里的地址都能使用上述提到的三种地址

此外,二者还可以指定鼠标悬停到其上后的标题文本,就像这样:

[试试悬停?]("" "悬停试试!")
![试试悬停]("" "悬停试试!")

来看看效果(将鼠标放在其上试试,这里顺带展示了图片丢失时图片语法的情况):
试试悬停?
试试悬停

总结起来,它们的语法模板就是这样的:

[Text](Link "Title")
![Text](Link "Title")

其中:

  • Text:链接的文本,图片的Alt文本
  • Link:链接或图片的地址(可以是本地绝对路径、相对路径,以及网络链接)
  • Title:鼠标悬停时显示的标题文本

不过各位也许有发现,图片的语法并不支持指定图片的尺寸,这可是个头疼的问题,毕竟有时我们可是会引用一些尺寸稍大的文件的。幸运的是,md实际上也能支持一些HTML标签,<img/>就在其支持的范围之内:

<img src="path" width="[num][dw]" height="[num][dw]" alt="text" title="text" />

在md中使用<img/>就像在HTML中使用它的方式一样,不过正常情况下并不推荐在md中使用HTML标签就是了。

强调

有时,我们需要让阅读者注意到特定的关键词,或者往正文文本中插入单句代码。md贴心的为我们提供了如下的语法:

*斜体*
**粗体**
***粗斜体***(一些md渲染器并不能很好的同时显示粗斜体,也可能是使用的字体的问题)
~~删除线~~
`单句代码`
==底部着色==(一些md渲染器并不支持此语法)

强调

当然,就像展示的那样,一些md并不能很好的支持==cont==底部着色,还有***cont***粗斜体,因此实际使用这些语法时得了解所使用的md渲染器到底支不支持它们。

引用

引用一些文献、他人的博客选段总是在所难免的,如果需要让读者清楚某段文本是引用文本,那该怎么办呢?

> 引用文本

渲染效果如下(不同的md渲染器可能会有所不同,这里我就偷懒用博客自己的渲染方案了):

引用文本

看着是不是特别醒目?还没完,这个语法可以支持多个段落,甚至还能嵌套:

> 引用文本1
> 引用文本2
> 引用文本3

> 引用文本1
> > 引用文本2

引用文本1
引用文本2
引用文本3

引用文本1

引用文本2

当然,引用块多了似乎也不是太好,影响观感不说,要是被认为通篇都是引用,那还不如转载算了对吧。

列表

列表可是个好东西,能够将散乱的信息进行整合。信息整合总归得区分其是否需要关心顺序逻辑,因此md提供了两种列表的语法:

- 无序列表1
- 无序列表2

1. 有序列表1
2. 有序列表2
  • 无序列表1
  • 无序列表2
  1. 有序列表1
  2. 有序列表2

无序列表除了可以使用-开头,用*+也是没问题的。有序列表以连续的有序列表定义中的第一个的数字开始,例如下面的有序列表中,第一个的序号为2,第二个同样是2:

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

可以发现,至少在这篇博客中,序号是从2开始依次增加的,即便我为二者给定的序号都是相同的。不过在实际攥写时,并不推荐如此攥写,渲染器虽然能够帮我们解决问题,但是自己改的时候恐怕会一头雾水。由于md可以使用普通的文本编辑器查看编辑,因此像上面的有序列表写法也会给这类读者造成困扰。

此外,无序列表、有序列表和引用一样,都能支持嵌套:

+ 一级
+ 二级
+ 三级

1. 一级
1. 二级
  • 一级
    • 二级
      • 三级
  1. 一级
    1. 二级

无序列表在嵌套时,渲染器会为其使用不同的项目符号,并且进行缩进,我这里使用的两个空格缩进(有序列表用的四个空格)。请注意,嵌套时同一级别必须使用相同的缩进量,不然渲染器很可能将不同缩进量的列表当作不同的级别。

代码块

刚刚其实我们已经使用了单句代码的语法,也就是使用一对´进行包裹,不过难免我们会在这个语法当中使用这个符号本身,就像现在这样。我这里的解决方法是使用的<code></code>标签包裹反引号的HTML字符代码&acute;,保证博客不对这段文本进行错误渲染。当然,如果其中有包括正常文本,其实也有更简单的方法:

``正常显示反引号`code`其实很简单`。``

正常显示反引号`code`其实很简单`。

单句代码的语法可以使用两个反引号包裹,实现在内部正常显示反引号字符。当然,处于末尾的反引号字符同样有可能会被错误渲染,因此我在其后又加了一个句号,这才保证其正常显示。

那么……代码块又该怎么写呢?

import this
print("Hello, world!")
import this
print("Hello, world!")

将段落缩进四个空格就能将一块段落渲染为代码块,不过这种缩进并不是那么让人喜欢,毕竟它在文本编辑时会影响阅读体验,因此我们实际上更常用的是不缩进的代码块语法:

-```Python
import this
print("Hello, world!")
```-
(这里为了渲染器不错误渲染这个代码块,特意在前后加了-)
import this
print("Hello, world!")

使用成对的三个反引号包裹文本,便能将其间的文本声明为代码块。而在首行的三个反引号后,还可以指定代码块的编程语言(例如我在这里使用的Python)。md渲染器会根据代码块的语言类型,来针对不同的编程语言进行着色(着色效果因渲染器而异)。

技术类博客会大量使用这种代码块语法(例如这个博客),因此这个语法还是挺重要的对吧?

分割线与转义字符

在一些情况下,我们可能会面临不使用标题但又需要明显分割文段的尴尬情况,在HTML里面,<hr />来声明一根分割线,这在md中也有对应的语法:

---
***
___



连续使用三个以上的-*_便能声明一根分割线,上面的三个分割线就是这么来的。当然,如果各位愿意,用<hr />也是没问题的,虽然我并不推荐使用它。

与此同时,从刚刚开始各位应该可以发现一件事,就是我在担心博客的渲染问题,这实际上就是在使用特殊符号时的一种担心。md中可以使用反斜线\来对特殊字符进行转义:

字符 解释
\ 反斜线
` 反引号
* 星号
_ 下划线
{} 花括号
[] 方括号
() 圆括号
# 井号
+ 加号
- 减号
.
! 感叹号(半角)
| 竖线

除了转义,我们还会遇到使用特殊符号的情况,这时我们可以使用HTML字符代码来表示特定字符。这里就不用列表来详细罗列了,感兴趣的各位可以在互联网上搜索。

Markdown拓展语法

现在,我们就可以来学习一下高阶的东西了,当然实际上刚刚也说了一些高级语法,当然,我觉得无伤大雅。我们主要介绍这些:

  • 表格
  • 脚注
  • 任务列表
  • 定义列表

这四个也算是比较常用的了。

表格

在上面,我们就已经见识过md的表格了,现在我们来定义一个新的表格试试水:

| HEAD1 | HEAD2 | HEAD3 |
| --- | --- | --- |
| CONT1 | `CONT2` | **CONT3** |
| *CONT1* | CONT2 | CONT3 |
HEAD1 HEAD2 HEAD3
CONT1 CONT2 CONT3
CONT1 CONT2 CONT3

表格语法的第一行是定义表格的表头,表头一般情况下会被md渲染器进行字体加粗、背景色加重的着重渲染,并且表头内的文本是居中的。而在第二行,看起来就像是在分割表头和表格的内容,而在第三行以及之后,我们又开始使用第一行的写法了,但是渲染出的样式却与表头完全不同。

还有一个细节,那就是实际上我们在表格中使用了简单的md的其他语法,这里使用的强调语法,而实际上,表格里面也只能使用强调语法。

不过,我们有时也需要处理表格内单元格对齐的问题,这个在md里也能简单处理:

| HEAD1 | HEAD2 | HEAD3 |
| :--- | :---: | ---: |
| *LEFT* | `CENTER` | **RIGHT** |
| *LEFT* | `CENTER` | **RIGHT** |
HEAD1 HEAD2 HEAD3
LEFT CENTER RIGHT
LEFT CENTER RIGHT

可以发现,我们在第二行的对应单元格中---的前后加上了:,从而达到了不同的对齐效果,但是正如我们所见,这个对齐改变的是所在列的所有单元格的对齐方式(包括表头)。我个人在实际使用表格时,只会使用居中对齐,而各位如何使用就看各位自己的想法和心情了。

脚注

我们经常可以在一些论文文献中见到某个词上带有[1]上标的这种情况,这就是我们说的脚注。脚注通常都会在文末进行详细解释,或者指出其引用的其他文献、做注释等。在md中也可以定义脚注,就像这样:

BiliBili[^1]

...

[^1]: https://www.bilibili.com/

BiliBili^1

大部分md渲染器并不会渲染[^1]: https://www.bilibili.com/这个部分,而这个部分也不会被显示,它的:后面的文本可以是这里的链接,也可以是一段文本,不过我的这个博客框架似乎会将脚注[^1]渲染为指向[^1]: https://www.bilibili.com/冒号后内容的超链接,因此我这里就索性直接用的链接。

就我个人来说,实际上我基本就没用过脚注,在现在所使用的博客框架肯定更是不会用它了,因为同样的功能完全可以用上面提到的链接语法实现。不过这个也仁者见仁智者见智,对吧。

任务列表

任务列表,我个人其实更喜欢叫它清单,这个列表在md中的定义就像定义无序列表一样简单:

- [ ] 任务1
- [x] 任务2
  • 任务1
  • 任务2

这个语法简单来说就是在无序列表的基础上,在后面加上了一对[ ],请注意,括号内必须有个空格占位,这样才能表示一个空的多选框。而想表示复选框被选中就换成[x][ ][x]-之间也需要用空格隔开,不然这个语法同样不会生效。

这个语法我在别人的博客倒是有见到过不少次,但我自己基本上只在本地使用,Typora在定义这个后,可以很方便的选中/取消选中复选框,因此拿来当作本地的清单还是挺推荐的。

定义列表

定义列表一般情况下用来解释一些术语,而在一些md渲染器中也是支持的,语法如下:

络亚
: 这就是我!不是什么术语!
: 拿自己做例子还挺好玩的(不是)
络亚
: 这就是我!不是什么术语!
拿自己做例子还挺好玩的(不是)

似乎在我使用的这个博客框架下,定义列表支持的不是很好,正常情况下两条:开头的内容应该都是有缩进的。

定义列表的使用场景我个人也没怎么见过,不过在国外网站上倒是见过不少次。个人认为这个语法也能在一定程度上使用无序列表替代,不过这也是仁者见仁智者见智的事(虽然我觉着,其实语义化才应该是主流)。

结尾

算是花了大量的篇幅介绍了md的常用语法,当然,md还有一些语法我还没有介绍到,这个就之后抽时间写了。希望上面的内容能够对各位有所帮助,在学习md时也推荐将代码复制到md编辑器后查看实际效果,这样才能对它的语法有更深入的记忆。