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

Модификация стандартных классов

Команда \@oddhead, отвечающая за верхние колонтитулы на страницах с нечетными номерами, определена в стиле article (при условии, что была команда \pagestyle{headings} ) так:

\newcommand{\@oddhead}{{\normalfont\slshape\rightmark}%
              \hfil\thepage}

Стало быть, верхние колонтитулы к нечетным страницам выглядят так: название текущего подраздела наклонным шрифтом — выключенное влево, номер страницы прямым шрифтом — выключенный вправо. Впрочем, если в текущем разделе команд \subsection еще не было, то вместо заглавия будет пустое место, так как \rightmark будет пуста (определение команды \sectionmark, данное выше, показывает, что при исполнении команды \section в текст вносится пустая правая пометка, и пустой она остается до первой команды \subsection ).

Приведем пример переопределения команд наподобие \sectionmark. Если нам не нравится, что в правом колонтитуле иногда бывает пустое место, то можно попросить команду \section вносить в текст непустую правую пометку — то же заглавие раздела. Для этого напишем в преамбуле так:

\newcommand{\sectionmark}[1]{\markboth
{\uppercase{\thesection\hspace{1em}#1}}% левая пометка
{\uppercase{\thesection\hspace{1em}#1}}% правая пометка
}% конец макроопределения

Теперь, если в разделе нет подразделов, то на правых страницах в верхнем колонтитуле будет также печататься заглавие текущего раздела. Оформление колонтитулов при этом будет стандартным. Если вы хотите еще и отойти от этого стандарта, то надо будет, вместо использования команды \pagestyle, напрямую переопределить команды типа \@oddhead и \@evenhead ; надо думать, теперь вы найдете, как применить в этих определениях команды \leftmark и \rightmark.

Если в документе присутствует команда \pagestyle (с каким бы то ни было аргументом), то она отменит ваши переопределения команд типа \sectionmark. Поэтому все команды \pagestyle должны идти до ваших личных переопределений команд типа \@evenhead.

Если вы вообще не хотите, чтобы при исполнении, скажем, команды \subsection в текст вносились какие-либо пометки, то можно "отключить" команду \subsectionmark, переопределив ее на "ничего не делать":

\renewcommand{\subsectionmark}[1]{}

Бывает и так, что вас устраивает стандартный стиль оформления колонтитулов, но при этом не устраивает, что именно в эти колонтитулы автоматически записывается. Например, у ваших разделов длинные заглавия, и вы при этом хотите, чтобы они в несокращенном виде попали в оглавление, а сокращенные варианты заглавий пошли только в колонтитулы. Команда \section с необязательным аргументом тут не спасет, так как этот необязательный аргумент запишется и в оглавление тоже. Вот бы задать информацию для колонтитулов вручную, без того, чтобы это автоматически делали команды типа \section! Можно, конечно, переопределить на "ничего не делать" все команды типа \sectionmark, как в приведенном выше примере, но LaTeX предоставляет вам более простой способ. Если написать в стилевом файле (до того, как вы переопределяете команды наподобие \@oddhead )

\pagestyle{myheadings}

то все LaTeX'овские команды для создания разделов не будут вносить пометок в текст, а оформление колонтитулов будет стандартным. После этого можно самостоятельно переопределить \@oddhead и пр., если вам это нужно: пометки в текст командами рубрикации вноситься все равно не будут.

Теперь вы сможете, например, писать

\section
{О некоторых специальных свойствах
подмножеств пустых множеств, не рассматривавшихся
в предыдущих разделах статьи}%
\markboth{\thesection\hspace{1em}Подмножества}{}

и в оглавлении будет заголовок целиком, а в колонтитуле — лишь слово "Подмножества" (мы подразумеваем, что стиль все тот же, только аргументом команды \pagestyle был myheadings вместо headings). Команда \markboth помещена после команды \section, чтобы номер раздела, генерируемый командой \thesection, был правильным. Кроме того, мы убрали с помощью знака процента пробел (конец строки) между командами \section и \markboth, чтобы пометки с гарантией попали на ту же страницу, что и заголовок раздела.

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

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

Еще один случай, когда пометки в текст вносятся LaTeX'ом автоматически, возникает при оформлении таких фрагментов документа, как оглавление, список иллюстраций или таблиц, список литературы и предметный указатель. Как именно они вносятся, зависит от класса документа и от того, пользовались ли мы (и как пользовались) командой \pagestyle. Именно, если класс — article, то никаких пометок при оформлении оглавления и т.п. в текст автоматически вноситься не будет; точно так же не будет этих пометок в любом классе после того, как выполнится команда \pagestyle с аргументом empty, plain или myheadings. С другой стороны, если класс документа — report или book, то, например, при исполнении команды \tableofcontents автоматически выполняется и команда

\markboth{\contentsname}

(с очевидными изменениями для списка иллюстраций и т.п.). Та же ситуация возникнет и после исполнения команды \pagestyle с аргументом headings (даже тогда, когда класс — article).

Итак, вы теперь имеете широкие возможности для создания собственного оформления колонтитулов. Во-первых, можно написать

\pagestyle{myheadings}

При этом внешний вид колонтитулов будет стандартный, но материал для колонтитулов вы будете поставлять вручную с помощью команд \markboth и/или \markright. Во-вторых, можно переопределять команды типа \sectionmark ): при этом внешний вид колонтитулов будет по-прежнему стандартный, но материал для помещения в колонтитул будет отбираться автоматически по схеме, отличной от стандартной. В-третьих, можно переопределять команды типа \@oddhead: при этом вы меняете как стиль оформления колонтитулов, так и способ обращения с пометками, вносимыми в текст (в частности, если в ваших определениях команд типа \@oddhead не участвуют \leftmark и \rightmark, то эти пометки будут вообще проигнорированы). Наконец, можно объединить второй и третий подходы. При этом вы самостоятельно разрабатываете как внешний вид колонтитулов, так и то, какая информация из текста и как будет в них отражена.

Нина Казачек
Нина Казачек
Василий Майоров
Василий Майоров