Hugo DuskにToCをつける

目次

TL;DR

テンプレート本体を肥大化させたくないためpartialに押し込む

--- a/layouts/_default/single.html
+++ b/layouts/_default/single.html
@@ -2,6 +2,7 @@
 
 <article class="post">
     <h1 class="title"> {{ .Title }} </h1>
+    {{ partial "toc.html" . }}
     <div class="content"> {{ .Content }} </div>
     {{ partial "postfooter.html" . }}
 </article>

partialでToCのテンプレートを書く

Hugo の目次について考える · k-kaz を参考にしつつ、details summary タグで折り畳めるHTMLを書く。

--- /dev/null
+++ b/layouts/partials/toc.html
@@ -0,0 +1,6 @@
+{{ if and (gt .WordCount 400) (ne .Params.toc false) }}
+<details>
+  <summary>目次</summary>
+  <div class="toc">{{ .TableOfContents }}</div>
+</details>
+{{ end }}

ToCに適用するCSSを追記する

各ページに目次を表示する (.TableOfContents) | まくまくHugo/Goノート を見ながら、リストスタイルをやめてインデントを加える部分だけ真似して終了。

--- a/static/css/layout.css
+++ b/static/css/layout.css
@@ -510,3 +510,20 @@ th, td {
   }
 }
 
+/* TableOfContents */
+#TableOfContents > ul {
+  font-size: smaller;
+}
+#TableOfContents ul {
+  list-style-type: none;
+       text-align: left;
+}
+#TableOfContents li {
+  padding-top: 0;
+}
+#TableOfContents li > ul {
+  padding-left: 1em;
+}
+#TableOfContents a {
+  font-weight: normal;
+}