Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 68
Текст из файла (страница 68)
Поэтому в системеLATEX сортировка терминов по алфавиту и отслеживание номеров страниц полностью автоматизированы. Наборщику текста нужно только пометить терминыв исходном тексте командами \index.Если затем загрузить пакет makeidx и вставить в преамбулу входного файлакоманду \makeindex, компилятор создаст первичный указатель, т. е. список всехпомеченных терминов в порядке их упоминания в исходном тексте и сохранит егов отдельном файле. Далее этот список сортируют при помощи специальной программы.
Поскольку любая реализация LATEX’а содержит программу MakeIndex ,чаще всего используют именно её. Она формирует упорядоченный по алфавитусписок терминов в виде процедуры theindex и также сохраняет его в отдельномфайле. Перед следующей компиляцией этот файл можно вставить в исходный14.1. Рецепт приготовления325текст при помощи известной Читателю команды \input или более специализированной команды \printindex.В разработке MakeIndex в разные годы принимали участие Пехонг Чжень(Chen, Pehong), Майкл Харрисон (Harrison, Michael) и Нил Кемпсон (Kempson,Niel). Консультировал работу Лесли Лампорт (Lamport, Leslie).
MakeIndex можно настроить для сортировки словаря терминов, пометив нужные слова в исходном тексте при помощи команды \glossary. Дальнейшие действия идентичныподготовке алфавитного указателя за исключением самой последней стадии, таккак аналога команды \printindex для словаря терминов нет. Предполагается,что отсортированный словарь терминов должен быть просто скопирован в исходный текст документа. На практике MakeIndex едва ли где-то применяют длясортировки словаря терминов, поскольку он, как правило, содержит не ссылкина номера страниц, а пояснения к терминам. Ясно, что бездушная программа неспособна объяснить смысл термина.
Тем не менее наличие двух команд: \indexи \glossary — для выделения терминов несомненно полезно. В нашей книге мыотмечаем командой \index слова, которые должны попасть в предметный указатель, а команду \glossary используем для именного указателя, хотя её имя вбуквальном переводе означает «толковый словарь».14.1.Рецепт приготовленияЗафиксируем первые итоги нашего обсуждения, сосредоточившись для началана составлении предметного указателя.В качестве первого шага в исходном тексте следует пометить выбранные термины при помощи команды \index, пользуясь правилами, описанными в разделе 14.3. Если некоторые термины встречаются в тексте многократно, то, какговорится, возможны варианты.
Например, можно пометить только первое упоминание каждого термина. Другая крайность — механически отметить каждоеупоминание термина. Выбор варианта целиком определяется автором публикации. Обычно отмечают наиболее информативные упоминания каждого термина,но, например, в научных публикациях по истории часто фиксируется каждоеупоминание события или имени исторического деятеля.Чтобы пометить термин в исходном тексте документа в простейшем случаеего достаточно продублировать в аргументе команды \index, которую размещают сразу вслед за термином. Команды \index безобидны, так как они попростуигнорируются, пока в преамбуле отсутствует декларация \makeindex. Поэтомуметить термины можно на любой стадии редактирования исходного текста, отложив окончательную сборку алфавитного указателя до завершения основнойчасти работы.На завершающей стадии подготовки указателя в корневой входной файл (допустим, он называется jobname.tex) нужно внести следующие изменения:326Глава 14.
Алфавитный указатель1. Загрузить пакет makeidx1 и вставить в преамбулу декларацию \makeindex.Она указывает, что LATEX должен обновлять перечень помеченных терминов при очередной компиляции исходного текста. По традиции \makeindexпомещают вслед за \usepackage{makeidx}:\documentclass{book}\usepackage[russian]{babel}\usepackage{makeidx}\makeindex. . .\begin{document}. . .2. Вставить команду \printindex там, где должен быть напечатан алфавитный указатель.
Обычно её помещают ближе к концу документа.3. Повторить компиляцию входного файла. В результате будет создан первичный указатель jobname.idx. Он состоит из входов в указатель, каждый изкоторых создан одной командой \index в исходном тексте.4. Отсортировать первичный указатель программой MakeIndex . В результатебудет создан файл jobname.ind, содержащий исходный текст алфавитного указателя в виде процедуры theindex.
Обычно программа сортировкизапускается из меню редактора исходных текстов LATEX, так что Читателюне нужно беспокоиться, какой файл и чем обрабатывать.При следующей компиляции исходного текста команда \printindex напечатаеталфавитный указатель, взяв его текст из jobname.ind.
Однако, если в указателеесть русские слова, он будет упорядочен как угодно, но только не по алфавиту.Такова «реальность, данная нам в ощущениях» авторами стандартной русификации LATEX’а. Причиной всех проблем является принятое в 1999 году решениеобъявить русские буквы командами. LATEX преобразует русские буквы в команды\cyrcmd и в таком виде записывает их во все служебные файлы, в том числев файлы idx. Таким способом достигается совместимость документов с разметкой LATEX, созданных на разных компьютерных платформах. Однако программаMakeIndex не обновлялась с 1993 года, когда русские буквы ещё были буквами2 .Более современная программа xindy позволяет настраивать порядок сортировки, поэтому может правильно сортировать указатели гипотетически на любомсуществующем языке.
Однако реализация xindy для новейших версий Windowsна момент написания этой книги отсутствовала. В таких условиях приходитсяприбегать к кустарным методам. Они сводятся к принудительной перекодировкеidx-файлов перед вызовом программы MakeIndex .В настоящее время бо́льшая часть функций пакета makeidx перенесена в ядро системы LATEX.Пакет можно не загружать, если не используются команды \see, \seealso и \printindex.2 Прежний способ обработки русских букв без конвертации их в команды \cyrcmd можно смоделировать при помощи механизма TCX, см.
раздел 16.5.2.114.2. Процедура theindex327Разработчики «стандартной русификации» предлагают делать перекодировку с помощью скриптов rumkidx, которые вызывают программу sed, хорошо знакомую пользователям Unix. Установка sed в Windows возможна в составе библиотеки программ cygwin, но требует определённых усилий. На диске, прилагаемомк части тиража нашей книги, имеется скрипт cyr2win.wsf, который может работать с новейшими версиями Windows, начиная с Windows 983 , без установкидополнительного программного обеспечения. Мы использовали cyr2win.wsf приподготовке алфавитного указателя для данного издания, обрабатывая все файлыс расширением idx перед вызовом MakeIndex :cscript cyr2win.wsf jobname.idxmakeindx.exe jobname.idxПаллиативное решение с принудительной перекодировкой первичного указателя решает только часть имеющихся проблем.
С помощью MakeIndex невозможно осуществить «тонкую настройку» порядка сортировки путём введениядополнительных правил4 . Например, нельзя поменять очерёдность прописных истрочных букв, которая в кодировке Windows различна для русских и латинскихбукв. Не исключено, что через какое-то время MakeIndex уступит своё место программе xindy. Она понимает все инструкции, предназначенные для MakeIndex ,поэтому далее мы продолжим работу с MakeIndex , не полагаясь на дополнительные возможности xindy.Сообщения об ошибках, генерируемые программой MakeIndex , описаны в приложении B.4. Анализ отсортированного алфавитного указателя может обнаружить дополнительные ошибки, не обнаруженные MakeIndex . Они могут быть исправлены за счёт изменения соответствующих команд \index в исходном текстеи повторной обработки документа.
Отдельные исправления можно внести прямов файл jobname.ind. Он содержит текст алфавитного указателя в виде процедуры theindex. Однако прямого редактирования текста алфавитного указателяжелательно избегать, поскольку эту операцию пришлось бы повторять каждыйраз после генерации новой версии. Оформление алфавитного указателя можетварьироваться в широких пределах за счёт описанной в разделе 14.6 технологиинастройки программы MakeIndex .14.2.Процедура theindexПроцедура theindex печатает текст алфавитного указателя в две колонки5 . Каждая запись в указателе начинается командой \item. В отличие от процедур составления списков, которые могут состоять только из записей одного уровня,Возможно, требуется обновление Windows Script Host до версии 5.6 или выше.Порядок сортировки отдельных терминов можно варьировать при помощи префиксной части sortindex аргумента команды \index (cм. раздел 14.3).
Однако подобное решение вряд лиудовлетворит авторов книг, подобной нашей, которая содержит более 7 000 входов в указатель.5 Ещё раз напомним, что подобные утверждения относятся к стандартным классам документов.В нашей книге алфавитный указатель напечатан в 3 колонки.34328Глава 14. Алфавитный указательв процедуре theindex максимальное число уровней равно трём. Запись второго уровня начинается с команды \subitem, а запись третьего уровня — с\subsubitem.
Пустые строки между записями игнорируются. Дополнительныйвертикальный пробел, вставляемый перед записью, начинающей новую букву,создают при помощи команды \indexspace. MakeIndex автоматически вставляет её в нужных местах.\begin{theindex}\item гну 24, 26, 97\item гнус 13, 43\subitem злой 14, 117\subsubitem очень злой 77\indexspace\item дикобраз 13\end{theindex}гну 24, 26, 97гнус 13, 43злой 14, 117очень злой 77дикобраз 13Автору документа не придётся заполнять тело процедуры theindex «вручную»,но он должен в исходном тексте пометить термины, из которых компиляторунадлежит создать входы в указатель.14.3.Вход в указательАлфавитный указатель должен помочь читателю найти то, что он ищет.