Tex: подробное описание С. М. Львовский
Организация автоматических ссылок
Download 1.51 Mb. Pdf ko'rish
|
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling