Markdown 目录生成器

从 Markdown 标题生成可点击目录,支持 GitHub / GitLab / Jekyll / Bitbucket 锚点风格,可通过 <!-- toc --> 标记原位更新。在浏览器中运行,零上传。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
按目标平台选择 GitHub / Hugo、GitLab、Jekyll(GFM)、kramdown 或 Bitbucket Cloud 的锚点规则。请在目标渲染器中检查一条生成的链接。
显示完整 Markdown,并替换 <!-- toc --> 与 <!-- /toc --> 之间的目录。没有标记时插入到第一个 # 标题前;标记未闭合时保留原文。
格式与标题级别
选择连字符、星号或有序列表。每个有序条目都以 1. 开头,显示序号由 Markdown 渲染器生成。
每级标题缩进 2 空格、4 空格或一个 Tab。所选范围内最浅一级标题不缩进。
包含从该级别开始的标题,范围为 1–6。如果最小值大于最大值,工具按由小到大的顺序读取两值。
包含截至该级别的标题,范围为 1–6。分配重复锚点 ID 时,范围外的标题仍参与计数。
如果模板已显示文档标题,可关闭「包含 H1」。其余标题保留原锚点 ID。
复制完整的 Markdown 目录。所选范围没有标题时,此按钮不可用。
复制标记模式生成的完整 Markdown。目录为空或起始标记未闭合时,此复制按钮不可用。
输入或粘贴 Markdown,标题和选项变化后立即更新目录。识别 ATX(#)和 setext 标题,跳过围栏代码块及已有目录标记块。

生成的目录将在此显示。

阅读完整使用指南 Markdown 目录生成器:一个文件,四种锚点方言
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

五种锚点风格

工具提供五种锚点风格,按你的渲染器选择:

  • GitHub / Hugo:转小写;保留字母、组合符号、数字、_、- 和空格;每个空格换成 -。连续空格变成连续连字符,首尾的连字符保留。这就是 github-slugger 2.0.0 的规则,工具以它为基准测试。Hugo 的 Goldmark 渲染器默认 autoHeadingIDType: github。
  • GitLab:规则相同,见 GitLab 标题锚点文档(GitLab 17.0 起)。连续连字符不合并:a --- b 变成 a-----b。
  • Jekyll(kramdown GFM):Jekyll 默认 input: GFM,使用 kramdown-parser-gfm,与 GitHub 一样保留 Unicode,另外把 Tab 也换成连字符,去重按每个基础名计数。
  • kramdown(input: kramdown):kramdown 自己的解析器(basic_generate_id)。先删掉第一个 ASCII 字母之前的字符,只保留 a-z、0-9、空格和连字符,什么都不剩时用 section。
  • Bitbucket Cloud:每个锚点以 markdown-header- 开头(Atlassian 问题 BCLOUD-8276),重复项用 _N。Atlassian 没有公开其余规则,工具在前缀之后沿用 GitHub 规则。Bitbucket Data Center 不给标题加 id。

标记模式

标记模式让 TOC 永远新鲜,又不动原文其它部分。 在你想放目录的位置写两条 HTML 注释:

<!— toc —>
<!— /toc —>

之后随时跑一遍生成器,两条注释之间的内容会被替换为新 TOC。 如果文档还没有标记,工具会在第一个标题之前自动插入一段标记块, 复制粘贴回去就能 commit。

实例

简单目录,GitHub 风格

输入:

# API 参考

## 鉴权

### OAuth 流程

## 接口

### GET /users
### POST /users

输出(GitHub 锚点,缩进 2 空格):

- [API 参考](#api-参考)
  - [鉴权](#鉴权)
    - [OAuth 流程](#oauth-流程)
  - [接口](#接口)
    - [GET /users](#get-users)
    - [POST /users](#post-users)

重复标题

两个 ## 示例 在 GitHub / GitLab / Jekyll 下分别变成 #示例 和 #示例-1;Bitbucket Cloud 下变成 #markdown-header-示例 和 #markdown-header-示例_1;kramdown 风格下中文被删光,变成 #section 和 #section-1。

跳过 H1

如果你的静态站从 frontmatter 渲染 H1,关掉 包含 H1,TOC 会从第一个 H2 开始,整体缩进降一级。

同一份文档,不同平台

这份文档有重复的 ### Examples、标点和一个中文标题。最小级别 2、最大级别 3 时:

# Install Guide
## Requirements
### Examples
## Usage
### Examples
## Q&A: what's new?
## 安装 (Install)

GitHub、GitLab 和 Jekyll(GFM)得到相同的目录:

- [Requirements](#requirements)
- [Examples](#examples)
- [Usage](#usage)
- [Examples](#examples-1)
- [Q&A: what's new?](#qa-whats-new)
- [安装 (Install)](#安装-install)

kramdown 风格下 安装 被删掉,只剩 install:

- [Requirements](#requirements)
- [Examples](#examples)
- [Usage](#usage)
- [Examples](#examples-1)
- [Q&A: what's new?](#qa-whats-new)
- [安装 (Install)](#install)

Bitbucket Cloud 的 id 与 GitHub 相同,只是前面加了 markdown-header-,第二个 Examples 变成 #markdown-header-examples_1。

限制

  • 工具读取 ATX(#)和 setext(===、---)标题,不读取用 HTML 写的标题(<h2>)。行内 Markdown 用简单规则去除,强调里套链接这类少见写法可能在目录文字里留下多余字符。
  • 不读取自定义 id(kramdown 和 Hugo 的 ## 标题 {#custom-id}),工具只计算自动生成的 id。
  • 这里没有列出的渲染器(例如 VS Code)可能用不同规则。提交长目录前先点一个生成的链接确认。

FAQ

为什么要选锚点风格?

各平台把标题转成锚点的规则不同。GitHub 和 GitLab 保留 Unicode 字母和下划线,删掉标点,每个空格换成一个连字符;Jekyll 默认的 GFM 解析器也一样;kramdown 自己的解析器只保留 ASCII;Bitbucket Cloud 给每个锚点加 markdown-header- 前缀。用错规则生成的目录,链接会失效。

支持中文、日文、韩文标题吗?

GitHub、GitLab、Jekyll(GFM)和 Bitbucket Cloud 都支持:中文、日文、韩文字母会留在锚点里。kramdown 风格(设成 input: kramdown 的 Jekyll 或 kramdown 站点)会删掉所有非 ASCII 字符,什么都不剩的标题得到 section、section-1 这样的 id。

标记模式(Marker mode)怎么更新已有目录?

打开标记模式后,工具会在文档中找 <!-- toc --> ... <!-- /toc --> 一对注释,把中间的内容整段替换成新生成的 TOC,标记之外的内容一律不动。如果还没有标记,工具会在第一个标题之前插入一个新的标记块,复制粘贴回原文即可。每次输入变动都会重新生成。

标题重复怎么办?

文档里每个标题都会得到唯一的 id,包括不在最小 / 最大级别范围内的标题,因为渲染器会把它们都算进去。GitHub 和 GitLab 追加 -1、-2,并跳过已被占用的编号;Jekyll 和 kramdown 按基础名分别计数追加 -1、-2;Bitbucket Cloud 用 _1、_2。

代码块里的 # 会被当成标题吗?

不会。被三反引号 ``` 或三个波浪号 ~~~ 包围的代码块内容一律按代码处理,不会被识别为标题。已存在的 <!-- toc --> ... <!-- /toc --> 区段也会被跳过,所以可以反复运行生成器而不会出现旧 TOC 嵌套。