Discourse Math は、2026年1月に新しい公式コアバンドルバージョンに大幅にアップグレードされ、デフォルトで MathJax 4.1、代替として KaTeX が使用されるようになりました。プラグインのドキュメントには、KaTeX には LaTeX ソースをコピーするための CopyTex 拡張機能が含まれているとも記載されています。
数式が多い投稿の引用選択を改善するための小さなテーマコンポーネントパッチを追加する価値はあるでしょうか?
Physics with Ethan のような MathJax を多用するサイトにとって、最も実用的なアイデアは次のとおりです。
- Discourse が選択した HTML を Markdown に戻す前にインターセプトする。
- 数式のラッパー要素を見つける。
- それらを
$...$または$$...$$でラップされた元の TeX ソースに置き換える。 - その後、Discourse に引用の構築を続行させる。
以下は、Horizon (または Default) テーマの </head> または JS エリアを変更する価値がある場合に私が開始するであろう、考えられるテーマコンポーネントスクリプトです。
<script type="text/discourse-plugin" version="1.0">
apiInitializer("1.34.0", (api) => {
function texFromMathElement(el) {
// MathJax v3/v4 は通常、ソースを注釈子要素に格納します。
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 が後で引用 Markdown に変換するバッファを置き換えます。
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 ソースをコピーすることが主な問題点である場合は、プロバイダーを切り替えるという別の方法があります。これは引用選択を自動的に解決するわけではありませんが、レンダリングされた数式にはすでにコピーしやすいパスが組み込まれていることを意味します。
Physics with Ethan の場合、私のおすすめは次のとおりです。
- 互換性とリッチなレンダリングを重視する場合は MathJax を維持する。
- 上記のような小さな引用選択パッチを追加する。
- Meta が適切なアップストリームソリューションを入手するまで、これをローカルの品質向上修正として扱う。2020年の機能トピックが2026年になっても開いていることは、アップストリームがここで遅れる可能性があることを示唆しています。
私の数式を多用するサイトである Physics with Ethan では、現在次のように考えています。
- KaTeX に切り替えることができるという提案がない限り、MathJax を維持する。
- 上記のパッチを使用して、Horizon テーマに引用選択パッチを追加する (ステージングサイトを使用)。
- Meta が適切なアップストリームソリューションを入手するまで、これをローカルの品質向上修正として扱う。この2020年の機能トピックが2026年になっても開いていることは、アップストリームがここで遅れる可能性があることを示唆しています。