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

Создание новых команд

Отношение подчинения между счетчиками

Команда \z, как мы ее определили ранее, нумерует задачи автоматически, но при этом нумерация получается " сплошной". Часто, однако, требуется, чтобы в каждом разделе документа нумерация задач начиналась заново, так что шестая задача в разделе с номером 3 была озаглавлена Задача 3.6, а первая задача в разделе с номером 4 — Задача 4.1. Сейчас мы узнаем, как этого добиться.

Выше мы упоминали, что к моменту начала обработки LaTeX'ом нашего текста некоторые счетчики уже определены. В частности, это счетчики, содержащие номера текущих разделов документа. Их имена совпадают с именами команд, генерирующих эти разделы: chapter (если классом предусмотрено разбиение на главы), section, subsection и т.д. При каждом исполнении, например, команды \section значение счетчика section увеличивается на 1, и значение этого счетчика в каждый момент равно номеру текущего раздела. Поэтому, если в определении команды \z написать

\arabic{section}.\arabic{zadacha}.

то перед номером задачи будет печататься номер текущего раздела и точка.

Но как же все-таки сделать, чтобы в каждом разделе нумерация задач начиналась заново? Можно, конечно, в начале каждого раздела присваивать счетчику zadacha значение 0 с помощью \setcounter, но это некрасиво и ненадежно (а вдруг забудем?). Лучше сразу определить счетчик zadacha так:

\newcounter{zadacha}[section]

При этом счетчик zadacha будет подчинен счетчику section: всякий раз, когда значение счетчика section увеличивается на единицу командой \section, значение счетчика zadacha будет устанавливаться в нуль, и тем самым счет задач будет в каждом разделе начинаться заново. Одновременно надо в очередной раз исправить определение команды \z и написать

\newcommand{\z}{\par\addtocounter{zadacha}{1}%
\textbf{Задача \arabic{section}.\arabic{zadacha}.} }

При этом нумерация задач будет начинаться заново в каждом разделе, и вторая задача третьего раздела будет иметь номер 3.2.

Теперь сообщим точные правила создания счетчика, подчиненного другому счетчику. Они просты: команда \newcounter может принимать один необязательный аргумент ( после обязательного) — имя того счетчика, которому будет подчинен определяемый нами счетчик. Разумеется, в момент выполнения команды \newcounter с необязательным аргументом счетчик, имя которого дается в квадратных скобках, должен уже существовать.

Надо еще уточнить, в каких случаях значение подчиненного счетчика устанавливается в нуль. В самом деле, пусть счетчик slave подчинен счетчику master; тогда команда

\addtocounter{master}{1}

никоим образом не повлияет на значение подчиненного счетчика \slave: изменение значений счетчика влияет на значения подчиненных ему счетчиков только в том случае, если значение подчиняющего счетчика изменялось с помощью специальных команд. Таких команд всего две, из них чаще всего используется \refstepcounter: она увеличивает на единицу значение указанного ей счетчика, а значения всех подчиненных ему счетчиков устанавливает в нуль. Пусть, например, в нашем тексте определены два счетчика:

\newcounter{master}
\newcounter{slave}[master]

Тогда после выполнения команд

\setcounter{master}{10}
\setcounter{slave}{10}

значения обоих счетчиков станут равны 10, после выполнения команды

\addtocounter{master}{1}

значение счетчика master станет равно 11 и значение счетчика slave не изменится, а вот после выполнения команды

\refstepcounter{master}

значение счетчика master станет равно 12, в то время как значение счетчика slave станет равно нулю.

Наряду с \refstepcounter существует еще одна команда, изменяющая значение счетчика таким образом, что значения всех подчиненных ему счетчиков устанавливаются в нуль. Эта команда называется \stepcounter ; она также увеличивает на единицу значение счетчика, имя которого является ее аргументом, и при этом обнуляет все подчиненные ему счетчики, но она непригодна для организации автоматических ссылок, вследствие чего область ее применения более ограничена.

Хороший пример использования подчиненных счетчиков дают стандартные LaTeX'овские классы документов. Например, в классе book перед началом обработки текста выполняются следующие команды:

\newcounter{part}
\newcounter{chapter}
\newcounter{section}[chapter]
\newcounter{subsection}[section]
\newcounter{subsubsection}[subsection]
\newcounter{paragraph}[subsubsection]
\newcounter{subparagraph}[paragraph]

Стало быть, нумерация глав не зависит от нумерации частей (если третья часть книги завершается десятой главой, то четвертая часть начинается с одиннадцатой главы), а нумерация разделов уже начинается заново в каждой главе.

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