ChatGPT LaTeX Support

Support LaTeX for ChatGPT

// ==UserScript==
// @name         ChatGPT LaTeX Support
// @namespace    http://tampermonkey.net/
// @version      0.1.1
// @description  Support LaTeX for ChatGPT
// @author       Elcvise
// @license      MIT
// @match        https://chat.openai.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=openai.com
// @grant        none
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js
// ==/UserScript==

"use strict";

function render_item(item) {
  renderMathInElement(item, {
    // customised options
    // • auto-render specific keys, e.g.:
    delimiters: [
      { left: "$$", right: "$$", display: true },
      { left: "$", right: "$", display: false },
      { left: "\\(", right: "\\)", display: false },
      { left: "\\[", right: "\\]", display: true },
    ],
    // • rendering keys, e.g.:
    throwOnError: false,
  });
  return true;
}

function check_and_render(item) {
  if (!item) return false;
  if (item?.classList?.contains("math-display")) return false;
  if (item?.classList?.contains("rendered")) return false;
  if (item?.classList?.contains("katex")) return false;
  render_item(item);
  item.classList.add("rendered");
  console.log("render_succeed");
  return true;
}

function rend_latest() {
  try {
    const list = document.getElementsByClassName("text-base");
    for (const ppp of list) {
      for (const text of ppp.querySelectorAll(
        ".markdown:not(.result-streaming)"
      )) {
        check_and_render(text);
      }
      for (const text of ppp.querySelectorAll(
        ".markdown.result-streaming > *:not(:last-child):not(pre), " +
          ".markdown.result-streaming > ol:last-child li:not(last-child), " +
          ".markdown.result-streaming > ul:last-child li:not(last-child)"
      )) {
        check_and_render(text);
      }
    }
  } catch (e) {
    console.warn(e);
  }
}

window.katex = katex;

window.rend_latest = rend_latest;

setInterval(() => {
  rend_latest();
}, 1000);