Опубликован: 07.02.2007 | Доступ: свободный | Студентов: 4014 / 1341 | Оценка: 4.56 / 3.95 | Длительность: 23:09:00
Специальности: Художник
Лекция 4:

Оформление текста в целом

Предметный указатель

В отличие от списка литературы, который при использовании описанных выше команд \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
\ORsubitem IBM-совместимые, 28
\ORsubsubitem ремонт, 35
\ORsubsubitem цены, 30
\ORsubitem болгарские, 26
\item Принтеры, 40
\indexspace
\item Кошки, 120
\item Собаки, 140--156
\end{THEindex}
\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}

(здесь y - номер страницы).

Если вы хотите номер страницы не подчеркнуть, а выделить другим шрифтом, разумно воспользоваться одной из команд для смены шрифта, работающих как команда с одним аргументом (см. выше).

Среди символов "abcd" не должно быть круглых скобок (сочетания "|(" и "|)" имеют, как было сказано выше, особый смысл); если вы хотите оформить таким образом номер страницы к "подчиненному", а не заглавному термину, то именно после подчиненного термина (того, после которого должен реально появиться номер страницы) и надо писать |abcd:

\index{Кошки!Ангорские|textbf}
Нина Казачек
Нина Казачек
Василий Майоров
Василий Майоров