Python-Markdown Math Extension
Python-Markdown Math is an extension for the Python-Markdown library that adds support for rendering mathematical formulas written in LaTeX-like syntax. It converts math expressions within Markdown into a format compatible with client-side JavaScript rendering libraries like MathJax. The current version is 0.9, released in April 2025, and it maintains a moderate release cadence based on its history.
Warnings
- gotcha The extension only *transforms* Markdown math into MathJax-compatible HTML (`<script type="math/tex">` tags). It does not perform server-side rendering of the math itself. For the math to display correctly in a web browser, you *must* include the MathJax (or a similar JavaScript rendering library) in your HTML output. Without it, users will only see the raw LaTeX syntax enclosed in script tags.
- gotcha The single dollar sign delimiter (`$...$`) for inline math is disabled by default to prevent conflicts with normal text that may contain dollar signs (e.g., currency values). If you intend to use `$...$` for inline math, you must explicitly enable it in the extension's configuration.
- gotcha The documentation's default MathJax configuration examples are primarily for MathJax 2.x. If you are using MathJax 3.x, you will need to consult the MathJax upgrading documentation to ensure correct integration, as the 2.x configurations may not be directly compatible.
- gotcha Python-Markdown's default parsing can interfere with LaTeX-like math syntax by interpreting characters like `*` (asterisk) and `_` (underscore) as formatting for italics or bold, or by incorrectly handling backslashes. While `python-markdown-math` is designed to prevent this within its recognized math delimiters, conflicts may arise if math is not properly delimited or if other Markdown extensions are poorly ordered.
Install
-
pip install python-markdown-math
Imports
- Markdown
import markdown md = markdown.Markdown(extensions=['mdx_math'])
Quickstart
import markdown
# Basic usage with default delimiters (\( ... \) for inline, $$ ... $$ for display)
md = markdown.Markdown(extensions=['mdx_math'])
html_output = md.convert('This is inline math: \(E=mc^2\) and a display equation: $$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$$')
print(html_output)
# To enable single dollar sign for inline math (e.g., $E=mc^2$)
md_dollar = markdown.Markdown(extensions=['mdx_math'], extension_configs={'mdx_math': {'enable_dollar_delimiter': True}})
html_output_dollar = md_dollar.convert('Inline math with single dollar: $E=mc^2$')
print(html_output_dollar)
# Important: The generated HTML requires a client-side MathJax (or similar) library to render the math visually.
# Example of how the output will look (not fully rendered math without MathJax JS in browser):
# <p>This is inline math: <script type="math/tex">E=mc^2</script> and a display equation: <script type="math/tex; mode=display">x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}</script></p>