Markdown 语法与编辑器调研
创建于:2025年3月7日
使用 Deep Research 回答 Chat01
创建于:2025年3月7日
使用 Deep Research 回答 Chat01
Markdown 语法与编辑器深度调研
你的要求涉及非常详细的 Markdown 语法、编辑器功能细节、导入导出格式、主题以及安装需求等多个方面。我会对每个部分进行深入调研,并将新的补充内容整理到你提供的原始报告中,确保完整性。
在正式开始调研前,我有几个确认点,以确保研究方向完全符合你的需求:
请确认以上调研方向是否符合你的预期,或者有无需要调整或补充的地方?
符合我的预期
好的,我将对 Markdown 语法、编辑器功能细节、导入导出格式、主题以及插件依赖等方面进行深度调研,并将所有补充内容整合到你的原始报告中。由于内容较多,我会按章节分批展示,每部分完成后等待你的“继续”指令再继续下一部分。
我会重点关注以下内容:
我会开始调研,整理完成后将章节化输出供你查看。
1. Markdown 基础语法解析
Markdown 提供了一套轻量级的标记语法,用于格式化纯文本。在这一节,我们将介绍至少 13 种常用的 Markdown 基础语法,包括:标题、段落、换行、强调(斜体/粗体等)、列表、代码、引用、链接、图片、表格、任务列表、删除线、脚注和数学公式。并说明不同 Markdown 标准(原始 Markdown、GFM、CommonMark、Markdown Extra、Pandoc 等)对这些语法的支持情况,辅以示例代码和渲染差异说明。
Markdown 使用符号 #
标识标题层级:一个 #
表示一级标题,两个 #
表示二级标题,依此类推,最多支持六级标题。例如:
markdown# 一级标题 ## 二级标题 ###### 六级标题
渲染结果:上述内容将分别转换为 <h1>
至 <h6>
HTML 标签的标题文本。原始 Markdown 规范(John Gruber 的版本)和所有后续标准(如 CommonMark、GFM 等)均支持这种 ATX 风格的标题语法。此外,原始 Markdown 还支持另一种 Setext 风格的标题语法:使用下划线形式表示一级或二级标题。例如,一行文本下方紧跟一行 ===
表示一级标题,---
表示二级标题 linux.cn linux.cn 。CommonMark 和 GFM 也兼容这种语法。不过,需要注意 Setext 风格的下划线可能与表格语法产生歧义(见后文表格部分)。
标准支持差异: 标题语法是所有 Markdown 方言的核心功能,在原始 Markdown、CommonMark、GFM (GitHub Flavored Markdown) linux.cn 、Markdown Extra 等各版本中均受支持且行为一致。
段落: Markdown 中通过一个或多个空行来分隔段落。连续的文本行在渲染时会合并为一个段落。如果希望在 Markdown 中另起一段,需要在前一段末尾插入一个空行,然后开始新段落。
换行: 在段落内部强制换行有两种方式:
<br>
。例如:第一行结尾 ␣␣
(两个空格)然后回车,下一行将另起一行。原始 Markdown 的设计中,一个换行符通常不会产生新的 <br>
,需要使用硬换行(两个空格)来明确指示 linux.cn 。GitHub Flavored Markdown (GFM) 在早期曾放宽换行规则(将单个换行也渲染为 <br>
),但在正式规范化后,GFM 基于 CommonMark,实现上仍要求明确的硬换行标记 linux.cn 。
标准支持差异: 所有 Markdown 方言均支持上述换行规则,但对于是否将单个换行视为 <br>
存在差异。一些平台(如早期的 GitHub 评论渲染)会将单一换行也渲染为换行,但CommonMark/GFM 规范要求严格遵循两个空格规则 linux.cn 。在兼容性考虑上,建议使用两个空格或显式的 <br>
标签来确保换行在各平台渲染一致。
强调主要包括斜体和粗体,还有粗斜体等组合形式:
*
或 _
中。例如 *斜体*
或 _斜体_
渲染为斜体。**
或 __
中。例如 **粗体**
或 __粗体__
渲染为粗体。***文本***
)渲染为同时粗体和斜体。以上语法在原始 Markdown 就已定义,所有标准变体对此支持一致。需要注意避免符号与单词直接相连的歧义情况,一般来说,在符号外围加空格可以避免解析错误。CommonMark 规范详细规定了这些符号的识别规则,使解析行为统一 linux.cn 。
标准支持差异: 斜体和粗体属于 Markdown 基础语法,各版本(原始、CommonMark、GFM、Extra、Pandoc 等)均支持。不存在不支持粗斜体的主要实现。但不同实现对一些边界情况(如下划线强调与强调符号嵌套等)的处理有轻微差异,CommonMark 通过明确规则解决了这些歧义 linux.cn 。
Markdown 支持无序列表和有序列表,以及嵌套列表:
-
、*
或 +
作为项目符号。例如:
三种符号效果相同,渲染为 HTML 的无序列表markdown- 项目 1 - 项目 2 - 子项目 2.1 * 项目 3
<ul><li>…</li></ul>
。缩进两个或四个空格可以创建嵌套的子列表。渲染为有序列表markdown1. 第一项 2. 第二项 1. 第二项的子项 3. 第三项
<ol><li>…</li></ol>
。列表项编号在输出时不一定按输入保留序号,通常各实现会自动按顺序编号。原始 Markdown 对列表的支持比较基础,但规则略有歧义(如列表项和段落之间空行的要求等)。CommonMark 对列表的解析更严格一致。GFM、Markdown Extra 等基本沿袭 CommonMark 列表规则。此外,一些扩展支持任务列表(Task List,下述第 1.9 节详述)。
标准支持差异: 无序/有序列表作为基本特性,各标准均支持。不过 Markdown Extra 针对列表增加了一些扩展,如定义列表(Definition List,下文1.8节脚注提及)等 tiiny.host 。任务列表则并非原始 Markdown 所有,实现差异见后。总体而言,普通列表在主流实现间无差异。
Markdown 中可以表示行内代码和代码块:
行内代码 (Inline Code): 使用反引号 `
包裹代码片段。例如:这是 `inline code` 示例
。渲染结果是在行内以等宽字体显示代码片段,并转义特殊字符。
代码块 (Code Block): 有两种方式:缩进式和围栏式。
<pre><code>
中的代码块。需要在前一段落之后有一个空行以区分。~~~
将代码包裹起来。例如:
围栏代码块无需缩进,能够直观地包含多行代码。通常还可在开头反引号后指定语言标识实现语法高亮,例如markdown\`\`\` 多行代码内容 \`\`\`
```python
markdownguide.org 。围栏语法并非原始 Markdown 的一部分,它是在后来的 Markdown Extra 和 GFM 等扩展中引入的 michelf.ca 。CommonMark 和 GFM 现已正式支持围栏代码块 michelf.ca 。Markdown Extra 也支持使用波浪号或反引号围栏代码,并允许在围栏行末添加类名用于指定语言或添加自定义属性 michelf.ca 。例如,以下 Markdown 将创建一个语法高亮的代码块:
markdown```js function greet() { console.log("Hello Markdown"); }
text在支持语言标记的渲染器上,将以 JavaScript 代码高亮显示。 **标准支持差异:** 行内代码和缩进代码块为原始 Markdown 基础功能,所有实现均支持。围栏代码块在 CommonMark、GFM、Markdown Extra、Pandoc Markdown 等**扩展 Markdown**中受支持 [michelf.ca](https://michelf.ca/projects/php-markdown/extra/#:~:text=Markdown%20Extra%20introduced%20a%20syntax,For%20instance) 。Pandoc 等实现还允许围栏代码块指定更多属性(如 `{.html #id}`) [michelf.ca](https://michelf.ca/projects/php-markdown/extra/#:~:text=The%20class%20name%20is%20placed,use%20a%20special%20attribute%20block) 。原始 Markdown (以及未扩展的实现) 若遇到围栏语法,会将反引号视为普通字符,从而在输出中保留原文或产生不期望的结果。如今主流编辑器几乎都支持围栏代码块,但如果目标环境是老旧或简化的解析器,应当回退使用缩进代码块保证兼容。 #### 1.6 引用 (Blockquote) 段落前加 `>` 符号表示引用一段文字。单个 `>` 应用于一个段落,可跨越多行;在每行或每段前添加 `>` 实现包含多段的引用。引用可以嵌套,通过在 `>` 后继续添加 `>`(或缩进)表示更深层的引用层级。 示例: ```markdown > 这是一个引用的段落。 > > 引用可以跨多个段落,并且可以嵌套引用: >> 嵌套的引用内容。
渲染效果:上述将生成一个 <blockquote>
区块,包含所引用的内容。嵌套的 >>
则会产生嵌套的 <blockquote>
。引用内部也可以包含其他 Markdown 元素,比如标题、列表等,只需在每行前都保持 >
前缀。
标准支持差异: 引用语法在所有 Markdown 实现中都支持,表现基本一致。CommonMark 明确了引用可以不必每行都带 >
,只要段首有 >
即可包含整个段落 linux.cn 。少数解析器对于引用内换行的处理有细微差异,但整体兼容性问题不大。
Markdown 使用类似的语法插入超链接和图片:
链接: 格式为 [链接文本](目标URL "可选标题")
。例如:[Markdown指南](https://www.markdownguide.org "Markdown Guide")
会将“Markdown指南”四个字链接到指定网址,并在鼠标悬停时显示标题“Markdown Guide”。还支持引用式链接:先在正文定义 [文本][标签]
,然后在文档其他地方写 [标签]: 目标URL "标题"
,多次重复使用该标签引用同一链接。 markdownguide.org
图片: 格式与链接类似,只是在前面加一个感叹号 !
。如:
会插入一张图片。替代文本用于图片无法显示时替换内容或屏幕阅读器。标题可选。 markdownguide.org 图片的路径可以是相对路径、本地文件系统路径或网络URL。
示例:
markdown这是一个链接:[点击这里](https://example.com "示例链接")。 这是一个图片:
渲染结果:将显示一个可点击的“点击这里”超链接,以及加载指定路径的图片。
标准支持差异: 链接和图片语法是原始 Markdown 核心特性,各版本支持一致。值得注意的是,一些实现(如 GFM)对自动链接有所扩展——在文本中直接出现裸露的 URL 或邮箱会自动转为链接,这在原始 Markdown 需通过尖括号 <http://example.com>
才能实现。GFM 和 CommonMark 都支持自动将 http://...
转换为链接 linux.cn 。图片语法方面,各实现的差异主要在于渲染环境(本地应用是否支持相对路径、本地文件显示等),语法本身无异议。Markdown Extra 与 Pandoc 允许为图片和链接添加额外的属性,例如通过在链接后用大括号写入 {#id .class}
来设置 HTML 属性 michelf.ca (这些属于扩展功能)。总体而言,链接/图片基本语法在各标准下表现相同。
表格语法并非原始 Markdown 的内建功能,但在 GFM、Markdown Extra 等扩展标准中非常常见 linux.cn tiiny.host 。典型的表格语法使用管道符号 |
分隔列,使用一行由-
和可选的:
组成的分隔线来区分表头和表体,并可通过冒号控制对齐:
markdown| 姓名 | 分数 | | :------- | ---: | | 张三 | 85 | | 李四 | ninety |
上例表示一个两列的表格。第一行是表头(“姓名”、“分数”),第二行的 :-------
表示第一列左对齐,---:
表示第二列右对齐 markdownguide.org 。接下来的每一行为一行数据。渲染结果为:
姓名 | 分数 |
---|---|
张三 | 85 |
李四 | ninety |
(“李四”的分数由于拼写错误ninety
无法右对齐为数字,但这里仅作示例)
原始 Markdown: 对上述表格语法不会进行特殊处理,可能会将|
视作普通字符。例如,一些解析器会将第二行的------
识别为二级标题的下划线,把第一行当作一级标题文本,从而渲染出意外的结果(例如 <h2>姓名 | 分数</h2>
)而不是表格。这正是当初增加表格扩展的原因:原始 Markdown 无法直接表达表格。
GFM: GitHub 风格 Markdown 正式将“管道表格”纳入规范扩展。从 2017 年发布的 GFM 规范开始,表格成为 GFM 对 CommonMark 的一个严格可选超集扩展 linux.cn 。因此在 GitHub、Typora、Mark Text、Obsidian 等采用 GFM/CommonMark 的工具中,上述语法渲染为表格。GFM 还支持表格中内容的左右/居中对齐(通过在分隔线两侧加冒号) markdownguide.org 。
Markdown Extra: 由 Michel Fortin 提出的 Markdown Extra 早在 GFM 之前就支持表格语法,语法基本类似(表头下的分隔线是必需的) michelf.ca 。Pandoc Markdown 也支持相同的管道表格语法,并且扩展支持更复杂的表格(如跨行/跨列或所谓“网格表格”),但一般的管道表格已足够使用。
标准支持差异总结:
示例差异:
下面是一段表格标记,在不同标准下的渲染对比:
markdown| Feature | Support in GFM | Support in Original MD | |-----------|:--------------:|:----------------------| | Tables | ✓ (支持) | ✗ (不支持) | | Footnotes | ✓ (部分支持) | ✗ (不支持) |
总之,若需要在所有平台兼容,需确保所用平台支持表格语法,否则可以用纯文本格式表达表格或使用 HTML <table>
。不过目前大多数流行编辑器均已支持表格扩展语法 linux.cn 。
任务列表是一种特殊的列表扩展,在列表项前使用形如 [ ]
或 [x]
标记项目前的复选框状态。例如:
markdown- [x] 已完成的任务 - [ ] 未完成的任务
渲染结果会显示复选框(已勾选或未勾选)和任务描述。这一语法并非原始 Markdown 所有,但在 GitHub 等平台非常常用。GitHub Flavored Markdown正式将任务列表纳入扩展规范 linux.cn 。在 GFM 实现(如 GitHub 仓库的 README、Issues 评论等)中,上述语法会渲染为带复选框的列表项。许多现代 Markdown 编辑器如 Typora、Obsidian 也支持任务列表渲染。Markdown Extra 则不支持任务列表,因为其产生较晚且 Extra 未涵盖此特性。Pandoc 在其 Markdown 中提供任务列表扩展选项(需启用 task_lists
扩展)。
标准支持差异:
[ ]
会被视为普通字符。- [ ]
语法将复选框集成到笔记中。操作上的差异: 一些专用笔记工具(如 Obsidian、Typora)在预览或所见即所得模式下,会将任务列表渲染为实际可勾选的复选框 UI,用户点击可以更改 [ ]
为 [x]
等,这在纯渲染环境(如 GitHub 页面)通常是不交互的(只是静态显示复选框符号)。
删除线通过将文本包裹在双波浪线 ~~
中实现。例如:~~删除线文本~~
渲染为加删除线的文本。这个语法扩展不属于原始 Markdown 核心。GitHub Flavored Markdown将 ~~
删除线纳入其扩展集合 linux.cn 。CommonMark 本身未包含删除线,但作为 GFM 扩展,它在多数实现中可用。Markdown Extra 传统上不支持删除线(Michel Fortin 的 Extra 并未定义该语法)。Pandoc Markdown 支持删除线(Pandoc 把它视为一个常见扩展)。
举例:~~已完成~~
将显示为“已完成”。在不支持删除线的渲染器上,会原样输出“已完成”的波浪线符号。
标准支持差异:
~~
)。~~
解析为<del>标签)。~~
)。目前,几乎所有流行的编辑器(Typora、VS Code 插件等)都支持删除线,要确保渲染兼容性,只需确认目标平台是否基于GFM或类似扩展。如果需要在不支持的环境(如某些旧论坛)的Markdown中表达删除线,可以退而求其次使用 HTML 标签 <del>文本</del>
。但大多数情况下 ~~
是安全的扩展标记。
脚注允许在文档中加入附加说明而不破坏主文本流。典型语法由两个部分构成:脚注引用和脚注定义。在正文中使用[^标签]
插入脚注引用标记,在文档的某处(通常是文末)添加对应的 [^标签]: 脚注内容
定义 michelf.ca michelf.ca 。渲染后,正文中的引用会变成上标编号链接,指向页面底部的脚注列表。
示例:
markdown这是一个带脚注的句子[^1],可以有多个脚注[^note]。 [^1]: 第一个脚注的内容。 [^note]: 第二个脚注的内容,可以包含**格式**和[链接](https://example.com)等。
渲染效果:正文“这是一个带脚注的句子^1,可以有多个脚注^2。” ^1^2分别为可点击的上标,链接到底部列出的脚注内容 markdownguide.org markdownguide.org 。脚注内容本身可以包含段落、格式、甚至代码块等(需要在脚注内容换行处缩进以包含多段) markdownguide.org 。
支持情况: 原始 Markdown 并未包含脚注语法。脚注由 Markdown Extra 首创支持 michelf.ca ,Pandoc Markdown 和 MultiMarkdown 也长期支持此语法 tiiny.host 。CommonMark 尚未将脚注纳入核心规范,但很多 CommonMark 实现提供可选扩展;GitHub Flavored Markdown 起初不支持脚注,不过 2021 年 9 月 GitHub 宣布开始支持 Markdown 脚注语法 github.blog github.com (尽管 GFM 正式文档尚未更新,该功能已在 GitHub 平台实现)。
标准支持差异:
[^1]
会被当做普通文本显示。^[脚注内容]
在正文中插入脚注,无需定义段落)。Pandoc 的脚注功能很强大,输出可以转换为 LaTeX 等格式的脚注。[^]
语法,点击脚注编号会跳转到底部显示参考内容。根据一份对流行编辑器的对比:VS Code 需要安装 “Markdown All in One” 插件才支持脚注渲染,Obsidian 和 Typora 原生支持,Zettlr 需在设置中开启,部分不支持(如 Leanote 当前不支持脚注) thelinuxcode.com 。总之,脚注虽非所有 Markdown 方言原生具备,但在支持 Markdown Extra 或 GFM 新扩展的环境中越来越常见。如果需要兼容不支持脚注的平台,可采取降级措施(例如在正文直接用括号注明参考内容)。
Markdown 本身并未定义数学公式的语法,但在学术写作领域,许多 Markdown 变体引入了 TeX/LaTeX 数学公式的支持:
$...$
包围的内容作为行内数学公式,渲染为类似 LaTeX 的数学模式。如:Euler’s formula: $e^{i\pi} + 1 = 0$
将在渲染后显示为 。$$...$$
包围的内容作为显示数学公式(独立成行、居中显示)。例如:
渲染为块级的数学公式。markdown$$ E = mc^2 $$
需要注意,这里的数学语法实际上不是 Markdown 标准的一部分,而是由特定解析器或渲染器(通常借助 MathJax 或 KaTeX 库)添加的扩展。如:
$...$
行内和 $$...$$
块级公式的支持 gist.github.com (Pandoc 甚至支持复杂的数学环境)。Pandoc 将这些公式转为适当格式(例如 LaTeX 或 HTML+MathML)。$E=mc^2$
只会原样显示而不会渲染为公式(因为安全及实现原因)。一些静态站点生成器会通过插件支持,或建议使用嵌入的数学图片。$...$
中的数学内容。例如 Typora 可在偏好中开启“内联数学”和“块数学”解析;Obsidian 默认支持 LaTeX 公式渲染(使用 $
语法,需确保笔记以 Markdown+MathJax 模式预览)。标准支持差异:
$
会被当作普通字符。例如在标准 CommonMark 渲染器下,$E=mc^2$
输出仍是“”。$
符号识别为数学公式环境 gist.github.com 。$
会自动触发公式模式渲染。示例: 在 Typora 或 Obsidian 中输入:狄拉克 delta 函数:$$\int_{-\infty}^{\infty} \delta(x)\,dx = 1$$
,会立即看到渲染的数学公式。而在不支持数学的纯 Markdown 查看器中,则会看到原始的 $$…$$
字符。
因此,如果目标平台不支持数学扩展,需要借助其他方案(如插入公式图片,或转换为 PDF 时由 Pandoc 处理公式)。但在需要公式的技术文档场景,Pandoc Markdown 是非常有力的选择,它支持公式、引用、书目等众多扩展 tiiny.host 。例如 Pandoc Markdown 可以很方便地将上述含公式的 Markdown 转为 LaTeX 或 PDF,同时正确排版数学符号。
除了上面列举的 13 种,Markdown 生态中还有一些扩展和改进:
<kbd>Ctrl+C</kbd>
可直接在 Markdown 中使用,渲染时不被转义。大多数实现遵循这一约定,除非明确出于安全过滤。渲染为markdown专有名词 : 其定义内容
<dl><dt>专有名词</dt><dd>其定义内容</dd></dl>
。此语法在 GFM 中不支持,但 Pandoc 等实现支持。==文本==
渲染为带背景色高亮的文本。这并非通用标准。Typora 支持此语法,但 Mark Text 在早期版本不支持 linuxjournal.com 。这个高亮功能主要在 Pandoc 和部分编辑器中流行。<u>
可直接嵌入,某些插件也提供类似 [u]文本[/u]
的扩展。:smile:
这样的短代码插入表情符号,会转为相应的 Unicode emoji。许多编辑器也内置该功能,但原始 Markdown 无此特性。综上,Markdown 经过多年的演化,有诸多变体和扩展功能。各标准对语法支持汇总: 原始 Markdown 仅涵盖基本的标题、段落、列表、代码、链接、图片、引用、水平分隔线等有限元素;GitHub Flavored Markdown (GFM) 基于 CommonMark 增加了表格、删除线、任务列表、自动链接等 linux.cn ;Markdown Extra 扩展了表格、脚注、定义列表、缩写等 tiiny.host ;MultiMarkdown 针对学术需求增加了脚注、表格、引用和元数据 tiiny.host ;Pandoc Markdown 几乎囊括以上所有扩展并加入数学公式、文献引用等功能 tiiny.host 。在实际使用中,必须了解所使用的平台或工具采用哪种 Markdown 方言,才能正确使用对应的语法特性 tiiny.host 。下一节将讨论主流 Markdown 编辑器对这些语法的支持和操作差异。
(第1部分完,请回复“继续”以查看第2部分:Markdown 编辑器对比分析) tiiny.host linux.cn