共计 2529 个字符,预计需要花费 7 分钟才能阅读完成。
背景
在学术写作或技术文档编写过程中,LaTeX 公式是不可或缺的一部分。许多用户习惯使用 ChatGPT 来生成或转换 LaTeX 公式,但在复制这些公式时经常会遇到格式混乱的问题。例如,ChatGPT 返回的公式可能包含多余的换行符、HTML 标签或其他非 LaTeX 字符,导致粘贴到 LaTeX 编辑器时需要手动清理,极大降低了工作效率。

技术方案选择
针对这个问题,我们可以考虑几种不同的实现方式:
- 浏览器扩展 :功能强大,可以深度集成到浏览器中,但需要用户安装,跨浏览器兼容性较差。
- 书签工具 :轻量级,无需安装,但功能受限,无法使用高级 API。
- 用户脚本(如 Tampermonkey):介于前两者之间,灵活但依赖脚本管理器。
考虑到易用性和功能需求的平衡,本文选择浏览器扩展作为实现方案,因为它能提供最完整的 API 支持和最佳的用户体验。
核心实现
1. 监听页面变化
首先,我们需要监听 ChatGPT 页面的变化,以便在用户请求公式时及时捕获内容。可以使用 MutationObserver API 来实现:
const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {if (mutation.addedNodes.length) {checkForNewLatex(mutation.addedNodes);
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
2. 识别和提取 LaTeX 公式
ChatGPT 中的 LaTeX 公式通常被包裹在特定的标记中。我们可以使用正则表达式来识别并提取这些公式:
function extractLatexFromNode(node) {const latexRegex = /\\\[(.*?)\\\]|\\\\(.*?\\\\)/gs;
const matches = node.textContent.matchAll(latexRegex);
const formulas = [];
for (const match of matches) {
// 处理显示公式和行内公式
const formula = match[1] || match[2];
if (formula) {
formulas.push({original: match[0],
cleaned: formula
});
}
}
return formulas;
}
3. 添加复制按钮
对于每个识别到的 LaTeX 块,我们需要添加一个复制按钮:
function addCopyButton(latexContainer, formula) {const button = document.createElement('button');
button.textContent = 'Copy LaTeX';
button.className = 'latex-copy-btn';
button.addEventListener('click', () => {navigator.clipboard.writeText(formula.cleaned)
.then(() => {
button.textContent = 'Copied!';
setTimeout(() => {button.textContent = 'Copy LaTeX';}, 2000);
})
.catch(err => {console.error('Failed to copy:', err);
});
});
latexContainer.appendChild(button);
}
兼容性处理
1. 跨浏览器支持
不同浏览器对 Clipboard API 的实现略有不同。我们需要添加适当的特性检测和回退方案:
function copyToClipboard(text) {if (navigator.clipboard) {return navigator.clipboard.writeText(text);
} else {
// 回退方案:使用 document.execCommand
const textarea = document.createElement('textarea');
textarea.value = text;
document.body.appendChild(textarea);
textarea.select();
const result = document.execCommand('copy');
document.body.removeChild(textarea);
return result ? Promise.resolve() : Promise.reject();
}
}
2. ChatGPT UI 变化应对
ChatGPT 的 UI 可能会更新,导致我们的选择器失效。解决方案是使用更健壮的选择方式:
function findChatGPTResponseContainers() {
// 尝试多种可能的容器选择方式
return document.querySelectorAll('[class*="response"], [class*="message"], [class*="content"') || [];}
性能优化
- 限制 MutationObserver 范围 :只观察包含消息的区域,而非整个文档。
- 防抖处理 :对于频繁的 DOM 变化,添加防抖以避免性能问题。
- 缓存已处理元素 :避免重复处理相同的公式块。
避坑指南
- 特殊字符转义 :某些 LaTeX 特殊字符在 HTML 中可能被转义,需要正确处理。
- 多公式处理 :当一段文本中包含多个公式时,确保每个都能被正确识别。
- 公式嵌套 :处理公式嵌套在其他元素中的情况。
总结与扩展
本文介绍的工具解决了从 ChatGPT 复制 LaTeX 公式的核心问题。在此基础上,可以考虑以下扩展功能:
- 添加 Markdown 支持
- 支持更多 AI 聊天平台
- 实现公式预览功能
- 添加用户自定义设置
思考题
如何将此工具集成到其他 AI 聊天平台?可以考虑以下方向:
- 抽象出通用的公式识别逻辑
- 为不同平台创建适配器
- 实现配置化的平台支持
希望这篇文章能帮助你开发出自己的 LaTeX 公式复制工具,提升工作效率。如果在实现过程中遇到问题,欢迎在评论区交流讨论。
正文完
发表至: 未分类
近两天内
