Markdown: Markdown 代码语法与代码块

代码是技术文档的核心——Markdown 提供了优雅的方式来呈现它,让读者既能阅读也能复制运行。

1. 你将学到


2. 一个开发者的真实故事

(1) 痛点:读者复制代码后报错

Nina 在技术博客上发布了 Python 教程,读者反馈复制代码运行就报错。调查发现,博客平台的代码块没有语法高亮,逗号和句点看起来一样,有些人把 ( 复制成了 (全角括号)。更糟的是,有些代码块没有标注语言,导致代码颜色没有区分。

(2) 解法:规范代码块格式

Nina 改用围栏代码块并标注语言标签,所有代码在发布前在真实环境中测试运行一遍。她还添加了"复制代码"按钮。之后读者反馈报错的邮件减少了 90%。她的博客因为代码可复制性高,被多家技术媒体推荐。


3. 行内代码

(1) 基本语法

用单个反引号 ` 包裹文字,表示行内代码:

MARKDOWN
使用 `print()` 函数输出文本。

在终端中运行 `npm install express`。

`<div>` 标签是 HTML 中最基本的容器。
场景 写法 效果
函数名 调用 `calculateTotal()` 函数 调用 calculateTotal() 函数
快捷键 按 `Ctrl+S` 保存 Ctrl+S 保存
文件名 编辑 `.env` 文件 编辑 .env 文件
命令 运行 `git status` 运行 git status

(2) 行内代码中的特殊字符

反引号本身用双反引号包裹:

MARKDOWN
用 `` ` `` 表示反引号字符。

在一段文字中使用 `代码` 和 `` `反引号` ``。
💡 提示: 行内代码主要用于提及函数名、变量名、文件路径、快捷键和简短命令。大段代码请使用代码块。

▶ 示例:行内代码的正确用法

TEXT 📖 仅展示
在 utils/helpers.py 文件中,定义了一个 format_date() 函数。
使用时传入 datetime 对象,返回格式化字符串。

快捷键 F5 刷新页面。
💡 提示: 行内代码中的文字保持原样——即使你用 ** 也不会加粗。这确保了代码原文的准确呈现。


4. 围栏代码块

(1) 基本语法

用三个反引号 ``` 包裹代码块,可以指定语言标签实现语法高亮:

MARKDOWN
```python
def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))
```
⚠️ 注意: 代码块前后必须有空行,否则某些解析器可能无法正确识别。这是一条写文档时最容易忽略的规则。

(2) 语言标签的作用

标签 语言 示例文件名
python Python main.py
javascript JavaScript app.js
html HTML index.html
css CSS style.css
bash 终端命令 (无文件)
json JSON package.json
markdown Markdown README.md
text 纯文本输出 (无高亮)
PYTHON
# Python 代码,有语法高亮
def fibonacci(n):
    """计算斐波那契数列的第 n 项"""
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 输出 55

5. 缩进代码块

除了围栏式,Markdown 还支持缩进式代码块。行首缩进 4 个空格或 1 个 Tab:

MARKDOWN
这是一段文字。

    // 缩进 4 个空格后成为代码块
    function hello() {
        console.log("Hello!");
    }

继续写普通文字。
⚠️ 注意: 缩进代码块不支持语法高亮,也没有语言标签。推荐始终使用围栏代码块(```),它功能更强大、更清晰。

▶ 示例:围栏代码块 vs 缩进代码块

TEXT 📖 仅展示
围栏代码块使用三个反引号包裹,支持语言标签和语法高亮。
缩进代码块使用行首 4 个空格,兼容性好但不支持语法高亮。
推荐使用围栏代码块。

6. 代码块中的特殊处理

(1) 代码块中转义反引号

如果代码本身包含三个反引号,用更多数量的反引号包裹:

MARKDOWN
````text
```python
print("Hello")
```
````
💡 提示: 外层用 ````(四个反引号),内层 ``` 就会被当作普通文字显示。

(2) 长代码换行

MARKDOWN
# 推荐:保持每行在 80 字符以内
const result = await api.getUserData(userId)
  .then(data => processData(data))
  .catch(error => handleError(error));

# 避免:不换行的超长行
const result = await api.getUserData(userId).then(data => processData(data)).catch(error => handleError(error));

▶ 示例:代码块中的常见错误标记

TEXT 📖 仅展示
❌ 错误写法:
没有语言标签的代码块显示为白底黑字

✅ 正确写法:
标注了 python 语言标签后显示彩色语法高亮
⚠️ 注意: 不加语言标签的代码块会被 Prism.js 等语法高亮工具忽略,显示为白底黑字,不便于阅读。


7. 在列表和引用中嵌入代码

(1) 列表中的代码块

列表中的代码块需要额外缩进 8 个空格或两个 Tab:

MARKDOWN
- 运行测试:

        npm test -- --coverage

- 检查格式:

        npx eslint src/ --fix
💡 提示: 列表中的代码块也可以用围栏式,但需要在代码块前后空一行并保持缩进一致。

(2) 引用中的代码块

MARKDOWN
> **关键实现:**
>
> ```python
> def process_data(df):
>     return df.dropna().groupby("category").sum()
> ```
>
> 以上代码会清洗空值后分组汇总。

8. 完整示例:一份代码文档

TEXT 📖 仅展示
数据处理脚本说明

安装依赖:pip install pandas numpy matplotlib

load_data() 函数:从 CSV 文件加载数据
clean_data() 函数:移除空值和重复行

完整使用流程:
1. 加载数据 - load_data("sales.csv")
2. 清洗 - clean_data(data)
3. 输出统计 - 打印行数和列名

预期效果:一份清晰的技术文档,代码与说明交替呈现,语言标签正确,行内代码与代码块分工明确。


❓ 常见问题

Q 行内代码和代码块怎么选?
A 2-3 个单词内用行内代码;超过一行的代码用代码块。函数名、变量名、文件名、快捷键用行内代码;多行程序、配置、命令用代码块。
Q 代码块为什么不显示语法高亮?
A 最常见原因——没有加语言标签。检查代码块开头是否标注了语言名称如 python、javascript。
Q 代码块内的文字可以用 Markdown 格式吗?
A 不能。代码块内的所有内容都按原始文字显示,星号不会变成加粗,井号不会变成标题。
Q 如何在代码块中显示反引号?
A 用更多数量的反引号作为外层包裹。例如显示三个反引号时用四个反引号包裹即可。
Q 代码块的行首空格会保留吗?
A 会。代码块中的缩进完全保留原样。这是故意的——Python、YAML 等语言依赖缩进。

📖 小节


📝 作业

  1. 基础题:写一段 Markdown,包含 3 处行内代码(文件名、函数名、快捷键)和 1 个带语言标签的代码块。

  2. 进阶题:在你的 Markdown 文档中创建一个嵌套结构——在无序列表项中嵌入一个代码块,在引用块中嵌入一个代码块。

  3. 挑战题:写一段包含三层反引号嵌套的 Markdown(演示如何在文档中展示代码块的代码块),并用四个反引号包裹以保证正确渲染。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏