Перемещаемые аргументы и хрупкие команды

Если в аргументе команды \section(или любой другой LaTeX'овской команды для рубрикации) присутствует не только текст, но и TeX'овские команды, то при трансляции они могут иногда вызвать сообщение об ошибке. Чтобы этого избежать, команду надо "защитить": поставить непосредственно перед ней команду \protect. Приведем пример, когда возникает нужда в этой команде.

Предположим, вы решили сказать LaTeX'у, что в каком-то месте заголовок раздела нельзя разрывать на печати, с помощью команды \nolinebreak. Тогда надо действовать следующим образом:

\documentclass{article}

 

\begin{document}

\section{Устойчивость по Ляпунову}

...

\section {О некоторых свойствах функций \protect\nolinebreak\Ляпунова}

Еще кое-что.

\end{document}

(Заметьте заодно, что команда \nolinebreak дана до пробела между словами, а не после — иначе она вообще не сработает, невзирая ни на какой \protect.) Если убрать в этом файле \protect, то на экране появится загадочное сообщение об ошибке.

Такого рода ситуация может возникать, когда TeX'овская команда является частью текста, который будет записан в специальный файл и использован при следующем запуске LaTeX'а (в нашем случае информация о заголовке раздела записывается в файл с расширением toc для последующего использования в оглавлении). Если аргумент команды (в нашем случае команды \section) подвергается такой обработке, то его называют перемещаемым; команды, которые, будучи использованы внутри перемещаемого аргумента, могут вызвать ошибку, называются хрупкими.

Из LaTeX'овских команд, которые могут реально понадобиться внутри заголовка раздела, большинство хрупкими не являются. Если вы сомневаетесь, не хрупка ли какая-то конкретная команда, можете спокойно ставить перед ней \protect — ничего плохого от этого не произойдет.

Не являются хрупкими и не нуждаются в защите с помощью \protect команды для расстановки диакритических знаков , смены текущего шрифта и установки промежутков вручную .

4. Лекция: Оформление текста в целом Титульный лист, оглавление, список литературы, аннотация Титульный лист Для того, чтобы оформить заголовок ко всему документу, надо сделать две вещи: задать информацию для заголовка (автор, название и т.п.) и дать LaTeX'у команду этот заголовок сгенерировать. Второе делается с помощью команды \maketitle. Она создаст титульный лист, если это предусмотрено классом и опциями. (Если титульный лист не предусмотрен, то команда \maketitle разместит заданную вами информацию об авторе, заглавии и прочем на первой странице, выбрав подходящие шрифты и сделав подобающие отступы между титульной информацией и текстом.) По умолчанию для классов report и book титульный лист создается всегда (и не создается, если указана классовая опция notitlepage), для класса article титульный лист не создается (но будет создан, если указать классовую опцию titlepage). В классе proc титульная информация всегда печатается на первой странице текста. Так как команда \maketitle генерирует текст, ее нельзя помещать в преамбуле документа. Теперь объясним, как задавать LaTeX'у информацию для титула. Автор задается с помощью команды \author. Она принимает единственный обязательный аргумент — имя автора (в том виде, как вы хотите его видеть на титуле). Если авторов несколько, их имена должны быть разделены командой \and. Заглавие задается с помощью команды \title. Если заглавие длинное, можно самому задать его разбиение на строки с помощью команды \\; если этого не сделать, заглавие будет разбито на центрированные строки автоматически, как если бы это был абзац в окружении {center}. Следующий элемент информации для титула — команда \date. Она имеет один обязательный аргумент, в котором можно задать любой текст (например, дату, в согласии с переводом слова date), который будет размещен на титульном листе (или перед началом основного текста, если титульный лист не предусмотрен классом и/или опциями) в одной или нескольких центрированных строках (так же, как и текст, задаваемый в аргументе команды \title). В частности, можно оставить аргумент этой команды "пустым", если сказать \date{} - тогда соответствующий текст вообще не появится. Но если вы вообще не дадите эту команду, хотя бы и с пустым аргументом, то LaTeX напечатает на титуле дату своего запуска, причем по-английски1). Команды \author, \title и \date можно давать в любом порядке, но обязательно до команды \maketitle (можно и в преамбуле). Команда \maketitle должна быть первой из команд, генерирующих текст. Наконец, последнее, что можно сделать с информацией для титула документа, — это снабдить ее сносками. К любому из авторов, к любым словам в титуле или в тексте, содержащемся в аргументе команды \date, можно сделать сноску с помощью команды \thanks, имеющей один обязательный аргумент — текст сноски (в отличие от обычных сносок, абзацы в этом тексте нельзя разделять пустыми строками или командами \par; если в вашей сноске должно быть несколько абзацев, разделяйте их TeX'овской командой \endgraf). Сноски будут напечатаны внизу титульного листа (или первой страницы, если титульный лист не предусмотрен). Пример: \author{Борис Заходер} \title{Винни-Пух и все-все-все\thanks{Вообще-то это перевод из А.А.Милна}} \date{} Обратите внимание, что команда \thanks помещается внутри аргумента команд \title и/или \author. Наконец, можно при желании вообще не использовать стиль оформления титульного листа, диктуемый нам LaTeX'ом. Сделать это очень просто — надо воспользоваться окружением {titlepage}. Текст между \begin{titlepage} и \end{titlepage} составит титульный лист, за оформление которого целиком отвечает тот, кто текст готовит. Сам LaTeX внутри этого окружения делает только три вещи:
  • устанавливает печать в одну колонку (даже если сам документ будет печататься в две колонки);
  • начинает новую страницу и устанавливает счетчик числа страниц в нуль;
  • устанавливает странице стиль оформления empty (без колонтитула и номера).
Что и как разместить на этой странице — ваша забота. Оглавление В процессе работы LaTeX автоматически собирает информацию для создания оглавления и записывает ее в специальный файл с тем же именем, что у обрабатываемого файла, и расширением toc. Чтобы LaTeX записал эту информацию, а затем воспользовался ею и напечатал оглавление, надо дать команду \tableofcontents. Стало быть, оглавление, генерируемое LaTeX'ом, всякий раз будет " на шаг отставать" от реального положения дел. Чтобы учесть все возможные изменения и получить верное оглавление, надо будет в самом конце работы над текстом запустить LaTeX еще раз (напоминания об этом LaTeX не выдаст). Все оглавление в целом будет озаглавлено словом, определяемым командой \contentsname. Если вас не устраивает стандартный стиль оформления оглавления, прочтите в последней лекции, как его можно изменить. Список литературы Имеется возможность оформить список литературы, элементы которого нумеруются автоматически; в тексте при этом надо ссылаться не на эти номера, которые могут измениться в процессе работы над документом, а на установленные вами условные обозначения для элементов списка литературы (" источников"). Список литературы оформляется как окружение {thebibliography}. Это окружение имеет обязательный аргумент — номер источника, занимающий больше всего места на печати (в стандартных шрифтах все цифры имеют одинаковую ширину, так что достаточно привести в качестве аргумента, например, номер 99, если источников будет заведомо меньше 100). Каждый источник вводится командой \bibitem. У нее есть один обязательный аргумент — ваше условное обозначение. В качестве такого обозначения можно использовать любую последовательность из букв и цифр. В тексте ссылка на источник делается с помощью команды \cite. У нее есть обязательный аргумент — условное обозначение того источника, на который вы ссылаетесь. Можно сослаться сразу на несколько источников — для этого в аргументе команды \cite надо указать их обозначения через запятую. Приведем пример (в котором для экономии места мы опустили заголовок "Список литературы"):
В \cite[лекция 1]{Winnie} описана встреча Винни-Пуха с несколькими пчелами. В \cite{voevoda,med3} приведены другие сведения о медведях. \begin{thebibliography}{99} \bibitem{voevoda} М.Е.Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.Н.Толстой. Три медведя. \bibitem{Winnie} А.А.Милн. Винни-Пух. \end{thebibliography}

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

Как это обычно и происходит с автоматически генерируемыми LaTeX'ом ссылками, после первого запуска программы вы увидите сообщение о том, что ссылки не определены. Если в дальнейшем в процессе работы над текстом нумерация ссылок изменится, LaTeX сообщит вам об этом и предложит запустить программу еще раз, чтобы получить корректные ссылки.

Если вам не нравится, что источники в списке литературы нумеруются, можно придумать для них свои обозначения, которые будут печататься вместо номеров. Для этого надо использовать команду \bibitem с необязательным аргументом, идущим перед обязательным. В квадратных скобках ставится то обозначение, которое будет заменять номер для этого источника. Например, можно написать так:

\begin{thebibliography}{XXXX}

...

\bibitem[EGA]{Groth} A.Grothendieck, J.Dieudonn\'e.

\'El\'ements de G\'eom\'trie Alg\'ebrique.

...

\end{thebibliography}

После этого команда \cite{Groth} будет генерировать текст [EGA].

Списку литературы в целом LaTeX автоматически дает заглавие, определяемое командой \refname в классах article и proc и \bibname в классах report и book . Если это заглавие печатается по-английски, его можно переопределить .

4. Лекция: Оформление текста в целом Предметный указатель В отличие от списка литературы, который при использовании описанных выше команд \cite и \bibitem получается совершенно автоматически, процесс создания указателя автоматизирован в LaTeX'е не полностью. Именно, вы можете сделать две вещи:
  • Если вам уже известно, какие термины должны войти в указатель и на каких страницах они расположены, можно организовать печать предметного указателя с помощью окружения {theindex}. Если предметный указатель должен завершать документ, то можно, на худой конец, напечатать весь документ, кроме указателя, и вручную выписать требуемые номера страниц1).
  • Можно также (и на практике это удобнее) специальным образом пометить в файле термины, на которые вы собираетесь ссылаться в предметном указателе. При этом средствами LaTeX'а создается полуфабрикат, из которого предметный указатель получится после обработки отдельной программой (называемой обычно makeindex, а в русской версии — rmakeindex или как-нибудь еще в этом роде), входящей в настоящее время почти во все поставки LaTeX'а.
Начнем с того, что расскажем о втором способе создания индекса, а потом объясним, что можно сделать, если программа для генерации индекса вам по какой-то причине недоступна. Общие положения Чтобы разметить файл для автоматической генерации индекса, нужно сделать две вещи. Во-первых, в преамбулу документа необходимо включить команду \makeindex. Во-вторых, при условии, что это сделано, можно пометить те места в тексте, на которые вы хотите сослаться в предметном указателе, командой \index (если команда \makeindex в преамбуле отсутствует, то команды \index ничему не мешают, но и никакого действия не оказывают). У этой команды один обязательный аргумент — текст вашей пометки (в простейшем случае такая пометка — это ключевое слово будущего предметного указателя). Информация о том, на какие страницы попали ваши пометки, будет записана в специальный файл с тем же именем, что и у вашего файла, и расширением idx (мы будем называть его idx-файлом). Пусть, например, в исходном файле встречались такие фрагменты2): Многие люди любят домашних кошек.\index{Кошки} .... Хорошо также иметь собаку.\index{Собаки} .... Мало кто рискнет держать дома такую дикую кошку\index{Кошки}, как тигр. Предположим, что первая ссылка на кошек попала на страницу 5, ссылка на собак попала на страницу 7, а вторая ссылка на кошек попала на страницу 9. Тогда в idx-файл запишется вот что: \indexentry{Кошки}{5} \indexentry{Собаки}{7} \indexentry{Кошки}{9} Полученный таким образом idx-файл — это и есть полуфабрикат указателя, созданный LaTeX'ом. Использовать этот полуфабрикат, однако же, еще нельзя: ссылки в idx-файле расположены не по алфавиту, а записаны " в порядке поступления", в idx-файле может присутствовать несколько строк с одним заглавным словом и ссылками на разные страницы, наконец, команда indexentry, с которой начинается каждая строка idx-файла, не определена в LaTeX'е (это сделано сознательно!). Поэтому, получив idx-файл, надо его обработать с помощью программы makeindex; в результате получится файл с отсортированными по алфавиту терминами (обычно он имеет расширение ind и называется ind-файлом), который можно будет включить в окружение {theindex}, написав \begin{theindex} \input{text.ind} \end{theindex} Если вы заглянете в файл, полученный в результате работы программы makeindex, то увидите, что в окружении {theindex} каждый элемент указателя вводится командой \item ; команды \subitem и \subsubitem вводят элементы указателя, печатающиеся с дополнительными отступами (обычно это уточнения к заглавному слову) — вскоре мы объясним, что надо писать в аргументе команды \index, чтобы получить такую иерархию элементов указателя. Наконец, команда \indexspace создает дополнительный вертикальный пробел (его можно использовать для отделения различных разделов указателя друг от друга):
\begin{theindex} \item Компьютеры, 25--42 \subitem IBM-совместимые, 28 \subsubitem ремонт, 35 \subsubitem цены, 30 \subitem болгарские, 26 \item Принтеры, 40 \indexspace \item Кошки, 120 \item Собаки, 140--156 \end{theindex}

Предметный указатель, получаемый из окружения {theindex}, печатается LaTeX'ом в две колонки (даже тогда, когда сам документ печатается в одну колонку). Кроме того, LaTeX автоматически дает указателю заглавие, определяемое командой \indexname (см. выше). Если вас не устраивает, что это название — английское, его можно переопределить (см. там же).

В аргументе команды \index могут быть любые символы, и вообще текст в аргументе этой команды может быть неосмысленным или недопустимым с точки зрения TeX'а — в любом случае аргумент команды \index будет в неизменном виде переписан в idx-файл. Смысл тут в том, что в аргументе команды \index можно задавать вспомогательную информацию для программы обработки idx-файла (примеры тому вы найдете ниже). Единственное ограничение — не должно быть "несбалансированных" фигурных скобок, даже если эти скобки входят в состав команд \{ или \} (напомним, что вместо \{ или \} всегда можно написать \lbrace или \rbrace соответственно).

Наконец, еще одна тонкость: команду \index нельзя использовать внутри необязательного аргумента таких команд, как \section, \chapter, \caption (подрисуночная подпись; см. следующий раздел) и т.п.