Discourse Math

:discourse2: Summary Discourse Math uses MathJax (default) or KaTeX to render maths in your Discourse forum.
:open_book: Install Guide This plugin is bundled with Discourse core. There is no need to install the plugin separately.

Enabling Math

The Math plugin can be enabled from its settings, accessed from your admin/plugins page:

Math settings

Features

Once enabled, you can render inline math by wrapping with a single $ like so: $E=mc^2$.

You can render blocks of maths by wrapping with $$

$$
\sqrt{(-1)} \; 2^3 \; \sum \; \pi
$$

Discourse Math uses a heuristic to ensure that sentences such as: “I spent 20$ and another 100$” do not get converted.

When using MathJax, you can also enable asciimath processing which uses % as a delimiter: %E=mc^2%

Site Settings

  • See all relevant site settings by searching your admin settings for “math”
Name Description
discourse math enabled Enable Discourse Math plugin (will add special processing to $ and $$ blocks)
discourse math provider Default math rendering provider [mathjax/katex]
discourse math zoom on hover Zoom 200% on hover (MathJax only)
discourse math enable accessibility Enable accessibility features (MathJax only)
discourse math enable asciimath Enable asciimath (will add special processing to % delimited input) (MathJax only)

:discourse2: Hosted by us? This plugin is available on all of our hosting tiers Math | Discourse - Civilized Discussion

Last edited by @tobiaseigen 2025-07-16T21:22:59Z

Check documentPerform check on document:
「いいね!」 67

こんにちは。Mathプラグインは、レンダリングのためにフロントエンドに依存しているようです。そのため、メールユーザーはレンダリングされた数式を受け取ることができません。
この問題に対する解決策はありますか?

技術的には可能です…しかし、それは難しいです。ミニレーサー(またはノード)にmathjaxをロードし、DOMをシミュレートしてSVGにレンダリングする必要があります。

以前に誰かが行ったことは確かですが、維持されている簡単な例は見つかりません。まず、ノードパッケージが機能するかどうかをテストする価値があるでしょう。

「いいね!」 3

MathJax 3 を使用する方法はありますか? より小さいため、読み込み時間を短縮し、ページ速度を向上させることができます。

What’s New in MathJax v3.0 — MathJax 3.2 documentation

URL を切り替えようとしましたが、モジュラービルドからどのバージョンを選択すればよいか正確にはわかりません。

「いいね!」 2

数ヶ月前の私の質問に対する@samの返信で、プラグインをMathJax 3にアップデートする計画について言及されていましたが、ご興味があるかもしれません。

誰かが手伝ってくれるなら、喜んで対応します。

そのスレッドで私が突き止めたように、MathJax 3はMathJax 2.xとは設定ファイルの扱い方が異なるため、このプラグインのアップグレードにはURLを変更する以上の作業が必要になります。

「いいね!」 4

人工知能はLaTeX形式で回答します。このLaTeX形式をMathJax形式に変換するプロンプトを作成しましたが、プロンプトが常に実装されるわけではなく、LaTeX形式で応答されます。OpenAIコミュニティに問題を報告したところ、以下の提案がありました。

「システムプロンプトを煩雑にする手間さえ惜しむことにしました。結果に対して、次のように自分で処理できます。

    translateLaTex = (val: string): string => {
        if (val.indexOf("\\\\") == -1) return val;

        return val.replaceAll("\\\\(", "$")//
            .replaceAll("\\\\)", "$")//
            .replaceAll("\\[", "$")//
            .replaceAll("\\]", "$");
    }


次のアップデートでこのソリューションを適用していただけますか?

「いいね!」 2

このアイデアは気に入りました。AIの返信でLaTeXが煩わしく、システムプロンプトでそれを回避するのが難しい場合があることに同意します。特にGPT4oはLaTeXでファインチューニングされているため、なおさらです。サイト設定でチェックボックスをオンにすると、「LaTeXモード」をサポートするようなPRを作成することを全面的に支持します。

「いいね!」 3

これは私が話していることと同じかどうか分かりませんが、私にとってはうまくいきました。それほど難しい数式は使っていません。

あなたはMathJaxを完全に理解し、それを生成します。

数式を提示する際は、以下のルールに従ってください。
1. インライン数式の場合は、単一のドル記号 `$ ... $` を使用します。
2. ディスプレイ形式数式の場合は、二重のドル記号 `$$ ... $$` を使用します。

例:
- インライン:質量とエネルギーの等価性の式は $e=mc^2$ です。
- ディスプレイ:
$$
e=mc^2
$$
「いいね!」 1

次のアップデートでこの機能を追加していただけますか。どんなにプロンプトを入力しても、常に正常に機能するわけではありません。OpenAIフォーラムでは、プロンプトではなく、上記のような配置を最終的な解決策として提案しています。

はい、これは非常に迷惑です。試してみたい場合は、PR を歓迎します。

「いいね!」 1

試してみたいです。PRを開いていただけると嬉しいです @sam

「details」タグ内でMathJaxエンジンを使用している場合、数式はレンダリングできません。このようになります。

[details="Summary"]
$a \times b = c$
[/details]

この問題について確認していただけますか?

「いいね!」 2

Meta では、プレビュー ウィンドウで数式がレンダリングされませんが、投稿ではレンダリングされるようです。ここでテストしてみます。

1 - a = 1 - \\frac{1}{1 + e^{-z}}

プレビュー ウィンドウでは 1 - a = 1 - \\frac{1}{1 + e^{-z}} と表示されています。

これは既知の問題でしょうか?特定の構成が原因なのかどうか気になります。

DeepLearning.AI Discourse サイトでは、プレビューで数式がレンダリングされますが、非常に不安定で、キーストロークごとに MathJax コードからレンダリングされた数式に切り替わります。ローカル開発サイトではこの問題は見つかりません。これも構成の問題なのかどうか気になります。

「いいね!」 3

私が経験している問題に関して、OpenAIコミュニティから新しい提案がありました。これに関してアップデートを行う予定はありますか?提案は以下の通りです。

提案1:

def parse_stream_to_katex(stream: Stream):
    """
    OpenAI Streamを受け取り、ChatGPTのLaTeX区切り文字をKateXのものに置き換えます。
    チャンクではなくテキストをyieldします。
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # 区切り文字 \( などが2つのチャンクに分割されることがあります。
            # 前のチャンクが \ で終わる場合は、それをこのチャンクに追加します。
            if last_text.endswith("\\"):
                text = last_text + text

            text = (
                text.replace(r"\[", "$$")
                .replace(r"\]", "$$")
                .replace(r"\(", "$")
                .replace(r"\)", "$")
            )
            last_text = text

            # テキストが \ で終わる場合は、それを返さず、次のチャンクに含めます。
            if not text.endswith("\\"):
                yield text

提案2:

// MarkdownLaTeXRenderer.js
import React from 'react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import remarkMath from 'remark-math';
import rehypeRaw from 'rehype-raw';
import rehypeKatex from 'rehype-katex';

const MarkdownLaTeXRenderer = ({ content }) => {
    // \\[ を $$ に、\\] を $$ に置き換えて互換性を確保します。
    const processedText = content
      .replace(/\[/g, '$$')  // すべての \[ の出現を $$ に置き換えます
      .replace(/\]/g, '$$') // すべての \] の出現を $$ に置き換えます
      .replace(/\\(/g, '$')  // すべての \( の出現を $ に置き換えます
      .replace(/\\\)/g, '$'); // すべての \) の出現を $ に置き換えます

    const remarkMathOptions = {
        singleDollarTextMath: false,

};



return (
    <ReactMarkdown
        className="markdown-content"
        children={processedText}
        remarkPlugins={[[remarkMath, remarkMathOptions], remarkGfm]} // オプションを配列の2番目の要素として渡します
        rehypePlugins={[rehypeRaw, rehypeKatex]} // HTMLの場合はrehypeRaw、LaTeXの場合はrehypeKatexを含めます
    />
);

};

export default MarkdownLaTeXRenderer;

「いいね!」 1

そして、エンドユーザーとして…私はそのためにシステムプロンプト(OpenAI)を使用しています。

数式が独自の行または章にある場合、\(\) を独自の行の前後に変更します。$$ はかなり信頼性があります。

しかし、単一の $ でインラインで同じことを行う必要がある場合…それはほとんどの場合失敗します。

それが自動的に行われるようになれば…さらに良いです。

「いいね!」 1

モバイルデバイスで数式を表示すると、数式全体が正しく表示されません(数式が長すぎます)。この問題の解決策を知っている人はいますか?
image
以下はPCでの正しい表示です。
image

電話を横向きにすることですか?しかし、なぜ引用符で囲まれ、それが問題になる可能性があるのでしょうか?

それ以外にも、フォーラムのAIに尋ねたところ、次のような回答がありました(役立つか、まったくの的外れかはわかりません)。

数式組版MathJaxを使用した長い数式を揃えるためのソリューション AI

Jagster:
フォーラムでは、数学や数式にMathJaxを使用しています。時々、数式が長すぎてモバイル画面に収まらないことがあります。数式を複数行に分割する方法はありますか?

Asiavastaaja:
MathJaxは数式の自動改行を直接サポートしていませんが、長い数式がモバイル画面に収まるようにするためのいくつかのテクニックを使用できます。以下にいくつかのヒントを示します。

  1. align 環境を使用する: align 環境を使用して、数式を複数行に分割できます。これにより、数式の一部を複数の行にわたって配置および分散させることができます。たとえば、次のようになります。

    $$
    \begin{align}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{align}
    $$
    
  2. split 環境を使用する: これは、数式を複数行に分割する別の方法です。特に、配置を必要とせずに数式を部分に分割したい場合に便利です。たとえば、次のようになります。

    $$
    \begin{split}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{split}
    $$
    
  3. multline 環境を使用する: この環境は、1行に収まらない長い数式用に設計されています。配置なしで数式を複数行に分割します。たとえば、次のようになります。

    $$
    \begin{multline}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{multline}
    $$
    

これらの環境を使用すると、数式の表示を制御し、小さな画面でも読みやすくすることができます。MathJax 環境では、amsmath パッケージが必要になることがよくありますが、これは通常、MathJax でデフォルトで有効になっています。

@Jagster これらは良い解決策になるはずです。当初は数式に横スクロールバーを設定したかったのですが、うまくいきませんでした。

.math-tex {
    overflow-x: auto;
    max-width: 100%;
    padding: 5px 0;
    display: block;
}

Google スプレッドシートから Meta Discourse に数式をコピーするのに問題があります。数式が正しくレンダリングされていないようです。

NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13%)713%]- 385,000 = $-13,500

PI = 1 + NPVCFo = 1+ n=1784,000(1,13)n - 385,000385,000 ~ 0,965

$%\\でエスケープする必要があると思います。
NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13\\%)713\\%]- 385,000 = \\$-13,500

こちらで確認してみましょう。

NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13\\%)713\\%]- 385,000 = \\$-13,500
PI = 1 + NPVCFo = 1+ n=1784,000(1,13)n - 385,000385,000 ~ 0,965


レンダリングは問題ありませんが、数式全体を表示するためのスクロールバーがありません。ただし、プレビューには表示されます。
投稿では、ズームしないと他の部分が見えません。