Discourse Math는 2026년 1월에 공식 코어 번들 버전으로 대폭 업그레이드되었으며, 기본적으로 MathJax 4.1을 사용하고 KaTeX를 대안으로 제공합니다. 플러그인 문서에는 KaTeX가 LaTeX 소스를 복사하기 위한 CopyTex 확장을 포함한다고 언급되어 있습니다.
수식이 많은 게시물에 대한 인용 선택을 개선하는 작은 테마 컴포넌트 패치를 추가하는 것이 가치가 있을까요?
MathJax를 주로 사용하는 Physics with Ethan과 같은 사이트의 경우, 가장 실용적인 아이디어는 다음과 같습니다:
1. Discourse가 선택된 HTML을 다시 마크다운으로 변환하기 전에 이를 가로채고,
2. 수식 래퍼 요소를 찾고,
3. 그들을 $...$ 또는 $$...$$로 감싼 원래의 TeX 소스로 대체하고,
4. 이후 Discourse가 인용을 계속 생성하도록 합니다.
만약 Horizon(또는 기본) 테마의 </head> 또는 JS 영역을 수정할 가치가 있다면, 시작점으로 사용할 수 있는 잠재적인 테마 컴포넌트 스크립트는 다음과 같습니다.
<script type="text/discourse-plugin" version="1.0">
apiInitializer("1.34.0", (api) => {
function texFromMathElement(el) {
// MathJax v3/v4는 일반적으로 소스를 annotation 자식 요소에 저장합니다.
const annotation =
el.querySelector('annotation[encoding="application/x-tex"]') ||
el.querySelector('annotation');
if (annotation?.textContent?.trim()) {
const tex = annotation.textContent.trim();
// 휴리스틱: 블록 수식 래퍼는 종종 디스플레이 컨테이너입니다.
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);
// Discourse가 나중에 인용 마크다운으로 변환하는 버퍼를 대체합니다.
if (this.quoteState) {
this.quoteState.buffer = container.innerHTML;
}
} catch (e) {
// 정상적인 인용이 계속 작동하도록 조용히 실패합니다.
console.warn("Math quote patch failed:", e);
}
},
});
});
</script>
몇 가지 중요한 주의 사항:
• 이것은 Meta에서 이미 공개된 것이 아니라 실용적인 패치입니다. 기본 전략은 선택된 HTML을 통해 toMarkdown으로 가는 인용 경로부터 추론되었습니다.
• 이는 Discourse Math의 현재 기본값이자 제가 일반적으로 사용하는 옵션인 MathJax 제공자를 사용할 때 가장 도움이 될 가능성이 높습니다.
• 렌더링된 수식이 mjx-container, .MathJax, 또는 다른 래퍼로 끝나는지에 따라 스크립트는 작은 선택자 조정이 필요할 수 있습니다. 스테이징 사이트(새로운 표준 설치)에서 테스트할 것입니다.
• 특히 인라인/블록 혼합 선택이나 중첩된 인용 자료와 같은 모든 엣지 케이스에 완벽할 가능성은 낮습니다.
Discourse가 이제 공식적으로 CopyTex를 갖춘 KaTeX를 지원하므로, LaTeX 소스 복사가 렌더링 충실도보다 주요 문제라면 제공자를 전환하는 것이 또 다른 방법입니다. 이는 인용 선택을 자동으로 해결하지는 않지만, 렌더링된 수식에 이미 더 복사하기 쉬운 경로가 내장되어 있음을 의미합니다.
MathJax가 많은 제 사이트인 Physics with Ethan의 경우, 현재 다음과 같이 생각하고 있습니다:
• 누군가 KaTex로 변경할 수 있다고 제안하지 않는 한 MathJax를 유지하고,
• 위에서 설명한 대로(스테이징 사이트를 사용하여) Horizon 테마에 인용 선택 패치를 추가하고,
• 적절한 업스트림 솔루션이 나올 때까지 이를 로컬 품질 개선(QoL) 수정 사항으로 취급합니다. 이 2020년 기능 토픽이 2026년까지도 여전히 열려 있다는 것은 업스트림이 여기서 느릴 수 있음을 시사합니다.