静的サイト生成ツールHakyllの強みは,Pandocを使ってテキスト処理をしていること。PandocはMathJax出力ができるので,Hakyllを使って生成するサイトにもMathJaxが使えるはずである。

hakyll-initした既定のままでは,MathJaxは利用できない。Hakyllの設定ファイルは,Haskellソース。Qnikst blogのポストを参考にsite.hsを修正する。

site.hsの編集

まず,ライブラリを追加する。

import           qualified Data.Map as M
import           Text.Pandoc

Pandocにオプションを渡すために,pandocCompilerではなく,pandocCompilerWithを使う。オプションと言ってもコマンドラインオプションではなく,PandocのAPIの引数として渡す。

    match "posts/*" $ do
        route $ setExtension "html"
        compile $ pandocCompilerWith defaultHakyllReaderOptions pandocOptions
            >>= saveSnapshot "content"
            >>= return . fmap demoteHeaders
            >>= loadAndApplyTemplate "templates/post.html" postCtx
            >>= loadAndApplyTemplate "templates/default.html" (mathCtx `mappend` postCtx)

ここでは,template/default.htmlでMathJaxを使う。このテンプレートを適用する際に,mathCtxによりタグ$mathjax$を調べる。数式を使う場合にのみ,MathJaxのJavaScriptを読むようにする。このテンプレートは,数箇所使われているのでmappendを使い適宜mathCtxを追加する。 mathCtxの定義はbloggerでうまく表示できないので上記ポスト参照。

pandocOptionsの定義

pandocOptions :: WriterOptions
pandocOptions = defaultHakyllWriterOptions{ writerHTMLMathMethod = MathJax "" }

templates/default.htmlの編集

$mathjax$が空のときに空行が入らないようにcssと同じ行にタグを付けた。

       $mathjax$

数式入り投稿の例

---
title: MathJax
mathjax: on
---
$sqrt{frac{1}{2}}$はinline math.
$$sqrt{frac{1}{2}}$$はdisplay math.