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

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

Счетчики

Теперь мы научимся самостоятельно организовывать автоматическую нумерацию, подобно тому, как LaTeX автоматически нумерует главы, страницы, формулы и т.д. Для этого нам надо познакомиться с понятием счетчика. Счетчик — это специальная переменная, значение которой является целым числом. Ей можно присваивать различные значения, выводить значение счетчика на печать, а также организовывать с помощью счетчиков автоматическую генерацию ссылок. Рассмотрим последовательно, как все это делается.

Создание счетчиков и простейшие операции с ними

Каждый LaTeX'овский счетчик имеет свое имя — последовательность букв (без знака \ ). Прописные и строчные буквы в именах счетчиков различаются; если в используемой вами русификации русские буквы нельзя употреблять в именах команд, то нельзя их употреблять и в именах счетчиков. Чтобы можно было работать со счетчиком, надо его создать командой \newcounter, имеющей один обязательный аргумент — имя, которое вы придумали для счетчика. Например, команда

\newcounter{abcd}

создает новый счетчик с именем abcd. Если имя, которое вы придумали для счетчика, уже занято (так может случиться, даже если команда \newcounter в вашем тексте всего одна: некоторые счетчики в LaTeX'е уже определены в момент начала обработки вашего текста), то LaTeX создавать счетчик с таким именем откажется и выдаст сообщение об ошибке.

В отличие от многих других LaTeX'овских команд, команда для создания нового счетчика является "глобальной": даже если она давалась внутри группы, LaTeX не забудет о существовании определенного ею счетчика и после выхода из этой группы. Это отличает \newcounter от \newcommand и \renewcommand.

Что же можно делать со счетчиком? Во-первых, можно менять его численное значение (на программистском жаргоне: "присваивать счетчику различные значения"). При создании счетчика его значение устанавливается в 0 ; чтобы установить какое-то другое значение, используется команда \setcounter, имеющая два обязательных аргумента: первый — имя счетчика, второй — значение, которое счетчику присваивается. Если, например, написать

\setcounter{abcd}{1998}

то после того, как TeX прочтет эту команду, значение счетчика abcd установится равным 1998. Значение, которое присваивается счетчику, может быть и отрицательным, но обязано быть целым.

Другой способ изменить значение счетчика — это прибавить к нему какое-то целое число. Для этого используется команда \addtocounter. Эта команда также имеет два обязательных аргумента: первый — имя счетчика, второй — число, которое прибавляется к счетчику. Например, после выполнения команд

\setcounter{abcd}{100}
\addtocounter{abcd}{-27}

значением счетчика abcd будет число 73.

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

Перейдем к самому главному: как вывести значение счетчика на печать. Самый распространенный случай — печать значения счетчика обычными (" арабскими") цифрами. Для этого используется команда \arabic:

\parindent=0cm
\newcounter{abcd}\setcounter{abcd}{40}
Шел по улице отряд -
\arabic{abcd}
мальчиков подряд.
\setcounter{abcd}{40}
Шел по улице отряд -
\arabic{abcd}
мальчиков подряд.

Значение счетчика печатается текущим шрифтом: если значение счетчика равно, скажем, 2003, то на команду \arabic{abcd} TeX отреагирует так же, как если бы на ее месте в исходном тексте было написано 2003.

Чтобы напечатать значение счетчика римскими цифрами, надо воспользоваться командой \Roman (если мы хотим, чтобы римские цифры записывались прописными латинскими буквами) или \roman (чтобы записать римскую цифру строчными латинскими буквами):

\parindent=0cm
\newcounter{abcd}\setcounter{abcd}{14}
Людовика \Roman{abcd} звали
``Король-Солнце''.
\setcounter{abcd}{14}
Людовика \Roman{abcd} звали
``Король-Солнце''.

Естественно, при печати значения счетчика римскими цифрами это значение должно быть положительным числом.

Можно, наконец, напечатать букву латинского алфавита, порядковый номер которой равен значению счетчика. Для этого используются команды \alph (для печати строчной буквы) и \Alph (для печати прописной буквы):

\parindent=0cm
\newcounter{abcd}\setcounter{abcd}{7}
Наконец я узнаю, какая буква
стоит в латинском алфавите
на седьмом месте!
Вот она: \alph{abcd}.
\setcounter{abcd}{7}
Наконец я узнаю, какая буква
стоит в латинском алфавите
на седьмом месте!
Вот она: \alph{abcd}.

Если значение счетчика при пользовании этими командами превышает количество букв в латинском алфавите, то LaTeX выдает сообщение об ошибке.

В LaTeX'е отсутствует команда, позволяющая напечатать русскую букву с номером, равным значению счетчика. Средствами TeX'а такую команду нетрудно создать.

Наконец, можно напечатать один из девяти символов, используемых иногда в англоязычных странах для обозначения последовательных сносок (вместо цифр). Для этого используется команда \fnsymbol, применять которую можно только внутри формул:

\parindent=0cm
\newcounter{abcd}\setcounter{abcd}{0}
Для сносок в Англии
применяют такие символы:
$\addtocounter{abcd}{1}\fnsymbol{abcd}$,
$\addtocounter{abcd}{1}\fnsymbol{abcd}$,
$\addtocounter{abcd}{1}\fnsymbol{abcd}$,
а дальше попробуйте сами.
\setcounter{abcd}{0}
Для сносок в Англии
применяют такие символы:
$\addtocounter{abcd}{1}
\fnsymbol{abcd}$,
$\addtocounter{abcd}{1}
\fnsymbol{abcd}$,
$\addtocounter{abcd}{1}
\fnsymbol{abcd}$,
а дальше попробуйте сами.

Обратите внимание, как три идентичных фрагмента исходного текста дали на печати три разных символа.

В командах для изменения значений счетчиков можно вместо явного указания чисел использовать значения других счетчиков, для чего употребляется команда \value. Например, в результате выполнения команд

\newcounter{efgh}
\setcounter{abcd}{10}
\setcounter{efgh}{100}
\addtocounter{efgh}{-\value{abcd}}

значение счетчика efgh станет равно 90. Можно даже писать, например,

\setcounter{efgh}{1000}
\tolerance=\value{efgh}

но большого смысла в таких трюках, как правило, нет.

Применим наши познания к делу. Ранее мы обещали вам так усовершенствовать макрос \z, начинающий новый абзац и печатающий жирным шрифтом слово "Задача", чтоб он еще и автоматически нумеровал эти задачи, так, что можно было бы просто писать в исходном тексте

\z Найти сумму...
\z Решить уравнение...
\z Поезд вышел из пункта А...

и при этом знать, что номера LaTeX проставит сам. Теперь мы в состоянии решить эту проблему. Во-первых, для этого надо создать счетчик, значение которого в каждый момент будет равно номеру последней обработанной задачи; во-вторых, в определении команды \z надо предусмотреть, чтобы всякий раз значение этого счетчика увеличивалось на единицу, а затем печаталось в качестве номера задачи. В качестве имени счетчика выберем бесхитростное "zadacha":

\newcounter{zadacha}

(напомним, что при выполнении этой команды счетчику zadacha будет присвоено значение 0 ). Теперь модифицируем определение макроса \z так:

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

Напомним, что команда \par означает "завершить предыдущий абзац, если он еще не был завершен"; без нее можно обойтись, если мы будем ставить команду \z только после пустой строки. Знак процента мы поставили, чтобы убрать лишний пробел, порождаемый концом строки. Теперь при первом исполнении команды \z значение счетчика zadacha станет равно 1 и будет напечатано "Задача 1.", при втором исполнении этой команды значение счетчика станет равно уже 2 и напечатается "Задача 2."... и т.д., что нам и нужно!

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