これは「TeX & LaTeX Advent Caleandar 2019」の9日目の記事です。
8日目は、trueroadさんでした。10日目は、mod_poppoさんです。
みなさん、#テフライブ! していますか?
この記事では、普段わたしが索引を作成する際に用いているLaTeX索引スタイルファイルを解説します。
本記事を書こうと思ったきっかけ
東大TeX愛好会の直近ゼミで、「目次と索引について」を扱っていたことに触発されまして、「索引の体裁ならびに索引の作り方」に関連している「LaTeX索引スタイルファイル」を簡単に紹介する感じで書いてみようかと思い立ちました。
新学生会館第一集会室で始めてます!目次と索引について
— 【公式】東大TeX愛好会 (@ut_tex_club) December 2, 2019
また、本記事は、わたしが普段のLaTeX組版書籍製作において索引作成に関するちょっとしたことですが、インターネット上の記事で索引スタイルファイルの事例をほとんど見かけないので、今回話してみたいと思いました。
今年の重点テーマ**「やっぱりLua(La)TeXしよう」**でない記事で申し訳ないです1。
ぼくのかんがえたさいきょうのLaTeX索引スタイルを使ったLaTeX文章の例
ここでは、次の手順どおり、簡単な日本語LaTeX文章ファイルの例を用いて、通常のLaTeX組版における索引の生成をします。
- LaTeX文章ファイル
foobook.tex
をlualatex
コマンドでタイプセット -
upmendex
コマンドで索引スタイルファイルfoobook.ist
を与えて索引ファイルを作成 - 再度
lualatex
コマンドでタイプセットして、索引ファイルfoobook.ind
を取り込み、組版されたPDFファイルへ出力
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
と同じディレクトリに置きます。
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:索引整形ツール』をご参照ください。
TeX Live 2021以降、「ぼくのかんがえたさいきょうのLaTeX索引スタイルファイル」相当が
jpbase.ist
として mendex-doc パッケージに取り込まれました。
jpbase.ist
の詳細は、同『mendex:索引整形ツール』の付録Aをご参照ください。
タイプセットします。
通常の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
は、以下のようになります。
\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:索引整形ツール』をご参照ください。
最後までお読みくださいまして、ありがとうございました。
-
やっぱり、フォントの扱いは、どこかで解説したいですね。LuaTeXにおける和文書体の話などネタはあるといえばあります。 ↩