Next.js+TypeScriptのブログで数式をKaTeX形式で書けるようにする

2021-05-29
Main Image

目次

こんにちは。

本ブログでは一応データサイエンス的なネタを扱おうとしているわけですが、なにぶん数式が書けないと不便なもので、まずは数式を記述できるようにしようと思いました。

今回はブログ内にTEX形式で数式を記述する方法を実践してまとめてみます。

【2022年5月3日追記】本記事の内容が少し古くなったので、以下の記事に書き直しました。

【2022最新】Next.js+TypeScriptのブログで数式をKaTeX形式で書く方法【LaTeX/Markdown】

前提

本ブログは以下の環境で作成しています。

パッケージ"remark-math"と"KaTeX"の導入

以下のパッケージをインストールします。

$ npm install remark-math
$ npm install remark-html-katex

それぞれのパッケージの役割は以下の通りです。

remark-math

マークダウン内の$inlineMath に、$$math nodesにパースします。

remark-html-katex

math nodesremark-htmlに対応したKaTeXに変換します。

KaTeXとは

KaTeX(https://katex.org/)はウェブブラウザで数学表記を表示するクロスブラウザJavaScriptライブラリです。(Wikipediaから引用。)

要はwebページに数式が書けるようになる便利ツール。

KaTeXの書き方はこちらが参考になります。 https://manabitimes.jp/katex

バージョン

インストールしたパッケージライブラリをpackage.jsonで確認したバージョン情報です。

  "remark": "^13.0.0",
  "remark-html": "^12.0.0",
  "remark-html-katex": "^3.0.0",
  "remark-math": "^4.0.0",

remarkremark-htmlのバージョンも依存関係として重要かもしれないので一応抜粋。

blog.tsを書き換える

それではblogに数式を書けるための加工をしていきます。

blog.tsを以下のように記載します。

モジュールのインポート部分

import remark from 'remark'
import html from 'remark-html'
import math from 'remark-math'
import htmlKatex from 'remark-html-katex'

MarkdownをHTMLにパースする部分

.use(html)の後ろに、上で新しくインポートしたものを繋げていきます。

export async function getPostData(id: string) {
  ...

  const processedContent = await remark()
    .use(html)
    .use(math)
    .use(htmlKatex)
    .process(matterResult.content)
  const contentHtml = processedContent.toString()
  return {
    id,
    
    ...

    })
  }
}

これで、markdownの中に書いた$マークや$$マークで囲った部分が、mathコンポーネント<div class="math math-display">に置換されるようになりました。

katex.cssをインポートする

上でmathコンポーネントができたので、これにスタイルを適用するためにCSSをインポートします。

https://github.com/remarkjs/remark-mathに書いてあるとおり、

Note: you should also use katex.css somewhere on the page to style math properly:

ということで、読み込みます。crossorigincrossOriginとキャメルケースに修正。

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossOrigin="anonymous" />

上記をlayout.tsxHead内に記載しました。

実際に数式を書いてみる

それでは実際に書いてみましょう!

記事のマークダウンに書いた内容

Lift($L$) can be determined by Lift Coefficient ($C_L$) like the following
equation.

$$
L = \frac{1}{2} \rho v^2 S C_L
$$

remark-mathReadMeにかいてあるやつ。

結果

Lift(LL) can be determined by Lift Coefficient (CLC_L) like the following equation.

L=12ρv2SCLL = \frac{1}{2} \rho v^2 S C_L

無事に表示されました!

めでたしめでたし。

ads【オススメ】未経験からプログラマーへ転職できる【GEEK JOBキャンプ】
▼ Amazonオススメ商品
ディスプレイライト デスクライト BenQ ScreenBar モニター掛け式
スマートLEDフロアライト 間接照明 Alexa/Google Home対応

Author

Penta

都内で働くITエンジニアもどき。好きなものは音楽・健康・貯金・シンプルでミニマルな暮らし。AWSクラウドやデータサイエンスを勉強中。学んだことや体験談をのんびり書いてます。TypeScript / Next.js / React / Python / AWS / インデックス投資 / 高配当株投資 More profile

Location : Tokyo, JPN

Contact : Twitter@penguinchord

Recommended Posts

Copy Right / Penguin Chord, ペンギンコード (penguinchord.com) 2022 / Twitter@penguinchord