Mathematik sollte zitierbar sein

Wir haben ein Discourse-Forum für eine wissenschaftliche Software und nutzen das Math-Plugin. Leider lassen sich mathematische Formeln nicht zitieren.

Wenn ich einen Text auswähle, erscheint eine Schaltfläche für Zitate:

Beim Klicken darauf ergibt sich Folgendes:

[quote]
definition of the closeness centrality:

ci=1N−1N∑j=11dij c_i = \frac{1}{N-1} \sum_{j=1}^N\frac{1}{d_{ij}}
[/quote]

Beachten Sie, dass in der Zitation die Mathematik als seltsame Textversion (unlesbar) erscheint, gefolgt von der eigentlichen LaTeX-Quelltext, jedoch ohne die $-Begrenzer.

Ich nehme an, dass es dafür derzeit keine Lösung gibt. Es wäre schön, wenn dies in Zukunft verbessert werden könnte.

8 „Gefällt mir“

Dies tritt weiterhin auf und betrifft auch Inline-Mathematik, wie von einem Mitglied auf unserer Instanz berichtet:

3 „Gefällt mir“

Hinweis: Ich stimme völlig zu, dass wir das bereinigen sollten, aber es fühlt sich extrem kompliziert an.

Ich setze hier ein pr-welcome, falls jemand mit fortgeschrittenen Fähigkeiten es versuchen möchte.

7 „Gefällt mir“

Ich habe mir das Zitieren von Mathematik angesehen (ich erwäge, einen PR zu schreiben oder zu einem beizutragen).

Hier dokumentiere ich einige erste Gedanken und Erkenntnisse.

Mein erster Eindruck ist, dass einer dieser Punkte patchbar sein könnte:

  • toMarkdown gleicht Elemente mit verschiedenen HTML-Tags ab; MathJax verwendet benutzerdefinierte Elemente, die ich für erkennbar halte (möglicherweise nicht SVG-Rendering), vielleicht auch KaTeX?
  • selectedText führt einige Abgleiche für Elemente wie Codeblöcke und Onebox durch – könnte man MathJax/KaTeX-Elemente erkennen und transformieren? (Hinweis: Wahrscheinlich ist es eine gute Idee, hier einen Hook oder etwas Ähnliches zu haben, damit die Logik für die Transformation im discourse-math-Plugin statt in der Haupt-Codebasis von Discourse hinzugefügt werden kann.)
  • Die anderen Punkte scheinen nicht so geeignet wie diese beiden.

Einige weitere Gedanken zu Ansätzen und wie man die rohe Mathematik erhält.

Abhängig davon, wie KaTeX / MathJax + SVG[1] funktionieren, sollte jede Instanz von Mathematik ein root HTML-Element haben, denke ich (möglicherweise mehrere, da es einige versteckte Elemente für Barrierefreiheit und Ähnliches gibt). Wenn wir also die Stellen kennen, an denen Mathematik existiert, könnten wir den rohen Post nach Instanzen von Inhalten durchsuchen, die mit $ abgegrenzt sind (aber Interpreter sind knifflig – vielleicht gibt es bereits einen in der Codebasis?).

Alternativ hat MathJax zumindest eine Rechtsklick-Funktion \u003e Tex anzeigen (was die buchstäbliche Zeichenkette zwischen $-Paaren sein sollte); Ich bin mir nicht sicher, wie man sich damit verbinden kann, aber wenn es einen Weg gibt, dies für MathJax v2, v3 und KaTeX zu tun, dann sollte es möglich sein, dies zu verwenden, um ausgewählte formatierte Mathematik durch $...$ zu ersetzen (Hinweis: das funktioniert für Inline-Mathematik, wir müssen auch den Fall für die andere Art abdecken – die $$...$$ oder [/.../] Delimiter verwendet.)

Aktuelle Probleme:

  • Ich weiß nicht, wie man einen Hook implementiert oder ob es etwas Besseres gibt / einen besseren Weg, dies in der Discourse-Codebasis zu tun.
  • Mehrere Unbekannte über MathJax/KaTeX, die untersucht werden müssen.
    • HTML-Elemente – wie erkennt man sie zuverlässig?
    • Wie erhält man rohen TeX-Code?

Wenn jemand andere Ideen hat, wo/was man patchen könnte, andere mögliche Implementierungsmethoden oder was auch immer, dann bitte posten.


  1. Ich glaube, MathJax + SVG wird möglicherweise nicht unterstützt, also ist das möglicherweise kein Problem ↩︎

6 „Gefällt mir“

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.

3 „Gefällt mir“