Math should be quotable

Discourse Math fue actualizado significativamente en enero de 2026 a una nueva versión oficial incluida en el núcleo, con MathJax 4.1 como predeterminado y KaTeX como alternativa. La documentación del complemento también señala que KaTeX incluye la extensión CopyTex para copiar el código fuente de LaTeX.

¿Valdría la pena agregar un pequeño parche de componente de tema que mejore la selección de citas para publicaciones con mucho contenido matemático?

Para sitios con mucho MathJax, como Physics with Ethan, la idea más práctica es:

  1. Interceptar el HTML seleccionado antes de que Discourse lo convierta de nuevo en Markdown,
  2. Encontrar los elementos contenedores de matemáticas,
  3. Reemplazarlos con su fuente TeX original envuelta en $...$ o $$...$$,
  4. Luego permitir que Discourse continúe construyendo la cita.

Aquí hay un posible script de componente de tema con el que comenzaría, si vale la pena modificar el área de </head> o JS del tema Horizon (o Predeterminado).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 comúnmente almacena la fuente en un hijo de anotación.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

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

        // Heurística: los contenedores de bloques matemáticos son a menudo contenedores de visualización.
        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);

          // Reemplazar el búfer que Discourse convierte más tarde en markdown de cita.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Fallar silenciosamente para que la cita normal siga funcionando.
          console.warn("El parche de cita matemática falló:", e);
        }
      },
    });
  });
</script>

Algunas advertencias importantes:

  • Este es un parche práctico, no algo que encontré publicado por Meta. La estrategia subyacente se infiere de la ruta de la cita que pasa por el HTML seleccionado y aMarkdown.
  • Es más probable que ayude cuando estoy usando el proveedor MathJax, que es el predeterminado actual en Discourse Math, y la opción que suelo usar.
  • Es posible que el script necesite pequeños ajustes en los selectores dependiendo de si mis matemáticas renderizadas terminan como mjx-container, .MathJax u otro contenedor. Probaría en un sitio de staging, que sería una nueva instalación estándar.
  • Es poco probable que sea perfecto para todos los casos extremos, especialmente selecciones mixtas en línea/bloque o material citado anidado.

Dado que Discourse ahora admite oficialmente KaTeX con CopyTex, otra ruta es cambiar el proveedor si mi principal punto de dolor es copiar el código fuente de LaTeX en lugar de la fidelidad de renderizado. Eso no resolvería automáticamente la selección de citas, pero significa que las matemáticas renderizadas ya tienen una ruta más fácil de copiar incorporada.

Para mi sitio con mucho MathJax, Physics with Ethan, actualmente estoy pensando:

  • mantener MathJax a menos que alguien sugiera que podría cambiar a KaTeX? ,
  • quizás agregar un parche de selección de citas al tema Horizon, de lo anterior (usando un sitio de staging).
  • y tratarlo como una corrección local de calidad de vida hasta que haya una solución upstream adecuada. Que este tema de función de 2020 siga abierto en 2026 sugiere que el upstream puede seguir siendo lento aquí.
2 Me gusta