Tenemos un foro de Discourse para un software científico y utilizamos el plugin de matemáticas. Lamentablemente, las fórmulas matemáticas no son citables.
Si selecciono un texto, aparece un botón de Citar:
[quote]
definición de la centralidad de cercanía:
ci=1N−1N∑j=11dij c_i = \frac{1}{N-1} \sum_{j=1}^N\frac{1}{d_{ij}}
[/quote]
Fíjate que en la cita, la fórmula matemática aparece como una versión textual extraña (ilegible) seguida del código LaTeX real, pero sin los delimitadores $.
Supongo que actualmente no hay ninguna solución para esto. Sería bueno que esto pudiera mejorarse en el futuro.
El contenido que se pasa a la cita proviene de this.quoteState.buffer, que se rellena en QuoteButton._selectionChanged (quizás en otros lugares también)
La función buildQuote toma un objeto de publicación, creo que es una descripción JSON completa de la publicación ejemplo.
Así que mi impresión inicial es que uno de estos puntos podría ser parcheable:
toMarkdown compara elementos con varias etiquetas HTML; creo que mathjax usa elementos personalizados que son detectables (quizás no la representación SVG), ¿quizás katex también?
selectedText realiza algunas comparaciones para elementos como bloques de código y onebox. ¿Podría detectar elementos de mathjax/katex y transformarlos? (Nota: probablemente sea una buena idea tener un hook o algo aquí para que la lógica de transformación se pueda agregar al plugin discourse-math en lugar del código base principal de discourse).
los otros puntos no parecen tan adecuados como estos dos.
Otras ideas sobre enfoques y cómo obtener las matemáticas sin procesar.
Dependiendo de cómo funcionen katex / mathjax + svg[1], cada instancia de matemáticas debería tener un elemento HTML raíz, creo (posiblemente múltiples, ya que hay algunos elementos ocultos para accesibilidad y otras cosas). Entonces, si conocemos los lugares donde existen las matemáticas, podríamos analizar la publicación sin procesar en busca de instancias de contenido delimitado por $ (pero los intérpretes son complicados, ¿quizás ya hay uno en el código base?).
Alternativamente, mathjax al menos tiene una función de clic derecho > ver tex, etc. (que debería ser la cadena literal entre pares de $); No estoy seguro de cómo conectarme a eso, pero si hay una manera de hacerlo para mathjax v2, v3 y katex, entonces debería ser posible usar eso para reemplazar las matemáticas formateadas seleccionadas con $...$ (nota: eso funciona para matemáticas en línea, también hay que cubrir el caso para el otro tipo, que usa delimitadores $$...$$ o [/.../].)
Problemas actuales:
No sé cómo implementar un hook o si hay algo mejor que usar / una mejor manera de hacerlo en el código base de discourse.
Varios desconocidos sobre mathjax/katex que necesitan ser investigados.
Elementos HTML: ¿cómo detectarlos de manera confiable?
¿Cómo obtener el código TeX sin procesar?
Si alguien tiene alguna otra idea sobre dónde/qué parchear, otros métodos de implementación posibles o lo que sea, por favor publíquelos.
Creo que mathjax + svg no es compatible, así que eso quizás no sea un problema↩︎
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:
Interceptar el HTML seleccionado antes de que Discourse lo convierta de nuevo en Markdown,
Encontrar los elementos contenedores de matemáticas,
Reemplazarlos con su fuente TeX original envuelta en $...$ o $$...$$,
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í.