Модификация команд, задающих разделы
Теперь рассмотрим, что надо делать, чтобы более серьезным образом изменить оформление разделов. Для этого надо переопределить команды \section, \subsection и т.п., а чтобы научиться их должным образом переопределять, надо узнать, как эти команды определены в стандартных LaTeX'овских классах.
Почти все команды для создания разделов документа определяются в классовых файлах через команду \@startsection. Например, команда \section определяется (не буквально, а по существу) так:
\newcommand{\section}{\@startsection{section}{1}{0pt}% {-3.5ex plus -1ex minus -.2ex}{2.3ex plus.2ex}% {\normalfont\Large\bfseries}}В этом определении у команды \@startsection указаны шесть аргументов, в которых закодированы различные параметры оформления раздела. Разберем последовательно, что эти аргументы означают.
Первый из аргументов (в нашем случае section) — это " внутреннее имя", под которым LaTeX будет узнавать определяемый тип разделов документа. Если вы решили использовать команду \@startsection с "нестандартным" первым аргументом (скажем, abcd), то заодно придется определить счетчик с именем abcd, который будет отвечать за нумерацию разделов, а также команду \l@abcd, которая будет отвечать за сбор материала для оглавления, и команду \abcdmark, отвечающую за передачу информации для колонтитулов,так что без надобности командой \@startsection с нестандартным первым аргументом лучше не пользоваться.
Второй аргумент (в нашем случае 1) — это тот самый " уровень вложенности" раздела, о котором шла речь выше.
Третий аргумент задает отступ заголовка от левого поля (в нашем случае этот отступ равен нулю).
Четвертый аргумент команды \@startsection (в нашем случае это -3.5ex plus -1ex minus -.2ex) задает величину вертикального отступа, оставляемого перед заголовком. Точнее говоря, вертикальному отступу равен не сам четвертый аргумент, а его абсолютная величина (при определении отступа знаки - отбрасываются), а знак - означает, что первый абзац нашего раздела будет печататься без абзацного отступа, как и оформляются разделы в стандартных LaTeX'овских стилях.
Если задать эти расстояния как положительные числа, то абзацный отступ в первом абзаце подавляться не будет. Тот факт, что отступ перед началом раздела имеет plus- и minus-компоненты, означает, как водится, что этот пробел обладает растяжимостью и сжимаемостью.
Пятый аргумент (в нашем случае 2.3ex plus .2ex) задает величину вертикального отступа после заголовка раздела, а тот факт, что он положителен, означает, что заголовок раздела печатается на отдельной строке (или строках, если в строку он не умещается). Если он будет отрицательным, то заголовок раздела будет печататься не на отдельной строке, а в подбор; значение пятого аргумента \@startsection будет означать при этом (после отбрасывания знака минус, естественно) величину дополнительного горизонтального отступа между заголовком раздела и продолжающим его текстом из первого абзаца раздела.
Пятый аргумент \@startsection тоже, как видите, может содержать plus- и/или minus-компоненту.
Наконец, шестой аргумент команды \@startsection задает стиль оформления заголовка. Точнее говоря, в этом аргументе записан текст и/или команды, которые будут вставлены перед заголовком раздела. В нашем случае этот аргумент содержит только команды
\normalfont\Large\bfseries задающие шрифт, которым заголовок будет напечатан (на последующий текст эта смена шрифта не повлияет, поскольку команды, указанные в шестом аргументе \@startsection, будут выполняться внутри группы).
Приведем пример того, как можно изменить стандартное оформление. Пусть нам хочется, чтобы команда \section порождала раздел документа, оформленный таким образом:
- номера разделов печатаются римскими цифрами;
- перед номером раздела стоит знак ;
- номер раздела и его заглавие печатаются прямым светлым шрифтом размера \Large;
- абзацный отступ в первом абзаце не подавляется.
\renewcommand{\thesection}{\Roman{section}} А теперь переопределим и саму команду \section следующим образом:
\renewcommand{\section}{\@startsection{section}{1}% {\parindent}{3.5ex plus 1ex minus .2ex}% {2.3ex plus.2ex}{\normalfont\Large\S}} Мы воспользовались \renewcommand, поскольку команда \ section ранее уже была определена. В четвертом аргументе мы убрали знаки -, чтобы не подавлять абзацный отступ, а в третьем — задали отступ заголовка от левого поля, равный абзацному отступу (причина этого не программистская, а эстетическая: некрасиво, когда первый абзац раздела идет с отступом, а заголовок начинается вплотную к левому полю). Прочие параметры, задающие размеры отступов, мы оставили такими же, как в стандартной LaTeX'овской команде: они достаточно разумны, и незачем их трогать, если на то нет особых причин.
Как видите, для того, чтобы модифицировать оформление разделов, надо знать размеры стандартных LaTeX'овских параметров оформления, наподобие отступа перед или после заголовком. Для команды \section
\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 |
Шестой аргумент команды \@ startsection позволяет автоматически добавлять текст перед номером раздела. К сожалению, не так просто2) заставить 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.