Markdown确实是个老话题了,但最近后台收到好几条留言都在问类似的困惑:"为什么我用Markdown写出来的东西,一复制到别的地方排版就乱了?""表格到底怎么对齐才能在不同平台都显示正常?"想想也是,Markdown语法看着简单,真正用起来并保持跨平台稳定呈现,里面藏着不少细节。这篇就把我自己日常写文档、做笔记、发技术文章时反复用到的常规用法完整梳理一遍,从基础语法到进阶技巧,再到踩过的坑和解决方案,一次说清楚。
1. 为什么写文档的人迟早都会用上Markdown
先聊个真实的场景。早几年我写技术方案用Word,每次调整标题字号、修改列表缩进、对齐表格都要跟格式较劲。更头疼的是,同一个文档在Windows电脑上打开一个样,发到Mac上预览又变了样,等发给同事协作修改,格式彻底乱成一锅粥。后来接触Markdown之后,这个困扰彻底消失了——因为Markdown的核心逻辑很简单:用纯文本的标记符号代替鼠标点击,让内容本身决定排版。
它的工作方式很像给文本"打标签":在文字前面加一个井号,这行文字就会变成标题;在文字两侧各加一个星号,文字就会变成斜体。这些标记符号就是Markdown语法,而你写出来的文件本质上是一个纯文本文件,任何设备、任何系统打开都能看到完整内容,不依赖特定软件版本或字体是否安装。
所以Markdown能够流行的根本原因,不在于它有多玄妙的技术,而在于它解决了一个非常实在的痛点:让人专注于内容本身,把排版交给统一的规则去处理。不管是写技术文档、记学习笔记、还是维护个人博客,Markdown都适用。
我个人的建议是:凡是需要长期保存、跨设备查看、可能被多人协作编辑的文字内容,都值得用Markdown来写。一套语法吃透之后,你几乎不需要再为格式问题浪费时间。
| 对比维度 | Word | Markdown |
|---|---|---|
| 排版方式 | 鼠标点击菜单,依赖软件版本 | 输入少量标记符号,纯文本控制 |
| 跨平台表现 | 不同软件版本显示效果不一致 | 任何平台、任何编辑器渲染一致 |
| 文件格式 | .docx二进制格式,需专用软件打开 | .md纯文本格式,记事本也能读 |
| 版本管理 | 二进制文件,diff困难 | 纯文本,Git等工具可直接对比差异 |
| 学习成本 | 功能多而杂,需要系统学习 | 常用标记只有十来个,一小时上手 |
2. 基础语法部分:高频标记一次讲透
2.1 标题体系与段落结构
标题是文档的骨架。Markdown用井号的数量来表示标题的层级,一级标题是一个#,二级标题是两个##,以此类推,最多支持到六级标题。
# 一级标题(相当于文章大标题) ## 二级标题(相当于章节标题) ### 三级标题(相当于小节标题) #### 四级标题写标题时有两个细节需要注意。第一,井号和文字之间要留一个空格,这是标准写法,如果不加空格,部分渲染器可能识别不了。第二,标题的层级跳跃不要太随意,比如直接从二级标题跳到四级标题,这样目录结构会显得很乱。我一般习惯控制在一级到三级,超过四级的场景很少。
段落之间用空行分隔,这点特别容易被忽略。很多人写Markdown时习惯像在Word里一样直接按回车换行,结果渲染出来发现所有文字挤在一行里——因为Markdown规定,单个换行符会被当作普通空格处理,只有空出一行才算开启新段落。
2.2 加粗、斜体与删除线
文字的强调效果,Markdown用星号和下划线实现:
- 两侧各一个
*号:斜体 - 两侧各两个
*号:加粗 - 两侧各三个
*号:加粗斜体 - 两侧各两个
~号:~~删除线~~
实际使用时,我更喜欢用星号而不是下划线。因为下划线在某些编辑器里会和链接的显示样式混淆,而星号几乎没有歧义。另外强调符号和文字之间不要留空格,**加粗**这样写才能被正确识别,写成** 加粗 **虽然部分编辑器也能渲染,但会破坏语法严谨性。
2.3 列表的缩进与嵌套规则
列表是日常写作中使用频率极高的语法。无序列表用-、*或+开头,有序列表用1.、2.开头:
- 无序列表项一 - 无序列表项二 1. 第一步操作 2. 第二步操作嵌套列表的关键是缩进。在子列表项前面敲两个空格(部分编辑器支持Tab键),就能形成层级关系:
- 一级列表项 - 二级列表项 - 三级列表项这里有一个容易踩的坑:不同编辑器对Tab的解析宽度可能不一样。如果你在某个编辑器里用Tab缩进写好了嵌套列表,换到另一个编辑器里可能缩进层级错乱。为了避免这种问题,我统一用两个空格缩进,跨平台表现最稳定。
有序列表的序号不一定要从1连续递增,即使写成1.、1.、1.,Markdown渲染时也会自动按顺序编号。不过建议还是手动写连续的序号,一方面方便阅读源码,另一方面也避免某些不支持自动编号的渲染器显示成三个"1"。
2.4 链接和图片的标准写法
链接在Markdown里是"中括号+小括号"的组合:
[链接文字](https://example.com)如果需要为链接添加鼠标悬停提示,在小括号的URL后面加空格和引号:
[链接文字](https://example.com "鼠标悬停时显示的文字")图片语法和链接很像,只是在最前面多了一个感叹号:
这里的"图片替代文字"非常重要——图片加载失败时显示它,屏幕阅读器靠它来辨识图片内容,在博客中还有利于搜索引擎收录图片信息。
关于图片路径,有一点要多说几句。如果你是用Typora这类本地编辑器,路径可以写相对路径,比如,表示图片存放在当前文档所在文件夹的images子目录里。但如果你要发布到网页上,建议使用图床(即把图片上传到在线存储空间,获取一个URL地址)或者相对路径再配合部署工具处理,避免因为路径问题导致图片显示失败。这条经验是我吃的亏换来的,写过文档的人应该深有体会——本地看着好好的图片,一发布就碎了一地。
2.5 引用块和分隔线的使用场景
引用块用于标注一段来自外部的内容,或者强调某段特别重要的提示信息。语法是在段落前面加>符号:
> 这是一段引用内容。 > > 引用可以跨多个段落。引用块可以嵌套,类似列表的层级结构:
> 第一层引用 > > 第二层引用我在写文章时喜欢把"重要提醒"、"注意事项"这类内容用引用块包裹,在视觉上能和正文明确区分,读者扫一眼就知道这段需要留意。
分隔线写作三个或以上的星号、短横线或下划线,独占一行:
--- *** ___其中---的使用需要特别注意:如果一个短横线的上方紧跟着文字,它会被识别为二级标题而不是分隔线。所以写分隔线时,上下一定要空行,否则效果会出乎你的意料。
3. 进阶功能:表格、代码块、任务列表与公式
基础语法覆盖了90%的日常写作需求,但还有一些进阶功能在实际使用中经常会碰到。这些功能有的虽然不算是"最基础",但一旦用上,文档的专业度和可读性会明显提升一个档次。
3.1 表格:写法简单,对齐细节别忽略
Markdown的表格语法十分直观:第一行是表头,第二行规定对齐方式,后面是数据行。单元格之间用竖线|分隔:
| 列名1 | 列名2 | 列名3 | |-------|-------|-------| | 内容1 | 内容2 | 内容3 |第二行中的短横线数量没有严格限制,一般写3个就够。对齐方式的控制靠冒号的位置:
:---表示左对齐:---:表示居中对齐---:表示右对齐
| 左对齐 | 居中对齐 | 右对齐 | |:-------|:-------:|-------:| | A | B | C |实际使用中有几个常见坑值得提前预防。第一,表格中不能直接使用竖线|,这是单元格的分隔符,如果想在单元格里显示竖线,需要用转义写法\|。第二,单元格内换行不能直接按回车,需要借助HTML的<br>标签。第三,表格前后最好空一行,让解析器能准确识别表格的边界。最后,不同平台对表格语法的宽容度不同,GitHub支持,部分老旧的Markdown解析器不支持,所以我在写公开博文之前会把表格渲染结果检查一遍。
关于表格复制乱码的问题,热搜词里出现了"markdown表格复制",这个场景我太熟悉了——在编辑器里表格显示得很整齐,一复制到微信公号后台或者钉钉文档里就全乱了。目前的经验是,跨平台复制Markdown表格没有完美方案,比较好的做法是在源编辑器里先预览渲染后的效果,然后整段复制渲染后的HTML内容粘贴到目标平台,而不要复制原始Markdown语法文本。
3.2 代码块:行内代码与围栏代码块
写技术文档时,代码块是刚需。Markdown区分两种情况:
行内代码用反引号包裹,用于在段落中提及变量名、命令、文件名:
在命令行执行 `npm install` 安装依赖。多行代码用围栏代码块,即三个反引号成对包裹:
```javascript function greet(name) { console.log("Hello, " + name); }围栏代码块后面可以标注语言类型,渲染时会触发对应的语法高亮。常见的标识有`javascript`、`python`、`bash`、`json`、`css`等。有一点需要提醒:**反引号必须是英文输入法状态下的反引号**(键盘左上角Esc键下面那个键),中文状态下输入的引号无法被识别。 代码块内部的内容会原样保留,包括缩进和换行,所以不用担心代码里的空格被折叠。这个特性让代码块成为除了展示代码之外,还可以用来存放需要精确控制换行的文本(比如配置模板、命令行示例)。 ### 3.3 任务列表:管理清单的神器 任务列表在GitHub上非常常见,语法是列表项前面加`[ ]`(未完成)或`[x]`(已完成):- [ ] 撰写初稿
- [x] 补充示例代码
- [ ] 校对全文
注意方括号里的空格和字母x都要用英文半角字符。有的编辑器支持直接在渲染界面上点击勾选,但我发现不同平台对点击勾选的支持程度不一样——Typora可以,VS Code的预览模式下也可以,但某些在线编辑器勾选了也不会改变原始语法。所以更重要的是源码层面的`[ ]`和`[x]`要写正确,这样无论拿到哪里渲染,状态都不会出错。 ### 3.4 公式:行内公式和块级公式 写技术类文章难免用到数学公式。Markdown本身并不包含公式语法,这是通过扩展功能实现的(最典型的是MathJax和KaTeX)。不过既然现在的主流Markdown编辑器都内置了这个能力,把它归入常规用法也说得过去。如果你的编辑器不支持公式渲染,下面这些写法会被当作普通文本展示,不会报错,只是不出效果。 行内公式用美元符号`$`包裹:质能方程 $E=mc^2$ 是物理学中非常著名的公式。
块级公式用两个美元符包裹,独立成段:$$ \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$
公式这个功能依赖编辑器的插件生态。Typora和VS Code的Markdown Preview Enhanced做得比较顺手。如果你写的是纯Markdown文件然后发布到某些不支持公式的平台上,公式就会以原始LATEX语法形式展示,这对非技术读者来说等于天书。所以**公式的使用要结合目标发布平台来判断**,不要盲目用。 ## 4. 编辑器选型:不同场景匹配不同工具 学完语法之后,下一步就是选一个趁手的编辑器。市面上的Markdown编辑器数量庞大,各自的定位和侧重点差异明显。与其迷信所谓"最强编辑器",不如想清楚你的主要使用场景是什么。 ### 4.1 本地写作首选Typora Typora是很多人的Markdown入门工具,也是我自己日常写作的主力。它的特点是**即时渲染**——你写下的语法符号立刻变成排版效果,不需要左右分栏预览,整个界面很清爽,几乎没有干扰元素。 Typora对图片拖拽插入、表格编辑、导出PDF和Word的支持都比较成熟。我写长文时,通常就是Typora + 一个坚果云同步文件夹,电脑和手机之间无缝衔接,编辑体验非常接近传统写作软件。 Typora在新版本中变成了付费软件(买断制),价格也不算便宜。介意付费的话,可以找免费替代方案,比如MarkText,体验上已经和Typora很像了。 ### 4.2 开发者场景用VS Code VS Code本来是代码编辑器,但装上Markdown相关插件之后,写Markdown的能力不输给任何专用编辑器。核心优势有三个:第一,**文件管理能力强**,对项目化文档、多文件联合编辑非常友好;第二,**插件生态丰富**,Markdown Preview Enhanced插件可以导出带目录、带图表的高质量HTML文档;第三,**代码块支持极其出色**,毕竟本身就是代码编辑器,语法高亮不在话下。 我的习惯是在任何涉及代码、接口文档、开发规范的项目中都用VS Code写Markdown,配合Git做版本管理,修改历史和多人协作都不会乱。 ### 4.3 知识管理场景用Obsidian Obsidian是目前知识管理领域的热门工具,它的核心是"双链"——笔记和笔记之间可以通过`[[笔记名]]`这样的双链语法互相引用,形成网状知识结构。如果你记笔记的目的是长期积累、构建自己的知识体系,Obsidian的笔记组织方式会比普通文件夹管理高效得多。 它的插件生态同样很丰富,可以自行扩展各种能力,比如Dataview(把笔记数据当数据库查询)、Kanban(看板管理)等。不过这些高级功能我建议入门之后再摸索,初次使用还是先把笔记写起来,不要被插件劫持了精力。 ### 4.4 在线需求用Markdown.party或StackEdit 有些场景你只是临时写点东西,不想打开本地软件、也不想登录账号,那么在线Markdown编辑器会更合适。这类工具打开网页即用,写完一键复制或导出。StackEdit支持连接云盘存储,Markdown.party的界面简约、实时预览速度快,适合临时记录和快速转格式。 还有一个容易被忽视的场景:各种笔记软件自带的Markdown支持。很多在线文档工具(比如语雀、Notion)都支持部分Markdown语法,虽然它们不是纯粹的Markdown编辑器,但你在输入`#`加空格、`-`加空格时,能识别出标题和列表意图。这个能力在平时随手记录时格外好用。 ## 5. 常见问题排查:换行、图片、导出、批量转换 语法学得再好,实际使用中总归会遇到奇奇怪怪的情况。我把被问得最多、出现频率最高的几个问题集中整理一下,都是我亲身试过、验证过处理方案的。 ### 5.1 换行不生效,文字挤在一起 **问题表现**:明明按了回车,渲染结果里文字没有换行,而是所有内容挤在同一段落。 **根本原因**:前面已经提过,Markdown里单个换行符会被当作空格处理。这是Markdown的设计哲学——**换行不代表新段落,空一行才算**。 **解决方案**: - 如果是段落之间要换行:在段落之间空一行。 - 如果是在列表项内或表格内需要强制换行:在行尾加两个空格再回车,或者使用`<br>`标签。 这里特别说一下`<br>`的适用场景。表格单元格内要换行,只能靠`<br>`;诗歌排版、地址分行这类对单行换行有严格要求的内容,也可以直接使用`<br>`。手动在源码里加`<br>`虽然看起来不够"纯Markdown",但它是跨平台渲染最稳定的方案。 ### 5.2 图片在本地正常,发布后显示不出来 **问题表现**:Typora里图片显示正常,但把.md文件发给别人,或者部署到博客上之后,图片变成裂图。 **根本原因**:本地图片用的是相对路径或绝对路径,对方设备上没有同样的文件路径,自然找不到图片。 **解决方案**(按推荐优先级排序): 1. **使用图床**:把图片上传到OSS、七牛云、GitHub仓库或专门的图床工具(比如PicGo),然后在Markdown中直接用图片的URL地址。这是发布到博客、公众号等公网场景的最稳妥方案。 2. **使用相对路径并随文件一起分发**:创建`docs`文件夹,图片放在`docs/images/`下,把整个文件夹压缩打包发给对方。适合本地协作,不适合公网展示。 3. **使用Base64嵌入图片**:把图片转成Base64编码直接写入Markdown文件,实现"单文件携带图片"。适合图片数量少且体积小的场景,缺点是会让文件体积膨胀约33%,且部分平台不支持过长的内嵌Data URI。 我自己的习惯是:**本地笔记用相对路径(方便移动资料夹),博客文章用图床(方便公网访问)**。 > 提示:图床虽好用,但选择服务商时要考虑稳定性。曾经有第三方免费图床关闭服务,导致全网大量博客图片一夜之间全部失效,这种风险需要提前评估。 ### 5.3 导出PDF时中文字体乱码或显示异常 **问题表现**:在编辑器中内容显示正常,但用"导出PDF"功能后,中文变成了方框或乱码;或者把Markdown转成PDF发给别人,字体显示非常奇怪。 **根本原因**:多数Markdown编辑器的PDF导出功能依赖内置的渲染引擎,有些引擎在处理中文字体时不够完善,或者你的系统中缺少渲染引擎需要的字体文件。 **解决方案**: 1. 如果使用Typora,在导出PDF的设置选项中切换主题,不同主题绑定不同字体,换个中文字体相关的主题往往就能解决问题。 2. 如果使用VS Code,可以先把Markdown用Chrome打开,再通过浏览器的"打印→另存为PDF"完成导出。这个方法绕开编辑器自带的导出引擎,用Chrome的排版引擎渲染,兼容性更高。 3. 在Markdown文件顶部通过HTML标签指定字体: ```html <style> body { font-family: "PingFang SC", "Microsoft YaHei", sans-serif; } </style>这个方法对Typora、VS Code Markdown Preview Enhanced都有效,推荐使用。
5.4 从Word或PDF转成Markdown,格式为何总是不对
问题背景:很多人在迁移旧文档时,需要把Word或PDF的内容转成Markdown。网上对"将word和pdf转换成markdown"的需求确实不少,但这中间的水有多深,踩过的人才知道。
实际体验:
- 从Word转Markdown:主流编辑器(Typora、Pandoc)都能处理,但Word里复杂的样式(页眉页脚、文本框、复杂的表格合并单元格)转换后会丢失或错乱。最靠谱的路径是:Word → 另存为HTML → 再通过Pandoc或在线转换工具转成Markdown,能保留的信息会更多。
- 从PDF转Markdown:这基本是"还原性转换",PDF本身是最终排版文件,不携带结构信息,所以转换结果取决于PDF中是否有可复制的文字层。扫描版PDF需要先经过OCR识别才能转为文本,这个过程会引入识别错误,需要人工校对。我家里的旧扫描笔记转出来,错别字率大约在2%~5%之间,速度较快的模型准确率越低。
给一个实用的建议:如果你的原始材料是Word,尽可能保留一份Word源文件,不要只在PDF版本之间来回转,信息损耗会越来越严重。转换后的人工校对环节,不要省略。
5.5 Chrome里直接查看Markdown文件
问题场景:收到一个.md文件,不想安装编辑器,只想快速在浏览器里看一眼渲染效果。
解决方案:在Chrome Web Store里搜索Markdown Viewer Plus这类浏览器扩展,安装后直接用Chrome打开本地.md文件,就能看到渲染后的效果。这类扩展通常支持在浏览器中直接显示代码高亮、表格、图片等所有Markdown特性,是快速预览的轻量方案。标题相关的热搜词里正好有"chrome 查看markdown插件",说明这确实是很多人遇到的实际痛点。
5.6 Markdown转Word的操作路径
有时候把Markdown转成Word是出于协作需要——对方不熟悉Markdown,但需要直接在Word里修改。
推荐使用Pandoc。Pandoc是文档转换领域的"瑞士军刀",安装之后在命令行执行:
pandoc input.md -o output.docx就能把Markdown转成Word文档。生成的Word文件是原生格式,可以在Word里正常编辑排版。针对中文文档,建议在转换后检查一下字体设置,因为Pandoc生成的Word默认字体可能是Calibri或Times New Roman,中文字符会被自动替换,手动全选设置成中文字体即可。
如果有更复杂的排版需求(比如样例模板、页眉页脚、封面样式),可以用Pandoc配合自定义的Reference Docx模板,一次调好,之后每次转换都用同一套模板,输出的Word文档就都能保持统一风格。
6. 写Markdown时真正值得养成的习惯
语法、工具、排错都聊完了,最后说点我实际写了几年Markdown之后总结出来的一些使用习惯。这些内容不属于任何功能的操作说明,但对长期用Markdown写作的人来说,比单个语法点更值得记住。
第一,保持源文件的整洁性。Markdown文件是纯文本,这意味着任何人都可以随时打开阅读源码。给源码做适当的注释(用HTML注释<!-- 注释内容 -->),在适当的地方留空行,这些"看不见"的工作会在几个月后回看文档时让你获益。我在写长文档时喜欢在章节之间使用---作为分隔线,这个小小的视觉分区让源码的阅读体验提升明显。
第二,文件名和目录结构要有规划。Markdown文档往往不是单独存在的,同一项目的多个文档之间会互相关联。建议从一开始就建立固定的目录约定,比如docs/存放源文件,docs/images/存放图片,这样无论过了多久、换了多少个编辑器,都不会出现找不到资源的情况。
第三,不要为了Markdown而用Markdown。它有非常擅长的领域——技术文档、笔记、博客、说明书,但也有不适合的场景——复杂排版的印刷品、需要严格视觉控制的商业文件、多人协作且对方完全没有接触过纯文本编辑的场景。坚持"工具服务于内容"这个原则,被Markdown"坑"的概率就会小很多。
第四,善用版本管理。Markdown的纯文本属性让它与Git这类版本控制工具可以天然配合。即便你是一个人写作,每次修改都通过Git提交一次,不仅能保留历史版本避免误操作丢内容,还能看清自己每一次改动的差异。我目前所有重要文档都放在了Git仓库中,这个习惯救过我很多次。
第五,自动化流程能省则省。刚才提到的Markdown转Word,如果每次都要手动敲一遍Pandoc命令,很快就懒得转了。可以写一个简单的脚本,把常用转换命令固化下来。比如我把PDF导出和Word转换分别写成了两条shell命令,之后每次执行只需要一行。也有朋友用Coze这类自动化工具搭建"Markdown自动转Word并发送到指定位置"的工作流,一次配置长期受益,方向是一样的逻辑:凡是重复发生的手工操作,都值得花点时间自动化。
用Markdown这几年,最大的一点感受是:真正好用的工具不一定有多复杂,关键是它的设计理念契合你的使用场景。Markdown把"内容"和"样式"解耦开来,这个理念看似朴素,却让写作这件事变得通透了很多。希望这篇文章能把你在Markdown路上踩过的坑填平一些,也让你在下次打开编辑器时,少一点写作之外的干扰。