TeXの記憶(45) — \addcontentslineをカスタマイズした目次

LaTeXの目次の表示の例です。章の番号が奇数なら左寄りに、偶数なら幅の中央あたりに揃えて、交互に目次を配置するというレイアウトです。\addcontentsline、\l@chapter、\l@sectionをカスタマイズしています。

0916

とっさに思いついたのは、tocファイルの中のコマンドを実装してる\l@chapterや\l@sectionの中で、章の値が偶数か奇数かによって\hspaceを使って位置を決めればいいかな、ということでした。

ところが通常の\l@chapterの引数は、

\contentsline {chapter}{\numberline {第1章}はじめに}{1}

のような形をしていて、章の数字だけ使うというわけにいきません。それで考えたのは

\contentsline {chapter}{1}{はじめに}{1}

のように章の数字を単独の引数にすることでした。これには\addcontentslineを修正する必要があります。

\addcontentslineはその名のとおりtocファイルに目次となる項目を書き込むコマンドです。章の番号や見出しの書き出しに使っているのは当然\chapter関係の中にあるでしょう。実際は\chapterから呼び出される\@chapterの中にありました。これはjbookのものです。

    \addcontentsline{toc}{chapter}%
      {\protect\numberline{\@chapapp\thechapter\@chappos}#1}%

この場所だけ別な\addcontentslineを使って、自分に都合のいい形を書き出しすことにしました。

    \addcontentslineChap{toc}{chapter}{\thechapter}{#1}%

通常の\addcontentslineの引数は2ですが、章の数字と見出しを分けたために\addcontentslineChapの引数は3になっています。

実装は次のようにしました。

\def\addcontentslineChap#1#2#3#4{%
  \addtocontents{#1}{\protect\contentsline{#2}{#3}{#4}{\thepage}}}

これで普通にplatexで1回処理すると

\contentsline {chapter}{1}{はじめに}{3}
...
\contentsline {chapter}{2}{そのつぎ}{5}
...
\contentsline {chapter}{3}{さらに}{7}

の形のtocファイルが生成されることになります。

tocファイルを出力するために、tocファイルで使われている各コマンド\l@chapterや\l@sectionを再定義して、偶数か奇数によって振り分ける処理を加えました。\l@sectionは元の定義では\@dottedtoclineを利用していますが、この定義ではそれを使わずに独自に設定しています。

\newif\ifTocOdd
\TocOddtrue
\renewcommand*{\l@chapter}[3]{%
  \ifodd#1
  \hbox to 60mm{{\Large 第#1章\hskip5mm #2}\hfill #3}\par
  \global\TocOddtrue
  \else
  \hskip60mm\hbox to 60mm{{\Large 第#1章\hskip5mm #2}\hfill #3}\par
  \global\TocOddfalse
  \fi}
\renewcommand*{\l@section}[2]{
  \ifTocOdd
  \hbox to 60mm{\hskip6mm#1\,\l@Leader#2}\par
  \else
  \hskip60mm\hbox to 60mm{\hskip6mm#1\,\l@Leader#2}\par
  \fi}
\newcommand{\l@Leader}{\leaders\hbox to .3em{\hss\hbox{.}\hss}\hfill}

\ifTocOddは\l@sectionの中で偶数奇数を判断するためのスイッチです。

コメント