LaTeX
Nextra can use KaTeX to pre-render LaTeX expressions
directly in MDX or MathJax to dynamically render math in
the browser. To enable LaTeX support, you must enable the latex
option in your
next.config.mjs
file:
import nextra from 'nextra'
const withNextra = nextra({
latex: true
})
export default withNextra()
A value of true
will use KaTeX as the math renderer. To explicitly
specify the renderer, you may instead provide an object
{ renderer: 'katex' }
or { renderer: 'mathjax' }
as the value to
latex: ...
.
When enabled, the required CSS and fonts will be automatically included in your
site, and you can start writing math expressions by enclosing inline math in
$...$
or display math in a math
-labeled fenced code block:
```math
\int x^2
```
Example
For example, the following Markdown code:
The **Pythagorean equation** is $a=\sqrt{b^2 + c^2}$ and the quadratic formula:
```math
x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
```
will be rendered as:
The Pythagorean equation is and the quadratic formula:
You can still use Markdown and MDX syntax in the same line as your LaTeX expression.
If you want to display $
in your content instead of rendering it as an
equation, you can escape it with a backslash (\
). For example \$e = mc^2\$
will be rendered as $e = mc^2$.
API
KaTeX
rehype-katex
is used to pre-render LaTeX expressions in your content. You can
pass supported KaTeX options via the options
key in your Nextra config. For example, to add a macro \RR
that renders as
\mathbb{R}
you could use the following configuration.
const withNextra = nextra({
latex: {
renderer: 'katex',
options: {
macros: {
'\\RR': '\\mathbb{R}'
}
}
}
})
See KaTeX’s documentation for a list of supported commands.
MathJax
When MathJax is enabled (by setting latex: { renderer: 'mathjax' }
) math
is rendered on page load via
better-react-mathjax
instead of being pre-rendered. By default, MathJax is served via the MathJax
CDN instead of the files being directly included in your site.1
MathJax rendering is enabled by setting renderer: 'mathjax'
in your
Nextra config.
const withNextra = nextra({
latex: {
renderer: 'mathjax'
}
})
You can pass additional options to better-react-mathjax
via the options
key
in your Nextra config. The config: ...
option sets the
MathJax configuration.
However, note that you can only pass serializable options to
better-react-mathjax
via the options
key in your Nextra config.2
For example, to configure MathJax to render \RR
as \mathbb{R}
you could use
the following configuration.
const withNextra = nextra({
latex: {
renderer: 'mathjax',
options: {
config: {
tex: {
macros: {
RR: '\\mathbb{R}'
}
}
}
}
}
})
MathJax CDN
By default, MathJax is served via the MathJax CDN. To serve files from another
location (including locally in your project), you must pass the src: ...
option to the latex config. See the
better-react-mathjax documentation
for details about the src
option. Additionally, you may need to copy the
MathJax distribution into your /public
folder for it to be served locally.
KaTeX vs. MathJax
With KaTeX, math is pre-rendered which means flicker-free and faster page loads. However, KaTeX does not support all of the features of MathJax, especially features related to accessibility.
The following two examples show the same formula rendered with KaTeX (first) and MathJax (second).
\[\int_2^3x^3\,\mathrm{d}x \]Because of MathJax’s accessibility features, the second formula is tab-accessible and has a context menu that helps screen readers reprocess math for the visually impaired.
Footnotes
-
This can be changed by setting
{ options: { src: ... } }
in the Nextra config. ↩ -
To pass non-serializable objects like Functions, you must use the
<MathJaxContext config={...} />
component directly in your source. ↩