Les mathématiques devraient être citables

Nous disposons d’un forum Discourse pour un logiciel scientifique et utilisons le plugin math. Malheureusement, les équations mathématiques ne peuvent pas être citées.

Si je sélectionne un texte, un bouton « Citer » apparaît :

En cliquant dessus, le résultat suivant s’affiche :

[quote]
définition de la centralité de proximité :

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

Remarquez que dans la citation, l’équation mathématique apparaît sous une forme textuelle étrange (illisible), suivie du code LaTeX source, mais sans les délimiteurs $.

Je suppose qu’il n’existe actuellement aucune solution pour cela. Ce serait bien que cela puisse être amélioré à l’avenir.

8 « J'aime »

Cela se produit toujours et affecte également les formules mathématiques en ligne, comme l’a signalé un membre sur notre instance :

3 « J'aime »

Note : je suis tout à fait d’accord pour que nous nettoyions cela, mais cela semble extrêmement compliqué.

Je mets une balise pr-welcome sur ce sujet au cas où quelqu’un avec des compétences avancées souhaiterait s’y essayer.

7 « J'aime »

J’ai examiné la mise en citation des mathématiques (j’envisage d’écrire une PR ou de contribuer à une PR).

Je documente ici quelques réflexions et découvertes initiales.

Donc, mon impression initiale est que l’un de ces points pourrait être patchable :

  • toMarkdown fait correspondre des éléments à diverses balises HTML ; mathjax utilise des éléments personnalisés, je pense qu’ils sont détectables (peut-être pas le rendu SVG), peut-être que katex aussi ?
  • selectedText effectue une correspondance pour des éléments comme les blocs de code et les onebox – pourrait-il détecter les éléments mathjax/katex et les transformer ? (Note : il serait probablement judicieux d’avoir un hook ou quelque chose de similaire ici afin que la logique de transformation puisse être ajoutée au plugin discourse-math au lieu de la base de code principale de discourse).
  • les autres points ne semblent pas aussi appropriés que ces deux-là.

Quelques autres réflexions sur les approches et comment obtenir les mathématiques brutes.

Selon le fonctionnement de katex / mathjax+svg[^1], chaque instance de mathématiques devrait avoir un élément HTML racine, je pense (possiblement plusieurs car il y a des éléments cachés pour l’accessibilité et autres). Donc, si nous connaissons les endroits où les mathématiques existent, nous pourrions analyser la publication brute pour trouver des instances de contenu délimitées par $ (mais les interpréteurs sont délicats – peut-être qu’il y en a déjà un dans la base de code ?)

[^1] : Je pense que mathjax+svg n’est peut-être pas pris en charge, donc ce n’est peut-être pas un problème

Alternativement, mathjax a au moins une fonctionnalité de clic droit > afficher_tex (qui devrait être la chaîne littérale entre les paires $) ; je ne sais pas comment y accrocher, mais s’il existe un moyen de le faire pour mathjax v2, v3 et katex, alors il devrait être possible de l’utiliser pour remplacer les mathématiques formatées sélectionnées par $...$ (note : cela fonctionne pour les mathématiques en ligne, il faut aussi couvrir le cas de l’autre type, qui utilise des délimiteurs $$...$$ ou [/.../].)

Problèmes actuels :

  • Je ne sais pas comment implémenter un hook ni s’il existe quelque chose de mieux à utiliser / une meilleure façon de le faire dans la base de code de discourse.
  • Plusieurs inconnues concernant mathjax/katex qui doivent être étudiées.
    • Éléments HTML – comment les détecter de manière fiable ?
    • Comment obtenir le code TeX brut ?

Si quelqu’un a d’autres idées sur où/quoi patcher, d’autres méthodes d’implémentation possibles, ou quoi que ce soit d’autre, merci de les poster.

6 « J'aime »

Discourse Math a été considérablement mis à jour en janvier 2026 vers une nouvelle version officielle groupée, avec MathJax 4.1 par défaut et KaTeX comme alternative. La documentation du plugin note également que KaTeX inclut l’extension CopyTex pour copier la source LaTeX.

Vaut-il la peine d’ajouter un petit correctif de composant de thème qui améliore la sélection des citations pour les messages contenant beaucoup de contenu mathématique ?

Pour les sites à forte densité de MathJax comme Physics with Ethan, l’idée la plus pratique est la suivante :

  1. Intercepter le HTML sélectionné avant que Discourse ne le reconvertisse en Markdown,
  2. Trouver les éléments d’enveloppement des mathématiques,
  3. Les remplacer par leur source TeX originale encapsulée dans $...$ ou $$...$$,
  4. Laisser ensuite Discourse continuer à construire la citation.

Voici un script de composant de thème potentiel avec lequel je commencerais, s’il est judicieux de modifier la zone </head> ou JS du thème Horizon (ou Défaut).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 stocke couramment la source dans un enfant d'annotation.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

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

        // Heuristique : les conteneurs mathématiques en bloc sont souvent des conteneurs d'affichage.
        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);

          // Remplacer le tampon que Discourse convertit ensuite en markdown de citation.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Échouer silencieusement pour que la citation normale fonctionne toujours.
          console.warn("Le correctif de citation mathématique a échoué :", e);
        }
      },
    });
  });
</script>

Quelques mises en garde importantes :

  • Il s’agit d’un correctif pratique, pas de quelque chose que j’ai trouvé déjà publié par Meta. La stratégie sous-jacente est déduite du chemin de citation passant par le HTML sélectionné et toMarkdown.
  • Il est plus susceptible d’aider lorsque j’utilise le fournisseur MathJax, qui est la valeur par défaut actuelle dans Discourse Math, et l’option que j’utilise habituellement.
  • Le script pourrait nécessiter de petits ajustements de sélecteur en fonction de si mes mathématiques rendues finissent par être mjx-container, .MathJax, ou un autre enveloppement. Je testerais sur un site de staging, qui serait une nouvelle installation standard.
  • Il est peu probable qu’il soit parfait pour tous les cas limites, en particulier les sélections mixtes en ligne/bloc ou le contenu cité imbriqué.

Étant donné que Discourse prend désormais officiellement en charge KaTeX avec CopyTex, une autre approche consiste à changer de fournisseur si mon principal point de douleur est la copie de la source LaTeX plutôt que la fidélité du rendu. Cela ne résoudrait pas automatiquement la sélection de citation, mais cela signifie que les mathématiques rendues ont déjà un chemin plus facile à copier intégré.

Pour mon site à forte densité de MathJax, Physics with Ethan, je pense actuellement :

  • Garder MathJax à moins que quelqu’un ne suggère de passer à KaTeX ? ,
  • Peut-être ajouter un correctif de sélection de citation au thème Horizon, à partir de ce qui précède (en utilisant un site de staging).
  • Et le traiter comme une correction locale de qualité de vie jusqu’à ce qu’il y ait une solution amont appropriée. Le fait que ce sujet de fonctionnalité de 2020 soit toujours ouvert en 2026 suggère que la solution amont pourrait rester lente à cet égard.
3 « J'aime »