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を使うことになるでしょう。