結論

やめておきましょう。footnote使いましょう。

…だけではアレなので、供養を兼ねて一応使い方を書いておきます。

CSLファイルを取得する

HakyllでHTMLへの変換に使用しているpandocでは、Citation Style Language(CSL)を使って引用文献の表示をカスタマイズできます。 citation-style-language/stylesにしこたまあるので、適当な物をコピーするなり、cloneするなり、submoduleにするなりしましょう。

ルールを追加する

templateCompilerと同じように適当にルールを追加します。

1
2
3
main = hakyll $ do
    match "style.csl"        $ cslCompiler
    match "bibliography.bib" $ biblioCompiler

コンパイラを書き換える

pandocCompilerのソースを参考に、readPandocBiblioを使って適当にコンパイラを書き換えましょう。

4
5
6
7
8
9
10
11
     match "posts/*.md" $ do
        route idRoute
        compile $ do
            csl <- load "style.csl"
            bib <- load "bibliography.bib"
            cached "myPostCompiler" $ getResourceBody
                >>= readPandocBiblio defaultHakyllReaderOptions csl bib
                >>= return . writePandoc

完成!….ではなく

これでよいならまだ「やめておきましょう」とまでは言わないのですが、このままだとReferenceを再読込する時にread関数でコケます12

これはBiblioBinaryインスタンスがReferenceのshow/readを使用して実装されており1Referenceのread/showが逆関数になっていないためです3

そこで、取り敢えずshow/readではなくAesonインスタンスを使ってこれを回避します。

回避

Bib.hs これをプロジェクトルートにでも置いてimport qualified Bibしましょう。 趣味でMonoidインスタンスも足してますが、本筋はAesonを使うようにした以外は変わりません。

で、Biblioの部分と、

3
     match "bibliography.bib" $ Bib.compiler

compileの部分を書き換えましょう。

10
                >>= readPandocBiblio defaultHakyllReaderOptions csl (Bib.cast bib)

完成!

これだけ汚く回避してもハイパーリンク張れないのが(私にとっては)致命的なのでfootnote使った方が幸せでは、って感じます。

以下に引用のサンプルを付けておきます。

参考

1.hackage et al. src/Hakyll/Web/Pandoc/Biblio.hs. at <http://hackage.haskell.org/package/hakyll-4.4.3.2/docs/src/Hakyll-Web-Pandoc-Biblio.html#line-66>


  1. 2回目以降のbuildとか、watch中とか。

  2. 毎回再コンパイルするなら、このまま使えます。

  3. どこが腐っているかの判断は各自にお任せします。

comments powered by Disqus