[{"data":1,"prerenderedAt":68},["Reactive",2],{"blog-post-markdown-math-rendering-across-platforms":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":40,"related":42},"markdown-math-rendering-across-platforms","Markdown Math Rendering Across Platforms: Where LaTeX Actually Works","The $...$ / $$...$$ LaTeX convention for math in Markdown looks identical everywhere, but whether it renders at all — and which engine renders it — varies enormously across GitHub, GitLab, Obsidian, Notion, Jekyll, Hugo, Confluence, and Slack. Here's what's real.","Wrap a formula in dollar signs — $E = mc^2$ — and on some platforms you get a beautifully typeset equation. On others you get the literal text $E = mc^2$ sitting there unrendered, because the…","2026-08-21","workflows","Matt Rathbone","markdown math rendering, latex markdown platforms, katex vs mathjax, github math support, notion math equations, jekyll math plugin, hugo katex, confluence math",8,"\u003Cp>Wrap a formula in dollar signs — \u003Ccode>$E = mc^2$\u003C/code> — and on some platforms you get a beautifully typeset equation. On others you get the literal text \u003Ccode>$E = mc^2$\u003C/code> sitting there unrendered, because the dollar-sign convention for math was never part of core Markdown, CommonMark, or even GitHub Flavored Markdown&#39;s official spec. It&#39;s a widely-adopted convention that individual platforms opt into (or don&#39;t) on their own timeline, using different rendering engines with subtly different output. If you&#39;ve ever pasted a formula that worked perfectly in one tool and showed up as raw LaTeX soup in another, this is why.\u003C/p>\n\u003Cp>This guide covers which platforms actually render math natively, which need a plugin or app, which don&#39;t support it at all, and the practical differences between the two rendering engines you&#39;ll run into everywhere: MathJax and KaTeX. If you want the LaTeX syntax basics themselves rather than platform behavior, our \u003Ca href=\"/blog/markdown-math-expressions-complete-guide\">complete guide to math expressions in Markdown\u003C/a> covers that ground — and our \u003Ca href=\"/tools/markdown-math\">Markdown Math Preview tool\u003C/a> lets you check a formula renders correctly, live in your browser, before you paste it anywhere.\u003C/p>\n\u003Ch2 id=\"native-support-github-gitlab-obsidian\">Native Support: GitHub, GitLab, Obsidian\u003C/h2>\n\u003Cp>Three platforms render \u003Ccode>$inline$\u003C/code> and \u003Ccode>$$block$$\u003C/code> math out of the box, no setup required.\u003C/p>\n\u003Cp>\u003Cstrong>GitHub\u003C/strong> added native math rendering in 2022, using MathJax. It works in READMEs, issues, pull requests, wiki pages, and Markdown files viewed in the repo browser — anywhere GitHub renders Markdown. Inline math uses \u003Ccode>$formula$\u003C/code> with no space touching the dollar signs; block math uses \u003Ccode>$$formula$$\u003C/code> on its own line(s). GitHub&#39;s implementation is deliberately conservative: it supports the common LaTeX commands (fractions, exponents, Greek letters, sums, integrals, matrices) but not obscure packages, and it silently falls back to plain text for anything it can&#39;t parse rather than showing an error.\u003C/p>\n\u003Cp>\u003Cstrong>GitLab\u003C/strong> has supported math rendering since GitLab 13.0 (2020), using KaTeX rather than MathJax. Syntax is the same \u003Ccode>$...$\u003C/code> / \u003Ccode>$$...$$\u003C/code> convention, and it works in issues, merge requests, wikis, and Markdown files. Because it&#39;s KaTeX-based, GitLab&#39;s rendering is closer to what our own Markdown Math Preview tool produces than GitHub&#39;s MathJax output is — worth knowing if you&#39;re maintaining docs that need to look consistent across both platforms.\u003C/p>\n\u003Cp>\u003Cstrong>Obsidian\u003C/strong> renders math natively in both edit and reading views, using MathJax under the hood (via the KaTeX-compatible subset it bundles). This is genuinely useful for people keeping research notes or technical vaults, since the formula renders live as you type rather than requiring a separate preview step. Obsidian&#39;s math also plays well with its block-reference and embed system, so you can reference a specific equation from another note.\u003C/p>\n\u003Ch2 id=\"needs-a-plugin-static-site-generators\">Needs a Plugin: Static Site Generators\u003C/h2>\n\u003Cp>Static site generators almost universally treat \u003Ccode>$\u003C/code> as literal text by default. Math support has to be added deliberately.\u003C/p>\n\u003Cp>\u003Cstrong>Jekyll\u003C/strong> (this blog&#39;s own engine, and GitHub Pages&#39; default) has no built-in math support in kramdown. You need a plugin like \u003Ccode>jekyll-katex\u003C/code>, or you can skip the plugin entirely and just load KaTeX&#39;s or MathJax&#39;s CSS/JS directly in your layout and let its auto-render script scan the page for \u003Ccode>$...$\u003C/code> after the page loads. The plugin approach pre-renders at build time (faster page loads, works without JavaScript); the client-side script approach is less setup but adds a render flash and a JS dependency.\u003C/p>\n\u003Cp>\u003Cstrong>Hugo\u003C/strong> has first-class support for this through render hooks in newer versions (Hugo 0.122+), letting you wire up KaTeX or MathJax rendering for passthrough math blocks without a third-party module — Hugo&#39;s Goldmark-based Markdown renderer can pass \u003Ccode>$...$\u003C/code>/\u003Ccode>$$...$$\u003C/code> through untouched for a script to pick up. Older Hugo setups typically use a shortcode or a theme-provided partial for the same effect. Either way, it&#39;s opt-in configuration, not default behavior.\u003C/p>\n\u003Cp>\u003Cstrong>Docusaurus\u003C/strong> supports math via two remark/rehype plugins — \u003Ccode>remark-math\u003C/code> and \u003Ccode>rehype-katex\u003C/code> — added to your \u003Ccode>docusaurus.config.js\u003C/code>. This is a well-documented, one-time setup, and once it&#39;s in place, \u003Ccode>$...$\u003C/code>/\u003Ccode>$$...$$\u003C/code> in any \u003Ccode>.md\u003C/code>/\u003Ccode>.mdx\u003C/code> file just works. Because it&#39;s explicitly KaTeX-based, output is consistent with GitLab&#39;s and with our Markdown Math Preview tool.\u003C/p>\n\u003Cp>\u003Cstrong>MkDocs\u003C/strong> similarly needs a math extension (\u003Ccode>pymdownx.arithmatex\u003C/code> from the PyMdown Extensions package is the common choice) plus a KaTeX or MathJax script reference in your theme, following the same &quot;opt-in, one-time config&quot; pattern as Hugo and Docusaurus.\u003C/p>\n\u003Ch2 id=\"real-feature-different-trigger-notion\">Real Feature, Different Trigger: Notion\u003C/h2>\n\u003Cp>\u003Cstrong>Notion\u003C/strong> supports LaTeX math, but not via the \u003Ccode>$...$\u003C/code> dollar-sign convention as your primary path — it&#39;s a block/inline type you insert with the \u003Ccode>/equation\u003C/code> (or \u003Ccode>/math\u003C/code>) slash command, or by typing \u003Ccode>$$\u003C/code> and pressing space to trigger an inline equation editor. Once inserted, you type LaTeX inside that dedicated equation block, and Notion renders it with its own KaTeX-based engine. If you paste a Markdown file containing raw \u003Ccode>$...$\u003C/code> text into Notion, it generally will \u003Cstrong>not\u003C/strong> auto-convert that into a rendered equation the way headings or bold text get auto-converted on paste — you get literal dollar-sign text, and need to manually convert it via the equation block. This trips up anyone assuming Notion behaves like GitHub here; the feature exists, but the entry point is different.\u003C/p>\n\u003Ch2 id=\"needs-a-marketplace-app-or-doesnt-support-it-confluence-jira-slack\">Needs a Marketplace App or Doesn&#39;t Support It: Confluence, Jira, Slack\u003C/h2>\n\u003Cp>\u003Cstrong>Confluence\u003C/strong> has no native \u003Ccode>$...$\u003C/code> math rendering in its standard editor. Cloud users can add a marketplace app (several LaTeX-rendering add-ons exist) that adds a macro for inserting rendered formulas, but that&#39;s a dedicated macro/insert flow, not something that recognizes dollar-sign syntax typed inline. If you paste Markdown with LaTeX math into Confluence via the \u003Ccode>/markdown\u003C/code> panel (see our \u003Ca href=\"/blog/markdown-in-confluence-what-works\">Confluence guide\u003C/a> for how that panel behaves generally), the math syntax passes through as literal text.\u003C/p>\n\u003Cp>\u003Cstrong>Jira\u003C/strong> has no math rendering at all in its wiki markup or in the modern rich-text editor — there&#39;s no macro, no plugin ecosystem equivalent to Confluence&#39;s for this specific feature. If your team needs formulas in Jira tickets, the common workaround is rendering the equation elsewhere (including with our tool) and pasting it in as an image.\u003C/p>\n\u003Cp>\u003Cstrong>Slack\u003C/strong> doesn&#39;t support math rendering anywhere — not in the message composer, not via the API/Block Kit, not with a workaround short of posting a pre-rendered image. A message containing \u003Ccode>$E = mc^2$\u003C/code> displays as exactly that literal text. Given mrkdwn&#39;s generally limited formatting (see our \u003Ca href=\"/blog/markdown-to-slack-formatting-guide\">Markdown to Slack guide\u003C/a> for the full picture), this isn&#39;t surprising, but it catches people off guard the first time.\u003C/p>\n\u003Ch2 id=\"mathjax-vs-katex-why-the-same-formula-can-look-different\">MathJax vs. KaTeX: Why the Same Formula Can Look Different\u003C/h2>\n\u003Cp>Two rendering engines account for nearly every platform above, and they&#39;re not pixel-identical:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>MathJax\u003C/strong> is the older, more complete implementation — broader LaTeX command coverage, including several packages and less-common symbols, at the cost of being noticeably heavier and historically slower (modern versions have closed much of that gap, but it&#39;s still the heavier of the two). GitHub and Obsidian use MathJax or a MathJax-derived engine.\u003C/li>\n\u003Cli>\u003Cstrong>KaTeX\u003C/strong> is faster (it renders synchronously, without MathJax&#39;s original asynchronous typesetting pass) and covers the large majority of everyday math notation, but it deliberately supports a smaller command set — some advanced LaTeX packages used in academic papers will throw a parse error in KaTeX that a full MathJax/LaTeX setup would render fine. GitLab, Docusaurus, MkDocs (with the common config), Notion, and our own Markdown Math Preview tool are all KaTeX-based.\u003C/li>\n\u003C/ul>\n\u003Cp>In practice this means a formula that renders cleanly on GitHub isn&#39;t guaranteed to look byte-for-byte identical on GitLab, and a formula relying on an obscure package might work in one and throw an error in the other. For everyday formulas — fractions, exponents, Greek letters, sums, integrals, standard matrices — you won&#39;t notice a difference. For anything exotic, test on your actual target platform rather than assuming.\u003C/p>\n\u003Ch2 id=\"quick-reference\">Quick Reference\u003C/h2>\n\u003Cdiv class=\"table-responsive\">\u003Ctable class=\"table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Platform\u003C/th>\n\u003Cth>Math support\u003C/th>\n\u003Cth>Engine\u003C/th>\n\u003Cth>How it&#39;s triggered\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>GitHub\u003C/td>\n\u003Ctd>Native\u003C/td>\n\u003Ctd>MathJax\u003C/td>\n\u003Ctd>\u003Ccode>$...$\u003C/code> / \u003Ccode>$$...$$\u003C/code> anywhere Markdown renders\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>GitLab\u003C/td>\n\u003Ctd>Native\u003C/td>\n\u003Ctd>KaTeX\u003C/td>\n\u003Ctd>\u003Ccode>$...$\u003C/code> / \u003Ccode>$$...$$\u003C/code> anywhere Markdown renders\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Obsidian\u003C/td>\n\u003Ctd>Native\u003C/td>\n\u003Ctd>MathJax-derived\u003C/td>\n\u003Ctd>\u003Ccode>$...$\u003C/code> / \u003Ccode>$$...$$\u003C/code>, live in edit and reading views\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Notion\u003C/td>\n\u003Ctd>Real feature, different entry point\u003C/td>\n\u003Ctd>KaTeX\u003C/td>\n\u003Ctd>\u003Ccode>/equation\u003C/code> block or \u003Ccode>$$\u003C/code> + space, not passive \u003Ccode>$...$\u003C/code> paste\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Jekyll / GitHub Pages\u003C/td>\n\u003Ctd>Needs plugin or manual script\u003C/td>\n\u003Ctd>Your choice (KaTeX or MathJax)\u003C/td>\n\u003Ctd>Plugin (e.g. \u003Ccode>jekyll-katex\u003C/code>) or client-side auto-render script\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Hugo\u003C/td>\n\u003Ctd>Needs render hook or theme support\u003C/td>\n\u003Ctd>Your choice\u003C/td>\n\u003Ctd>Goldmark passthrough + KaTeX/MathJax script\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Docusaurus\u003C/td>\n\u003Ctd>Needs plugin config\u003C/td>\n\u003Ctd>KaTeX\u003C/td>\n\u003Ctd>\u003Ccode>remark-math\u003C/code> + \u003Ccode>rehype-katex\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>MkDocs\u003C/td>\n\u003Ctd>Needs extension\u003C/td>\n\u003Ctd>Your choice\u003C/td>\n\u003Ctd>\u003Ccode>pymdownx.arithmatex\u003C/code> + theme script\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Confluence\u003C/td>\n\u003Ctd>Marketplace app only\u003C/td>\n\u003Ctd>Varies by app\u003C/td>\n\u003Ctd>Dedicated macro/insert, not inline \u003Ccode>$...$\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Jira\u003C/td>\n\u003Ctd>Not supported\u003C/td>\n\u003Ctd>—\u003C/td>\n\u003Ctd>No native option; paste as image\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Slack\u003C/td>\n\u003Ctd>Not supported\u003C/td>\n\u003Ctd>—\u003C/td>\n\u003Ctd>No native option; paste as image\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\u003C/div>\n\u003Ch2 id=\"practical-takeaways\">Practical Takeaways\u003C/h2>\n\u003Cp>If you&#39;re writing math-heavy documentation and want it to render without any setup on the reader&#39;s end, GitHub, GitLab, or Obsidian are your only truly zero-configuration options. If your docs live on a static site generator, budget time for the one-time plugin setup — it&#39;s usually a few lines of config, but it&#39;s not automatic, and a Markdown file with unrendered \u003Ccode>$...$\u003C/code> littered through it looks broken to anyone who stumbles on the raw source before the setup is done. And if your formulas are headed to Confluence, Jira, or Slack, plan on images rather than fighting a platform that was never going to render LaTeX in the first place.\u003C/p>\n\u003Cp>Whichever platform you&#39;re targeting, it&#39;s worth checking the formula renders the way you expect before you commit it to a README or a ticket — a misplaced brace or an unsupported command shows up as a parse error or, worse, silently wrong output. Our \u003Ca href=\"/tools/markdown-math\">Markdown Math Preview tool\u003C/a> renders both inline and block math live as you type, using KaTeX, and shows the exact parser error if something doesn&#39;t parse — a fast sanity check before you paste a formula into any of the platforms above.\u003C/p>\n\u003Ch2 id=\"related-reading\">Related Reading\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"/blog/markdown-math-expressions-complete-guide\">Math Expressions in Markdown: Complete LaTeX and MathJax Guide\u003C/a> — the LaTeX syntax fundamentals this post assumes you already know\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-platform-compatibility-guide\">Markdown Across Platforms: What Actually Works in GitHub, Notion, Obsidian, and Confluence\u003C/a> — the broader platform-compatibility picture beyond just math\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-in-confluence-what-works\">Markdown in Confluence: What Actually Works\u003C/a> — more detail on the \u003Ccode>/markdown\u003C/code> paste panel referenced above\u003C/li>\n\u003Cli>\u003Ca href=\"/blog/markdown-to-slack-formatting-guide\">Markdown to Slack Formatting: What Actually Works\u003C/a> — the full picture of mrkdwn&#39;s formatting limits\u003C/li>\n\u003C/ul>\n",[15,19,22,25,28,31,34,37],{"id":16,"text":17,"level":18},"native-support-github-gitlab-obsidian","Native Support: GitHub, GitLab, Obsidian",2,{"id":20,"text":21,"level":18},"needs-a-plugin-static-site-generators","Needs a Plugin: Static Site Generators",{"id":23,"text":24,"level":18},"real-feature-different-trigger-notion","Real Feature, Different Trigger: Notion",{"id":26,"text":27,"level":18},"needs-a-marketplace-app-or-doesnt-support-it-confluence-jira-slack","Needs a Marketplace App or Doesn't Support It: Confluence, Jira, Slack",{"id":29,"text":30,"level":18},"mathjax-vs-katex-why-the-same-formula-can-look-different","MathJax vs. KaTeX: Why the Same Formula Can Look Different",{"id":32,"text":33,"level":18},"quick-reference","Quick Reference",{"id":35,"text":36,"level":18},"practical-takeaways","Practical Takeaways",{"id":38,"text":39,"level":18},"related-reading","Related Reading",[41],"markdown-math",[43,53,60],{"slug":44,"title":45,"description":46,"excerpt":47,"date":48,"category":49,"author":50,"keywords":51,"readingMinutes":52},"markdown-footnotes-across-platforms","Markdown Footnotes Across Platforms: Where They Actually Render","GitHub, GitLab, Obsidian, and this very blog render [^1] footnotes natively — Notion, Slack, Jira, and Confluence don't support them at all. A platform-by-platform reference for where footnote syntax actually works.","Footnote syntax — a reference marker like [^1] in the body text, paired with a definition [^1]: The actual note. elsewhere in the document — looks the same everywhere you write it. Whether it…","2026-09-25","Reference","Matthew Rathbone","markdown footnotes across platforms, github footnotes, gitlab footnotes, notion footnotes, obsidian footnotes support",5,{"slug":54,"title":55,"description":56,"excerpt":57,"date":58,"category":9,"author":10,"keywords":59,"readingMinutes":12},"markdown-image-sizing-alignment-across-platforms","Markdown Image Sizing and Alignment Across Platforms: What Actually Works","Wrapping an image in a sized, centered \u003Cimg> tag works great in GitHub — but paste that same Markdown into Notion or Slack and the HTML just vanishes. Here's which platforms honor inline HTML for images, which have their own separate syntax, and which need attachments instead.","Standard Markdown's image syntax — — has no way to control size or alignment. There's no width=, no center, nothing. So the moment you need a smaller image, or one centered on the page instead of…","2026-09-04","markdown image size, markdown image alignment, resize image markdown, center image markdown, obsidian image size, notion image markdown, markdown image html platforms",{"slug":61,"title":62,"description":63,"excerpt":64,"date":65,"category":66,"author":50,"keywords":67,"readingMinutes":12},"markdown-platform-compatibility-guide","Markdown Across Platforms: What Actually Works in GitHub, Notion, Obsidian, and Confluence","A practical Markdown compatibility guide for GitHub, Notion, Obsidian, Confluence, VS Code, and more. Includes a feature comparison table and platform-specific tips.","Markdown is everywhere — but Markdown is not the same everywhere. If you've ever carefully written a document with footnotes, custom HTML, or a nice callout block, only to paste it into a…","2026-04-30","Guide","markdown compatibility, markdown platforms, github markdown, notion markdown, obsidian markdown, confluence markdown, markdown comparison, markdown features by platform",1792184947040]