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 Me gusta

Hola, el plugin de Matemáticas parece depender del frontend para renderizar. Por lo tanto, nuestros usuarios de correo electrónico no pueden recibir la fórmula matemática renderizada.
¿Hay alguna forma de solucionar este problema?

Técnicamente, sí… pero es complicado. Necesitaríamos cargar mathjax en mini racer (o node) simular el DOM y renderizar a un SVG.

Estoy seguro de que algunas personas lo hicieron antes, pero no encuentro ejemplos fáciles y mantenidos en la naturaleza. Probablemente valga la pena probar si el paquete de node funciona para empezar.

3 Me gusta

¿Hay alguna forma de usar MathJax 3 en su lugar? Es mucho más pequeño y, por lo tanto, puede reducir los tiempos de carga y mejorar la velocidad de la página.

Novedades de MathJax v3.0 — Documentación de MathJax 3.2

Intenté cambiar la URL, pero no sé exactamente qué versión elegir de la compilación modular.

2 Me gusta

Quizás te interese la respuesta de @sam a mi consulta hace unos meses sobre los planes de actualizar el plugin a MathJax 3:

Absolutamente abierto a ello, si alguien se anima a ayudar estaría encantado.

Como descubrí en ese hilo, dado que MathJax 3 maneja su archivo de configuración de forma diferente a MathJax 2.x, actualizar este plugin requerirá más que solo cambiar la URL.

4 Me gusta

La inteligencia artificial da respuestas en formato latex. Escribí una indicación para convertir este formato latex a formato mathjax, pero la indicación no siempre se implementa y responde en formato latex. Cuando escribí mi problema a la comunidad de openai, surgió la siguiente sugerencia.

"Decidí que ni siquiera valía la pena el esfuerzo de abarrotar una indicación del sistema, cuando podía simplemente hacer lo siguiente por mi cuenta con los resultados:

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

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

"
¿Puedes aplicar esta solución en la próxima actualización?

2 Me gusta

Me gusta esta idea, estoy de acuerdo en que LaTeX puede ser molesto en las respuestas de IA y en la indicación del sistema si es difícil. Más aún porque GPT4o está afinado en LaTeX. Apoyo totalmente la creación de algún tipo de PR con un interruptor para admitir el “modo LaTeX” si marcas una casilla en la configuración del sitio.

3 Me gusta

No sé si estoy hablando de lo mismo, pero para mí esto funcionó. Sin embargo, no uso fórmulas realmente difíciles.

Entiendes completamente MathJax y lo generas.

Al presentar expresiones matemáticas, usa las siguientes reglas:
1. Para expresiones matemáticas en línea, usa signos de dólar simples `$...$`.
2. Para expresiones matemáticas de estilo de visualización, usa signos de dólar dobles `$$...$$`.

Por ejemplo:
- En línea: La ecuación de la equivalencia masa-energía es $e=mc^2$.
- Visualización:
$$
e=mc^2
$$
1 me gusta

¿Puedes añadir esta función en la próxima actualización? No importa cuánto escriba en el prompt, no siempre funciona correctamente. En el foro de OpenAI, sugieren una solución como la anterior, no un prompt, como solución definitiva.

Sí, esto es muy molesto, se aceptan PR si quieres intentarlo.

1 me gusta

Me gustaría probarlo, estaría encantado si abrieras una PR @sam

Hola, las ecuaciones no se pueden renderizar dentro de la etiqueta “details” cuando se utiliza el motor MathJax. Como esto

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

¿Podrías echar un vistazo a este problema?

2 Me gusta

He notado que en Meta, las matemáticas no se renderizan en la ventana de vista previa, pero sí (creo) se renderizan en las publicaciones. Lo probaré aquí:

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

En la ventana de vista previa veo 1 - a = 1 - \\frac{1}{1 + e^{-z}}.

¿Es un problema conocido? Me pregunto si hay alguna configuración específica que lo cause.

En el sitio de Discourse de DeepLearning.AI, las matemáticas se renderizan en la vista previa, pero es muy inestable: pasa del código mathjax a matemáticas renderizadas con cada pulsación de tecla. No encuentro ese problema en mi sitio de desarrollo local. De nuevo, me pregunto si es un problema de configuración.

3 Me gusta

Hay nuevas sugerencias de la comunidad de openai con respecto a los problemas que estoy experimentando. ¿Planean hacer una actualización al respecto? Las sugerencias son las siguientes.

Sugerencia 1;

def parse_stream_to_katex(stream: Stream):
    """
    Toma una transmisión de OpenAI y reemplaza los delimitadores de LaTeX de ChatGPT
    con los de KateX.
    Genera texto, no fragmentos
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # A veces, los delimitadores como \( pueden dividirse en dos fragmentos.
            # Si el fragmento anterior terminó en \, prepáralo a este fragmento
            if last_text.endswith("\\"):
                text = last_text + text

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

            # Si el texto termina en \, no lo devolvemos, lo incluiremos en el siguiente fragmento
            if not text.endswith("\\"):
                yield text

Sugerencia 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 }) => {
    // Reemplaza \[ con $$ y \] con $$ para garantizar la compatibilidad
    const processedText = content
      .replace(/\[/g, '$$')  // Reemplaza todas las ocurrencias de \[ con $$
      .replace(/\]/g, '$$') // Reemplaza todas las ocurrencias de \] con $$
      .replace(/\(/g, '$')  // Reemplaza todas las ocurrencias de \( con $
      .replace(/\)/g, '$'); // Reemplaza todas las ocurrencias de \) con $

    const remarkMathOptions = {
        singleDollarTextMath: false,

};



return (
    <ReactMarkdown
        className="markdown-content"
        children={processedText}
        remarkPlugins={[[remarkMath, remarkMathOptions], remarkGfm]} // Pasa las opciones como el segundo elemento del array
        rehypePlugins={[rehypeRaw, rehypeKatex]} // Incluye rehypeRaw para HTML, rehypeKatex para LaTeX
    />
);

};

export default MarkdownLaTeXRenderer;

1 me gusta

Y como usuario final… estoy usando el prompt del sistema para eso (OpenAI).

Cuando las matemáticas están en una línea o capítulo propio, cambia \( y \) → en líneas propias, antes y después, $$ es bastante confiable.

Pero cuando lo mismo debería hacerse en línea con un solo $, eso falla casi siempre.

Si eso pudiera suceder automáticamente… aún mejor.

1 me gusta

Cuando veo fórmulas matemáticas en mi dispositivo móvil, no puedo ver la fórmula completa correctamente (la fórmula es demasiado larga). ¿Alguien sabe cómo solucionar este problema?
image
A continuación se muestra la visualización correcta en la PC.
image

¿Girar el teléfono horizontalmente? Pero, ¿por qué está entre comillas y puede ser ese el problema?

Por lo demás. Le pregunté a la IA de mi foro y respondió esto (no tengo idea si es útil o pura basura).

Soluciones para alinear ecuaciones largas usando MathJax IA

Jagster:
El foro utiliza MathJax para matemáticas y ecuaciones. Ocasionalmente, una ecuación es tan larga que no cabe en una pantalla móvil. ¿Hay alguna manera de dividir la ecuación en varias líneas?

Asiavastaaja:
MathJax no admite directamente el salto de línea automático para ecuaciones, pero puedes usar algunas técnicas para que las ecuaciones largas encajen mejor en las pantallas móviles. Aquí tienes algunos consejos:

  1. Usa el entorno align: Puedes dividir la ecuación en varias líneas usando el entorno align. Esto te permite alinear y distribuir partes de la ecuación en varias líneas. Por ejemplo:

    $$
    \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 el entorno split: Esta es otra forma de dividir una ecuación en varias líneas. Es especialmente útil cuando quieres dividir la ecuación en partes sin necesidad de alineación. Por ejemplo:

    $$
    \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 el entorno multline: Este entorno está diseñado para ecuaciones largas que no caben en una sola línea. Divide la ecuación en varias líneas sin alineación. Por ejemplo:

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

Estos entornos te permiten controlar la presentación de las ecuaciones y asegurarte de que sean legibles incluso en pantallas más pequeñas. Recuerda que los entornos de MathJax a menudo requieren el paquete amsmath, que generalmente está habilitado por defecto en MathJax.

@Jagster Estas deberían ser buenas soluciones. Originalmente quería configurar una barra de desplazamiento horizontal para la fórmula, pero no tuve éxito.

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

Tengo problemas para copiar fórmulas matemáticas de Google Sheets a Meta Discourse. ¿Las fórmulas no se están representando correctamente?

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

Creo que necesitas escapar $ y % con \\.
NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13\\%)713\\%]- 385,000 = \\$-13,500

Veamos aquí:

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


Se renderiza bien, pero no hay barra de desplazamiento para ver las matemáticas completas. Sin embargo, sí la hay en la vista previa.
En la publicación, solo puedes ver la otra parte si haces zoom: