
Markdown目次自動生成ツール:ドキュメントにナビゲーションを追加する
📷 Christina Morillo / PexelsMarkdown目次自動生成ツール:ドキュメントにナビゲーションを追加する
目次を手動で書く手間を省きましょう。Markdownドキュメントの目次を自動生成し、アンカーリンクを正確に保つ方法を解説します。
長いREADMEファイルを書いていると、ある時点で目次が必要だと気づきます。そして見出しテキストを1つずつ小文字に変換し、スペースをハイフンに置き換え、特殊文字を取り除いてアンカーリンクを手動で作成することになります。その後、見出しが変更されたらリンクも修正し、新しいセクションが追加されたら目次も更新する…やがて目次の管理自体が負担になっていきます。
このプロセスは完全に機械的な作業です。GitHub-Flavored MarkdownのアンカーID生成アルゴリズムは明確に定義されており、人間が手動でやる必要はありません。Markdown目次ジェネレーターはこの作業を自動化します。Markdownドキュメントを貼り付けるだけで、正確にインデントされたリンク付きの目次がすぐに手に入ります。
目次がなぜ重要か
目次は単なる装飾ではありません。長いドキュメントでは、読者がドキュメントの全体構造を一目で把握し、必要なセクションに直接ジャンプできるようにする重要な役割を果たします。
GitHubのREADMEでは特にこの効果が大きいです。リポジトリを初めて訪れた開発者はREADMEを流し読みします。内容が長く目次がなければ、プロジェクトの構造を把握するのに余計な時間がかかります。整理された目次は「このプロジェクトはこのように構成されています」を即座に伝えてくれます。
技術ドキュメントも同様です。APIリファレンス、アーキテクチャガイド、オンボーディングドキュメント—読者は最初から最後まで読まず、必要な部分を探します。目次はその道を示す地図です。
アンカーID生成アルゴリズムを理解する
GitHubが見出しテキストからアンカーIDを生成する方法は単純です:
- HTMLタグを削除
- テキスト全体を小文字に変換
- ハイフンとスペース以外の特殊文字を削除
- スペースをハイフンに変換
- 重複処理:同じ見出しが複数回出現する場合は
-1、-2などを付加
例えば ## APIリファレンス(v2) は #apiリファレンスv2 になります。## はじめに は #はじめに になります。
日本語の見出しの場合、日本語文字はそのままアンカーに保持されます。URLにはパーセントエンコードされた形式で表示されることがありますが、ブラウザとGitHubの両方で正しく処理されます。
GitHubとGitLabの違い
GitHubとGitLabは基本的に同じアルゴリズムに従いますが、一部の文字の処理方法にわずかな違いがあります。通常の日本語ドキュメントではほぼ同じ結果になります。違いが出るのは:
- 括弧や記号:GitHubでは削除されますが、GitLabでは動作が異なる場合があります
- 絵文字が含まれる見出し:両プラットフォームで動作が不一致になることがあります
GitHub・GitLab両方に公開するドキュメントを書く場合は、見出しテキストをシンプルに保つのが実用的なアドバイスです。
実際の例
次のような構造のドキュメントを考えてみましょう:
# ライブラリ名
## インストール
### macOS
### Linux
## クイックスタート
## APIリファレンス
### 設定オプション
### メソッド
## コントリビュート
## ライセンス
ジェネレーターで生成される目次:
## 目次
- [インストール](#インストール)
- [macOS](#macos)
- [Linux](#linux)
- [クイックスタート](#クイックスタート)
- [APIリファレンス](#apiリファレンス)
- [設定オプション](#設定オプション)
- [メソッド](#メソッド)
- [コントリビュート](#コントリビュート)
- [ライセンス](#ライセンス)
H1タイトルである # ライブラリ名 は目次から除外されます。H1はドキュメントのタイトルであり、ナビゲーション対象ではないためです。階層構造もそのまま反映されます—H2が最上位、H3が1段階インデント。
特殊文字とエッジケース
正直に言うと、一部の状況では注意が必要です。
見出しに絵文字がある場合 — ## 🚀 はじめに のような絵文字を含む見出しは、レンダラーによってアンカーの処理方法が異なる場合があります。絵文字が含まれる見出しのアンカーリンクは、実際のプラットフォームで直接確認することをお勧めします。
コードスパンを含む見出し — ## `render()` 関数 のような場合、バッククォートが削除されて #render-関数 になります。ほとんどの場合、期待通りの結果です。
括弧や特殊文字 — ## APIリファレンス(v2) から括弧が削除されて #apiリファレンスv2 になります。意図した通りに動作しますが、似た名前のセクションが複数ある場合、アンカーが予想外の形になることがあります。
ワークフローへの統合
一般的な使用の流れは次の通りです:
- まずドキュメントを書きます(目次は気にせず)
- 構造が決まったら、Markdownを目次ジェネレーターに貼り付けます
- 生成された目次をコピーします
- ドキュメントの冒頭(導入文の後)に貼り付けます
同期の維持
このツールの限界は、ドキュメントが変更されても目次が自動的に更新されない点です。見出しを変更したり新しいセクションを追加したりした場合は、目次を再生成して置き換える必要があります。
小規模なプロジェクトでは大きな問題ではありません。ただし、頻繁に変更される大規模なドキュメントでは自動化ツールの検討をお勧めします:
- doctoc:npmパッケージ。pre-commitフックとして設定するとコミット時に目次を自動更新
- VS Code拡張機能:Markdown TOC関連の拡張機能が保存時に自動更新をサポート
- GitHub Actions:プッシュ時にdoctocを実行するワークフローを設定可能
目次ジェネレーターは、一度きりの生成や出力を確認したい場合に最適です。
一緒に使うと便利なツール
Markdownの作業フローで一緒に活用できるツールを紹介します。
Markdownプレビューは、生成された目次が実際にどのように見えるかを確認するのに便利です。見出しの階層構造と目次のインデントが正しいかどうかを視覚的に検証できます。
Markdown to HTMLコンバーターは、目次を含むドキュメントをHTMLに変換する必要がある場合—たとえばCMSに貼り付ける場合やメールテンプレートを作成する場合—に役立ちます。
Markdownテーブルジェネレーターは、手動で書くのが面倒なパイプ区切りのテーブル構文を自動生成します。ドキュメントにデータテーブルが必要な場合、大幅な時間短縮になります。
実際の使用から学んだヒント
まず見出しの階層構造を整理しましょう。 H2とH3を無秩序に混在させると、目次が混乱した形で生成されます。目次の生成プロセスがドキュメント構造の問題を明らかにすることもあります。
フラットな構造で十分なこともあります。 H2の見出しだけのドキュメントでは、インデントなしのシンプルな目次が生成されますが、それがかえってすっきりしていることが多いです。目次を豊かに見せるために不要なH3を追加する必要はありません。
読者の読み方を考慮しましょう。 開発者が繰り返し参照するAPIリファレンスなら、詳細な階層を含む目次が役立ちます。初めて読むREADMEなら、主要なセクションだけの簡潔な目次で十分です。
機械的な作業を自動化することで、実際のコンテンツ作成に集中できます。次のドキュメント作業でMarkdown目次ジェネレーターを活用してみてください。