O Discourse Math foi amplamente atualizado em janeiro de 2026 para uma nova versão oficial incluída no núcleo, com MathJax 4.1 como padrão e KaTeX como alternativa. A documentação do plugin também observa que o KaTeX inclui a extensão CopyTex para copiar a origem LaTeX.
Valeria a pena adicionar um pequeno patch de componente de tema que melhora a seleção de citações para posts com muito conteúdo matemático?
Para sites com uso intensivo de MathJax, como o Physics with Ethan, a ideia mais prática é:
- interceptar o HTML selecionado antes que o Discourse o converta de volta em Markdown,
- encontrar os elementos de encapsulamento de matemática,
- substituí-los pela sua fonte TeX original encapsulada em
$...$ou$$...$$, - então deixar o Discourse continuar construindo a citação.
Aqui está um potencial script de componente de tema com o qual eu começaria, se valer a pena modificar a área de </head> ou JS do tema Horizon (ou Padrão).
<script type="text/discourse-plugin" version="1.0">
apiInitializer("1.34.0", (api) => {
function texFromMathElement(el) {
// MathJax v3/v4 comumente armazena a fonte em um filho de anotação.
const annotation =
el.querySelector('annotation[encoding="application/x-tex"]') ||
el.querySelector('annotation');
if (annotation?.textContent?.trim()) {
const tex = annotation.textContent.trim();
// Heurística: wrappers de bloco de matemática são frequentemente contêineres de exibição.
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);
// Substitui o buffer que o Discourse converte posteriormente em markdown de citação.
if (this.quoteState) {
this.quoteState.buffer = container.innerHTML;
}
} catch (e) {
// Falha silenciosamente para que a citação normal ainda funcione.
console.warn("Math quote patch failed:", e);
}
},
});
});
</script>
Algumas ressalvas importantes:
- Este é um patch prático, não algo que encontrei publicado pela Meta. A estratégia subjacente é inferida do caminho da citação passando pelo HTML selecionado e paraMarkdown.
- É mais provável que ajude quando estou usando o provedor MathJax, que é o padrão atual no Discourse Math, e a opção que costumo usar.
- O script pode precisar de pequenos ajustes nos seletores, dependendo se a minha matemática renderizada acaba como
mjx-container,.MathJaxou outro wrapper. Eu testaria em um site de staging, que seria uma nova instalação padrão. - É improvável que seja perfeito para todos os casos extremos, especialmente seleções mistas inline/bloco ou material citado aninhado.
Como o Discourse agora suporta oficialmente o KaTeX com CopyTex, outra abordagem é mudar o provedor se o meu principal ponto de dor for copiar a fonte LaTeX em vez da fidelidade de renderização. Isso não resolveria automaticamente a seleção de citação, mas significa que a matemática renderizada já tem um caminho mais amigável para cópia integrado.
Para o meu site com uso intensivo de MathJax, Physics with Ethan, estou atualmente pensando:
- manter o MathJax, a menos que alguém sugira que eu mude para KaTeX? ,
- talvez adicionar um patch de seleção de citação ao tema Horizon, a partir do acima (usando um site de staging).
- e tratá-lo como uma correção local de qualidade de vida até que haja uma solução upstream adequada. Este tópico de recurso de 2020 ainda estar aberto em 2026 sugere que o upstream pode permanecer lento aqui.