TeXの記憶(58) — 複数のidxファイルを作る
LaTeXで複数の索引ファイル(*.idx)を作って、それぞれ別々のindファイルとして索引にしたい、という場合があります。何とかハンドブックのように辞典的な書籍は英語、日本語、人名、など、複数の項目の索引が必要になるので、複数の索引ファイルを出力できるようにしました。
LaTeXの索引はどうなっているのか、困ったときは「lt*.dtx」ファイルを眺めることにしています。私の設定では
texmf-dist/source/latex/base
の中にあります。適当に検索すると、「ltidxglo.dtx」の中に設定がありました。
ltidxglo.dtxを見ると索引に必要な設定は
- 通常の\makeindexに相当するマクロ
- 索引ファイルに書き出すマクロ
- 索引(*.idx)を読み込むマクロ
の3種類のようです。
この例では、新たに2つの索引ファイルを作成、デフォルトの索引と合わせて3種類の索引を作ってみました。このままだと、「索引」という見出しがどれも同じになってしまうので、\theindexを修正するか何らかの方法をとる必要があります(今回は何もしていません)。
サンプルのコードでは\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ファイルが読み込まれます。
コメント
[…] ← TeXの記憶(58) — 複数のidxファイルを作る […]