Daiji Blog

rehype-mathml: TeX数式をMathMLにするrehypeプラグイン

公開
更新

この記事はフラー株式会社 Advent Calendar 20247日目の記事です6日目はsu8サポート終了間近 しがない30代エンジニアの本棚2024年版でした

はじめに

unifiedremarkrehypeを使ってMarkdownHTMLへ変換する人は多いでしょうunifiedGatsbyNuxt.jsAstroなど多くのフレームワークで利用されています

unifiedで数式を扱う場合Markdown中の$f(x)=ax+b$のようなTeXLaTeX数式をremark-mathで見つけrehype-mathjaxrehype-katexMathJaxKaTeXにより表示できる形式に変換するのが一般的です

ブラウザで数式を表示するためにHTMLMathMLを記述する方法がありますKaTeXは数式表示のためのHTMLに変換するだけでなくMathMLへの変換もサポートしていますしかしKaTeXは少しTeX数式のカバレッジが低く純粋なMathML以外も出力されるなどいくつかの不満がありました

そんなときカバレッジが優れ軽量なMathMLを出力するTemmlというライブラリを見つけましたTemmlを使ってMathMLに変換したいと思い@daiji256/rehype-mathmlを作成しました

rehype-mathmlで出来ること

このようなMarkdownからMathMLを含むHTMLに変換できます

本文中や$f(x)=ax+b$、別行立てで、

$$
\begin{align}
  f(x) &= ax + b\\
  g(x) &= cx^{2} + dx + e
\end{align}
$$

MathMLによる数式表示が可能です。

本文中やf(x)=ax+b別行立てで

f(x)=ax+bg(x)=cx2+dx+e

MathMLによる数式表示が可能です


MathML

MathMLについて簡単に説明します

MathMLMathematical Markup LanguageとはXML/HTML5で数式を記述するためのマークアップ言語ですCan I useによると現在ではメジャーなブラウザがMathMLをサポートしているそうです

Can I use MathML? Baseline 2023 Newly available across major browsers

ブラウザで数式を表示する方法としてMathMLの他にMathJaxKaTeXがありますこれらはJavaScriptの処理や画像の読み込みHTMLの肥大化などによりパフォーマンスが優れないです一方でMathMLは標準機能で数式を扱い非常に軽量ですさらにMathMLは数式の表示だけでなくそのコードに数式としての意味を持たせるためスクリーンリーダーなどでも扱うことができます1

しかしMathMLはコンピューターが認識しやすいように設計されたものであり人間が直接扱うのは難しいですそのためMathML専用のエディタなどを使うのが一般的です

MathMLによる数式記述例

例えば二次方程式の解の公式

x=b±b24ac2a

MathMLで記述すると次のようになる

<math>
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo>−</mo>
        <mi>b</mi>
        <mo>±</mo>
        <msqrt>
          <mrow>
            <msup>
              <mi>b</mi>
              <mn>2</mn>
            </msup>
            <mo>−</mo>
            <mn>4</mn>
            <mi>a</mi>
            <mi>c</mi>
          </mrow>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
</math>

rehype-mathmlの使い方

rehype-mathjaxrehype-katexをすでに使っている場合その部分を@daiji256/rehype-mathmlに置き換えるだけで完了します詳しくはrehype-mathml/README.mdに書いてあります

インストール

npmの場合

npm install @daiji256/rehype-mathml

でインストールできます

remark-mathrehype-mathml

remark-mathrehype-mathmlを以下のようにして使うことができます

import { unified } from 'unified';
import rehypeParse from 'rehype-parse';
import rehypeStringify from 'rehype-stringify';
import remarkRehype from 'remark-rehype';
import remarkMath from 'remark-math';
import rehypeMathML from '@daiji256/rehype-mathml';
import { read, write } from 'to-vfile';

const file = await unified()
  .use(remarkParse)
  .use(remarkMath)
  .use(remarkRehype)
  .use(rehypeMathML)
  .use(rehypeStringify)
  .process(await read('input.html'));

file.basename = 'output.html';
await write(file);

文献

  1. rehype-mathmlGitHub
  2. rehype-mathmlnpm
  3. unified
  4. remark-math
  5. W3C Math Home
  6. “MathML” | Can I use

フラー株式会社 Advent Calendar 20248日目はいのりこさんの復職記 〜第二子〜です

脚注

  1. rehype-mathmlではTeX数式をMathMLに変換するため数式が持つ情報量はTeX数式までになりますそのためMathMLほどの情報量はありません