您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a copy button next to LaTeX formulas
- // ==UserScript==
- // @name chatgpt-export
- // @namespace http://tampermonkey.net/
- // @version 0.1
- // @description Add a copy button next to LaTeX formulas
- // @author You
- // @match https://chat.openai.com/*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- let debounceTimer;
- const addCopyButtons = () => {
- const mathDivs = document.querySelectorAll('.math, .math-inline, .math-display');
- const copiedButtonHtml = `<button
- class="flex ml-auto gap-2 rounded-md p-1 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg
- stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round"
- stroke-linejoin="round" class="icon-sm" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
- <polyline points="20 6 9 17 4 12"></polyline>
- </svg></button>`
- const copyButtonHtml = `<button
- class="flex ml-auto gap-2 rounded-md p-1 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg
- stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round"
- stroke-linejoin="round" class="icon-sm" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
- <path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path>
- <rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect>
- </svg></button>`
- mathDivs.forEach(div => {
- if (div.getAttribute('data-copy-button-added') === 'true') return;
- div.setAttribute('data-copy-button-added', 'true');
- const annotation = div.querySelector('annotation[encoding="application/x-tex"]');
- if (annotation) {
- let latexText = annotation.textContent;
- const copyButton = document.createElement('span');
- copyButton.className = 'copy-button text-gray-400 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400';
- copyButton.innerHTML = copyButtonHtml;
- copyButton.style.verticalAlign = 'middle'; // 确保与行内文本对齐
- copyButton.style.display = 'inline-flex'; // 使用 flex 布局保持行内
- if (div.classList.contains('math-display')) {
- latexText = `$$ ${latexText} $$`
- copyButton.style.position = 'absolute';
- copyButton.style.top = '0';
- copyButton.style.right = '0';
- copyButton.style.zIndex = '1';
- div.style.position = 'relative';
- div.appendChild(copyButton);
- } else if (div.classList.contains('math-inline')) {
- latexText = `$ ${latexText} $`
- copyButton.style.marginLeft = '5px';
- div.parentNode.insertBefore(copyButton, div.nextSibling);
- }
- copyButton.addEventListener('click', () => {
- navigator.clipboard.writeText(latexText).then(() => {
- copyButton.innerHTML = copiedButtonHtml;
- setTimeout(() => {
- copyButton.innerHTML = copyButtonHtml;
- }, 2000);
- }).catch(err => {
- console.error('复制失败:', err);
- });
- });
- }
- });
- };
- const debounceAddCopyButtons = () => {
- clearTimeout(debounceTimer);
- debounceTimer = setTimeout(addCopyButtons, 300);
- };
- addCopyButtons(); // Run once initially
- const observer = new MutationObserver(() => {
- console.log("DOM has changed, rechecking...");
- debounceAddCopyButtons();
- });
- observer.observe(document.body, { childList: true, subtree: true });
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址