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 到 mini racer(或 node)中,模拟 DOM 并渲染成 SVG。

我确信以前有人做过,但在实际应用中找不到易于维护的例子。可能值得先测试一下 node 包是否可用。

3 个赞

有办法使用 MathJax 3 吗?它体积更小,因此可以缩短加载时间并提高页面速度。

MathJax v3.0 有什么新变化 — MathJax 3.2 文档

我尝试更改了 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 个赞

我喜欢这个主意,同意 LaTeX 在 AI 回复中可能很烦人,并且在系统提示中如果很难的话会很麻烦。尤其是因为 GPT4o 是在 LaTeX 上进行了微调。完全支持在网站设置中勾选一个框来创建一个支持“LaTeX 模式”的 PR。

3 个赞

我不知道我是否在谈论同一件事,但对我来说,这很有效。不过,我并没有使用什么特别复杂的公式。

你完全理解 MathJax 并生成它。

在呈现数学表达式时,请遵循以下规则:
1. 对于行内数学表达式,请使用单美元符号 `$...$`。
2. 对于显示样式的数学表达式,请使用双美元符号 `$$...$$`。

例如:
- 行内:质能等价方程是 $e=mc^2$。
- 显示:
$$
e=mc^2
$$
1 个赞

您能在下次更新中添加此功能吗?无论我输入多少提示,它并不总是能正常工作。在 OpenAI 论坛上,他们建议像上面那样的安排,而不是提示,作为最终解决方案。

是的,这很烦人,如果您想尝试,欢迎提交拉取请求。

1 个赞

我很想试试,如果你能开一个 PR 我会很高兴 @sam

您好,在使用 MathJax 引擎时,“details”标签内无法渲染公式。像这样

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

您能看看这个问题吗?

2 个赞

我注意到在 Meta 上,数学公式在预览窗口中无法渲染,但在帖子中可以(我认为)。我在这里测试一下:

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

在预览窗口中,我看到的是 1 - a = 1 - \\frac{1}{1 + e^{-z}}

这是一个已知问题吗?我想知道是否有特定的配置会导致这种情况。

在 DeepLearning.AI Discourse 网站上,数学公式可以在预览中渲染,但非常卡顿——每次击键都会从 mathjax 代码变为渲染后的数学公式。我在我的本地开发站点上没有遇到这个问题。同样,我想知道那是否是配置问题。

3 个赞

关于我遇到的问题,来自openai社区的新建议。您是否计划对此进行更新?建议如下。

建议 1;

def parse_stream_to_katex(stream: Stream):
    """
    接收一个OpenAI流并用KateX的定界符替换ChatGPT的LaTeX定界符
    产生文本,而不是块
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # 有时像\(这样的定界符可能会被分成两个块。
            # 如果前一个块以\结尾,则将其添加到此块中
            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]} // 将选项作为数组的第二个元素传递
        rehypePlugins={[rehypeRaw, rehypeKatex]} // 包括rehypeRaw用于HTML,rehypeKatex用于LaTeX
    />
);

};

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 环境:此环境专为无法单行显示的方程而设计。它会将方程分成多行,而无需对齐。例如:

    $$
    \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 宏包,而 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


它渲染正常,但没有滚动条可以看到整个数学公式。不过,在预览中可以看到。
在帖子中,只有缩小才能看到其他部分: