文書からTOCを作る上で、やはり構造的にネストしたいことはあると思う。ポピュラーなのは、ulをネストさせることだろう。難しいのは、例えば最初にh4が来て、次にh2が来て、などということがありうるのだ。h3は存在しないかもしれない。間の全てのレベルが存在することにするのか。順に礼儀正しく登場すると仮定していいのか。結局だが、汎用性のある仕様として次のようにした。最低レベルはオフセットかまたは実際に使われた最も大きいヘッダーに基づく(数え方としてはmin)レベルの変遷に応じて変遷分proc4openやproc4closeを呼ぶ。当該レベルまではopen/closeした後はproc4eachを呼ぶ。result.joinendeRubyでは内部のメソッドがputsすればいいような言い方をされることが多いが、それは先に出力されてしまっていたので、置換できるようにするために一旦配列に格納した。テンプレート側の記述量が多く、また直感的でないというデメリットはあるが、なんとかうまく処理できた。instance_evalと定数しかし、むしろ苦戦したのは、ProfileでTOCを含めることだった。Profileは基本的にそれ自体がPureDocを拡張したRubyコードである。文章としてヘッダーを含めているわけでもないので、TOCを作るためのとっかかりがないのだ。そこで結局はテンプレート側でテーブル手前にリンクを貼るprofileであとから各カテゴリをヘッダとして登録するという方法を取ったのだが、意外な理由でうまくいなかった。「instance_evalで評価した場合、そのコンテキストが認識する定数にアクセスできない」のだ。PureDocはソースをObject#instance_evalを使って解析するため、この問題にひっかかっってヘッダーの登録ができなかった。そこで、PureDocに登録用のメソッドを追加することとなった。簡単に書いているが、profileは整頓されていない部分が多く、結構大変だった。