你可能见过这样的文字:标题前多了一个 #,重点两边夹着 **,每行开头还带着短横线。符号还留在原文里,预览窗口却显示出了标题、粗体和列表。Markdown 就是一种用简单符号标记文字结构的写作格式;支持它的软件会识别这些标记,再把内容显示出来。

先看一段带符号的原文
假设你想写一份周末安排,用 Markdown 可以这样输入:
# 周末安排
先完成 **备份**。
- 整理照片
- 检查更新
在支持这些基础语法的预览里,它会显示成下面这样,具体字体和大小由软件决定:
周末安排
先完成 备份。
- 整理照片
- 检查更新
原文里的 # 表示这一行是一级标题,两边的 ** 标记需要强调的内容,通常显示为粗体;每行开头的 - 表示无序列表项。这些符号在上面的代码框里原样保留,是为了让你看清写法;在预览结果里,它们承担了标记作用,不再作为普通文字出现。基础规则可以查阅 CommonMark 规范[1]。
空格和空行也有用。这个例子在 #、- 后各留一个空格,并用空行分开标题、段落和列表。按 CommonMark 的标题规则,# 周末安排 是标题,#周末安排 会被当作普通文字。有些软件接受后一种写法,照着带空格的版本写更稳妥。
软件怎样把符号变成格式
真正把符号变成格式的是软件。它读到行首的 # ,会把后面的文字识别为标题;读到这段文字里的 **备份**,会把“备份”识别为需要强调的部分。识别这些规则的过程叫解析,把结果画到屏幕上叫渲染。
在常见的网页显示流程中,解析器会把 Markdown 转成 HTML。HTML 用标签描述内容的结构,例如标题、段落、列表;浏览器再根据样式显示它们。John Gruber 最初介绍 Markdown 时,就把它定义为方便写作的纯文本格式,以及把这种文本转换为 HTML 的工具。今天谈到 Markdown,通常主要指这套写法,不限定必须使用最初的工具。(参考:Markdown 原始介绍[2])

所以,文件里保存的 **备份** 仍然是几个普通字符。用只显示原文的文本编辑器打开,你就会看到星号;用支持 Markdown 的软件预览,才会看到对应的格式。预览功能可以边写边更新,也可以在你点击预览时再处理。
把文件名改成 .md,也不会让所有软件立刻学会这些规则。扩展名常用来提示“这是一份 Markdown 文档”,显示结果仍然取决于打开它的软件。
为什么有人愿意这样写文章
Markdown 的一个好处是,原文没有经过排版,也比较容易读。看到“周末安排”下面两行短横线,你大致就知道它们是两个事项;需要修改时,直接改文字和标记即可。让原文容易阅读,本来就是 Markdown 的设计目标。(参考:原始语法说明[3])
对写笔记、说明文档或短文章的人来说,这种方式让常用的标题、列表和强调都能在输入文字时完成。你也可以把同一份源文本交给不同的软件显示,不必为每一种界面重新输入内容。这是写作方式上的便利,至于是否顺手,还要看个人习惯和编辑器。
它也有明显取舍。例子里的 # 说明“这里是标题”,没有规定标题必须用多大字号、什么字体;** 标记强调,也没有给文字指定颜色。如果你需要精确安排每一页的位置、复杂的图文混排,单靠这些基础标记就不够了,还要借助软件的排版或导出功能。
选择 Markdown 时,可以先想清楚自己主要在写内容、整理层次,还是在做精细版式。两种任务都合理,只是对工具的要求不同。
同一份文字,为什么显示不同
先看外观。两款软件都识别出了同一个标题,一款显示成蓝色,另一款显示成黑色,这通常是样式不同。在网页中,字体、颜色、间距等外观主要由 CSS 这样的样式规则控制;Markdown 源文本并没有指定这些细节。(参考:MDN 的 CSS 说明[4])
再看语法支持。Markdown 有不同的实现和扩展,某个平台能显示的内容,换个平台未必仍能识别。CommonMark 用更明确的规范减少基础语法的歧义,但不能据此认定所有软件的功能都一致。(参考:CommonMark 项目说明[5])
例如,GitHub Flavored Markdown(常缩写为 GFM)在规范中把表格和任务列表列为扩展。你写的 - [ ] 检查更新,在支持对应扩展的平台上可以显示成带勾选框的事项;不支持的地方可能仍保留方括号。不能因为某个编辑器能用,就把它当成所有 Markdown 软件都会的功能。(参考:GFM 规范[6])

遇到格式没生效时,可以先检查两件事:当前窗口是否开启了 Markdown 预览,以及这款软件是否支持你用的语法。如果只是颜色、字号不同,再去看主题或样式设置。这样就能分清,是文字没有被正确识别,还是软件给它换了一种外观。
参考资料
- [1] CommonMark 规范:https://spec.commonmark.org/0.31.2/
- [2] Markdown 原始介绍:https://daringfireball.net/projects/markdown/
- [3] 原始语法说明:https://daringfireball.net/projects/markdown/syntax
- [4] MDN 的 CSS 说明:https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/What_is_CSS
- [5] CommonMark 项目说明:https://commonmark.org/
- [6] GFM 规范:https://github.github.com/gfm/