Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 19
Текст из файла (страница 19)
Поэтому она можетустареть, если входной файл был изменён. В таком случае компилятор печатаетна экране дисплея предупреждениеLaTeX Warning: Label(s) may have changed.Rerun to get cross-references right6 .Тогда нужно выполнить компиляцию входного файла ещё раз либо проигнорировать предупреждение, если работу предполагается продолжить. Компилятортакже печатает предупреждение, если обнаруживает одну и ту же метку в двухили более командах \label:Label ‘...’ multiply defined7 .Область действия декларации \refstepcounter подчиняется обычным правилам. Поэтому, чтобы пометить раздел, команда \label должна находиться послекоманды секционирования в любом месте раздела до любой следующей командысекционирования.В качестве примера покажем, как оформлена ссылка на тот раздел первойглавы, где приведён образец входного файла. В первой строке этого раздела вовходном файле установлена метка с ключом c:int/first:В key нельзя использовать русские буквы, поскольку они по сути являются командами.
Есливсё-таки русские буквы присутствуют в key, как случается при обработке старых документов,необходимо загрузить пакет citehack из коллекции T2, причём пакет citehack должен быть загружен после пакета babel. В разделе 3.3.7 описана процедура установки нестандартных пакетов,к которым относится пакет citehack.6 Возможно, изменились метки. Повторите обработку, чтобы получить правильные перекрёстные ссылки.7 Метка ‘...’ определена повторно.5833.7. Перекрёстное цитирование\section{Пример входного файла}\label{c:int/first}Зная ключ метки, легко определить номер раздела и номер страницы, где онначинается:Раздел~\ref{c:int/first} начинаетсяна странице~\pageref{c:int/first}.Раздел 1.3 начинается на странице 16.Если меток много, лучше с самого начала выработать правила, которые бы совместили информативность ключей с краткостью.
Так, метки разделов мы начинаемс пары символов «c:» (от английского слова chapter — глава), за которой следует аббревиатура, отражающая содержание раздела; метки рисунков — с «f:»(от слова figure), метки таблиц — с «t:» (от слова table).При интенсивном использовании механизма перекрёстного цитирования большую помощь способен оказать пакет showkeys. Если он загружен, команды \label,\ref, \pageref печатают на полях страницы или между строчками названияключей, используемых этими командами.3.7.1.Пакет variorefПакет varioref Франка Миттельбаха (Mittelbach, Frank) из коллекции tools расширяет средства перекрёстного цитирования, добавляя к командам \ref и \pagerefряд других, способных печатать более осмысленный текст, нежели просто номерассылок и страниц, где они расположены:\vref{key}\vref*{key}\vpageref[samepage][otherpage]{key}\vpageref*[samepage][otherpage]{key}\vrefrange{key1 }{key2 }\vpagerefrange{key1 }{key2 }\vpagerefrange*{key1 }{key2 }(varioref)Действие этих команд зависит от текущего языка, поэтому пакет varioref принимает все опции, перечисленные в разделе 3.6 на с.
76, которые имеются у пакетаbabel. Мы, естественно, использовали опцию russian. Так как список опций былпомечен меткой babeloptions, мы сделали ссылку на него выше следующим образом:...перечисленные в разделе~\vref{babeloptions}, которые имеются...Команда \vref сначала печатает ссылку так же, как \ref{key}, но затем ещёдобавляет «на с.
76», «на предыдущей странице» или «на следующей странице»,если соответствующая команда \label{key} не находится на текущей странице.В документе, предназначенном для двухсторонней печати (когда на разворотевидны сразу две страницы), команда \vref действует ещё более избирательно:84Глава 3.
Печатный документона различает случаи, когда предшествующая или следующая страницы попадают на один разворот со страницей, где печатается ссылка. В этом случае вместо «предыдущей» или «следующей страницы» используется термин «противоположная страница».Команда \vpageref есть вариация \pageref со свойствами, подобными команде \vref. От последней она отличается, главным образом, тем, что не печатаетсаму ссылку \ref. Если команда \vpageref{key} попадает на ту же страницу,что и соответствующая ей \label{key}, то по случайному выбору она печатаетлибо «на этой странице», либо «на данной странице».Наличие необязательных аргументов у \vpageref позволяет выполнять ещёболее тонкую настройку.
Первый необязательный аргумент samepage может содержать текст, который будет напечатан, если метка \label и ссылка \vpagerefпопадают на одну страницу. Обычно в таком случае известно, находится ли меткадо или после ссылки8 . Тогда текст...см.\ пример \vpageref[выше]{ex:1}...в печатном документе превратится в «см. пример выше», если всё попадет наодну страницу, или в нечто вроде «см. пример на предыдущей странице», еслипример и ссылка попадут на разные страницы.Второй необязательный аргумент у команды \vpageref позволяет инвертировать порядок слов. После...см.\ \vpageref[выше пример][пример]{ex:1}, который...в печатном документе появится «см. выше пример», если ссылка на пример исам пример окажутся на одной странице.Команда \vrefrange предназначена для печати диапазона ссылок. Она имеет два аргумента: key1 есть метка первой ссылки в диапазоне, а key2 — меткапоследней ссылки.
Так что если первый и последний рисунки помечены соответственно метками fig:a и fig:с, то...см.\ рисунки \vrefrange{fig:a}{fig:c}...напечатает «см. рисунки c 3.1 по 3.3 на страницах 23–24» или, если рисункипопадут на соседнюю страницу, «см. рисунки c 3.1 по 3.3 на следующей странице».Команда \vpagerefrange аналогична \vpageref, но имеет два аргумента.
Если обе ссылки попадают на одну страницу, то \vpagerefrange делает то же, чтои \vpageref. Если ссылки оказываются на разных страницах, то \vpagerefrangeпечатает нечто вроде «на страницах 23-24».Все перечисленные команды, кроме \vrefrange, имеют *-версию.
Две версиикоманды различаются способом расстановки пробелов, различие между которыми становится заметным, если команде предшествует не пробел, а другой символ,например скобка:Заметим, что плавающие объекты, которые размещаются в верхней части текущей страницы,могут оказаться расположенными перед тем местом, где они описаны во входном файле, но этапроблему решает пакет flafter (см. раздел 11.1).83.7.
Перекрёстное цитирование85Сравните: \\Сравните:3.6 на с. 76 и3.6 на с. 76,\vref{babeloptions} и \vref*{babeloptions},\\(\vref{babeloptions}) и (\vref*{babeloptions}). ( 3.6 на с. 76) и (3.6 на с. 76).Текст, который печатают команда \vref и ей подобные, можно изменить, поскольку он хранится в командах-логосах\reftextafter\reftextbefore\reftextcurrent\reftextfaraway{key}\reftextfaceafter\reftextfacebefore\reftextpagerange{key1 }{key2 }\reftextlabelrange{key1 }{key2 }(varioref)Текст ссылки на предшествующую, но невидимую на развороте страницу печатает команда \reftextbefore, а на предшествующую и видимую страницу —команда \reftextfacebefore (когда текущая страница имеет нечётный номер,а печатный документ обрабатывается с опцией twoside).
Аналогичным образомкоманда \reftextafter используется, когда \label приходится на следующуюневидимую, а \reftextfaceafter — на следующую видимую страницу. Команда\pagevref использует строку, которая хранится в \reftextcurrent и предназначена для замещения номера страницы в том случае, когда метка и ссылканаходятся на одной странице. Команда \reftextfaraway используется для печати номера страницы ссылки, отличающегося более чем на 1 от номера текущейстраницы, а также в том случае, когда страницы нумеруются не арабскими, а,скажем, римскими цифрами (раздел 17.1). Дабы не утомлять Читателя дальнейшими объяснениями, просто приведём пример, который воспроизводит определения всех команд \reftextcmd в пакете varioref для русского языка:\renewcommand{\reftextfaceafter}{на \reftextvario{противоположной}{следующей} странице}\renewcommand{\reftextfacebefore}{на \reftextvario{противоположной}{предыдущей} странице}\renewcommand{\reftextafter}{на следующей странице}\renewcommand{\reftextbefore}{на \reftextvario{предшествующей}{предыдущей} странице}\renewcommand{\reftextcurrent}{на \reftextvario{этой}{данной} странице}\renewcommand{\reftextfaraway}[1]{на с.~\pageref{#1}}\renewcommand{reftextpagerange}[2]{на страницах~\pageref{#1}--\pageref{#2}}\renewcommand{reftextlabelrange}[2]{с~\ref{#1} по~\ref{#2}Здесь использована ещё одна команда, определённая в пакете varioref:\reftextvario{string1 }{string2 }(varioref)Она вносит разнообразие в текст, который печатают команды \reftextcmd, выбирая одну из двух строк {string1 }, {string2 } в зависимости от количества ссылок, уже встретившихся в исходном тексте.86Глава 3.