색인은 책 뒤쪽에 용어와 쪽 번호를 정렬해 모은 목록이며, 본문에서 용어를 표시해 두면 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를 한 번 더 실행하면 \printindex가 file.ind를 읽어 문서에 색인이 나타납니다. 처리 로그는 file.ilg에 남습니다.
\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는 로그 이름을 지정합니다(생략하면 확장자만 바뀝니다).
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를 호출하던 자리에 그대로 호출하면 됩니다.
uplatex mydoc # writes mydoc.idx
upmendex -s style.ist mydoc # sorts kana correctly -> mydoc.ind
uplatex mydoc # \printindex reads mydoc.ind가장 큰 장점은 가나 정렬입니다. makeindex로 일본어 오십음순 정렬을 하려면 각 항목에 reading@display 형태로 히라가나/가타카나 읽기를 주고, 탁점 등도 손으로 맞춰야 했습니다. upmendex는 ICU (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로 충분합니다.
% 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]로 출력합니다.
\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}# auto-build: makeindex/upmendex is invoked for you
lualatex -shell-escape mydoc
lualatex -shell-escape mydoc # second pass resolves page numbersxindy를 쓸 때만 *full* shell-escape가 필요하지만, 자동 빌드 자체에는 공통적으로 -shell-escape가 필요합니다. 원한다면 imakeidx에서도 기존처럼 외부에서 makeindex / mendex를 호출할 수 있습니다. -shell-escape를 켤 수 없는 환경(일부 웹 서비스나 엄격한 CI)에서는 자동 빌드를 사용할 수 없으므로 수동 단계로 돌리거나 latexmk에 맡기십시오.