Оформление текста в целом
Предметный указатель
В отличие от списка литературы, который при использовании описанных выше команд \cite и \bibitem получается совершенно автоматически, процесс создания указателя автоматизирован в LaTeX'е не полностью. Именно, вы можете сделать две вещи:
- Если вам уже известно, какие термины должны войти в указатель и на каких страницах они расположены, можно организовать печать предметного указателя с помощью окружения {theindex}. Если предметный указатель должен завершать документ, то можно, на худой конец, напечатать весь документ, кроме указателя, и вручную выписать требуемые номера страниц3У вас может возникнуть искушение пометить все места, на которые надо сослаться, с помощью команды \label, а в окружении {theindex} получить номера страниц с помощью \pageref. При этом, однако, есть опасность, что TeX'у не хватит памяти для обработки такого огромного числа ссылок..
- Можно также (и на практике это удобнее) специальным образом пометить в файле термины, на которые вы собираетесь ссылаться в предметном указателе. При этом средствами LaTeX'а создается полуфабрикат, из которого предметный указатель получится после обработки отдельной программой (называемой обычно makeindex, а в русской версии — rmakeindex или как-нибудь еще в этом роде), входящей в настоящее время почти во все поставки LaTeX'а.
Начнем с того, что расскажем о втором способе создания индекса, а потом объясним, что можно сделать, если программа для генерации индекса вам по какой-то причине недоступна.
Общие положения
Чтобы разметить файл для автоматической генерации индекса, нужно сделать две вещи. Во-первых, в преамбулу документа необходимо включить команду \makeindex. Во-вторых, при условии, что это сделано, можно пометить те места в тексте, на которые вы хотите сослаться в предметном указателе, командой \index (если команда \makeindex в преамбуле отсутствует, то команды \index ничему не мешают, но и никакого действия не оказывают). У этой команды один обязательный аргумент — текст вашей пометки (в простейшем случае такая пометка — это ключевое слово будущего предметного указателя). Информация о том, на какие страницы попали ваши пометки, будет записана в специальный файл с тем же именем, что и у вашего файла, и расширением idx (мы будем называть его idx-файлом). Пусть, например, в исходном файле встречались такие фрагменты4В наших примерах мы используем русские буквы, хотя на самом деле использование русских букв в предметном указателе зависит от применяемой вами русификации. Прежде всего, в ее состав должна входить версия программы makeindex, учитывающая русский алфавитный порядок. Кроме того, иногда (например, при использовании русского варианта пакета babel) в idx-файл попадают не русские буквы, а их условные обозначения, а в других случаях (при использовании старых версий TeX'а) их шестнадцатеричные коды, и это создает дополнительные сложности. Возможны также сложности с буквой "ё" при сортировке. При подготовке этой книги использован вариант русификации (см. приложение E), где такие проблемы не возникают.:
Многие люди любят домашних кошек.\index{Кошки} .... Хорошо также иметь собаку.\index{Собаки} .... Мало кто рискнет держать дома такую дикую кошку\index{Кошки}, как тигр.
Предположим, что первая ссылка на кошек попала на страницу 5, ссылка на собак попала на страницу 7, а вторая ссылка на кошек попала на страницу 9. Тогда в idx-файл запишется вот что:
\indexentry{Кошки}{5} \indexentry{Собаки}{7} \indexentry{Кошки}{9}
Полученный таким образом idx-файл — это и есть полуфабрикат указателя, созданный LaTeX'ом. Использовать этот полуфабрикат, однако же, еще нельзя: ссылки в idx-файле расположены не по алфавиту, а записаны " в порядке поступления", в idx-файле может присутствовать несколько строк с одним заглавным словом и ссылками на разные страницы, наконец, команда indexentry, с которой начинается каждая строка idx-файла, не определена в LaTeX'е (это сделано сознательно!).
Поэтому, получив idx-файл, надо его обработать с помощью программы makeindex ; в результате получится файл с отсортированными по алфавиту терминами (обычно он имеет расширение ind и называется ind-файлом), который можно будет включить в окружение {theindex}, написав
\begin{theindex} \input{text.ind} \end{theindex}
Если вы заглянете в файл, полученный в результате работы программы makeindex, то увидите, что в окружении {theindex} каждый элемент указателя вводится командой \item ; команды \subitem и \subsubitem вводят элементы указателя, печатающиеся с дополнительными отступами (обычно это уточнения к заглавному слову) — вскоре мы объясним, что надо писать в аргументе команды \index, чтобы получить такую иерархию элементов указателя. Наконец, команда \indexspace создает дополнительный вертикальный пробел (его можно использовать для отделения различных разделов указателя друг от друга):
\begin{theindex} \item Компьютеры, 25--42 \subitem IBM-совместимые, 28 \subsubitem ремонт, 35 \subsubitem цены, 30 \subitem болгарские, 26 \item Принтеры, 40 \indexspace \item Кошки, 120 \item Собаки, 140--156 \end{theindex} |
Предметный указатель, получаемый из окружения {theindex}, печатается LaTeX'ом в две колонки (даже тогда, когда сам документ печатается в одну колонку). Кроме того, LaTeX автоматически дает указателю заглавие, определяемое командой \indexname (см. выше). Если вас не устраивает, что это название — английское, его можно переопределить (см. там же).
В аргументе команды \index могут быть любые символы, и вообще текст в аргументе этой команды может быть неосмысленным или недопустимым с точки зрения TeX'а — в любом случае аргумент команды \index будет в неизменном виде переписан в idx-файл. Смысл тут в том, что в аргументе команды \index можно задавать вспомогательную информацию для программы обработки idx-файла (примеры тому вы найдете ниже). Единственное ограничение — не должно быть "несбалансированных" фигурных скобок, даже если эти скобки входят в состав команд \{ или \} (напомним, что вместо \{ или \} всегда можно написать \lbrace или \rbrace соответственно).
Наконец, еще одна тонкость: команду \index нельзя использовать внутри необязательного аргумента таких команд, как \section, \chapter, \caption (подрисуночная подпись; см. следующий раздел) и т.п.
Простейшие средства
В простейшем случае программа makeindex вызывается так5Напомним, что конкретное название программы и возможность использования русских букв может зависеть от используемой системы и русификации. См. приложения E и Ж :
\makeindex исходный_файл
Если исходный_файл имеет расширение idx (так скорее всего и будет, поскольку исходный файл — это, как правило, сгенерированный LaTeX'ом idx-файл), то это расширение можно не указывать. В результате работы программы makeindex появится файл с тем же именем, что у исходного файла, и расширением ind. Это — готовый файл для предметного указателя, который остается только включить в ваш документ с помощью команды \input. Создается также файл с тем же именем и расширением ilg. Это — протокол работы программы makeindex.
Если не предпринимать специальных мер, то все записи в ind-файле, созданном программой makeindex, будут равноправны — все они будут вводиться командой \item. Чтобы предметный указатель был устроен иерархически, как в примере на стр.178 , надо в аргументе команды \index после заглавного слова поставить восклицательный знак, а после него — подчиненное ему слово. Возможно также подчинение второго порядка — тогда нужен еще один восклицательный знак. Вот пример:
Многие люди любят домашних кошек.\index{Кошки!домашние} .... Ваша киска\index{Кошки!домашние!уход} купила бы... .... Хорошо также иметь собаку.\index{Собаки} ..... Мало кто рискнет держать дома такую дикую кошку,\index{Кошки} как тигр. Пудель\index{Собаки} гораздо безопаснее.
При обработке этого файла LaTeX'ом получится idx- файл6В том, конечно, случае, если в преамбуле была команда \makeindex . ; в результате обработки idx-файла программой makeindex получится ind-файл, включающий в себя, в частности, следующее (предположим, что наши команды \index попали на страницы с номерами 2, 7, 8, а две последние — на страницу 9):
\begin{theindex} ... \item Кошки, 9 \subitem домашние, 2 \subsubitem уход, 7 ... \item Собаки, 8, 9 ... \end{theindex}
Из сказанного следует, что при обработке idx-файла с помощью программы makeindex восклицательный знак в аргументе команд \index имеет особый статус. Чтобы программа \makeindex восприняла восклицательный знак просто как типографский значок, надо в аргументе \index предварить его знаком кавычки ":
\index{Восклицательный знак ("!)} \index{Междометия!Эх"!}
Эти аргументы команд \index дословно скопируются в idx-файл, а после его обработки программой makeindex в ind-файл запишется примерно вот что:
\item Восклицательный знак (!), 14 \item Междометия \subitem Эх!, 6
Наряду с восклицательным знаком, особый статус с точки зрения программы makeindex имеет символ @ (" коммерческое at"), вертикальная черточка | (в следующем разделе вы узнаете, в чем этот статус заключается), а также сама кавычка ". Если вы хотите употребить один из этих четырех значков в аргументе команды \index просто как символ, не вкладывая в него специального смысла, надо поставить перед ним кавычку ".
Исключение: кавычку, входящую в состав TeX'овской команды \", можно (и нужно) записывать без предосторожностей:
\index{Кавычка ("")} \index{Ёлочка} \index{H\"uhnchen}
При этом соответствующие записи в idx-файле могут получиться такими:
\item Ёлочка, 8 \item Кавычка ("), 6 \item H\"uhnchen, 12
Тонкости
Для каждого ключевого слова программа makeindex собирает все относящиеся к нему номера страниц и записывает их в ind - файле после этого слова через запятую. Если при этом попадутся три или более идущих подряд номера страниц, то в ind - файл будут записаны только первый и последний из этих номеров, через короткое тире (en-dash). Такие пары страниц через короткое тире можно организовывать и вручную. Пусть, например, в какой-то части вашего текста все время идет речь о кошках. Тогда можно в начале этой части написать
\index{Кошки|(}
а в конце ---
\index{Кошки|)}
Если первая из этих команд попала на страницу 9, а вторая - на страницу 77, то после обработки idx - файла программой makeindex в ind - файл попадет запись
\item Кошки, 9--77
Команды index{Кошки}, оказавшиеся между страницами 9 и 77, будут при этом проигнорированы.
При сортировке программа makeindex принимает во внимание не только буквы, но и спецзнаки, записанные в аргументе команды \index. Иногда это нежелательно: если в тексте имеются команды \index{Аист} и \index{\textbf{Ящерица}}, то ящерица может оказаться в ind-файле раньше аиста, если makeindex будет считать, что запись для нее начинается с символа "\", который идет раньше всех русских букв7Он может идти и позже — в зависимости от конкретной версии программы makeindex и ее отношения к русским буквам.. Чтобы избежать такого рода неприятностей, предусмотрена возможность по отдельности задать слово, которое будет участвовать в сортировке, и текст, который будет реально записан в ind-файл. В приведенном выше примере следовало бы написать
\index{Ящерица@\textbf{Ящерица}}
Теперь ящерица попадет туда же, куда и все прочие слова на букву "я", но при этом будет напечатана жирным шрифтом. Общее правило такое: если в аргументе команды \index присутствует символ @, то при сортировке учитывается только то, что написано левее него, а в ind - файл записывается только то, что правее него. Можно задавать отдельные тексты для сортировки и для печати не только для основного заглавного слова, но и для слов, ему подчиненных:
\index{Ящерицы@\textbf{Ящерицы}!игуана@\textbf{игуана}}
Напоминание: если перед @ или | стоит кавычка ", то эти значки рассматриваются просто как символы.
Программа makeindex может оформлять номера разных страниц по-разному. Пусть, например, вы считаете, что одно из мест в тексте, где говорится о кошках, является особо важным, и хотите, чтобы номер соответствующей страницы был подчеркнут (по аналогии с указателем к книге TeXbook [2]). Тогда можно поставить в этом месте команду
\index{Кошки|underline}
Предположим, что эта команда попала на страницу 100, и, кроме того, в тексте были две команды \index{Кошки}, попавшие на страницы 15 и 47. Тогда после обработки idx-файла программой makeindex в ind-файле появится такая строка:
\item Кошки, 15, 47, \underline{100}
Общее правило таково: команда \index{XXX|abcd} порождает в ind-файле строку
\item XXX, \abcd{y}
(здесь - номер страницы).
Если вы хотите номер страницы не подчеркнуть, а выделить другим шрифтом, разумно воспользоваться одной из команд для смены шрифта, работающих как команда с одним аргументом (см. выше).
Среди символов "abcd" не должно быть круглых скобок (сочетания "|(" и "|)" имеют, как было сказано выше, особый смысл); если вы хотите оформить таким образом номер страницы к "подчиненному", а не заглавному термину, то именно после подчиненного термина (того, после которого должен реально появиться номер страницы) и надо писать |abcd:
\index{Кошки!Ангорские|textbf}