ぼくのかんがえたさいきょうのLaTeX索引スタイルファイル


これは「TeX & LaTeX Advent Caleandar 2019」の9日目の記事です。
8日目は、trueroadさんでした。10日目は、mod_poppoさんです。

みなさん、#テフライブ! していますか?

この記事では、普段わたしが索引を作成する際に用いているLaTeX索引スタイルファイルを解説します。

本記事を書こうと思ったきっかけ

東大TeX愛好会の直近ゼミで、「目次と索引について」を扱っていたことに触発されまして、「索引の体裁ならびに索引の作り方」に関連している「LaTeX索引スタイルファイル」を簡単に紹介する感じで書いてみようかと思い立ちました。

また、本記事は、わたしが普段のLaTeX組版書籍製作において索引作成に関するちょっとしたことですが、インターネット上の記事で索引スタイルファイルの事例をほとんど見かけないので、今回話してみたいと思いました。
今年の重点テーマ「やっぱりLua(La)TeXしよう」でない記事で申し訳ないです1

ぼくのかんがえたさいきょうのLaTeX索引スタイルを使ったLaTeX文章の例

ここでは、次の手順どおり、簡単な日本語LaTeX文章ファイルの例を用いて、通常のLaTeX組版における索引の生成をします。

  1. LaTeX文章ファイル foobook.texlualatex コマンドでタイプセット
  2. upmendex コマンドで索引スタイルファイル foobook.ist を与えて索引ファイルを作成
  3. 再度 lualatex コマンドでタイプセットして、索引ファイル foobook.ind を取り込み、組版されたPDFファイルへ出力

LaTeX文章ファイル foobook.tex

まずは、簡単な日本語LaTeX文章ファイルとして、下記の foobook.tex を作成します。

foobook.tex
%#! lualatex foobook && upmendex -r -c -s foobook.ist -g foobook && lualatex foobook
%%↓今年の重点テーマ「やっぱりLua(La)TeXしよう」のためだけに、こうしました☃
\documentclass[book,paper=a5,lualatex]{jlreq}

%%索引 theindex 環境
\usepackage{needspace}
\usepackage{makeidx}\makeindex
\usepackage{multicol}
\makeatletter
\renewenvironment{theindex}{%
   \columnsep2\zw
   \columnseprule\z@
   \begin{multicols}{2}[\chapter*{\indexname}]%
     \small
     \@mkboth{\indexname}{\indexname}%
     \parindent\z@
     \parskip\z@
     \lineskiplimit\z@
     \lineskip\z@
     \raggedbottom
     \raggedcolumns
     \raggedright
     \let\item\@idxitem}
  {\end{multicols}
   \clearpage}

\renewcommand{\@idxitem}{\par\leavevmode\hangindent1\zw\inhibitglue}
\renewcommand{\subitem}{\@idxitem\hangindent2\zw\hspace*{1\zw}\inhibitglue}
\renewcommand{\subsubitem}{\@idxitem\hangindent3\zw\hspace*{2\zw}\inhibitglue}
\renewcommand{\indexspace}{\par\vskip\baselineskip\relax}

\newcommand\idxdelim{\nobreak{\reset@font\scriptsize\space
  \leaders\hbox to .3333\zw{\hss\hbox{.}\hss}\hfill\space}\nobreak}

\newcommand*{\symbolindexname}{記号・数字}

\def\makeidxhead#1{%
  \needspace{2\baselineskip}%
  \vspace{\baselineskip}%
  \hbox to \columnwidth{\hfil
    \normalsize\sffamily\bfseries\hspace{.5\zw}#1\hspace{.5\zw}\hfil}\par
  \nopagebreak
}
\makeatother

\begin{document}
\mainmatter
\chapter{ぼくのかんがえたさいきょうの索引スタイル}
ぼくのかんがえたさいきょうの\index{ぼくのかんがえたさいきょうの@ぼくのかんがえたさいきょうの}\index{さくいんすたいるふぁいる@索引スタイルファイル}\index{.ist}\index{index style}索引スタイルファイルです。

\backmatter
\printindex
\end{document}

jlreq.cls では、索引環境 theindex が用意されていますが、ここでは、本記事のために、multicolパッケージによる二段組を組み込んだ簡易的な索引環境を再定義します。
それに伴い、いくつかの索引関連コマンドも再定義しています。

索引スタイルファイル foobook.ist

下記の foobook.ist は、 foobook.tex と同じディレクトリに置きます。

foobook.ist
heading_flag     1
heading_prefix   "\n\\makeidxhead{"
heading_suffix   "}"
letter_head      2
symhead_positive "\\symbolindexname"
delim_0          "\\idxdelim "
delim_1          "\\idxdelim "
delim_2          "\\idxdelim "
group_skip       "\n\n"

これが、「ぼくのかんがえたさいきょうの索引スタイルファイル」です!

なお、今回、索引の作成には、(u)pLaTeXで利用する索引作成コマンド (up)mendex を前提とします。(up)mendexの詳細はアスキー・メディアワークス、日本語TeX開発コミュニティ『mendex:索引整形ツール』をご参照ください。

タイプセットします。

通常のLaTeX組版でタイプセットする手順と同じです。
索引ファイルを作成するときに、 upmendex コマンドの -s オプションに索引スタイルファイルを与えます。

lualatex foobook
upmendex -r -c -s foobook.ist -g foobook
lualatex foobook

foobook.tex をタイプセットしてできたPDFファイルをプレビューすると、このようになります。

無事に索引ができました!

「ぼくのかんがえたさいきょうの索引スタイルファイル」って、何が嬉しいの?

foobook.ist の内容は、わたしが商業誌製作のLaTeX組版で実際に用いているベースです。基本的に、この内容で一般的な商業誌の索引をほぼ作れます。

索引の読み見出しを \makeidxhead コマンドにまとめられる

この索引スタイルファイルの大きな特徴は、索引の読み見出しの体裁を \makeidxhead にまとめていることです。

ここで作成された索引ファイル foobook.ind は、以下のようになります。

foobook.ind
\begin{theindex}

\makeidxhead{\symbolindexname}
  \item .ist\idxdelim 1


\makeidxhead{I}
  \item index style\idxdelim 1


\makeidxhead{}
  \item 索引スタイルファイル\idxdelim 1


\makeidxhead{}
  \item ぼくのかんがえたさいきょうの\idxdelim 1

\end{theindex}

索引ファイル .ind 後処理のやりやすさ

実際の製作では、

  • 索引ファイルの元となる idx ファイルに何らかの加工する前処理
  • 索引ファイル ind ファイルに何らかの加工をする後処理

をしばしば行います。とくに、後者の索引ファイル .ind を加工する場合、前述のように要素ごとに出力されていたほうが、構造として加工しやすくないでしょうか?

実際には、index styleの由来から拡張子 .ist がきていて、 ist ファイル内に自己完結した見た目の体裁を記述し、デザインされた索引スタイルファイルを切り替えることで、索引の見た目の体裁を変えられます。

索引の見た目の体裁は、製作ごとに異なる

ところが、 ist ファイル仕様上、クラスファイル cls やスタイルファイル sty のように、テキストエディタ上で縦方向にTeXコードを書きづらく、 ind ファイルに ist ファイルに記述された heading_prefixdelim_0, delim_1 などがそのまま吐き出されるので、あまりうれしくありません。

したがいまして、索引の見た目の体裁を実装するために必要な要素をコマンドとして扱い、各プロジェクトごとのクラスファイルやスタイルファイル内に、それらの索引関連コマンドや環境を実装して制御するほうが、現実的だと思っています。

例えば、 索引の読み見出しの体裁内に \tcbox やTikZ/PGFで飾りをつけたい場合、 heading_prefix\tcboxkey=value を書き並べることをしたくないですよね。

まとめ

今回は、「ぼくのかんがえたさいきょうの〇〇」というのは大げさでアレでしたが、LaTeX組版による商業書籍製作の中で、索引スタイルファイルをどのようにしているのか、その一面を解説しました。

実際の製作における索引環境内では、もう少し複雑なTeX組版処理を行っています。
今回、索引スタイルファイルの解説のために、一部、既存のパッケージで処理を代替したり、処理を簡略化したりして、できるかぎり簡易的にしました。

今後、何らかの形で、LaTeX組版による商業書籍製作の話題を出していきたいと思います。

もしこの記事でLaTeX組版における索引作成に興味を持った方がいらっしゃいましたら、

  • 読み見出し \makeidxhead
  • 用語とノンブル間の区切り \idxdelim
  • 索引環境 theindex

などを触ってみてください。

最後までお読みくださいまして、ありがとうございました。


  1. やっぱり、フォントの扱いは、どこかで解説したいですね。LuaTeXにおける和文書体の話などネタはあるといえばあります。