TeXの記憶(28) — 固定したtocファイルを読み込む

LaTeXは\tableofcontentsを使えば自動的に目次を作ってくれるので便利なのです。商用の書籍でも\l@chapterや\l@sectionに手を加えればなんとか要求されたデザインにすることができます。しかし、編集者の指定というのはキリがないもので、特定のところで改ページされたり、ある部分だけ例外の指定が入ったりすることがたびたび起こります。

すべての指定を自動で行うようにマクロを書く時間と、指定に合わせてすべての目次を手動で作る時間を考えると、どちらもそれなりに面倒です。とくにすべてを手動で目次を作るのは、工程の最後のほうで本文のページ構成に変更があったりすると、どっと疲れがやってきます。

両極端なことを考えてないで、適当にいいとこ取りするのが現実的と考えたのが以下の方法です。

  • なるべく指定の目次になるようにマクロを定義する
  • 普通のtocファイルを生成する
  • 生成されたtocファイルを、手動で仕上げて別名で保存する
  • tableofcontentsを書き換えて、別名で保存したtocファイルを読み込む

tocファイルを作り直しする場合もあるのでオプションで元の動作と切り替えできるようにしました。

作ったマクロは\TABLEOFCONTENTSです(名前はどうでもいいですが、TeXは大文字小文字を区別するのでこんな感じ)。

使い方は

\TABLEOFCONTENTS*

とすると「fixed-処理したファイル名.toc」が読み込まれ、「*」を付けないで

\TABLEOFCONTENTS

とすると通常の「処理したファイル名.toc」が読み込まれます。もちろん生成もされます。

たとえば、

$ platex foo.tex
$ platex foo.tex

とすると、foo.tocが生成されるので、それを編集してfixed-foo.tocとして保存してからもう一度

$ platex foo.tex

とするとfixed-foo.tocが読み込まれた(dviやpdfが生成されます)。

マクロは以下のようになりました。

\newif\ifUseFixedToc
\UseFixedTocfalse
\newcommand{\TABLEOFCONTENTS}{\@ifstar{\@TABLEOFCONTENTSs}{\tableofcontents}}
\def\@TABLEOFCONTENTSs{\UseFixedToctrue\tableofcontents}

\tableofcontents自体は何も変わらずjbook.clsの定義どおりです(jsbook.clsもほとんど同じ)。

\newcommand{\tableofcontents}{%
  \if@twocolumn\@restonecoltrue\onecolumn
  \else\@restonecolfalse\fi
  \chapter*{\contentsname
    \@mkboth{\contentsname}{\contentsname}%
  }\@starttoc{toc}%
  \if@restonecol\twocolumn\fi

この中で使われている\@starttocがファイルの読み込みを請け負っているので、ltsect.dtxからコピーして修正しました。

\def\@starttoc#1{%
  \begingroup
    \makeatletter
    \ifUseFixedToc              % 追加
      \@input{fixed-\jobname.#1}% 追加
    \else                       % 追加
      \@input{\jobname.#1}%
    \fi                         % 追加
    \if@filesw
      \expandafter\newwrite\csname tf@#1\endcsname
      \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \@nobreakfalse
  \endgroup}

\@inputs{\jobname.#1}で「*.toc」を読み込んでいます。\jobnameは、

$ platex foo.tex

としたときの「foo」の部分です。

コメント