Markdown语法基础

Author Avatar
KeybrL 11月 13, 2016
  • 在其它设备中阅读本文章

这是第一次使用Markdown时,对Markdown的基本语法都不了解,通过这一篇文章学习、尝试


Markdown 是一种轻量级的标记语言

在你使用 Markdown 之前你首先要确定你是否真的需要 Markdown。

Markdown 是为那些需要经常码字或进行文字排版的,对码字速度和排版顺畅度有要求的人群设计的,他们希望用键盘把文字内容敲出来后就已经完成排版了,最好完全不用碰鼠标。这些人包括经常要写文档的软件工程师、博客写手、网站小编、出版业人士等。

所以,如果 Markdown 并不能提高你的工作效率,那就让它见鬼去吧。

如果你已经明确你需要使用 Markdown ,那么你一定需要了解一些语法和标记……


区块元素

区块元素一般以段落为单位,所以应用区块元素时注意段落的范围

区块元素主要有 Heading、Quote、Table、Code Fence、List、Horizontal Line……

在介绍他们之前,我们先区分一下什么是一个 Paragraph (段落)

Paragraph

在 Markdown 中,段落由一个或多个连续的文本行组成,前后有一个或以上的空行(空行的定义是显示上看起来像是空的行。因此,若某一行只包含空格和制表符,则该行也会被视为空行)。

普通段落不该用空格或制表符来缩进(这点与一般的汉语书写规范不同)。

前文 连续的文本行 实际上暗示了 Markdown 允许段落内的 强制换行 ,在 Markdown 中,使用 先插入两个或以上的空格,然后再回车 的方式可以做到段落内的强制换行。
就像这样进行换行。一般来说,文本行之间的间隔会小于段落之间的间隔。

在多行的引用区块和列表中,换行是 十分必要 的。

Heading

除了能起到更显眼的效果,标题还为 Markdown 提供更清晰、简洁的结构,所以学会在文章中应用标题十分重要。

Heading 可以像这样标记出来,他们分别代表 HTML 中的 Heading1~Heading6

# Heading1 #
## Heading2 ##
### Heading3 ###
#### Heading4 ####
##### Heading5 #####
###### Heading6 ######

当然,我们完全可以像下面那样省略后面的#,结果跟上面是完全等效的

# Heading1
## Heading2
### Heading3
#### Heading4
##### Heading5
###### Heading6

需要注意的是,跟 HTML 一样,Markdown 并没有 Heading7。
幸运的是,我们不会需要再多的标题了。

上面介绍的是比较常用的 Heading 用法,当然,Markdown 中 Heading 还有一些别的用法

Heading1
========

Heading2
--------

在 Markdown 中可以像在 Setext 中一样,用下方的-和=标记标题。值得注意的是,任何数量的-和=都能起到完全等效的作用(除了6个-表示分割线)

正如你所见,这种方式的标题并不值得提倡

Quote

在你的文章中,你或许会需要用酷一点的方式写个引言,或者引用一段话

像这样

E=mc^2
        ——Albert Einstein

那你一定需要Quote,他看起来十分简单

> 你只需要在每一个文本行的开头输入一个>  
> 它就会变成这种效果  
> 如果你需要换行,千万不要忘记前面所讲的 **强制换行**
>
> > 如果你多加一个>,你会得到 **二级引用**  
> > 这很酷,不是吗
>
> 如果你需要结束这个引用区块(段落),还记得怎么做吗

> 没错,你需要一个空行  
实际上你也可以偷一点懒,只需在每个段落的开头加一个>就能达到一样的效果

上面那一段代码产生的效果就像这样

你只需要在每一个文本行的开头输入一个>
它就会变成这种效果
如果你需要换行,千万不要忘记前面所讲的 强制换行

如果你多加一个>,你会得到 二级引用
这很酷,不是吗

如果你需要结束这个引用区块(段落),还记得怎么做吗

没错,你需要一个空行
实际上你也可以偷一点懒,只需在每个段落的开头加一个>就能达到一样的效果

引用区块内也能使用 Markdown 中其他的语法

code

Strong

Emphasis

Code Fence

有时候,你需要在你的文章中展示一段代码

比如你最喜欢的“Hello World!”

#include <stdio.h>

int main()
{
    printf("Hello Worle!\n");
    return 0;
}

那你一定需要像代码区块这样原汁原味的展示方式,他们并不复杂

你只需要使用两组三个反单引号`隔开一个段落即可

​```
这里是一个表示代码内容的段落
​```

当然,Markdown 还提供一种比较难操作的方式。你可以在每一行缩进一个换行符或四个空格

    就像这样
    制表符会一定程度上地破坏段落的结构,这使得这一方式并不十分好用
    当然,如果你喜欢,你可以尝试一下
    原则上两者并没有明显的优劣之分

在代码区块中的内容一般不会被视为语法

List

如果你需要使文章观点或信息更加鲜明地列出,特别是在学术文章或说明文章中,你会很自然地想到在每一个文本行前面加上序号或别的着重标记。

在 Markdown 中,这么做是十分容易和自然的。

Ordered List

有序列表,就是带有顺序序号的列表

1. 第一行
2. 第二行
0. 第三行,在输入时数字可以是任意的,这并不能影响实际显示效果,但这样的习惯并不好

效果就像这样

  1. 有序列表的每一文本行都以阿拉伯数字序号+英文的句号(.)+一个空格开始
  2. 最终显示的序号只能以1为步长递增
  3. 一个有序列表也是一个段落,所以它也以一个空行结尾
  4. 在列表中,并不需要多加两个空格强制换行,直接敲回车即可
Unordered List

无序列表看起来只是在每个文本行前加上了一个着重标记

只需要像这样在每个文本行前加上减号、加号或星号(-、+、*)和空格,这三种标记是完全等效的

- 第一行
+ 第二行
* 第三行,用什么标记并没有什么不同

效果看起来是这样的

  • 一般来说,这只是在每行前加一个原点标记一个要点
  • 除了标记符,其余的基本和有序列表一样
  • 混用三种标记并没有什么不同,但为什么要煞费心机换着花样呢,选一个自己最喜欢的更为明智

如果试着在标记符前面加上两个或四个空格,你也能得到分层的无序列表

- 第一层
  - 第二层
    - 第三层

他们像这样

  • 第一层
    • 第二层
      • 第三层

这样可以使层次更复杂,这是有序列表不具有的特性

Task List

任务列表实际上就是带有“待办”标记的列表,他们看起来比较复杂

- [x] 这表示完成
- [ ] 这表示未完成

效果就像下面这样

  • 这表示完成
  • 这表示未完成

减号与方括号之间、两个方括号之间和方括号与其后的内容之间都有一个空格
就像你看到的,这个功能并不一定能被Jekyll兼容

Table

在文章中,表格是十分重要的,而同时,表格的编辑又充满挑战。比如在 Word 中就有很多很强大的表格工具,甚至可以插入 Excel 表格,但是其操作并不简单。幸运的是 Markdown 为我们提供了一种十分轻量级的表格工具,我们可以将精力从编辑表格样式转移到丰富表格的内容中来。

Markdown 中的表格是由竖线、减号和冒号(| - :)构成的,你可以像这样建立一个表格

| Header1 | Header2 | Header3 | Header4 |
| ------- | :------ | :-----: | ------: |
| (1,1)   | (2,1)   | (3,1)   | (4,1)   |
| (1,2)   | (2,2)   | (3,2)   | (4,2)   |
| (1,3)   | (2,3)   | (3,3)   | (4,3)   |

表格的实际效果就像下面这样

这里是表头,这看起来更显眼 每一列的列宽是由这一列的内容长度决定的 当内容太多,表格会自动换行 这看起来很容易,不是吗
表头下面那一行是用减号和冒号填充的(那行在实际效果中不会显示) 减号和冒号的总数等于这一列的最大字符数 冒号只在减号两端有(就像上面的代码示例) 内容与竖线之间是以一个空格隔开的
冒号的位置决定了这一列的对齐方式 左对齐 居中 右对齐
每格的字符数都要与该列最大字符数相同,内容不足的用空符替代 一个汉字字符也算一个字符,尽管它们占两个字符的宽度 所以这导致了有汉字的表格在编辑状态下十分难看 幸好在实际效果中问题不大

Math Block

就像代码在代码区块中更像代码一样,数学方程在数学区块中更像数学方程

$$
E=mc^2
$$

$$
a^3-b^3=(a-b)(a^2+ab+b^)
$$

操作起来并不复杂,像这样

$$
E=Mc^2
$$

但是这个功能并不常用,而且并不是md一般标准,算是一种扩展,被部分编辑器支持,Jekyll的md引擎一般不支持

所以就不赘述了

Horizontal Line

有时候你并不知道分割线的具体作用,但你就是想用一个分割线,或许为了“长文预警”、“多图预警”、“不适预警”……或许只是为了装饰一下。

你可以不知道分割线有什么用,但是你一定不能不知道分割线怎么用。因为他几乎是最简单的段落了,没错,它的确是一个 段落

------
* * *
****
__________

你只需要像上面那样,在一行用三个以上的星号、减号或下划线产生一个分割线,这一行不能存在其他的字符。当然,在星号或减号之间插入空格是被允许的

这是一条喜闻乐见的分割线


Table of Content

如果你的文章很长,并且你用标题管理得十分井井有条,那么你一定希望用一个目录向你的读者展示你的文章结构,并提供快速转到的帮助

很幸运 Markdown 提供了这样的功能,而且十分简单,你只需要在你想创建目录的地方敲上一个这样的段落

[TOC]

没错,这也是一个 段落 ,不要忘了空行

像这样

[TOC]

当然,一般情况下你应该在文章开头展示目录,而不是在这

很不幸的是,这个功能也不一定能发挥作用

区段元素

与上面的区块元素不同,区段元素一般不作用于段落,而是作用于字符串

强调

在 HTML 中用于强调的标签主要有两个

<strong>全局强调</strong>
<em>局部强调</em>

应用 strong 标签的文本被定义为全局范围的强调,主要表现形式就是 加粗

而应用 em 标签的文本则被定义为局部范围的强调,主要表现形式是 斜体

局部强调是阅读到附近时才能发现的,而全局强调是在篇章的尺度上能被明显区分的

在 Markdown 中也有完全一样的功能,只是形式上更为简洁

Strong

在 Markdown 中你可以使用下划线和星号(- *)标记强调

**Strong**

主要效果就是加粗

Strong

Emphasis

类似于 Strong ,使用星号或下划线

*Emphasis*

这样的强调效果主要是斜体

Emphasis

Underline

出于一些无聊的目的,你可能需要在一些文字下面加入一些 下划线 ,那么你只需要这样

<u>下划线</u>

没错,这就是完全沿用 HTML 的一个标签

Code

你有时需要在文本中引用一小段代码,如何让他们类似于代码区块长得像代码,而又不用另起一行呢

`"Hello World!\n"`

你只需要使用两个反单引号包围一串字符就能产生一个代码区段 "Hello World!\n"

Inline Math

行内数学区段类似于前面提到的数学区块,只是它不用自成一段,也不会居中,它可以出现在除代码区块和代码区段外的任何地方,比如这里$W_外+W_内=△E_k$

上面那个动能定理只要这样输入即可

$W_外+W_内=△E_k$

十分不幸的是,跟数学区块一样,行内数学区段的兼容性也并不很好

Strike

当我们要输入一些 装逼 有趣的文字时,我们常常要用到划线来划掉一些我们 明明可以不输出来 不太想让别人误会的文字。

我们只需要用前后各两个波浪线(~)包围我们需要划掉的文字

一切dalao都是 ~~纸老虎~~ 名副其实

如果你善于观察,你会发现,在被划掉的文字两边加上空格效果会更好一些

Comment

这个是一个直接来源于 HTML 的标签,而在 Markdown 中,这个标签变得可有可无,他其实就是一段注释

<!--这段话在这并没什么卵用,它也不会显示给用户-->

注释是什么我在此不作说明,这对于代码的维护来说十分重要,但对于文本编辑,这似乎是一个鸡肋。

超链接,网页的灵魂所在。

对于一篇文章而言,超链接常常也是必不可少的。Markdown 为我们提供了 行内式参考式 两种类型的超链接

行内式

我们先了解一下行内式,行内式的超链接可以简单地插入到文本的任何地方(除了代码区块和代码区段),比如Bing。而我们只需要用方括号将链接文本置于方括号内,将链接地址置于方括号后的圆括号内,若有标题也可在圆括号内、链接地址后加入一个空格后用双引号标示

格式:[Text](URL "Optional Title")
例:[Bing](https://cn.bing.com/ "微软必应")

如果是站内网页,也可以使用相对路径

参考式

然后是参考式,参考式是仅在段落中对链接文本做标记,知乎,具体链接内容自成段落分布在文章其他地方

标记部分:

格式:[Text][id]
例:[知乎][a]

链接内容:

格式:[id]: URL "Optional Title"
例:[a]: https://www.zhihu.com/ "与世界分享你的知识、经验和见解"

在定义连接内容时要注意:

  1. 在冒号与地址之间、地址与标题之间都有一个空格
  2. 连接内容可以放置在文章的任何地方,习惯上可以类似于注释放置在全文末,也可以放置在相关的段落后,便于查看
  3. 连接内容是段落,注意空行
  4. 链接标签可以有字母、数字、空白和标点符号,但是并 不区分大小写

参考式超链接的标签可以省略,但用于包围标签的方括号不可省。省略标签时,默认以链接文本作为标签。

个人认为,参考式超链接不会破坏文章结构,使文章可读性更高,因此更值推广

自动链接

Markdown 支持以比较简短的自动链接形式来处理网址和电子邮件信箱,只要是用尖括号包围起来, Markdown 就会自动把它转换成链接。这时链接地址就和链接文本一样,例如:https://cn.bing.com/

<https://cn.bing.com/>

Markdown 会将他转为:

<a href="https://cn.bing.com/">https://cn.bing.com/</a>

邮址的自动链接也很类似,只是 Markdown 会先做一个编码转换的过程,把文字字符转成 16 进位码的 HTML 实体,这样的格式可以糊弄一些不好的邮址收集机器人,例如:

<address@example.com>

Markdown 会转成:

<a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;
&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;
&#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;
&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>

在浏览器里面,这段字串会变成一个可以点击的「address@example.com」链接。

这种作法虽然可以糊弄不少的机器人,但并不能全部挡下来,不过总比什么都不做好些。不管怎样,公开你的信箱终究会引来广告信件的。

Image

没有图片的文章都不是好文章

Insect

因此, Markdown 也很自然地为我们提供了插入图片的方法

与超链接很类似,插入图片也分为行内式参考式

行内式:

![Text](URL "Optional Title")

例:![Insect](../images/insect.jpg "Insect")

参考式:

标记部分:  
![Text][id]

图片内容:  
[id]: URL "Optional Title"

参考式便不作演示了

除了感叹号,插入图片的方式与建立超链接几乎是一样的
到目前为止 Markdown并不支持指定图片大小,如果有这种需求,可以使用 HTML 的 <img></img> 标签[^1]

Footnotes

在编辑文章,特别是学术文章时,你有时需要对文章的某些部分做出解释,但又不想直接写在正文中,那么你一定能想到书本的脚注。没错,Markdown 也提供了脚注的功能。

类似于参考式的图片和超链接,脚注也有两部分,标记和注释

如果你想在文中某处注释[^2]一下,那么你只需要在要注释处输入一个用方括号包围的^x,x可以是任意你喜欢的数字

然后你可以在文章任何地方输入这处注释的内容,他们的格式类似于这样

标记:  [^a]  
内容:  [^a]:注释内容

脚注不是 Markdown 的标准,所以其实现效果各有不同

[^1]: 没错,文中多次暗示了,Markdown 可以直接使用 HTML 标签,这在下文会详细介绍
[^2]: 对书籍或文章的词汇、内容、背景、引文做介绍、评议的文字

没错,不管你写在哪,在最终效果中,注释内容一般都在文末

其它

上文已经就 Markdown 的一般用法做出了解释,但是你知道 Markdown 远不止于此。

兼容HTML

Markdown 是一种适用于网络的书写语言。

可以说 Markdown 是由HTML派生而来的,因此 Markdown 有很多 HTML 的影子。Markdown从来没有想要接近 HTML 或者取代 HTML,因为 Markdown 只是一种书写语言,其语法范围也只在文本的范围内。因此,当你需要使用一些超出文本需要的功能,你可以直接使用 HTML 实现。

没错,Markdown 几乎兼容所有的 HTML 标签。上一句话的“标签”两个字就是被 HTML 标签标记的,就像这样 <b>标签</b>

像 Markdown 一样,有些 HTML 标签是 行内式 的,有些则是属于 段落 ,应用时要注意
在 HTML 标签内,Markdown 语法不会发挥作用。

特殊字符自动转换

在 HTML 中&和<是两个令人备受折磨的字符,因为他们都在 HTML 中作为语法的一部分有特殊含义。因此当你仅仅需要打印&或<时,你需要输入 &amp;&lt; 分别代替&和<,甚至当网址中有&时也要转换

网址:
http://images.google.com/images?num=30&q=larry+bird
需输成:
http://images.google.com/images?num=30&amp;q=larry+bird

这十分麻烦。但幸运的是,一般情况下,在 Markdown 中你并不需要这样,你只需要直接打出&或<即可,但是……

Every coin has two sides.

因此,这在 Markdown 中又变得复杂了一些。当你将它们当作一般的字符书写出来,Markdown 会自动将它们转换为 &amp;&lt; 。但前面说过,Markdown 兼容 HTML ,因此,当 Markdown 认为那是 HTML 语法时,Markdown 不会转换他们。

如果你想在文中加入一个版权符号©,你输入

&copy;

Markdown 并不会转换他们,而是原样输入 HTML。但如果你输入

1+1<5

Markdown 会自动将他们转换为

1+1&lt;5

因此了解 Markdown 何时自动转换、何时不转换十分重要。

反斜杠

Markdown 可以利用反斜杠来插入一些在语法中有其它意义的符号,例如:如果你想要用星号加在文字旁边的方式来做出强调效果(但不用 `` 标签),你可以在星号的前面加上反斜杠:

\*literal asterisks\*

Markdown 支持在以下这些符号前面加上反斜杠来帮助插入普通的符号:

\   反斜线
`   反引号
*   星号
_   底线
{}  花括号
[]  方括号
()  括弧
#   井字号
+   加号
-   减号
.   英文句点
!   惊叹号

·结语

多看多想
        ——某dalao

知识共享许可协议
本作品采用 知识共享 署名-非商业性使用 4.0 国际许可协议 进行许可。

本文链接:https://blog.keybrl.com/professional-2016-11-13-The-base-of-grammar-in-Markdown/


你终于看完了!

如果你对这篇文章有任何想法或者对Keyboard本人有什么看法,随便什么东西,甚至是“hhh”,都可以在下面留言。随便吐槽,反正我不会看的...

这是完全匿名的,当然你也可以留个名,甚至留个邮箱(邮箱只有我可见),因为如果你有什么有趣的留言我可能会好奇想认识一下你

而且我关掉了邮件提醒功能,所以不管你留不留邮箱,你都不会收到关于你评论的回复的提醒(我也不会收到提醒)

(老实说,我偶尔会看的...)