很早之前就想总结一下Markdown的一些语法了,记得刚开始学的时候随便搜一下就能找到很多人总结的文章,胡乱地看了一通结果到自己真正写的时候还是一个一个语法地搜,虽然Typora用着很舒服但用久了之后却发现自己的Markdown水平依旧没有任何长进,一离开Typora的帮助,比如换了个环境(学校电脑,没权限安装Typora)还是得一个个查。
于是开始逼自己用更泛用的工具写BLog,正好前些日子在学Vim,逐渐体会到其强大之处,干脆就用它写Markdown文章好了,配合MarkdownPreview插件,也觉得挺方便的。(重点是能够自定义快捷键) 下面就按照常用的程度记录下Markdown的一些语法吧,方便自己以后查询,看自己曾经写的总比看别人写的印象深~
1 最基础的语法
# h1级标题
## h2级标题
### h3级标题
#### h4级标题
##### h5级标题
###### h6级标题
文章的层次得要有的吧,平常写东西前三级就够用了,注意#和标题之间要有空格,而且要放在行头,像# 这种写法是不会被认作标题的。
这个语法太简单了怎么都不会忘的吧,但为了完整起见还是列在这。
标题可以用等号和连字符表示:
This is an H1
=============
This is an H2
-------------
有时候你可能只是想打一个分隔线,但由于少空了一行导致前一行成了一个二级标题。这里的=和-任意个数都可以,关键是位置;上面的范例在真正写作的时候是不应该出现的(除非你太闲了想多打几个=玩)。
2 很常用的语法(对于我来说)
由于每个人使用Markdown的需求不同,常使用的语法可能相差很大。有的人可能主要用来写小说、日记,这时候其实用的语法并不多;有的可能写代码比较多,或者是写LaTeX的公式较多;甚至是使用表格更多(我觉得Markdown里的表格还是挺麻烦的,而且也不太好控制格式)。
我由于是流体力学专业,公式是肯定不会少的,但代码平常也用得很多,下面就从我的需求出发列一下我常用的语法。
2.1 代码
普通的行内引用: `your code` ;代码块:``` ``` 其中三个斜点要单独占一行,第一个```后可标注该代码语言名称,一般比较常用的语言都可以识别出来。
好像代码块还有别的表示方式如~~~、4个空格或者1个水平制表符,但有的可能显示不出来我也不知道是不是编译器的原因。
2.2 空格
这应该是最让Markdown新手抓狂的一个语法了,当我想拉开两个词的距离而多次按下<Space>
时却发现,只有最开始那个空格是有效的,然后你打开百度搜索发现原来Markdown里面有这么多种空格的表达方式。我觉得最多记住一个就够了,比如我偶尔用下 
,但输入太过麻烦后面一想也基本没必要用,除非你有强迫症想让每段开头都空两个字符;或者直接在Vim加一个快捷键方便打空格。
2.3 段落
毫无疑问这是第二个让新手不得不Google一下的地方,当你按下<Enter>
想换个行或者多空几行时,却发现并不奏效。
Markdown 段落没有特殊的格式,直接编写文字就好,段落的换行是使用两个以上空格加上回车。
空行 : 也有很多种方法,推荐只记住<br>
或者<br/>
、</br>
这几个都行,这也是HTML的表示方法。(感觉空行还是挺常用的)
2.4 字体
首先是斜体和粗体:
*斜体文本*
_斜体文本_
**粗体文本**
__粗体文本__
假如要输入一段粗体中包含斜体的文本 ,如果全部用*
可能就容易出错,而混搭起来层次比较清晰——本来是这么想的,但好像有时候嵌套会出现问题:
- 斜体外套粗体:
**a_b_c** **a*b*c** __a*b*c__ __a_b_c__
显示结果如下:a_b_c abc abc a_b_c 结果倒挺让我意外的。 - 粗体外加斜体:
_a**b**c_ *a**b**c* *a__b__c* _a__b__c_
显示结果如下:abc abc a__b__c a__b__c
总结这几个测试可以得出,*
的优先度是大于_
的,*
内部的_
将失去_
原有的作用; 而且在_
里面的_
也会失去作用。 - 代码符号`的优先度又比
*
高,所以其内部的文字格式通过*
控制不了。
需要强调的是不同的Markdown引擎对于这些细节的处理是不一样的,我的主题用的是hexo自带的hexo-renderer-marked,当换成其他引擎如hexo-renderer-markdown-it、hexo-renderer-kramed时结果可能会不一样
2.5 分隔线
| ***
| * * *
| ******
| - - -
| ---
| ___
| 《hr》
忽略前面的|(分隔线在我Blog的编译器里优先度比代码快还高,不加|根本显示不出来),而hr标签则更高,不改成中文符号根本没法显示。 (别的编译器可能显示结果又不一样)
随便用哪个都行,推荐---
,因为不需要按Shift键,比较方便。
2.6 删除、下划线
删除:~~delete~~
下划:<u>underline</u>
这个复杂一点,是HTML标签
测试时间到:
- 与加粗的比较:
- 加粗在外部:
__a~~b~~c__ __a<u>b</u>c__
正常显示: abc abc - 加粗在内部:
~~a__b__c~~ <u>a__b__c</u>
加粗在内部:a__b__ca__b__c
- 加粗在外部:
- 删除与下划并存:
~~a<u>b</u>c~~
<u>a~~b~~c</u>
显示结果 :abcabc - 其他测试均未出现问题所以不用列出来了
如果把__
换成**
则均能正常显示,结合前面的可以得出的结论:
加粗和斜体只记住*
就行了,忘记_
吧!
当然这些结论也只适用于hexo-renderer-marked引擎(真希望有朝一日Markdown能有一个统一的完整的引擎)
2.7 链接和图片
2.7.1 链接
[名称](地址 "title")
<地址> :直接写一个网址上去也能识别为可点击的链接
[名称][链接名称]
[链接名称]: 地址
若要使用第三种方法,两行之间至少要空一行才能正常显示。注意使用链接时地址一定要写完整,前面的http://
不要丢了,不然会按照相对地址进行跳转。
链接还可以加个title,在地址后用引号的形式写上就行;当把鼠标移到链接上时就会显示title了。
举个例子:
Airfoil optimisation for vertical‐axis wind turbines with variable pitch
2.7.2 图片
和链接极为相似,只是前面多了个!
号,注意是英文的感叹号。第一个框里面的名称基本上空着就行,或者简单写个描述,防止哪天图片挂了之后忘记当初这张图是啥样的。
当然也可以用HTML标签来表示图片,还能加上更多的格式控制,不过显得比较麻烦
<img src="图片网址">
说到图片肯定离不开图床,毕竟图片太多的时候总不能全往一个地方塞。这里推荐PicGo这款软件,Windows和Linux下都能用,添加图片也很方便,看看它总结的一些图床吧:
我还是白嫖的Github当作图床,不过缺点是有时候国内访问速度很慢甚至打不开(对我来说没影响就行),不过好像还有免费的CDN加速可以用。
同样图片也可以加一个title,鼠标移上去的时候会显示出来。像我这个Hexo主题还会在下方显示一行图注。
2.8 列表
- a
+ b
* c
这三种都可以表示无序列表,还是推荐使用-
,因为按键最简单;注意要留一个空格。
1. a
2. b
3. c
有序列表也很简单,也是注意要留一个空格。
然后是列表的嵌套,说是添加四个空格,不过有的好像只加了两个就能够显示出来。
注意一个使用细节:列表的最后一行和下一段文字之间一定要先空一行再说,不然文章的层次会出现问题。总之没事多空一行没坏处~
2.9 引用
2.9.1 区块引用
有时候想引用一下某人的名言警句,放弃难看的“ ”
直接另起一行使用>
吧。而且这个也能嵌套(不知道这里嵌套有什么用):
> a
> > b
> > > c
- 注意在
>
后最好加上空格,虽然实际情况是不加空格有的编译器也能显示出来,但加空格总不会出错。 - 第一行用了
>
相当于创了个引用块,接下来的内容都会被当作引用,直到遇见一个空行。
2.9.2 脚注引用
这又是一个让人蛋疼的地方,
脚注引用这部分并不在markdown的基本语法里,所以有的引擎比如我这个hexo默认的hexo-renderer-marked就没办法直接显示脚注。为了能够用脚注我折腾了一个下午,引擎换来换去,解决一个个新冒出来的问题,最后还是放弃了,换回了原来的hexo-renderer-marked。
好在最后找到了这个hexo-reference插件,只需要一个命令:
sudo npm install hexo-reference --save
再在根目录的_config.yml
中加入:
Plugins:
- hexo-reference
就能够使用脚注了!使用方法:
举个例子:Rogalsky[1]
更高端一点,可以在脚注内容里面加上链接,点击直接进入文献相关页面:De Tavernier[2]
用户体验极佳~
2.10 公式
首先得要有公式的引擎,毕竟公式这么复杂的东西Markdown自己很难搞定吧。一般推荐用MathJax引擎,配置好了之后可以用LaTeX语法写公式了~
2.10.1 行间公式
$a_1+a_2$
: 显示为 $a_1+a_2$
2.10.2 独立公式
$$\frac{\partial \rho}{\partial t}+\nabla \cdot(\rho \mathbf{v})=0 \tag{1.1}$$
显示为:
$$\frac{\partial \rho}{\partial t}+\nabla \cdot(\rho \mathbf{v})=0 \tag{1.1}$$
注意要另起一行开始再开始输入$$
才有效。如果想要给公式加序号,在公式输完了后空个格加入\tag{1.1}
就行,这种方式是手动编号。
加入编号是为了引用,引用也只能手动输入$(1.1)$
,显示为$(1.1)$。还是比较麻烦的。
2.10.3 LaTeX的自动编号公式
对于公式的处理又是Markdown里的一大难题,下面这一段LaTeX语句可能放在别的引擎里就识别不出来了。
$$\begin{equation}
x^n+y^n=z^n
\end{equation}$$
显示为:
$$\begin{equation}
x^n+y^n=z^n
\end{equation}$$
当然这些规则都可以通过Mathjax的配置进行修改,比如有的blog的mathjax配置段没有:
TeX: {equationNumbers: { autoNumber: "AMS" } }
自然就不会显示自动编号。关于公式的具体语法,实在是太复杂了,不是一下子能说的清楚的;不过世界上也有大佬能够在课堂上用Markdown写公式做笔记,详见How I’m able to take notes in mathematics lectures using LaTeX and Vim。实在是太强了…
3 其他语法
3.1 表格
我是不太建议用表格的,毕竟Markdown里表格的输入并不方便,特别是比较复杂的表格,光是|
都够你输入了,当然如果是有像Typora这样的工具的话,表格输入还是方便了不少,但Markdown无法对表格进行一些比较高级的控制,如合并单元格。
| 左对齐 | 右对齐 | 居中对齐 |
| :-----| ----: | :----: |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |
3.2 转义/ HTML等
\
反斜线转义字符用来显示特定的符号,这个用法在一些程序语言里非常常见。
另外Markdown还支持许多HTML元素的显示,但不是特殊情况一般不用,毕竟是用来方便我们写作的,没必要搞些特别复杂的东西,要求太高的话出门右拐LaTeX左拐Word欢迎你。
- 1.ROGALSKY T P. Acceleration of differential evolution for aerodynamic design[M]. 2004. ↩
- 2.DE TAVERNIER D, FERREIRA C, BUSSEL G. Airfoil optimisation for vertical‐axis wind turbines with variable pitch[J]. Wind Energy, 2019, 22(4): 547–562.] ↩