翻译-Markdown是一场灾难:原因及替代方案
原出处:Markdown 是一场灾难:原因及替代方案
原作者:karl-voit, 2025-08-17
翻译:DeepSeek V3
本文旨在——但愿够格——批判将 Markdown 作为轻量级标记语言(LML)使用的现象,其实有更适合完成相同任务的其他 LML 存在。
我十分清楚 Markdown 是目前该领域使用 最 广泛的语法。其普及程度之高,以至于多数人认为 Markdown 是唯一的轻量级标记语言。
我的观点是,对于轻量级标记语言应用而言,Markdown 是一种糟糕的语法选择。我认为自己持有充分的论据支持这一观点。同时我也会推荐设计更合理的轻量级标记语言替代方案,这既能简化你的个人数字生活,也能惠及即将学习主要标记语言的众多使用者。
我会尝试从基础概念开始解释所有内容。此外,我会将所有解释置于特定语境中,以便非技术背景人士也能理解。当然,如果你已经了解文件格式等概念,完全可以跳过相关章节。
- 为何我要费心探讨?
- 为何你应当关注?
- 你将在这里学到的内容
- 什么是轻量级标记语言(LML)?
- Orgdown:另一种LML选择
- 我还是不明白LML是什么意思
- LML 的主要特性
- 那么现在该怎么办?
- Markdown 的起源
- Markdown 的变体
- Orgdown 与原版 Markdown 的对比
- Markdown 对人类阅读友好
- Markdown 对人类学习不友好
- Markdown 对人类输入不友好
- Markdown 难以被工具处理
- Markdown 已无药可救
- 有哪些替代方案?
- Orgdown 作为替代方案之一
- 总结
- 相关观点
(太长不看版:除了 Markdown 的其他设计问题外,由于存在各种不同风格的 Markdown 变体,实际使用中会遇到太多问题,而设计更好的轻量级标记语言提供了更优替代方案,且工具支持几乎相当。因此你无需改变现有工作流程,只需切换到更好的语法即可。)
1. 为何我要费心探讨?
在我的商业工作中,每天都需要多次使用不同的基于 Markdown 的工具。而在个人生活中,尽管基于本文提到的论点我希望尽量减少接触,但依然避不开 Markdown 的身影。
此外,出于对个人信息管理(PIM)的兴趣,我的目标之一就是帮助人们找到适合工作的工具。当使用优秀的技术解决方案替代糟糕或平庸的方案时,我确实能获得某种个人满足感。
在使用 Markdown 相关流程长达多年之后,我深切体会到了与之相关的痛点。与大多数人不同,我实际上能识别并意识到那些被人们视为理所当然、甚至默认别无选择的细微问题。
根据我的经验,许多 Markdown 替代方案并不存在与 Markdown 相关的那些缺陷。由于大多数人没有接触过这些替代方案,网络上关于 Markdown 实用性的讨论最终演变成我试图推广替代方案,而其他人似乎认为我想剥夺他们的轻量级标记语言工作流,代之以可能更不适合的技术方案——比如文本处理、文字处理、复杂标记语言之类。
部分讨论确实发生在社交媒体平台上,由于篇幅限制和必要的精简要求,我无法完整表达和传递观点。因此我筹划这篇文章已久,以便能直接分享链接,而非在短消息平台上徒劳地阐述论点。
当所有论点都以完整篇幅呈现于此,你便能自行判断这些论点和影响是否适用于自身情况。当然,无论结果如何,你完全有权利继续偏爱 Markdown 语法。你的选择,你的数据,你的付出,你的未来。
不过你可能会发现,这里提到的某些问题同样会影响你的工作流程,渐渐地你或许会认同我的观点:Markdown 在这里根本算不上最佳选择。;-)
我的最终目标是让他人决定的 Markdown 接触量降至最低限度,这样我就能用设计更优良的语法语言来替代它。
2. 为何你应当关注?
通过使用 Markdown 语法记录信息,你实际上为这些信息的未来(重复)使用限定了形式。若这种选择对你自身数据的处理产生负面影响,你将感受到日益明显的局限性。当你的知识库中存在大量以某种 Markdown 格式编写的内容时,将其转换为更合适的格式会引发越来越多的问题——随着手动检查等环节的增加,转换工作量呈线性增长。假设转换单份文档需要十分钟,那么知识管理系统中的一千份文档将耗费你整整一个月的全职工作时间。而对于长期维护的知识管理系统而言,千份文档的规模根本算不上庞大。
如果你认同这里提到的某些问题,那么你就是在耗费自己的时间来处理变通方案、修复、不必要的转换等等。
然而,我最关键的论点并非关乎你自身和你的数据。最重要的论点是针对大多数 Markdown 用户的:那些将来会开始学习并使用轻量级标记语言的人。那些现在年纪尚幼的人,那些甚至尚未出生的人。
因此,当我提到学习 LML 语法相关的问题时,你不应该只考虑自己——毕竟你很可能已经通过适应克服了某些语法怪癖。实际上你还应该考虑所有未来需要投入学习精力的人们。所以,缺乏一致性和逻辑性正是我在此最重要的论点之一。
为确保我们理解一致:我并非要否定使用 Markdown 这类轻量级标记语言实现的优秀工作流程。我只是想指出,通过使用设计更完善的轻量级标记语言,同样可以实现这类工作流程。
遗憾的是,这里提到的一些问题看似非常细微琐碎,但其影响却不容忽视。随着轻量级标记语言日益普及并在各类工具中广泛应用,我们确实应该确保所选用的标记语言足够优秀——这无关个人好恶。
3. 你将在这里学到的内容
- 什么是 LMLs?
- 为什么 LML 是个绝妙的主意?
- 如何使用 LML?
- 为何最主流的轻量级标记语言是个反面教材
- 替代方案(举例说明)
4. 什么是轻量级标记语言(LML)?
我认为「轻量级标记」或「轻量级标记语言」这个术语并没有严格的定义。因此,我倾向于参考维基百科等常见来源。截至 2025 年 5 月 10 日,英文维基百科关于轻量级标记语言的词条这样写道:
轻量级标记语言(LML) ,亦称 简易 或 人性化标记语言 ,是一种语法简洁、无侵入性的标记语言。其设计初衷是让用户能够使用任何通用文本编辑器轻松编写,并以原始格式直接阅读。轻量级标记语言适用于需要同时阅读原始文档与最终渲染输出的应用场景。
我完全赞同这一观点。
然而,维基百科词条后续在未明确说明的情况下,又提及了 HTML 和 LaTeX。为免歧义,特此说明:根据本文定义,轻量级标记语言特指维基百科词条后文列举的语法类语言,例如 Markdown 等。
包括 AsciiDoc、atx、BBCode、Creole、Crossmark、Djot、Epytext、Haml、JsonML、MakeDoc、Markdown、Org-mode、POD(Perl)、reST(Python)、RD(Ruby)、Setext、SiSU、SPIP、Xupl、Texy!、Textile、txt2tags、UDO 和 Wikitext。
在我看来,非轻量级标记语言(LML)的语法体系:HTML、XML、(La)TeX 这类「复杂」标记语言,其输入操作远谈不上轻松简便。
5. Orgdown:另一种LML选择
此外,我想补充一个关于 Org-mode 语法特性的个人见解:"Org-mode"实际上包含两个不同层面的含义:
- 一个 Elisp 实现,用于支持文本处理,如添加新标题、折叠/展开章节等
- 一种 LML 语法,由上述 Elisp 实现进行解析
这导致了许多讨论中的大量困扰。因此,我为 Org-mode 的语法提出了一个不同的名称。这种 LML 应被称为「Orgdown」。
我已在这篇博客文章中详细阐述了我的动机及其他内容。因此请注意,为简化和明确此处的讨论,我将使用「Orgdown」而非「Org-mode 的语法」这一术语。我强烈建议您遵循此例,以避免此类误解。
本文有时会将 Markdown 与 Orgdown 进行比较。这是因为我个人偏爱的轻量级标记语言是 Orgdown。但 您不应认为 Orgdown 是 Markdown 唯一的替代方案 。只是由于我个人主要使用这种特定语法,因此在讨论相关概念时,我会很自然地举出 Orgdown 的例子来进行说明。
即便你永远不会亲自使用 Orgdown,本文的核心理念依然成立——任何其他没有 Markdown 缺陷的轻量级标记语言都适用。
6. 我还是不明白LML是什么意思
哦,没错。刚才列举了不少名字。但如果你没用过其中任何一种语言,你可能还是不明白 LML 是什么,以及它们如何为你的工作流程提供卓越服务。
别担心。我会在本文中简要说明核心理念:FIXXME: 尽快完成并链接我的文章 ;-)
The Main Characteristics of an LML
7. LML 的主要特性
对我来说,一种轻量级标记语言最重要的特性包括:
- LML 对人类而言 易于阅读
- LML 对人类而言 易于掌握
- LML 易于人工输入 (或由工具生成)
- LML 对工具而言 易于处理
这非常重要。因此,让我们花些时间逐一解释。
7.1. LML 对人类而言易于阅读
用轻量级标记语言编写的文本信息应该易于阅读,即使对完全不了解这类语言存在的人也是如此。
这或许是任何轻量级标记语言(LML)都需要满足的最重要标准。简而言之,LML 是一种约定俗成的文本元素格式化方式。如果连这一点都做不到,那么其最根本的用途就无法实现。迄今为止,我所见过的几乎所有 LML 都具备这一特性,Markdown 也不例外。
7.2. LML 对人类而言易于掌握
我想强调可学习性对我而言为何如此重要。试想如今有多少人正在使用轻量级标记语言。
有个数字概念吗?
好的,现在想象一下未来会使用 LML 的人数。想想看。所有人。从现在开始直到你想象的尽头。
也得出一个数字了吗?
如果你没得出第二个数字远高于第一个的结论,我反而会感到惊讶。既然如此,显然需要学习当前 LML 规范的人数将远超迄今为止使用过它的人数。
让我们以另一个更明显的学习曲线为例。
假设你花了数年时间学习一门特定的编程语言。凭借这些知识和经验,你能够轻松完成该语言的基础任务。你不再需要考虑那些形式化的模板代码,也不必过多纠结于编程语言的语法细节。你可以将注意力集中在源代码需要解决的实际问题上。
对于使用 LML 这类简单工具的用户来说,同样存在这种问题。如果 LML 设计得不好,你首先需要死记硬背一些规则,这样才能从一开始就不混淆那些不太直观的内容。
然而,如果你已经过了那个阶段,千万别忘记有些功能从一开始就不那么直观。你只是适应了这个工具,却忘记了最初使用它时的感受。
这正是我的观点:讨论轻量级标记语言设计时,必须站在初学者的立场思考。即便这项技术给你留下了极其简单的印象。即便你曾是掌握这套规则的人,如今看来那些规则对你已微不足道。
可学习性如此重要的另一个原因在于人们并非每天都接触某些事物。当你每年只做一次报税时,很可能需要一些指引、些许帮助或书面流程,以免遗漏什么——你懂的。但对税务会计师而言,同样的任务却微不足道。他们不需要这些辅助工具。手头的工作如此熟悉,完全可以独立完成。
回到 LML 的话题上,对于每年只更新一两次 Markdown 文档的人来说也存在类似问题。他们可能会忘记如何编写标题、项目列表的格式规范,或是带描述的 URL 该如何呈现。
因此,在比较轻量级标记语言时,易学性也至关重要。而这通常是轻量级标记语言专业人士容易忽视的方面——因为他们对当前使用的语言已太过熟悉,以至于忘记了初次接触该语言用户的体验。
优秀的 LML 设计需要将其用户的认知负担降至绝对最低。
7.3. LML 易于人工输入
LML 最初的构想之一就是用于手动编写电子邮件。我确实认为广泛采用语法约定会是个绝佳的主意。
既然我们本应在任何地方都能使用轻量级标记语言,那么幻想存在能完美辅助插入新标题、扩展表格、重新格式化列表等操作的工具支持,恐怕是不切实际的。
(例外情况:Emacs 凭借其极高的灵活性和多功能性,确实能在任何文本输入场景提供工具支持,不过这又是另一个话题了。)
因此,一个设计良好的轻量级标记语言必须便于人工输入,即便完全没有任何工具支持也应如此。
你可能需要在多种不同场景下使用它,比如撰写邮件、编写书籍、填写网页表单等等。
如果 LML 没有针对便捷输入进行优化,这种额外的手动操作将一直困扰着你,即使你已经妥协并且不再意识到这一点。;-)
7.4. LML 对工具而言易于处理
最后同样重要的是,使用轻量级标记语言(LML)编写的格式化文本信息往往并非「一次编写,仅供人类阅读」那么简单。
它可以,但不该仅限于此。
例如,如果你的知识库确实是用某种特定标记语言编写的,而你又想就这个主题写博客,那么能够毫不费力地将文本复用于其他场景会非常有用。
即便你从未考虑过在其他场景复用文本内容,保留这种可能性对未来的你而言也极具价值。
典型的工作流程如下:
- LML:你可以用 LML 语法格式自行编写文本。
- 转换器/生成器:使用工具读取文本并将其转换为所需的另一种格式。
- 最终结果:可能是,例如网页的 HTML 页面、PDF 文件、ODT/docx 文档或电子书(epub 格式)。
基本原则是:当文本在不同情境中被重复使用时,不应进行人工重写。如果你无法复用知识库中的文本,就不应该将其发布为博客文章。如果你想写书,若笔记片段已具备出版质量却无法最大限度复用,这种做法是低效的。
信息复用需要尽可能顺畅无阻。
如果 LML 的设计增加了额外工作量,它就失去了存在的意义。
8. 那么现在该怎么办?
在前面的章节中,我已经总结了一个设计良好的轻量级标记语言需要涵盖哪些基本特性。
我的个人经验是,Markdown 作为当下使用最广泛的轻量级标记语言,在大多数特性上都表现欠佳。
在接下来的章节中,我将解释为何会得出这个颇具争议的结论。
请务必记住:我并非要剥夺您使用轻量级标记语言的工作流程。只是认为,若您能改用比 Markdown 更优秀的轻量级标记语言,将会获得更愉悦的体验。
9. Markdown 的起源
了解 Markdown 的早期发展历程很有帮助。
据我所知,这是最早公开提及 Markdown 的文献之一:2004 年 12 月 17 日发表在 Daring Fireball 上的一篇博客文章。
它还附带了一个语法示例文件:https://daringfireball.net/projects/markdown/syntax.text
该定义包含以下语法元素:
- 内联 HTML
- 「对于 Markdown 语法未涵盖的任何标记,你只需直接使用 HTML 本身。」
- 段落
- 多种标题类型
- Setext 风格的标题如下:
1st level heading
=================
2nd level heading
-----------------
- 封闭式 Atx 风格标题(前后均带井号)
,# first level heading #
,## 2nd level heading ##
- 开放式 ATX 风格标题(前置井号字符)
,# first level heading
,## 2nd level heading
- 引用(使用 > 字符)
- 列表(使用 *、+、-、1. 及 HTML)
- 代码块(缩进≥4 个空格或≥1 个制表符)
- 水平分割线(使用≥3 个连字符、星号或下划线)
- 网页链接
- [an example](http://example.com/ "Title")
- 自动链接: <http://example.com/>
- 文件链接
- [a sub directory](/subdir/)
- 参考式链接
[an example][myid]
[myid]: http://example.com/ "Optional Title Here"
- 链接 URL 可以选择性地用尖括号括起来
- ID 不区分大小写
- 隐性链接:
[myid][]
- 强调(包括词内强调)
,*em* or ,_em_
,**strong** or ,__strong__
- 代码
- 段落中的单反引号
- 可选的多重反引号
- 图片引用

- 使用反斜杠转义上述字面字符
就这些吧。
写邮件和简单文本文档确实够用了。这点我承认。
10. Markdown 的变体
然而,当涉及许多其他场景时,人们需要更多语法元素。
灾难就此开始蔓延。一些在工具中采用早期 Markdown 的开发者开始 扩展语法,添加新的语法元素 。某个应用增加了脚注功能,另一个则添加了标题内部链接,还有的应用增加了更多处理源代码的选项,更有甚者添加了其他五花八门的功能。
而且没有人将这些语法扩展「合并」回原始源代码。你懂的。
这样一来,我们确实拥有了一系列所谓的 Markdown 「变体」。
Markdown Monster 工具识别出 24 种不同的 Markdown 变体。而实际存在的 Markdown 变体数量很可能远超这个数字,这丝毫不会令人惊讶。
市面上有许多工具——比如当下热门的 Obsidian——通过可选插件提供功能扩展。其中部分插件还会引入自己专用的语法元素。若想妥善复用这些元素,在格式转换时自然也需要处理这些特殊语法。遗憾的是,这些私有语法扩展确实让情况变得更加糟糕。因此,即便你使用的是人类可读的文本,使用这类插件最终仍会导致某种形式的 锁定 。可悲的是,大多数人往往要等到遭遇信息损失时,才会意识到这个问题。
以下是维基百科关于 Markdown 条目中的一段引文:
Markdown 最初的描述存在模糊之处,引发了许多悬而未决的问题,导致各种实现版本有意或无意地偏离了原始版本。这一问题在 2014 年得到解决,当时长期参与 Markdown 开发的贡献者们发布了 CommonMark——一个明确的 Markdown 规范及测试套件。
确实,曾有人尝试统一或标准化 Markdown。但由于普遍规律的存在,这反而催生了更多变体版本。
在日常工作中,诸如 MultiMarkdown、Markdown Extra、CommonMark 等 Markdown 标准规范并未发挥特别重要的作用。真正重要的是由 pandoc 或 GitHub 风味 Markdown(GFM)等工具确立的隐性标准——后者也被 GitLab 所采用。
11. Orgdown 与原版 Markdown 的对比
为了让您了解 Orgdown 中那些不属于原始 Markdown 的语法元素,我从这份语法概览中摘录了部分内容:
- 上标/下标
- 下划线文本
- 斜体文本
- 原样文本
- 删除线文本
- 表格
- 复选框/内联任务
- 抽屉/属性中的元数据(键/值)
- 非代码块或行内 HTML 的其他区块:引用、诗句、示例、LaTeX 公式等…
- 注释(区块或行内)
- 标题标签
- 优先级标记
- 标题任务状态
- 标题引用
- 时间戳、日期戳
- 宏指令
要知道,其中一些功能在文本写作中远不止是锦上添花。当你将其他轻量级标记语言与原始 Markdown 定义进行比较时,很容易就能列出一份类似的清单。这绝非 Orgdown 特有的问题。
有鉴于此,我认为 Markdown 作为一种轻量级标记语言是极其糟糕的选择:
12. Markdown 对人类阅读友好
好吧,如果 Markdown 在这里也会失败,那它现在很可能就不会有这么显赫的市场地位了。
那么让我们把注意力集中在这里的其他方面。
13. Markdown 对人类学习不友好
多次讨论中我发现,长期使用 Markdown 的人往往难以理解本文的论述逻辑。究其原因,我认为是他们已无法代入 Markdown 初学者的视角。若您此刻仍感困惑,建议重读前文"人类易于掌握 LML"章节。
为优化学习效果,保持 一致性 是关键。
新用户若发现实际效果与预期不符,往往会感到沮丧。当 Markdown 语法仅由人工编写且仅供人工阅读时,这并不构成问题。真正的隐患往往在文本撰写完成很久之后才显现——当工具对 Markdown 进行解析后处理时。
初次学习某事物时,不一致性显然是个障碍。然而,不一致性还有另一个弊端:它会干扰已掌握知识的正确提取。
因此,如果某些内容存在不一致性,不仅会在你学习时带来困扰。当你试图应用已掌握的知识时,若需要记忆这些不一致的内容而非运用人类大脑与一致的 LML 设计逻辑,同样会造成挫败感。
让我们通过一些语法示例来讨论 Markdown 的不一致性。
13.1. MD 不一致性:带描述的 URL
在 Markdown 中插入简单 URL 非常容易:https://karl-voit.at 几乎在所有 Markdown 应用中都会被转换为可点击的链接。
https://Karl-Voit.at
如你所见,无需使用任何特殊字符来标记 URL。
当有人想要插入带有描述文本的 URL 时,问题就变得棘手了。
在我看来,最主要的问题在于 URL 部分。因为你可以像上面展示的那样直接使用简单的 URL 链接,描述文字完全是可选项。
所以当你需要插入带描述的链接时,就必须添加一些固定格式。不知为何,Markdown 要求这种固定格式包含不同类型的字符:既需要圆括号又需要方括号。
我不明白为什么 Markdown 设计者认为这种设计是合理的——明明通过位置就能区分 URL 和描述文本。
无论如何,当你为 Markdown 的 URL 添加描述时,你会得到:
(https://Karl-Voit.at)[My webpage]
哦。还是说反了?
[https://Karl-Voit.at](My webpage)
你可能会惊讶,当我几天没写 Markdown 时,自己也需要经常查阅这些内容。
然后你意识到,在 Markdown 中「URL 是主导部分而描述作为可选第二元素」这个合乎逻辑的假设某种程度上是错误的。实际情况似乎是:在 Markdown 里你应该假设存在一段文本,而 URL 只是可选的附加内容。这本身没问题,但至少在我看来,这种思维方式与简单的 URL 语法元素存在冲突。
因此,Markdown 中带描述的正确 URL 语法是:
[My webpage](https://Karl-Voit.at)
是的,你先写描述,再写网址。先用方括号,再用圆括号。
希望你现在能理解为何我认为 Markdown 中的 URL 语法不够直观。
这不仅仅是我个人的感受。这种令人恼火的 Markdown 网址语法设计早已成为网络迷因。
想找点乐子的话,不妨猜猜看如何在 URL 中添加替代文本或标题。我猜大多数 Markdown 用户如果不是天天写这个,恐怕都得查一查才知道。
但还有一些其他语法元素我也觉得存在问题。
13.2. MD 不一致性:标题
如果你刚接触 Markdown,我敢打赌你在阅读「Markdown 的起源」这一节时,一定会对我提到的标题有不止一种写法感到困惑。
我猜最初的想法是存在不同的惯例,而原作者不想完全推翻至少部分旧有惯例,因此(仅)在标题方面保留了一些灵活性。
因此,所有这些例子在原始形式下都是有效的 Markdown。
1st level heading
=================
Some text.
2nd level heading
-----------------
Some text.
我需要使下划线字符数量与标题行长度匹配吗?是或否?
那么第三级标题呢?我想如果你选择了这些标题类型,就意味着只要不把所有标题转换成其他形式之一,这份文档就不能有第三级标题。
= first level heading =
Some text.
== 2nd level heading ==
Some text.
=== 4rd level heading ===
Some text.
[...]
嗯,这样好多了。
但如果结尾的井号数量不同呢?因此,Markdown 最初的作者们将闭合的 atx 风格字符定义为纯粹装饰性的。所以无论你使用多少个字符,它们都会被忽略:
# first level heading ##################
Some text.
## 2nd level heading #
Some text.
### 4rd level heading
Some text.
[...]
哦对,它们毫无用处。所以你也可以直接省略:
# first level heading
Some text.
## 2nd level heading
Some text.
### 4rd level heading
Some text.
[...]
哦,太棒了。那为什么还要提那些可有可无的无用字符呢?要我说,这设计真糟糕。人们可能会误以为需要手动计算开头的字符数量,并相应调整结尾短语。这完全是错误的。或者说毫无意义。简直就是糟糕的 LML 设计。
无论如何,在学习 Markdown 时,它都有可能带来令人沮丧的体验。
你可能满足于使用一种标题类型继续学习。但当你开始使用实际工具处理「Markdown」(具体是哪种变体?)时,会发现手头的工具仅支持 Markdown 的某一种特定标题类型。没错,这甚至是一些工具的常见问题——它们连原始 Markdown 定义的所有语法元素都不支持。
13.3. MD 不一致性:强调
与 Markdown 为标题定义的自由度类似,它也定义了多种强调文本的方式:
*foo* or _foo_ → HTML tag em
**foo** or __foo__ → HTML tag strong
那么所有工具都需要同时支持两者吗?
为何不采用一种变体表示第一种强调,另一种变体表示第二种强调类型?这恰恰体现了过度自由带来的弊端。一个简洁统一的轻量级标记语言设计本应优化必要字符数量并降低歧义程度。
13.4. MD 不一致性:表格
表格在这里是个棘手的话题,因为它们原本并不属于 Markdown 的初始定义范畴(除非通过内联 HTML 实现)。然而 LML 表格实在太过普遍,我不得不在此提及。这些表格在我日常使用 Markdown 时制造了大量麻烦。
这是一个简单的 Markdown 表格:
| Column 1 | Column 2 |
| ------------- | ------------- |
| Cell 1, Row 1 | Cell 2, Row 1 |
| Cell 1, Row 2 | Cell 1, Row 2 |
对于许多使用场景来说,这似乎已经足够。它还具有许多对齐等选项。遗憾的是,某些表格功能也无法通过这种表格语法实现。因此我还需要通过 pandoc 使用网格表格:
+-----------------------+-----------------------+
| Column 1 | Column 2 |
+=======================+=======================+
| Cell 1, Row 1, line 1 | Cell 2, Row 1, line 1 |
| Cell 1, Row 1, line 2 | Cell 2, Row 1, line 2 |
+-----------------------+-----------------------+
| Cell 1, Row 2, line 1 | Cell 2, Row 2, line 1 |
| Cell 1, Row 2, line 2 | Cell 2, Row 2, line 2 |
+-----------------------+-----------------------+
根据表格功能需求,我确实会在不同文档中混合使用这两种表格类型。
在我看来,这也是 Markdown 设计不一致的例证——原始定义中并未加入表格功能(HTML 表格除外),因此衍生出了多种表格语法版本。
14. Markdown 对人类输入不友好
Markdown 难以输入的原因与其难以学习的原因如出一辙。例如,我总是被 URL 语法(顺序、括号类型)搞得晕头转向。
在日常工作中,人们更倾向于使用加粗强调而非斜体。因此,所有需要加粗的内容都必须以两个星号开头,并以两个星号结尾。你可能觉得这太夸张了,但我认为如果能设计出更好的轻量级标记语言,这种重复操作本可避免。
在处理源代码示例时,Markdown 能识别 HTML 标签。此外,你可以在代码段的首尾使用三个反引号。这种方式我也能接受。但有时你需要使用第三种 Markdown 选项:每行开头≥4 个前导空格。具体是否需要采用这种方式取决于你使用的工具或 Markdown 变体。这种情况下,在每行前添加额外字符会非常繁琐。通常 Markdown 编辑器并非优秀的文本编辑器,它们不支持宏命令、列编辑或多光标功能——这些功能本可以简化此类操作。
(注:尽管我试图严格区分 LML 语法与工具支持,但必须指出,我从未见过任何 Markdown 编辑器能提供接近 GNU Emacs 为 orgdown 所提供的工具支持水平。这并非针对 Markdown 语法本身的优劣评判,但确实加剧了我使用 Markdown 工具时的挫败感。)
15. Markdown 难以被工具处理
在许多讨论中,Markdown 广受支持的工具生态常被视为拥抱它的最强理由。而我认为,Markdown 文本无法在其他工具中被正确复用,正是反对它的最有力论据。读到这里,您或许已明白其中缘由。
Markdown 缺乏统一定义。它存在着各种方言版本,不同工具采用不同变体。正如我简单提及过的,部分工具甚至通过可选插件进一步扩展语法,可能引入额外的语法元素。否则就不会出现《10 款不影响纯文本数据的实用#Obsidian 插件》这类文章了。
这些语法元素存在严重问题,因为几乎可以确定的是,当转换为功能更强大的输出格式时,它们所包含的内容都无法得到正确处理。
总而言之,无论你在 Markdown 语法中使用了什么,在确定其能在特定情境下复用之前,你都必须仔细甄别所用的是哪个变体的哪些语法元素。对于所有非简单的文档,我都不愿做这种繁琐的工作。
像 Markdown Monster 这样的工具或许能辅助处理最基本的语法元素。但对于那些你可能知晓或根本不知晓的插件所扩展的语法,它就无能为力了。因此多数情况下,当你试图将某种不完全了解/未明确定义的 Markdown 变体转换为其他格式时,即便使用最优秀的工具支持,仍难以避免数据丢失。
根据手头的工具、信息以及用于格式化文本的语法元素, Markdown 文本可重复使用的普遍承诺只是一种幻想。
我认为这是一种 锁定效应 ,尽管文本是人类可读的并以文本文件存储——对许多人来说这似乎自相矛盾。但如果你不坚持「仅供人类阅读」的理念,这其实并不矛盾。
16. Markdown 已无药可救
对此我进行了一番思考。我无法提出一个既能为整个故事增添另一种 Markdown 变体,又能制定另一种 Markdown 标准的方案。事实上,这正是某些 Markdown 变体存在的根源——总有人试图定义(唯一的)Markdown 语法规范。如果这种做法曾取得成功,我就不会撰写这篇文章了。恰恰相反,在我的个人使用场景中,那些被视为标准的 Markdown 变体,与我日常使用的工具关联甚微。
xkcd 漫画《标准》(知识共享署名-非商业性使用 2.5 许可协议;https://xkcd.com/927)
这就是为什么我认为 Markdown 已经输掉了这场战役。它就是这样了。对于那些坚持使用单一 Markdown 应用,或者至少使用一组语法基本相同的 Markdown 应用的人来说,它可能还行得通。
我并非说这不可能实现。但要说(任何)Markdown 适合作为通用轻量级标记语言的候选方案,这个论点实在站不住脚。
因此我们应该改用通用轻量级标记语言(LML),当文本在支持同种 LML 的不同工具间复用时,无需额外处理。
17. 有哪些替代方案?
那么为了避免 Markdown 的缺点,有哪些优秀的轻量级标记语言(LML)候选方案值得使用呢?
好消息是,目前已有多种轻量级标记语言可供选择。其中许多都是绝佳的替代方案。让我们就此展开讨论。
在我看来,你需要一种初始形态就足够先进的轻量级标记语言,无需外部语法扩展或语法变体就能满足大多数应用场景。
那么,你需要一种 LML,即:
- 人类可轻松阅读
- 人类易于学习
- 人类易于输入
- 工具易于处理
听起来很熟悉吧?;-)
如果你知道有任何标记语言比 Markdown 更能满足这些要求,那就去用吧!你不需要我的建议。实际上你可以就此打住不必往下读了,反正这篇文章也太长了。
以下链接或许能帮助你自行判断:
- 轻量级标记语言:Markdown、reStructuredText、MediaWiki、AsciiDoc、Org-mode - Hyperpolyglot
- 不知为何,作者遗漏了许多确实存在的 Orgdown 选项。我猜她/他对 Orgdown 不太熟悉,只找到了非常简单的语法概述。不过在我看来,这个表格还是挺有用的。
- 不知为何,作者遗漏了许多确实存在的 Orgdown 选项。我猜她/他对 Orgdown 不太熟悉,只找到了非常简单的语法概述。不过在我看来,这个表格还是挺有用的。
- AsciiDoc 与 Markdown 对比 | Asciidoctor 文档
- 通过您喜欢的搜索方式查找更多类似此网页查询的内容
- 请注意:仍有部分作者未能区分语法(orgdown)与使用特定工具(如 Emacs)的必要性。
- 请注意:仍有部分作者未能区分语法(orgdown)与使用特定工具(如 Emacs)的必要性。
你可以回顾我在前文「什么是轻量级标记语言(LML)?」章节中提到的流行 LML 列表。
18. Orgdown 作为替代方案之一
在本文剩余部分,我将阐述为何推荐尝试我个人偏爱的轻量级标记语言选择:Emacs Org-mode 语法——在我看来,它应该改名为 Orgdown。
当你想了解我为何为 Org-mode 语法创造新术语时,请阅读这篇文章。
是的,Orgdown 并非官方正式标准。然而,作为 Org-mode 的 Elisp 实现定义了语法元素的呈现方式和解释规则,它已然成为一种事实上的伪标准。这已远超 Markdown 所能企及的规范程度。
我已写过《Org Mode 语法是最合理的文本标记语言之一》。不过按照同样的标准来论证 Orgdown 的合理性也很公平。
18.1. (可选)Orgdown 的工具支持
- A:「我更喜欢用 Org-mode 管理文件。」
- B:「噢,我才不用呢,我讨厌 Emacs。」
(他们很可能在谈论两件不同的事。)
由于这似乎是个永无止境的误解,我——再次——想强调我们需要区分工具支持和轻量级标记语言语法。在这种情况下,你可以使用 Emacs Org-mode 来处理 orgdown 文本。你也可以从众多其他 orgdown 工具中选择合适的来完成这项工作。
手动输入 orgdown 格式甚至具有足够优势,无需任何特定语法支持。至少我所知的大多数 Markdown 工具根本不提供实质性的 Markdown 支持。因此大多数人甚至不知道优秀工具支持应该具备哪些功能。这就是 KISS 原则(保持简单原则)。
若您确实追求卓越的工具支持,没有什么能比 Emacs Org-mode 配合 orgdown 轻量级标记语言更完美的了。以下是使用 Emacs 处理 orgdown 时所能期待的极简功能清单:
- 语法高亮:最基础也最直观的功能,可惜在某些实现中这甚至是唯一的工具支持
- 快速创建新元素的快捷键:标题、列表项、表格单元格等等
- 移动项目:标题、列表项、表格单元格……
- 导航至特定位置:书签、标题、关键词、脚注等
- 从 orgdown 数据生成特殊视图,如日程/日历、汇总表格等
- 高级导出功能,支持所有相关目标文件格式
- 从所有相关源文件格式导入
- 输入时自动对齐表格
我无法更加强调在使用 Emacs 和/或 Org-mode 时处理文本有多么棒。我个人从未见过任何可比拟的东西。只有亲自尝试较长时间后,你才能真正理解。当你在 YouTube 和其他视频平台上观看一些与 Org-mode 相关的视频时,你可以获得一个简短的预览:
- Prot:Emacs Org 模式基础教程(48 分钟)
- 关于 Emacs Org-mode 基础功能的精彩视频(1 小时 32 分钟)
- 我的一些在线视频也涉及 Org 模式相关的工作流程。
借助 pandoc 等工具,你还能实现更多涉及 orgdown 文件的工作流程。我开发了许多非 Emacs 工具,这些工具要么将 Orgdown 文件作为输入,要么生成 Orgdown 作为输出格式。举个例子,这个博客的所有文章都是用 Orgdown 撰写的。我自用的静态网站生成器(市面上有很多可选方案!)能一次性生成你现在看到的 HTML 页面。笔记、任务、项目或博客文章之间无需区分——这是种完全不同的电脑使用方式。
此刻我再次离开工具支持层面,回到轻量级标记语言层面,解释为何 Orgdown 与 Markdown 相比截然不同且更胜一筹——即便你完全忽略任何工具支持因素。
18.2. Orgdown 对人类而言易于阅读
以下示例可供您对照原文与解读内容,自行判断即使没有高亮显示、重新格式化等处理,Orgdown 的易读性如何。
- Orgdown1 示例
- 本博客
- 文件说明:每页右上角都有一个¶符号,点击可查看我编写的 Orgdown 源文件。
- 文件说明:每页右上角都有一个¶符号,点击可查看我编写的 Orgdown 源文件。
- Org-mode 主页上也提供了一些颇具参考价值的示例。
- Org-mode 手册当然包含了关于 Orgdown 语法元素最相关的信息。不过它更像是一本参考手册而非教程。
- Worg 社区页面提供了一些额外的资源,如教程、深度解析等内容。
所以请自行判断。在大多数情况下,它与标准 Markdown 元素差别不大。如果你已经掌握了 Markdown,你很可能会为 Orgdown 更出色的设计感到欣喜。
18.3. Orgdown 对人类来说很容易学习
改变习惯可能是最难做到的事。如果你已经克服了 Markdown 最初的障碍,熟记工具的语法细节,并且大量使用单一 Markdown 变体进行写作:学习另一种轻量级标记语言确实看起来是项艰巨任务。
将 Orgdown 作为你的第一种轻量级标记语言(LML)来学习应该不是难事,因为它设计精良,没有 Markdown 那些不一致的问题,而且在我看来输入起来更轻松。我认为 Orgdown 作为入门的第一种轻量级标记语言是非常不错的选择。
我个人建议是在电脑显示器下方放一份速查表。或许打印一份 od1 示例页面就能满足你的需求。也可以考虑从以下列表中选择:
在最初几天或几周内,你会频繁查阅某些元素,比如 URL 和描述的排列顺序、如何强调文本等。我建议将你经常查阅的单个元素高亮标注。
随着时间的推移,你会发现越来越不需要这张速查表,最终可以把它收进抽屉。这时候你其实已经跨越了语法学习曲线中最陡峭的部分。
18.4. Orgdown 便于人工输入
出于与上述相同的原因,相比 Markdown,Orgdown 对人类而言更易键入,它具备更少的不一致性和更巧妙的设计。我认为你无需过多担忧,因为你不必像使用 Markdown 时那样,为各种不兼容的语法变体而烦恼。
18.5. Orgdown 便于工具处理
这正是 Orgdown 的闪光点。
我之前已经提到过在 Emacs Org 模式下写作时出色的创作工具支持。这是目前最优秀的轻量级标记语言环境——远超其他选择。由于 Orgdown 针对各类使用场景提供了极其丰富的语法元素,你几乎不会遇到"要是能再多支持某某功能就好了"的情况。毕竟已有大量(学术)书籍、论文和研究报告都是用 Orgdown 完成的。
说到重用 Orgdown 文本,你完全不必担心格式兼容性问题。只需启动 Org-mode 导出过滤器、执行 pandoc 转换命令,或使用其他工具中任何与 org 相关的导入功能,你的文本就能完美呈现。
仅以一小部分用例为例,看看 Worg 上专为 Orgdown 设计的静态网页生成器就知道了。
在摆脱了 Markdown 的大部分缺点后,当您不再受各种 Markdown 方言带来的困扰时,您会意识到 LML 理念的整体优越性。这完全是一种全新的体验。
19. 总结
哇,你竟然坚持读到了这里。这篇文章之所以这么长,是因为我试图澄清关于这个主题的所有误解、混淆和争议——毕竟我在网上经历过(太多)相关讨论了。
我已简要介绍了 LML 理念,它完全独立于任何特定的 LML 语法。
根据我的理解,我总结了 LML 应具备的通用特性。通过这种方式,您可以客观地讨论不同的实现方案。
接着我总结了 Markdown 设计上让我不满意的方面,以及需要在大脑中区分如此多不同变体的事实。
我阐述了自己对 Markdown 现状为何如此失控的看法。
最后,我建议改用另一种轻量级标记语言——一种不会带来 Markdown 所有缺陷的标记语言。
作为我个人最爱的选择,我特别强调Orgdown 即便你永远不会使用 Emacs 软件,它也是一个出色的轻量级标记语言候选方案。
根据我的个人经验,Markdown 唯一聪明之处就是它那个俏皮的名字。除此之外,几乎所有功能都能被其他轻量级标记语言实现得更好。
以我的经验来看,这个话题对许多人来说非常敏感。这导致争论往往超出我在此试图总结的客观理性范畴,演变成带有个人偏好的信仰之争。
然而,通过以上论述,你应该能够 自行判断 我的观点是否具有一定道理——我对于 Markdown 的个人困扰是否也映射在你的实际使用场景中,或者所列的所有 Markdown 缺陷对你以及所有与你共享文本文档的同事而言根本不成问题。
如果此刻我仍未能说服你,至少我们还有双方都能选择的其他方案。
若我遗漏了有力论据,请不吝在下方留言评论。
20. 相关观点
- 支持 Markdown
- 反对 Markdown