解决 GPT 结果粘贴到 Obsidian 上数学公式无法正常渲染的问题

该文章已生成可运行项目,

解决 GPT 结果粘贴到 Obsidian 上数学公式无法正常渲染的问题

问题背景

在使用 GPT 或其他 AI 工具生成内容时,常常会包含 LaTeX 格式的数学公式(例如 \[ ... \]\( ... \))。然而,当将这些内容直接粘贴到 Obsidian(一款强大的 Markdown 笔记工具)中时,公式往往无法正确渲染。这是因为 Obsidian 使用的是基于 MathJax 的数学公式渲染规则,它更倾向于使用 $$ ... $$(块级公式)和 $ ... $(行内公式)来识别公式。

本文将介绍如何通过一个简单的 Python 脚本,将 GPT 生成的 LaTeX 格式公式转换为 Obsidian 支持的格式,并提供一个完整的解决方案和代码说明。


效果展示

转换后

在这里插入图片描述

转换前

在这里插入图片描述

解决方案:使用 Python 脚本转换公式格式

我们编写了一个 Python 脚本,用于将 LaTeX 格式的公式(如 \[ ... \]\( ... \)) 转换为 Obsidian 兼容的格式(如 $$ ... $$$ ... $)。此外,该脚本还支持从剪切板读取内容并将结果复制回剪切板,方便快速操作。

核心代码逻辑

  1. 块级公式转换:将 \[ ... \] 替换为 $$ ... $$,并在前后添加换行符以确保渲染效果。
  2. 行内公式转换:将 \( ... \) 替换为 $ ... $,并去除 $ 周围的多余空格(Obsidian 对空格敏感)。
  3. 输入输出灵活性:支持从文件读取内容或直接从剪切板读取,处理后可以保存到文件或复制到剪切板。

以下是核心代码片段的简化解释,完整代码已在问题中提供。

关键公式转换规则

我们用正则表达式(re 模块)来匹配和替换公式格式。以下是转换的核心规则:

  • 块级公式

    text = re.sub(r'\\\[([\s\S]*?)\\\]', r'$$\n\1\n$$', input_text)
    

    解释\\\[ ... \\\] 是 LaTeX 中块级公式的写法,我们将其替换为 $$ ... $$,并在前后加换行符 \n,确保公式独占一行,Obsidian 才能正确渲染。

  • 行内公式

    text = re.sub(r'\\\(([\s\S]*?)\\\)', r'$\1$', text)
    

    解释\( ... \) 是 LaTeX 中行内公式的写法,我们将其替换为 $ ... $,这是 Obsidian 支持的行内公式格式。

  • 去除空格

    text = re.sub(r'\$\s+', r'$', text)  # 删除 $ 后面的空格
    text = re.sub(r'\s+\$', r'$', text)  # 删除 $ 前面的空格
    

    解释:Obsidian 对 $ 周围的空格非常敏感,任何多余空格都会导致公式无法渲染,因此我们用正则表达式清理空格。


完整代码

script.py

import re

import pyperclip

import sys

  

def convert_to_obsidian_format(input_text):

    """

    将输入的文档转换为 Obsidian 支持的 Markdown 格式,处理数学公式。

    :param input_text: 输入的文档内容(字符串)

    :return: 处理后的 Markdown 格式字符串

    """

    # 处理数学公式:将 \[ ... \] 转换为 $$ ... $$(块级公式)

    text = re.sub(r'\\\[([\s\S]*?)\\\]', r'$$\n\1\n$$', input_text)

    # 处理内联公式:将 \( ... \) 转换为 $ ... $(行内公式)

    text = re.sub(r'\\\(([\s\S]*?)\\\)', r'$\1$', text)

    # 处理内联公式:删除$符号前后的空格,确保Obsidian能够正确识别行内公式

    # 删除$后面的空格

    text = re.sub(r'\$\s+', r'$', text)

    # 删除$前面的空格

    text = re.sub(r'\s+\$', r'$', text)

    # 如果有其他 LaTeX 格式的公式(未用 \( 或 \[ 包裹),可以添加额外规则

    # 这里假设大部分公式已按标准 LaTeX 格式编写

    # 保留其他 Markdown 结构(如标题、列表、表格等)

    # 可以根据需求添加更多处理规则,比如处理图片、链接等

    return text

  

def process_file(input_file=None, output_file=None):

    """

    从文件读取内容,或从剪切板读取,处理后输出到文件或复制到剪切板。

    :param input_file: 输入文件路径(可选)

    :param output_file: 输出文件路径(可选)

    :return: 处理后的内容

    """

    if input_file:

        with open(input_file, 'r', encoding='utf-8') as f:

            content = f.read()

    else:

        # 如果没有输入文件,从剪切板读取内容

        content = pyperclip.paste()

        if not content:

            raise ValueError("剪切板为空,请复制内容后再运行脚本。")

    processed_content = convert_to_obsidian_format(content)

    if output_file:

        with open(output_file, 'w', encoding='utf-8') as f:

            f.write(processed_content)

        print(f"转换完成,结果已保存到 {output_file}")

    else:

        # 将结果复制到剪切板

        pyperclip.copy(processed_content)

        print("转换完成,结果已复制到剪切板。")

    return processed_content

  

def main():

    try:

        if len(sys.argv) > 1:

            input_file = sys.argv[1]

            output_file = sys.argv[2] if len(sys.argv) > 2 else None

            process_file(input_file, output_file)

        else:

            # 默认从剪切板读取内容,处理后复制到剪切板

            process_file()

    except Exception as e:

        print(f"发生错误:{e}")

  

if __name__ == "__main__":

    main()

使用方法

环境准备

  1. 确保你的电脑已安装 Python(推荐版本 3.6 或以上)。
  2. 安装必要的库:pyperclip(用于操作剪切板)。
    pip install pyperclip
    

运行脚本

  1. 从剪切板转换(最常用)

    • 将 GPT 生成的内容复制到剪切板。
    • 运行脚本(不带参数)。
    • 脚本会自动从剪切板读取内容,转换后将结果复制回剪切板。
    • 直接粘贴到 Obsidian 中即可看到正确渲染的公式。
    python script.py
    
  2. 从文件转换

    • 如果内容保存在文件 input.txt 中,运行以下命令:
    python script.py input.txt output.txt
    
    • 结果会保存到 output.txt 中。

示例输入与输出

输入(GPT 生成的内容,包含 LaTeX 公式)

这是一个行内公式 \( E = mc^2 \),还有一个块级公式:
\[ \int_{0}^{\infty} e^{-x^2} dx = \frac{\sqrt{\pi}}{2} \]

输出(转换后的 Obsidian 兼容格式)

这是一个行内公式 $E = mc^2$,还有一个块级公式:
$$
\int_{0}^{\infty} e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$

渲染效果

  • 行内公式 $E = mc^2$ 会直接嵌入文本中。
  • 块级公式 $$ ... $$ 会独占一行并居中显示,效果美观。

注意事项

  1. 复杂公式支持:本脚本主要处理标准 LaTeX 格式的公式(\[ ... \]\( ... \))。如果 GPT 生成的公式使用了其他非标准格式(例如直接用 $ 或其他符号),可能需要手动调整或扩展脚本。
  2. 其他 Markdown 元素:本脚本暂未处理图片、链接等其他 Markdown 元素,可根据需求自行扩展。

参考资料

  1. Obsidian 公式渲染官方文档

    • Obsidian 支持 MathJax 渲染数学公式,详细说明可参考:Obsidian Matht
    • 解释了 Obsidian 如何使用 $$$ 渲染公式,以及常见问题解决方法。
  2. LaTeX 公式语法

    • 如果你对 LaTeX 公式不熟悉,可以参考 Overleaf LaTeX 教程,这是一个在线 LaTeX 编辑平台,提供了详细的公式编写指南。
  3. MathJax 基础

备注

本文档由grok协助生成,但内容经过自己亲自验证和修改,如有错误感谢指正。

本文章已经生成可运行项目
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值