Журнал LinuxFormat - перейти на главную

LXF92:LaTeX

Материал из Linuxformat
Перейти к: навигация, поиск
Компьютерные TeXнологии Учимся использовать культовую систему вёрстки


LaTeX

Листинги и текст на сайте автора

Содержание

Справочно-поисковый аппарат издания

ЧАСТЬ 9 TeX создавался для верстки книг и сегодня Евгений Балдин рассмотрит всё то, без чего немыслимо серьезное произведение – оглавление, предметный указатель, сноски и т.д..
На этом же этаже располагалось книгохранилище. По поводу
его размеров рассказывали, что в глубине, в полукилометре
от входа, идёт вдоль стеллажей неплохое шоссе, оснащённое
верстовые столбами.
«Понедельник начинается в субботу»
Аркадий и Борис Стругацкие.

Книги делятся на те, что читаются один раз и те, что многократно перечитываются. Наличие информации о структуре книги повышает ценность любого текста. Отсутствие этой информации – прямой намёк, что после прочтения произведение следует забыть и выбросить.

Справочно-поисковый аппарат издания позволяет читателю облегчить и ускорить поиск имеющихся в книге объектов. В качестве элементов, из которых складывается справочного-поисковая система, можно упомянуть рубрикацию, оглавление, колонтитулы, ссылки, подстрочные примечания, алфавитный указатель и библиографию.

Этот аппарат существует исключительно для читателя, и он достаточно трудоёмок при создании, но сложности не должны пугать истинных энтузиастов в деле создания текстов, так как их преодоление значительно повышают ценность серьёзного произведения.

Рубрикация и оглавление

Нужны ли книге оглавление или содержание? Любой скажет: что за вопрос, конечно, нужны. И не только в книге научной и деловой. В любой.

А.Э. Мильчин. «Культура издания»

Для оформления разделов в основном используются команды секционирования: \section, \subsection, \subsubsection, \paragraph и \subparagraph.

Команды перечислены в порядке убывания значимости при рубрикации. Обычно любой сколько-нибудь сложный текст следует начинать с планирования структуры, то есть создать шаблон, примерно следующего вида:

 \documentclass[a4paper,12pt]{ncc}
 \usepackage[warn]{mathtext}
 \usepackage[T2A]{fontenc}
 \usepackage[koi8-r]{inputenc}
 \usepackage[english,russian]{babel}
 \usepackage{indentfirst}
 \title{Пример рубрикации}
 \author{А.\,В.~Тор}
 \begin{document}
 \maketitle{}
 \tableofcontents{}
 \section{Раздел}
 \label{sec:section}
 Основной элемент рубрикации.
 \subsection{Подраздел}
 \label{sec:subsection}
 Вспомогательный элемент рубрикации.
 \subsubsection[Подподраздел]{Что-то более мелкое чем подраздел}
 \label{sec:subsubsection}
 Вспомогательный для вспомогательного. В содержании выводится
 краткая версия заголовка.
 \paragraph{Параграф}
 \label{sec:paragraph}
 Важный параграф.
 \subparagraph{Подпараграф}
 \label{sec:subparagraph}
 Параграф чуть менее важный.
 \section*{Раздел, отсутствующий в содержании}
 Всяко бывает. Иногда и такое нужно.
 \section*{Заключение}
 \label{sec:afterwords}
 \addcontentsline{toc}{section}{Заключение}
 Заключение, в отличие от, скажем, раздела~\ref{sec:subsection}
 на странице~\pageref{sec:subsection}, нумеровать не надо, но в
 содержании отразить необходимо.
 \appendix
 \section{Приложение}
 \label{appendix}
 \end{document}

Пример рубрикации

Пример рубрикации и оглавления.

Результат компиляции кода представлен на иллюстрации. Кроме самих заголовков разделов, созданных с помощью команд секционирования, в начале документа создаётся оглавление. За это отвечает команда \tableofcontents. При каждой компиляции информация о разделах собирается в файле с тем же именем, что и у tex-файла, но с расширением toc. При следующей компиляции обновлённая информация о разделах используется для создания оглавления.

Уровень, до которого информация отображается в оглавлении, можно поменять, изменив значение переменной tocdepth, например, так:

\setcounter{tocdepth}{2}

В этом случае будет показана информация о разделах вплоть до второго уровня. Раздел типа \section соответствует первому уровню секционирования, \subsection – второму, и так далее.

Кроме оглавления, можно вывести список иллюстраций \listoffigures и таблиц \listoftables. Информация об иллюстрациях и таблицах автоматически собирается в файлах с расширениями .lof и .lot.

Для добавления какой-то информации в оглавление в обход команд секционирования можно воспользоваться командой

\addcontentsline{toc}{«уровень раздела»}{«строка в оглавлении»}

У этой команды три аргумента. Первый аргумент соответствует расширению файла (.toc, .lof или .lot), в который добавляется «строка в оглавлении». Уровень раздела определяется именами команд секционирования, то есть section, subsection и так далее. Команды LaTeX при передаче в файлы списков следует защищать командой \protect, дабы избежать проблемы с «хрупкими» инструкциями.

Команда \appendix отделяет приложение от основного текста. После её вызова правила нумерация разделов изменяется. \appendix тоже является командой секционирования.

Ссылки и примечания

Иногда не хочется разбивать канву повествования, и в то же время необходимо как-то вставить пояснение. Это можно сделать, просто сославшись на какой-то другой фрагмент текста с помощью ссылки или вставив пояснение на этой же странице с помощью подстрочного примечания.

Механизм ссылок

В примере, демонстрирующем работу команд секционирования, вслед за каждой такой командой ставилась метка с помощью инструкции \label. Метка представляет собой последовательность ASCII-символов. Префикс sec: автоматически добавляется AUCTeX во время вставки метки при редактировании tex-файла в Emacs. Этот префикс существует исключительно для удобства автора, так что можно обойтись без него. При компиляции документа информация о имеющихся метках добавляется в файл с расширением .aux. Для того, чтобы извлечь эту информацию, то есть номер раздела (команда \ref) или номер страницы (\pageref), необходимо пропустить текст через LaTeX ещё раз.

Для того, чтобы можно было сослаться на внешний документ, следует воспользоваться пакетом xr. В этом случае в преамбуле необходимо добавить примерно такие инструкции:

 \usepackage{xr}
 \externaldocument[EXT-]{externaldoc}

Это позволяет получить доступ к меткам файла externaldoc.tex. Обращение к меткам, как и обычно, осуществляется помощью команд \ref/\pageref, только перед именем метки добавляется префикс EXT-. Можно обойтись и без префикса, так как этот параметр является опциональным, но в этом случае повышается вероятность конфликта из-за существования одинаковых меток.

Ссылаться можно не только на разделы. Метки внутри нумерованных окружений, типа equation (выключенные математические формулы1) или theorem (теоремы), принимают их номер. Это так же касается рисунков (окружение figure) и таблиц (окружение tabular). В этом случае \label должна следовать сразу за командой \caption, формирующей подпись к плавающему объекту.

Общего рецепта создания ссылок на электронные ресурсы нет. Проще всего использовать команду \url из одноимённого пакета:

LXF92_latex02.png

В адресной строке должны отсутствовать символы %, #, ^, и она не должна заканчиваться символом \. Если есть желание уйти и от этих ограничений, то аналогично команде \verb инструкцию можно использовать и так: \url!http://www.адрес.ru!.

В плане создания и управления гиперссылками также интересен пакет hyperref, который предоставляет схожую функциональность и позволяет создавать гиперссылки в pdf-документах, но это уже совсем другая история:

 %загрузка пакет hyperref
 \usepackage[unicode=true]{hyperref}

Подстрочные примечания

Подстрочное примечание формируется с помощью команды \footnote. Правила оформления примечаний прописываются в определении класса, и без особых на то причин менять их не стоит. Примечание, если позволяет место, печатается на той же странице, где помещена ссылка, и отделяется от текста разделительной линией.

LXF92_latex03.png

Примечание можно добавлять и внутри окружения minipage, но тогда оно печатается внутри окружения:

LXF92_latex04.png

Необязательный параметр \footnote позволяет присвоить примеча нию значение по выбору пользователя.

Для того чтобы можно было сделать сноску внутри заголовка раз дела, необходимо защитить инструкцию \footnote командой \protect команда создания подстрочного примечания является «хрупкой»:

\section{Заголовок\protect\footnote{Подстрочное примечание.}}

Иногда, в сложных ситуациях, например, когда требуется сделать подстрочное примечание внутри бокса, для формирования сноски требуется прибегнуть к независимым командам создания ссылки и создания примечания:

\footnotemark[num]
\footnotetext[num]{«сноска»}

Необязательный параметр num, как и в случае \footnote, позволяет формировать свою нумерацию. Для хранения текущего номера ссылки используется счётчик footnote.

Колонтитулы

Правила формирования колонтитулов целиком зависит от выбранного класса документа. Если же хочется изменить значения по умолчанию то проще всего выбрать стиль страницы myheadings и сформировать колонтитулы:

\pagestyle{myheadings}
\markboth{«левый колонтитул»}{«правый колонтитул»}

Если печать односторонняя, то достаточно воспользоваться коман дой \markright, которая имеет только один аргумент.

Для полного управления содержимым колонтитулов лучше всего подходит пакет fancyhdr. Подробно об этом пакеты было рассказано ранее в статье «Вёрстка», раздел «Стили страницы» (LXF89).

Библиография

Книги создаются не в безвоздушном или бескнижном пространстве.

А.Э. Мильчин. «Культура издания»

Хорошая книга представляет из себя ценность, но даже самая лучшая книга не в состоянии охватить абсолютно все аспекты рассматриваемой в ней темы. Книги существуют в книжном пространстве. Всегда можно найти что-то, на чём книга основывалась; что-то, что развивает основную идею; и что-то, что позволяет взглянуть на главную тему с другой стороны. Список литературы только украшает книгу.

Для ссылок на литературу используется команда

\cite[«комментарий»]{«список меток»}

Метки либо формируются автором самостоятельно внутри окружения thebibliography:

 Полезно почитать книгу \cite[Роженко]{rozenko-2005}.
 \begin{thebibliography}{9}
 \bibitem{rozenko-2005}Роженко А.И. Искусство вёрстки в
 \LaTeX’е. \newblock --- Новосибирск: Изд. ИВМиМГ СО~РАН,
 2005. 398~с.
 \end{thebibliography}

либо используется механизм BibTeX. Команда \newblock позволяет логически разделить разные по смыслу элементы. В качестве обязательного аргумента окружения thebibliography требуется передать текст, соответствующий самой широкой метке, для выравнивания. То есть, если список литературы содержит меньше 10 записей, то достаточно передать однобуквенную фразу, например, «9», а в случае двузначного числа книг в списке уже потребуется «99», и так далее.

LXF92_latex05.png

Пример библиографической ссылки.

Как и в случае с перекрёстными ссылками, информация о списке литературы заносится в файл с расширением aux, то есть для правильного его отображения необходимо два прохода LaTeX.

Для того чтобы можно было использовать кириллицу в метках для цитирования литературы, то есть иметь возможность написать что-то вроде:

 \cite{Котельников-2004}\bibitem{Котельников-2004}

Следует воспользоваться пакетом citehack:

\usepackage{citehack}

Из названия пакета очевидно, что это «хак» со всеми вытекающими последствиями и что им не следует злоупотреблять.

BibTeX

Конвейер LaTeX+BibTeX

Конвейер LaTeX+BibTeX. tex – LaTeX-исходник, bib – библиографическая база, bst – стилевой файл для библиографии, blg – log-файл BibTeX, bbl – отсортированный список литературы, aux – информация о ссылках.

Список литературы можно оформлять вручную. Есть какой-никакой стандарт, например, тот же ГОСТ 7.80-00 или ГОСТ 7.1-84 (ГОСТ на оформление библиографического указателя, принятый в 2000 году. Правила оформления могут нравиться или не нравиться, но это всё-таки хоть какой-то стандарт). Его можно просто взять и следовать подробной инструкции. Но далеко не все издательства подчиняются этому стандарту, в котором, например, нет информации о том, как нужно оформлять www-ссылки. Да и вообще, список сопутствующей литературы – это нечто большее, чем просто довесок к статье или книге: это вполне самостоятельный фрагмент информации, который очень полезно уметь представлять по-разному.

Для решения этой проблемы Орен Поташник разработал программу BibTeX, которая сама формирует окружение thebibliography, получая информацию из текстовой библиографической базы. Структура библиографической базы BibTeX является довольно распространённым форматом, который использует в том числе и Google Scholar (http://scholar.google.com/), не говоря уж о том, что основной архив электронных препринтов http://xxx.lanl.gov предоставляет библиографическую информацию исключительно в виде записей BibTeX.

Из программного обеспечения, позволяющего работать с BibTeX, следует упомянуть встроенный в Emacs пакет RefTeX и JabRef http://jabref.sourceforge.net/. Тот, кто не освоил Emacs, и кому не нравится Java, может поискать программные пакеты gBib и KBib для Gnome и KDE соответственно. Простой конвертер BibTeX2html позволяет получить список литературы в html-виде. Естественно, и простое редактирование текстового файла вручную также никто не отменял.

Как правило, библиографическая база в формате BibTeX хранится в файле с расширением .bib. Перед тем, как с помощью команды \bibliography подключить базу к LaTeX-исходнику, нужно выбрать стиль сортировки библиографии:

 \bibliographystyle{«стиль»}
 \bibliography{«имя bib-файла»}

В LaTeX есть четыре стандартных стиля для формирования списка литературы:

  • plain – открытый стиль. Библиографические записи помечаются

порядковыми номерами и сортируются в алфавитном порядке. Чтобы правильно отсортировать библиографию на русском языке, необходимо вместо BibTeX воспользоваться командой BibTeX8, указав с помощью ключа --csfile соответствующее правило сортировки (В стандартной поставке LaTeX есть правило для сортировки для кодовой страницы cp866 cp866rus.csf. На основе этого файла можно создать правило для другой кодовой страницы.)

  • unsrt – несортирующий стиль. В отличии от plain, порядок представления списка литературы определяется порядком цитирования библиографии в тексте.
  • alpha – алфавитный стиль. Вместо нумерации библиографии используются имена меток. Литература сортируется по меткам.
  • abbrv – аббревиатурный стиль. Вместо полных имён авторов, названий месяцев и журналов печатаются сокращения. Сортировка и нумерация соответствует стилю plain.

Максим Поляков разработал стили для BibTeX, соответствующие ГОСТ 7.80-00 и GOST 7.1-84: gost780s/gost71s, аналогичные plain и gost780u/gost71u, аналогичные unsrt. Описание этих стилей представлено в стандартной документации в виде файлов gost780.pdf и gost71.pdf. Многие журналы, принимающие публикации в LaTeX, имеют свои собственные BibTeX-стили. В стандартной поставке TeXLive 2007 идёт более 200 различных библиографических стилей – есть из чего выбирать.

LXF92_latex07.png

Список литературы, оформленный с помощью BibTeX. Стиль gost780u.

В дополнение к команде цитирования \cite в случае подключения библиографической базы можно использовать инструкцию \nocite. Команда \nocite не создаёт никакой ссылки в тексте, но упомянутая запись отображается в списке литературы.

Сама по себе база состоит из записей вида:

 @book{Gussens-1999,
 author = {М. Гуссенс and Ф. Миттельбах and А. Самарин},
 title = {Путеводитель по пакету \LaTeX{} и его
          расширению \LaTeXe: Пер. с англ.},
  year = {1999},
  isbn = {5-03-003325-4},
  publisher = {Мир},
  address = {М.},
  numpages = {606},
  language = {russian},
  OPTnote = {}
 }

После знака «коммерческое at» @ идёт тип записи. В фигурных скобках вслед за меткой через запятую перечисляются пары ключ-значение. BibTeX поддерживает определённый набор типов записей, каждому из которых соответствуют свои обязательные и необязательные поля (Если к названию необязательного поля добавить OPT (note->OPTnote), то такие такие поля игнорируются, даже если присутствуют в записи). Если не заполнено обязательное поле, то при компиляции BibTeX генерирует ошибку. Имеются следующие стандартные типы записей (BibTeX не чувствителен к регистру):

  • Аritcle – статья в журнале. Обязательные поля: author, title, journal, year. Необязательные поля: volume, number, pages, month, note, annote.
  • Book' – книга. Обязательные поля: author или editor, title, publisher, year. Необязательные поля: volume, number, series, address, edition, month, note, annote.
  • Booklet – брошюра. Обязательное поле: title. Необязательные поля: author, howpublished, address, month, year, note, annote.
  • Conference или InProceedings – статья, опубликованная в трудах конференции. Обязательные поля: author, title. Необязательные поля: crossref, booktitle, pages, year, editor, volume, number, series, address, month, organisation, publisher, note, annote.
  • Proceedings – труды конференции. Обязательные поля: title, year. Необязательные поля: booktitle, editor, volume, number, series, address, month, organisation, publisher, note, annote.
  • InBook – ссылка на часть книги, то есть на её главу, раздел или просто на определённый набор страниц. Обязательные поля: author или editor, title, chapter, publisher, year. Необязательные поля: volume или number, series, type, address, edition, month, pages, note, annote.
  • InCollection – часть книги со своим заглавием. Обязательные поля: author, title, booktitle. Необязательные поля: crossref, pages, publisher, year, editor, volume или number, series, type, chapter, address, edition, month, note, annote.
  • Manual – техническая документация. Обязательное поле: title. Необязательные поля: author, organisation, address, edition, month, year, note, annote.
  • PhdThesis – диссертация. Обязательные поля: author, title, school, year. Необязательные поля: address, month, note, annote.
  • MastersThesis – дипломная работа. Обязательные и необязательные поля такие же, как у PhdThesis.
  • TechReport – отчёт. Обязательные поля: author, title, institution, year. Необязательные поля: type, numer, address, month, note, annote.
  • Unpublished – неопубликованный авторский текст. Обязательные поля: author, title, note. Необязательные поля: month, year, annote.
  • Misc – то, что не подходит для других типов записей. Обязательные поля отсутствуют. Необязательные поля: author, title, howpublished, month, year, note, annote.

Значение полей в большинстве случаев понятно из их названия. Исключением, пожалуй, является поле crossref, в качестве значения которого можно передать ссылку на другую запись, откуда BibTeX при трансляции возьмёт значения всех недостающих полей записи. Из особенностей следует упомянуть, что авторы в поле author разделяются с помощью союза and.

Кроме перечисленных стандартных полей при использовании библиографических ГОСТ-стилей gost780u/gost71u и gost780s/gost71s можно использовать поля numpages – число страниц и language – влияет на сортировку при выборе стиля типа plain. Допустимые значения для поля language – russian, ukrainian и english по умолчанию.

Алфавитный указатель

Указатель значительно повышает ценность любой книги, если она из тех, что читают не только насквозь, но и выборочно.

А.Э. Мильчин «Культура издания»

LXF92_latex08.png

Конвейер LaTeX+MakeIndex. tex – LaTeX-исходник, idx – не отсортированный индекс (полуфабрикат), ist – стилевой файл для указателя, ilg – log-файл MakeIndex, ind – отсортированный указатель.

Для создания «полуфабриката» алфавитного указателя в преамбуле помещается инструкция

\makeindex

Cлова, которые нужно поместить в указатель, отмечаются с помощью команды \index.

Указатель\index{Предметный указатель} …

Сама по себе команда \index игнорируется, но всё, что в ней отмечается вместе с информацией о положении команды, заносится в файл с расширением .idx. Имя idx-файла по умолчанию соответствует имени основного документа. Полуфабрикатом idx-файл является потому, что записи хранятся в нём в неотсортированном виде. С помощью программы сортировки rumakeindex' получается отформатированный правильным образом указатель в файле с расширением .ind. Этот файл уже можно вставить в документ:

\input{«ind-файл»}

Это же делает и команда \printindex из пакета makeidx. В дополнение к подключению индекса команда \printindex проверяет существование индексного файла и не даёт LaTeX генерировать ошибку в случае его отсутствия. Пакет makeidx содержит ещё несколько полезных команд для создания индекса, поэтому его в любом случае имеет смысл загрузить.

Программа rumakeindex является простейшим скриптом, где с помощью sed кириллические буквы из внутреннего представления LaTeX переводятся в koi8-r и правильным образом сортируются с использованием стандартного механизма makeindex. Если необходимо отсортировать индексный файл для включения в текст, использующий другую кодовую страницу, или вас просто не устраивают правила сортировки, этот скрипт легко переделать.

Оригинальная программа сортировки индекса makeindex (подробная документация представлена в файле makeindex.dvi) была написана довольно давно и, естественно, не учитывала национальных особенностей других языков, кроме английского и немецкого. Впрочем, она оказалась слишком гибка, чтобы полностью отказаться от неё в пользу другого механизма сортировки, уже нормально поддерживающего интернационализацию. Наиболее вероятным претендентом на замену уже долгое время является xindy (http://www.xindy.org/), который «из коробки» поддерживает множество языков вплоть до клингонского, но до сих пор отсутствует в основных LaTeX-дистрибутивах.

Аргумент команды \index может содержать любые символы, кроме !, “, @ и |. Их специальное значение проявляется только внутри команды. Чтобы убрать специальное значение этих символов внутри \index необходимо добавить перед ними символ (двойную кавычку). На рисунке представлен пример простейшего указателя. Ниже будут раскрыты методы его создания.

LXF92_latex09.png

Пример готового алфавитного указателя.

Для формирования многоуровневых иерархических указателей используется разделитель в виде восклицательного знака !:

% на страницах 110 и 111
\index{Указатель!rumakeindex}

Команды \index с одинаковыми аргументами группируются в одну запись с полным списком страниц.

Символ вертикальной черты | используется для отделения видимого аргумента от управляющих знаков. Команда \see (перекрёстная ссылка на другую запись), определённая в пакете makeidx, должна идти в индексе вслед за этим разделителем:

\index{Указатель!makeindex|see{rumakeindex}}

С помощью вертикальной черты можно также сформировать указатель на диапазон страниц:

 % на странице 110
  \index{Указатель|(}
  много текста
 % на странице 111
  \index{Указатель|)}

Иногда номер страницы нужно как-то выделить. Команды выделения текста также должны идти после вертикальной черты:

 % Выделяем страницу 110 жирным шрифтом
  \index{MakeIndex@\textit{MakeIndex}|textbf}

Конструкция «ключ»@«запись» используется для правильной сортировки внутри \index. По «ключу» производится сортировка, а «запись» выводится в предметном указателе.

Заключение

Написать любую книгу безумно тяжело. Сделать её полезной – почти невозможно. Справочно-поисковый аппарат издания – лишь инструмент на этом пути, но инструмент, неоднократно проверенный грамотным человечеством. Можно путь пройти и без него, но с ним будет гораздо интереснее. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика