Discourse Math

:discourse2: Summary Discourse Math uses MathJax (default) or KaTeX to render maths in your Discourse forum.
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-math
:open_book: Install Guide How to install plugins in Discourse

Enabling Math

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

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

67 Likes

Hi, the Math plugin seems to rely on the frontend for rendering. Therefore, our email users cannot receive the rendered math formula.
Is there any way to solve this problem?

Technically, yes… but it is tricky. We would need to load mathjax in mini racer (or node) simulate the DOM and render to an SVG.

I am sure it was done before by some people but can not find easy examples in the wild that are maintained. Probably worth testing if the node package even works for starters.

3 Likes

Is there a way to use MathJax 3 instead? It’s much smaller and can therefore reduce load times and improve page speed.

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

I tried switching the URL, but I don’t know exactly which version to pick from the modular build.

1 Like

You might be interested in @sam’s reply to my query a few months back regarding plans to update the plugin to MathJax 3:

Absolutely open to it, if someone feels like helping out I would be delighted.

As I’d tracked down in that thread, because MathJax 3 handles its config file differently than MathJax 2.x does, upgrading this plugin will require more than just changing the URL.

4 Likes

artificial intelligence gives answers in latex format. I wrote a prompt to convert this latex format to mathjax format, but the prompt is not always implemented and responds in latex format. When I wrote my problem to the openai community, the following suggestion came.

"I decided it wasn’t even worth the effort of cluttering up a system prompt, when I could just do the following on my end with the results:

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

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

"
Can you apply this solution in the next update?

1 Like

I like this idea, agree latex can be annoying in AI replies and system prompting out if it is hard. Double so cause GPT4o is fine tuned on latex. Totally support making some sort of PR with a switch to support “latex mode” if you check a box in site settings.

2 Likes

I don’t know if I’m talking about same thing, but for me this worked. I don’t use any really difficult formulas, though.

You fully understand MathJax and generate it.

When presenting mathematical expressions, use the following rules:
1. For inline mathematical expressions, use single dollar signs `$...$`.
2. For display-style mathematical expressions, use double dollar signs `$$...$$`.

For example:
- Inline: The equation of mass-energy equivalence is $e=mc^2$.
- Display: 
$$
e=mc^2
$$
1 Like

Can you add this feature in the next update. No matter how much I type prompt, it doesn’t always work properly. In the Openai forum, they suggest an arrangement like the one above, not prompt, as a definitive solution.

Yeah this is very annoying, PR is welcome if you want to give it a shot.

1 Like

I would like to try it, I would be happy if you open a PR @sam

Hi, equations cannot be rendered inside the “details” tag when using the MathJax engine. Like this

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

Could you take a look at this problem?

1 Like

I’ve noticed that on Meta, math doesn’t get rendered in the preview window, but it does (I think) get rendered in posts. I’ll test that out here:

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

In the preview window I’m seeing 1 - a = 1 - \frac{1}{1 + e^{-z}}.

Is that a known issue? I’m wondering if there’s a specific configuration that causes it.

On the DeepLearning.AI Discourse site, math gets rendered in the preview, but it’s really janky - it goes from mathjax code to rendered math on every keystroke. I’m not finding that issue on my local dev site. Again, I’m wondering if that’s a configuration issue.

2 Likes

There are new suggestions from the openai community regarding the problems I am experiencing. Are you planning to make an update about this? suggestions are as follows.

Suggestion 1;

def parse_stream_to_katex(stream: Stream):
    """
    Takes an OpenAI Stream and replaces ChatGPT LaTeX delimiters
    with KateX ones.
    Yields text, not chunks
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # Sometimes delimiters like \( can be split over two chunks.
            # If the previous chunk ended in \, prepend that to this chunk
            if last_text.endswith("\\"):
                text = last_text + text

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

            # If the text ends in \, we don't return it, we'll get include it in the next chunk
            if not text.endswith("\\"):
                yield text

Suggestion 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 }) => {
    // Replace \[ with $$ and \] with $$ to ensure compatibility
    const processedText = content 
      .replace(/\\\[/g, '$$$')  // Replace all occurrences of \[ with $$
      .replace(/\\\]/g, '$$$') // Replace all occurrences of \] with $$
      .replace(/\\\(/g, '$$$')  // Replace all occurrences of \( with $$
      .replace(/\\\)/g, '$$$'); // Replace all occurrences of \) with $$

    const remarkMathOptions = {
        singleDollarTextMath: false,

};




return (
    <ReactMarkdown
        className="markdown-content"
        children={processedText}
        remarkPlugins={[[remarkMath, remarkMathOptions], remarkGfm]} // Pass options as the second element of the array
        rehypePlugins={[rehypeRaw, rehypeKatex]} // Include rehypeRaw for HTML, rehypeKatex for LaTeX
    />
);

};

export default MarkdownLaTeXRenderer;
’

1 Like

And as an end user… I’m using system prompt for that (OpenAI).

When math is in own line or chapter, change \( and \) → at own lines, before and after, $$ is quite reliable.

But when same should do inline with single $… that fails almost every time.

If that could happen automatic… even better.

1 Like