Next.jsで数式を書いてみたいと思うこと、ありますよね。
僕はあるので自分用にメモです。
2次方程式の解の公式、懐かしいですね。
これを見ると学生時代を思い出しますね。
こういう数式を、Next.jsでもMarkdownに
x = \frac{-b\pm\sqrt{b^2-4ac}}{2a}
こんな感じで書けたら便利です。
今回は
KaTeXなどでJavaScriptで動的にブラウザ上で数式を描画する方法はよく見ますが、Next.jsでSSGをしているならその時に数式をSVGにレンダリングした方がフォントを別途読み込んだりしなくてもいいので便利です。
まず、必要なパッケージをインストールします。
npm install remark-math rehype-mathjax
このウェブサイトではMarkdownを読み込むのに unified を使用しているので、 remark-math と rehype-mathjax を追加で use します。
import rehypePrism from '@mapbox/rehype-prism';
import rehypeMathJaxSvg from 'rehype-mathjax/svg';
import rehypeStringify from 'rehype-stringify';
import remarkGfm from 'remark-gfm';
import remarkMath from 'remark-math';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import { unified } from 'unified';
export const markdownToHtml = async (markdown: string) =>
(
await unified()
.use(remarkParse)
.use(remarkMath)
.use(remarkGfm)
.use(remarkRehype, { allowDangerousHtml: true })
.use(rehypePrism)
.use(rehypeMathJaxSvg)
.use(rehypeStringify, { allowDangerousHtml: true })
.process(markdown)
)
.toString();
では、実際に書いてみることにします。
\gcd(x, y) =
\begin{cases}
y & (x = 0)\\
x & (y = 0)\\
\gcd(y, x \bmod y) & (\text{otherwize})
\end{cases}
\delta_{ij} =
\begin{cases}
1 & \text{if }i = j\\
0 & \text{if }i \ne j
\end{cases}
上手に書けました!✨
以上です。
https://github.com/nishidemasami/nishidemasami.github.io
実際にNext.jsで動いているコードは👆ここから確認してください。