색인

색인은 책 뒤쪽에 용어와 쪽 번호를 정렬해 모은 목록이며, 본문에서 용어를 표시해 두면 LaTeX가 만들어 줍니다. 필요한 것은 세 가지입니다. 프리앰블에 \makeindex를 선언하고, 색인에 넣을 위치마다 \index{…}를 두며, 목록을 출력할 곳에서 \printindex를 호출합니다. 다만 정렬은 LaTeX 자체가 아니라 별도 프로그램 makeindex(일본어는 mendex / upmendex) 가 맡으므로 bibtex처럼 추가 처리가 필요합니다. 이 페이지에서는 기본 선언부터 항목 문법(! 하위 항목, @ 정렬 키, | 쪽 번호 꾸밈), 빌드 과정, 일본어 정렬, 스타일 조정, 현대적인 imakeidx 패키지까지 차례로 살펴봅니다.

색인을 만드는 네 가지 요소

표준 색인 명령은 makeidx 패키지가 제공합니다. 프리앰블에서 이를 불러온 뒤 \makeindex 를 선언하면, 그때부터 LaTeX는 색인 항목을 별도 파일(.idx)로 써 냅니다. 남은 일은 본문에 용어를 표시하고 목록을 출력할 위치를 지정하는 것뿐입니다.

  • \usepackage{makeidx} — 색인 명령을 불러옵니다(프리앰블).
  • \makeindex — 색인 수집을 켜는 선언입니다(프리앰블). 이것이 없으면 \index는 조용히 무시됩니다.
  • \index{entry} — 본문에서 용어가 나오는 위치에 두는 표시입니다. 그 자리에는 아무것도 출력되지 않고 현재 쪽 번호만 기록됩니다.
  • \printindex — 완성된 색인을 실제로 조판하는 명령이며, 보통 문서 끝에 둡니다.

핵심은 \index보이지 않는 표시라는 점입니다. 단어 자체는 본문에 직접 쓰고, 바로 뒤에 \index{…}를 붙입니다(random numbers\index{random numbers} are used). 표시한 위치의 쪽 번호가 그 항목에 기록됩니다.

색인 항목 쓰기

\index의 인수에는 하위 항목, 정렬 키, 쪽 범위, 쪽 번호 서식, 상호 참조를 나타내는 전용 문법이 있습니다. 이는 LaTeX가 아니라 makeindex가 해석하는 네 가지 특수 문자 !, @, |, "에 의존합니다.

하위 항목(!). 느낌표가 계층을 나눕니다. \index{animals!cats}는 “animals”라는 주 항목 아래에 “cats”라는 하위 항목을 만듭니다. !를 반복하면 최대 세 단계까지 중첩할 수 있습니다(mendex / upmendex 계열에서는 더 깊게도 가능).

정렬 키(@). sortkey@display 형태로 쓰며, 정렬에 쓰는 문자열과 실제로 인쇄할 문자열을 분리합니다. 기호나 수식은 글자 모양 그대로 정렬되지 않으므로 중요합니다. \index{alpha@$\alpha$}는 색인에는 α를 찍지만 “alpha” 위치에 배치합니다. 일본어에서는 한자의 읽기를 지정하는 데 씁니다(\index{さくいん@索引}).

쪽 범위(|(|)). 한 주제가 여러 쪽에 걸칠 때 시작 위치에 |(, 끝 위치에 |)를 표시하면 12–15 같은 범위가 됩니다. \index{recursion|(}로 열고 나중에 \index{recursion|)}로 닫습니다.

쪽 번호 꾸밈(|). 세로줄 뒤에 인수 하나를 받는 명령 이름을 쓰면 그 쪽 번호에만 서식이 적용됩니다. \index{cat|textbf}는 용어가 정의된 쪽을 굵게 만들고, \index{group|textit}는 기울임으로 만듭니다. 직접 만든 명령 이름도 사용할 수 있습니다.

상호 참조(|see / |seealso). 마찬가지로 세로줄 뒤에 쪽 번호 대신 다른 항목으로 가는 안내를 낼 수 있습니다. \index{dog|see{pets}}는 “dog, *see* pets”를 만들고, |seealso{…}는 “*see also*”를 만듭니다.

특수 문자 자체 출력("). !, @, |, "를 항목 안의 일반 문자로 넣고 싶다면 바로 앞에 큰따옴표를 둡니다. 예를 들어 \index{C"!}는 “C!” 항목을 만듭니다.

기호역할
!하위 항목(중첩)\index{animals!cats}
@정렬 키(순서 제어)\index{alpha@$\alpha$}
|( |)쪽 범위 열기/닫기\index{recursion|(} … \index{recursion|)}
|cmd쪽 번호 서식 지정(굵게 등)\index{cat|textbf}
|see“see” 상호 참조\index{dog|see{pets}}
"다음 특수 문자를 그대로 출력\index{C"!}

빌드 흐름(makeindex 실행)

색인은 한 번의 컴파일로 완성되지 않습니다. bibtex와 마찬가지로 중간에 별도 프로그램이 들어가는 세 단계 과정입니다. 먼저 LaTeX를 실행하면 \index 호출이 원시 파일 file.idx로 모입니다. 다음으로 makeindex 프로그램이 이를 정렬하고 서식화해 조판 가능한 색인 file.ind를 만듭니다. 마지막으로 LaTeX를 한 번 더 실행하면 \printindexfile.ind를 읽어 문서에 색인이 나타납니다. 처리 로그는 file.ilg에 남습니다.

document.tex
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}

METAFONT\index{METAFONT} は字形を、TeX\index{TeX} は組版を担う。
ここでは乱数\index{乱数|textbf} の生成を扱い、
群\index{group@群} と環\index{ring@環} にも触れる。
アルゴリズム\index{algorithm|(} の説明はここから始まり…

% (数ページ後)
…アルゴリズム\index{algorithm|)} の説明はここで終わる。

\printindex
\end{document}

명령줄에서는 다음처럼 실행합니다. -s는 스타일 파일을, -o는 출력 이름을, -t는 로그 이름을 지정합니다(생략하면 확장자만 바뀝니다).

terminal
pdflatex mydoc        # writes mydoc.idx
makeindex mydoc       # mydoc.idx -> mydoc.ind (log in mydoc.ilg)
pdflatex mydoc        # \printindex reads mydoc.ind

이 전체 과정은 latexmk가 자동으로 처리합니다. .idx가 갱신되면 makeindex를 호출하고 필요한 횟수만큼 LaTeX를 다시 실행하므로, 세 단계를 손으로 실행할 필요가 없습니다.

일본어 색인(mendex / upmendex)

makeindex는 서구 알파벳순을 전제로 하므로 일본어 색인에는 mendex(pLaTeX 계열)나 upmendex(upLaTeX / LuaLaTeX 계열, Unicode 대응)를 사용합니다. 둘 다 makeindex와 호환되므로 makeindex를 호출하던 자리에 그대로 호출하면 됩니다.

terminal
uplatex mydoc                 # writes mydoc.idx
upmendex -s style.ist mydoc   # sorts kana correctly -> mydoc.ind
uplatex mydoc                 # \printindex reads mydoc.ind

가장 큰 장점은 가나 정렬입니다. makeindex로 일본어 오십음순 정렬을 하려면 각 항목에 reading@display 형태로 히라가나/가타카나 읽기를 주고, 탁점 등도 손으로 맞춰야 했습니다. upmendexICU (International Components for Unicode) 를 사용해 가나를 자동으로 올바르게 정렬하므로 그 수고가 크게 줄어듭니다. 또한 -d사전 파일을 지정하면 한자어 읽기를 한꺼번에 등록할 수 있어, @로 읽기를 붙이는 일도 종종 생략할 수 있습니다.

기준은 간단합니다. pLaTeX에는 mendex, upLaTeX / LuaLaTeX에는 upmendex입니다. @로 읽기를 주는 방식은 둘 다에서 동작합니다(\index{さくいん@索引}).

색인 스타일 바꾸기(.ist)

색인의 모양은 스타일 파일(.ist) 이 제어하며, makeindex -s style.ist file처럼 -s로 전달합니다. 내용은 <parameter> <value> 쌍의 목록일 뿐입니다. 문자열은 큰따옴표로 감싸고, % 뒤는 주석입니다(mendex / upmendex 스타일도 makeindex와 상위 호환됩니다).

  • headings_flag — 0이 아닌 값으로 설정하면 새 그룹마다 앞에 그룹 제목(선두 글자, 예: A, B… 또는 가나 그룹)을 넣습니다.
  • lethead_prefix / lethead_suffix — 그 제목 앞뒤에 놓는 문자열입니다.
  • delim_0 / delim_1 / delim_2 — 항목(각 계층)과 쪽 번호 사이의 구분자입니다(예: ", " 또는 점선 리더).
  • item_0 / item_1 — 항목 사이와 계층 사이에 삽입되는 문자열입니다(줄바꿈, 들여쓰기).
  • preamble / postamble — 색인 전체 앞뒤에 출력되는 코드입니다.

그룹 제목의 모양만 다듬는 정도라면 다음처럼 작은 .ist로 충분합니다.

document.tex
% style.ist
headings_flag    1
heading_prefix   "{\\bfseries "
heading_suffix   "}\\nopagebreak\n"
delim_0          "\\dotfill "

현대적인 방법: imakeidx

imakeidx 는 makeidx를 확장한 패키지이며 두 가지 큰 장점이 있습니다. 첫째, 컴파일 중에 makeindex를 자동으로 실행합니다. -shell-escape(외부 명령 실행 허용)를 붙여 LaTeX를 실행하면 목차처럼 색인이 만들어져 수동 단계가 필요 없습니다. 둘째, 한 문서 안에 여러 색인(예: 인명 색인, 주제 색인)을 둘 수 있습니다.

\makeindex에 옵션을 넘겨 설정합니다. name=은 색인을 구분하고, title=은 제목을 정하며, intoc은 목차에 싣고, program=은 정렬 프로그램(makeindex / xindy / texindy, 일본어라면 mendex / upmendex)을 고르며, options=-s style.ist 같은 인수를 전달합니다. 여러 개의 \makeindex를 쓰면 그 수만큼 색인이 생기고, \index[name]{…}로 항목을 나누어 보내며 \printindex[name]로 출력합니다.

document.tex
\documentclass{article}
\usepackage{imakeidx}

% two indexes; built automatically with -shell-escape
\makeindex[name=subject, title=事項索引, intoc, program=upmendex]
\makeindex[name=people,  title=人名索引, intoc, program=upmendex,
          options={-s style.ist}]

\begin{document}\index[subject]{group@群} は重要だ。
クヌース\index[people]{Knuth@クヌース} が TeX を作った。

\printindex[subject]
\printindex[people]
\end{document}
terminal
# auto-build: makeindex/upmendex is invoked for you
lualatex -shell-escape mydoc
lualatex -shell-escape mydoc   # second pass resolves page numbers

xindy를 쓸 때만 *full* shell-escape가 필요하지만, 자동 빌드 자체에는 공통적으로 -shell-escape가 필요합니다. 원한다면 imakeidx에서도 기존처럼 외부에서 makeindex / mendex를 호출할 수 있습니다. -shell-escape를 켤 수 없는 환경(일부 웹 서비스나 엄격한 CI)에서는 자동 빌드를 사용할 수 없으므로 수동 단계로 돌리거나 latexmk에 맡기십시오.