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

> これは「[TeX ＆ LaTeX Advent Caleandar 2019](https://adventar.org/calendars/4087)」の9日目の記事です。
> 8日目は、[trueroadさん](https://qiita.com/trueroad/items/5030c9460da71065a721)でした。10日目は、[mod_poppoさん](https://blog.miz-ar.info/2019/12/cluttex-material-for-texconf2019/)です。

みなさん、[#テフライブ！](https://twitter.com/search?f=realtime&q=%23%E3%83%86%E3%83%95%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%81) していますか？

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


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

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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新学生会館第一集会室で始めてます！目次と索引について</p>&mdash; 【公式】東大TeX愛好会 (@ut_tex_club) <a href="https://twitter.com/ut_tex_club/status/1201436422248382464?ref_src=twsrc%5Etfw">December 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


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

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

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

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

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

### LaTeX文章ファイル `foobook.tex`

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


```latex: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` と同じディレクトリに置きます。

```latex: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：索引整形ツール](http://mirror.ctan.org/info/mendex-doc/mendex.pdf)』をご参照ください。

> TeX Live 2021以降、「ぼくのかんがえたさいきょうのLaTeX索引スタイルファイル」相当が `jpbase.ist` として mendex-doc パッケージに取り込まれました。
> `jpbase.ist`の詳細は、同『[mendex：索引整形ツール](http://mirror.ctan.org/info/mendex-doc/mendex.pdf)』の付録Aをご参照ください。

### タイプセットします。

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

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

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

<img width="751" alt="ScreenShot 7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43618/fc15defe-01e7-7f08-34f2-220005761f6f.png">

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

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

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

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

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

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

```latex: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_prefix` や `delim_0`, `delim_1` などがそのまま吐き出されるので、あまりうれしくありません。

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

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



## まとめ

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

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

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

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

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

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

なお、上記の`foobook.ist`は、TeX Live 2021以降にmendex-docパッケージに`jpbase.ist`として取り込まれています。
詳細は、アスキー・メディアワークス、日本語TeX開発コミュニティ『[mendex：索引整形ツール](http://mirror.ctan.org/info/mendex-doc/mendex.pdf)』をご参照ください。

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