Math should be quotable

Discourse Math wurde im Januar 2026 stark auf eine neue, offiziell gebündelte Version mit MathJax 4.1 als Standard und KaTeX als Alternative aufgerüstet. Die Plugin-Dokumentation weist auch darauf hin, dass KaTeX die CopyTex-Erweiterung zum Kopieren der LaTeX-Quelle enthält.

Wäre es sinnvoll, einen kleinen Theme-Component-Patch hinzuzufügen, der die Auswahl von Zitaten für mathematisch umfangreiche Beiträge verbessert?

Für MathJax-lastige Seiten wie Physics with Ethan ist die praktikabelste Idee:
1. Den ausgewählten HTML-Code abfangen, bevor Discourse ihn wieder in Markdown umwandelt,
2. Math-Wrapper-Elemente finden,
3. Diese durch ihre ursprüngliche TeX-Quelle ersetzen, die in $ ... $ oder $$ ... $$ eingeschlossen ist,
4. Discourse dann den Zitatblock weiter erstellen lassen.

Hier ist ein möglicher Theme-Component-Skript, mit dem ich beginnen würde, falls es sich lohnt, den < /head > oder den JS-Bereich des Horizon (oder Standard)-Themes zu modifizieren.


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 speichert die Quelle üblicherweise in einem Annotations-Child.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

      if (annotation?.textContent?.trim()) {
        const tex = annotation.textContent.trim();

        // Heuristik: Block-Math-Wrapper sind oft Display-Container.
        const isBlock =
          el.tagName === "MJX-CONTAINER" &&
          (el.getAttribute("display") === "true" ||
            el.getAttribute("display") === "block");

        return isBlock ? `$$\n${tex}\n$$` : `$${tex}$`;
      }

      return null;
    }

    function patchMathInFragment(fragment) {
      const candidates = fragment.querySelectorAll(
        "mjx-container, .math, .katex, .MathJax"
      );

      candidates.forEach((node) => {
        const replacement = texFromMathElement(node);
        if (!replacement) {
          return;
        }

        const textNode = document.createTextNode(replacement);
        node.replaceWith(textNode);
      });

      return fragment;
    }

    api.modifyClass("component:quote-button", {
      pluginId: "ethan-math-quote-fix",

      _selectionChanged() {
        this._super(...arguments);

        try {
          const selection = window.getSelection();
          if (!selection || selection.rangeCount === 0) {
            return;
          }

          const range = selection.getRangeAt(0);
          const fragment = range.cloneContents();
          patchMathInFragment(fragment);

          const container = document.createElement("div");
          container.appendChild(fragment);

          // Ersetze den Puffer, den Discourse später in Zitat-Markdown umwandelt.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Leise fehlschlagen, damit das normale Zitieren weiterhin funktioniert.
          console.warn("Math quote patch failed:", e);
        }
      },
    });
  });
</script>

Ein paar wichtige Vorbehalte:
• Dies ist ein praktischer Patch, nichts, was ich bereits von Meta veröffentlicht gefunden habe. Die zugrunde liegende Strategie wird aus dem Zitatpfad abgeleitet, der durch den ausgewählten HTML-Code und zuMarkdown führt.
• Er wird höchstwahrscheinlich helfen, wenn ich den MathJax-Anbieter verwende, was der aktuelle Standard in Discourse Math ist und die Option, die ich normalerweise verwende.
• Das Skript muss möglicherweise kleine Selektoranpassungen erfordern, je nachdem, ob mein gerendertes Math als mjx-container, .MathJax oder ein anderer Wrapper endet. Ich würde dies auf einer Staging-Site testen, die eine neue Standardinstallation wäre.
• Es ist unwahrscheinlich, dass es für jeden Randfall perfekt ist, insbesondere bei gemischten Inline-/Blockauswahlen oder verschachtelten zitierten Inhalten.

Da Discourse KaTeX nun offiziell mit CopyTex unterstützt, besteht eine andere Möglichkeit darin, den Anbieter zu wechseln, wenn mein Hauptproblem das Kopieren der LaTeX-Quelle und nicht die Wiedergabetreue ist. Dies würde die Zitat-Auswahl nicht automatisch lösen, bedeutet aber, dass das gerenderte Math bereits einen kopierfreundlicheren Pfad integriert hat.

Für meine MathJax-lastige Seite, Physics with Ethan, denke ich derzeit:
• MathJax beibehalten, es sei denn, jemand schlägt vor, zu KaTeX zu wechseln? ,
• Möglicherweise einen Zitat-Auswahl-Patch zum Horizon-Theme hinzufügen, basierend auf dem oben Genannten (unter Verwendung einer Staging-Site).
• Und es als lokale Qualitätsverbesserung behandeln, bis es eine ordnungsgemäße Upstream-Lösung gibt. Die Tatsache, dass dieses Diskussionsthema von 2020 im Jahr 2026 noch offen ist, deutet darauf hin, dass Upstream hier langsam bleiben könnte.

2 „Gefällt mir“