在 Obsidian 里用 Markdown 管理小说设定时,人物关系白板是最容易失控的部分。人物卡可以一篇篇拆开写,但“叶辰和苏浅浅是恋人”“陈枫是叶辰的宿敌”这类关系一旦分散到十几篇笔记,浏览起来就非常吃力。正好,Obsidian 的插件机制允许我们写一个很小的生成器:按固定语法解析当前 Markdown 笔记中的人物与关系,一键生成可拖拽的 Canvas 白板文件。这篇文章不要求你做过插件开发,只需要读过一点 JS,理解正则表达式的基本写法,就能跟着把这条链路跑通。
这套方案不是要用复杂的数据结构,也不是要引入数据库,而是把“人物关系”直接写成 Markdown 里可读、可维护的文本标记,再用脚本把这些标记翻译成 Obsidian Canvas 文件。Canvas 文件在 Obsidian 里本质是 JSON,节点是人物,边是关系,打开后可以自由拖拽、缩放、加标签。整个过程保留了 Markdown 作为源数据,又让关系图可以交互查看,兼顾创作习惯和可视化需求。
1. 为什么 Obsidian 原生图谱不是人物关系图
1.1 小说设定党的真实痛点
写小说的人用 Obsidian 建设定库时,通常会为每个角色建一张独立人物卡,记录身份、性格、经历、时间线。人物少时还好,一旦超过十个人,问题就出现了:读者和作者都需要知道“谁和谁认识”“谁背叛了谁”“谁在第几章才出场”,这些信息藏在人物卡的正文里,看任何一张卡都无法获得完整关系网络。
手动维护一张白板也可以,在 Canvas 里创建人物节点、连线、填标签。可是小说剧情是经常改的,每调整一次人物关系,就要在画布上找节点、改连线、换标签。次数一多,白板很快就会和正文脱节。更常见的情况是,作者宁可重新画一张,也不愿意去更新旧图,最终库里出现多个版本的关系图,没人知道哪个是最新的。
这类问题的本质是:关系数据的维护成本太高。如果能让程序从 Markdown 正文里自动读取“谁和谁是什么关系”,再重新生成一张白板,那么作者只需要维护文字,关系图永远可以和正文保持一致。这正是本文要做的自动生成工具的价值。
1.2 Graph View 与 Canvas 的本质差异
Obsidian 自带的 Graph View 常被误认为“关系图谱”。它确实能展示节点和连线,但它的节点是笔记文件,边是笔记之间的双链或标签关系。它回答的问题是“哪些笔记通过链接或标签互相引用”,而不是“叶辰和苏浅浅是恋人”。
Canvas 则不同。Canvas 文件里的节点可以是任意文本、Markdown 笔记、图片、网页卡片,边可以带文字标签。它更适合手工整理思路,也适合脚本生成可视化白板。两者对比如下:
| 对比项 | 原生 Graph View | 手动 Canvas | 解析生成的 Canvas |
|---|---|---|---|
| 节点含义 | 笔记文件 | 任意文本或文件 | 人物、势力、地点 |
| 边含义 | 笔记间的链接引用 | 自由连线 | 带标签的人物关系 |
| 布局控制 | 由图谱算法决定 | 完全手动 | 脚本按算法生成,可继续手动调整 |
| 数据维护 | 依赖链接和标签 | 依赖手工拖动 | 依赖 Markdown 标记 |
| 适合场景 | 查看笔记库整体结构 | 一次性头脑风暴 | 批量生成、按正文持续更新 |
理解了区别,就会明白为什么一条“生成人物关系白板”的命令比原生图谱更接近小说设定的需求。它不是替代 Graph View,而是把 Markdown 里的语义关系变成真正的可视化画布。
1.3 为什么选择“解析 Markdown + 生成 Canvas”
方案可以有很多:用 Mermaid 手写关系图,用 Dataview 渲染表格,用第三方关系图谱插件,或者写一个自定义插件。最终选择“解析 Markdown + 生成 Canvas”的原因主要有三点。
第一,源数据简单。人物和关系仍然写在与正文相同或相邻的 Markdown 文件里,不需要单独维护一个数据库,也不会依赖某个模板的复杂字段。写作时顺手写一行关系,脚本就能识别。
第二,生成结果可交互。Canvas 不是一张静态图,生成之后还可以继续拖动节点、调整连线位置、标注剧情阶段。Mermaid 生成的图虽然也能看,但无法像 Canvas 一样自由整理,