Работа в системе LaTeX

Оформление текста в целом

Разбить на страницы
Показывать лекцию целиком

В этой лекции мы рассмотрим такие вопросы, как общий стиль оформления документа, разбиение текста на разделы, титульный лист, оглавление и пр. Система LaTeX освобождает вас от многих забот об оформлении документа, но при этом и навязывает такие черты оформления, которые могут вас по тем или иным причинам не устраивать. От этого "диктата" можно отчасти отойти, если модифицировать стандартные классы, создав свой стилевой пакет (в последней лекции мы расскажем, как это делать). В принципе можно создать и свой собственный класс, весьма далекий от стандартных, но для этого требуются более глубокие познания в TeX'е, чем дает эта книга. Начнем же мы с того, что систематически рассмотрим вопрос о стандартных классах.

Классы, пакеты и классовые опции

Команда \documentclass, с которой начинается любой LaTeX'овский файл, имеет один обязательный аргумент — название основного класса — и один необязательный, размещающийся перед обязательным, — список, через запятую, "классовых опций" .

Прежде чем говорить о классах документов, скажем несколько слов о команде, которая очень часто идет сразу после \documentclass, а именно, команде \usepackage. После \documentclass может идти одна или несколько команд \usepackage ; аргумент этой команды — это список, через запятую, стилевых пакетов, подключаемых к нашему документу. В первой лекции мы умолчали о том, что некоторые стилевые пакеты допускают задание своих личных стилевых опций (каких именно — зависит от пакета). Список стилевых опций пакета задается в необязательном аргументе команды \usepackage (через запятую, если опций несколько). Необязательный аргумент команды \usepackage ставится перед обязательным.

Например, если включить в преамбулу строку

\usepackage{amsmath}

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

\usepackage[noamsfonts]{amsmath}

то у вас будут все эти возможности, кроме использования готического и ажурного шрифтов.

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

Теперь вернемся к классам документов. В первой лекции мы уже перечислили пять классов, предоставляемых LaTeX'ом: article, report, book, proc и letter. Сейчас мы рассмотрим подробнее четыре из них. Класс letter рассматривается ниже, в разд."Письма". (Американское математическое общество распространяет также, вместе со своими стилевыми пакетами, классы документов amsart, amsproc и amsbook ; мы рассмотрим их в приложении Г.

Класс article удобно применять для статей, класс report — для более крупных статей, разбитых на главы, или небольших книг, класс book — для книг. В табл. 4.1 перечислены некоторые черты оформления, присущие стандартным классам. В ней знак $$+$$ означает "всегда присутствует", знак $$-$$ означает "всегда отсутствует", знак $$\mp$$ означает "по умолчанию отсутствует, но будет присутствовать, если задать классовую опцию или специальную команду", знак $$\pm$$ означает "по умолчанию присутствует, но можно отменить с помощью классовой опции или специальной команды".

article report book proc
Автоматически нумерующиеся разделы $$+$$ $$+$$ $$+$$ $$+$$
Разбиение на главы $$+$$ $$+$$ $$+$$ $$+$$
" Двусторонняя" печать $$\mp$$ $$\mp$$ $$\pm$$ $$-$$
Титульный лист $$\mp$$ $$\pm$$ $$\pm$$ $$-$$
Колонтитулы $$\mp$$ $$\pm$$ $$\pm$$ $$\mp$$
Одинаковая высота всех страниц $$\mp$$ $$\mp$$ $$\pm$$ $$-$$
Набор в две колонки $$\mp$$ $$\mp$$ $$\mp$$ $$+$$
Набор в одну колонку $$\pm$$ $$\pm$$ $$\pm$$ $$-$$

Мы не стремились охватить в этой таблице все детали различий между стандартными классами (например, колонтитулы в разных классах оформляются по-разному).

Опишем теперь классовые опции. Напомним , что список классовых опций через запятую ставится в квадратных скобках перед основным аргументом команды \documentclass. Самые часто употребляемые классовые опции — это 11pt и 12pt. Они означают, что основной текст документа будет набран шрифтом кегля 11 или 12 соответственно. Если этих опций не указывать, то будет шрифт кегля 10.

Можно указать классовую опцию, задающую формат используемой бумаги, после чего TeX рассчитает размеры текста и полей так, чтобы они максимально соответствовали этому формату. Эти опции таковы (единица измерения указана в скобках):

  • a4paper- $$210\times 297$$ (миллиметры) — самый ходовой в нашей стране;
  • a5paper - $$148\times 210$$ (миллиметры);
  • b5paper - $$176\times 250$$ (миллиметры);
  • legalpaper - $$8.5\times 14$$ (дюймы);
  • executivepaper - $$7.25\times 10.5$$ (дюймы).
  • Если ни одна из этих опций не указана, LaTeX считает, что размер бумаги равен (в дюймах) $$8.5\times 11$$ (этот формат бумаги иногда называют "letter").

    Если предполагается расположить текст так, чтобы он шел параллельно широкому, а не узкому краю бумаги, то можно указать опцию landscape: в этом случае TeX будет вычислять размеры текста и полей, считая, что ширина и высота листа бумаги поменялись ролями. Подчеркнем, что задание опции landscape само по себе текст на $$90^\circ$$ не повернет: он будет сверстан TeX'ом исходя из соответствующих размеров, но дальше необходимо иметь принтер и/или dvi-драйвер, способные обеспечить печать текста в такой ориентации. По умолчанию же считается, что строки параллельны узкому краю листа.

    Опция twoside задает печать с разными полями на нечетных и четных страницах (как в книгах), а опция oneside — печать с одинаковыми полями на всех страницах. В классе book по умолчанию установлена опция twoside, в классах article и report — oneside, в классе proc поля на четных и нечетных страницах всегда одинаковые.

    Для классов article, report и book можно указать классовую опцию twocolumn. Она означает, что набор текста будет производиться в две колонки. Так как абзацы при этом будут получаться довольно узкие, разумно при пользовании этой опцией заодно увеличить параметр \tolerance, иначе будет получаться много строк, выбивающихся за колонку. В разд. "Набор в две колонки" объяснялось, как сделать так, чтобы две колонки отделялись линейкой. В классе proc набор всегда производится в две колонки, и опции twocolumn и onecolumn (есть и такая) на него не действуют.

    Опция draft пригодна для любого класса. Если она включена, то каждая выбивающаяся на поля строка (т.е. строка, о которой выдается сообщение "Overfull \hbox " —) помечается на полях "марашкой". Это удобно при подготовке корректур (английское слово draft как раз и означает "набросок").

    Режим, при котором разные страницы могут иметь разную высоту, задается, как мы помним, командой \raggedbottom. По умолчанию этот режим устанавливается классами article и report, если только в качестве классовой опции не указана "двусторонняя" печать (классовая опция twoside ), а также классом proc. Во всех остальных случаях LaTeX будет, по умолчанию, делать все страницы одинаковой высоты.

    У классов report и book имеются опции openright и openany. Если указана опция openright, то каждая глава начинается обязательно с нечетной страницы (если необходимо, то ради этого печатается дополнительная пустая страница; на развороте нечетная страница будет правой). Если указана опция openany, то новая глава может начинаться как с четной, так и с нечетной страницы, и лишних пустых страниц ради начала главы LaTeX не делает. По умолчанию в классе report LaTeX действует так, как если бы было установлено openany, а в классе book — как если бы было openright.

    Скажем кое-что про класс документов proc. В этом классе текст печатается в две колонки, с уменьшенными полями. Опции a5paper, b5paper, onecolumn и titlepage в классе proc использовать нельзя. Нельзя также пользоваться маргиналиями (разд. 10).

    При пользовании классом proc внизу каждой страницы будет напечатано слово Page (" страница") и номер страницы. Если вы хотите, чтобы вместо Page печаталось что-то другое, скажем, "с.", то нужно в преамбуле переопределить команду \pagename, то есть написать:

    \renewcommand{\pagename}{с.}

    переопределение "стандартных надписей", делаемых LaTeX'ом по-английски; \renewcommand обсуждается в лекции 7).

    Следующие две классовые опции, применимые к любому из основных классов, влияют на оформление выключных математических формул; если вы пропустили при чтении соответствующие места в лекции 2, то пропустите и это место. Опция fleqn означает, что выключные формулы, заданные с помощью окружений {equation}, {eqnarray} и {displaymath}, а также пары команд \[ и \], будут напечатаны не в центре строки, а в ее левой части. Опция leqno означает, что номера формул, генерируемые окружениями {equation} и {eqnarray}, будут печататься не справа, а слева.

    Титульному листу и оформлению частей документа будут посвящены отдельные разделы; чтобы завершить наш обзор различных стандартных вариантов стиля, нам осталось обсудить колонтитулы и номера страниц, чему будет посвящен разд.3.

    Деловые письма

    Пример делового письма.

    \documentclass[11pt]{letter}
    \address{I.\,Ivanov,\\
      IUM, Moscow, Russia}
    \signature{I.\,Ivanov}
    \date{December 31, 2002}
    \begin{document}
    \begin{letter}{Prof.\ Jonas Jonas Huckabuck,\\
      University of Rootabaga,\\
      Cream Puffs, 80116, RO, USA}
    \opening{Dear Prof.\ Huckabuck,}
    Enclosed please find two copies of my paper.
    \closing{Sincerely yours,}
    \end{letter}
    \end{document}

    Существует класс документов letter, специально предназначенный для оформления деловых писем в соответствии с принятыми в США стандартами. Пользоваться им надо так. Во-первых, в преамбуле документа надо задать адрес отправителя в аргументе команды \address (можно применять \\ для ручного разбиения адреса на строки) и подпись отправителя в аргументе команды \signature.Можно также задать дату в аргументе команды \date. Если этого не сделать, то автоматически будет проставлена дата трансляции LaTeX'овского файла (по-английски).

    Письмо в напечатанном виде

    $$%%%HOLE_TeX%%% \documentclass[11pt]{letter} \usepackage{textcomp} \setlength{\textwidth}{6cm} \usepackage{color} \definecolor{bg}{rgb}{ 1,1,1 } \definecolor{fg}{rgb}{ 0.517647058823529,0.00784313725490196,0.0156862745098039 } %\pagestyle{empty} \pagecolor{bg} \color{fg} \address{I.\,Ivanov,\\ IUM, Moscow, Russia} \signature{I.\,Ivanov} \date{December 31, 2002} \begin{document} \begin{letter}{Prof.\ Jonas Jonas Huckabuck,\\ University of Rootabaga,\\ Cream Puffs, 80116, RO, USA} \opening{Dear Prof.\ Huckabuck,} Enclosed please find two copies of my paper. \closing{Sincerely yours,} \end{letter} \end{document}$$

    Между \begin{document} и \end{document} идет собственно текст письма или писем (в одном LaTeX'овском файле можно поместить несколько писем от одного отправителя). Каждое письмо оформляется как окружение {letter}, принимающее один обязательный аргумент — адрес того, кому предназначено письмо (опять-таки адрес можно разбивать на строки командами \\ ). Внутри окружения {letter} располагается собственно текст письма. Начинаться он должен командой \opening, в аргументе которой записывается вступительное обращение, а завершаться — командой \closing, в аргументе которой записывается заключительная фраза перед подписью (" Sincerely yours", например). Выше приведен пример оформленного по всем правилам LaTeX'овского файла с письмом, а затем — то, как будет выглядеть это письмо на печати. Вертикальный отступ на печати между текстами, заданными в командах \closing и \signature (в нашем случае — между " Sincerely yours" и "I.Ivanov" предназначен для того, чтобы поставить в этом месте подпись.

    Если вы хотите написать в письме что-то после вашей подписи, следует после команды \closing дать команду \ps (" постскриптум"), и уже после нее — сам текст (команда \ps необходима, но никакого текста, даже просто P.S., она не генерирует).

    В преамбуле можно дать команду \makelabels. В этом случае на отдельной странице будут напечатаны адреса для всех писем (окружений {letter} ), входящих в файл.

    Все описанные выше классовые опции применимы и к документам класса letter.

    После команды \closing можно дать команду \cc, в аргументе которой указывается, кому вы собираетесь отослать копии письма, а также команду \encl, в аргументе которой указывается список вложений. Американский стандарт на оформление таких вещей расходится с отечественным. Если, тем не менее, вы решитесь воспользоваться этими средствами в письме на русском языке, следует изменить значение команд \ccname и/или \enclname с помощью \renewcommand.

    Стиль оформления страницы

    Для задания стиля оформления страницы в LaTeX'е предусмотрена команда \pagestyle. Эта команда имеет один обязательный аргумент — слово, обозначающее этот стиль. При пользовании стандартными классами документов это слово должно быть одним из следующих:

    empty нет ни колонтитулов, ни номеров страниц
    plain номера страниц ставятся внизу в середине строки, колонтитулов нет;
    headings присутствуют колонтитулы (включающие в себя и номера страниц)
    myheadings присутствуют колонтитулы, оформленные так же, как в предыдущем случае; отличие в том, что текст, печатающийся в колонтитулах (в стандартном случае это номера и названия разделов документа), не порождаются LaTeX'ом автоматически, а задается пользователем в явном виде.

    Если основной стиль — article, то по умолчанию страницы оформляются стилем plain, в двух других основных стилях — стилем headings. "Стиль" myheadings мы рассмотрим в разд. "Колонтитулы" лекция 9.

    Наряду с командой \pagestyle, задающей стиль оформления всех страниц, есть и команда \thispagestyle, задающая стиль оформления одной отдельно взятой страницы. Она принимает такой же аргумент, как и \pagestyle ), но указываемое этим аргументом оформление относится только к той странице, на которую попал текст, окружающий эту команду. Заранее предугадать, на какую страницу попадет данный фрагмент текста, обычно невозможно. Поэтому, если хотите от этой команды предсказуемых результатов, употребляйте ее непосредственно после \newpage или \clearpage.

    Можно при желании сделать так, чтобы страницы нумеровались не арабскими цифрами, что делается по умолчанию, а римскими цифрами или буквами в алфавитном порядке. Для этого предназначена команда \pagenumbering. Она имеет один обязательный аргумент, который может быть одним из следующих:

    arabic арабские цифры (1, 2, 3,...)
    roman римские цифры (i, ii, iii,...)
    Roman римские цифры (I, II, III,...)
    alph строчные буквы (a, b, c,...)
    Alph прописные буквы (A, B, C,...)

    Команда \pagenumbering не только меняет вид, в котором на печати представляются номера страниц, но и начинает счет страниц заново (это удобно, например, в тех случаях, когда страницы предисловия надо нумеровать римскими цифрами, а страницы основного текста заново нумеровать арабскими). Поэтому разумно давать эту команду сразу же после \newpage или \clearpage.

    На этом мы прерываем наше обсуждение того, как изменять стандартное оформление страницы. На самом деле можно изменить гораздо больше, но речь об этом пойдет в лекции 9 .

    Поля, размер страницы и прочее

    Класс документа предопределяет значения таких параметров, как ширина и высота страницы, размеры полей и пр. (с учетом опции, указывающей формат бумаги). В настоящем разделе рассказано, как изменить эти значения, если они вас не устраивают.

    Размеры текста на странице, полей и пр. задаются параметрами со значением длины . Менять эти параметры следует в преамбуле документа.

    Ширина

    Ширина текста на странице задается параметром \textwidth ; если набор осуществляется в две колонки, то \textwidth включает в себя ширину обеих колонок и пробел между ними. Если нужно, чтобы ширина текста на странице была $$7$$ сантиметров, напишите в преамбуле так:

    \textwidth=7cm

    При изменении ширины текста часто приходится менять и поля. Для этого предусмотрен параметр, регулирующий размер левого поля (коль скоро левое поле и \textwidth заданы, правое поле определяется автоматически). Способ задания левого поля зависит от того, является ли набор в данном стиле "двусторонним" или нет. Выше объяснялось, что при двустороннем наборе на страницах с четными и нечетными номерами оставляются разные поля. В классах документов article и report набор по умолчанию односторонний, но он будет двусторонним, если указать стилевую опцию twoside. В классе book набор по умолчанию двусторонний, но можно сделать его односторонним, если указать стилевую опцию oneside.

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

    oddsidemargin=0pt

    то текст будет начинаться на расстоянии один дюйм от края, а если будет сказано

    \oddsidemargin=5mm

    то отступ от края бумаги составит $$30.4 мм$$ (вспомним, что один дюйм равен $$2.54 см$$ ). Если присвоить параметру \oddsidemargin отрицательное значение, то расстояние от края листа до начала текста будет, соответственно, меньше дюйма. Нелишне также напомнить, что когда вы присваиваете параметру со значением длины нулевое значение, то все равно должна быть указана какая-то единица длины (как у нас в примере); запись наподобие

    \oddsidemargin=0

    является ошибочной.

    Все сказанное относилось к одностороннему набору. При двустороннем наборе параметр \oddsidemargin также используется, но смысл его несколько иной: на сей раз он задает размеры левого поля только для страниц с нечетными номерами. Что же касается страниц с четными номерами, то размеры левого поля для них задаются параметром \evensidemargin.

    При наборе текста в две колонки используются еще два параметра. Во-первых, параметр \columnsep задает расстояние между колонками; во-вторых, колонки можно при желании разделить не только пробелом, но и вертикальной линейкой. Ширина этой линейки задается параметром \columnseprule. В стандартных стилях значение этого последнего параметра установлено равным нулю, так что линейка между колонками не печатается; чтобы линейка была, надо в преамбуле присвоить параметру \columnseprule значение, отличное от нуля (в этом случае ширина разделяющей колонки линейки включается в \columnsep ). Хорошее ненулевое значение параметра \columnseprule — 0.4pt.

    Высота

    Размер верхнего поля задается параметром \topmargin ; как и в случае с левым полем, это — расстояние не непосредственно от края листа, а от линии, параллельной краю и отстоящей от него на один дюйм. При этом надо сознавать не только от чего, но и до чего отсчитывается это расстояние: именно, \topmargin — это расстояние до колонтитула. Если же колонтитул на странице отсутствует (например, потому, что он не предусмотрен стилем), то вверху страницы дополнительно будет пустое пространство, размер которого равен месту, отводимому на колонтитул (параметр \headheight ) плюс отступ между колонтитулом и основным текстом (параметр \headsep ). Высота текста задается параметром \textheight. При исчислении этого размера не учитываются ни номера страниц, ни колонтитулы, так что, если они предусмотрены классом, полная высота текста на странице будет больше, чем \textheight.

    Высоту страницы также можно изменять, присваивая в преамбуле параметру \textheight новое значение, но если класс предусматривает, что все страницы должны иметь одинаковую высоту и ниже по поводу того, когда именно так бывает), то высоту текста нельзя устанавливать совсем уж произвольно: необходимо согласовать ее значение с параметрами \topskip и \baselineskip. Не вдаваясь в подробности, скажем, что первый из этих параметров определяет расстояние от низа первой строкиТочнее говоря, от ее базисной линии: см. лекцию 8. до "верхнего обреза" основного текста страницы, в то время как параметр \baselineskip определяет расстояние между строками и зависит от используемого шрифта (будем надеяться, что вы не станете менять его значение, не изучив предварительно книгу [2]). Так или иначе, значение \textheight следует устанавливать таким образом, чтобы отношение$$\frac{\mbox{\cs(textheight)}- \mbox{\cs(topskip)}}{\mbox{\cs(baselineskip)}}$$ было целым числом. В LaTeX'овском стандарте topskip всегда равен 10 пунктам. Что же до \baselineskip, то он равен 12 пунктам, если основной шрифт кегля 10, $$13.6$$ пункта, если основной шрифт кегля 11, и $$15$$ пунктам в кегле 12.

    Можно и не знать точно этих размеров, но вычислить нужную величину \textheight средствами самого TeX'а: именно, если вы, скажем, хотите, чтобы на странице помещалось 40 строк, то напишите в преамбуле (после команды, изменяющей интерлиньяж, если вы таковой пользовались) следующее:

    \setlength{\textheight}{40\baselineskip}
    \setlength{\textheight}{\baselinestretch\textheight}
    \addtolength{\textheight}{\topskip}

    (см. лекцию 8 по поводу \setlength и \addtolength ).

    Сдвиг страницы как целого

    Иногда при печати вы можете обнаружить, что реальные расстояния от текста до края листа не такие, как предписано параметрами наподобие \topmargin. Дело в том, что у принтера, которым вы пользуетесь, могут быть свои представления о том, где находится край листа бумаги. Чтоб эти представления соответствовали реальности, понадобится настройка принтера и/или dvi-драйвера, используемого вами для распечатки. Если вы не хотите этим заниматься, можно просто изменить расположение всей страницы в целом на печатном листе. Для этого следует установить (в преамбуле) значения двух TeX'овских параметров: \hoffset и \voffset. Например, если в преамбуле написано

    \hoffset=-5mm
    \voffset=4.2mm

    то вся страница в целом (со всеми колонтитулами, номерами страниц и пр.)\ будет сдвинута при печати на $$5\,\rm мм$$ влево и на $$4{,}2\,\rm мм$$ вниз.

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

    (рис 4.1) Лайот

    Рубрикация документа

    Работая с LaTeX'ом, разумно делать заголовки и нумерацию разделов документа не вручную, а с помощью специальных команд. Сначала разберем, как ими пользоваться, на примере команды \section.

    Команда \section

    Пусть вам нужно начать раздел документа, озаглавленный " Кое-что о слонах". Для этого в исходном тексте можно написать так:

    \section {Кое-что о слонах}

    Команда \section принимает один обязательный аргумент — название раздела (это же название пойдет в колонтитулы, если таковые предусмотрены классом, и в оглавление, если вы дадите команду " создать оглавление" — см. ниже ). Промежутки между разделами, их нумерация, те же колонтитулы — все это делается автоматически.

    Кроме обязательного аргумента, у команды \section предусмотрен и необязательный. Необязательный аргумент идет перед обязательным; в нем записывается вариант заголовка, предназначенный для оглавления и колонтитулов (если класс предусматривает, что заголовок войдет в колонтитул). Обычно этот вариант — просто сокращенный заголовок. Пример:

    \section[О слонах]{Кое-что о слонах}"

    Необходимость в сокращенном варианте заголовка возникает, когда оказывается, что заголовок по длине не помещается в колонтитул. Это, конечно, будет видно при просмотре; кроме того, при трансляции в этом случае выдается такое сообщение:

    Overfull \hbox has occurred while \output was active.

    Раздел можно пометить командой \label. После этого команда \ref будет выдавать номер этого раздела. Пример:

    $$\hbadness 2000 \noindent{\Large\bf 3.2\quad Кое-что о слонах}\par \vskip2.3ex В этом разделе нашей книги речь пойдет в основном о слонах. Слоны (см. определение в разд.~3.2) --- большие и сильные животные$$.
    \section{Кое-что о слонах}
    \label{elephants}
    В этом разделе нашей книги
    речь пойдет в основном о
    слонах. Слоны
    (см. определение в
    разд.~\ref{elephants})~---
    большие и сильные животные.

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

    Иногда хочется, чтобы сокращенный вариант заголовка попал только в колонтитул, а в оглавлении был его полный вариант. Как этого добиться, рассказано в лекции 9.

    У команды \section есть вариант "со звездочкой". Команда section* начинает новый раздел, не нумеруя его; на оглавлении и колонтитулах наличие раздела, вводимого этой командой, никак не отразится. У команды \section* предусмотрен только обязательный аргумент.

    Какие бывают разделы документа

    Теперь перечислим все команды для задания разделов документа, предоставляемые стандартными классами LaTeX'а. Большинство из них работает совершенно аналогично команде \section ; все отличия мы сейчас перечислим.

    Для оформления разделов существуют такие команды:

    \part \chapter \section \subsection
    \subsubsection \paragraph \subparagraph

    В этом перечне каждая последующая команда обозначает более мелкий подраздел, чем предыдущая. Следует иметь ввиду, что команда \chapter (глава) в классах proc и article не определена (благодаря этому обстоятельству статью легко переделать в главу книги), остальные команды определены в четырех основных классах.

    Стандартные классы обеспечивают нумерацию разделов, при которой более мелкий раздел "подчинен" более крупному: когда, например, начинается новый раздел \section, нумерация разделов \subsection и более мелких начинается заново. Исключением из этого правила является команда \part (" часть"): если часть 2 кончается главой 5, то первая из глав части 3 будет иметь номер 6, а не 1. При модификации стандартных классов можно менять как принцип нумерации разделов, так и вид этих "номеров" на печати (например, если мы захотим, чтобы разделы обозначались последовательными буквами алфавита).

    Все то, что мы говорили про необязательный аргумент и вариант " со звездочкой" у команды \section, применимо и к командам, перечисленным в этом разделе. "Слишком мелкие" разделы, согласно стандартным классам, не отражаются ни в оглавлении, ни в колонтитулах и не нумеруются, но, если вы употребите задающие их команды с необязательным аргументом или со звездочкой, ошибкой это не будет.

    В разделах, создаваемых описанными выше командами, первый абзац набирается без абзацного отступа (за исключением самого мелкого раздела \subparagraph ), причем LaTeX устроен таким образом, что создать этот отступ вам так просто не удастся. Если вы хотите, чтобы отступ в первом абзаце все-таки присутствовал, обратитесь к лекции 9, посвященной модификации стандартных классов.

    Изменение стандартных заголовков

    Возможно, вы уже обратили внимание, что главы, создаваемые LaTeX'ом с помощью команды \chapter, так и называются " Chapter", а не "Глава". Это — один из нескольких случаев, когда классы LaTeX'а используют для различных стандартных надписей английские слова. В некоторых русификациях LaTeX'а предусмотрены стилевые пакеты, переименовывающие эти названия в русские.

    Если такой русификации у вас нет, то придется решить эту проблему своими силами. Для этого в преамбулу документа надо внести следующую команду:

    \renewcommand{\chaptername}{Глава}

    Делать это надо, конечно, только в том случае, если команда \chapter предусмотрена в используемом вами классе. О команде \renewcommand, используемой для переопределения значений уже существующих команд, рассказывается в лекции 7.

    Приведем список остальных надписей, делаемых LaTeX'ом по-английски, вместе с их русскими переводами и командами, которые надо переопределить с помощью \renewcommand для того, чтоб на печати появлялись именно эти переводы. В нескольких ближайших разделах мы объясним, как именно получить на печати упоминаемые в этой таблице список таблиц, список иллюстраций и т.п.

    \chaptername Chapter Глава
    \contentsname Contents Оглавление (или Содержание)
    \listfigurename List of Figures Список рисунков
    \listtablename List of Tables Список таблиц
    \abstractname Abstract Аннотация
    \refname References Литература
    \bibname Bibliography Литература
    \indexname Index Предметный указатель
    \figurename Figure Рис.
    \tablename Table Таблица
    \partname Part Часть
    \appendixname Appendix Приложение

    Пояснений эта таблица не требует, за одним исключением: если класс документа есть article или proc, то для получения русского названия списка литературы надо переименовать команду \refname, а если report или book — то команду \bibname. Пожалуйста, не перепутайте эти два случая, иначе LaTeX зафиксирует ошибку и выполнять вашу команду откажется.

    До и после основного текста

    В классах article, report и proc предусмотрена возможность оформить аннотацию ко всему документу. Это делается с помощью окружения {abstract}. До начала основного текста следует поместить текст аннотации между \begin{abstract} и \end{abstract}. Этот текст будет автоматически озаглавлен "Abstract", если не подключать русифицирующий стилевой пакет и если вы сами не переопределили команду \abstractname (см. предыдущий пункт).

    Команда \appendix означает, что с этого места начинается приложение к документу. Сама она никакого текста не производит, а делает вот что:

  • начинает заново нумерацию разделов документа;
  • "самые крупные" разделы документа ( \section в классах article и proc, \chapter в двух других основных классах) начинают нумероваться не цифрами, а прописными латинскими буквами;
  • если определена команда \chapter, то главы будут с этого момента называться не "Chapter", а так, как определено в команде \appendixname (см. предыдущий пункт).
  • Если класс вашего документа — book, то можете воспользоваться услугами команд \frontmatter, \mainmatter и \backmatter. Командой \frontmatter открывается "вводная часть" книги: после этой команды страницы начинают нумероваться римскими цифрами (как если бы мы сказали \pagenumbering{roman} ). В той части текста, на которую распространяется действие команды \frontmatter, главы не нумеруются. Переход к основной части книги задается командой \mainmatter: печать начинается с новой страницы, страницы начинают нумероваться заново арабскими цифрами. Наконец, команда \backmatter задает переход к заключительной части книги: главы перестают нумероваться (нумерация страниц не меняется).

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

    Если в аргументе команды \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 команды для расстановки диакритических знаков , смены текущего шрифта и установки промежутков вручную .

    Титульный лист, оглавление, список литературы, аннотация

    Титульный лист

    Для того, чтобы оформить заголовок ко всему документу, надо сделать две вещи: задать информацию для заголовка (автор, название и т.п.) и дать LaTeX'у команду этот заголовок сгенерировать. Второе делается с помощью команды \maketitle. Она создаст титульный лист, если это предусмотрено классом и опциями. (Если титульный лист не предусмотрен, то команда \maketitle разместит заданную вами информацию об авторе, заглавии и прочем на первой странице, выбрав подходящие шрифты и сделав подобающие отступы между титульной информацией и текстом.) По умолчанию для классов report и book титульный лист создается всегда (и не создается, если указана классовая опция notitlepage ), для класса article титульный лист не создается (но будет создан, если указать классовую опцию titlepage ). В классе proc титульная информация всегда печатается на первой странице текста.

    Так как команда \maketitle генерирует текст, ее нельзя помещать в преамбуле документа.

    Теперь объясним, как задавать LaTeX'у информацию для титула. Автор задается с помощью команды \author. Она принимает единственный обязательный аргумент — имя автора (в том виде, как вы хотите его видеть на титуле). Если авторов несколько, их имена должны быть разделены командой \and.

    Заглавие задается с помощью команды \title. Если заглавие длинное, можно самому задать его разбиение на строки с помощью команды \\ ; если этого не сделать, заглавие будет разбито на центрированные строки автоматически, как если бы это был абзац в окружении {center}.

    Следующий элемент информации для титула — команда \date. Она имеет один обязательный аргумент, в котором можно задать любой текст (например, дату, в согласии с переводом слова date), который будет размещен на титульном листе (или перед началом основного текста, если титульный лист не предусмотрен классом и/или опциями) в одной или нескольких центрированных строках (так же, как и текст, задаваемый в аргументе команды \title ). В частности, можно оставить аргумент этой команды "пустым", если сказать \date{} - тогда соответствующий текст вообще не появится. Но если вы вообще не дадите эту команду, хотя бы и с пустым аргументом, то LaTeX напечатает на титуле дату своего запуска, причем по- английскиИли по-русски, если это предусмотрено в используемой вами русификации..

    Команды \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 надо указать их обозначения через запятую. Приведем пример (в котором для экономии места мы опустили заголовок "Список литературы"):

    $${\advance\Leftex-1mm \makeatletter%\hbadness 1500 \def\thebibliography#1{%Начисто сперто из report.sty (исключена % команда \chapter) \list {\@biblabel{\arabic{enumiv}}}{\settowidth\labelwidth{\@biblabel{#1}}% \leftmargin\labelwidth \advance\leftmargin\labelsep \usecounter{enumiv}% \let\p@enumiv\@empty \def\theenumiv{\arabic{enumiv}}}% \def\newblock{\hskip .11em plus.33em minus.07em}% \sloppy\clubpenalty4000\widowpenalty4000 \sfcode`\.=\@m}% \def\endthebibliography{% \def\@noitemerr{\@warning{Empty `thebibliography' environment}}% \endlist}% В~[3, гл.~1] описана встреча Винни-Пуха с несколькими пчелами. В~[1, 2] приведены другие сведения о медведях. \par \begin{thebibliography}{99} \bibitem{voevoda} М.\,Е.\,Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.\,Н.\,Толстой. Три медведя. \bibitem{Winnie} А.\,А.\,Милн. Винни-Пух. \end{thebibliography} \exb \begin{verbatim} В~\cite[гл.~1]{Winnie} описана встреча Винни-Пуха с несколькими пчелами. В~\cite{voevoda,med3} приведены другие сведения о медведях. \begin{thebibliography}{99} \bibitem{voevoda} М.\,Е.\,Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.\,Н.\,Толстой. Три медведя. \bibitem{Winnie} А.\,А.\,Милн. Винни-Пух. \end{thebibliography} \end{verbatim} }$$
    В \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. Если это заглавие печатается по-английски, его можно переопределить .

    Предметный указатель

    В отличие от списка литературы, который при использовании описанных выше команд \cite и \bibitem получается совершенно автоматически, процесс создания указателя автоматизирован в LaTeX'е не полностью. Именно, вы можете сделать две вещи:

  • Если вам уже известно, какие термины должны войти в указатель и на каких страницах они расположены, можно организовать печать предметного указателя с помощью окружения {theindex}. Если предметный указатель должен завершать документ, то можно, на худой конец, напечатать весь документ, кроме указателя, и вручную выписать требуемые номера страницУ вас может возникнуть искушение пометить все места, на которые надо сослаться, с помощью команды \label, а в окружении {theindex} получить номера страниц с помощью \pageref. При этом, однако, есть опасность, что TeX'у не хватит памяти для обработки такого огромного числа ссылок..
  • Можно также (и на практике это удобнее) специальным образом пометить в файле термины, на которые вы собираетесь ссылаться в предметном указателе. При этом средствами LaTeX'а создается полуфабрикат, из которого предметный указатель получится после обработки отдельной программой (называемой обычно makeindex, а в русской версии — rmakeindex или как-нибудь еще в этом роде), входящей в настоящее время почти во все поставки LaTeX'а.
  • Начнем с того, что расскажем о втором способе создания индекса, а потом объясним, что можно сделать, если программа для генерации индекса вам по какой-то причине недоступна.

    Общие положения

    Чтобы разметить файл для автоматической генерации индекса, нужно сделать две вещи. Во-первых, в преамбулу документа необходимо включить команду \makeindex. Во-вторых, при условии, что это сделано, можно пометить те места в тексте, на которые вы хотите сослаться в предметном указателе, командой \index (если команда \makeindex в преамбуле отсутствует, то команды \index ничему не мешают, но и никакого действия не оказывают). У этой команды один обязательный аргумент — текст вашей пометки (в простейшем случае такая пометка — это ключевое слово будущего предметного указателя). Информация о том, на какие страницы попали ваши пометки, будет записана в специальный файл с тем же именем, что и у вашего файла, и расширением idx (мы будем называть его idx-файлом). Пусть, например, в исходном файле встречались такие фрагментыВ наших примерах мы используем русские буквы, хотя на самом деле использование русских букв в предметном указателе зависит от применяемой вами русификации. Прежде всего, в ее состав должна входить версия программы makeindex, учитывающая русский алфавитный порядок. Кроме того, иногда (например, при использовании русского варианта пакета babel) в idx-файл попадают не русские буквы, а их условные обозначения, а в других случаях (при использовании старых версий TeX'а) их шестнадцатеричные коды, и это создает дополнительные сложности. Возможны также сложности с буквой "ё" при сортировке. При подготовке этой книги использован вариант русификации (см. приложение E), где такие проблемы не возникают.:

    Многие люди любят домашних кошек.\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 \ORsubitem IBM-совместимые, 28 \ORsubsubitem ремонт, 35 \ORsubsubitem цены, 30 \ORsubitem болгарские, 26 \item Принтеры, 40 \indexspace \item Кошки, 120 \item Собаки, 140--156 \end{THEindex}$$
    \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 (подрисуночная подпись; см. следующий раздел) и т.п.

    Простейшие средства

    В простейшем случае программа makeindex вызывается такНапомним, что конкретное название программы и возможность использования русских букв может зависеть от используемой системы и русификации. См. приложения E и Ж :

    \makeindex исходный_файл

    Если исходный_файл имеет расширение idx (так скорее всего и будет, поскольку исходный файл — это, как правило, сгенерированный LaTeX'ом idx-файл), то это расширение можно не указывать. В результате работы программы makeindex появится файл с тем же именем, что у исходного файла, и расширением ind. Это — готовый файл для предметного указателя, который остается только включить в ваш документ с помощью команды \input. Создается также файл с тем же именем и расширением ilg. Это — протокол работы программы makeindex.

    Если не предпринимать специальных мер, то все записи в ind-файле, созданном программой makeindex, будут равноправны — все они будут вводиться командой \item. Чтобы предметный указатель был устроен иерархически, как в примере на стр.178 , надо в аргументе команды \index после заглавного слова поставить восклицательный знак, а после него — подчиненное ему слово. Возможно также подчинение второго порядка — тогда нужен еще один восклицательный знак. Вот пример:

    Многие люди любят домашних кошек.\index{Кошки!домашние}
    ....
    Ваша киска\index{Кошки!домашние!уход} купила бы...
    ....
    Хорошо также иметь собаку.\index{Собаки}
    .....
    Мало кто рискнет держать дома такую дикую
    кошку,\index{Кошки} как тигр. Пудель\index{Собаки}
    гораздо безопаснее.

    При обработке этого файла LaTeX'ом получится idx- файлВ том, конечно, случае, если в преамбуле была команда \makeindex . ; в результате обработки idx-файла программой makeindex получится ind-файл, включающий в себя, в частности, следующее (предположим, что наши команды \index попали на страницы с номерами 2, 7, 8, а две последние — на страницу 9):

    \begin{theindex}
    ...
      \item Кошки, 9
        \subitem домашние, 2
          \subsubitem уход, 7
    ...
      \item Собаки, 8, 9
    ...
    \end{theindex}

    Из сказанного следует, что при обработке idx-файла с помощью программы makeindex восклицательный знак в аргументе команд \index имеет особый статус. Чтобы программа \makeindex восприняла восклицательный знак просто как типографский значок, надо в аргументе \index предварить его знаком кавычки ":

    \index{Восклицательный знак ("!)}
    \index{Междометия!Эх"!}

    Эти аргументы команд \index дословно скопируются в idx-файл, а после его обработки программой makeindex в ind-файл запишется примерно вот что:

    \item Восклицательный знак (!), 14
    \item Междометия
      \subitem Эх!, 6

    Наряду с восклицательным знаком, особый статус с точки зрения программы makeindex имеет символ @ (" коммерческое at"), вертикальная черточка | (в следующем разделе вы узнаете, в чем этот статус заключается), а также сама кавычка ". Если вы хотите употребить один из этих четырех значков в аргументе команды \index просто как символ, не вкладывая в него специального смысла, надо поставить перед ним кавычку ".

    Исключение: кавычку, входящую в состав TeX'овской команды \", можно (и нужно) записывать без предосторожностей:

    \index{Кавычка ("")}
    \index{Ёлочка}
    \index{H\"uhnchen}

    При этом соответствующие записи в idx-файле могут получиться такими:

    \item Ёлочка, 8
    \item Кавычка ("), 6
    \item H\"uhnchen, 12

    Тонкости

    Для каждого ключевого слова программа makeindex собирает все относящиеся к нему номера страниц и записывает их в ind - файле после этого слова через запятую. Если при этом попадутся три или более идущих подряд номера страниц, то в ind - файл будут записаны только первый и последний из этих номеров, через короткое тире (en-dash). Такие пары страниц через короткое тире можно организовывать и вручную. Пусть, например, в какой-то части вашего текста все время идет речь о кошках. Тогда можно в начале этой части написать

    \index{Кошки|(}

    а в конце ---

    \index{Кошки|)}

    Если первая из этих команд попала на страницу 9, а вторая - на страницу 77, то после обработки idx - файла программой makeindex в ind - файл попадет запись

    \item Кошки, 9--77

    Команды index{Кошки}, оказавшиеся между страницами 9 и 77, будут при этом проигнорированы.

    При сортировке программа makeindex принимает во внимание не только буквы, но и спецзнаки, записанные в аргументе команды \index. Иногда это нежелательно: если в тексте имеются команды \index{Аист} и \index{\textbf{Ящерица}}, то ящерица может оказаться в ind-файле раньше аиста, если makeindex будет считать, что запись для нее начинается с символа "\", который идет раньше всех русских буквОн может идти и позже — в зависимости от конкретной версии программы makeindex и ее отношения к русским буквам.. Чтобы избежать такого рода неприятностей, предусмотрена возможность по отдельности задать слово, которое будет участвовать в сортировке, и текст, который будет реально записан в ind-файл. В приведенном выше примере следовало бы написать

    \index{Ящерица@\textbf{Ящерица}}

    Теперь ящерица попадет туда же, куда и все прочие слова на букву "я", но при этом будет напечатана жирным шрифтом. Общее правило такое: если в аргументе команды \index присутствует символ @, то при сортировке учитывается только то, что написано левее него, а в ind - файл записывается только то, что правее него. Можно задавать отдельные тексты для сортировки и для печати не только для основного заглавного слова, но и для слов, ему подчиненных:

    \index{Ящерицы@\textbf{Ящерицы}!игуана@\textbf{игуана}}

    Напоминание: если перед @ или | стоит кавычка ", то эти значки рассматриваются просто как символы.

    Программа makeindex может оформлять номера разных страниц по-разному. Пусть, например, вы считаете, что одно из мест в тексте, где говорится о кошках, является особо важным, и хотите, чтобы номер соответствующей страницы был подчеркнут (по аналогии с указателем к книге TeXbook [2]). Тогда можно поставить в этом месте команду

    \index{Кошки|underline}

    Предположим, что эта команда попала на страницу 100, и, кроме того, в тексте были две команды \index{Кошки}, попавшие на страницы 15 и 47. Тогда после обработки idx-файла программой makeindex в ind-файле появится такая строка:

    \item Кошки, 15, 47, \underline{100}

    Общее правило таково: команда \index{XXX|abcd} порождает в ind-файле строку

    \item XXX, \abcd{y}

    (здесь $$y$$ - номер страницы).

    Если вы хотите номер страницы не подчеркнуть, а выделить другим шрифтом, разумно воспользоваться одной из команд для смены шрифта, работающих как команда с одним аргументом (см. выше).

    Среди символов "abcd" не должно быть круглых скобок (сочетания "|(" и "|)" имеют, как было сказано выше, особый смысл); если вы хотите оформить таким образом номер страницы к "подчиненному", а не заглавному термину, то именно после подчиненного термина (того, после которого должен реально появиться номер страницы) и надо писать |abcd:

    \index{Кошки!Ангорские|textbf}

    Настройка программы makeindex

    В предыдущих разделах мы объясняли, как и какую информацию можно передавать программе makeindex. Теперь объясним, как добиться того, чтобы она обрабатывала эту информацию по-иному.

    Если "запустить программу makeindex с ключом c", то есть сказать

    makeindex -c  исходный\_файл

    то при обработке idx-файла программой makeindex пробелы в начале и конце записей будут игнорироваться, а два и более пробела будут рассматриваться как один. Благодаря этому записи \index{Кошка} и \index{ Кошка} будут рассматриваться как относящиеся к одному и тому же ключевому слову. Без этого ключа программа {makeindex} отведет в указателе отдельную строку для кошки, начинающейся с пробела.

    Можно задать по своему усмотрению имя файла, в который программа makeindex запишет результаты своей работы. Для этого надо воспользоваться ключом o (в примере мы употребили еще и ключ c, но это не обязательно):

    makeindex -c -o выходной\_файл исходный\_файл

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

    Наконец, можно запустить программу makeindex вместе со стилевым файлом, стилевой файл в котором программе будут даны указания по поводу вида, в котором будет записан отсортированный и обработанный idx - файл. Написав подходящий стилевой файл для makeindex, можно радикально изменить вид ind-файла — так, что он вообще не будет иметь ничего общего с LaTeX'овским файлом (это может иметь смысл: makeindex задуман как программа широкого профиля, пригодная не только для LaTeX'а). Как добиться столь революционных изменений, мы обсуждать не будем (интересующиеся могут узнать все подробности из оригинальной документации), но о некоторых вещах, полезных именно для LaTeX'а, расскажем.

    Чтобы подключить стилевой файл к makeindex, надо запустить эту программу с ключом s, после которого, через пробел, указывается имя стилевого файла (по традиции он имеет расширение ist). Если стилевой файл называется mystyle.ist, то можно сказать так:

    makeindex -s mystyle.ist исходный_файл

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

    \begin{theindex}

    в начало ind-файла и

    \end{theindex}

    в его конец. Часто требуется, чтобы в начало или конец ind - файла автоматически записывалось что-то еще (команда \sloppy в начало, например). Для того, чтобы после \begin{theindex} было на отдельной строке написано еще и \sloppy, надо в стилевом файле написать так:

    preamble "\\begin{theindex}\n
            \\sloppy\n"

    Здесь preamble - имя стилевого параметра, определяющего, что записывается в начало всякого ind - файла. Остальной текст — содержание этой записи. Правила записи в стилевом файле для makeindex таковы:

  • строковая константа, задающая стилевой параметр, ограничена с обеих сторон знаками "(кавычки);
  • эта строковая константа может реально состоять и из нескольких строк; место, где кончается одна строка и начинается другая, обозначается \n (конец строки воспринимается просто как пробел и не означает конца строки в ind - файле);
  • если в строковую константу должны входить символы \ или ", то их надо обозначать \\ и \" соответственно, а все остальные символы набираются непосредственно.
  • Параметр postamble определяет, что записывается в конец ind - файла. По умолчанию это

    "\n\n\\end{theindex}\n"

    (иными словами: начать с новой строки, одну строку пропустить, написать \end{theindex}, строку закончить).

    Следующие три параметра определяют, чем отделяются номера страниц от ключевых слов: "delim_0" — для ключевых слов "верхнего уровня", "delim_1" и "delim_2" — для слов первого и второго уровня подчинения. По умолчанию все три этих параметра определены как ", "(запятая и пробел), вследствие чего номера страниц отделяются от слов запятыми. В русских текстах эти запятые ставить не принято, поэтому все три этих параметра стоит переопределить на "":

    $$\begin{Example} \verb?delim_0 ""?\\ \verb?delim_1 ""?\\ \verb?delim_2 ""? \end{Example}$$

    Параметр "group_skip" определяет, что записывается в ind - файл между группами слов, начинающихся на одну букву. Значение по умолчанию - "\\n\n \\indexspace\n" (" пропустить строку, написать слово \indexspace и начать с новой строки").

    Перед каждой группой терминов, начинающихся с новой буквы, можно (как это и сделано в указателе к книге, которую вы держите в руках) напечатать на отдельной строке эту букву. Для этого в стилевом файле надо написать

    headings_flag 1

    При этом буквы будут напечатаны тем же шрифтом, что и остальной текст указателя. Чтобы шрифт был другим, надо в стилевом файле определить параметры heading_prefix и heading_suffix. Первый из них определяет, какой TeX'овский текст запишется в ind - файл перед буквой, второй — что запишется после буквы. Если, например, нужно, чтобы шрифт, которым печатаются буквы-заголовки, имел размер \large и был полужирным, то можно написать

    heading_prefix "{\\normalfont\\large\\bfseries "
    heading_suffix "}"

    (вспомните, что для получения символа \ надо написать \\; пробел после bfseries необходим, чтобы в ind-файле имя команды не слилось с последующей буквой).

    Если в указателе присутствуют термины, начинающиеся с символа, не являющегося буквой, то они будут выделены в отдельную группу; если в стилевом файле написано headings_flag 1, то перед этой группой будет напечатано слово Symbols. Если вас это не устраивает, надо в стилевом файле определить строковую константу symhead_positive. Если, например, написать

    symhead_positive ""

    то перед этой группой вообще никакого заголовка не будет; если хотите, чтобы вместо Symbols был другой заголовок, напишите вместо "" этот заголовок (в двойных кавычках, разумеется).

    Если программы makeindex нет

    Теперь рассмотрим вторую возможность — как самостоятельно обработать автоматически созданный с помощью LaTeX'а полуфабрикат предметного указателя.

    Если не писать самостоятельно программу для обработки idx-файлов, то можно, по крайней мере, сделать следующее.

    Во-первых, надо отсортировать строки idx-файла (средствами текстового редактора, например). После этого остается проблема, что делать с командами \indexentry. После того, как вы отсортируете idx - файл (и сохраните, для надежности, отсортированный файл под другим именем, скажем, myindex.tex), надо определить команду \indexentry таким образом, чтобы она делала ту же работу, которую призван делать \item. Для этого надо написать в преамбуле следующее:

    \newcommand{\indexentry}[2]{item #1 #2}

    После этого TeX будет воспринимать каждую запись вида

    \indexentry{Кошки}{5}

    так же, как если бы вместо этого было написано

    \item Кошки 5

    и можно будет просто написать в конце документа

    \begin{theindex}
    \input{myindex.tex}
    \end{theindex}

    Пока что воспринимайте этот рецепт чисто догматически; по прочтении лекции 7, в которой подробно рассмотрен процесс определения новых команд, вы поймете, почему этот рецепт работает.

    Плавающие иллюстрации и таблицы

    Простейшие средства

    Чтобы разместить в тексте иллюстрацию, удобно воспользоваться окружением figure. Стоящий между \begin{figure} и \end{figure} текст автоматически размещается LaTeX'ом в таком месте, где он укладывается целиком (не переходя со страницы на страницу); это может быть не на "своей" странице, а позже. В последнем случае говорят, что иллюстрация "всплыла" на следующей странице; именно поэтому окружение figure называют еще " плавающая иллюстрация".

    Команда \caption позволяет сделать подрисуночную подпись. Эта команда имеет один обязательный аргумент — текст подписи. На печати подпись состоит из слова, определенного командой \figurename (" Figure-", если не переопределять эту команду — см. выше), порядкового номера иллюстрации, присвоенного ей LaTeX'ом, и подписи, указанной в аргументе команды. Команду \caption можно давать в любом месте между \begin{figure} и \end{figure}: в соответствующем месте появится на печати и сгенерированная ею подпись. Разумно поэтому ставить команду \caption либо в конце окружения figure (тогда подпись будет размещена под иллюстрацией), либо в его начале (подпись появится над иллюстрацией).

    Если команду \label поместить внутри окружения figure после команды \caption, то команда \ref ссылка на плавающую иллюстрацию} будет генерировать номер иллюстрации. Например, рис.4.2 получился так:

    Например, рис.~\ref{void} на с.~\pageref{void}...
    ...
    \begin{figure}
    \vspace*{2.5cm}
    \caption{Белый квадрат
    на белом фоне}\label{void}
    \end{figure}
    (рис 4.2) Белый квадрат на белом фоне

    Внутри одного окружения figure может быть несколько команд \caption, и каждую из них можно пометить своей командой \label. Подчеркнем, что само по себе окружение figure номера рисунка не создает.

    На подписи к рис.4.2 после номера стоит точка. К сожалению, согласно LaTeX'овскому стандарту в этом месте ставится не точка, а двоеточие, что в русском тексте выглядит неудачно. В лекции 9 объясняется, как с этим можно бороться.

    У окружения figure предусмотрен необязательный аргумент, с помощью которого можно высказать LaTeX'у свои пожелания по поводу размещения иллюстрации в тексте. Именно, после \begin{figure} (без пробела) можно поместить в квадратных скобках одну или несколько из следующих четырех букв, имеющих такие значения:

    t разместить иллюстрацию в верхней части страницы;
    b разместить иллюстрацию в нижней части страницы;
    p разместить иллюстрацию на отдельной странице, целиком состоящей из "плавающих" иллюстраций (или таблиц — см. ниже);
    h разместить иллюстрацию прямо там, где она встретилась в исходном тексте, не перенося ее никуда.

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

    \begin{figure}[tbp]

    При наборе текста в две колонки полезно использовать не только само окружение figure, но и его вариант "со звездочкой": если сказать

    \begin{figure*}

    то при наборе текста в одну колонку это не будет ничем отличаться от окружения figure без звездочки, а при наборе текста в две колонки создаст иллюстрацию шириной в целую страницу (без звездочки получилось бы шириной в одну колонку). Если окружение открывается командой \begin{figure*}, то и закрываться оно должно командой со звездочкой.

    Если при наборе в две колонки задать окружение figure (без звездочки) с необязательным аргументом p, то для печати иллюстраций будет выделена не отдельная страница, но отдельная колонка. При подключении стилевого пакета multicol пользоваться окружениями со звездочкой {figure*} и {table*} (см. ниже) нельзя.

    Окружение {table} определяет " плавающие таблицы". Все свойства этого окружения дословно совпадают с соответствующими свойствами окружения {figure}, за двумя исключениями: во-первых, подпись, генерируемая командой \caption, начинается со слова, определенного в команде \tablename, и переопределять, при необходимости, надо именно эту команду, и во-вторых, таблицы нумеруются независимо от иллюстраций. Кстати, подпись к таблице принято делать не снизу, как к иллюстрации, а сверху. Окружение {table*} при наборе текста в две колонки определяет таблицы шириной в целую страницу.

    В документе можно, при желании, получить автоматически сгенерированные списки иллюстраций и/или таблиц. Для этого используются команды \listoffigures (для иллюстраций) и \listoftables (для таблиц). Их работа аналогична команде \tableofcontents, генерирующей оглавление: материал для этих списков собирается в специальные файлы с расширениями lof (для иллюстраций) и lot (для таблиц); при каждом запуске LaTeX'а информация, записанная в этих таблицах, относится к предыдущему запуску, так что в самом конце может понадобиться запустить LaTeX лишний раз; наконец, команда \caption может принимать необязательный аргумент — вариант подписи под иллюстрацией или таблицей, предназначенный для включения в список иллюстраций или таблиц соответственно. Этот необязательный аргумент записывается (в квадратных скобках, как обычно) перед обязательным.

    Как окружение {figure} не рисует картинок, так и окружение {table} только размещает таблицу на страницах документа, но не создает ее текста. Как набирать таблицы в LaTeX'е, мы расскажем в лекции 6.

    В разд.9.7 мы расскажем о том, как можно модифицировать оформление плавающих иллюстраций и таблиц.

    Рисунки в оборку

    (рис 4.5) РисунокОкружения {figure} и {table} определяют иллюстрации и таблицы, простирающиеся на всю ширину текста, и ничего иного в стандартном комплекте LaTeX'а не предусмотрено. Пользователями LaTeX'а разработано несколько стилевых пакетов, позволяющих с большим или меньшим успехом печатать прямоугольные иллюстрации, обтекаемые текстом. В этом разделе мы расскажем о возможностях, предоставляемых стилевым пакетом {wrapfig}. Этот пакет, разработанный Дональдом Арсено (Donald Arseneau), довольно удобен на практике (по крайней мере, автор книги и его коллеги не без успеха им пользуются), хотя, конечно, размещение обтекаемых текстом иллюстраций полностью автоматизировано быть не может и всегда требует определенной ручной работы. Ниже мы опишем основные принципы использования пакета {wrapfig}, но реально пользоваться им вы сможете только после того, как освоите следующую лекцию о псевдорисунках или (что лучше) приложение Б, посвященное интеграции в TeX графических файлов в формате PostScript.

    Итак, предположим, что стилевой пакет {wrapfig} подключен. Тогда рисунок, обтекаемый текстом, надо задать как окружение {wrapfigure} (в том же стилевом пакете определено окружение {wraptable}, задающее обтекаемую текстом таблицу; аргументы у этого окружения имеют в точности такой же смысл, как у окружения {wrapfigure} ).

    Окружение {wrapfigure} имеет два обязательных аргумента. Первый из них указывает, как должен быть расположен рисунок относительно текста, а второй — ширину рисунка (заданную в TeX'овских единицах длины или выраженную через TeX'овские параметры со значением длины). Например, код, задающий рис. 4.5, мог выглядеть примерно так:

    \begin{wrapfigure}{o}{62.2pt}
       {команды, задающие рисунок}
    \end{wrapfigure}

    Латинская буква o в первом аргументе означает, что рисунок должен быть расположен на наружной (outer) стороне страницы (то есть справа на нечетных страницах и слева — на четных); если бы мы сказали i вместо o, то рисунок был бы расположен на внутренней стороне страницы. Впрочем, оба эти аргумента имеют смысл только в том случае, если документ является "двусторонним" (с классовой опцией twoside ); если же набор " односторонний", то в первом обязательном аргументе надо указать букву l (рисунок слева) или r (справа).

    Каждая из букв o, i, l и r может быть не только строчной, но и прописной; в этом случае рисунок при необходимости может быть помещен не буквально там, где в исходном тексте находится окружение {wrapfigure}, но передвинут в другое место.

    Количество укороченных строк, необходимое для обтекания рисунка текстом, LaTeX рассчитывает самостоятельно; если обтекающий текст содержит команды для явного задания вертикальных промежутков или занимающие много места по вертикали выключные формулы, результат такого расчета может быть неверен. На этот случай у окружения {wrapfigure} предусмотрен необязательный аргумент, ставящийся перед первым обязательным — количество укороченных строк. Пример:

    \begin{wrapfigure}[14]{o}{60pt}

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

    Идеальное место для размещения окружения {wrapfigure} — между абзацами. Если вам нужно поместить обтекаемую иллюстрацию внутри абзаца, посмотрите, где TeX сделает в этом абзаце разрывы строк, если иллюстрацию не помещать, и начинайте окружение {wrapfigure} после слова, заканчивающего на печати строку.

    При совместном использовании окружений {figure} и {wrapfigure} может случиться, что обтекаемая иллюстрация с меньшим номером печатается после необтекаемой иллюстрации с большим номером (и наоборот). В этом случае ничего не остается, как передвинуть одну из этих иллюстраций внутри исходного текста.

    Окружение {wrapfigure} нельзя использовать непосредственно перед командой рубрикации, наподобие \section, а также внутри окружений, задающих перечни, и им подобных ({itemize}, {enumerate}, {description}, {quote},{quotation}).

    В стандартные поставки LaTeX'а пакет {wrapfig} может и не входить; тогда его придется доставать из Интернета. См. приложение Ж по поводу того, где в Интернете хранятся TeX'овские материалы.

    Дополнительные сведения об окружении {wrapfigure} можно получить из комментариев в файле wrapfig.sty, который, собственно говоря, и представляет собой стилевой пакет {wrapfig}.

    В предшествующем тексте остались непроясненными два момента: какими командами задавать сам рисунок и как узнать его ширину? Ответ на второй вопрос зависит от ответа на первый. В следующей лекции и в приложении Б будут даны два варианта ответов на эти вопросы.

    Нештатные ситуации с плавающими объектами

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

    Начнем с неприятности, подстерегающей вас при пользовании весьма привлекательным необязательным аргументом h (" печатать прямо здесь!") у окружения {figure} или {table}. Если при этом, к несчастью, расположить иллюстрацию именно в указанном месте невозможно (потому что посредине иллюстрации должно быть место разрыва страницы), то LaTeX действует так, словно в необязательном аргументе стояло не h, а ht. В результате иллюстрация будет напечатана вверху текущей или следующей страницы, а сообщение о происшедшем инциденте будет выдано на экран и в log-файл.

    Далее, команда \suppressfloats запрещает печать любых плавающих иллюстраций (а также таблиц; мы не будем всякий раз это оговаривать) на той странице, на которую эта команда попала. Можно применить команду и с необязательным аргументом: если написать

    \suppressfloats[t]

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

    С другой стороны, LaTeX предоставляет вам средство не затруднить, а, наоборот, облегчить размещение плавающих объектов (иллюстраций или таблиц). Именно, в необязательном аргументе окружения {figure} или {table} можно перед буквой t, b или h поставить восклицательный знак. В этом случае при размещении плавающего объекта LaTeX не будет обращать внимание на то, не слишком ли много иллюстраций попало на одну страницу и не слишком ли большую ее долю они займут (типичные причины, по которым LaTeX обычно перемещает плавающие иллюстрации вперед по тексту). У иллюстрации, начинающейся с команды

    \begin{figure}[!t]

    больше шансов быть напечатанной безотлагательно, чем в случае, если бы восклицательного знака не было.

    Существуют и другие способы борьбы с причудами плавающих объектов. О них мы расскажем в разд. 9.7.

    Еще о метках и ссылках

    В разных местах этой книги уже шла речь о том, как можно помечать различные места документа, а затем на эти помеченные места ссылаться. В настоящем разделе мы систематизируем эту информацию. Дополнительные сведения о том, как можно влиять на вид ссылок, создаваемых командой \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; можно также самостоятельно создавать команды, дающие автоматическую нумерацию (см.лекцию 7 ). Так или иначе, действует следующее правило:

    если в тексте стоит команда \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 и т.пНа верстку эти надпечатки не влияют.. Иными словами, если ваша формула 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 )Для каждого из файлов, включаемых в текст с помощью команды \include, создается отдельный aux-файл. При этом в aux-файл заносится следующая информация о метке: выбранное вами имя метки (аргумент команды \label ), номер страницы, на которую эта метка попала (этот номер будет в дальнейшем напечатан командой \pageref ), и, наконец, тот номер, который должен будет напечататься командой \ref (говоря более TeX'ническим языком, это вид на печати того счетчика, который последним подвергся увеличению с помощью \refstepcounter — см. лекцию 7.

    Далее, всякий aux-файл читается LaTeX'ом за один сеанс работы дважды: первый раз до начала обработки текста и второй раз — после ее завершения. При первом чтении aux-файла LaTeX запоминает имеющуюся в нем информацию о метках; именно исходя из этой информации команды \ref и \pageref печатают ссылки (если информации о данной метке при первом чтении aux-файла не обнаружено, вместо ссылки печатаются вопросительные знаки, а на экран выдается сообщение о неопределенной метке; так будет заведомо, если в tex-файле присутствуют ссылки на впервые появившуюся метку). При втором чтении aux-файла (после завершения работы с текстом, когда aux-файл был записан заново) LaTeX сравнивает имеющуюся у него информацию о метках с той, что содержится в новой версии aux-файла; если информация о метках изменилась, выдается знакомое предупреждение " Label(s) may have changed".

    Заметки на полях (маргиналии)

    Заметки на полях страницы делаются с помощью команды \marginpar с единственным обязательным аргументом — текстом заметки. Если в исходном тексте написано

    Маргиналии (фонарики) --- заголовки в виде
    надписей\marginpar{!!!} на полях страниц.

    то на печати вы увидите

    $$%%%HOLE_TeX%%% \documentclass{book} \usepackage{all} %%%% \usepackage{textcomp} \setlength{\textwidth}{6cm} \usepackage{color} \usepackage{amsmath} \usepackage{mathtext} % если нужны русские буквы в формулах (не обязательно) \usepackage[T2A]{fontenc} % внутренняя T2A кодировка TeX \usepackage[cp1251]{inputenc} % кодировка - можно использовать [cp866] [cp1251] [koi8-r] \usepackage[russian]{babel} % включение переносов \usepackage{tabularx} \usepackage{longtable} %\usepackage{graphy} \usepackage{array} \usepackage{soul} \marginparwidth5mm \reversemarginpar \definecolor{bg}{rgb}{ 1,1,1 } \definecolor{fg}{rgb}{ 0.517647058823529,0.00784313725490196,0.0156862745098039 } \pagestyle{empty} \pagecolor{bg} \begin{document} \color{fg} \noindent{\unitlength=0.1pt \raisebox{-4pt}{ \hbox{\begin{picture}(1,1) \put(0,0){\line(1,0){1}} \end{picture} } \hbox to \textwidth {}{\hbox { \begin{picture}(1,1) \put(0,0){\line(1,0){1}} \end{picture} }}} \par\noindent Маргиналии (фонарики) --- заголовки в виде надписей\marginpar{!!!} на полях страниц. } \end{document}$$

    Название \marginpar является сокращением английских слов, означающих "абзац на полях". Впрочем, текст заметки может состоять и из нескольких абзацев, разделяемых, как обычно, пустыми строками.

    Если документ печатается в одну колонку и в " одностороннем" стиле (как в классах article или report без классовой опции twoside ), то заметки выводятся по умолчанию на правое поле, а если документ печатается в одну колонку, но в "двустороннем" стиле, то на внешнее поле (правое, если страница имеет нечетный номер, и левое в противном случае). Если документ печатается в две колонки, то заметка всегда выводится на ближайшее поле (ближайшее к той колонке, в которую попала заметка).

    У команды \marginpar предусмотрен и необязательный аргумент. Он размещается перед обязательным; если эта команда использована с необязательным аргументом, то текст, выводящийся на поля, будет зависеть от того, на правое или на левое поле попадает заметка: на правое поле будет выведен текст, приведенный в обязательном аргументе, на левое — текст, приведенный в необязательном аргументе. Таким образом можно, например, вывести на поля стрелку, указывающую на текст:

    \marginpar[$\Longrightarrow$]{$\Longleftarrow$}

    (см. раздел о командах, генерирующих стрелки в математических формулах).

    По возможности заметки на полях помещаются на том же уровне, что и текст, к которым они относятся, но если этих заметок на каждой странице получается помногу (как в поэмах Кольриджа "Сказание о старом мореходе" или Маяковского "Про это"), то некоторые из них, во избежание наложений, будут сдвинуты вниз, а иногда даже перенесены на другую страницу (LaTeX сообщит об этом прискорбном событии во время трансляции).

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

    Можно также менять параметры оформления самих заметок на полях. Эти параметры таковы:

    \marginparwidth ширина строки на полях;
    \marginparsep расстояние между полем и заметками;
    \marginparpush минимальное расстояние по вертикали между соседними заметками.

    Значения этих параметров устанавливаются автоматически, в зависимости от класса документа. Вам может понадобиться их изменить, если вы меняете размер полей и/или ширину текста и при этом хотите пользоваться командой \marginpar.

    Внутри "блоков" (например, внутри аргумента команды \mbox или внутри окружения {tabular}, предназначенного для верстки таблиц) команду \marginpar применять нельзя.

    Страницы:

    В этой лекции мы рассмотрим такие вопросы, как общий стиль оформления документа, разбиение текста на разделы, титульный лист, оглавление и пр. Система LaTeX освобождает вас от многих забот об оформлении документа, но при этом и навязывает такие черты оформления, которые могут вас по тем или иным причинам не устраивать. От этого "диктата" можно отчасти отойти, если модифицировать стандартные классы, создав свой стилевой пакет (в последней лекции мы расскажем, как это делать). В принципе можно создать и свой собственный класс, весьма далекий от стандартных, но для этого требуются более глубокие познания в TeX'е, чем дает эта книга. Начнем же мы с того, что систематически рассмотрим вопрос о стандартных классах.

    Классы, пакеты и классовые опции

    Команда \documentclass, с которой начинается любой LaTeX'овский файл, имеет один обязательный аргумент — название основного класса — и один необязательный, размещающийся перед обязательным, — список, через запятую, "классовых опций" .

    Прежде чем говорить о классах документов, скажем несколько слов о команде, которая очень часто идет сразу после \documentclass, а именно, команде \usepackage. После \documentclass может идти одна или несколько команд \usepackage ; аргумент этой команды — это список, через запятую, стилевых пакетов, подключаемых к нашему документу. В первой лекции мы умолчали о том, что некоторые стилевые пакеты допускают задание своих личных стилевых опций (каких именно — зависит от пакета). Список стилевых опций пакета задается в необязательном аргументе команды \usepackage (через запятую, если опций несколько). Необязательный аргумент команды \usepackage ставится перед обязательным.

    Например, если включить в преамбулу строку

    \usepackage{amsmath}

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

    \usepackage[noamsfonts]{amsmath}

    то у вас будут все эти возможности, кроме использования готического и ажурного шрифтов.

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

    Теперь вернемся к классам документов. В первой лекции мы уже перечислили пять классов, предоставляемых LaTeX'ом: article, report, book, proc и letter. Сейчас мы рассмотрим подробнее четыре из них. Класс letter рассматривается ниже, в разд."Письма". (Американское математическое общество распространяет также, вместе со своими стилевыми пакетами, классы документов amsart, amsproc и amsbook ; мы рассмотрим их в приложении Г.

    Класс article удобно применять для статей, класс report — для более крупных статей, разбитых на главы, или небольших книг, класс book — для книг. В табл. 4.1 перечислены некоторые черты оформления, присущие стандартным классам. В ней знак $$+$$ означает "всегда присутствует", знак $$-$$ означает "всегда отсутствует", знак $$\mp$$ означает "по умолчанию отсутствует, но будет присутствовать, если задать классовую опцию или специальную команду", знак $$\pm$$ означает "по умолчанию присутствует, но можно отменить с помощью классовой опции или специальной команды".

    article report book proc
    Автоматически нумерующиеся разделы $$+$$ $$+$$ $$+$$ $$+$$
    Разбиение на главы $$+$$ $$+$$ $$+$$ $$+$$
    " Двусторонняя" печать $$\mp$$ $$\mp$$ $$\pm$$ $$-$$
    Титульный лист $$\mp$$ $$\pm$$ $$\pm$$ $$-$$
    Колонтитулы $$\mp$$ $$\pm$$ $$\pm$$ $$\mp$$
    Одинаковая высота всех страниц $$\mp$$ $$\mp$$ $$\pm$$ $$-$$
    Набор в две колонки $$\mp$$ $$\mp$$ $$\mp$$ $$+$$
    Набор в одну колонку $$\pm$$ $$\pm$$ $$\pm$$ $$-$$

    Мы не стремились охватить в этой таблице все детали различий между стандартными классами (например, колонтитулы в разных классах оформляются по-разному).

    Опишем теперь классовые опции. Напомним , что список классовых опций через запятую ставится в квадратных скобках перед основным аргументом команды \documentclass. Самые часто употребляемые классовые опции — это 11pt и 12pt. Они означают, что основной текст документа будет набран шрифтом кегля 11 или 12 соответственно. Если этих опций не указывать, то будет шрифт кегля 10.

    Можно указать классовую опцию, задающую формат используемой бумаги, после чего TeX рассчитает размеры текста и полей так, чтобы они максимально соответствовали этому формату. Эти опции таковы (единица измерения указана в скобках):

  • a4paper- $$210\times 297$$ (миллиметры) — самый ходовой в нашей стране;
  • a5paper - $$148\times 210$$ (миллиметры);
  • b5paper - $$176\times 250$$ (миллиметры);
  • legalpaper - $$8.5\times 14$$ (дюймы);
  • executivepaper - $$7.25\times 10.5$$ (дюймы).
  • Если ни одна из этих опций не указана, LaTeX считает, что размер бумаги равен (в дюймах) $$8.5\times 11$$ (этот формат бумаги иногда называют "letter").

    Если предполагается расположить текст так, чтобы он шел параллельно широкому, а не узкому краю бумаги, то можно указать опцию landscape: в этом случае TeX будет вычислять размеры текста и полей, считая, что ширина и высота листа бумаги поменялись ролями. Подчеркнем, что задание опции landscape само по себе текст на $$90^\circ$$ не повернет: он будет сверстан TeX'ом исходя из соответствующих размеров, но дальше необходимо иметь принтер и/или dvi-драйвер, способные обеспечить печать текста в такой ориентации. По умолчанию же считается, что строки параллельны узкому краю листа.

    Опция twoside задает печать с разными полями на нечетных и четных страницах (как в книгах), а опция oneside — печать с одинаковыми полями на всех страницах. В классе book по умолчанию установлена опция twoside, в классах article и report — oneside, в классе proc поля на четных и нечетных страницах всегда одинаковые.

    Для классов article, report и book можно указать классовую опцию twocolumn. Она означает, что набор текста будет производиться в две колонки. Так как абзацы при этом будут получаться довольно узкие, разумно при пользовании этой опцией заодно увеличить параметр \tolerance, иначе будет получаться много строк, выбивающихся за колонку. В разд. "Набор в две колонки" объяснялось, как сделать так, чтобы две колонки отделялись линейкой. В классе proc набор всегда производится в две колонки, и опции twocolumn и onecolumn (есть и такая) на него не действуют.

    Опция draft пригодна для любого класса. Если она включена, то каждая выбивающаяся на поля строка (т.е. строка, о которой выдается сообщение "Overfull \hbox " —) помечается на полях "марашкой". Это удобно при подготовке корректур (английское слово draft как раз и означает "набросок").

    Режим, при котором разные страницы могут иметь разную высоту, задается, как мы помним, командой \raggedbottom. По умолчанию этот режим устанавливается классами article и report, если только в качестве классовой опции не указана "двусторонняя" печать (классовая опция twoside ), а также классом proc. Во всех остальных случаях LaTeX будет, по умолчанию, делать все страницы одинаковой высоты.

    У классов report и book имеются опции openright и openany. Если указана опция openright, то каждая глава начинается обязательно с нечетной страницы (если необходимо, то ради этого печатается дополнительная пустая страница; на развороте нечетная страница будет правой). Если указана опция openany, то новая глава может начинаться как с четной, так и с нечетной страницы, и лишних пустых страниц ради начала главы LaTeX не делает. По умолчанию в классе report LaTeX действует так, как если бы было установлено openany, а в классе book — как если бы было openright.

    Скажем кое-что про класс документов proc. В этом классе текст печатается в две колонки, с уменьшенными полями. Опции a5paper, b5paper, onecolumn и titlepage в классе proc использовать нельзя. Нельзя также пользоваться маргиналиями (разд. 10).

    При пользовании классом proc внизу каждой страницы будет напечатано слово Page (" страница") и номер страницы. Если вы хотите, чтобы вместо Page печаталось что-то другое, скажем, "с.", то нужно в преамбуле переопределить команду \pagename, то есть написать:

    \renewcommand{\pagename}{с.}

    переопределение "стандартных надписей", делаемых LaTeX'ом по-английски; \renewcommand обсуждается в лекции 7).

    Следующие две классовые опции, применимые к любому из основных классов, влияют на оформление выключных математических формул; если вы пропустили при чтении соответствующие места в лекции 2, то пропустите и это место. Опция fleqn означает, что выключные формулы, заданные с помощью окружений {equation}, {eqnarray} и {displaymath}, а также пары команд \[ и \], будут напечатаны не в центре строки, а в ее левой части. Опция leqno означает, что номера формул, генерируемые окружениями {equation} и {eqnarray}, будут печататься не справа, а слева.

    Титульному листу и оформлению частей документа будут посвящены отдельные разделы; чтобы завершить наш обзор различных стандартных вариантов стиля, нам осталось обсудить колонтитулы и номера страниц, чему будет посвящен разд.3.

    Деловые письма

    Пример делового письма.

    \documentclass[11pt]{letter}
    \address{I.\,Ivanov,\\
      IUM, Moscow, Russia}
    \signature{I.\,Ivanov}
    \date{December 31, 2002}
    \begin{document}
    \begin{letter}{Prof.\ Jonas Jonas Huckabuck,\\
      University of Rootabaga,\\
      Cream Puffs, 80116, RO, USA}
    \opening{Dear Prof.\ Huckabuck,}
    Enclosed please find two copies of my paper.
    \closing{Sincerely yours,}
    \end{letter}
    \end{document}

    Существует класс документов letter, специально предназначенный для оформления деловых писем в соответствии с принятыми в США стандартами. Пользоваться им надо так. Во-первых, в преамбуле документа надо задать адрес отправителя в аргументе команды \address (можно применять \\ для ручного разбиения адреса на строки) и подпись отправителя в аргументе команды \signature.Можно также задать дату в аргументе команды \date. Если этого не сделать, то автоматически будет проставлена дата трансляции LaTeX'овского файла (по-английски).

    Письмо в напечатанном виде

    $$%%%HOLE_TeX%%% \documentclass[11pt]{letter} \usepackage{textcomp} \setlength{\textwidth}{6cm} \usepackage{color} \definecolor{bg}{rgb}{ 1,1,1 } \definecolor{fg}{rgb}{ 0.517647058823529,0.00784313725490196,0.0156862745098039 } %\pagestyle{empty} \pagecolor{bg} \color{fg} \address{I.\,Ivanov,\\ IUM, Moscow, Russia} \signature{I.\,Ivanov} \date{December 31, 2002} \begin{document} \begin{letter}{Prof.\ Jonas Jonas Huckabuck,\\ University of Rootabaga,\\ Cream Puffs, 80116, RO, USA} \opening{Dear Prof.\ Huckabuck,} Enclosed please find two copies of my paper. \closing{Sincerely yours,} \end{letter} \end{document}$$

    Между \begin{document} и \end{document} идет собственно текст письма или писем (в одном LaTeX'овском файле можно поместить несколько писем от одного отправителя). Каждое письмо оформляется как окружение {letter}, принимающее один обязательный аргумент — адрес того, кому предназначено письмо (опять-таки адрес можно разбивать на строки командами \\ ). Внутри окружения {letter} располагается собственно текст письма. Начинаться он должен командой \opening, в аргументе которой записывается вступительное обращение, а завершаться — командой \closing, в аргументе которой записывается заключительная фраза перед подписью (" Sincerely yours", например). Выше приведен пример оформленного по всем правилам LaTeX'овского файла с письмом, а затем — то, как будет выглядеть это письмо на печати. Вертикальный отступ на печати между текстами, заданными в командах \closing и \signature (в нашем случае — между " Sincerely yours" и "I.Ivanov" предназначен для того, чтобы поставить в этом месте подпись.

    Если вы хотите написать в письме что-то после вашей подписи, следует после команды \closing дать команду \ps (" постскриптум"), и уже после нее — сам текст (команда \ps необходима, но никакого текста, даже просто P.S., она не генерирует).

    В преамбуле можно дать команду \makelabels. В этом случае на отдельной странице будут напечатаны адреса для всех писем (окружений {letter} ), входящих в файл.

    Все описанные выше классовые опции применимы и к документам класса letter.

    После команды \closing можно дать команду \cc, в аргументе которой указывается, кому вы собираетесь отослать копии письма, а также команду \encl, в аргументе которой указывается список вложений. Американский стандарт на оформление таких вещей расходится с отечественным. Если, тем не менее, вы решитесь воспользоваться этими средствами в письме на русском языке, следует изменить значение команд \ccname и/или \enclname с помощью \renewcommand.

    Стиль оформления страницы

    Для задания стиля оформления страницы в LaTeX'е предусмотрена команда \pagestyle. Эта команда имеет один обязательный аргумент — слово, обозначающее этот стиль. При пользовании стандартными классами документов это слово должно быть одним из следующих:

    empty нет ни колонтитулов, ни номеров страниц
    plain номера страниц ставятся внизу в середине строки, колонтитулов нет;
    headings присутствуют колонтитулы (включающие в себя и номера страниц)
    myheadings присутствуют колонтитулы, оформленные так же, как в предыдущем случае; отличие в том, что текст, печатающийся в колонтитулах (в стандартном случае это номера и названия разделов документа), не порождаются LaTeX'ом автоматически, а задается пользователем в явном виде.

    Если основной стиль — article, то по умолчанию страницы оформляются стилем plain, в двух других основных стилях — стилем headings. "Стиль" myheadings мы рассмотрим в разд. "Колонтитулы" лекция 9.

    Наряду с командой \pagestyle, задающей стиль оформления всех страниц, есть и команда \thispagestyle, задающая стиль оформления одной отдельно взятой страницы. Она принимает такой же аргумент, как и \pagestyle ), но указываемое этим аргументом оформление относится только к той странице, на которую попал текст, окружающий эту команду. Заранее предугадать, на какую страницу попадет данный фрагмент текста, обычно невозможно. Поэтому, если хотите от этой команды предсказуемых результатов, употребляйте ее непосредственно после \newpage или \clearpage.

    Можно при желании сделать так, чтобы страницы нумеровались не арабскими цифрами, что делается по умолчанию, а римскими цифрами или буквами в алфавитном порядке. Для этого предназначена команда \pagenumbering. Она имеет один обязательный аргумент, который может быть одним из следующих:

    arabic арабские цифры (1, 2, 3,...)
    roman римские цифры (i, ii, iii,...)
    Roman римские цифры (I, II, III,...)
    alph строчные буквы (a, b, c,...)
    Alph прописные буквы (A, B, C,...)

    Команда \pagenumbering не только меняет вид, в котором на печати представляются номера страниц, но и начинает счет страниц заново (это удобно, например, в тех случаях, когда страницы предисловия надо нумеровать римскими цифрами, а страницы основного текста заново нумеровать арабскими). Поэтому разумно давать эту команду сразу же после \newpage или \clearpage.

    На этом мы прерываем наше обсуждение того, как изменять стандартное оформление страницы. На самом деле можно изменить гораздо больше, но речь об этом пойдет в лекции 9 .

    Поля, размер страницы и прочее

    Класс документа предопределяет значения таких параметров, как ширина и высота страницы, размеры полей и пр. (с учетом опции, указывающей формат бумаги). В настоящем разделе рассказано, как изменить эти значения, если они вас не устраивают.

    Размеры текста на странице, полей и пр. задаются параметрами со значением длины . Менять эти параметры следует в преамбуле документа.

    Ширина

    Ширина текста на странице задается параметром \textwidth ; если набор осуществляется в две колонки, то \textwidth включает в себя ширину обеих колонок и пробел между ними. Если нужно, чтобы ширина текста на странице была $$7$$ сантиметров, напишите в преамбуле так:

    \textwidth=7cm

    При изменении ширины текста часто приходится менять и поля. Для этого предусмотрен параметр, регулирующий размер левого поля (коль скоро левое поле и \textwidth заданы, правое поле определяется автоматически). Способ задания левого поля зависит от того, является ли набор в данном стиле "двусторонним" или нет. Выше объяснялось, что при двустороннем наборе на страницах с четными и нечетными номерами оставляются разные поля. В классах документов article и report набор по умолчанию односторонний, но он будет двусторонним, если указать стилевую опцию twoside. В классе book набор по умолчанию двусторонний, но можно сделать его односторонним, если указать стилевую опцию oneside.

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

    oddsidemargin=0pt

    то текст будет начинаться на расстоянии один дюйм от края, а если будет сказано

    \oddsidemargin=5mm

    то отступ от края бумаги составит $$30.4 мм$$ (вспомним, что один дюйм равен $$2.54 см$$ ). Если присвоить параметру \oddsidemargin отрицательное значение, то расстояние от края листа до начала текста будет, соответственно, меньше дюйма. Нелишне также напомнить, что когда вы присваиваете параметру со значением длины нулевое значение, то все равно должна быть указана какая-то единица длины (как у нас в примере); запись наподобие

    \oddsidemargin=0

    является ошибочной.

    Все сказанное относилось к одностороннему набору. При двустороннем наборе параметр \oddsidemargin также используется, но смысл его несколько иной: на сей раз он задает размеры левого поля только для страниц с нечетными номерами. Что же касается страниц с четными номерами, то размеры левого поля для них задаются параметром \evensidemargin.

    При наборе текста в две колонки используются еще два параметра. Во-первых, параметр \columnsep задает расстояние между колонками; во-вторых, колонки можно при желании разделить не только пробелом, но и вертикальной линейкой. Ширина этой линейки задается параметром \columnseprule. В стандартных стилях значение этого последнего параметра установлено равным нулю, так что линейка между колонками не печатается; чтобы линейка была, надо в преамбуле присвоить параметру \columnseprule значение, отличное от нуля (в этом случае ширина разделяющей колонки линейки включается в \columnsep ). Хорошее ненулевое значение параметра \columnseprule — 0.4pt.

    Высота

    Размер верхнего поля задается параметром \topmargin ; как и в случае с левым полем, это — расстояние не непосредственно от края листа, а от линии, параллельной краю и отстоящей от него на один дюйм. При этом надо сознавать не только от чего, но и до чего отсчитывается это расстояние: именно, \topmargin — это расстояние до колонтитула. Если же колонтитул на странице отсутствует (например, потому, что он не предусмотрен стилем), то вверху страницы дополнительно будет пустое пространство, размер которого равен месту, отводимому на колонтитул (параметр \headheight ) плюс отступ между колонтитулом и основным текстом (параметр \headsep ). Высота текста задается параметром \textheight. При исчислении этого размера не учитываются ни номера страниц, ни колонтитулы, так что, если они предусмотрены классом, полная высота текста на странице будет больше, чем \textheight.

    Высоту страницы также можно изменять, присваивая в преамбуле параметру \textheight новое значение, но если класс предусматривает, что все страницы должны иметь одинаковую высоту и ниже по поводу того, когда именно так бывает), то высоту текста нельзя устанавливать совсем уж произвольно: необходимо согласовать ее значение с параметрами \topskip и \baselineskip. Не вдаваясь в подробности, скажем, что первый из этих параметров определяет расстояние от низа первой строкиТочнее говоря, от ее базисной линии: см. лекцию 8. до "верхнего обреза" основного текста страницы, в то время как параметр \baselineskip определяет расстояние между строками и зависит от используемого шрифта (будем надеяться, что вы не станете менять его значение, не изучив предварительно книгу [2]). Так или иначе, значение \textheight следует устанавливать таким образом, чтобы отношение$$\frac{\mbox{\cs(textheight)}- \mbox{\cs(topskip)}}{\mbox{\cs(baselineskip)}}$$ было целым числом. В LaTeX'овском стандарте topskip всегда равен 10 пунктам. Что же до \baselineskip, то он равен 12 пунктам, если основной шрифт кегля 10, $$13.6$$ пункта, если основной шрифт кегля 11, и $$15$$ пунктам в кегле 12.

    Можно и не знать точно этих размеров, но вычислить нужную величину \textheight средствами самого TeX'а: именно, если вы, скажем, хотите, чтобы на странице помещалось 40 строк, то напишите в преамбуле (после команды, изменяющей интерлиньяж, если вы таковой пользовались) следующее:

    \setlength{\textheight}{40\baselineskip}
    \setlength{\textheight}{\baselinestretch\textheight}
    \addtolength{\textheight}{\topskip}

    (см. лекцию 8 по поводу \setlength и \addtolength ).

    Сдвиг страницы как целого

    Иногда при печати вы можете обнаружить, что реальные расстояния от текста до края листа не такие, как предписано параметрами наподобие \topmargin. Дело в том, что у принтера, которым вы пользуетесь, могут быть свои представления о том, где находится край листа бумаги. Чтоб эти представления соответствовали реальности, понадобится настройка принтера и/или dvi-драйвера, используемого вами для распечатки. Если вы не хотите этим заниматься, можно просто изменить расположение всей страницы в целом на печатном листе. Для этого следует установить (в преамбуле) значения двух TeX'овских параметров: \hoffset и \voffset. Например, если в преамбуле написано

    \hoffset=-5mm
    \voffset=4.2mm

    то вся страница в целом (со всеми колонтитулами, номерами страниц и пр.)\ будет сдвинута при печати на $$5\,\rm мм$$ влево и на $$4{,}2\,\rm мм$$ вниз.

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

    (рис 4.1) Лайот

    Рубрикация документа

    Работая с LaTeX'ом, разумно делать заголовки и нумерацию разделов документа не вручную, а с помощью специальных команд. Сначала разберем, как ими пользоваться, на примере команды \section.

    Команда \section

    Пусть вам нужно начать раздел документа, озаглавленный " Кое-что о слонах". Для этого в исходном тексте можно написать так:

    \section {Кое-что о слонах}

    Команда \section принимает один обязательный аргумент — название раздела (это же название пойдет в колонтитулы, если таковые предусмотрены классом, и в оглавление, если вы дадите команду " создать оглавление" — см. ниже ). Промежутки между разделами, их нумерация, те же колонтитулы — все это делается автоматически.

    Кроме обязательного аргумента, у команды \section предусмотрен и необязательный. Необязательный аргумент идет перед обязательным; в нем записывается вариант заголовка, предназначенный для оглавления и колонтитулов (если класс предусматривает, что заголовок войдет в колонтитул). Обычно этот вариант — просто сокращенный заголовок. Пример:

    \section[О слонах]{Кое-что о слонах}"

    Необходимость в сокращенном варианте заголовка возникает, когда оказывается, что заголовок по длине не помещается в колонтитул. Это, конечно, будет видно при просмотре; кроме того, при трансляции в этом случае выдается такое сообщение:

    Overfull \hbox has occurred while \output was active.

    Раздел можно пометить командой \label. После этого команда \ref будет выдавать номер этого раздела. Пример:

    $$\hbadness 2000 \noindent{\Large\bf 3.2\quad Кое-что о слонах}\par \vskip2.3ex В этом разделе нашей книги речь пойдет в основном о слонах. Слоны (см. определение в разд.~3.2) --- большие и сильные животные$$.
    \section{Кое-что о слонах}
    \label{elephants}
    В этом разделе нашей книги
    речь пойдет в основном о
    слонах. Слоны
    (см. определение в
    разд.~\ref{elephants})~---
    большие и сильные животные.

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

    Иногда хочется, чтобы сокращенный вариант заголовка попал только в колонтитул, а в оглавлении был его полный вариант. Как этого добиться, рассказано в лекции 9.

    У команды \section есть вариант "со звездочкой". Команда section* начинает новый раздел, не нумеруя его; на оглавлении и колонтитулах наличие раздела, вводимого этой командой, никак не отразится. У команды \section* предусмотрен только обязательный аргумент.

    Какие бывают разделы документа

    Теперь перечислим все команды для задания разделов документа, предоставляемые стандартными классами LaTeX'а. Большинство из них работает совершенно аналогично команде \section ; все отличия мы сейчас перечислим.

    Для оформления разделов существуют такие команды:

    \part \chapter \section \subsection
    \subsubsection \paragraph \subparagraph

    В этом перечне каждая последующая команда обозначает более мелкий подраздел, чем предыдущая. Следует иметь ввиду, что команда \chapter (глава) в классах proc и article не определена (благодаря этому обстоятельству статью легко переделать в главу книги), остальные команды определены в четырех основных классах.

    Стандартные классы обеспечивают нумерацию разделов, при которой более мелкий раздел "подчинен" более крупному: когда, например, начинается новый раздел \section, нумерация разделов \subsection и более мелких начинается заново. Исключением из этого правила является команда \part (" часть"): если часть 2 кончается главой 5, то первая из глав части 3 будет иметь номер 6, а не 1. При модификации стандартных классов можно менять как принцип нумерации разделов, так и вид этих "номеров" на печати (например, если мы захотим, чтобы разделы обозначались последовательными буквами алфавита).

    Все то, что мы говорили про необязательный аргумент и вариант " со звездочкой" у команды \section, применимо и к командам, перечисленным в этом разделе. "Слишком мелкие" разделы, согласно стандартным классам, не отражаются ни в оглавлении, ни в колонтитулах и не нумеруются, но, если вы употребите задающие их команды с необязательным аргументом или со звездочкой, ошибкой это не будет.

    В разделах, создаваемых описанными выше командами, первый абзац набирается без абзацного отступа (за исключением самого мелкого раздела \subparagraph ), причем LaTeX устроен таким образом, что создать этот отступ вам так просто не удастся. Если вы хотите, чтобы отступ в первом абзаце все-таки присутствовал, обратитесь к лекции 9, посвященной модификации стандартных классов.

    Изменение стандартных заголовков

    Возможно, вы уже обратили внимание, что главы, создаваемые LaTeX'ом с помощью команды \chapter, так и называются " Chapter", а не "Глава". Это — один из нескольких случаев, когда классы LaTeX'а используют для различных стандартных надписей английские слова. В некоторых русификациях LaTeX'а предусмотрены стилевые пакеты, переименовывающие эти названия в русские.

    Если такой русификации у вас нет, то придется решить эту проблему своими силами. Для этого в преамбулу документа надо внести следующую команду:

    \renewcommand{\chaptername}{Глава}

    Делать это надо, конечно, только в том случае, если команда \chapter предусмотрена в используемом вами классе. О команде \renewcommand, используемой для переопределения значений уже существующих команд, рассказывается в лекции 7.

    Приведем список остальных надписей, делаемых LaTeX'ом по-английски, вместе с их русскими переводами и командами, которые надо переопределить с помощью \renewcommand для того, чтоб на печати появлялись именно эти переводы. В нескольких ближайших разделах мы объясним, как именно получить на печати упоминаемые в этой таблице список таблиц, список иллюстраций и т.п.

    \chaptername Chapter Глава
    \contentsname Contents Оглавление (или Содержание)
    \listfigurename List of Figures Список рисунков
    \listtablename List of Tables Список таблиц
    \abstractname Abstract Аннотация
    \refname References Литература
    \bibname Bibliography Литература
    \indexname Index Предметный указатель
    \figurename Figure Рис.
    \tablename Table Таблица
    \partname Part Часть
    \appendixname Appendix Приложение

    Пояснений эта таблица не требует, за одним исключением: если класс документа есть article или proc, то для получения русского названия списка литературы надо переименовать команду \refname, а если report или book — то команду \bibname. Пожалуйста, не перепутайте эти два случая, иначе LaTeX зафиксирует ошибку и выполнять вашу команду откажется.

    До и после основного текста

    В классах article, report и proc предусмотрена возможность оформить аннотацию ко всему документу. Это делается с помощью окружения {abstract}. До начала основного текста следует поместить текст аннотации между \begin{abstract} и \end{abstract}. Этот текст будет автоматически озаглавлен "Abstract", если не подключать русифицирующий стилевой пакет и если вы сами не переопределили команду \abstractname (см. предыдущий пункт).

    Команда \appendix означает, что с этого места начинается приложение к документу. Сама она никакого текста не производит, а делает вот что:

  • начинает заново нумерацию разделов документа;
  • "самые крупные" разделы документа ( \section в классах article и proc, \chapter в двух других основных классах) начинают нумероваться не цифрами, а прописными латинскими буквами;
  • если определена команда \chapter, то главы будут с этого момента называться не "Chapter", а так, как определено в команде \appendixname (см. предыдущий пункт).
  • Если класс вашего документа — book, то можете воспользоваться услугами команд \frontmatter, \mainmatter и \backmatter. Командой \frontmatter открывается "вводная часть" книги: после этой команды страницы начинают нумероваться римскими цифрами (как если бы мы сказали \pagenumbering{roman} ). В той части текста, на которую распространяется действие команды \frontmatter, главы не нумеруются. Переход к основной части книги задается командой \mainmatter: печать начинается с новой страницы, страницы начинают нумероваться заново арабскими цифрами. Наконец, команда \backmatter задает переход к заключительной части книги: главы перестают нумероваться (нумерация страниц не меняется).

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

    Если в аргументе команды \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 команды для расстановки диакритических знаков , смены текущего шрифта и установки промежутков вручную .

    Титульный лист, оглавление, список литературы, аннотация

    Титульный лист

    Для того, чтобы оформить заголовок ко всему документу, надо сделать две вещи: задать информацию для заголовка (автор, название и т.п.) и дать LaTeX'у команду этот заголовок сгенерировать. Второе делается с помощью команды \maketitle. Она создаст титульный лист, если это предусмотрено классом и опциями. (Если титульный лист не предусмотрен, то команда \maketitle разместит заданную вами информацию об авторе, заглавии и прочем на первой странице, выбрав подходящие шрифты и сделав подобающие отступы между титульной информацией и текстом.) По умолчанию для классов report и book титульный лист создается всегда (и не создается, если указана классовая опция notitlepage ), для класса article титульный лист не создается (но будет создан, если указать классовую опцию titlepage ). В классе proc титульная информация всегда печатается на первой странице текста.

    Так как команда \maketitle генерирует текст, ее нельзя помещать в преамбуле документа.

    Теперь объясним, как задавать LaTeX'у информацию для титула. Автор задается с помощью команды \author. Она принимает единственный обязательный аргумент — имя автора (в том виде, как вы хотите его видеть на титуле). Если авторов несколько, их имена должны быть разделены командой \and.

    Заглавие задается с помощью команды \title. Если заглавие длинное, можно самому задать его разбиение на строки с помощью команды \\ ; если этого не сделать, заглавие будет разбито на центрированные строки автоматически, как если бы это был абзац в окружении {center}.

    Следующий элемент информации для титула — команда \date. Она имеет один обязательный аргумент, в котором можно задать любой текст (например, дату, в согласии с переводом слова date), который будет размещен на титульном листе (или перед началом основного текста, если титульный лист не предусмотрен классом и/или опциями) в одной или нескольких центрированных строках (так же, как и текст, задаваемый в аргументе команды \title ). В частности, можно оставить аргумент этой команды "пустым", если сказать \date{} - тогда соответствующий текст вообще не появится. Но если вы вообще не дадите эту команду, хотя бы и с пустым аргументом, то LaTeX напечатает на титуле дату своего запуска, причем по- английскиИли по-русски, если это предусмотрено в используемой вами русификации..

    Команды \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 надо указать их обозначения через запятую. Приведем пример (в котором для экономии места мы опустили заголовок "Список литературы"):

    $${\advance\Leftex-1mm \makeatletter%\hbadness 1500 \def\thebibliography#1{%Начисто сперто из report.sty (исключена % команда \chapter) \list {\@biblabel{\arabic{enumiv}}}{\settowidth\labelwidth{\@biblabel{#1}}% \leftmargin\labelwidth \advance\leftmargin\labelsep \usecounter{enumiv}% \let\p@enumiv\@empty \def\theenumiv{\arabic{enumiv}}}% \def\newblock{\hskip .11em plus.33em minus.07em}% \sloppy\clubpenalty4000\widowpenalty4000 \sfcode`\.=\@m}% \def\endthebibliography{% \def\@noitemerr{\@warning{Empty `thebibliography' environment}}% \endlist}% В~[3, гл.~1] описана встреча Винни-Пуха с несколькими пчелами. В~[1, 2] приведены другие сведения о медведях. \par \begin{thebibliography}{99} \bibitem{voevoda} М.\,Е.\,Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.\,Н.\,Толстой. Три медведя. \bibitem{Winnie} А.\,А.\,Милн. Винни-Пух. \end{thebibliography} \exb \begin{verbatim} В~\cite[гл.~1]{Winnie} описана встреча Винни-Пуха с несколькими пчелами. В~\cite{voevoda,med3} приведены другие сведения о медведях. \begin{thebibliography}{99} \bibitem{voevoda} М.\,Е.\,Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.\,Н.\,Толстой. Три медведя. \bibitem{Winnie} А.\,А.\,Милн. Винни-Пух. \end{thebibliography} \end{verbatim} }$$
    В \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. Если это заглавие печатается по-английски, его можно переопределить .

    Предметный указатель

    В отличие от списка литературы, который при использовании описанных выше команд \cite и \bibitem получается совершенно автоматически, процесс создания указателя автоматизирован в LaTeX'е не полностью. Именно, вы можете сделать две вещи:

  • Если вам уже известно, какие термины должны войти в указатель и на каких страницах они расположены, можно организовать печать предметного указателя с помощью окружения {theindex}. Если предметный указатель должен завершать документ, то можно, на худой конец, напечатать весь документ, кроме указателя, и вручную выписать требуемые номера страницУ вас может возникнуть искушение пометить все места, на которые надо сослаться, с помощью команды \label, а в окружении {theindex} получить номера страниц с помощью \pageref. При этом, однако, есть опасность, что TeX'у не хватит памяти для обработки такого огромного числа ссылок..
  • Можно также (и на практике это удобнее) специальным образом пометить в файле термины, на которые вы собираетесь ссылаться в предметном указателе. При этом средствами LaTeX'а создается полуфабрикат, из которого предметный указатель получится после обработки отдельной программой (называемой обычно makeindex, а в русской версии — rmakeindex или как-нибудь еще в этом роде), входящей в настоящее время почти во все поставки LaTeX'а.
  • Начнем с того, что расскажем о втором способе создания индекса, а потом объясним, что можно сделать, если программа для генерации индекса вам по какой-то причине недоступна.

    Общие положения

    Чтобы разметить файл для автоматической генерации индекса, нужно сделать две вещи. Во-первых, в преамбулу документа необходимо включить команду \makeindex. Во-вторых, при условии, что это сделано, можно пометить те места в тексте, на которые вы хотите сослаться в предметном указателе, командой \index (если команда \makeindex в преамбуле отсутствует, то команды \index ничему не мешают, но и никакого действия не оказывают). У этой команды один обязательный аргумент — текст вашей пометки (в простейшем случае такая пометка — это ключевое слово будущего предметного указателя). Информация о том, на какие страницы попали ваши пометки, будет записана в специальный файл с тем же именем, что и у вашего файла, и расширением idx (мы будем называть его idx-файлом). Пусть, например, в исходном файле встречались такие фрагментыВ наших примерах мы используем русские буквы, хотя на самом деле использование русских букв в предметном указателе зависит от применяемой вами русификации. Прежде всего, в ее состав должна входить версия программы makeindex, учитывающая русский алфавитный порядок. Кроме того, иногда (например, при использовании русского варианта пакета babel) в idx-файл попадают не русские буквы, а их условные обозначения, а в других случаях (при использовании старых версий TeX'а) их шестнадцатеричные коды, и это создает дополнительные сложности. Возможны также сложности с буквой "ё" при сортировке. При подготовке этой книги использован вариант русификации (см. приложение E), где такие проблемы не возникают.:

    Многие люди любят домашних кошек.\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 \ORsubitem IBM-совместимые, 28 \ORsubsubitem ремонт, 35 \ORsubsubitem цены, 30 \ORsubitem болгарские, 26 \item Принтеры, 40 \indexspace \item Кошки, 120 \item Собаки, 140--156 \end{THEindex}$$
    \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 (подрисуночная подпись; см. следующий раздел) и т.п.

    Простейшие средства

    В простейшем случае программа makeindex вызывается такНапомним, что конкретное название программы и возможность использования русских букв может зависеть от используемой системы и русификации. См. приложения E и Ж :

    \makeindex исходный_файл

    Если исходный_файл имеет расширение idx (так скорее всего и будет, поскольку исходный файл — это, как правило, сгенерированный LaTeX'ом idx-файл), то это расширение можно не указывать. В результате работы программы makeindex появится файл с тем же именем, что у исходного файла, и расширением ind. Это — готовый файл для предметного указателя, который остается только включить в ваш документ с помощью команды \input. Создается также файл с тем же именем и расширением ilg. Это — протокол работы программы makeindex.

    Если не предпринимать специальных мер, то все записи в ind-файле, созданном программой makeindex, будут равноправны — все они будут вводиться командой \item. Чтобы предметный указатель был устроен иерархически, как в примере на стр.178 , надо в аргументе команды \index после заглавного слова поставить восклицательный знак, а после него — подчиненное ему слово. Возможно также подчинение второго порядка — тогда нужен еще один восклицательный знак. Вот пример:

    Многие люди любят домашних кошек.\index{Кошки!домашние}
    ....
    Ваша киска\index{Кошки!домашние!уход} купила бы...
    ....
    Хорошо также иметь собаку.\index{Собаки}
    .....
    Мало кто рискнет держать дома такую дикую
    кошку,\index{Кошки} как тигр. Пудель\index{Собаки}
    гораздо безопаснее.

    При обработке этого файла LaTeX'ом получится idx- файлВ том, конечно, случае, если в преамбуле была команда \makeindex . ; в результате обработки idx-файла программой makeindex получится ind-файл, включающий в себя, в частности, следующее (предположим, что наши команды \index попали на страницы с номерами 2, 7, 8, а две последние — на страницу 9):

    \begin{theindex}
    ...
      \item Кошки, 9
        \subitem домашние, 2
          \subsubitem уход, 7
    ...
      \item Собаки, 8, 9
    ...
    \end{theindex}

    Из сказанного следует, что при обработке idx-файла с помощью программы makeindex восклицательный знак в аргументе команд \index имеет особый статус. Чтобы программа \makeindex восприняла восклицательный знак просто как типографский значок, надо в аргументе \index предварить его знаком кавычки ":

    \index{Восклицательный знак ("!)}
    \index{Междометия!Эх"!}

    Эти аргументы команд \index дословно скопируются в idx-файл, а после его обработки программой makeindex в ind-файл запишется примерно вот что:

    \item Восклицательный знак (!), 14
    \item Междометия
      \subitem Эх!, 6

    Наряду с восклицательным знаком, особый статус с точки зрения программы makeindex имеет символ @ (" коммерческое at"), вертикальная черточка | (в следующем разделе вы узнаете, в чем этот статус заключается), а также сама кавычка ". Если вы хотите употребить один из этих четырех значков в аргументе команды \index просто как символ, не вкладывая в него специального смысла, надо поставить перед ним кавычку ".

    Исключение: кавычку, входящую в состав TeX'овской команды \", можно (и нужно) записывать без предосторожностей:

    \index{Кавычка ("")}
    \index{Ёлочка}
    \index{H\"uhnchen}

    При этом соответствующие записи в idx-файле могут получиться такими:

    \item Ёлочка, 8
    \item Кавычка ("), 6
    \item H\"uhnchen, 12

    Тонкости

    Для каждого ключевого слова программа makeindex собирает все относящиеся к нему номера страниц и записывает их в ind - файле после этого слова через запятую. Если при этом попадутся три или более идущих подряд номера страниц, то в ind - файл будут записаны только первый и последний из этих номеров, через короткое тире (en-dash). Такие пары страниц через короткое тире можно организовывать и вручную. Пусть, например, в какой-то части вашего текста все время идет речь о кошках. Тогда можно в начале этой части написать

    \index{Кошки|(}

    а в конце ---

    \index{Кошки|)}

    Если первая из этих команд попала на страницу 9, а вторая - на страницу 77, то после обработки idx - файла программой makeindex в ind - файл попадет запись

    \item Кошки, 9--77

    Команды index{Кошки}, оказавшиеся между страницами 9 и 77, будут при этом проигнорированы.

    При сортировке программа makeindex принимает во внимание не только буквы, но и спецзнаки, записанные в аргументе команды \index. Иногда это нежелательно: если в тексте имеются команды \index{Аист} и \index{\textbf{Ящерица}}, то ящерица может оказаться в ind-файле раньше аиста, если makeindex будет считать, что запись для нее начинается с символа "\", который идет раньше всех русских буквОн может идти и позже — в зависимости от конкретной версии программы makeindex и ее отношения к русским буквам.. Чтобы избежать такого рода неприятностей, предусмотрена возможность по отдельности задать слово, которое будет участвовать в сортировке, и текст, который будет реально записан в ind-файл. В приведенном выше примере следовало бы написать

    \index{Ящерица@\textbf{Ящерица}}

    Теперь ящерица попадет туда же, куда и все прочие слова на букву "я", но при этом будет напечатана жирным шрифтом. Общее правило такое: если в аргументе команды \index присутствует символ @, то при сортировке учитывается только то, что написано левее него, а в ind - файл записывается только то, что правее него. Можно задавать отдельные тексты для сортировки и для печати не только для основного заглавного слова, но и для слов, ему подчиненных:

    \index{Ящерицы@\textbf{Ящерицы}!игуана@\textbf{игуана}}

    Напоминание: если перед @ или | стоит кавычка ", то эти значки рассматриваются просто как символы.

    Программа makeindex может оформлять номера разных страниц по-разному. Пусть, например, вы считаете, что одно из мест в тексте, где говорится о кошках, является особо важным, и хотите, чтобы номер соответствующей страницы был подчеркнут (по аналогии с указателем к книге TeXbook [2]). Тогда можно поставить в этом месте команду

    \index{Кошки|underline}

    Предположим, что эта команда попала на страницу 100, и, кроме того, в тексте были две команды \index{Кошки}, попавшие на страницы 15 и 47. Тогда после обработки idx-файла программой makeindex в ind-файле появится такая строка:

    \item Кошки, 15, 47, \underline{100}

    Общее правило таково: команда \index{XXX|abcd} порождает в ind-файле строку

    \item XXX, \abcd{y}

    (здесь $$y$$ - номер страницы).

    Если вы хотите номер страницы не подчеркнуть, а выделить другим шрифтом, разумно воспользоваться одной из команд для смены шрифта, работающих как команда с одним аргументом (см. выше).

    Среди символов "abcd" не должно быть круглых скобок (сочетания "|(" и "|)" имеют, как было сказано выше, особый смысл); если вы хотите оформить таким образом номер страницы к "подчиненному", а не заглавному термину, то именно после подчиненного термина (того, после которого должен реально появиться номер страницы) и надо писать |abcd:

    \index{Кошки!Ангорские|textbf}

    Настройка программы makeindex

    В предыдущих разделах мы объясняли, как и какую информацию можно передавать программе makeindex. Теперь объясним, как добиться того, чтобы она обрабатывала эту информацию по-иному.

    Если "запустить программу makeindex с ключом c", то есть сказать

    makeindex -c  исходный\_файл

    то при обработке idx-файла программой makeindex пробелы в начале и конце записей будут игнорироваться, а два и более пробела будут рассматриваться как один. Благодаря этому записи \index{Кошка} и \index{ Кошка} будут рассматриваться как относящиеся к одному и тому же ключевому слову. Без этого ключа программа {makeindex} отведет в указателе отдельную строку для кошки, начинающейся с пробела.

    Можно задать по своему усмотрению имя файла, в который программа makeindex запишет результаты своей работы. Для этого надо воспользоваться ключом o (в примере мы употребили еще и ключ c, но это не обязательно):

    makeindex -c -o выходной\_файл исходный\_файл

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

    Наконец, можно запустить программу makeindex вместе со стилевым файлом, стилевой файл в котором программе будут даны указания по поводу вида, в котором будет записан отсортированный и обработанный idx - файл. Написав подходящий стилевой файл для makeindex, можно радикально изменить вид ind-файла — так, что он вообще не будет иметь ничего общего с LaTeX'овским файлом (это может иметь смысл: makeindex задуман как программа широкого профиля, пригодная не только для LaTeX'а). Как добиться столь революционных изменений, мы обсуждать не будем (интересующиеся могут узнать все подробности из оригинальной документации), но о некоторых вещах, полезных именно для LaTeX'а, расскажем.

    Чтобы подключить стилевой файл к makeindex, надо запустить эту программу с ключом s, после которого, через пробел, указывается имя стилевого файла (по традиции он имеет расширение ist). Если стилевой файл называется mystyle.ist, то можно сказать так:

    makeindex -s mystyle.ist исходный_файл

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

    \begin{theindex}

    в начало ind-файла и

    \end{theindex}

    в его конец. Часто требуется, чтобы в начало или конец ind - файла автоматически записывалось что-то еще (команда \sloppy в начало, например). Для того, чтобы после \begin{theindex} было на отдельной строке написано еще и \sloppy, надо в стилевом файле написать так:

    preamble "\\begin{theindex}\n
            \\sloppy\n"

    Здесь preamble - имя стилевого параметра, определяющего, что записывается в начало всякого ind - файла. Остальной текст — содержание этой записи. Правила записи в стилевом файле для makeindex таковы:

  • строковая константа, задающая стилевой параметр, ограничена с обеих сторон знаками "(кавычки);
  • эта строковая константа может реально состоять и из нескольких строк; место, где кончается одна строка и начинается другая, обозначается \n (конец строки воспринимается просто как пробел и не означает конца строки в ind - файле);
  • если в строковую константу должны входить символы \ или ", то их надо обозначать \\ и \" соответственно, а все остальные символы набираются непосредственно.
  • Параметр postamble определяет, что записывается в конец ind - файла. По умолчанию это

    "\n\n\\end{theindex}\n"

    (иными словами: начать с новой строки, одну строку пропустить, написать \end{theindex}, строку закончить).

    Следующие три параметра определяют, чем отделяются номера страниц от ключевых слов: "delim_0" — для ключевых слов "верхнего уровня", "delim_1" и "delim_2" — для слов первого и второго уровня подчинения. По умолчанию все три этих параметра определены как ", "(запятая и пробел), вследствие чего номера страниц отделяются от слов запятыми. В русских текстах эти запятые ставить не принято, поэтому все три этих параметра стоит переопределить на "":

    $$\begin{Example} \verb?delim_0 ""?\\ \verb?delim_1 ""?\\ \verb?delim_2 ""? \end{Example}$$

    Параметр "group_skip" определяет, что записывается в ind - файл между группами слов, начинающихся на одну букву. Значение по умолчанию - "\\n\n \\indexspace\n" (" пропустить строку, написать слово \indexspace и начать с новой строки").

    Перед каждой группой терминов, начинающихся с новой буквы, можно (как это и сделано в указателе к книге, которую вы держите в руках) напечатать на отдельной строке эту букву. Для этого в стилевом файле надо написать

    headings_flag 1

    При этом буквы будут напечатаны тем же шрифтом, что и остальной текст указателя. Чтобы шрифт был другим, надо в стилевом файле определить параметры heading_prefix и heading_suffix. Первый из них определяет, какой TeX'овский текст запишется в ind - файл перед буквой, второй — что запишется после буквы. Если, например, нужно, чтобы шрифт, которым печатаются буквы-заголовки, имел размер \large и был полужирным, то можно написать

    heading_prefix "{\\normalfont\\large\\bfseries "
    heading_suffix "}"

    (вспомните, что для получения символа \ надо написать \\; пробел после bfseries необходим, чтобы в ind-файле имя команды не слилось с последующей буквой).

    Если в указателе присутствуют термины, начинающиеся с символа, не являющегося буквой, то они будут выделены в отдельную группу; если в стилевом файле написано headings_flag 1, то перед этой группой будет напечатано слово Symbols. Если вас это не устраивает, надо в стилевом файле определить строковую константу symhead_positive. Если, например, написать

    symhead_positive ""

    то перед этой группой вообще никакого заголовка не будет; если хотите, чтобы вместо Symbols был другой заголовок, напишите вместо "" этот заголовок (в двойных кавычках, разумеется).

    Если программы makeindex нет

    Теперь рассмотрим вторую возможность — как самостоятельно обработать автоматически созданный с помощью LaTeX'а полуфабрикат предметного указателя.

    Если не писать самостоятельно программу для обработки idx-файлов, то можно, по крайней мере, сделать следующее.

    Во-первых, надо отсортировать строки idx-файла (средствами текстового редактора, например). После этого остается проблема, что делать с командами \indexentry. После того, как вы отсортируете idx - файл (и сохраните, для надежности, отсортированный файл под другим именем, скажем, myindex.tex), надо определить команду \indexentry таким образом, чтобы она делала ту же работу, которую призван делать \item. Для этого надо написать в преамбуле следующее:

    \newcommand{\indexentry}[2]{item #1 #2}

    После этого TeX будет воспринимать каждую запись вида

    \indexentry{Кошки}{5}

    так же, как если бы вместо этого было написано

    \item Кошки 5

    и можно будет просто написать в конце документа

    \begin{theindex}
    \input{myindex.tex}
    \end{theindex}

    Пока что воспринимайте этот рецепт чисто догматически; по прочтении лекции 7, в которой подробно рассмотрен процесс определения новых команд, вы поймете, почему этот рецепт работает.

    Плавающие иллюстрации и таблицы

    Простейшие средства

    Чтобы разместить в тексте иллюстрацию, удобно воспользоваться окружением figure. Стоящий между \begin{figure} и \end{figure} текст автоматически размещается LaTeX'ом в таком месте, где он укладывается целиком (не переходя со страницы на страницу); это может быть не на "своей" странице, а позже. В последнем случае говорят, что иллюстрация "всплыла" на следующей странице; именно поэтому окружение figure называют еще " плавающая иллюстрация".

    Команда \caption позволяет сделать подрисуночную подпись. Эта команда имеет один обязательный аргумент — текст подписи. На печати подпись состоит из слова, определенного командой \figurename (" Figure-", если не переопределять эту команду — см. выше), порядкового номера иллюстрации, присвоенного ей LaTeX'ом, и подписи, указанной в аргументе команды. Команду \caption можно давать в любом месте между \begin{figure} и \end{figure}: в соответствующем месте появится на печати и сгенерированная ею подпись. Разумно поэтому ставить команду \caption либо в конце окружения figure (тогда подпись будет размещена под иллюстрацией), либо в его начале (подпись появится над иллюстрацией).

    Если команду \label поместить внутри окружения figure после команды \caption, то команда \ref ссылка на плавающую иллюстрацию} будет генерировать номер иллюстрации. Например, рис.4.2 получился так:

    Например, рис.~\ref{void} на с.~\pageref{void}...
    ...
    \begin{figure}
    \vspace*{2.5cm}
    \caption{Белый квадрат
    на белом фоне}\label{void}
    \end{figure}
    (рис 4.2) Белый квадрат на белом фоне

    Внутри одного окружения figure может быть несколько команд \caption, и каждую из них можно пометить своей командой \label. Подчеркнем, что само по себе окружение figure номера рисунка не создает.

    На подписи к рис.4.2 после номера стоит точка. К сожалению, согласно LaTeX'овскому стандарту в этом месте ставится не точка, а двоеточие, что в русском тексте выглядит неудачно. В лекции 9 объясняется, как с этим можно бороться.

    У окружения figure предусмотрен необязательный аргумент, с помощью которого можно высказать LaTeX'у свои пожелания по поводу размещения иллюстрации в тексте. Именно, после \begin{figure} (без пробела) можно поместить в квадратных скобках одну или несколько из следующих четырех букв, имеющих такие значения:

    t разместить иллюстрацию в верхней части страницы;
    b разместить иллюстрацию в нижней части страницы;
    p разместить иллюстрацию на отдельной странице, целиком состоящей из "плавающих" иллюстраций (или таблиц — см. ниже);
    h разместить иллюстрацию прямо там, где она встретилась в исходном тексте, не перенося ее никуда.

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

    \begin{figure}[tbp]

    При наборе текста в две колонки полезно использовать не только само окружение figure, но и его вариант "со звездочкой": если сказать

    \begin{figure*}

    то при наборе текста в одну колонку это не будет ничем отличаться от окружения figure без звездочки, а при наборе текста в две колонки создаст иллюстрацию шириной в целую страницу (без звездочки получилось бы шириной в одну колонку). Если окружение открывается командой \begin{figure*}, то и закрываться оно должно командой со звездочкой.

    Если при наборе в две колонки задать окружение figure (без звездочки) с необязательным аргументом p, то для печати иллюстраций будет выделена не отдельная страница, но отдельная колонка. При подключении стилевого пакета multicol пользоваться окружениями со звездочкой {figure*} и {table*} (см. ниже) нельзя.

    Окружение {table} определяет " плавающие таблицы". Все свойства этого окружения дословно совпадают с соответствующими свойствами окружения {figure}, за двумя исключениями: во-первых, подпись, генерируемая командой \caption, начинается со слова, определенного в команде \tablename, и переопределять, при необходимости, надо именно эту команду, и во-вторых, таблицы нумеруются независимо от иллюстраций. Кстати, подпись к таблице принято делать не снизу, как к иллюстрации, а сверху. Окружение {table*} при наборе текста в две колонки определяет таблицы шириной в целую страницу.

    В документе можно, при желании, получить автоматически сгенерированные списки иллюстраций и/или таблиц. Для этого используются команды \listoffigures (для иллюстраций) и \listoftables (для таблиц). Их работа аналогична команде \tableofcontents, генерирующей оглавление: материал для этих списков собирается в специальные файлы с расширениями lof (для иллюстраций) и lot (для таблиц); при каждом запуске LaTeX'а информация, записанная в этих таблицах, относится к предыдущему запуску, так что в самом конце может понадобиться запустить LaTeX лишний раз; наконец, команда \caption может принимать необязательный аргумент — вариант подписи под иллюстрацией или таблицей, предназначенный для включения в список иллюстраций или таблиц соответственно. Этот необязательный аргумент записывается (в квадратных скобках, как обычно) перед обязательным.

    Как окружение {figure} не рисует картинок, так и окружение {table} только размещает таблицу на страницах документа, но не создает ее текста. Как набирать таблицы в LaTeX'е, мы расскажем в лекции 6.

    В разд.9.7 мы расскажем о том, как можно модифицировать оформление плавающих иллюстраций и таблиц.

    Рисунки в оборку

    (рис 4.5) РисунокОкружения {figure} и {table} определяют иллюстрации и таблицы, простирающиеся на всю ширину текста, и ничего иного в стандартном комплекте LaTeX'а не предусмотрено. Пользователями LaTeX'а разработано несколько стилевых пакетов, позволяющих с большим или меньшим успехом печатать прямоугольные иллюстрации, обтекаемые текстом. В этом разделе мы расскажем о возможностях, предоставляемых стилевым пакетом {wrapfig}. Этот пакет, разработанный Дональдом Арсено (Donald Arseneau), довольно удобен на практике (по крайней мере, автор книги и его коллеги не без успеха им пользуются), хотя, конечно, размещение обтекаемых текстом иллюстраций полностью автоматизировано быть не может и всегда требует определенной ручной работы. Ниже мы опишем основные принципы использования пакета {wrapfig}, но реально пользоваться им вы сможете только после того, как освоите следующую лекцию о псевдорисунках или (что лучше) приложение Б, посвященное интеграции в TeX графических файлов в формате PostScript.

    Итак, предположим, что стилевой пакет {wrapfig} подключен. Тогда рисунок, обтекаемый текстом, надо задать как окружение {wrapfigure} (в том же стилевом пакете определено окружение {wraptable}, задающее обтекаемую текстом таблицу; аргументы у этого окружения имеют в точности такой же смысл, как у окружения {wrapfigure} ).

    Окружение {wrapfigure} имеет два обязательных аргумента. Первый из них указывает, как должен быть расположен рисунок относительно текста, а второй — ширину рисунка (заданную в TeX'овских единицах длины или выраженную через TeX'овские параметры со значением длины). Например, код, задающий рис. 4.5, мог выглядеть примерно так:

    \begin{wrapfigure}{o}{62.2pt}
       {команды, задающие рисунок}
    \end{wrapfigure}

    Латинская буква o в первом аргументе означает, что рисунок должен быть расположен на наружной (outer) стороне страницы (то есть справа на нечетных страницах и слева — на четных); если бы мы сказали i вместо o, то рисунок был бы расположен на внутренней стороне страницы. Впрочем, оба эти аргумента имеют смысл только в том случае, если документ является "двусторонним" (с классовой опцией twoside ); если же набор " односторонний", то в первом обязательном аргументе надо указать букву l (рисунок слева) или r (справа).

    Каждая из букв o, i, l и r может быть не только строчной, но и прописной; в этом случае рисунок при необходимости может быть помещен не буквально там, где в исходном тексте находится окружение {wrapfigure}, но передвинут в другое место.

    Количество укороченных строк, необходимое для обтекания рисунка текстом, LaTeX рассчитывает самостоятельно; если обтекающий текст содержит команды для явного задания вертикальных промежутков или занимающие много места по вертикали выключные формулы, результат такого расчета может быть неверен. На этот случай у окружения {wrapfigure} предусмотрен необязательный аргумент, ставящийся перед первым обязательным — количество укороченных строк. Пример:

    \begin{wrapfigure}[14]{o}{60pt}

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

    Идеальное место для размещения окружения {wrapfigure} — между абзацами. Если вам нужно поместить обтекаемую иллюстрацию внутри абзаца, посмотрите, где TeX сделает в этом абзаце разрывы строк, если иллюстрацию не помещать, и начинайте окружение {wrapfigure} после слова, заканчивающего на печати строку.

    При совместном использовании окружений {figure} и {wrapfigure} может случиться, что обтекаемая иллюстрация с меньшим номером печатается после необтекаемой иллюстрации с большим номером (и наоборот). В этом случае ничего не остается, как передвинуть одну из этих иллюстраций внутри исходного текста.

    Окружение {wrapfigure} нельзя использовать непосредственно перед командой рубрикации, наподобие \section, а также внутри окружений, задающих перечни, и им подобных ({itemize}, {enumerate}, {description}, {quote},{quotation}).

    В стандартные поставки LaTeX'а пакет {wrapfig} может и не входить; тогда его придется доставать из Интернета. См. приложение Ж по поводу того, где в Интернете хранятся TeX'овские материалы.

    Дополнительные сведения об окружении {wrapfigure} можно получить из комментариев в файле wrapfig.sty, который, собственно говоря, и представляет собой стилевой пакет {wrapfig}.

    В предшествующем тексте остались непроясненными два момента: какими командами задавать сам рисунок и как узнать его ширину? Ответ на второй вопрос зависит от ответа на первый. В следующей лекции и в приложении Б будут даны два варианта ответов на эти вопросы.

    Нештатные ситуации с плавающими объектами

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

    Начнем с неприятности, подстерегающей вас при пользовании весьма привлекательным необязательным аргументом h (" печатать прямо здесь!") у окружения {figure} или {table}. Если при этом, к несчастью, расположить иллюстрацию именно в указанном месте невозможно (потому что посредине иллюстрации должно быть место разрыва страницы), то LaTeX действует так, словно в необязательном аргументе стояло не h, а ht. В результате иллюстрация будет напечатана вверху текущей или следующей страницы, а сообщение о происшедшем инциденте будет выдано на экран и в log-файл.

    Далее, команда \suppressfloats запрещает печать любых плавающих иллюстраций (а также таблиц; мы не будем всякий раз это оговаривать) на той странице, на которую эта команда попала. Можно применить команду и с необязательным аргументом: если написать

    \suppressfloats[t]

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

    С другой стороны, LaTeX предоставляет вам средство не затруднить, а, наоборот, облегчить размещение плавающих объектов (иллюстраций или таблиц). Именно, в необязательном аргументе окружения {figure} или {table} можно перед буквой t, b или h поставить восклицательный знак. В этом случае при размещении плавающего объекта LaTeX не будет обращать внимание на то, не слишком ли много иллюстраций попало на одну страницу и не слишком ли большую ее долю они займут (типичные причины, по которым LaTeX обычно перемещает плавающие иллюстрации вперед по тексту). У иллюстрации, начинающейся с команды

    \begin{figure}[!t]

    больше шансов быть напечатанной безотлагательно, чем в случае, если бы восклицательного знака не было.

    Существуют и другие способы борьбы с причудами плавающих объектов. О них мы расскажем в разд. 9.7.

    Еще о метках и ссылках

    В разных местах этой книги уже шла речь о том, как можно помечать различные места документа, а затем на эти помеченные места ссылаться. В настоящем разделе мы систематизируем эту информацию. Дополнительные сведения о том, как можно влиять на вид ссылок, создаваемых командой \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; можно также самостоятельно создавать команды, дающие автоматическую нумерацию (см.лекцию 7 ). Так или иначе, действует следующее правило:

    если в тексте стоит команда \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 и т.пНа верстку эти надпечатки не влияют.. Иными словами, если ваша формула 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 )Для каждого из файлов, включаемых в текст с помощью команды \include, создается отдельный aux-файл. При этом в aux-файл заносится следующая информация о метке: выбранное вами имя метки (аргумент команды \label ), номер страницы, на которую эта метка попала (этот номер будет в дальнейшем напечатан командой \pageref ), и, наконец, тот номер, который должен будет напечататься командой \ref (говоря более TeX'ническим языком, это вид на печати того счетчика, который последним подвергся увеличению с помощью \refstepcounter — см. лекцию 7.

    Далее, всякий aux-файл читается LaTeX'ом за один сеанс работы дважды: первый раз до начала обработки текста и второй раз — после ее завершения. При первом чтении aux-файла LaTeX запоминает имеющуюся в нем информацию о метках; именно исходя из этой информации команды \ref и \pageref печатают ссылки (если информации о данной метке при первом чтении aux-файла не обнаружено, вместо ссылки печатаются вопросительные знаки, а на экран выдается сообщение о неопределенной метке; так будет заведомо, если в tex-файле присутствуют ссылки на впервые появившуюся метку). При втором чтении aux-файла (после завершения работы с текстом, когда aux-файл был записан заново) LaTeX сравнивает имеющуюся у него информацию о метках с той, что содержится в новой версии aux-файла; если информация о метках изменилась, выдается знакомое предупреждение " Label(s) may have changed".

    Заметки на полях (маргиналии)

    Заметки на полях страницы делаются с помощью команды \marginpar с единственным обязательным аргументом — текстом заметки. Если в исходном тексте написано

    Маргиналии (фонарики) --- заголовки в виде
    надписей\marginpar{!!!} на полях страниц.

    то на печати вы увидите

    $$%%%HOLE_TeX%%% \documentclass{book} \usepackage{all} %%%% \usepackage{textcomp} \setlength{\textwidth}{6cm} \usepackage{color} \usepackage{amsmath} \usepackage{mathtext} % если нужны русские буквы в формулах (не обязательно) \usepackage[T2A]{fontenc} % внутренняя T2A кодировка TeX \usepackage[cp1251]{inputenc} % кодировка - можно использовать [cp866] [cp1251] [koi8-r] \usepackage[russian]{babel} % включение переносов \usepackage{tabularx} \usepackage{longtable} %\usepackage{graphy} \usepackage{array} \usepackage{soul} \marginparwidth5mm \reversemarginpar \definecolor{bg}{rgb}{ 1,1,1 } \definecolor{fg}{rgb}{ 0.517647058823529,0.00784313725490196,0.0156862745098039 } \pagestyle{empty} \pagecolor{bg} \begin{document} \color{fg} \noindent{\unitlength=0.1pt \raisebox{-4pt}{ \hbox{\begin{picture}(1,1) \put(0,0){\line(1,0){1}} \end{picture} } \hbox to \textwidth {}{\hbox { \begin{picture}(1,1) \put(0,0){\line(1,0){1}} \end{picture} }}} \par\noindent Маргиналии (фонарики) --- заголовки в виде надписей\marginpar{!!!} на полях страниц. } \end{document}$$

    Название \marginpar является сокращением английских слов, означающих "абзац на полях". Впрочем, текст заметки может состоять и из нескольких абзацев, разделяемых, как обычно, пустыми строками.

    Если документ печатается в одну колонку и в " одностороннем" стиле (как в классах article или report без классовой опции twoside ), то заметки выводятся по умолчанию на правое поле, а если документ печатается в одну колонку, но в "двустороннем" стиле, то на внешнее поле (правое, если страница имеет нечетный номер, и левое в противном случае). Если документ печатается в две колонки, то заметка всегда выводится на ближайшее поле (ближайшее к той колонке, в которую попала заметка).

    У команды \marginpar предусмотрен и необязательный аргумент. Он размещается перед обязательным; если эта команда использована с необязательным аргументом, то текст, выводящийся на поля, будет зависеть от того, на правое или на левое поле попадает заметка: на правое поле будет выведен текст, приведенный в обязательном аргументе, на левое — текст, приведенный в необязательном аргументе. Таким образом можно, например, вывести на поля стрелку, указывающую на текст:

    \marginpar[$\Longrightarrow$]{$\Longleftarrow$}

    (см. раздел о командах, генерирующих стрелки в математических формулах).

    По возможности заметки на полях помещаются на том же уровне, что и текст, к которым они относятся, но если этих заметок на каждой странице получается помногу (как в поэмах Кольриджа "Сказание о старом мореходе" или Маяковского "Про это"), то некоторые из них, во избежание наложений, будут сдвинуты вниз, а иногда даже перенесены на другую страницу (LaTeX сообщит об этом прискорбном событии во время трансляции).

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

    Можно также менять параметры оформления самих заметок на полях. Эти параметры таковы:

    \marginparwidth ширина строки на полях;
    \marginparsep расстояние между полем и заметками;
    \marginparpush минимальное расстояние по вертикали между соседними заметками.

    Значения этих параметров устанавливаются автоматически, в зависимости от класса документа. Вам может понадобиться их изменить, если вы меняете размер полей и/или ширину текста и при этом хотите пользоваться командой \marginpar.

    Внутри "блоков" (например, внутри аргумента команды \mbox или внутри окружения {tabular}, предназначенного для верстки таблиц) команду \marginpar применять нельзя.

    Вернуться к учебному плану