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.