AstroでKaTeXで書いた数式をMathMLに変換して表示する
当ブログはAstroというSSG(静的サイトジェネレータ)を使っている。また、記事はMarkdownを拡張したMDXというフォーマットを用いて書いている。
数学で学んだことを記事にする際、プレーンテキストでは微積分や行列などの数式を表現することが難しい。そのため、KaTeX(LaTeXのJavaScriptライブラリ)の記法を使ってコードブロック内に数式を表現したい。
```math
\int_{a}^{b} f(x) dx
```
ライブラリ選定基準
- MathMLに変換してほしい
- 余計なJavaScriptやCSSを使わない(読み込まない)
rehype-katex
rehype-katexを使うことにした。READMEにはunified()
を使ったり、JavaScript
やCSSを読み込んだりという記述があるが、Astroで使う場合には不要だった。
rehype-katex
をインストールし、astro.config.mjs
に設定を追加するだけで、math
のコードブロックをMathMLに変換してくれる。
$ npm install -S rehype-katex
// astro.config.mjs
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import rehypeKatex from 'rehype-katex'
// https://astro.build/config
export default defineConfig({
integrations: [
mdx(),
],
markdown: {
rehypePlugins: [rehypeKatex]
}
});
設定
rehype-katex
はデフォルトで、HTMLとMathMLの両方を出力する設定になっているため、output
オプションでMathMLのみに限定する。
また、mathブロック内で日本語などを使うと警告が出力されるので、あまり良くはないがstrict
モードを無効にした。
export default defineConfig({
integrations: [
mdx(),
],
markdown: {
rehypePlugins: [
[
rehypeKatex,
{
strict: false,
output: 'mathml'
}
]
]
}
});
上記の場合は、Optionsの型が効かないので、以下のような書き方も良さそうだ。
export default defineConfig({
integrations: [
mdx(),
],
markdown: {
rehypePlugins: [
(...args) => rehypeKatex({
...args,
strict: false,
output: 'mathml'
})
]
}
});