TeXの記憶(58) — 複数のidxファイルを作る

TeXの記憶(58) — 複数のidxファイルを作る

LaTeXで複数の索引ファイル(*.idx)を作って、それぞれ別々のindファイルとして索引にしたい、という場合があります。何とかハンドブックのように辞典的な書籍は英語、日本語、人名、など、複数の項目の索引が必要になるので、複数の索引ファイルを出力できるようにしました。

LaTeXの索引はどうなっているのか、困ったときは「lt*.dtx」ファイルを眺めることにしています。私の設定では

texmf-dist/source/latex/base

の中にあります。適当に検索すると、「ltidxglo.dtx」の中に設定がありました。

ltidxglo.dtxを見ると索引に必要な設定は

  • 通常の\makeindexに相当するマクロ
  • 索引ファイルに書き出すマクロ
  • 索引(*.idx)を読み込むマクロ

の3種類のようです。

この例では、新たに2つの索引ファイルを作成、デフォルトの索引と合わせて3種類の索引を作ってみました。このままだと、「索引」という見出しがどれも同じになってしまうので、\theindexを修正するか何らかの方法をとる必要があります(今回は何もしていません)。

0929

サンプルのコードでは\makeXindexというコマンドの中に\Aindexと\Bindexを2つ登録しています。

\def\makeXindex{%
  %% A
  \newwrite\@Aindexfile
  \immediate\openout\@Aindexfile=\jobname-A.idx
  \def\Aindex{\@bsphack\begingroup
    \@sanitize
    \@wrAindex}%
  \typeout{Writing index file \jobname-A.idx}%
  \let\makeAindex\@empty
  %% B
  \newwrite\@Bindexfile
  \immediate\openout\@Bindexfile=\jobname-B.idx
  \def\Bindex{\@bsphack\begingroup
    \@sanitize
    \@wrBindex}%
  \typeout{Writing index file \jobname-B.idx}%
  \let\makeBindex\@empty
}
\def\@wrAindex#1{%
  \protected@write\@Aindexfile{}%
  {\string\indexentry{#1}{\thepage}}%
  \endgroup
  \@esphack}
\def\@wrBindex#1{%
  \protected@write\@Bindexfile{}%
  {\string\indexentry{#1}{\thepage}}%
  \endgroup
  \@esphack}
\newcommand\printAindex{\@input@{\jobname-A.ind}}
\newcommand\printBindex{\@input@{\jobname-B.ind}}
\makeindex
\makeXindex

…

\begin{document}
…
\Aindex{Aのさくいんこうもく@Aの索引項目}
…
\Bindex{Bのさくいんこうもく@Bの索引項目}
…
\index{デフォルトのこうもく@デフォルトの項目}
...
\printindex
\printAindex
\printBindex

ファイル名をfoo.texとして処理すると、foo.idx, foo-A.idx, foo-B.dixが生成されるので、それぞれmakeindexやmendexで処理すればfoo.ind, foo-A.ind, foo-B.indが生成されます。

あとは通常どおりもう一度foo.texを処理すれば、それぞれのindファイルが読み込まれます。

コメント

  1. […] ← TeXの記憶(58) — 複数のidxファイルを作る […]