今回は、Hugoについてです。
_index.mdは標準では限られたコンテンツしか含めないので、それを改造していきたいと思います。
そもそも_index.mdとは?というところにも触れるので、_index.mdindex.mdの仕様に疑問がある方は必見です。

Hugoでの_index.md 見出しへのリンク

以下のようなフォルダがサーバー上にあったとします。

- contents
    - old
        * index.html
        * old_content.html
    * index.html
    * content1.html
    * content2.html

この時に、contents/contents/index.htmlはアクセスしたときに同じ様に表示されます。
同様にcontents/old/contents/old/index.htmlも同じ表示となります。
これは、フォルダにアクセスしたときに、index.htmlが存在するか探索されるからです。

一方で、Hugoでは、index.md_index.mdというこれとほぼ同様の役割を果たすものをが用意されています。
ただ、これらは厳密には異なり、仕様が異なります。

ひとつづつ見ていきましょう。

index.mdの仕様 見出しへのリンク

index.mdはほとんどindex.htmlのようなものであると思ってもらってもいいです。

- contents
    - blog
        * index.md

のようにファイルを配置すれば、ビルド後は、[servername]/blog/とアクセスすることもできるし、 [servername]/blog/index.htmlとアクセスすることも出来ます。

ただ、index.mdには__落とし穴__が…

- contents
    - blog
        - item
            * index.md <- NG (index.md被りは禁止)
        * index.md <- OK
        * server.md <- NG (server/indexかのように扱われる)
    - about
        * index.md

このような配置をして、ビルドすると、server.mditem/index.mdがビルドされません!
なぜかと言うと、index.md下層ノードでの重複が禁止 されているからです。
即ち、blog/はもう既にindex.mdを持っているので、子ディレクトリのindex.mdはビルドされません。 Hugoはserver.mdの様なファイルをserver/index.htmlにビルドしようとするのでserver.mdもビルドされません。

ややこしいですね。即ち、index.mdをフォルダに置いたら、その子フォルダのMarkdownファイルはすべてビルドされないということです。
これは前述のHTMLのサーバーとは全く異なる仕様です。

_index.mdの仕様 見出しへのリンク

一方、_index.mdは

- contents
    - blog
        - item
            * _index.md <- OK
        * _index.md <- OK

この様に配置しても問題ありません!
なぜかというと、_index.mdindex.mdと用途が異なるからです。
Hugoにおいて、_index.mdは、他のページへの 道しるべの役割 を果たすものなのです。
_index.mdはその子フォルダにどの様な記事が存在するかを、リスト形式で示すために存在します。
ただ、その用途に特化するためなのか、_index.mdに記事を書いても、 無視されます

ここまでをまとめると

index.md_index.md
下層ノードでの重複xo
記事を含めるかox

本編 (前置き長すぎ) 見出しへのリンク

ここで、当然、疑問として、 “下層ノードでの重複を許しながら、記事を含んだものを作れるの?” というのが浮かびます。
答えは YES です。
私もこの疑問を持ったのですが、ごり押しで解決できたので、その方法を紹介したいと思います。

  1. まず、Hugoで作業しているディレクトリに行きます。
  2. 以下のようなディレクトリとファイルを作成します。パスでかけば、layouts/_default/list.htmlです。
Example directory
  1. layouts/_default/list.htmlを以下のように書き換えます。
{{ define "title" }}
  {{- .Title }} · {{ .Site.Title -}}
{{ end }}
{{ define "content" }}
  {{ if .Params.ispage }}
    {{ partial "page.html" . }}
  {{ else }}
    {{ partial "list.html" . }}
  {{ end }}
{{ end }}

何をしたかというと、_index.mdをオーバーライドして、任意のコンテンツを含めるようにしました。
これを行えば、_index.mdに普通に記事を書いて、パラメーターとしてMarkdownの先頭に

ispage: true

と追加してあげるだけで、重複可能な記事を含んだコンテンツを作れるようになります!

おわりに 見出しへのリンク

いかがだったのでしょうか?
いわゆる、index.htmlと同じ仕様のものを探していたのですが、なかったのでオーバーライドすることになりました。
index.mdを重複可能にする方法も探したのですが、どうやらHugo本体のほうで定義されているようなので、仕様変更は不可能でした。