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

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

Как видите, для того, чтобы модифицировать оформление разделов, надо знать размеры стандартных LaTeX'овских параметров оформления, наподобие отступа перед или после заголовком. Для команды \section

Таблица 9.2. Стандартное оформление разделов
Отступ Перед После
\subsection 0pt -3.25ex plus -1ex minus-.2ex 1.5ex plus.2ex
\subsubsection 0pt -3.25ex plus -1ex minus-.2ex 1.5ex plus.2ex
\paragraph 0pt 3.25ex plus 1ex minus.2ex -1em
\subparagraph \parindent 3.25ex plus 1ex minus.2ex -1em

мы привели их выше, а для остальных стандартных команд рубрикации они собраны в табл.9.2. В ней " отступ" означает отступ заголовка от левого поля, "перед" — отступ перед заголовком (если этот отступ отрицательный, то абзацный отступ в первом абзаце будет подавлен), "после" — отступ после заголовка (если это отрицательное число, то заголовок печатается в подбор). Уровни вложенности разделов см. в табл. 9.1 , а что до "внутреннего имени" раздела (первый аргумент команды \@startsection ), то оно у всех стандартных команд рубрикации совпадает с их именем section для команды \section и т.п.). Шестой аргумент команды \@startsection содержит в стандартных определениях только команды переключения шрифта; при необходимости заинтересованный читатель воспроизведет его самостоятельно.

Шестой аргумент команды \@startsection позволяет автоматически добавлять текст перед номером раздела. К сожалению, не так просто2Но возможно: это сделано, например, в пакете {russcorr}, использованном при подготовке данной книги. См. приложения E и Ж. заставить LaTeX автоматически добавлять текст после номера, хотя такая потребность порой возникает (например, хочется, чтобы в заголовках разделов после номеров стояли точки, чего стандартное LaTeX'овское оформление не предусматривает).

Можно заставить LaTeX ставить точки после номеров, написав

\renewcommand{\thesection}{\arabic{section}.}

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

Оформление глав отличается от оформления остальных разделов тем, что слово "Глава" и номер главы печатаются на отдельной строке. С помощью команды \@startsection определить такой раздел нельзя, поэтому главы определяются в LaTeX'овских классах иначе. Не будем вдаваться в подробности, как именно, а вместо этого рассмотрим единственно важный для нас вопрос: как можно менять оформление глав.

Большая часть оформления главы задается в определении команды \@makechapterhead, так что для модификации оформления именно ее и надо переопределять. Рассмотрим, как \@makechapterhead определяется в стандарте. Этой команде передается один аргумент — заголовок главы. В переводе с TeX'а на LaTeX определение выглядит так (не забудьте, что #1 — это аргумент, т. е. текст заголовка):

\newcommand{\@makechapterhead}[1]{% Начало макроопределения
  \vspace*{50 pt}% Пустое место вверху страницы
  {\parindent=0pt
   \raggedright \normalfont\huge\bfseries
   \@chapapp{} % \@chapapp печатает слово "Глава" (см. ниже)
    \thechapter \par % номер главы - в отдельной строке
    \vspace{20 pt} % между словом "Глава" и ее заголовком
    \normalfont\Huge\bfseries #1\par % заголовок главы
    \nopagebreak     % чтоб не оторвать заголовок от текста
    \vspace{40 pt}   % между заголовком и текстом
  }% конец группы.
}% конец макроопределения

Разберем эту "программу". Первая команда \vspace* оставляет пустое место вверху страницы (поскольку главы начинаются с новой страницы). Далее печатается слово "Глава", ее номер и заголовок главы; поскольку заголовок может не поместиться в строку, надо предусмотреть, какие будут при этом параметры верстки абзаца. Как видите, устанавливается нулевое значение абзацного отступа и отсутствие выравнивания по правому краю; чтобы такой режим не распространился на дальнейший текст, соответствующие команды даны внутри группы. Внутри этой же группы определен шрифт, которым будет печататься заголовок.

Команда \@chapapp печатает слово " Chapter", "Глава",... — одним словом, то, как в вашем документе называются главы. Точнее говоря, по умолчанию эта команда работает так же, как \chaptername, а после команды \appendix (если таковая есть в вашем файле) начинает работать как \appendixname. Если в вашем тексте все главы называются одинаково, то при переопределении \@makechapterhead можно не мудрить, а прямо заменить \@chapapp на "Глава". Не забудьте только оставить пробел между этим словом и номером главы (выше это было сделано с помощью обычного трюка с парой фигурных скобок).

Остальное в приведенном выше определении разъяснений, надо думать, не требует. Скорее всего, вы захотите в этой команде изменить шрифт, которым печатается заголовок главы, или же интервалы, отделяющие заголовок от остального текста. Чтобы изменить вид, в котором представляется на печати номер главы, надо, как водится, переопределить команду \thechapter. Можно при желании задать и какое-нибудь более сложное оформление заголовка с помощью блоков и линеек — все зависит от вашей фантазии и вкуса!

Надо еще сказать, что мы немного обманули читателя: на самом деле в стандартных классах команда \@makechapterhead определена таким образом, что если значение счетчика secnumdepth отрицательно, то команды, записанные в строках с пятой по седьмую, не исполняются (и номер главы не печатается). В нашем определении эти команды будут исполняться всегда, вне зависимости от значения secnumdepth; если вы переопределяете \@makechapterhead и не хотите, чтобы главы нумеровались, просто удалите соответствующие строки из определения.

Кроме того, если в классе book вы переопределите \@makechapterhead, отталкиваясь от этого определения, то главы, заданные как \chapter без звездочки, будут нумероваться, невзирая на команды \frontmatter и \backmatter (но вы ведь сможете поставить две-три звездочки самостоятельно?).

За оформление заголовка главы, определенной командой \chapter со звездочкой, отвечает команда \@makeschapterhead. Ее определение в стандарте аналогично определению \@makechapterhead, с тем отличием, что из него удален фрагмент, отвечающий за печать номера:

\newcommand{\@makeschapterhead}[1]{%
  \vspace*{50 pt}%
  {\parindent=0pt \raggedright
    \normalfont\Huge\bfseries #1\par
    \nopagebreak
    \vspace{40 pt}}}

Кроме оформления заголовка, с оформлением глав можно делать еще две вещи. Во-первых, главы начинаются либо просто с новой страницы (как в классе report ), либо с новой нечетной страницы (как в классе book ); чтобы повлиять на этот выбор, не надо ничего делать в личном стилевом пакете, достаточно просто указать классовую опцию openright или openany (в необязательном аргументе команды \documentclass ). Во-вторых, по умолчанию абзацный отступ в первом абзаце главы подавляется; вы можете захотеть сделать так, чтобы он не подавлялся. Чтобы решить эту проблему, надо переопределять уже саму команду \chapter, а для этого надо знать, как она определяется в стандарте. Вот соответствующее определение, опять в переводе на LaTeX с TeX'а, в классе book:

\newcommand{\chapter}{\cleardoublepage
   \thispagestyle{plain}%
   \global\@topnum=0
   \@afterindentfalse
   \secdef\@chapter\@schapter}

Разбирать это определение мы не будем, чтобы не запутаться в некоторых слишком хитрых TeX'овских и LaTeX'овских конструкциях, а просто скажем две вещи:

  • чтобы не подавлялся абзацный отступ в первом абзаце главы, замените \@afterindentfalse на \@afterindenttrue ;
  • если вы не хотите, чтобы на странице с заглавием главы печаталась колонцифра (номер страницы), замените аргумент команды \thispagestyle с plain на empty.

Что касается команды \part (" часть"), то она отличается тем, что заголовок части занимает отдельную страницу. Если вы решили изменить стандартное оформление таких "частей", то проще всего оформить соответствующие две--три страницы вручную.

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