Tex: подробное описание С. М. Львовский


 Оглавление, список иллюстраций и прочее


Download 1.51 Mb.
Pdf ko'rish
bet125/143
Sana08.05.2023
Hajmi1.51 Mb.
#1444247
1   ...   121   122   123   124   125   126   127   128   ...   143
Bog'liq
LaTeX-Lvovsky

4. Оглавление, список иллюстраций и прочее
Автоматическая сборка оглавления
— многоэтапный процесс. Сначала материал для оглав
ления (заглавия разделов и номера соответствующих страниц) записывается в специальный


IX.4. ОГЛАВЛЕНИЕ, СПИСОК ИЛЛЮСТРАЦИЙ И ПРОЧЕЕ
187
файл с тем же именем, что и у основного файла, и расширением .toc (в нормальных условиях
эта запись обеспечивается командами \chapter, \section и т. д.); при следующем запуске
L
A
TEXа этот toc-файл считывается (с помощью команды \input), команды, записанные в
него, исполняются, и в результате происходит фактическая верстка оглавления. Аналогич

ным образом составляется список иллюстраций и список таблиц (при этом информация за

писывается в файлы с расширениями .lof или .lot соответственно). Давайте научимся вли

ять на этот процесс.
Сначала расскажем, как составлять оглавление полностью вручную, игнорируя его ав

томатическую сборку, обеспечиваемую командами типа \section. Итак, предположим, что
все команды \section, \chapter и тому подобные даны в исходном тексте в варианте со
звездочкой, и посмотрим, как можно самому создать оглавление.
Для того, чтобы записать в toc- (соответственно, lof- или lot) файл любой текст и лю

бые TEXовские команды, служит команда \addtocontents. У этой команды два обязатель
ных аргумента. Первый из них должен быть toc, lof или lot, в соответствии с тем, в какой из
файлов с оглавлениями Вы пишете свой текст. Второй аргумент
— текст и команды, которые
Вы хотите записать в файл. Если, например, Вам взбрело в голову сделать так, чтобы в ав

томатически сгенерированное оглавление к Вашей книге попал текст
«У попа была собака»
(не будем выяснять, зачем), то Вы можете написать:
\addtocontents{toc}{u POPA BYLA SOBAKA.}
Если после этого Вы запустите L
A
TEX два раза, то увидите в оглавлении свой текст (после
первого раза он только попадет в toc-файл, а при втором запуске toc-файл с этим текстом
будет обработан).
С помощью команды \addtocontents можно не только записывать в оглавление глупо

сти. Если, например, Вы хотите в каком-то месте оглавления провести горизонтальную ли

нейку шириной во всю страницу, то можно написать
\addtocontents{toc}{\hrule}
и в оглавлении появится линейка. Подобным образом можно записать в toc-файл любую
последовательность TEXовских команд, но при этом необходимо защищать хрупкие коман
ды с помощью команды \protect (см. стр.
111
по поводу этой команды и понятия
«хруп
кая команда
»). В случае с \hrule мы обошлись без \protect, так как эта команда не хруп
ка, но вообще, если есть сомнения, то лучше команду защитить. Напомним, что \protect
действует только на непосредственно следующую команду и что команды смены шрифта
в защите с помощью \protect не нуждаются. Приведем пример более разумного приме

нения \addtocontents, в котором заодно приходится пользоваться и \protect. Пусть Вы
не хотите, чтобы какая-то из строк в оглавлении начинала новую страницу. Тогда надо пе

ред командой, порождающей эту строку оглавления (обычно таковой будет команда наподо

бие \section) написать в своем файле вот что:
\addtocontents{toc}{\protect\nopagebreak}
В результате в toc-файл запишется команда \nopagebreak, и нежелательный разрыв стра

ницы в оглавлении будет предотвращен. Если бы мы, однако, забыли про \protect, то полу

чили бы весьма непонятное сообщение об ошибке.
Для того, чтобы составить полноценное оглавление, надо иметь возможность записать
в toc- (соответственно, lof- или lot-) файлы не только текст, но и номер той страницы, к
которой этот текст относится. Это делается с помощью команды \addcontentsline, имею

щей такой синтаксис:


IX.4. ОГЛАВЛЕНИЕ, СПИСОК ИЛЛЮСТРАЦИЙ И ПРОЧЕЕ
188
\addcontentsline{тип_файла}{тип_записи}{текст}
Здесь тип_файла
— это toc, lof или lot, текст — тот текст, который будет записан в
оглавление (например, команда \section в стандартном стиле article в качестве этого тек

ста передает название раздела и его номер; подробности см. ниже). Наконец, тип_записи
определяет, каким образом будет обрабатываться этот текст при чтении файла с оглавлени

ем. Именно, если первый аргумент в команде \addcontentsline был abcd , то, когда при
следующем запуске L
A
TEXа будет читаться toc- (соответственно, lof- или lot-) файл, будет
исполнена команда \l@abcd с двумя аргументами, первый из которых
— текст, записанный
нами в третьем аргументе команды \addcontentsline, а второй
— номер страницы, на кото
рую попала Ваша команда \addcontentsline. Например, если в Вашем файле было напи

сано
\addcontentsline{toc}{abcd}{o SLONAH}
(
∗)
и если эта команда попала на страницу 95, то при следующем запуске L
A
TEXа в процессе
чтения toc-файла будет исполняться команда
\l@abcd{o SLONAH}{95}
Разумеется, чтобы при этом не получилось сообщения об ошибке, надо, чтобы команда \l@abcd
была определена. Стало быть, в стилевом файле должно присутствовать ее определение. Ес

ли мы хотим, чтобы запись (
∗) в исходном файле порождала в оглавлении запись вида
О слонах. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
то в своем стилевом файле нам надо написать вот что:
\newcommand{\l@abcd}[2]{\hbox to\textwidth{#1\dotfill #2}}
Чтобы при этом страница в оглавлении была указана верно, необходимо команду \addcontentsline
разместить непосредственно после команды \section* (иначе есть опасность, что они попа

дут на разные страницы).
Если в третьем аргументе команды \addcontentsline стоят
«хрупкие» команды, то их
следует, как водится, защитить командой \protect; если, с другой стороны, в нем записа

на \the-команда, соответствующая какому-то счетчику, то в toc-файл будет записано пе

чатное представление значения этого счетчика по состоянию на тот момент, когда выпол

нялась \addcontentsline. Таким способом можно, например, записать в оглавление номер
текущего раздела документа: достаточно сказать
\addcontentsline{toc}{abcd}%
{\thesection. o SLONAH}
Теперь рассмотрим, как именно собирают оглавление стандартные команды наподо

бие \chapter или \section. Делают они это также с помощью \addcontentsline, при этом
ее второй аргумент (
«тип записи») будет section для команды \section, subsection для
команды \subsection, и так далее. Точнее говоря, если команда для создания разделов
документа определена с помощью \@startsection (см. раздел 3), то в качестве второго ар

гумента для \addcontentsline выступает
«внутреннее имя», под которым L
A
TEX знает этот
тип разделов документа (то самое, что передавалось в качестве первого аргумента коман

де \@startsection). Стало быть, для модификации стиля оформления строк оглавления,
соответствующих \section, надо переопределять команду \l@section, для модификации
строк оглавления, соответствующих \subsection, надо переопределять \l@subsection, и


IX.4. ОГЛАВЛЕНИЕ, СПИСОК ИЛЛЮСТРАЦИЙ И ПРОЧЕЕ
189
так далее. Для модификации строк оглавления, соответствующих \chapter или \part, надо
переопределять команды \l@chapter или \l@part соответственно. Чтобы было понятно, как
переопределять эти команды, рассмотрим, как они определены в стандартных стилях.
В стиле book команда \l@section определена так:
\newcommand{\l@section}%
{\@dottedtocline{1}{1.5em}{2.3em}}
Смысл трех аргументов команды \@dottedtocline таков. Первый аргумент
— «уровень вло
женности
» элемента оглавления. Если этот уровень превышает значение счетчика tocdepth,
то команда \@dottedtocline ничего в оглавлении не печатает. Второй аргумент
— отступ
строчки оглавления от левого поля. Третий аргумент, также представляющий собой длину,
определяет, сколько места в строке оглавления TEX отведет на номер раздела. Результат вы
глядит на печати следующим образом. После отступа, указанного во втором аргументе, пе

чатается номер раздела, затем, отступя от начала этого номера столько, сколько сказано во
втором аргументе, печатается заглавие раздела. Это сделано для того, чтобы заглавия всех
Download 1.51 Mb.

Do'stlaringiz bilan baham:
1   ...   121   122   123   124   125   126   127   128   ...   143




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling