Markdown闲谈

本文最后更新于 2018年1月20日 上午

Markdown是什么,我为什么要选择Markdown

蠢货,自己百度去。
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。
所谓的标记语言,指的是讲文本的内容格式一起记录在文本信息中的编码格式,比较有名的标记语言有HTML,XML(office中的docx、xlsx、pptx都是基于XML),以及我们几天要讲的Markdown。
只说概念是没有用的,那么我们为什么要选择Markdown呢?在这之前,先来看一下Markdown的写作效果吧。下面是我之前一篇博客的截图,左边是我实际写的东西,右边是预览:
嗯,可以看出来一些Markdown的特点了吧(看不出来的都叉出去),是的,与常用的word文档不同,文本的格式,甚至包括段落都是直接以特定的字符串来表现出来的,有点类似转义字符,但是还是有一定区别的。这个以后再讲。而这也正是markdown的比较方便的所在。它既可以表现出文字、段落格式,又是一个轻量化的文本编辑格式,打开读取都非常的迅速,几乎不占内存。好了,废话一堆,讲了这么多还是直接进入正题吧。


用什么来编辑Markdown

我这里推荐vscodetypora

其中前者是一个经典的非常好用的轻量级编辑器,支持各种代码的编辑。而后者是一个Markdown专用编辑器,免费,轻量级,而且功能非常之全面,炒鸡好用。
那么对于vscode来讲,也许添加几个插件能够帮助你更加方便的编辑。按下Ctrl+shift+k打开扩展商店,我这里建议添加下面几个插件:
Markdown shortcuts(添加了一些md语言中常用的快捷键
Auto-Open Markdown Preview(能够在界面的左侧实时预览编辑效果);
Markdown All in One(我也不知道具体包含了啥,但装了总没错)。

而对于typora来说,你只需要熟悉一下快捷键,就已经没有什么好怕的了


Markdown常用语法

本文是基于Markdown的简体中文说明概括而来,如果不嫌麻烦也可以去原网址查看
对于Markdown来说,文本的格式有两个基本单位。一个是段落,一个是字体。这个倒是没什么好说的,但是我们需要搞清楚所谓的段落到底是怎么定义的。
## 段落 ## 在讲段落之前,我们要先讲一下Markdown之中一个稍微有些特殊的地方,也就是他的空白符。在先了解了Markdown的这一特殊之处后,我们再来讲段落。
### 空白符与换行 ###
Markdown中有三个常见的空白符:平行制表符(Tab)、空格(Space)和换行(Enter)。而一个Tab相当于四个Space。然而一般情况下,无论你打了多少个空格或者Tab,最后渲染出来的终究只有一个空格,就像这样,我这样输入:
>a  b    c              d

但是最后渲染出来的还是只有一个空格: >a b c d

如下图 虽然敲了很多空格,但最后显示也只有一个
同理,在Markdown中你只按一下Enter是不能做到换行的,即使他看上去像是换了。直接上图:
这里c后面我是敲了一个空格的,但是渲染出来并没有显示



那么,正确的换行姿势是什么呢?

正确的姿势是在要换行的两个字符之间先敲两个Space之后再敲Enter就可以了,就像下图:
正确的换行姿势
可以看到我在c后面加上了两个空格,就完成了换行

上面我们讲过,一般来说无论你敲多少个空格,最终渲染出来的也只有一个,同理,换行也是这样的,无论你打多少个回车,最终渲染出来的还是只有一个换行:多个回车不能生效
不过这里同时也显示了另外一种换行方式,即当两行之间有一个或多个空行时,无论上一行末尾有没有两个空格,渲染均会进行换行操作

空格和换行的非一般操作

那么有人可能要问了,难道我就没有办法去输出多个空格或者换行吗?当然有。我们前面说过Markdown是一种跟HTML相似的标记语言,这里我们就可以运用"&nbsp;"和"<br>"来达成多个空格和换行的效果:多个换行
这个学过HTML就应该知道了,我就不在另外论述。

空行和段落

讲完了空白符,就该讲一下什么是段落了。 我们在上面讲了两种换行方式,一种是在句末加上两个空格之后回车,一种是在两行之间加上一个空行。那么什么是空行呢?在Markdown当中,只要这一行看上去没有东西,它就算一个空行。哪怕在这一行当中我打了几个空格或者Tab,他也算是一个空行。而段落的标志就是空行。段落与段落之间用空行进行间隔,如下图: 段落
知道了什么是段落之后,我们就可以正式的来讲一讲Markdown语法了。

段落格式

段落格式,顾名思义就是针对段落的文本格式,这些格式在使用时需要用空行与上下段落分割,否则编辑器检测不到段落就会直接把这个效果一路延伸下去啦。

标题

Markdown中的标题一般有两种,一种是类Setext格式的标题,另一种是类atx格式,其中我个人比较常用的是后者。那么下面就来具体讲一下这两者。
- 类Setext格式是由在文本下一行输入不少于2个的-或=所构成的,其中=表示最高级标题,而-表示二级标题。虽然这两个符号的数量可以少于两个,但是小于等于两个的话可能会造成无法触发下文的语法高亮,所以我个人一般建议使用4个进行描写。
> 输入:
>

1
2
一级标题      
=====
> 显示为:
> ​
> > 一级标题
> ====
> > 输入:
>
1
2
二级标题      
-----
> 显示为:
> ​
> 二级标题
> -----
> > 如上www

  • 类atx格式是由在文本前输入相应数量的#所构成的,支持多级,最高可以达到六级,通常来说仅在此行开头输入相应数量的#加上一个空格之后输入文本即可,但是也可以在文本后以对应数量的#进行封闭。我这么说有人可能听不懂我在讲什么东西,所以这里列出来基本的六级标题:
    > 输入格式:
    >
    1
    2
    3
    4
    5
    6
    # 一级标题        
    ## 二级标题
    ### 三级标题
    #### 四级标题
    ##### 五级标题
    ###### 六级标题
    > 实际显示为:
    > ​
    > # 一级标题
    > ## 二级标题
    > ### 三级标题
    > #### 四级标题
    > ##### 五级标题
    > ###### 六级标题
    > > 如上。

这里需要注意的是对于标题而言,无论是否检测到他的前后有空行均会将其认为是一个段落而不是简单的换行,不过这里建议为了美观和书写方便考虑还是最好在标题的前后加上空行,这样自己看起来也会清楚一点。

另外这里要说一下,如果你所使用的编辑器是VSCode,那么一级标题下面你可能会看到一条分割线,那个是VSCode编辑器自己渲染出来的,无视就好啦。

引用和代码块

在上面的文章中我们可以看到一些引用块和代码块,顾名思义,它们的作用一般就是用以引用(或者表示重要)一段文字或者代码。这两种格式本身是比较简单的,我在下面演示了之后就可以看出来。当然它们本身是可以嵌套的,就和我下面要讲的列表一样,所以在书写时可能稍微有一些让人迷惑的地方,不过这个我们待会再讲,先来讲一下这两者基本的用法吧。
- 引用是在该段落的前面加上一个>所构成的,和标题以及其他段落格式语法一样,需要在>后加上一个空格,如输入:
> 引用
那么就会输出如下引用块:
> 引用

在引用块内部的换行和分段遵循Markdown语法,也就是说如果需要进行硬换行则需要在上一行的末尾输入两个tab再进行回车,否则就不会进行换行,如下所示:        
1
2
3
4
5
> 第一行
> 上一行末尾没有输入tab
> 上一行末尾输入了两个tab
>
> 上面是一个空行
那么渲染出来的就是这样的: > 第一行 > 上一行末尾没有输入tab > 上一行末尾输入了两个tab > > 上面是一个空行 懂了吧?~~不懂的叉出去~~ 同时记住,作为一种段落格式,引用的前后还是需要**输入空行**来进行分割哦~
  • 代码块和引用一样,只不过是将>换成了,代码块的使用范例如下: + 对于文本之中的代码,可以用 \ 进行分割,如:
    测试` System.out.print("hi") `
    则会输出为:
    测试System.out.print("hi")

    • 对于一整段的代码,可以在段落前后分别用三个 ` 来进行标记,如下:
      ```
      第一行 还是第一行
      第二行

      第二段
      ```
      那么渲染出来的效果就是这样的:

      1
      2
      3
      4
      第一行 还是第一行       
      第二行

      第二段
      可以看到代码块的分段也是遵循我之前讲到的规则的。

  • 我之前讲到过,上面的两个东西是可以嵌套的,也就是说可以引用里面再引用、代码里面套代码、代码里面套引用、引用里面套代码...等等。这个还是比较好理解的,比如下面这一段话:

    > 测试
    > ```
    > System.out.print("gdzjh");
    > ```
    >> 以上代码是我瞎写的
    >
    > see you

    那么渲染出来就是这样的:
    > 测试
    >

    1
    System.out.print("gdzjh");
    >> 以上代码是我瞎写的 > > see you

    这个嵌套还是比较好理解的,我就不再多举例子了,相信大家都看得懂。
    ### 列表

之前讲到,列表也是一种可以嵌套的格式,而且与引用和代码块不同,列表大部分情况下就是为了嵌套而使用的,所以在使用列表时,清楚自己在本行句首缩进了多少个空格是很有必要的,否则很容易搞混哦~

列表通常是在段首使用一个*或+或-来表示,这三种符号本质没有任何区别,使用情况完全相同。当然使用这三种符号所表达的列表都是无序列表。如果要表现有序列表的话有另外的表达方式,但其嵌套方式与无序列表是van全一致的,所以这里就先讲一下无序列表。

  • 无序列表的普通表达方式如下所示:
    > - one
    > - two
    > - three

    则渲染出的结果为:
    > - one > - two > - three

  • 换行和嵌套
    对于列表而言,换行是不需要行尾加上两个tab键的,在按下回车时,会默认进行换行同时进入下一个列表内容。但是,如果我想进行一个硬换行的同时不进入下一个列表内容应该怎么做呢?那就还是需要tab了。在上一行结束之后,输入两个tab,按下回车,会进行换行并切入下一个列表内容编辑,这时删除这一行的所有内容(其实只有前面那一个标识符)。删除这个标识符需要将本行前面的所有缩进一并删除才行,不过当我们这么做的时候,你会发现页面不怎么好看:
    >     - one
    > new

    看不出来是吗?没事,我们先讲一下列表的嵌套再回头来试一下你就会受不了了的,相信我。
    列表的嵌套虽然略微复杂但是也不算很难,在这一行的内容输入结束之后,敲下回车,默认进入下一行列表,这时将光标移动到这一行的标识符前,按一下tab进行缩进,则列表将切换成低一级的列表,如下:
    > - one
    >     + new
    >          * ah that`s good

    渲染结果如下:

    • one
      • new
        • ah that`s good

    对于每一个等级的列表而言,都相当于一个段落。不过在列表之中这里并不需要需要使用空行隔开,而是通过判断首行的缩进来判断列表级别:
    >  - one
    >      + new
    >          * deep
    >  - two
    >      + new
    >          * dark
    >  - three
    >      + new
    >          * fantasy

    那么渲染出来就是这样的:

    • one
      • new
        • deep
    • two
      • new
        • dark
    • three
      • new
        • fantasy

    一般来说列表的三个等级分别是实心圆、空心圆和实心方块,不过这里我的文章中本身就包含了一级列表所以说上面的列表中就只有下两级的了
    为了编辑时的方便起见,我建议不同等级的列表使用不同的标识符,这样做只是为了看的清楚,没有其他的意义。

    好了,到了这里我们再来回头看一下刚才的那个硬换行,在包含了多级列表的时候,会变成什么样呢?
    > - one > + new
    > yoooo
    > - two > + new
    > ah

    看上去很好嘛,不过我们看一下源码-----
    >  - one
    >      + new
    >  yoooo
    >  - two
    >      + new
    >  ah

    这乱七八糟的缩进是什么玩意啊!

    所以呢,这里给出一个对于列表中的硬换行与级别切换的比较不容易使人迷糊的方式:缩进,每一个级别的列表都与上一级差一个tab键的缩进。
    在不同等级之间的切换比较简单,只需要在本行的标识符前面按一下tab即可进入低一级的列表。而要回到上一级的列表,一般来说只需要按backspace即可默认删除tab键所造成的缩进,不过有时可能并没有办法能一次性删除按一次tab键所带来的缩进,所以我们这里也可以采用一种比较暴力的方法,直接将标识符前的缩进删除到本行标识符与上一级的标识符对其就可以了。

    而对于列表内的硬换行,则需要删除行前的标识符,此时本行的缩进会被全部删除,如下图:
    new
    此时继续使用tab将光标缩进到文本所需要的级别的位置,如下图:
    new截图没有截到光标,我就在光标的位置输入了一个l来代替光标
    此时输入即可达到文本内的硬换行:

    1
    2
    3
    - one      
    + new
    继续new
    输出如下:
    • one
      • new
        继续new

    总之,列表的内涵就是缩进,我这样讲可能不太好理解,大家自己去试一试就很好理解了~

  • 有序列表
    刚才说过,列表除了无序列表以外还包括了有序列表。有序列表的嵌套和换行等等都是和无序列表一样的,我这里仅举例一下有序列表的表达方式:
    >

    1
    2
    1. new
    2. new
    > 渲染结果如下: > 1. new
    > 2. new

    嗯,就这么简单,数字后面加上一个点就好了。

分隔符和标识符

分隔符

Markdown语法中的分隔符是由不少于三个的、-或_组成的,这三种符号任意一种均可,你甚至可以在其中插入空格:
>

1
2
3
------    
______
******
> > ----- > ______ > ***** >

斜体和加粗

Markdown语法中的斜体与加粗是可以嵌套的,这两者的表达均是使用不同数量的或_来表示,具体规则如下:
> 加粗:
>

1
2
**加粗**      
__加粗__
> 加粗
> 加粗
> ​
> 斜体:
>
1
2
*斜体*      
_斜体_
>
斜体*
> 斜体
> ​
> 加粗和斜体:
>

1
2
***加粗和斜体***
___加粗和斜体___
> 加粗和斜体
> 加粗和斜体

以上,结束。

删除线

Markdown语法中的删除线比较简单,仅需要在文本两侧各加上两个~即可:
>

1
~~del~~
> > del

链接和图片

Markdown中的链接和图片的引用语法有一些相似之处,因此这里我将它们一并说明。

链接

连接的语法支持两种格式,行内式和参考式,无论是哪一种,链接文字均需要以方括号包含在内。官方中文文档在这一部分的描述非常复杂,我这里只讲一下我们日常书写中常见的格式。先讲一下行内式,一般我自己写东西的时候用得最多的就是这种,格式如下:
> [链接文字](链接内容)
> 举例:
>

1
[一个智障的博客](aye10032.github.io)
> 一个智障的博客

参考式也差不多,不过参考式的格式是分成两部分的,首先是由方括号包含起来的一个链接文字,之后是一个同样有方括号包含起来的标记,接着,在文件的任意处,你可以把这个标记的链接内容定义出来,如下:
>

1
2
3
4
[一个智障的博客][1] 实际上作者并不是智障。       
不过我们这里就姑且认为她是智障。

[1]:aye10032.github.io
> [一个智障的博客][1] 实际上作者并不是智障。
> 不过我们这里就姑且认为她是智障。
> ​
> > [1]:aye10032.github.io

嘛,就是这样。具体选择哪一种就看大家各自的书写习惯和文本的具体情况而定了。

图片

图片的格式和链接大体一样,从外观上来看仅仅是在前面加上了一个!而已,同样图片的格式也是分为行内式和参考式,具体的表现方式如下:

1
![02](\images\posts\markdown\016.PNG)

那么就会输出一张图片......

02 对不起,不要打死我

当然,我这里的图片地址使用的是本地化地址,你也可以选择使用链接,至于怎么生成图片的链接嘛.....最简单的方法:打开QQ相册,上传,然后显示图片链接,完事。 当然一般来说我还是推荐使用上面这种方法了,毕竟文件就在本地比较稳定,也不怕丢失了啥的。 参考式也是同样:

1
2
3
![02][01]莓良心    

[01]:\images\posts\markdown\016.PNG

02莓良心

特殊符号的输入

之前我们的教程里面提到了许多的特殊符号,这些特殊符号一般来说会被编译器自动转换为其表达的格式。不过当我们想要输出这些字符本身的时候应该怎样才能保证它们不被编译呢?答案就是使用反斜杠,在想要输出的特殊字符前面加上反斜杠,就可以原样输出该字符本身了。 >

1
\`int x=1;\`
> `int x=1` 这里就不会被编译成代码块了

同理,想要输出,也是只要在前面加上反斜杠就好了。


Markdown闲谈
https://www.aye10032.com/2018/01/20/2018-01-20-markdown/
作者
Aye10032
发布于
2018年1月20日
更新于
2018年1月20日
许可协议