La matematica dovrebbe essere citabile

Abbiamo un forum Discourse per un software scientifico e utilizziamo il plugin math. Purtroppo, le equazioni non sono quotabili.

Se seleziono del testo, appare un pulsante “Cita”:

Cliccandolo si ottiene quanto segue:

[quote]
definizione della centralità di vicinanza:

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

Notate che nella citazione, l’equazione matematica appare come una versione testuale strana (illegibile) seguita dal codice LaTeX effettivo, ma senza i delimiter $.

Suppongo che al momento non ci sia una soluzione per questo. Sarebbe bello se ciò potesse essere migliorato in futuro.

8 Mi Piace

Questo problema persiste e si verifica anche con le equazioni matematiche inline, come segnalato da un membro della nostra istanza:

3 Mi Piace

Nota: sono completamente d’accordo che dovremmo sistemare questa cosa, ma sembra estremamente complicata.

Ho aggiunto un tag pr-welcome nel caso in cui qualcuno con competenze avanzate voglia provarci.

7 Mi Piace

Ho dato un’occhiata alla quotazione della matematica (sto pensando di scrivere un PR o contribuire a uno).

Documento qui alcuni pensieri e scoperte iniziali.

Quindi la mia impressione iniziale è che uno di questi punti potrebbe essere modificabile:

  • toMarkdown confronta gli elementi con vari tag HTML; penso che mathjax utilizzi elementi personalizzati rilevabili (forse non il rendering SVG), forse anche katex?
  • selectedText esegue alcuni confronti per elementi come blocchi di codice e onebox – potrebbe essere in grado di rilevare elementi mathjax/katex e trasformarli? (Nota: probabilmente sarebbe una buona idea avere un hook o qualcosa di simile qui in modo che la logica di trasformazione possa essere aggiunta al plugin discourse-math invece del codice principale di discourse).
  • gli altri punti non sembrano adatti come questi due.

Altri pensieri sugli approcci e su come ottenere la matematica grezza.

A seconda di come funzionano katex / mathjax+svg[1], ogni istanza di matematica dovrebbe avere un elemento HTML radice, penso (possibilmente più di uno perché ci sono alcuni elementi nascosti per l’accessibilità e altro). Quindi, se conosciamo i posti in cui esiste la matematica, potremmo essere in grado di analizzare il post grezzo per istanze di contenuto delimitate da $ (ma gli interpreti sono complicati – forse ce n’è già uno nel codebase?)

In alternativa, mathjax ha almeno una funzione di clic destro \u003e visualizza-tex (che dovrebbe essere la stringa letterale tra coppie di $); non sono sicuro di come agganciarmi a questo, ma se c’è un modo per farlo per mathjax v2, v3 e katex, allora dovrebbe essere possibile usarlo per sostituire la matematica formattata selezionata con $...$ (nota: questo funziona per la matematica inline, è necessario coprire anche il caso per l’altro tipo, che utilizza delimitatori $$...$$ o [/.../].)

Problemi attuali:

  • Non so come implementare un hook o se c’è qualcosa di meglio da usare / un modo migliore per farlo nel codebase di discourse.
  • Diverse incognite su mathjax/katex che devono essere investigate.
    • Elementi HTML – come rilevarli in modo affidabile?
    • Come ottenere il codice TeX grezzo?

Se qualcuno ha altre idee su dove/cosa modificare, altri possibili metodi di implementazione o altro, allora prego di postarle.


  1. Penso che mathjax+svg non sia supportato, quindi forse non è un problema ↩︎

6 Mi Piace

Discourse Math è stato notevolmente aggiornato a gennaio 2026 a una nuova versione ufficiale inclusa nel core, con MathJax 4.1 come predefinito e KaTeX come alternativa. La documentazione del plugin nota anche che KaTeX include l’estensione CopyTex per copiare il sorgente LaTeX.

Valrebbe la pena aggiungere una piccola patch di theme-component che migliori la selezione delle citazioni per i post con molta matematica?

Per i siti con molta matematica in MathJax, come Physics with Ethan, l’idea più pratica è:

  1. Intercettare l’HTML selezionato prima che Discourse lo riconverta in Markdown,
  2. Trovare gli elementi contenitori della matematica,
  3. Sostituirli con la loro sorgente TeX originale racchiusa in $...$ o $$...$$,
  4. Quindi lasciare che Discourse continui a costruire la citazione.

Ecco un potenziale script di theme-component con cui inizierei, se valga la pena modificare l’area </head> o JS del tema Horizon (o Default).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 comunemente memorizza la sorgente in un figlio di annotazione.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

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

        // Euristica: i contenitori di matematica a blocco sono spesso contenitori di visualizzazione.
        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);

          // Sostituisci il buffer che Discourse converte successivamente in markdown di citazione.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Fallisci silenziosamente in modo che la normale quotazione continui a funzionare.
          console.warn("La patch di citazione matematica è fallita:", e);
        }
      },
    });
  });
</script>

Alcune importanti avvertenze:

  • Questa è una patch pratica, non qualcosa che ho trovato già pubblicato da Meta. La strategia sottostante è dedotta dal percorso di citazione che passa attraverso l’HTML selezionato e aMarkdown.
  • È più probabile che sia utile quando sto usando il provider MathJax, che è quello predefinito in Discourse Math, e l’opzione che uso di solito.
  • Lo script potrebbe necessitare di piccole modifiche ai selettori a seconda che la mia matematica renderizzata finisca come mjx-container, .MathJax o un altro contenitore. Lo proverei su un sito di staging, che sarebbe una nuova installazione standard.
  • È improbabile che sia perfetto per ogni caso limite, specialmente per selezioni miste inline/blocco o materiale citato annidato.

Poiché Discourse ora supporta ufficialmente KaTeX con CopyTex, un’altra strada è cambiare provider se il mio problema principale è copiare il sorgente LaTeX piuttosto che la fedeltà di rendering. Questo non risolverebbe automaticamente la selezione della citazione, ma significa che la matematica renderizzata ha già un percorso più facile da copiare integrato.

Per il mio sito con molta matematica, Physics with Ethan, al momento sto pensando:

  • mantenere MathJax a meno che qualcuno non suggerisca di passare a KaTeX? ,
  • forse aggiungere una patch di selezione citazione al tema Horizon, da quanto sopra (usando un sito di staging).
  • e trattarlo come una correzione locale per la qualità della vita fino a quando non ci sarà una soluzione upstream adeguata. Il fatto che questa discussione sulla funzionalità del 2020 sia ancora aperta nel 2026 suggerisce che l’upstream potrebbe rimanere lento qui.
3 Mi Piace