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 Mi Piace

Ciao, il plugin Math sembra fare affidamento sul frontend per il rendering. Pertanto, i nostri utenti di posta elettronica non possono ricevere la formula matematica renderizzata.
C’è un modo per risolvere questo problema?

Tecnicamente, sì… ma è complicato. Dovremmo caricare mathjax in mini racer (o node) simulare il DOM e renderizzare in un SVG.

Sono sicuro che sia stato fatto in passato da alcune persone, ma non riesco a trovare esempi facili e mantenuti in circolazione. Probabilmente vale la pena testare se il pacchetto node funziona per cominciare.

3 Mi Piace

C’è un modo per usare MathJax 3 invece? È molto più piccolo e quindi può ridurre i tempi di caricamento e migliorare la velocità della pagina.

Novità di MathJax v3.0 — Documentazione di MathJax 3.2

Ho provato a cambiare l’URL, ma non so esattamente quale versione scegliere dalla build modulare.

2 Mi Piace

Potrebbe interessarti la risposta di @sam alla mia domanda di qualche mese fa riguardo ai piani di aggiornamento del plugin a MathJax 3:

Assolutamente aperto a ciò, se qualcuno si sentisse di dare una mano ne sarei lieto.

Come ho scoperto in quel thread, poiché MathJax 3 gestisce il suo file di configurazione in modo diverso da MathJax 2.x, l’aggiornamento di questo plugin richiederà più di un semplice cambio di URL.

4 Mi Piace

L’intelligenza artificiale fornisce risposte in formato latex. Ho scritto un prompt per convertire questo formato latex in formato mathjax, ma il prompt non viene sempre implementato e risponde in formato latex. Quando ho scritto il mio problema alla community di openai, è arrivato il seguente suggerimento.

"Ho deciso che non valeva nemmeno la pena ingombrare un prompt di sistema, quando potevo semplicemente fare quanto segue da parte mia con i risultati:

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

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

"
Puoi applicare questa soluzione nel prossimo aggiornamento?

2 Mi Piace

Mi piace questa idea, concordo che il latex può essere fastidioso nelle risposte dell’IA e nel prompting di sistema se è difficile. Ancora di più perché GPT4o è ottimizzato sul latex. Supporto totalmente la creazione di una sorta di PR con un interruttore per supportare la “modalità latex” se si seleziona una casella nelle impostazioni del sito.

3 Mi Piace

Non so se stiamo parlando della stessa cosa, ma per me ha funzionato. Non uso formule particolarmente complesse, però.

Comprendi appieno MathJax e lo generi.

Quando presenti espressioni matematiche, usa le seguenti regole:
1. Per le espressioni matematiche in linea, usa singoli simboli del dollaro `$...$`.
2. Per le espressioni matematiche in stile display, usa doppi simboli del dollaro `$$...$$`.

Ad esempio:
- In linea: L'equazione dell'equivalenza massa-energia è $e=mc^2$.
- Display:
$$
e=mc^2
$$
1 Mi Piace

Puoi aggiungere questa funzionalità nel prossimo aggiornamento. Non importa quanto digiti il prompt, non funziona sempre correttamente. Nel forum di OpenAI, suggeriscono una soluzione come quella sopra, non un prompt, come soluzione definitiva.

Sì, questo è molto fastidioso, le PR sono benvenute se vuoi provarci.

1 Mi Piace

Mi piacerebbe provarlo, sarei felice se aprissi una PR @sam

Ciao, le equazioni non possono essere renderizzate all’interno del tag “details” quando si utilizza il motore MathJax. Come questo

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

Potresti dare un’occhiata a questo problema?

2 Mi Piace

Ho notato che su Meta, la matematica non viene visualizzata nella finestra di anteprima, ma viene (credo) visualizzata nei post. Lo testerò qui:

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

Nella finestra di anteprima vedo 1 - a = 1 - \\frac{1}{1 + e^{-z}}.

È un problema noto? Mi chiedo se ci sia una configurazione specifica che lo causi.

Sul sito DeepLearning.AI Discourse, la matematica viene visualizzata nell’anteprima, ma è molto instabile: passa dal codice mathjax alla matematica renderizzata a ogni pressione di tasto. Non riscontro questo problema sul mio sito di sviluppo locale. Di nuovo, mi chiedo se si tratti di un problema di configurazione.

3 Mi Piace

Ci sono nuovi suggerimenti dalla community di openai riguardo ai problemi che sto riscontrando. Hai in programma di apportare un aggiornamento in merito? I suggerimenti sono i seguenti.

Suggerimento 1:

def parse_stream_to_katex(stream: Stream):
    """
    Prende uno Stream di OpenAI e sostituisce i delimitatori LaTeX di ChatGPT
    con quelli di KateX.
    Restituisce testo, non blocchi
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # A volte i delimitatori come \( possono essere divisi in due blocchi.
            # Se il blocco precedente terminava con \, anteporlo a questo blocco
            if last_text.endswith("\\"):
                text = last_text + text

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

            # Se il testo termina con \, non lo restituiamo, lo includeremo nel blocco successivo
            if not text.endswith("\\"):
                yield text

Suggerimento 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 }) => {
    // Sostituisce \[ con $$ e \] con $$ per garantire la compatibilità
    const processedText = content
      .replace(/\[/g, '$$')  // Sostituisce tutte le occorrenze di \[ con $$
      .replace(/\]/g, '$$') // Sostituisce tutte le occorrenze di \] con $$
      .replace(/\(/g, '$')  // Sostituisce tutte le occorrenze di \( con $
      .replace(/\)/g, '$'); // Sostituisce tutte le occorrenze di \) con $

    const remarkMathOptions = {
        singleDollarTextMath: false,

};



return (
    <ReactMarkdown
        className="markdown-content"
        children={processedText}
        remarkPlugins={[[remarkMath, remarkMathOptions], remarkGfm]} // Passa le opzioni come secondo elemento dell'array
        rehypePlugins={[rehypeRaw, rehypeKatex]} // Include rehypeRaw per HTML, rehypeKatex per LaTeX
    />
);

};

export default MarkdownLaTeXRenderer;

1 Mi Piace

E come utente finale… sto usando il prompt di sistema per questo (OpenAI).

Quando la matematica è su una riga o capitolo a sé, cambia \( e \) → su righe proprie, prima e dopo, $$ è abbastanza affidabile.

Ma quando la stessa cosa dovrebbe essere fatta inline con un singolo $, questo fallisce quasi ogni volta.

Se ciò potesse accadere automaticamente… ancora meglio.

1 Mi Piace

Quando visualizzo formule matematiche sul mio dispositivo mobile, non riesco a vedere l’intera formula correttamente (la formula è troppo lunga). Qualcuno sa come risolvere questo problema?
image
Di seguito viene visualizzata la visualizzazione corretta sul PC.
image

Ruotare il telefono in orizzontale? Ma perché è tra virgolette, e può essere quello il problema?

Altrimenti. Ho chiesto all’IA del mio forum e mi ha risposto questo (non ho idea se sia utile o pura spazzatura).

Soluzioni per allineare equazioni lunghe usando MathJax AI

Jagster:
Il forum utilizza MathJax per la matematica e le equazioni. A volte, un’equazione è così lunga da non entrare in uno schermo mobile. C’è un modo per spezzare l’equazione in più righe?

Risponditore:
MathJax non supporta direttamente l’interruzione automatica di riga per le equazioni, ma puoi usare alcune tecniche per far sì che le equazioni lunghe si adattino meglio agli schermi mobili. Ecco alcuni suggerimenti:

  1. Usa l’ambiente align: Puoi dividere l’equazione in più righe usando l’ambiente align. Questo ti permette di allineare e distribuire parti dell’equazione su più righe. Ad esempio:

    $$
    \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. Usa l’ambiente split: Questo è un altro modo per dividere un’equazione in più righe. È particolarmente utile quando vuoi dividere l’equazione in parti senza bisogno di allineamento. Ad esempio:

    $$
    \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. Usa l’ambiente multline: Questo ambiente è progettato per equazioni lunghe che non entrano in una singola riga. Divide l’equazione in più righe senza allineamento. Ad esempio:

    $$
    \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}
    $$
    

Questi ambienti ti permettono di controllare la presentazione delle equazioni e assicurarti che siano leggibili anche su schermi più piccoli. Ricorda che gli ambienti MathJax spesso richiedono il pacchetto amsmath, che di solito è abilitato per impostazione predefinita in MathJax.

@Jagster Queste dovrebbero essere buone soluzioni. In origine volevo impostare una barra di scorrimento orizzontale per la formula, ma non ci sono riuscito.

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

Ho problemi a copiare formule matematiche da Google Sheets in Meta Discourse. Le formule non sembrano essere visualizzate correttamente?

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

Penso che tu debba fare l’escape di $ e % con \\.
NPV=CFt * [1-1(1+r)Tr]- CFo= 84.000 * [1-1(1+13\\%)713\\%]- 385.000 = \\$-13.500

Vediamo qui:

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


Viene visualizzato correttamente, ma non c’è una barra di scorrimento per vedere l’intera formula. C’è, nell’anteprima, però.
Nel post, puoi vedere l’altra parte solo se fai lo zoom: