跳转至
思 · 原创手记

一键修复 ChatGPT 复制到 Obsidian 后的公式和 Markdown

Mon 的个人花园 正在计算 阅读模式

平时我经常使用 ChatGPT 整理学习笔记、知识点和技术资料,然后再把内容复制到 Obsidian 中长期保存。

这个流程本身很好用,但有一个很烦的问题:

ChatGPT 网页里看起来完全正常的内容,复制到 Obsidian 后,经常会出现各种格式问题。

尤其是数学公式比较多的时候,例如:

  • 行内公式无法正常渲染
  • 块级公式格式错误
  • LaTeX 命令多出反斜杠
  • 表格复制后直接散架
  • Markdown 标题、列表、加粗被转义
  • 公式里的绝对值符号把表格错误地切成好几列
  • 原本正常的公式被网页复制拆成好几行

如果内容比较短,手动改一下还可以。

但一篇 ChatGPT 输出几千字,里面又有几十个公式时,一个个检查就很麻烦了。

所以我写了一个 Obsidian + QuickAdd 用户脚本,专门处理这个问题。

现在我的使用方式基本就是:

ChatGPT 复制内容 → 粘贴到 Obsidian → 执行一次 QuickAdd → 完成


一、这个脚本是干什么的?

简单来说,它就是一个:

“ChatGPT → Obsidian 格式清洗器”。

脚本会读取当前正在打开的 Markdown 文件,把网页复制过程中产生的一些常见格式污染自动修复,然后直接覆盖回当前笔记。

它主要处理以下问题:

  1. 修复块级数学公式
  2. 修复行内数学公式
  3. 清理异常反斜杠
  4. 修复部分 LaTeX 命令
  5. 合并被网页复制拆开的公式
  6. 修复重复的关系符
  7. 清理被转义的 Markdown 标记
  8. 尝试重建被复制散架的 Markdown 表格
  9. 修复部分标题层级
  10. 保护表格公式中的绝对值符号
  11. 自动跳过代码块
  12. 只处理当前正在编辑的 Markdown 文件

这些也是当前脚本实际实现的主要功能。


二、为什么需要专门处理公式?

这是我写这个脚本最主要的原因。

例如 ChatGPT 网页中的行内公式可能采用类似这样的定界方式:

\(x^2+1\)

而我自己的 Obsidian 笔记习惯使用:

$x^2+1$

块级公式同样如此。

网页复制过来的内容可能是:

\[
x^2+y^2=1
\]

而 Obsidian 中我希望统一整理为:

$$
x^2+y^2=1
$$

这个脚本会自动完成这类转换。

除此之外,网页复制还有可能把 LaTeX 命令变成类似:

\\frac
\\sqrt
\\vec

脚本也会尝试把明显异常的重复反斜杠恢复成正常形式。

所以对于经常在 ChatGPT 中处理数学、物理、工程类内容的人来说,这一步能省掉不少重复整理的时间。


三、它不只是修公式

一开始我只是想解决数学公式的问题。

但使用一段时间之后发现,ChatGPT 网页复制到 Obsidian 时,出现问题的不只有 LaTeX。

比如 Markdown 标记也可能被转义。

原本应该是:

## 二、函数性质

复制之后可能出现一些异常转义。

列表、加粗、分隔线和表格竖线也可能遇到类似情况。

所以后来我把这些清理逻辑也逐渐加入脚本。

现在脚本会识别明显属于 Markdown 语法的转义,再进行恢复,同时尽量避免误伤正常的 LaTeX 内容。


四、表格也是重点处理对象

ChatGPT 很喜欢使用表格。

比如:

| 函数 | 定义域 | 值域 |
| --- | --- | --- |
| y=x² | R | [0,+∞) |

在网页中看起来没有任何问题。

但复制之后,有时表格会直接变成:

函数

定义域

值域

y=x²

R

[0,+∞)

也就是所有单元格被拆成了一个个普通段落。

这个脚本会尝试判断这些连续内容是不是原来的表格,并按照列数重新组合成 Markdown 表格。

目前采用的是比较保守的识别方式,只对特征比较明显的内容进行处理,避免随便把普通正文改成表格。脚本中的表格重建逻辑主要针对 2~4 列、具有明显表头特征并且至少包含两行数据的情况。


五、还有一个很容易踩坑的问题:公式中的竖线

比如数学中经常会出现绝对值:

|x|

或者复数模:

|z|

放在 Markdown 表格里面以后,问题就来了。

因为 Markdown 本身也是使用 | 来划分表格列的。

于是原本属于数学公式的竖线,有可能被解析成新的表格分隔符,最后整张表格直接错位。

这个脚本会专门识别 Markdown 表格内部的数学公式,将其中的竖线转换成更安全的 LaTeX 表达,从而尽量避免公式把表格结构破坏掉。

这属于一个比较小众的问题,但对于数学笔记来说非常实用。


六、怎么在 Obsidian 中使用?

我使用的是 QuickAdd 插件。

QuickAdd 支持 Macro 和 User Script,可以通过 Macro 调用保存在 Obsidian 仓库中的 JavaScript 文件。官方文档目前也推荐将用户脚本保存在 Vault 内的普通目录中,并通过 Macro Builder 添加 User Script 命令。(QuickAdd)

整个配置其实并不复杂。

第一步:安装 QuickAdd

打开:

Obsidian → 设置 → 第三方插件

搜索:

QuickAdd

安装并启用。


第二步:保存脚本

在自己的 Obsidian 仓库里新建一个目录,例如:

Scripts

然后把脚本保存进去:

Scripts/fix-chatgpt-latex.js

需要注意,最好不要把脚本放进 .obsidian 或其他以 . 开头的隐藏目录,因为 QuickAdd 的脚本选择器依赖 Obsidian 已经索引到的文件。官方文档建议使用类似 scripts/ 这样的普通目录。(QuickAdd)


第三步:创建 QuickAdd Macro

进入:

设置 → QuickAdd

新建一个 Choice。

类型选择:

Macro

名称可以自己设置,例如:

修复 ChatGPT Markdown

然后点击这个 Macro 后面的齿轮图标,进入 Macro Builder。

QuickAdd 官方目前也是通过这种方式创建 Macro:先添加 Macro Choice,再进入 Macro Builder 配置具体命令。(QuickAdd)


第四步:添加 User Script

在 Macro Builder 中添加:

User Script

然后选择刚才保存的:

fix-chatgpt-latex.js

保存即可。

QuickAdd 的 User Script 可以直接调用 Obsidian 的 app 对象,所以脚本能够读取当前活动文件、获取编辑器内容,并对文件进行修改。(QuickAdd)

而我的这个脚本正是通过这种方式获取当前活动 Markdown 文件,并在处理完成后直接写回编辑器。


七、实际怎么用?

配置完成以后,日常使用就很简单了。

假设我刚刚在 ChatGPT 中生成了一篇数学知识点总结。

第一步

直接在 ChatGPT 网页复制内容。

第二步

粘贴进 Obsidian。

先不用管里面的公式和 Markdown 有没有错。

第三步

保持当前这篇笔记处于打开状态。

第四步

执行刚才创建的:

修复 ChatGPT Markdown

脚本会自动读取当前笔记并进行清理。

如果发现需要修复的内容,处理完成后会弹出提示:

当前文件的 Markdown 修复完成

如果没有检测到变化,则会提示:

未发现需要修复的内容

这些提示和判断都是脚本本身已经实现的。


八、强烈建议再绑定一个快捷键

如果每天都要使用,当然没必要每次进入 QuickAdd 菜单。

QuickAdd 的 Macro 可以进一步绑定快捷键。官方文档也支持通过 QuickAdd Choice 或 Obsidian 的 Hotkeys 设置调用 Macro。(QuickAdd)

例如可以设置一个自己顺手的组合键。

这样整个工作流就变成:

复制 ChatGPT
↓
粘贴 Obsidian
↓
按快捷键
↓
完成

这才是这个脚本真正方便的地方。

一次可能只节省几十秒,但如果每天都在 ChatGPT 和 Obsidian 之间搬运大量内容,长期下来能减少很多重复的格式整理工作。


九、脚本不会直接处理整个 Obsidian 仓库

这一点需要特别说明。

目前这个版本只处理:

当前正在打开的 Markdown 文件。

它不会扫描整个 Vault,也不会批量修改所有笔记。

我故意这样设计,主要是为了降低误修改的风险。

正常流程就是:

打开哪篇笔记
↓
运行脚本
↓
只修这一篇

比较可控。


十、代码块也会自动跳过

如果一篇文章里面本身包含 JavaScript、Python、Shell 等代码,例如:

```javascript
const a = "\\frac";
```

显然不能把代码里面的反斜杠也一起“修复”。

否则代码本身可能就被改坏了。

所以脚本在处理 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

文件名:

fix-chatgpt-latex.js

如果后续又遇到新的 ChatGPT → Obsidian 格式问题,我也会继续根据自己的实际使用情况完善这个脚本。