Gatsby.jsにてマークダウンで書かれた記事の中で目次を追加するプラグインを紹介する。
2022/06/01:本サイトは右ドロワに目次を表示する改修を行ったためこちらのプラグインは現在使用していない。
2022/03/06
2.0.0
が公開されていたのでアップグレードを行った。
公式Githubではまだ詳細のアナウンスなし。Gatsby.js v4の対応か?
アップデート後問題なく動作していることを確認。
signalwerk/gatsby-remark-table-of-contents: gatsby remark plugin to generate table of contents
※基本の使い方は以前と変わりないのでこのまま読んでもらえればと思う。
目次ボタンはh
タグ内に#
を使った「ページ内リンク」となるので
ページ内リンクを取り扱うプラグインとの併用がほぼ必須となっている。
私が合わせて使っているページ内リンクプラグインは次
gatsby-remark-autolink-headers | GatsbyJS
こちらの設置方法も記事にしてある。
【Gatsby.js】見出しにページ内リンクを設定するプラグイン「gatsby-remark-autolink-headers」
今回利用する「記事に目次を追加するGatsby.js
のプラグイン」である。
動作としてはmarkdown
の中に目次を挿入するという方法をとっており.md
ファイルにコードを追加しておくだけで自動的に目次を製作してくれる。
markdown
形式で記述される目次になるためデザインの自由度は失われるが
誰でも簡単に目次を追加できるのが売りである。
プラグインのトップページは次
gatsby-remark-table-of-contents | GatsbyJS
公式は英語サイトであり日本語の解説サイトも少ないためこの記事で出来る限りわかりやすく解説する。
npm i gatsby-remark-table-of-contents
インストール後gatsby-config.js
に追記する
gatsby-config.js
内のgatsby-transformer-remark
の配下にプラグインを追記する。
plugins: [
{
resolve: `gatsby-transformer-remark`,
options: {
plugins: [
{
resolve: `gatsby-remark-table-of-contents`,
options: {
exclude: "目次",
tight: false,
fromHeading: 1,
toHeading: 6
},
}
],
},
},
],
2020/08/27追記:v0.1.0
からoptions
にclassName
が追加されて目次にクラスを付けられるようになった。
これにより後からスタイリングが出来る...かも?(未確認)
基本機能だけならこれ以上設定は必要が無いところが楽。
これをインストールしたらmd
ファイルに次のコードブロックを挿入するだけ。
```toc
# This code block gets replaced with the TOC
```
※上は公式コード。#行はコメントのため削除して構わない。
設定が必要なければこれだけで動作するはずである。
gatsby-config.js
に先程追記したプラグインのoptions
を直接設定することで基本動作を設定できる。
ここに記述したデータと一致する見出しは目次から除外される。
例えば上の設定ではexclude: "目次"
となっているので実際の.mdファイルに次のように書いた場合
# 目次
```toc
# This code block gets replaced with the TOC
```
「目次」と書いてあるコードは目次に入らなくなる(「目次」という項目そのものを目次にいれてもしかたない)
※ここには正規表現が使えるが難しくなるので解説は省略。詳しくは公式を参照。
このプラグインは#
のタグから始まる「見出し」を目次にするというシンプル設計だが
「#
何個ついている見出しから目次にする?」という設定がこれである。
デフォルト1で基本OKだと思うが「## 見出し
の レベル2(h2
タグ)」から目次にしたい場合は2にする。
例えばこの記事の上の「設定」という大きな文字は#
が1個なのでh1
タグになっており
「fromHeading」と書いてある箇所は#
が2個でh2
タグになる。
ここでfromHeading: 2
を設定に書き込んでおくと実際に生成される目次には「設定」という項目は出てこず
「fromHeading」という項目は目次として現れる。
こちらは逆に#
の個数がどこまでの階層を目次として表示するかである。
1に設定すれば#
が1個のh1
タグしか目次に設定されない。
※この場合はfromHeading
もtoHeading
も1
を記述
こちらも基本的にデフォルト6から設定を変更する必要はないだろう。
fromHeading <= toHeading
であること
つまりfromHeading
の設定はtoHeading
の設定と同じか小さい必要がある。
これを反対にしてしまうと記事が表示されなくなるので注意。
先程toc
と書いたコードブロック内に設定を入れることで記事ごとに設定を変えることが出来る。
※こちらはgatsby-config.js
に書いた設定より優先度が高くなる
```toc
# This code block gets replaced with the TOC
exclude: Table of Contents
tight: false,
from-heading: 2
to-heading: 6
```
こちらのプラグインは設定項目が少なく非常に簡単に導入が出来る。
ページ内リンクのプラグインと合わせる必要があるが入れておいて損はないプラグインかと思う。
※ページ内リンクプラグインは次を推奨