Tex: подробное описание С. М. Львовский


 Организация автоматических ссылок


Download 1.51 Mb.
Pdf ko'rish
bet103/143
Sana08.05.2023
Hajmi1.51 Mb.
#1444247
1   ...   99   100   101   102   103   104   105   106   ...   143
Bog'liq
LaTeX-Lvovsky

2.3. Организация автоматических ссылок
Вернемся еще один, теперь уже последний, раз к нашей команде \z. Раз она автоматически
нумерует задачи, то неплохо было бы, если б пронумерованные ей задачи можно было метить
командой \label и ссылаться на эти метки командой \ref (проблема именно в ней, посколь

ку команда \pageref, дающая номер страницы, сработает в любом случае). Если коротко, то
решение этой проблемы таково: увеличивать на единицу значение счетчика ZADAˆA надо не
с помощью команды \addtocounter, которой мы пользовались до сих пор, а с помощью ко

манды \refstepcounter, о которой уже шла речь по другому поводу в предыдущем разделе.
Если мы определим команду \z так:
\newcommand{\z}{\par\refstepcounter{ZADAˆA}%
{\bf zADAˆA \arabic{section}.\arabic{ZADAˆA}.} }
то после этого можно будет написать, например, так:


VII.2. СЧЕТЧИКИ
149
\z rE[ITX URAWNENIE...
\z dOKAZATX...\label{prove}
\z nAJTI SUMMU...
Если теперь в другом месте текста мы сошлемся на помеченную задачу так:
w ZADAˆE \ref{prove} PREDLAGALOSX DOKAZATX...
то будет печататься ее номер (тот самый, который L
A
TEX автоматически ей присвоил). Впро
чем, с такими автоматическими ссылками не все будет благополучно: если помеченная нами
задача была второй по счету в секции номер 3, то называться она будет Задача 3.2, а вот
ссылка на нее, сгенерированная командой \ref, будет выглядеть просто
В задаче 2 предлагалось доказать. . .
в то время как хотелось бы автоматически получить
«В задаче 3.2». Иными словами, надо из
менить текст, генерируемый командой \ref. Чтобы узнать, как этого добиться, нам придется
познакомиться с еще одной L
A
TEXовской конструкцией, связанной со счетчиками.
Мы уже знаем, что значение L
A
TEXовского счетчика можно вывести на печать команда
ми \arabic, \roman и т. п. Однако, кроме этого, с каждым счетчиком связана индивидуаль

ная команда, определяющая, в какой форме его значение будет выводиться на печать, и имен

но в соответствии с этой командой печатается ссылка, сгенерированная с помощью \label
и \ref. Имя этой команды получается, если поставить the перед именем счетчика. Напри

мер, команда для вывода на печать номера секции называется \thesection, для вывода на
печать номера главы
— \thechapter, команды для вывода на печать определенных нами
счетчиков SLUGA и HOZQIN — \theSLUGA и \theHOZQIN соответственно. При создании счетчи
ка автоматически определяется и соответствующая the-команда. Например, при создании
счетчика abcd автоматически определяется команда \theabcd таким образом:
\newcommand{\theabcd}{\arabic{abcd}}
В дальнейшем эту команду можно переопределять:
Людовика XIV звали
«Король
солнце
».
\setcounter{abcd}{14}
\renewcommand{\theabcd}%
{\Roman{abcd}}
l@DOWIKA~\theabcd ZWALI
\LK kOROLX-SOLNCE\PK.
Мы же, чтобы при ссылках перед номером задачи печатался номер секции, в которой нахо

дится эта задача, и точка, переопределим команду \theZADAˆA так:
\renewcommand{\theZADAˆA}{\thesection.\arabic{ZADAˆA}}
Если включить эту команду в преамбулу документа, то ссылки на сгенерированные нашей
командой \z номера задач будут выглядеть должным образом.
В нашем переопределении команды \theZADAˆA мы воспользовались командой \thesection,
чтобы наши макросы правильно работали с любым основным стилем документа. Дело в том, что при
разумном оформлении номер секции, предшествующий при ссылке номеру задачи, должен печататься
таким же образом, как и номер секции при ссылке на секцию, а это в разных стилях делается по-раз

ному: в стиле article , например, \thesection
— это то же самое, что и \arabic{section} (иными


VII.2. СЧЕТЧИКИ
150
словами, ссылка на секцию, сгенерированная командой \ref, печатает просто номер секции), а в сти

ле report команда \ref при печати ссылки на секцию печатает не номер секции, а номер главы, точку
и номер секции. Поскольку мы написали \thesection, все эти тонкости будут учтены автоматически.
Приведем еще один (игрушечный) пример использования счетчиков в макроопределени

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

сти
— чтобы убедить читателя, что не боги горшки обжигают. Именно, давайте разработа
ем свои собственные команды для создания разделов документа, не полагаясь на \chapter,
\section
и т. п. из стандартных L
A
TEXовских стилей. Поскольку пример игрушечный, мы
сделаем ряд упрощающих предположений (в частности, предположив, что заголовки глав и
разделов будут укладываться в одну строку) и не будем заботиться о том, насколько удачным
выйдет оформление заголовков. Итак, приступим. Пусть наш документ делится на главы, ко

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

стью создания автоматических ссылок на эти номера. Команды для создания главы и раздела
назовем \GLAWA и \RAZDEL соответственно; это будут команды, требующие одного аргумента
— названия главы или раздела.
Для того, чтобы номера глав и разделов генерировались автоматически, нам необходи

мо создать счетчики, содержащие эти номера. Пусть счетчик с номером главы называет

ся GLAWA , а счетчик с номером раздела — RAZDEL (имена счетчиков могут совпадать с имена
ми команд). Имея в виду, что нумерация разделов в каждой главе будет начинаться заново,
напишем в преамбуле так:
\newcounter{GLAWA}
\newcounter{RAZDEL}[GLAWA]
Теперь определим команду \GLAWA:
\newcommand{\GLAWA}[1]{\clearpage % S NOWOJ STRANICY
\vspace*{4cm}% OSTAWITX MESTO SWERHU
\refstepcounter{GLAWA}% NOWYJ NOMER GLAWY
{\LARGE\bf % [RIFT DLQ ZAGOLOWKA
gLAWA \theGLAWA.\ #1% ZAGOLOWOK
\par % KONˆITX ZAGOLOWOK
\vspace{5mm plus 1mm minus .5mm}% pROMEVUTOK MEVDU
% ZAGOLOWKOM I TEKSTOM
}% ZAWER[ITX GRUPPU, WNUTRI KOTOROJ MENQLSQ [RIFT
}% KONEC MAKROOPREDELENIQ
Поскольку очередной номер главы устанавливался командой \refstepcounter, при этом
будет начата заново и нумерация разделов, а на номера глав можно будет делать автомати

ческие ссылки с помощью \label и \ref. Обратите также внимание на команду \theGLAWA.
Мы воспользовались ей, поскольку не хотим на этом этапе предрешать, в каком виде но

мер главы будет представлен в заголовке: в виде арабской цифры, римской цифры или еще
как-нибудь. Если в дальнейшем нам захочется изменить вид этого представления, то нам
не придется лезть, с риском ошибиться, в длинное определение команды \GLAWA, а будет
достаточно переопределить команду \theGLAWA. Заметьте, что промежуток между заголов
ком и текстом мы сделали растяжимым, чтобы помочь TEXу найти правильное разбиение на
страницы (см. стр.
80
). Наконец, backslash с пробелом после точки мы поставили, чтобы не
увеличивать пробела между номером главы и ее названием (стр.
61
).


VII.2. СЧЕТЧИКИ
151
Определение команды \RAZDEL можно дать, например, так:
\newcommand{\RAZDEL}[1]{\par % ZAWER[ITX PREDYDU]IJ ABZAC
\pagebreak[2]\vspace{1cm plus 3mm minus .5mm}% SM. NIVE
\refstepcounter{RAZDEL}% NOWYJ NOMER RAZDELA
{\Large\bf % [RIFT DLQ ZAGOLOWKA
\theRAZDEL{} #1% ZAGOLOWOK
\par % KONˆITX ZAGOLOWOK
}% ZAWER[ITX GRUPPU, WNUTRI KOTOROJ MENQLSQ [RIFT
\nopagebreak % ˆTOBY NE OTORWATX TEKST OT
% ZAGOLOWKA
\vspace{2mm plus 1mm}% pROMEVUTOK MEVDU ZAGOLOWKOM
% I TEKSTOM
}% KONEC MAKROOPREDELENIQ
Пояснений тут требует команда \pagebreak[2] . Мы вставили ее в макроопределение, что

бы поменьше разделов начиналось внизу страницы. В самом деле, команда \pagebreak[2]
предлагает TEXу начать в этом месте новую страницу (см. раздел III.7.5Б); если так и будет
сделано, то дополнительный вертикальный промежуток, созданный командой \vspace, про

падет, и заголовок раздела начнется с самого верха новой страницы; если же разрыва стра

ницы все-таки не произойдет, то перед заголовком раздела будет вертикальный промежуток
величиной 1 см (обладающий указанными в макроопределении растяжимостью и сжимаемо

стью).
Нам осталось только задать вид, в котором будут представляться на печати номера глав
и разделов. Иными словами, надо переопределить должным образом команды \theGLAWA
и \theRAZDEL (в момент создания счетчиков они, как мы помним, были автоматически опре
делены таким образом, что \theGLAWA и \theRAZDEL — просто номер главы и раздела со
ответственно, набранный арабскими цифрами). Предположим, мы решили, что номера глав
будут печататься римскими цифрами, а номер второго раздела четвертой главы будет иметь
вид IV
–2. Тогда требуемые переопределения таковы:
\renewcommand{\theGLAWA}{\Roman{GLAWA}}
\renewcommand{\theRAZDEL}{\Roman{GLAWA}--\arabic{RAZDEL}}
Еще одно замечание: точки после номера главы мы включили в определение команды \GLAWA,
а не \theGLAWA, чтобы можно было пользоваться автоматическими ссылками: если бы \theGLAWA
определялось как
\Roman{GLAWA}.
то исходный текст
W GLAWE \ref{METKA} MY PI[EM...
дал бы на печати
в главе IV. мы пишем
что нелепо.
По сравнению с макроопределениями, реально используемыми в стандартных стилях
L
A
TEXа, мы в нашем игрушечном наборе макросов многого не предусмотрели: не позаботи
лись ни о колонтитулах, ни об автоматически генерируемом оглавлении, внешний вид заго

ловков оставляет желать лучшего, и т. д. Тем не менее один из основных принципов у нас


VII.2. СЧЕТЧИКИ
152
присутствует: нумерация действительно организуется с помощью подчиненных друг другу
счетчиков и команды \refstepcounter.
У внимательного читателя может возникнуть вопрос, каким образом команда \label узна ¨ет, ка

кого вида ссылку ей генерировать. В самом деле, пусть исходный текст имеет вид
\chapter{˜TO-TO}\label{a}
.....
\section{kOE-ˆTO}\label{b}
.....
\begin{figure}
\label{c}
.....
\end{figure}
и пусть глава оказалась по номеру третьей, помеченная секция
— второй в этой главе, а помеченная
плавающая иллюстрация
— пятой в своей секции. Откуда L
A
TEX знает, что команда \ref{a} долж
на сгенерировать просто цифру 3, команда \ref{b}
— текст 3.2, а команда \ref{c} — текст 3.2.5?
Ответ на этот вопрос таков: команда \label генерирует (т. е. записывает в aux-файл) ссылку в со

ответствии с видом того счетчика, который последним подвергался операции \refstepcounter. По

этому в данном примере команда \label{a} генерирует ссылку на счетчик chapter, \label{b}

на счетчик section, а \label{c}
— на счетчик figure, отвечающий за нумерацию плавающих иллю
страций.

Download 1.51 Mb.

Do'stlaringiz bilan baham:
1   ...   99   100   101   102   103   104   105   106   ...   143




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling