Оформление текста в целом
Еще о метках и ссылках
В разных местах этой книги уже шла речь о том, как можно помечать различные места документа, а затем на эти помеченные места ссылаться. В настоящем разделе мы систематизируем эту информацию. Дополнительные сведения о том, как можно влиять на вид ссылок, создаваемых командой \ref, читатель найдет в разд. 7.3.
Общие принципы
Как мы знаем, любое место в тексте можно пометить с помощью команды \label с одним аргументом; на помеченное место можно сослаться с помощью команды \ref или \pageref с тем же самым аргументом. Команда \pageref дает на печати номер страницы, на которую попала соответствующая метка; поэтому \label нужно ставить вплотную к тому слову, к которому относится ссылка (при наличии пробела слово и ссылка на него могут попасть на разные страницы).
Что же до команды \ref, то с ней дело обстоит так. Многие конструкции LaTeX'а автоматически нумеруют те или иные элементы документа. Из тех, с которыми мы уже сталкивались, можно назвать следующие:
- команды рубрикации текста ( \chapter, \section, и т.п.); те из них (наиболее "мелкие"), что номеров разделов не печатают, влияния на команду \ref не оказывают;
- окружения, создающие нумерованные выключные формулы (такие, как {equation} и {eqnarray}, а также многочисленные окружения, определенные в пакете {amsmath}: {multline}, {gather}, {align} и иже с ними);
- команда \caption ;
- команда \item в окружении \env{enumerate} ;
- команда \cite.
Кроме того, автоматически создают номера, например, окружения типа "теорема", о которых пойдет речь в разд.7.5.2; можно также самостоятельно создавать команды, дающие автоматическую нумерацию (см. "Создание новых команд" ). Так или иначе, действует следующее правило:
если в тексте стоит команда \label{ghnm}, то \ref{ghnm} выдает на печати последний из автоматически сгенерированных номеров, оказавшихся перед \label{ghnm}.
При первом (после появления новой команды \label ) запуске LaTeX'а команды \ref и \pageref печатают вместо номеров вопросительные знаки, а на экран и в протокол трансляции выдается сообщение
LaTeX Warning: There were undefined references.
Если при дальнейшей работе над текстом номера, на которые ссылается \ref или \pageref, изменятся, LaTeX выдаст такое предупреждение:
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
Это означает, что в данный момент ссылки, сгенерированные командами \ref или \pageref, могут быть неверными. После повторного запуска LaTeX'а (иногда — не одного) все встает на свои места, и это предупреждение пропадает.
Скажем несколько слов про то, какие символы можно использовать в аргументе команды \label. Всегда можно пользоваться цифрами и (строчными и прописными) латинскими буквами; ни в коем случае нельзя помещать в аргумент \label фигурные скобки, а также симоволы ~(тильда) или \ (backslash). Прочие символы в аргументе команды \label иногда безобидны, а иногда приводят к синтаксическим ошибкам. Пока вы не стали TeX-ником, лучше такие эксперименты не ставить.
Возможность использования русских букв в метках зависит от используемой вами русификации.
Визуализация меток
Возможность автоматической генерации ссылок, предоставляемая командами \label и \ref, — большое благо, но всякое техническое усовершенствовование приносит и новые проблемы. Предположим, что, рассматривая пробную распечатку, вы решили добавить ссылку на формулу 3.7. Писать прямо "3.7" рискованно: вдруг в процессе дальнейшей работы над текстом номер этой формулы изменится? Значит, надо воспользоваться командой \ref, но что писать в ее аргументе, если номер 3.7 присутствует только на печати, а в TeX'овском файле вместо этого номера при нужной вам формуле стоит команда \label с совершенно другим аргументом?
Можно, конечно, разыскать в файле формулу, соответствующую формуле 3.7 на печати, и скопировать аргумент команды \label, но есть и более удобный способ. Именно, если подключить стилевой пакет {showkeys}, то над каждым местом в тексте, помеченным с помощью команды \label (или, скажем, \bibitem ), и над каждым местом, где стоит ссылка — команда \ref (или, скажем, \cite ), будет надпечатываться и ваша метка — аргумент команды \label, \ref и т.п8На верстку эти надпечатки не влияют.. Иными словами, если ваша формула 3.7 в исходном тексте выглядела как
\begin{equation} 2\times 2=4,\label{main} \end{equation}
то при просмотре и печати вы увидите над номером 3.7 надпись main, и сразу будет видно, как сослаться на эту формулу с помощью \ref.
Излишне объяснять, что перед беловой распечаткой строку
\usepackage{showkeys}
из преамбулы документа надо удалить.
Для любознательных
Скажем несколько слов о том, как происходит автоматическая генерация ссылок. Когда в обрабатываемом файле встречается команда \label, LaTeX записывает информацию о ней в специальный файл, называемый aux-файлом (при обработке файла text.tex имя aux-файла будет text.aux )9Для каждого из файлов, включаемых в текст с помощью команды \include, создается отдельный aux-файл. При этом в aux-файл заносится следующая информация о метке: выбранное вами имя метки (аргумент команды \label ), номер страницы, на которую эта метка попала (этот номер будет в дальнейшем напечатан командой \pageref ), и, наконец, тот номер, который должен будет напечататься командой \ref (говоря более TeX'ническим языком, это вид на печати того счетчика, который последним подвергся увеличению с помощью \refstepcounter — см. "Создание новых команд" .
Далее, всякий aux-файл читается LaTeX'ом за один сеанс работы дважды: первый раз до начала обработки текста и второй раз — после ее завершения. При первом чтении aux-файла LaTeX запоминает имеющуюся в нем информацию о метках; именно исходя из этой информации команды \ref и \pageref печатают ссылки (если информации о данной метке при первом чтении aux-файла не обнаружено, вместо ссылки печатаются вопросительные знаки, а на экран выдается сообщение о неопределенной метке; так будет заведомо, если в tex-файле присутствуют ссылки на впервые появившуюся метку). При втором чтении aux-файла (после завершения работы с текстом, когда aux-файл был записан заново) LaTeX сравнивает имеющуюся у него информацию о метках с той, что содержится в новой версии aux-файла; если информация о метках изменилась, выдается знакомое предупреждение " Label(s) may have changed".