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

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

Аннотация: Эта лекция предназначена для тех, кого не удовлетворяет оформление, предлагаемое стандартными классами LaTeX'а.

Мне кажется, гиппопотама

Зовут так длинно для того,

Чтоб сторож из глубокой ямы

Пореже вызывал его.

С.Я.Маршак

Эта лекция предназначена для тех, кого не удовлетворяет оформление, предлагаемое стандартными классами LaTeX'а. Возможно, вам даже захочется создать свой собственный класс документов вместо стандартных article, proc, report или book. Задача эта выполнимая, но для этого надо в деталях знать, во-первых, книгу [2], а во-вторых — исходные тексты LaTeX'а (они доступны). У читателя настоящей книги таких познаний не предполагается, так что мы предлагаем нечто более скромное: научиться модифицировать оформление одного конкретного документа.

Прежде чем двигаться дальше — два предупреждения. В этой лекции мы расскажем вам, как можно довольно сильно изменить стандартное LaTeX'овское оформление: вы научитесь менять по своему усмотрению шрифты в заголовках, интервалы, отделяющие заголовки от текста, и много других подобных вещей. Но вот первое предупреждение: если вы не являетесь профессиональным полиграфистом, применяйте эти познания с осторожностью. Не пытайтесь менять сразу много разных элементов оформления или резко изменять какие-то параметры: лучше осторожно менять только то, что вам действительно нужно. Учтите: когда дилетант берется за оформление книги, в девяти случаях из десяти результат бывает достоин сожаления.

Второе предупреждение: стиль оформления записан в специальных " стилевых" или "классовых" файлах, входящих в комплект поставки LaTeX'а. Ни в коем случае не меняйте ничего в этих файлах: все изменения в стиле оформления надо записывать в собственном стилевом пакете, как объяснено ниже.

С чего начать

Кое-какие изменения в оформлении документа вы делать уже умеете: например, в "лекции 4" рассказывалось, как можно, присвоив в преамбуле новые значения нескольким параметрам, изменить размер полей или текста. Однако для более серьезной модификации оформления приходится иметь дело со специальными командами LaTeX'а, содержащими в своем имени символ @. Поскольку @ — не буква, просто так до этих команд не добраться1Если просто написать \@addtoreset (скоро вы узнаете, что это значит), то TeX воспримет это как команду \@ (имя — из одной не-буквы!), за которой следует текст addtoreset.. Поэтому действовать нужно следующим образом.

Если вы хотите серьезно менять стандартное оформление, нужно создать свой собственный стилевой пакет. Пусть вы решили, что он будет называться {mystyle}. Тогда надо создать файл под названием mystyle.sty и начать документ так (подразумевается, что вы хотите печатать шрифтом кегля 11 и отталкиваетесь от класса book; в других случаях — c очевидными изменениями):

\documentclass[11pt]{book}
\usepackage{mystyle}

После \usepackage можно писать сразу \begin{document}; все установки параметров, определения макросов, и т.п. лучше делать уже не в преамбуле, а непосредественно в файле mystyle.sty (чтобы не запутаться, устанавливая один и тот же параметр по-разному в двух разных местах).

Для оформления документа вам, скорее всего, понадобятся какие-нибудь уже существующие стилевые пакеты (если в тексте много формул, то вы захотите подключить пакет {amsmath}, если есть таблицы, то пакет {array},...). Начать свой личный стилевой пакет надо с того, что подключить эти пакеты. При этом нужно использовать команду \RequirePackage (вместо знакомой вам \usepackage ), например, так:

\RequirePackage{array,longtable}
\RequirePackage[noamsfonts]{amsmath}

(необязательный аргумент команды \RequirePackage означает то же самое и используется так же, как у команды \usepackage ).

На крайний случай, если вам понадобилось использовать команду с символом @ в имени не в стилевом пакете, а прямо в тексте документа, предусмотрены команды \makeatletter и \makeatother. Первая из них делает @ буквой, а вторая восстанавливает status quo. Если вы использовали в тексте \makeatletter, не забудьте написать и \makeatother сразу после текста, в котором использовалась @ в имени команд.

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

Снова о счетчиках

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

Как подчинить один счетчик другому

Первый из приемов, о которых пойдет речь, связан с отношением подчинения между счетчиками. Мы знаем, что при создании счетчика с помощью команды \newcounter можно задать и счетчик, которому он будет "подчинен". Но как быть, если уже существует никому не подчиненный счетчик, а мы хотим его кому-то подчинить? Например, за нумерацию сносок отвечает счетчик footnote ; в стиле article этот счетчик определяется как никому не подчиненный, благодаря чему нумерация сносок выходит сплошной в пределах всего документа. Если мы хотим, чтоб нумерация сносок начиналась заново в каждом разделе, то можно в стилевом пакете написать так:

\@addtoreset{footnote}{section}

Первый аргумент команды \@addtoreset — имя подчиняемого счетчика, второй — имя подчиняющего.

Разумеется, для того чтобы осмысленно применять описанную команду, надо знать, какие счетчики определены в стандартных стилях и кому они подчинены (или не подчинены). Эта информация содержится в конце раздела.

При ознакомлении с командой \@addtoreset может возникнуть искушение написать

\@addtoreset{footnote}{page}

чтобы сноски нумеровались заново на каждой странице. К сожалению, по TeXническим причинам это может не дать желаемого результата: если сноски оказываются на нескольких страницах подряд, то может случиться так, что на второй из этих страниц нумерация сносок начнется не с 1.

Типичный случай использования команды \@addtoreset возникает, если класс документа — article. В этом случае часто пишут

\@addtoreset{equation}{section}

чтобы нумерация уравнений была не сплошной, как предусмотрено стандартом, а начиналась заново в каждом разделе. Разумеется, в этом случае надо будет переопределить команду \theequation.

Если вы подключили пакет {amsmath}, то эту операцию можно осуществить и попросту в преамбуле документа: команда \numberwithin, принимающая в точности те же аргументы, что и \@addtoreset, осуществляет подчинение счетчика и к тому же переопределяет соответствующим образом the-команду.

Ссылочный префикс

Вторая тонкость, о которой пойдет речь, связана с автоматическими ссылками и the-командами. Предположим, что перед исполнением команды \label{metka} последним счетчиком, подвергшимся увеличению с помощью \refstepcounter, был abcd. В "лекции 7 " мы говорили, что при этом команда \ref{metka} представит на печати значение этого счетчика "в соответствии с командой \theabcd ". Настало время сознаться, что это полуправда. На самом деле команда \ref напечатает перед \theabcd еще и так называемый "ссылочный префикс" счетчика. Содержимое ссылочного префикса к счетчику abcd записано в команде \p@abcd (буква p, конечно, латинская). В момент создания счетчика эта команда определяется как макрос с "пустым" замещающим текстом, так что у таких счетчиков, как chapter или section в стандартных классах, ее следов не видно. Можно, однако, переопределить эту команду, чтобы ссылочный префикс реально печатался. Вот пример работы со ссылочным префиксом.

В классе book вид номера главы и номера раздела определяется следующим образом: команда \thechapter определена стандартным образом как \arabic{chapter} (такое определение, как мы помним, автоматически производится при создании счетчика), а внешний вид номера раздела определен как

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

Из-за этого номер третьего раздела второй главы печатается в заголовке как 2.3. Пусть мы хотим, чтобы номера разделов в заголовках не содержали номера главы; тогда можно написать

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

но при этом возникнет другая неприятность. Автоматические ссылки на номер раздела, генерируемые командой \ref, теперь дадут на печати одно и то же число 3 как для третьего раздела второй главы, так и для третьего раздела четвертой главы: ведь из команды \thesection информация о номере главы ушла! Чтобы справиться с этой неприятностью, поместим утерянную информацию в ссылочный префикс счетчика section:

\renewcommand{\p@section}{\thechapter.}

Теперь будет печататься 2.3 при ссылке на третий раздел второй главы и 4.3 при ссылке на третий раздел четвертой главы: хотя \thesection в обоих случаях дает просто 3, печатающийся перед ним \p@section обеспечивает печать номера главы и точки. Кстати говоря, именно такой прием применен при подготовке книги, которую вы читаете.

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