平时我经常使用 ChatGPT 整理学习笔记、知识点和技术资料,然后再把内容复制到 Obsidian 中长期保存。
这个流程本身很好用,但有一个很烦的问题:
ChatGPT 网页里看起来完全正常的内容,复制到 Obsidian 后,经常会出现各种格式问题。
尤其是数学公式比较多的时候,例如:
- 行内公式无法正常渲染
- 块级公式格式错误
- LaTeX 命令多出反斜杠
- 表格复制后直接散架
- Markdown 标题、列表、加粗被转义
- 公式里的绝对值符号把表格错误地切成好几列
- 原本正常的公式被网页复制拆成好几行
如果内容比较短,手动改一下还可以。
但一篇 ChatGPT 输出几千字,里面又有几十个公式时,一个个检查就很麻烦了。
所以我写了一个 Obsidian + QuickAdd 用户脚本,专门处理这个问题。
现在我的使用方式基本就是:
ChatGPT 复制内容 → 粘贴到 Obsidian → 执行一次 QuickAdd → 完成
一、这个脚本是干什么的?¶
简单来说,它就是一个:
“ChatGPT → Obsidian 格式清洗器”。
脚本会读取当前正在打开的 Markdown 文件,把网页复制过程中产生的一些常见格式污染自动修复,然后直接覆盖回当前笔记。
它主要处理以下问题:
- 修复块级数学公式
- 修复行内数学公式
- 清理异常反斜杠
- 修复部分 LaTeX 命令
- 合并被网页复制拆开的公式
- 修复重复的关系符
- 清理被转义的 Markdown 标记
- 尝试重建被复制散架的 Markdown 表格
- 修复部分标题层级
- 保护表格公式中的绝对值符号
- 自动跳过代码块
- 只处理当前正在编辑的 Markdown 文件
这些也是当前脚本实际实现的主要功能。
二、为什么需要专门处理公式?¶
这是我写这个脚本最主要的原因。
例如 ChatGPT 网页中的行内公式可能采用类似这样的定界方式:
而我自己的 Obsidian 笔记习惯使用:
块级公式同样如此。
网页复制过来的内容可能是:
而 Obsidian 中我希望统一整理为:
这个脚本会自动完成这类转换。
除此之外,网页复制还有可能把 LaTeX 命令变成类似:
脚本也会尝试把明显异常的重复反斜杠恢复成正常形式。
所以对于经常在 ChatGPT 中处理数学、物理、工程类内容的人来说,这一步能省掉不少重复整理的时间。
三、它不只是修公式¶
一开始我只是想解决数学公式的问题。
但使用一段时间之后发现,ChatGPT 网页复制到 Obsidian 时,出现问题的不只有 LaTeX。
比如 Markdown 标记也可能被转义。
原本应该是:
复制之后可能出现一些异常转义。
列表、加粗、分隔线和表格竖线也可能遇到类似情况。
所以后来我把这些清理逻辑也逐渐加入脚本。
现在脚本会识别明显属于 Markdown 语法的转义,再进行恢复,同时尽量避免误伤正常的 LaTeX 内容。
四、表格也是重点处理对象¶
ChatGPT 很喜欢使用表格。
比如:
在网页中看起来没有任何问题。
但复制之后,有时表格会直接变成:
也就是所有单元格被拆成了一个个普通段落。
这个脚本会尝试判断这些连续内容是不是原来的表格,并按照列数重新组合成 Markdown 表格。
目前采用的是比较保守的识别方式,只对特征比较明显的内容进行处理,避免随便把普通正文改成表格。脚本中的表格重建逻辑主要针对 2~4 列、具有明显表头特征并且至少包含两行数据的情况。
五、还有一个很容易踩坑的问题:公式中的竖线¶
比如数学中经常会出现绝对值:
或者复数模:
放在 Markdown 表格里面以后,问题就来了。
因为 Markdown 本身也是使用 | 来划分表格列的。
于是原本属于数学公式的竖线,有可能被解析成新的表格分隔符,最后整张表格直接错位。
这个脚本会专门识别 Markdown 表格内部的数学公式,将其中的竖线转换成更安全的 LaTeX 表达,从而尽量避免公式把表格结构破坏掉。
这属于一个比较小众的问题,但对于数学笔记来说非常实用。
六、怎么在 Obsidian 中使用?¶
我使用的是 QuickAdd 插件。
QuickAdd 支持 Macro 和 User Script,可以通过 Macro 调用保存在 Obsidian 仓库中的 JavaScript 文件。官方文档目前也推荐将用户脚本保存在 Vault 内的普通目录中,并通过 Macro Builder 添加 User Script 命令。(QuickAdd)
整个配置其实并不复杂。
第一步:安装 QuickAdd¶
打开:
Obsidian → 设置 → 第三方插件
搜索:
安装并启用。
第二步:保存脚本¶
在自己的 Obsidian 仓库里新建一个目录,例如:
然后把脚本保存进去:
需要注意,最好不要把脚本放进 .obsidian 或其他以 . 开头的隐藏目录,因为 QuickAdd 的脚本选择器依赖 Obsidian 已经索引到的文件。官方文档建议使用类似 scripts/ 这样的普通目录。(QuickAdd)
第三步:创建 QuickAdd Macro¶
进入:
设置 → QuickAdd
新建一个 Choice。
类型选择:
名称可以自己设置,例如:
然后点击这个 Macro 后面的齿轮图标,进入 Macro Builder。
QuickAdd 官方目前也是通过这种方式创建 Macro:先添加 Macro Choice,再进入 Macro Builder 配置具体命令。(QuickAdd)
第四步:添加 User Script¶
在 Macro Builder 中添加:
然后选择刚才保存的:
保存即可。
QuickAdd 的 User Script 可以直接调用 Obsidian 的 app 对象,所以脚本能够读取当前活动文件、获取编辑器内容,并对文件进行修改。(QuickAdd)
而我的这个脚本正是通过这种方式获取当前活动 Markdown 文件,并在处理完成后直接写回编辑器。
七、实际怎么用?¶
配置完成以后,日常使用就很简单了。
假设我刚刚在 ChatGPT 中生成了一篇数学知识点总结。
第一步¶
直接在 ChatGPT 网页复制内容。
第二步¶
粘贴进 Obsidian。
先不用管里面的公式和 Markdown 有没有错。
第三步¶
保持当前这篇笔记处于打开状态。
第四步¶
执行刚才创建的:
脚本会自动读取当前笔记并进行清理。
如果发现需要修复的内容,处理完成后会弹出提示:
如果没有检测到变化,则会提示:
这些提示和判断都是脚本本身已经实现的。
八、强烈建议再绑定一个快捷键¶
如果每天都要使用,当然没必要每次进入 QuickAdd 菜单。
QuickAdd 的 Macro 可以进一步绑定快捷键。官方文档也支持通过 QuickAdd Choice 或 Obsidian 的 Hotkeys 设置调用 Macro。(QuickAdd)
例如可以设置一个自己顺手的组合键。
这样整个工作流就变成:
这才是这个脚本真正方便的地方。
一次可能只节省几十秒,但如果每天都在 ChatGPT 和 Obsidian 之间搬运大量内容,长期下来能减少很多重复的格式整理工作。
九、脚本不会直接处理整个 Obsidian 仓库¶
这一点需要特别说明。
目前这个版本只处理:
当前正在打开的 Markdown 文件。
它不会扫描整个 Vault,也不会批量修改所有笔记。
我故意这样设计,主要是为了降低误修改的风险。
正常流程就是:
比较可控。
十、代码块也会自动跳过¶
如果一篇文章里面本身包含 JavaScript、Python、Shell 等代码,例如:
显然不能把代码里面的反斜杠也一起“修复”。
否则代码本身可能就被改坏了。
所以脚本在处理 Markdown 时会识别三反引号或波浪线代码块,在代码块内部停止格式清理。
这也是我比较看重的一点:
格式修复脚本不能只追求“改得多”,还要尽量控制误修改。
十一、这个脚本适合哪些人?¶
我觉得比较适合下面几类场景:
- 经常把 ChatGPT 回答保存进 Obsidian
- 经常整理数学笔记
- 经常使用 LaTeX 公式
- 使用 ChatGPT 辅助写学习笔记
- 使用 ChatGPT 整理技术文档
- 经常保存带 Markdown 表格的内容
- 不想每次复制之后手动检查格式
如果你只是偶尔复制一两句话,那其实没必要专门配置。
但如果 Obsidian 本身就是你的长期知识库,同时 ChatGPT 又已经成为日常内容输入工具,那么把两者之间的格式清洗自动化,我认为还是很值得的。
十二、需要注意的地方¶
虽然这个脚本现在已经覆盖了我日常遇到的大部分问题,但它本质上仍然属于:
基于规则进行自动修复。
所以我不建议把它理解成一个“任何 Markdown 都能百分之百修复”的工具。
尤其是特别复杂的:
- 多层嵌套 LaTeX
- 极其复杂的 Markdown 表格
- 本身已经损坏的公式
- 不规则 HTML
- 特殊插件语法
仍然建议运行之后简单检查一下。
另外,脚本不会凭空知道原文是什么。
如果复制过程中某一部分内容已经彻底丢失,那么自动修复本身也存在边界。
因此我目前的使用思路一直都是:
解决高频、机械、能够明确判断的格式问题,把少量特殊情况留给人工检查。
这样反而更可靠。
十三、完整源码下载¶
为了方便直接使用,我把完整的 JavaScript 源码单独整理出来了。
下载后将 .js 文件放进 Obsidian Vault 中,再按照上面的 QuickAdd 配置方法添加为 User Script 即可。
完整源码:https://pan.quark.cn/s/924f05b30f1c
压缩包密码:mons688
文件名:
如果后续又遇到新的 ChatGPT → Obsidian 格式问题,我也会继续根据自己的实际使用情况完善这个脚本。