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


Download 1.51 Mb.
Pdf ko'rish
bet130/143
Sana08.05.2023
Hajmi1.51 Mb.
#1444247
1   ...   126   127   128   129   130   131   132   133   ...   143
Bog'liq
LaTeX-Lvovsky

6. Колонтитулы
Страницу документа, подготовленного с помощью L
A
TEXа, можно рассматривать как состоя
щую из трех частей: тела страницы, верхнего колонтитула и нижнего колонтитула. Мы знаем,
что с помощью команды \pagestyle на оформление колонтитулов можно в какой-то мере
влиять. Возможностей, для этого, однако же, не слишком много. Сейчас мы увидим, каким
образом радикально менять вид колонтитулов.
Первое, что следует уяснить: если в своем стилевом файле Вы изменили оформление ко

лонтитулов, пользуясь изложенными ниже рецептами, а после этого в тексте использовали
команду \pagestyle, то она Ваше оформление отменит и установит вместо него стандарт

ное
2
. Предполагая, что Вы имеете в виду это предупреждение, рассмотрим, как оформлять
колонтитулы самостоятельно.
2
В конце этого раздела рассказано, как можно совместить \pagestyle со своим собственным оформлением
колонтитулов


IX.6. КОЛОНТИТУЛЫ
197
Команды, задающие вид верхних колонтитулов, называются \@oddhead и \@evenhead.
Точнее говоря, если стиль оформления документа
«двусторонний» (то есть либо задана сти
левая опция twoside, либо двустороннее оформление подразумевается в основном стиле

см. таблицу на стр.
98
), то команда \@oddhead задает верхний колонтитул на страницах с
нечетными номерами, а команда \@evenhead
— на страницах с четными номерами. Если же
стиль оформления документа
«односторонний», то \@oddhead задает все верхние колонтиту
лы, а команда \@evenhead на оформление документа вообще не влияет. Аналогично обстоит
дело для \@oddfoot и \@evenfoot, отвечающих за нижние колонтитулы. Все четыре назван

ные команды получают некоторое определение в стандартных L
A
TEXовских стилях, так что в
Вашем стилевом файле переопределять их надо с помощью \renewcommand.
Теперь рассмотрим конкретно, как именно надо переопределять вышеназванные коман

ды, чтобы добиться желаемого оформления колонтитулов. Основной принцип таков. При
оформлении страницы верхний колонтитул получается в результате исполнения команды
\hbox to\textwidth{\@evenhead}
(мы предположили, что стиль двусторонний и что страница четная; в остальных случаях

с очевидными изменениями). Можно сказать, что в каждой из этих команд записан текст и
TEXовские команды, которые при верстке страницы будут подставлены в \hbox to\textwidth.
Разберем конкретный пример. Предположим, что мы верстаем роман Л. Н. Толстого
«Война и мир»; стиль документа мы выберем двусторонний (допустим, основной стиль у
нас book). Пусть мы хотим, чтобы разворот книги выглядел так:
• На левой странице разворота в верхнем колонтитуле написано имя автора (прижатое
вправо).
• На правой странице разворота в верхнем колонтитуле написано название романа (при
жатое влево)
• В нижних колонтитулах по центру расположен номер страницы, окруженный тире.
Тогда надо переопределить команды для колонтитулов так:
\renewcommand{\@evenhead}{\hfil l.~n.~tolstoj}
\renewcommand{\@oddhead}{wojna i mir\hfil}
\renewcommand{\@evenfoot}{\hfil --- \thepage ---\hfil}
\renewcommand{\@oddfoot}{\hfil --- \thepage ---\hfil}
Мы здесь предполагали, что страницы с четными номерами будут на левой стороне разво

рота, а страницы с нечетными номерами
— на правой. Так оно и будет, если у документа
имеется титульный лист.
Если мы хотим, чтобы каких-то колонтитулов вообще не было, то надо переопределить
соответствующую команду на
«ничего не делать», например, так:
\renewcommand{\@oddfoot}{}
Прежде, чем перейти к более сложным вещам, связанным с колонтитулами, скажем еще
о трех стилевых параметрах. Во-первых, интервалы между колонтитулами и текстом регу

лируются параметрами со значением длины \headsep, задающим интервал между верхним
колонтитулом и текстом, и \footskip, задающим расстояние между базисной линией послед

ней строки в теле страницы и базисной линией нижнего колонтитула. Во-вторых, существует


IX.6. КОЛОНТИТУЛЫ
198
параметр \headheight, задающий высоту верхних колонтитулов. Если сумма высоты и глу

бины заданного Вами колонтитула будет превышать \headheight, то при трансляции Вы
получите сообщение
Overfull \vbox occurred while \output was active.
Приведем пример, когда надо учитывать \headheight. Пусть мы хотим внести дополнитель

ный элемент в оформление
«Войны и мира»: отделять верхние колонтитулы от текста линей
ками. Как это можно было бы сделать? Разумный выход
— передать в \hbox to\textwidth
уже готовый блок шириной \textwidth, содержащий как текст колонтитула, так и линейку.
Так как линейку под текстом удобно проводить в вертикальном режиме с помощью коман

ды \hrule, то в голову приходит вот что:
\renewcommand{\@evenhead}%
{\vbox{\hbox to\textwidth{\hfil l.~n.~tolstoj}\hrule}}
У такого определения есть, однако, два недостатка. Во-первых, так как линейки в верти

кальном режиме добавляются
«впритык» к предшествующему блоку, у нас нет гарантии, что
линейка не подойдет к тексту слишком близко; если бы к тому же текст в колонтитулах на
разных страницах варьировался, как в дальнейших примерах, то могло бы случиться и так,
что две соседние линейки на развороте находятся на разной высоте (из-за того, что в ко

лонтитуле на одной странице есть буквы вроде у, опускающиеся ниже базисной линии, а на
другой
— нет). Средство от этого недостатка — добавить \strut в наш блок:
\renewcommand{\@oddhead}%
{\vbox{\hbox to\textwidth{\hfil \strut
l.~n.~tolstoj}\hrule}}
Второй недостаток
— это то, что к размеру блока с текстом добавится ширина линейки, в
результате чего этот размер превысит \headheight и мы будем получать уйму сообщений об
Overfull’е. Чтобы уйти от этого, надо еще чуть-чуть схитрить:
\renewcommand{\@oddhead}%
{\raisebox{0pt}[\headheight][0pt]{% NAˆALO BLOKA
\vbox{\hbox to\textwidth{\hfil \strut
l.~n.~tolstoj}\hrule}%
}% KONEC BLOKA
}% KONEC MAKROOPREDELENIQ
Понятно ли, что происходит? С помощью \raisebox мы заставляем TEX считать, что блок
имеет высоту \headheight (нам даже незачем вникать, чему она фактически равна) и нуле

вую глубину (чтобы в сумме получилось то, что надо). Теперь ни о каких Overfull’ах речи не
будет; пробел между колонтитулом и текстом можно при желании изменить, изменив значе

ние \headsep.
Для нижних колонтитулов параметра, аналогичного \headheight, нет, так что смело де

лайте их любой высоты.
Кстати говоря, команду \@evenhead в этом примере можно было бы переопределить бо

лее простым образом, без \vbox’а, с использованием команды \underline. Наш способ, од

нако, более гибок: например, мы можем регулировать толщину линейки, чего с \underline
не добьешься.


IX.6. КОЛОНТИТУЛЫ
199
Итак, мы научились создавать собственные колонтитулы. Однако в стандартных L
A
TEXовских
стилях в колонтитулы обычно помещается не только номер страницы, но и информация о
том, в каком месте документа мы находимся (например, номер и заглавие текущего раздела).
Давайте научимся делать и это.
Чтобы передать в колонтитул какую-то информацию из текста, в L
A
TEXе используются
команды \markboth и \markright. Разберем, как они работают. Команда \markboth, тре

бующая двух обязательных аргументов, заносит в текст пару
«пометок» — два фрагмента
текста (возможно, с TEXовскими командами). Например, если мы скажем (где-нибудь меж
ду абзацами)
\markboth{kOT}{pES}
то поместим между этими абзацами пару пометок:
«левую пометку» kOT и «правую помет
ку
» pES. Сами по себе эти пометки никак не отражаются на печати. Однако же в определе
ниях команд \@oddhead и ей подобных мы можем на эти пометки ссылаться. Именно, в этих
определениях команда \leftmark дает левую пометку, а команда \rightmark
— правую по
метку. Например, если мы переопределим верхние колонтитулы как
\renewcommand{\@evenhead}{\leftmark\hfil}
\renewcommand{\@oddhead}{\hfil\rightmark}
то, начиная с той страницы, на которую попали наши пометки, в левом верхнем колонтитуле
будет стоять прижатое влево слово
«Кот», а в правом — прижатое вправо слово «Пес»
3
.
Кстати, если никаких пометок в тексте нет, то как \leftmark, так и \rightmark дают
«пу
стой
» текст.
До сих пор мы молчаливо предполагали, что на каждой странице присутствует только од

на пара пометок. Что будет, если таких пар пометок попадет на страницу несколько? Ответ:
команда \leftmark в этом случае означает левую пометку из самой верхней пары пометок,
попавших на страницу, а команда \rightmark означает правую пометку из самой нижней
пары пометок, попавших на данную страницу. С другой стороны, если на страницу вообще
ни одна пара пометок не попала, то \leftmark и \rightmark означают соответственно левую
и правую пометки из последней пары пометок, встретившихся до этого.
Поясним сказанное примером. Пусть пометки
\markboth{x}{y}
и
\markboth{z}{t}
попали (в указанном порядке) на страницу 1, на страницу 2 вообще никаких пометок не по

пало, на страницу 3 попали целые три пары пометок:
\markboth{u}{v}
,
\markboth{a}{b}
и
\markboth{m}{n}
а на страницах 4 и дальнейших никаких новых пометок не появлялось. Тогда значения ко

манд \leftmark и \rightmark в процессе обработки этих страниц были таковы:
Страница
\leftmark
\rightmark
1
x
t
2
z
t
3
u
n
4 и далее
m
n
3
Точнее говоря, так будет, если в тексте нет команд типа \section: эти команды, как мы увидим ниже, авто

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


IX.6. КОЛОНТИТУЛЫ
200
Наряду с командой \markboth, которая ставит в тексте новую пару пометок, есть еще и
команда \markright с одним аргументом, которая ставит в тексте пару пометок таким обра

зом: левый элемент в этой паре
— такой же, как был в предыдущей паре пометок, а правый
— тот, что задан в аргументе команды \markright. Например, если сначала идет команда
\markboth{kOT}{pES}
а затем команда
\markright{sOBAKA}
(и в промежутке между этими командами никаких других пометок в текст не вносится), то
это равносильно тому, как если бы вторая из этих команд была
\markboth{kOT}{sOBAKA}
Выше мы уже отмечали, что команды типа \section ставят в тексте пометки автомати

чески. Понять, как это делается и как можно влиять на этот процесс, проще всего на при

мере. Сделаем такие предположения о стиле документа: основной стиль
— article, секции
и подсекции нумеруются (иными словами, значение счетчика secnumdepth больше едини

цы), действует стилевая опция twoside и в преамбуле или стилевом файле была дана коман

да \pagestyle{headings}.
Во-первых, отметим, что в этом случае пометки в текст вставляют только команды \section
и \subsection. Как же именно они это делают? Команда \section ставит пометки, автома

тически выполняя команду \sectionmark, имеющую один обязательный аргумент
— загла
вие раздела (если команда \section была дана без необязательного аргумента) или вариант
заглавия, заданный в необязательном аргументе команды \section (если таковой присут

ствует). Вот как определена \sectionmark (помните, что на место #1 будет подставляться
аргумент, т. е. вариант заглавия, идущий в колонтитулы):
\newcommand{\sectionmark}[1]{\markboth{%
\uppercase{\thesection\hspace{1em}#1}}% LEWAQ POMETKA
{}% PRAWAQ POMETKA (ONA PUSTA)
}% KONEC MAKROOPREDELENIQ
Здесь используется TEXовская команда \uppercase, которую мы ранее не рассматривали.
Не вдаваясь в (довольно хитрые) подробности, скажем, что эта команда переводит все бук

вы в тексте, попавшем в ее аргумент, из строчных в прописные. Коль о том зашла речь, от

метим, что есть еще и команда \lowercase, которая наоборот переводит все буквы в тексте,
попавшем в ее аргумент, из прописных в строчные. Не пытайтесь, пожалуйста, использо

вать \uppercase и \lowercase вне аргументов \markboth или \markright, иначе Вас под

стерегают неприятные сюрпризы.
Команда \subsectionmark, определяющая вид пометок, автоматически вставляемых в
текст командой \subsection, определена следующим образом:
\newcommand{\subsectionmark}[1]{\markright
{\thesubsection\hspace{1em}#1}%
}% KONEC MAKROOPREDELENIQ
Здесь также аргумент #1
— это заглавие подраздела (точнее, его вариант для колонтитулов).


IX.6. КОЛОНТИТУЛЫ
201
Итак, в рассматриваемом нами случае команда \section вносит в текст следующую па

ру пометок: заглавие секции, в котором все буквы заменены на прописные, в качестве ле

вой пометки, и пустой текст в качестве правой пометки. Команда же \subsection вносит
в текст пару пометок, в которой левая пометка такая же, как в предыдущей паре, а правая
— заглавие подсекции (точнее, его вариант для колонтитулов), причем на сей раз «в нату
ральном виде
», без замены строчных букв на прописные. Как уже отмечалось выше, коман
ды \subsubsection и более мелкие никаких пометок в текст не вносят.
Посмотрим, как в этом стиле используются пометки. Команда \@evenhead в этом случае
определена так:
\newcommand{\@evenhead}{\rm\thepage\hfil\sl\leftmark}
Тем самым на страницах с четными номерами (они в данном случае будут левыми на раз

вороте) колонтитул будет выглядеть следующим образом: прижатый влево номер страницы
(прямым шрифтом), и заглавие текущей секции (наклонным шрифтом, прописными буквами)
— прижатое вправо:
4
ведь никаких других левых пометок в тексте нет!
Команда \@oddhead, отвечающая за верхние колонтитулы на страницах с нечетными но

мерами, определена в этом стиле так:
\newcommand{\@oddhead}{{\sl \rightmark}\hfil \rm\thepage}
Стало быть, верхние колонтитулы к нечетным страницам выглядят так: название текущей
подсекции наклонным шрифтом
— прижатое влево, номер страницы прямым шрифтом —
прижатый вправо. Впрочем, если в текущей секции команд \subsection еще не было, то вме

сто этого заглавия будет пустое место, так как \rightmark будет пуста (определение коман

ды \sectionmark, данное выше, показывает, что при исполнении команды \section в текст
вносится пустая правая пометка, и пустой она остается до первой команды \subsection).
Приведем пример, как и зачем можно переопределять команды наподобие \sectionmark.
Предположим, нам не нравится, что в правом колонтитуле иногда бывает пустое место. Что

бы с этим побороться, можно попросить команду \section вносить в текст непустую правую
пометку
— то же заглавие секции. Для этого напишем в своем стилевом файле так:
\newcommand{\sectionmark}[1]{\markboth
{\uppercase{\thesection\hspace{1em}#1}}% LEWAQ POMETKA
{\uppercase{\thesection\hspace{1em}#1}}% PRAWAQ POMETKA
}% KONEC MAKROOPREDELENIQ
Теперь, если в разделе нет подразделов, то на страницах с нечетными номерами слева в верх

нем колонтитуле будет также печататься заглавие текущей секции. Оформление колонтиту

лов при этом будет стандартным. Если Вы хотите еще и отойти от этого стандарта, то надо
будет, вместо использования команды \pagestyle, напрямую переопределить команды ти

па \@oddhead и \@evenhead; надо думать, теперь Вы найдете, как можно распорядиться в
этих определениях \leftmark’ом и \rightmark’ом.
Еще пример. Предположим, Вы вообще не хотите, чтобы при исполнении команды \subsection
в текст вносились какие-либо пометки. В таком случае можно
«отключить» команду \subsectionmark,
переопределив ее на
«ничего не делать»:
\renewcommand{\subsectionmark}[1]{}
4
Точнее говоря, это будет заглавие либо текущей секции, либо первой из секций, начинающихся на этой
странице
— см. выше обсуждение \leftmark и \rightmark.


IX.6. КОЛОНТИТУЛЫ
202
Не всегда хочется заниматься столь серьезным делом, как переопределять команды
для автоматической расстановки пометок. Бывает, что Вас устраивает стандартный стиль
оформления колонтитулов, но при этом не устраивает, чт ´о именно в эти колонтитулы авто

матически записывается. Например, у Ваших разделов длинные заглавия, и Вы при этом
хотите, чтобы они в несокращенном виде попали в оглавление, а сокращенные варианты за

главий пошли только в колонтитулы. Команда \section с необязательным аргументом тут
не спасет, так как этот необязательный аргумент запишется и в оглавление тоже. Вот бы
задать информацию для колонтитулов вручную, без того, чтобы это автоматически делали
команды типа \section! Можно, конечно, переопределить на
«ничего не делать» все коман
ды типа \sectionmark, как в вышеприведенном примере, но L
A
TEX предоставляет Вам более
простой способ. Если написать в преамбуле
\pagestyle{myheadings}
то все L
A
TEXовские команды для создания разделов не будут вносить пометок в текст, а
оформление колонтитулов будет стандартным. Тогда Вы сможете, например, написать
\section{o NEKOTORYH SPECIALXNYH SWOJSTWAH
PODMNOVESTW PUSTYH MNOVESTW, NE RASSMATRIWAW[IHSQ
W PREDYDU]IH RAZDELAH STATXI}%
\markboth{\thesection\hspace{1em}%
pODMNOVESTWA}{}
и в оглавлении будет заголовок целиком, а в колонтитуле
— всего лишь слово «Подмно
жества
» (мы подразумеваем, что стиль все тот же, только аргументом команды \pagestyle
был myheadings вместо headings). Обратите внимание на две тонкости. Во-первых, мы по

местили команду, вносящую в текст пометки, после команды \section, чтобы номер секции,
генерируемый командой \thesection, был правильным. Во-вторых, мы убрали с помощью
знака процента пробел (конец строки) между командами \section и \markboth, чтобы по

метки с гарантией попали на ту же страницу, что и заголовок секции.
Другие команды, отвечающие за автоматическую расстановку пометок в тексте, устроены
аналогичным образом: команда \chapter ставит пометки с помощью команды \chaptermark,
команда \section
— с помощью команды \sectionmark, и т. д. — вообще, если команда,
генерирующая раздел документа, определена с помощью \@startsection с первым аргумен

том abcd, то она будет ставить пометки с помощью команды \abcdmark. Все эти команды
автоматически выполняются в процессе выполнения соответствующей команды, генерирую

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

ется заглавие раздела (точнее, вариант этого заглавия, предназначенный для колонтитулов
и оглавления). Мы подробно разобрали, как определены эти команды в одном из вариантов
стиля article; Вы найдете полный список их определений в приложении
Г
. Варианты
«со
звездочкой
» команд, генерирующих разделы документа, никаких пометок в текст не вносят
(как и следовало ожидать).
Если в аргументе команды \markboth или \markright присутствует не только текст, но и каки

е-то команды, то в пометки будут записаны не буквально эти команды, но их значение на тот мо

мент, когда пометки вносятся в текст. Например, если в аргументе \markboth присутствует коман

да \thesection, то в пометку реально запишется (и, соответственно, из \leftmark или \rightmark
прочтется) номер секции. Если же необходимо, чтобы какая-то команда записалась в пометку в том
же виде, в каком она была задана в аргументе \markboth или \markright, то надо
«защитить» ее,
поставив перед ней \protect.


IX.6. КОЛОНТИТУЛЫ
203
Еще один случай, когда пометки в текст вносятся L
A
TEXом автоматически, возникает при
оформлении таких фрагментов документа, как оглавление, список иллюстраций или таблиц,
список литературы и предметный указатель. Как именно они вносятся, зависит от основного
стиля и от того, пользовались ли мы (и как пользовались) командой \pagestyle. Именно,
если основной стиль
— article, то никаких пометок при оформлении оглавления и т. п.
в текст автоматически вноситься не будет; точно так же не будет этих пометок при любом
основном стиле после того, как выполнится команда \pagestyle с аргументом empty, plain
или myheadings. С другой стороны, если основной стиль
— report или book, то, например,
при исполнении команды \tableofcontents автоматически выполняется и команда
\markboth{\contentsname}
(с очевидными изменениями для списка иллюстраций и т. п.). Та же ситуация возникнет и
после исполнения команды \pagestyle с аргументом headings (даже тогда, когда основной
стиль
— article).
Еще одна проблема, которая может возникнуть: как сделать, чтобы в разных частях до

кумента стиль оформления страниц был разным? Типичный случай, когда возникает такая
необходимость, таков: хочется, чтобы несколько первых страниц документа (оглавление,
предисловие и т. п.) были оформлены стилем plain или empty. Если написать в начале доку

мента что-нибудь вроде
\pagestyle{plain}
то, как отмечалось в начале этого раздела, переопределения команд типа \@oddhead, сде

ланные Вами в стилевом файле, пропадут. С другой стороны, в основном тексте документа
переопределить эти команды
«обратно» будет нельзя, поскольку в их имена входит символ @.
Выход в том, чтобы дать команду \pagestyle внутри группы! Когда группа закончится, пе

реопределения, сделанные командой \pagestyle, забудутся, и в оставшейся части докумен

та Вы сможете наслаждаться теми колонтитулами, которые сами разработали. Учтите толь

ко, что эта группа должна заканчиваться командой вроде \newpage или \clearpage, иначе
может случиться, что стилем, заданным командой \pagestyle, оформлено на одну страницу
больше, чем нужно.
Итак, Вы теперь имеете широкие возможности для создания собственного оформления
колонтитулов. Подведем некоторые итоги. Во-первых, можно написать
\pagestyle{myheadings}
При этом внешний вид колонтитулов будет стандартный, но материал для колонтитулов Вы
будете поставлять вручную, с помощью \markboth и/или \markright. Во-вторых, можно
переопределять команды типа \sectionmark: при этом внешний вид колонтитулов будет по

прежнему стандартный, но материал для помещения в колонтитул будет отбираться авто

матически по схеме, отличной от стандартной. В-третьих, можно переопределять команды
типа \@oddhead: при этом Вы меняете как стиль оформления колонтитулов, так и способ
обращения с пометками, вносимыми в текст (в частности, если в Ваших определениях ко

манда типа \@oddhead не участвуют \leftmark и \rightmark, то эти пометки будут вообще
проигнорированы). Наконец, можно объединить второй и третий подходы. При этом Вы са

мостоятельно разрабатываете как внешний вид колонтитулов, так и то, какая информация из
текста и как будет в них отражена.


IX.7. РАЗНОЕ
204

Download 1.51 Mb.

Do'stlaringiz bilan baham:
1   ...   126   127   128   129   130   131   132   133   ...   143




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