2018/11/7 by @kmuto

部が存在するときのしおりのレベルを調整する

部が存在するときの PDF のしおり(ブックマーク)の階層化の不都合を修正します。


本記事は、Re:VIEW 3 以上の機能に依存します。

PDF のしおり(ブックマーク)は、TeX の hyperref パッケージを使用して実現しています。一般的な章のみで構成されている書籍では、これで問題ありません。

.
├── 前書き
├── 1章
│    ├── 1.1節
│    └── 1.2節
├── 2章
│    └── 2.1節
├── 3章
└── 付録A

しかし、部が入ると、部の下位に部以外のしおりが収録されてしまう現象が発生します。

.
├── 前書き
├── I部
│    ├── 1章
│    │    ├── 1.1節
│    │    └── 1.2節
│    └── 2章
│          └── 2.1節
└── II部
      ├── 3章
      └── 付録A ←これ以降がII部に入るのは意図していない!

これは、hyperref パッケージのレベル付けに起因しています。後ろに hyperref が振るレベルの番号を付けてみると、以下のようになります。

.
├── 前書き (0)
├── 1章 (0)
│    ├── 1.1節 (1)
│    └── 1.2節 (1)
├── 2章 (0)
│    └── 2.1節 (1)
├── 3章 (0)
└── 付録A (0)
.
├── 前書き (0)
├── I部 (-1) ←部のレベルは-1
│    ├── 1章 (0)
│    │    ├── 1.1節 (1)
│    │    └── 1.2節 (1)
│    └── 2章 (0)
│          └── 2.1節 (1)
└── II部 (-1)
      ├── 3章 (0)
      └── 付録A (0) ←II部のレベル-1より大きいため下位

これに自動で対処するのは困難です。TeX 側はシステムとしては部や章などの構造については関知せず、Re:VIEW 側でも部の「終わり」を判断して何かを差し込むような機構は持っていません。何かマクロを用意しようにも、すべてに通用するような汎用化はやりづらい箇所です。

ただ、対処方法は考えられます。

  • 手法A:部が終わった後の全見出しのレベル数を1つ減算する(章を-1とする)
  • 手法B:部構造の場合は部以下の全見出しのレベル数に1つ加算する(部を0、章を1とする)。部構造が終わったら元に戻す

まず、sty フォルダの review-custom.sty に以下のような支援マクロを追加します。

\def\resettoclevel{%オリジナルのレベル
\def\toclevel@part{-1}
\def\toclevel@chapter{0}
\def\toclevel@section{1}
\def\toclevel@subsection{2}
\def\toclevel@subsubsection{3}
\def\toclevel@paragraph{4}
\def\toclevel@subparagraph{5}
}

\def\uptoclevel{%部以下の見出しレベルを1つ大きくする
\def\toclevel@part{0}
\def\toclevel@chapter{1}
\def\toclevel@section{2}
\def\toclevel@subsection{3}
\def\toclevel@subsubsection{4}
\def\toclevel@paragraph{5}
\def\toclevel@subparagraph{6}
}

\def\downtoclevel{%章以下の見出しレベルを1つ小さくする
\def\toclevel@part{-1}
\def\toclevel@chapter{-1}
\def\toclevel@section{1}
\def\toclevel@subsection{2}
\def\toclevel@subsubsection{3}
\def\toclevel@paragraph{4}
\def\toclevel@subparagraph{5}
}

手法Aは次のような戦略です。

.
├── 前書き (0)
├── I部 (-1)
│    ├── 1章 (0)
│    │    ├── 1.1節 (1)
│    │    └── 1.2節 (1)
│    └── 2章 (0)
│          └── 2.1節 (1)
├── II部 (-1)
      └── 3章 (0)
(※ここからレベルの付け方を-1する)
└── 付録A (0→-1) ←II部のレベル-1と同じになったのでII部の枠から抜ける

ちょうど付録の直前に呼び出される \reviewappendixhook マクロが用意されているので、この中で \downtoclevel を呼び出すようにします。review-custom.sty に以下を追加します(中身の最初の2行は、review-base.sty で定義されていた内容です)。

\def\reviewappendixhook{
  \renewcommand{\chaptermark}[1]{\markboth{\appendixname\thechapter~##1}{}}
  \reviewappendix
  \downtoclevel
}

これで簡単に実現できました。

手法Bは次のような戦略です。

.
├── 前書き (0)
(※ここからレベルの付け方を+1する)
├── I部 (-1→0)
│    ├── 1章 (0→1)
│    │    ├── 1.1節 (1→2)
│    │    └── 1.2節 (1→2)
│    └── 2章 (0→1)
│          └── 2.1節 (1→2)
├── II部 (-1→0)
      └── 3章 (0→1)
(※ここでレベルの付け方を戻す)
└── 付録A (0) ←II部のレベル0と同じになったのでII部の枠から抜ける

こちらの手法では、(上記の図の用途だけならフックに書いてもよいのですが)re ファイルのほうにレベル変更を埋め込みます。

I部の見出しが始まる前に、\uptoclevel マクロを呼び出すようにします。I部の re ファイルの先頭に生の TeX マクロを embed 命令で埋め込みます。

//embed[latex]{
\uptoclevel
//}

= I部の見出し
 …

レベル変更の部構造が終わったら、レベルを元に戻します。ここでは3章の末尾で戻すことにしましょう。3章の re ファイルの末尾に \resettoclevel マクロを embed 命令で埋め込みます。


= 3章の見出し
 …
(末尾)
//embed[latex]{
\resettoclevel
//}

これで、部構造の中だけレベルが変わります。

手法A・Bどちらを選ぶかは、部構造の複雑さによります。付録や後付が部に吸収されてしまって困るというだけであれば、手法Aで十分です。部の中に入ったり入らなかったりする章がある、のように複雑な部構造を持つ場合は、手法Bを使うことになるでしょう。