Markdown语法

1 简介
Markdown是一种轻量级标记语言,语法简单排版简洁,高度自由,可移植性强且不必担心版本兼容问题。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF、Word以及本身的 .md 格式文件等等。由于John Gruber的原始设计文档中概述的基本语法主要是为了应付大多数情况下的日常所需,无法满足一些专业领域的需求(图表、公式、流程图等),一些个人和组织开始通过添加其他元素(例如表,代码块,语法突出显示,URL自动链接)来扩展基本语法,这类语法被称为扩展语法。扩展语法因Markdown应用程序的不同而各异,本章侧重于 Typora 的扩展语法介绍。

2 基本规范
2.1 标题
在字段前面添加井号(
#
)来创建标题 。"#" 的数量代表了标题的级别,标题共有一到六级。
不同的Markdown应用程序处理 "#" 与标题之间的空格方式并不一致。为兼容考虑,在 "#" 和标题之间应插入一个空格。
标题字段末尾空一格键入任意数量的 "#" 对标题无影响。
对于一、二级标题,除了用 "#" 标识外还可在标题字段下方添加至少三个等号(
=
)或减号(-
)以标识一级标题或二级标题。

2.2 段落
要创建段落,应使用一行空白行将上下两段进行分隔(<p>...</p>)。若不空行则生成换行(<br/>)。
段首开头不建议进行缩进。Markdown的段落段首不能有超过一个空白字符(空格、制表符等)。若段落开头有超过四个空格或制表符,该行文本会被生成代码块(<pre><code>...</code></pre>)而非段落(<p>...</p>)。(空格的具体后果因Markdown应用程序的不同而各异)

2.3 换行
在行末添加两个或多个空格,然后键入回车,即可在不产生新段落的情况下创建换行(
<br/>
)。在行末添加换行标签(
<br/>
)亦可换行。还有两种大多数编辑器都不支持的方案:第一,结尾用反斜杠(
\
)换行;第二,直接键入回车换行。
2.4 强调
2.4.1 粗体
在字段前后各添加两个星号(
*
)或两个下划线(_
)以标识该字段被设为粗体。不同的Markdown 应用程序在处理单词或短语中间的下划线上并不一致。为兼容考虑,请使用星号。

2.4.2 斜体
在字段前各后添加一个星号或一个下划线以标识该字段被设为斜体。同样,为兼容考虑,请使用星号。

2.4.3 粗体加斜体

尽管能够任意组合,但仍然建议交替使用。
2.4.4 删除线
在字段前各后添加两个位取反运算符(~
)以标识该字段被添加删除线(<s>...</s>
)。

2.4.5 下划线
用HTML标签(<u>...</u>
)设置字段的下划线。

2.5 引用
在一行前添加一个右小于号(
>
)以标识此行内容被设为引用(<blockquote>
)。
在段落的首行前添加 ">" 则无论该段其他行前是否有 ">" 这一整段均会被设为引用。
因此为避免后文也被引用,须空一行再写后文(段落之间本来就有空行)。引用可以包含多个段落,在空行前面也加上小于号,将各段连起来即可。
嵌套块引用
连续 n 个 ">" 一块写代表 n-1 层嵌套引用
。

2.6 列表
2.6.1 有序列表
在每个列表项前添加数字并紧跟一个 英文句号(
.
) 或 ")
",并用一个空格与之间隔。
为兼容考虑,请使用英文句号。前缀的数字不必按顺序排列,最终生成的列表的编号和数字没有绝对关系,
无论怎样编写,结果总是从首项的数字开始向下依次增加。

2.6.2 无序列表
在每个列表项前面添加星号(
*
)或减号(-
)或加号(+
),并用一个空格与之间隔。尽管 "*", "+", "-" 可以混合使用,但仍然建议一表只用一种,从一而终。

2.6.3 任务列表
在无序列表项的前缀与列表项之间插入 "[ ]
" or "[x]
" 标识该字段未被选中或已选,且与列表项的前缀和列表项之间都间隔一个空格。

2.6.4 在列表中嵌套元素
几乎所有的元素都可用于嵌套,这里仅举几例。

2.7 代码
行内代码:在代码块的两端分别加上至少一个反引号(
`
),且前后数目须一致。
若代码内也包含了连续 n 个反引号,则外层用 n+1 个反引号来框定,且代码中的反引号与用于框定的反引号之间必须有字符相隔。将文本的每一行缩进至少四个空格或一个制表符,这些文本会变成代码块。
围栏代码:在代码块的首尾两端分别加上至少三个反引号或波浪号(
~
),且前后数目须一致,首端符号末还应加上代码块的编程语言。
其也支持嵌套:"`" or "~" 个数多的在外层,最内层为个数3。(此项因Markdown应用程序的不同而各异)

2.8 分隔线
一行只存在连续三个或以上星号(
*
)或减号(-
)或下划线(_
)会被生成分隔线(<hr/>
)。"*", "+", "-" 不能混合使用。
在使用分隔线时应分别与上下文空一行空行(避免减号与上文形成二级标题,亦使代码更简洁)。

2.9 链接
构成:
[显示名](链接地址 "链接标签")
,标签可选(可放在双引号或单引号或括号中)。
对应的HTML代码:<a href="链接地址" title="链接标签">显示名</a>
。无标签链接:
<链接地址>
链接的格式化
链接地址可为 URL or 邮箱地址 or 文件地址等等。
即使单独写出链接地址,一些Markdown应用程序仍会自动解析代码中的链接并生成无标签链接。
如果不希望自动转换可将其写成行内代码的形式。

内部链接:将
href
设置为文档内的某一个标题,这将创建一个书签,允许您在单击后跳转到该部分。Html格式:
<a href=#标题>显示名</a>
(标题里的空格要替换为减号)
Markdown:[显示名](#标题)
参考链接:
[标识符][id]
(两个中扩号间可有一个空格)在任意位置写[id]: 地址 or 标签
(冒号后有空格)隐式链接名称的快捷方式:在链接处写标识符后跟一个空的方括号,此时链接本身将用为标识
[标识符][]
然后再任意位置写[标识符]: 标签或地址
(冒号后有空格)(注:因为锚点的定义为
# 名字
,显然与标题冲突,因而书签只能用于跳转到标题。
或者用<a name="target"></a>
来定义锚点来锚定图片段落等,但一些Markdown应用程序不兼容非标题元素的锚点。)
2.10 插入图片
在链接的格式前加上感叹号(!
)然后将链接地址换成图片地址即可,亦可带上标签。

2.11 转义字符
要显示原本用于格式化 Markdown 文档的字符,请在字符前面添加反斜杠(
\
)进行转义。若文本中有HTML代码,还应考虑HTML的特殊字符的转义。

2.12 内嵌 HTML 标签
对于 Markdown 涵盖范围之外的标签,可以直接在文件里面用HTML标签进行处理且无需要额外声明。关于HTML的语法本章不做介绍。
2.13 注释
因为Markdown支持内嵌HTML,自然也就可以用<!--注释内容-->
的形式进行注释。一些Markdown应用程序还支持<?注释内容>
形式的注释。
2.14 表格
使用竖线(
|
)来分隔不同的单元格,使用至少三个减号(-
)来分隔表头和其他行,减号的多少依据单元格长度而定。在减号两端添加冒号(
:
)可控制内容和标题对齐方式::---:
居中对齐:---
向左对齐---:
向右对齐

2.15 脚注
在需要脚注的地方添加脚注参考:
[^标识符]
(标识符可以是数字或单词,但不能包含空格或制表符,标识符将脚注参考与脚注本身相关联)。在文中任意位置(建议于文末)添加脚注本身:
[^标识符]: 脚注内容
。在导出为其他格式时,无论脚注本身是否在文末,都会被移至文末,并按脚注在文中出现的顺序排序。

3 扩展语法
3.1 定义列表
一些Markdown应用程序允许创建术语及其对应定义的定义列表。要创建定义列表,则在第一行上键入术语。在下一行,键入一个冒号(:
),后跟一个空格和定义。

由于 Typora 不支持定义列表,此处展示的是在 Pycharm 中的渲染结果:

3.2 标题ID
许多Markdown处理器支持标题的自定义ID一些Markdown处理器会自动添加它们。
添加自定义ID允许您直接链接到标题(可使用CSS对其进行修改)。
格式:# Heading level n {#ID}
(花括号内不应有空格或制表符),对应的HTML为<hn id="ID"> Heading level n</hn> n∈N,n∈[1,6]
不是所有的Markdown应用程序都能以ID做锚点关联书签。
3.3 上标、下标与高亮
用三角号(
^
)需要上标的字段两端包围用波浪号(
~
)将需要下标的字段两端包围用等号(
=
)将需要高亮的字段两端包围

3.4 LaTeX公式
对于行内公式(内连输出),只需用美元符号(
$
)将字段两端包围对于行间公式(块状输出),则用连续两个美元符号(
$$
)将字段首尾包围公式用LaTeX书写, 数学公式转LaTeX:https://www.latexlive.com/ ↩
本章不进行LaTeX语法介绍。

3.5 图表
在围栏代码的格式上,将编程语言声明为 mermaid
即可得到一张空图,在其中写入Mermaid语言即可生成相应的流程图、甘特图、时序图、饼图等。

3.6 Emoji表情
在Markdown里使用Emoji表情有两种方法,一种是直接输入Emoji表情,另一种是使用Emoji表情短码(网上自查)。

4 附录
笔者不建议将本章作为首次学习 Markdown 的教材,推荐各位按照本文章的结构对知识进行梳理,以期温故而知新。笔者水平有限,行文若有谬误者欢迎指出交流。
2023/08/27 20:45:45