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

         

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


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

\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'овского файла (по-английски).

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

Между \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.



Для любознательных


Скажем несколько слов о том, как происходит автоматическая генерация ссылок. Когда в обрабатываемом файле встречается команда \label, LaTeX записывает информацию о ней в специальный файл, называемый aux-файлом (при обработке файла text.tex имя aux-файла будет text.aux)9) При этом в aux-файл заносится следующая информация о метке: выбранное вами имя метки (аргумент команды \label), номер страницы, на которую эта метка попала (этот номер будет в дальнейшем напечатан командой \pageref), и, наконец, тот номер, который должен будет напечататься командой \ref (говоря более TeX'ническим языком, это вид на печати того счетчика, который последним подвергся увеличению с помощью \refstepcounter — см. лекцию 7.

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



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


В классах 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 задает переход к заключительной части книги: главы перестают нумероваться (нумерация страниц не меняется).



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


В разных местах этой книги уже шла речь о том, как можно помечать различные места документа, а затем на эти помеченные места ссылаться. В настоящем разделе мы систематизируем эту информацию. Дополнительные сведения о том, как можно влиять на вид ссылок, создаваемых командой \ref, читатель найдет в разд. 7.3.



Если программы 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, в которой подробно рассмотрен процесс определения новых команд, вы поймете, почему этот рецепт работает.



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


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

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

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

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

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

\chapternameChapterГлава
\contentsnameContentsОглавление (или Содержание)
\listfigurenameList of FiguresСписок рисунков
\listtablenameList of TablesСписок таблиц
\abstractnameAbstractАннотация
\refnameReferencesЛитература
\bibnameBibliographyЛитература
\indexnameIndexПредметный указатель
\figurenameFigure Рис.
\tablenameTableТаблица
\partnamePartЧасть
\appendixnameAppendixПриложение

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



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


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

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

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

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

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

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

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



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


Команда \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 перечислены некоторые черты оформления, присущие стандартным классам. В ней знак

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

Таблица 4.1. articlereportbookproc
Автоматически нумерующиеся разделы
Разбиение на главы
" Двусторонняя" печать
Титульный лист
Колонтитулы
Одинаковая высота всех страниц
Набор в две колонки
Набор в одну колонку
Мы не стремились охватить в этой таблице все детали различий между стандартными классами (например, колонтитулы в разных классах оформляются по-разному).

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

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

a4paper-
(миллиметры) — самый ходовой в нашей стране;a5paper -
(миллиметры); b5paper -
(миллиметры);legalpaper -
(дюймы);executivepaper -
(дюймы).Если ни одна из этих опций не указана, LaTeX считает, что размер бумаги равен (в дюймах)
(этот формат бумаги иногда называют "letter").

Если предполагается расположить текст так, чтобы он шел параллельно широкому, а не узкому краю бумаги, то можно указать опцию landscape: в этом случае TeX будет вычислять размеры текста и полей, считая, что ширина и высота листа бумаги поменялись ролями. Подчеркнем, что задание опции landscape само по себе текст на
не повернет: он будет сверстан 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.


Команда \section


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

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

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

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

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

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

Overfull \hbox has occurred while \output was active.

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

\section{Кое-что о слонах} \label{elephants} В этом разделе нашей книги речь пойдет в основном о слонах. Слоны (см. определение в разд.~\ref{elephants})~--- большие и сильные животные.

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

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

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



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

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


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


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

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

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

\suppressfloats[t]

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

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

\begin{figure}[!t]

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

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



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


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

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

Предположим, что первая ссылка на кошек попала на страницу 5, ссылка на собак попала на страницу 7, а вторая ссылка на кошек попала на страницу 9. Тогда в idx-файл запишется вот что:

\indexentry{Кошки}{5} \indexentry{Собаки}{7} \indexentry{Кошки}{9}

Полученный таким образом idx-файл — это и есть полуфабрикат указателя, созданный LaTeX'ом. Использовать этот полуфабрикат, однако же, еще нельзя: ссылки в idx-файле расположены не по алфавиту, а записаны " в порядке поступления", в idx-файле может присутствовать несколько строк с одним заглавным словом и ссылками на разные страницы, наконец, команда indexentry, с которой начинается каждая строка idx-файла, не определена в LaTeX'е (это сделано сознательно!).

Поэтому, получив idx-файл, надо его обработать с помощью программы makeindex; в результате получится файл с отсортированными по алфавиту терминами (обычно он имеет расширение ind и называется ind-файлом), который можно будет включить в окружение {theindex}, написав

\begin{theindex} \input{text.ind} \end{theindex}

Если вы заглянете в файл, полученный в результате работы программы makeindex, то увидите, что в окружении {theindex} каждый элемент указателя вводится командой \item ; команды \subitem и \subsubitem вводят элементы указателя, печатающиеся с дополнительными отступами (обычно это уточнения к заглавному слову) — вскоре мы объясним, что надо писать в аргументе команды \index, чтобы получить такую иерархию элементов указателя.
Наконец, команда \ indexspace создает дополнительный вертикальный пробел (его можно использовать для отделения различных разделов указателя друг от друга):

\begin{theindex} \item Компьютеры, 25--42 \subitem IBM-совместимые, 28 \subsubitem ремонт, 35 \subsubitem цены, 30 \subitem болгарские, 26 \item Принтеры, 40 \indexspace \item Кошки, 120 \item Собаки, 140--156 \end{theindex}
Предметный указатель, получаемый из окружения {theindex}, печатается LaTeX'ом в две колонки (даже тогда, когда сам документ печатается в одну колонку). Кроме того, LaTeX автоматически дает указателю заглавие, определяемое командой \indexname (см. выше). Если вас не устраивает, что это название — английское, его можно переопределить (см. там же).

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

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


Общие принципы


Как мы знаем, любое место в тексте можно пометить с помощью команды \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-ником, лучше такие эксперименты не ставить.

Возможность использования русских букв в метках зависит от используемой вами русификации.



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


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



Оглавление


В процессе работы LaTeX автоматически собирает информацию для создания оглавления и записывает ее в специальный файл с тем же именем, что у обрабатываемого файла, и расширением toc. Чтобы LaTeX записал эту информацию, а затем воспользовался ею и напечатал оглавление, надо дать команду \tableofcontents.

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

Все оглавление в целом будет озаглавлено словом, определяемым командой \contentsname.

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



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


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



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


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

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



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


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

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

Начнем с того, что расскажем о втором способе создания индекса, а потом объясним, что можно сделать, если программа для генерации индекса вам по какой-то причине недоступна.



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


В простейшем случае программа makeindex вызывается так5):

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

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

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

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

При обработке этого файла LaTeX'ом получится idx-файл6); в результате обработки 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


Окружение {table*} при наборе текста в две колонки определяет таблицы шириной в целую страницу.

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

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

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


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


Окружения {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}.

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


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


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



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


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

\hoffset=-5mm \voffset=4.2mm

то вся страница в целом (со всеми колонтитулами, номерами страниц и пр.)\ будет сдвинута при печати на

влево и на
вниз.

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


увеличить изображение
Рис. 4.1.  Лайот



Ширина


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

сантиметров, напишите в преамбуле так:

\textwidth=7cm

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

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

oddsidemargin=0pt

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

\oddsidemargin=5mm

то отступ от края бумаги составит

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

\oddsidemargin=0

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

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

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



Список литературы


Имеется возможность оформить список литературы, элементы которого нумеруются автоматически; в тексте при этом надо ссылаться не на эти номера, которые могут измениться в процессе работы над документом, а на установленные вами условные обозначения для элементов списка литературы (" источников").

Список литературы оформляется как окружение {thebibliography}. Это окружение имеет обязательный аргумент — номер источника, занимающий больше всего места на печати (в стандартных шрифтах все цифры имеют одинаковую ширину, так что достаточно привести в качестве аргумента, например, номер 99, если источников будет заведомо меньше 100).

Каждый источник вводится командой \bibitem. У нее есть один обязательный аргумент — ваше условное обозначение. В качестве такого обозначения можно использовать любую последовательность из букв и цифр.

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

В \cite[лекция 1]{Winnie} описана встреча Винни-Пуха с несколькими пчелами. В \cite{voevoda,med3} приведены другие сведения о медведях. \begin{thebibliography}{99} \bibitem{voevoda} М.Е.Салтыков-Щедрин. Медведь на воеводстве. \bibitem{med3} Л.Н.Толстой. Три медведя. \bibitem{Winnie} А.А.Милн. Винни-Пух. \end{thebibliography}

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

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

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

\begin{thebibliography}{XXXX} ... \bibitem[EGA]{Groth} A.Grothendieck, J.Dieudonn\'e. \'El\'ements de G\'eom\'trie Alg\'ebrique. ... \end{thebibliography} После этого команда \cite{Groth} будет генерировать текст [EGA].

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


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


Для задания стиля оформления страницы в 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 .



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


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

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

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

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

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

Команды \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 (без колонтитула и номера).Что и как разместить на этой странице — ваша забота.


Тонкости


Для каждого ключевого слова программа 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 будет считать, что запись для нее начинается с символа "\", который идет раньше всех русских букв7). Чтобы избежать такого рода неприятностей, предусмотрена возможность по отдельности задать слово, которое будет участвовать в сортировке, и текст, который будет реально записан в 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} (здесь
- номер страницы).

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

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

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

Визуализация меток


Возможность автоматической генерации ссылок, предоставляемая командами \label и \ref, — большое благо, но всякое техническое усовершенствовование приносит и новые проблемы. Предположим, что, рассматривая пробную распечатку, вы решили добавить ссылку на формулу 3.7. Писать прямо "3.7" рискованно: вдруг в процессе дальнейшей работы над текстом номер этой формулы изменится? Значит, надо воспользоваться командой \ref, но что писать в ее аргументе, если номер 3.7 присутствует только на печати, а в TeX'овском файле вместо этого номера при нужной вам формуле стоит команда \label с совершенно другим аргументом?

Можно, конечно, разыскать в файле формулу, соответствующую формуле 3.7 на печати, и скопировать аргумент команды \label, но есть и более удобный способ. Именно, если подключить стилевой пакет {showkeys}, то над каждым местом в тексте, помеченным с помощью команды \label (или, скажем, \bibitem), и над каждым местом, где стоит ссылка — команда \ref (или, скажем, \cite), будет надпечатываться и ваша метка — аргумент команды \label, \ref и т.п8). Иными словами, если ваша формула 3.7 в исходном тексте выглядела как

\begin{equation} 2\times 2=4,\label{main} \end{equation}

то при просмотре и печати вы увидите над номером 3.7 надпись main, и сразу будет видно, как сослаться на эту формулу с помощью \ref.

Излишне объяснять, что перед беловой распечаткой строку

\usepackage{showkeys}

из преамбулы документа надо удалить.



Высота


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

Высоту страницы также можно изменять, присваивая в преамбуле параметру \textheight новое значение, но если класс предусматривает, что все страницы должны иметь одинаковую высоту и ниже по поводу того, когда именно так бывает), то высоту текста нельзя устанавливать совсем уж произвольно: необходимо согласовать ее значение с параметрами \topskip и \baselineskip. Не вдаваясь в подробности, скажем, что первый из этих параметров определяет расстояние от низа первой строки1) до "верхнего обреза" основного текста страницы, в то время как параметр \baselineskip определяет расстояние между строками и зависит от используемого шрифта (будем надеяться, что вы не станете менять его значение, не изучив предварительно книгу [2]). Так или иначе, значение \textheight следует устанавливать таким образом, чтобы отношение

было целым числом. В LaTeX'овском стандарте topskip всегда равен 10 пунктам. Что же до \baselineskip, то он равен 12 пунктам, если основной шрифт кегля 10,
пункта, если основной шрифт кегля 11, и
пунктам в кегле 12.

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

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

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



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


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

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

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

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

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

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

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

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

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


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

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

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

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

  1)   Точнее говоря, от ее базисной линии: см. лекцию 8.
  2)   Или по-русски, если это предусмотрено в используемой вами русификации.
  3)   У вас может возникнуть искушение пометить все места, на которые надо сослаться, с помощью команды \label, а в окружении {theindex} получить номера страниц с помощью \pageref. При этом, однако, есть опасность, что TeX'у не хватит памяти для обработки такого огромного числа ссылок.
  4)   В наших примерах мы используем русские буквы, хотя на самом деле использование русских букв в предметном указателе зависит от применяемой вами русификации. Прежде всего, в ее состав должна входить версия программы makeindex, учитывающая русский алфавитный порядок. Кроме того, иногда (например, при использовании русского варианта пакета babel) в idx-файл попадают не русские буквы, а их условные обозначения, а в других случаях (при использовании старых версий TeX'а) их шестнадцатеричные коды, и это создает дополнительные сложности. Возможны также сложности с буквой "ё" при сортировке. При подготовке этой книги использован вариант русификации (см. приложение E), где такие проблемы не возникают.
  5)   Напомним, что конкретное название программы и возможность использования русских букв может зависеть от используемой системы и русификации. См. приложения E и Ж
  6)   В том, конечно, случае, если в преамбуле была команда \makeindex.
  7)   Он может идти и позже — в зависимости от конкретной версии программы makeindex и ее отношения к русским буквам.
  8)   На верстку эти надпечатки не влияют.
  9)   Для каждого из файлов, включаемых в текст с помощью команды \include, создается отдельный aux-файл.


Дополнительные возможности


Иногда бывает нужно нанести на псевдорисунок несколько регулярно расположенных объектов. В этом случае, вместо того чтобы много раз писать \put, удобно воспользоваться командой \multiput. Она располагает на псевдорисунке несколько одинаковых объектов на равных расстояниях. Синтаксис этой команды таков:

\multiput(x,y)(?x ?y){n}{объект}

Здесь

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

\begin{picture}(100,80) \multiput(10,70)(8,-6){8}% {\circle*{3}} \end{picture}

Обратите внимание на использование знака процента для удаления нежелательного пробела, создаваемого концом строки. Вот еще один пример; здесь с помощью команды \multiput рисуется решеточка:

\begin{picture}(100,50) \multiput(0,0)(10,0){10}% {\line(1,5){10}} \multiput(0,0)(2,10){6}% {\line(1,0){90}} \end{picture}

Использование команды \multiput так, как это было сделано в предыдущем примере, ведет к неоправданным затратам машинного времени. Например, каждый из наклонных отрезков собирается из маленьких символов, причем TeX'у приходится повторять эту скучную операцию 10 раз. Разумнее было бы собрать этот отрезок лишь единожды, а дальше его просто копировать. Это можно сделать с помощью "блоковых переменных". Мы расскажем об этом в лекции 8 .

Иногда, когда псевдорисунок достаточно сложен, удобно применить следующий прием: задать в качестве аргумента одной из команд \put целое окружение {picture}(точкой отсчета будет служить левый нижний угол). При этом вы сможете отсчитывать координаты объектов на " подрисунке" относительно самого подрисунка, а не внешнего рисунка, что часто бывает проще; кроме того, если понадобится сдвинуть этот "подрисунок" как единое целое, то для этого будет достаточно изменить аргументы в одной-единственной команде \put.
Вот пример рисунка с подрисунком ( будем считать, что это классная доска, на которой нарисованы оси координат):



Этому рисунку соответствовал такой исходный текст:

\begin{picture}(120,80) % Края доски: \put(0,0){\line(1,0){120}} \put(0,80){\line(1,0){120}} \put(0,0){\line(0,1){80}} \put(120,0){\line(0,1){80}} % Оси координат: \put(40,25){\begin{picture}(40,40)% \put(20,0){\vector(0,1){40}} \put(0,20){\vector(1,0){40}} \put(40,22){x} \put(22,40){y} \end{picture}} \end{picture} Кстати говоря, размеры внутренней картинки можно было бы задать совершенно произвольно, например, (200,200)} или даже (0,0)} — команда \put бездумно размещает объекты таким образом, чтобы их точки отсчета имели указанные координаты, и при этом не интересуется, сколько места они реально занимают и не наложатся ли на текст или другие объекты.

Нередко требуется сдвигать не какую-то часть псевдорисунка, а весь псевдорисунок как целое (например, если вы ищете оптимальное расположение иллюстрации по отношению к тексту). Для этого удобно использовать еще одну возможность окружения {picture}: можно задать его таким образом, чтобы начало координат было не в левом нижнем углу, а в любой другой точке. Для этого после \begin{picture} надо задать не одну, а две пары чисел в круглых скобках. В этом случае первая пара чисел будет, как и прежде, обозначать ширину и высоту места, выделяемого LaTeX'ом на псевдорисунок, а вторая пара будет указывать, каковы координаты левого нижнего угла этого псевдорисунка (по умолчанию, т. е. если второй пары чисел в круглых скобках нет, они были бы просто (0,0)}). Главное только — не напутать со знаками: если вы сказали

\begin{picture}(a,b)(x,y) то это значит, что левый нижний угол псевдорисунка имеет координаты
, стало быть, по сравнению со случаем, когда
, весь псевдорисунок сдвинется на
по горизонтали и на
по вертикали! Если вы ничего не поняли, посмотрите на следующий пример, в котором второй псевдорисунок сдвигается на
единиц вправо и на
единиц вверх по отношению к первому:



\begin{picture}(150,80) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}\\[25pt] \begin{picture}(150,80)(-20,-10) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}

Кривые


При пользовании окружением {picture} вы имеете возможность нанести на псевдорисунок кривую более или менее произвольной формы (эти кривые — так называемые квадратичные сплайны Безье). Это делается с помощью команды \qbezier. Вот пример ее работы:

\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \put(22,2){\circle*{5}} \put(120,20){\circle*{5}} \put(20,77){\circle*{5}} \end{picture}

После \qbezier надо указать (без пробелов) координаты трех точек: начальной, "опорной" и конечной. Из начальной точки кривая выходит, устремляется к опорной, но, как правило, до нее не доходит, поскольку сворачивает к конечной точке, в которой и заканчивает свой путь. В нашем примере мы для ориентировки нанесли на псевдорисунок черные кружки в этих трех точках.

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

\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \qbezier[60](58,2)(-40,20)(60,77) \end{picture}

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

Какой бы необязательный аргумент команды \qbezier мы ни задавали, количество квадратиков, из которых составляется кривая, не превысит числа

. Если вы решили увеличить этот максимум, допустим, до тысячи, надо написать так:

\renewcommand{\qbeziermax}{1000}

Если так вы напишете в преамбуле, то предел

будет относиться ко всем кривым в вашем тексте, а если внутри группы (например, внутри окружения), то изменение этого параметра забудется по выходе из группы. В лекции 7 будет объяснено, что означает \renewcommand в общем случае.



Окружности, круги и овалы


Окружность задается командой \circle, а круг (сплошной черный кружок) — ее вариантом "со звездочкой" \circle*. У этих команд единственный аргумент — диаметр круга или окружности. Как обычно, он задается в единицах, равных значению параметра \unitlength (по умолчанию - в пунктах). Точкой отсчета окружности или круга является центр. Вот пример картинки с окружностями и кругами:

\begin{picture}(100,80) \put(30,30){\circle{30}} \put(70,30){\circle{30}} \put(30,50){\circle{30}} \put(70,50){\circle{30}} \put(50,40){\circle*{20}} \end{picture}

Количество реально возможных диаметров кругов ограничено. Если окружности или круга с диаметром, указанным в качестве аргумента команды \circle или \circle, в LaTeX'овских шрифтах нет, то будет напечатана окружность (круг), диаметр которой наиболее близок к указанному.

Наряду с окружностями и кругами, на псевдорисунок можно нанести также " овал" - прямоугольник с закругленными углами. Он задается командой \oval, аргументы которой - ширина и высота овала. Эти аргументы задаются в круглых скобках через запятую. Точка отсчета овала - его центр. Пример:

\begin{picture}(100,80) \put(50,40){\oval(100,80)} \end{picture}

Кроме того, возможны и "неполные" овалы, представляющие собой половины или четверти от полных. Чтобы задать такой неполный овал, надо задать команде \oval с необязательным аргументом} необязательный аргумент (в квадратных скобках, после обязательного). Для задания половины овала этот аргумент должен быть одной из следующих букв:

tверхняя половина;
bнижняя половина;
rправая половина;
lлевая половина.

Для задания четверти овала необязательный аргумент команды \oval должен быть сочетанием двух из этих букв (например, tr} для верхней правой четверти). Точка отсчета усеченного овала расположена там же, где точка отсчета соответствующего ему полного овала. Вот пример картинки с усеченными овалами:

\begin{picture}(100,80) \put(50,40){\oval(80,60)[t]} \put(50,40){\oval(80,60)[br]} \end{picture}

Отрезки и стрелки


Отрезки задаются с помощью команды \line. LaTeX'у надо сообщить наклон и размер отрезка. Вот пример команды \put, выводящей отрезок:

\begin{picture}(100,50) \put(60,50){\line(1,-2){20}} \end{picture}

Как мы уже понимаем, здесь на рисунок размера

пунктов наносится отрезок с началом в точке
. Наклон отрезка задается парой целых чисел, расположенных в круглых скобках через запятую непосредственно после \line. Отношение этих чисел должно быть равно "угловому коэффициенту" отрезка (тангенсу угла наклона к горизонтали); в нашем случае эти числа суть "(1,-2)", это означает, что отрезок отклоняется "на одну единицу вправо и на две единицы вниз". Если эти числа (1,0), то отрезок горизонтален, если (0,1), то отрезок вертикален.

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

Длину отрезка можно (если она не слишком мала) задавать произвольно, а вот наклон — нет. Каждое из целых чисел, задающих наклон, не должно превосходить

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

Стрелки задаются с помощью команды \vector, которая нам уже встречалась в примере. Синтаксис этой команды совершенно такой же, как у команды \line: в круглых скобках пишется пара чисел, задающая наклон стрелки, а затем в фигурных скобках параметр, задающий ее размер (длина проекции на горизонтальную ось, если стрелка не вертикальна, и длина проекции на вертикальную ось, если стрелка вертикальна). Отличие от команды \line в том, что репертуар возможных наклонов стрелок еще более ограничен, чем у отрезков: целые числа, задающие наклон, не должны превосходить

по абсолютной величине (и по-прежнему не должны иметь общих делителей). Точкой отсчета стрелки является ее начало.



Параметры оформления псевдорисунка


Про один из таких параметров мы уже говорили - это единица измерения длин на псевдорисунке, обозначаемая \unitlength.

В какой-то мере можно регулировать и толщину линий на наших псевдорисунках. Для этого предусмотрены команды \thinlines (тонкие линии) и \thicklines (толстые линии). По умолчанию стоит режим, в котором линии будут тонкими. Команды \thicklines и \thinlines можно давать не только в преамбуле, но и в самом тексте (в том числе и внутри окружения picture}, так что можно регулировать, какие линии будут толстыми, а какие тонкими). Если одна из этих команд дана внутри группы, то по окончании группы ее действие прекращается (не забывайте, что любое окружение само по себе образует группу).

Кроме того, можно задать произвольным образом толщину вертикальных и горизонтальных (но не наклонных!) линий. Для этих целей служит команда \linethickness. У этой команды один обязательный аргумент — толщина линий, выраженная в TeX'овских единицах длины. Если мы скажем

\linethickness{2.5mm}

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



Псевдорисунки


Когда создавался TeX, а начиналось это в 1978 году, компьютерная графика была развита слабо. Поэтому операция по включению в текст рисунков в виде графических файлов в TeX'е не стандартизирована: TeX допускает импорт графического файла в текст с помощью команды \special, в аргументе которой содержится информация об импортируемом файле, но способ задания этой информации зависит от используемых dvi-драйверов, что снижает переносимость TeX'овских файлов. Чтобы как-то сгладить это неудобство, создатель LaTeX'а Лесли Лэмпорт предусмотрел возможность создания примитивных рисунков, состоящих из прямых и наклонных (с ограниченным репертуаром наклонов) линий, стрелок и окружностей (в принципе можно также рисовать кривые более или менее произвольной формы). В этой лекции мы расскажем, как создавать такие "псевдорисунки".

Средства LaTeX , описываемые в этой лекции, при профессиональной подготовке оригинал-макетов применяются редко: гораздо удобнее пользоваться PostScript-графикой. См. приложение Б.



Создание псевдорисунка и размещение на нем объектов


Псевдорисунки создаются с помощью окружения {picture}. Изучение этого окружения удобно начать с примера.

\begin{picture}(110,50) \put(55,15){Стрелка} \put(55,15){\vector(-2,1){40}} \put(0,0){\line(1,0){20}} \put(0,0){\line(0,1){20}} \end{picture}

Разберем исходный текст, создавший этот рисунок: стрелку с надписью и уголок. На каждый псевдорисунок LaTeX должен отвести в тексте определенное место (после чего сам рисунок вполне может и выйти за пределы отведенного места: все зависит от того, что и где вы будете " рисовать"). Эти размеры задаются в круглых скобках через запятую немедленно после \begin{picture}, сначала ширина, затем высота (команды, связанные с псевдорисунками, - единственные в LaTeX'е, у которых в определенных случаях обязательный аргумент ставится не в фигурных скобках). Между скобками, запятой и числами, задающими размеры псевдорисунка, не должно быть пробелов (помните, что конец строки также воспринимается TeX'ом как пробел; если переноса на другую строку не избежать, воспользуйтесь знаком % для устранения получающегося пробела, как в примере на стр.18). По умолчанию ширина и высота псевдорисунка, и вообще все относящиеся к псевдорисункам размеры, задаются в пунктах (так и сделано в нашем примере). Можно указать любую единицу измерения размеров, относящихся к псевдорисункам: для этого надо изменить значение параметра \unitlength и далее по поводу параметров, являющихся длинами): если мы хотим, чтобы длины измерялись в миллиметрах, надо написать в преамбуле

\unitlength=1mm

(но не просто mm!). Размеры могут быть не только целыми, но и дробными числами, в которых нужно использовать десятичную точку (но не запятую).

Итак, место на псевдорисунок выделено. Чтобы поместить что-то на этот псевдорисунок, используется команда \put (внутри окружения {picture} писать текст "просто так" не следует). После \put в круглых скобках через запятую следуют координаты того объекта, который мы размещаем на псевдорисунке (сначала абсцисса, затем ордината; началом координат по умолчанию считается левый нижний угол псевдорисунка), а затем, без пробела, в фигурных скобках, — тот объект, который надо нанести.
Для первой из наших команд \put этот объект был просто текстом, и соответственно в фигурных скобках только этот текст и был; для остальных трех команд, размещавших на рисунке стрелку и два отрезка, в фигурных скобках помещается нечто более сложное: описание этой стрелки и отрезков. В следующем разделе мы разберем, как такие описания устроены. Кстати, уголок в приведенном выше примере — не что иное, как левый нижний угол псевдорисунка (точка с координатами (0,0)}).

Когда мы говорили о координатах объекта, имелись в виду координаты так называемой "точки отсчета" на этом объекте. Если объект — текст, то точка отсчета — его левый нижний угол. Иногда при размещении текста удобней задать координаты его правого, а не левого нижнего угла. Чтобы так сделать, можно воспользоваться командой \llap с одним аргументом — текстом, чья точка отсчета будет в правом нижнем углу. В следующем примере точка отсчета "полужирной" кошки будет в левом нижнем углу, а "рубленой" — в правом нижнем.



\begin{verbatim} \begin{picture}(110,40) \put(82,20){\textbf{Кошка}} \put(80,20){\llap{\textsf{Кошка}}} \end{picture} Точка отсчета стрелки — ее начало. Когда пойдет речь о других объектах, размещаемых на псевдорисунке, мы будем указывать, где расположены их точки отсчета.

Еще несколько общих правил, относящихся к окружению {picture}. Во-первых, внутри этого окружения не должно быть пустых строк. Во-вторых, необходимо сказать о том, как окружение {picture} взаимодействует с окружающим текстом. Весь псевдорисунок, порождаемый этим окружением, рассматривается TeX'ом как одна большая буква, ширина и высота которой заданы в скобках через запятую после \begin{picture}, так что если окружение {picture} встретилось в середине абзаца, эта "буква" будет помещена в строку, причем соседние строки раздвинутся, чтобы она поместилась. Если это не то, чего вы хотите, — начинайте окружение {picture} между абзацами (после пустой строки или команды \par). Можно также поместить окружение {picture} внутри окружения наподобие {flushright} или {center} — при этом LaTeX автоматически установит разумные интервалы между псевдорисунком и окружающим текстом.Совершенно безбоязненно можно помещать окружение {picture} внутри "плавающего" окружения {figure} или {table}.

Если вы оформляете псевдорисунок как рисунок в оборку с помощью окружения {wrapfigure} (при подключенном пакете {wrapfig}) то ширину рисунка, которую, как вы помните, необходимо задать во втором обязательном аргументе окружения {wrapfigure}, можно задать как кратное параметра \unitlength. Например, если псевдорисунок начинается с

\begin{picture}(50,43) то окружение {wrapfigure} надо начать как-нибудь так:

\begin{wrapfigure}{o}{50\unitlength} Кроме текста, на псевдорисунках можно размещать отрезки, стрелки, окружности, круги и овалы (прямоугольники с закругленными углами). Далее мы опишем, как задавать эти объекты.


Более сложные случаи


Надписи, охватывающие несколько колонок. Чтобы создать такую надпись, нужно на месте соответствующей графы таблицы записать команду \multicolumn. У этой команды три обязательных аргумента:

Количество колонок, охватываемых нашей " нестандартной" графой."Преамбула" нашей графы. В качестве таковой может выступать буква l, r или c (текст в графе был прижат влево, вправо или центрирован), возможно, с символами | слева или справа, если мы хотим, чтобы графа была ограничена вертикальными линейками.Текст, записываемый в графу.

Пример — в таблице (1)

(1)

Получается эта таблица таким образом (обратите внимание, что в строке с ценами в командах \multicolumn вертикальная черта стоит справа от c, но не стоит слева):

\begin{tabular}{|l|l|l|l|} \hline \multicolumn{4}{|c|}{\textbf{Популярные напитки}}\\ \hline Название & Старый мельник & Бочкарев & Очаковское\\ \hline Атрибут&Душевное & Правильное & Живительное\\ \hline Цена & \multicolumn{2}{c|}{15} & \multicolumn{1}{c|}{14}\\ \hline \end{tabular}

Если таблица, в которой вы используете \multicolumn, является к тому же еще и линованной, то возможностей команды \hline для рисования горизонтальных отрезков может не хватить: иногда бывает нужен горизонтальный отрезок, простирающийся не на всю ширину таблицы, а охватывающий только часть ее колонок. Для рисования таких отрезков предусмотрена команда \cline. Как и \hline, ее нужно давать сразу после \\ , но она имеет обязательный аргумент - номера первой и последней из колонок, охватываемых горизонтальной чертой, разделенные знаком "минус". Примеры использования команды \cline будут даны ниже .

Абзацы в графах таблицы. Иногда требуется, чтобы в графе таблицы стояла не строка, а абзац текста, переносы и разрывы строк в котором находятся автоматически. Чтобы этого добиться, надо в преамбуле вместо буквы l, c или r, описывающей структуру колонки, написать p{...}, где вместо многоточия должна быть указана ширина колонки (в TeX'овских единицах ).
Вот как можно представить в виде таблицы известную шутку М.М.Жванецкого:

\begin{tabular}{|p{5cm}|p{5cm}|} \hline \multicolumn{2}{|c|}{\large\textbf{Я видел раков}}\\ \hline Вчера: & Сегодня: \\ Маленькие, но по три рубля, но очень маленькие, но по три, но очень маленькие. & Большие, но по пять рублей, но большие, по пять рублей, но очень большие, но по пять.\\ \hline \end{tabular} По умолчанию абзацы в графах таблицы печатаются выровненными, но без абзацного отступа; если абзацный отступ нужен, начните абзац с установки необходимого значения параметра \parindent; если выравнивание не нужно, дайте команду \raggedright; одним словом, вы можете проделывать с этими абзацами все манипуляции, описанные в разд.3.6 .

Из этого правила есть одно важное исключение: для принудительного разрыва строки в абзацах, являющихся графами таблицы, вместо команды \\ надо использовать команду \tabularnewline (команда \\ в окружениях {tabular} и {array} означает "перейти к новой строке таблицы").

Что такое колонка? При работе с линованными таблицами возникает вопрос, как LaTeX понимает слова "одна колонка"? Пусть, например, преамбула таблицы имеет вид ||c|ll||r|l|l, и мы в одной из строк написали, скажем,

Что-то&\multicolumn{1}{r}{Что-то еще}&&&И еще&Еще\\" Напечатается ли в этой графе вертикальный отрезок между первой и второй колонками? Другой пример: пусть в таблице с той же преамбулой какая-то из строк имеет вид

Слово & Еще слово & Еще одно\\ (стало быть, заканчивается эта строка преждевременно); сколько вертикальных отрезков будет напечатано в конце этой строки? Ответ таков. Преамбула делится на части, соответствующие колонкам. Если в преамбуле присутствуют только буквы l, c, r или p, то каждая такая часть — это просто соответствующая буква (p — вместе с выражением после нее:p{...}). Если же, кроме этого, в преамбуле присутствуют вертикальные черточки между буквами или так называемые at-выражения (о них речь пойдет ниже), разделение преамбулы на колонки происходит по таким правилам:



в каждой из колонок присутствует одна и только одна из букв l, c, r или p (последняя — вместе с выражением "{...}");каждая колонка, кроме, возможно, первой, начинается с буквы.В нашем примере, в частности, колонки устроены так:

Поэтому в конце графы таблицы с такой преамбулой, оборванной после третьей колонки, будут напечатаны два вертикальных отрезка, поскольку они принадлежат третьей колонке. А если на месте второй графы такой таблицы написано "Что-то&\multicolumn{1}{r}{Что-то еще}", то вертикальный отрезок между первой и второй колонками также будет напечатан: этот отрезок является принадлежностью первой колонки, и команда \multicolumn, меняющая оформление второй колонки, отменить его не может.


Более сложные средства


Интервалы и разрыв между строками. Команда \\ внутри окружения {tabbing} может иметь необязательный аргумент, действующий формально так же, как для этой команды, употребляемой внутри абзаца: если в квадратных скобках поставить длину (измеренную в воспринимаемых TeX'ом единицах, или же какой-либо LaTeX'овский параметр, значением которого является длина, например, \medskipamount), то после этой строки будет сделан дополнительный интервал, величина которого равна указанной длине. Имеет команда \\ и "вариант со звездочкой", если написать \\* вместо \\, то после строки, завершаемой этой командой, начинать новую страницу будет запрещено. Команда \\* также может принимать необязательный аргумент. Он имеет тот же смысл, что и для соответствующей команды без звездочки.

Переустановка позиций табуляции. Команды \=, устанавливающие позиции табуляции, можно давать не только в первой строке. Сначала пример:

\begin{tabbing} парочка \=позиций \=табуляции\\ \>плюс\>еще одна здесь:\=\\ теперь\>их\> уже\>три\\ Вторую \>мы\quad \=сменим \> и посмотрим:\\ где\>эти\> позиции\>теперь\\ \end{tabbing}

Опишем точно, как команда \= взаимодействует с \>. Внутри окружения {tabbing} в каждый момент LaTeX'у известно некоторое количество позиций табуляции, занумерованных подряд, от нуля до какого-то целого числа (не более двенадцати). При входе в окружение известна только позиция с номером нуль (это всегда начало строки). Увеличиваться число известных позиций может за счет команды \=, используются позиции табуляции командой \>. Если команда \= встречается в строке после того, как использованы все известные позиции табуляции, то количество известных позиций табуляции увеличивается на 1 и очередная позиция табуляции устанавливается в месте, куда попала команда \=. Если же \= встречается в строке до того, как все известные позиции табуляции израсходованы, то новых известных позиций не прибавляется, просто очередная по счету позиция табуляции заменяется на ту, которую задает команда \=.


Иногда бывает необходимо в пределах одной и той же таблицы временно перейти на новое расположение позиций табуляции, а затем вернуться к прежнему. Для этого используются команды \pushtabs и \poptabs. Первая из них запоминает расположение позиций табуляции; после этой команды можно позиции переустановить, пользоваться этими новыми переустановленными позициями... — после команды \poptabs значения старых позиций табуляции будут восстановлены. Пример:

\begin{tabbing} раз\quad\=два\quad\=три\quad\=четыре\\ \pushtabs гиппопотам\quad\=аллигатор\\ раз\>два\\ три\>четыре\\ \poptabs one\>two\>three\>four\\ viens\>divi\>tr\a=\i s\>\v{c}etri\\ \end{tabbing} Команды \pushtabs и \poptabs должны быть "сбалансированы": каждой команде \pushtabs, запоминающей позиции табуляции, должна соответствовать вспоминающая их команда \poptabs. Если это условие не выполнено, вы получите сообщение об ошибке. Обратите также внимание, что знак долготы над буквой i в слове tris ("три" по-латышски) мы поставили с помощью команды \a. \looseness 1

Экзотика. Для полноты картины опишем некоторые изысканные возможности окружения {tabbing}.

Команда \'(внутри окружения {tabbing}) размещает текст таким образом, чтобы он не начинался, а заканчивался у позиции табуляции. Сама эта команда позиций табуляции "не тратит"; просто весь текст, размещенный между \> или \= и \', размещается левее позиции табуляции, определяемой командой \> или \=. Таким способом можно верстать таблицы, в которых колонки выровнены по правому краю, а не по левому, как получается при обычном использовании {tabbing}. Вот пример:

\begin{tabbing} \hspace{3.5cm}\=\kill слева\>справа\'\\ \a`a gauche\>\a`a droite\'\\ links\>rechts\'\\ pa kreisi\>pa labi\' \end{tabbing} Еще раз обратите внимание, что для постановки диакритического знака над буквой a нам пришлось писать "\a`" вместо \` .

Команда \` внутри окружения {tabbing} прижимает весь текст строки, идущий после нее, к правому краю; между этой командой и командой, завершающей строку, не должно быть команд, использующих или устанавливающих позиции табуляции.


Например, таблицу, у которой первая колонка выровнена по левому краю, а вторая — по правому (как в предыдущем примере), можно было бы задать так:

\begin{tabbing} слева\`справа\\ \a`a gauche\`\a`a droite\\ links\`rechts\\ pa kreisi\`pa labi\\ \end{tabbing} Кстати, здесь нам вообще не понадобилось устанавливать позиции табуляции. Впрочем, смотрится эта таблица неважно.

Как мы уже отмечали, при начале новой строки текст начинается с нулевой позиции табуляции, т. е. с начала строки. Команда \+ позволяет изменить такое положение вещей: после этой команды при начале каждой новой строки текст будет начинаться не с нулевой, а с первой позиции табуляции (как если бы каждая последующая строка начиналась с команды \>). Если дать еще одну команду \+, то текст в последующих строках будет начинаться уже и не с первой, а со второй позиции, и т. д. Команда \- в окружении {tabbing} внутри окружения {tabbing} означает вовсе не место, где можно перенести слово (впрочем, команда с таким действием в этом окружении и не нужна): она действует противоположно команде \+. Наконец, команда \<, будучи употребленной в начале строки (в других местах ее употреблять нельзя), действует аналогично \-, но в пределах только этой строки (а не всех последующих, как \+ и \-). Следующий пример иллюстрирует все эти изыски:

\begin{tabbing} раз \=два \=три \=\kill раз\>два\>три\>четыре\+\\ два\+\\ три\+\\ четыре\\ \<три\\ четыре\-\-\\ два\-\\ раз\>два\>три\>четыре\\ \end{tabbing} Описанные в этом разделе возможности окружения {tabbing} на практике используются редко, поскольку для печати сложных таблиц в LaTeX'е есть более удобное средство — окружение {tabular}. Перейдем к его описанию.


Элементарные средства


Табулятор имитируется в LaTeX'е с помощью окружения {tabbing}. При печати таблиц с помощью этого окружения пользователь сам задает места, в которых должна начаться очередная колонка. Конкретно это выглядит так. При наборе первой строки этого окружения можно в любой момент поставить команду \= в окружении {tabbing}- она отмечает очередное место, с которого начинается новая колонка ("позицию табуляции"). Это место (расстояние от начала строки) запоминается, и в дальнейшем можно с помощью команды \> "перескочить" к очередной позиции табуляции — текст, следующий после этой команды, будет набираться, начиная с позиции табуляции. Строки разделяются командой \\. Рассмотрим это на примере:

\begin{tabbing} начало\quad\=середина \quad\=конец\\ раз\>два\>три\\ раз\> два\> три\\ начинаем\> продолжаем\> заканчиваем\\ \end{tabbing}

В первой строке мы задали две позиции табуляции двумя командами \= (на всякий случай мы разделили дополнительными пробелами слова в первой строке и, тем самым, наши позиции табуляции; отсюда команды \quad). Первая строка завершается командой \\, а во второй строке мы начинаем установленными позициями табуляции пользоваться. Слово "раз" напечаталось с начала строки (каждая строка начинается с крайней левой позиции, если отсутствует команда вроде \>, задающая переход к новой позиции). Далее идет команда \> — " перейти на следующую позицию табуляции". И действительно, следующее после нее слово "два" начинается со второй позиции — как раз там же, где начиналось слово "середина". Перед словом "три" стоит еще одна команда \> — оно печатается с третьей позиции, как раз под словом " конец", с начала которого мы эту позицию и определили. Третья строка ничем не отличается от четвертой, хотя в исходном тексте между командами \> и словами стоят пробелы. Дело в том, что пробелы после команд \> игнорируются. Наконец, в четвертой строке слова при печати наложились друг на друга.
Это и не удивительно: окружение {tabbing} исправно начинает очередную порцию текста с той позиции, которую мы ему указали, но при этом не проверяет, сколько места этот текст реально займет и не будут ли перекрываться колонки — за это целиком отвечает тот, кто текст готовит. Видимо, в данном случае следовало оставить побольше места при определении позиций табуляции (например, написать в первой строке \qquad вместо \quad).

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

\begin{tabbing} начинаем \=продолжаем \= заканчиваем\kill начало\>середина\>конец\\ \bfseries раз\> \itshape два\>три\\ начинаем\>продолжаем\> заканчиваем\\ \end{tabbing} Обратите внимание, что при установке позиций табуляции в первой (не печатающейся) строке мы сделали пробелы между концом слова и командой \= (иначе в последней строке слова бы опять слились: нам нужно, чтобы первая позиция табуляции не была впритык к концу слова "начинаем"). Заметьте также, что во второй строке мы убрали команды \quad; можно было бы их и оставить — на внешний вид таблицы это бы никак не повлияло, поскольку позиции табуляции уже установлены и лишние пробелы перед очередной командой \> никого не волнуют. По этой же причине мы не потрудились оставить пробелы между словами и \> в строке " начинаем, продолжаем, заканчиваем". Наконец, обратите внимание и на то, как мы меняли шрифт в строке "раз, два, три": слово "три" переключилось на обычный шрифт само собой. Это объясняется тем, что часть текста окружения {tabbing}, расположенная между двумя командами \> или \=, образует группу.

Внутри окружения {tabbing} используется команда \=, которая, как мог заметить читатель, обычно имеет совсем другой смысл — постановка диакритического знака над буквой. Команды \' и \` также имеют внутри этого окружения особый смысл, о котором пойдет речь ниже. Поэтому, если внутри {tabbing} нам понадобился диакритический знак (скажем, над буквой e), то надо руководствоваться такой таблицей:

Таблица 6.1. Внутри окружениявместонадо набирать
\=e\a=e
\'e\a'e
\`e\a`e


Пакет array


В этом разделе мы рассказываем о различных мелких (но нередко полезных) дополнительных возможностях, открывающихся при подключении стилевого пакета array.

Итак, предположим, что этот пакет подключен. Что нового вы сможете сделать?

При пользовании командой \hline горизонтальные линейки иногда слишком плотно примыкают к тексту (особенно если текст содержит прописные буквы). В " чистом" LaTeX'е для борьбы с этим надо либо писать

\renewcommand{\arraystretch}...

либо вставлять в каждую строку по дополнительной распорке. При подключении пакета {array} появляется и более простой способ: надо присвоить ненулевое значение параметру \extrarowheight. Это — величина, которая добавляется к высоте каждой строки таблицы. Этому параметру можно присваивать значения так же, как и любому другому параметру со значением длины; по умолчанию его величина равна нулю, для лучшего отделения линеек от текста хорошо присвоить ему значение 2-3 пункта.

Если вы пользовались окружением {tabular} с необязательным аргументом t, задающим выравнивание таблицы как " буквы" по верхней строке, то могли обратить внимание, что это выравнивание нарушается, если таблица начинается с горизонтальной линейки:

\begin{tabular}[t]{rr} а & б \\в & г \end{tabular} \begin{tabular}[t]{|rr|} \hline а & б \\в & г\\ \hline \end{tabular}

Чтобы выравнивание происходило не по линейке, а по первой строке текста, надо задать верхнюю линейку командой \firsthline, а не \hline.

\begin{tabular}[t]{rrrr} а & б & в & г \\ д & е & ж & з \end{tabular} \begin{tabular}[t]{|rrrr|} \hline а & б & в & г \\ д & е & ж & з\\ \hline \end{tabular}\\[1in] \begin{tabular}[t]{rrrr} а & б & в & г \\ д & е & ж & з \end{tabular} \begin{tabular}[t]{|rrrr|} \firsthline а & б & в & г \\ д & е & ж & з\\ \hline \end{tabular}

Аналогично, чтобы при пользовании {tabular} с необязательным аргументом b выравнивание таблицы как целого шло по нижней строке текста, а не по нижней линейке, надо нижнюю горизонтальную линейку задать командой \lasthline, а не \hline.


Как мы знаем, в преамбуле окружения {tabular} (а также {array}) могли стоять буквы l, r, c или выражение p{...}, обозначающие тип колонки, а между ними — вертикальные черточки или at-выражения. Пакет {array} добавляет кое-что к этому списку.

Во-первых, при подключении этого пакета в преамбуле, наряду с выражением p{...}, можно пользоваться выражениями m{...} и b{...}. Как и p{...}, они указывают, что в колонке стоит абзац текста ширины, заданной в фигурных скобках. Однако в графах абзац, заданный с помощью b{...}, выравнивается по своей нижней строке, абзац, заданный с помощью m{...} - по середине своей высоты, а абзац, заданный с помощью p{...}, всегда выравнивался по своей верхней строке.

\begin{tabular}{p{.9in}m{.9in}b{.9in}} Все выше, и выше, и выше! & Все выше, и выше, и выше! & Все выше, и выше, и выше!\\ \end{tabular} Наряду с at-выражениями, пакет {array} позволяет использовать в преамбуле еще и !-выражения. Именно, между буквами, обозначающими колонки, можно, наряду с вертикальными черточками и at-выражениями, написать !{...}, где на месте точек стоят какие-то TeX'овские команды и/или текст. Эта конструкция оказывает то же действие, что и at-выражение, но при этом, в отличие от at-выражения, не подавляет интервал между колонками. Поэтому !-выражение удобно использовать для увеличения интервала между колонками: в таблице с преамбулой

{rc!{\hspace{2pt}}cl} интервал между двумя центрированными колонками будет увеличен на два пункта.

Другое возможное применение !-выражений — печать линованных таблиц, в которых вертикальные линейки, разделяющие колонки, имеют разную ширину. Если, например, мы хотим, чтобы какая-то из вертикальных линеек имела ширину 1pt, а не \arrayrulewidth, надо в преамбуле вместо вертикальной черточки |, обозначающей эту линейку, написать !{\vrule width 1pt\relax}.

Наконец, еще одна интересная возможность, предоставляемая пакетом {array}, — это автоматическая вставка TeX'овских команд в начале и/или конце колонки.


Именно, если в преамбуле непосредственно перед любой из букв l, c, r, t, mили b, обозначающих тип колонки, вставить выражение

>{команды} то команды будут автоматически добавляться в начало соответствующей колонки. Это может пригодиться, если вам нужно сменить шрифт в одной из колонок:

\begin{tabular}{|>{Генрих }l|>{\slshape}l|} \hline II & 1519--1559\\III & 1551--1589\\ IV & 1553--1610\\ \hline \end{tabular} Можно также после буквы, обозначающей тип колонки, или после конца p-, m-, или b-выражения, написать

<{команды} чтобы команды были добавлены в конец колонки. Эта конструкция полезна, если какие-то из колонок в таблице, оформленной как {tabular}, должны набираться в математическом режиме — достаточно поставить в начале и конце этой колонки по знаку доллара. Пример:

\begin{tabular}{l>{$}l<{$}} квадрат суммы & (x+y)^2\\ квадрат разности & (x-y)^2\\ сумма кубов & x^3+y^3 \end{tabular}

Печать текста с выравниванием


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

В настоящей лекции мы рассмотрим два основных способа, предоставляемых TeX'ом для печати текста с выровненными колонками (например, таблиц). Начнем с менее мощного, но более простого — имитации табулятора.



Пересечения линеек


Возможностей окружения {array} вполне хватает для печати простейших линованных таблиц, но в более сложных случаях возникают проблемы. Если подключить стилевой пакет {hhline}, работа с линованными таблицами облегчается.

Итак, предположим, что этот пакет подключен. Тогда для задания горизонтальных линеек становится доступной, наряду с уже известными \hline и \cline, новая команда \hhline, в аргументе которой описывается как сама линейка, так и ее пересечения с вертикальными линейками. Вот первый пример ее использования:

\begin{tabular}{|c|cc|c|} \hline А & Б & В & Г\\ \hhline{|=|~~|-|} Д & Е & Ж & З\\ \hline \end{tabular}

Аргумент команды \hhline устроен следующим образом. Во-первых, в нем сказано, что на территории первой колонки линейка должна быть двойной (символ =), на территории второй и третьей колонок линейки не должно быть вовсе (символ ~ - "тильда"), а на территории четвертой колонки линейка должна быть одинарной (символ -). Если в таблице

колонок, то в аргументе \hhline должны присутствовать
символов -, = или ~, имеющих тот же смысл, что и выше.

Между этими символами, описывающими поведение линейки внутри колонок, расположены символы, описывающие пересечения горизонтальной линейки с вертикальными. В нашем примере это были вертикальные черточки |; кроме них, для задания информации о пересечениях линеек можно использовать символы :, #, а также буквы t и b. Какие именно пересечения линеек можно получить с их помощью, видно из следующей таблицы:

Вот пример таблицы, в которой используются эти возможности команды \hhline:

\begin{tabular}{||cc||cc||} \hhline{|t:==:t:==:t|} 1 &2 &3 &4\\5 &6 &7 &8\\ \hhline{#==::==||} А & Б & В & Г\\ \hhline{||--||~~} Д & Е & Ж & З\\ \hhline{|b:==:b:==:b|} \end{tabular}

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



В этом разделе мы приведем


В этом разделе мы приведем различные примеры верстки сложных таблиц с помощью LaTeX'а. По ходу дела будет рассказано и о некоторых изысканных возможностях окружений {tabular} и {array}, о которых до сих пор речи не было. Кое-где в этом разделе мы будем предполагать, что читатель знаком со средствами математического набора, описанными в лекции 2.
Наш первый пример — таблица французских притяжательных местоимений, взятая из русско-французского словаря акад. Л.В.Щербы (табл. 2),
(2)
{\small \begin{tabular}{cll} \multicolumn{2}{c}{существительные формы} & прилагательные формы\\[\smallskipamount] мой & $\left\{ \begin{tabular}{l} le mien, la mienne\\les miens, les miennes\\ \end{tabular} \right.$ & mon, ma, mes\\[\bigskipamount] твой & $\left\{ \begin{tabular}{l} le tien, la tienne\\les tiens, les tiennes\\ \end{tabular}\right.$ & ton, ta, tes\\[\bigskipamount] его, ее, свой & $left\{ \begin{tabular}{l} le sien, la sienne\\les siens, les siennes\\ \end{tabular}\right.$ & son, sa, ses\\[\bigskipamount] наш & le n\^otre, la n\^otre, les n\^otres & notre, nos\\ ваш & le v\^otre, la v\^otre, les v\^otres & votre, vos\\ их, свой$^1$ & le leur, la leur, les leurs & leur, leurs\\ \cline{1-1} \multicolumn{3}{l}{$^1$\rule{0pt}{11pt}\footnotesize Лишь в значении принадлежности 3-му лицу.}\\ \end{tabular} } Разберем, как устроена эта таблица. Как явствует из ее преамбулы cll, она состоит из трех колонок, из которых левая центрирована, а две другие прижаты влево. Соответственно, три последние графы набраны совершенно бесхитростно. Заголовок таблицы сделан с помощью команды \multicolumn; команда \\, завершающая первую строку таблицы, имеет необязательный аргумент; это сделано, чтобы отодвинуть заголовок по вертикали от остальной части таблицы.
Рассмотрим теперь, как устроена вторая графа (начинающаяся с местоимения "мой"). Текст
образует в нашей таблице одну "запись" (часть таблицы, расположенную на пересечении графы и колонки).
Чтобы получить фигурную скобку требуемого (и неизвестного нам заранее) размера, мы воспользовались командами \left и \right, применяемыми при наборе формул . Так как эти команды вне формул использовать нельзя, нам пришлось оформить этот фрагмент текста как формулу. Между \left\{ и \right. стоит, как водится, та формула, по размеру которой получается фигурная скобка, заданная командой \left\{ — в нашем случае эта "формула" является фрагментом текста, задаваемым с помощью еще одного окружения {tabular} (с преамбулой l). Команды \\, завершающие первые три графы основной части таблицы, имеют необязательные аргументы, задающие дополнительные вертикальные пробелы после этих граф (иначе фигурные скобки будут упираться друг в друга и портить вид таблицы).
К местоимению "свой" в последней строке таблицы дана сноска. Знак сноски реализован нами опять же как математическая формула — верхний индекс 1 к "пустой формуле"; текст сноски реализован как графа таблицы, охватывающая все три колонки (с помощью команды \multicolumn. Команда \footnotesize задает размер шрифта, используемый в обычных сносках. Линия, отделяющая сноску от остальной части таблицы, реализована с помощью команды \cline. Наконец, посмотрим, как задана цифра 1 в самом тексте сноски. Вместо ожидаемого
написано вот что:
$^1$\rule{0pt}{11pt}| Как объясняется в разд. 3.10, команда \rule задает в данном случае невидимый символ, занимающий по вертикали 11 пунктов и не занимающий места по горизонтали. Мы поставили этот невидимый символ в качестве подпорки: без нее горизонтальная черта соприкасалась бы с цифрой 1.
Вся таблица в целом набрана мелким шрифтом (иначе она не помещалась на страницу).
Следующий пример (табл. 3 ) — расписание работы одной химчистки.
(3)
Для него исходный текст выглядит так:
\begin{tabular}{lr@{--}l@{\qquad Обед\quad}r@{--}l} Понедельник & $8^{30}$ & 15 & 11 & 12 \\ Вторник & 12 & 19 & 15 & 16 \\ Среда & 10 & 17 & $12^{30}$ &$13^{15}$ \\ Четверг & 9 & 17 & 12 & 13 \\ Пятница & 11 & 16 & &\\ Суббота & 8 & 14 & 11 & 12\\ \end{tabular} В преамбуле тут используется конструкция, с которой мы пока не встречались.


Объясним, что она делает.
До сих пор мы говорили, что в преамбуле каждая колонка таблицы может обозначаться символом l, c, r или "p{...}" , а по краям или между колонками могут еще стоять вертикальные черточки \|, обозначающие разделительные вертикальные линейки. Это, однако, не вся правда. В качестве разделителя колонок (а также с краев) в преамбуле может быть использовано еще и так называемое "at-выражение"1): символ @, непосредственно после которого в фигурных скобках записан какой-то текст, возможно, с TeX'овскими командами. В таблице этот текст будет вставлен между соответствующими колонками во всех строках (если, разумеется, формат какой-то графы таблицы не был изменен командой \multicolumn). Мы использовали at-выражение трижды: два раза для вставки тире и один раз - для слова "Обед". А зачем же нам понадобились команды \qquad и \quad вокруг этого слова? Дело в том, что между колонками, разделенными at-выражением, не вставляется дополнительный интервал, которым LaTeX разделяет колонки в таблицах, созданных с помощью окружений {tabular} или {array}: именно поэтому тире между часом открытия химчистки и часом ее закрытия плотно прилегает к обоим числам. Слово "Обед", однако же, совсем не должно вплотную прилегать к началу обеденного перерыва, поэтому промежуток нужно создать самому, и проще это сделать один раз внутри все того же at-выражения, чем писать \quad для каждого рабочего дня.
Иногда at-выражение имеет смысл применять даже в виде @{}: между колонками при этом ничего не вставится, но зато дополнительный интервал между колонками, разделенными этим выражением, будет подавлен. Если написать @{} в преамбуле перед символом, обозначающим первую колонку, или после символа, обозначающего последнюю колонку, то будет подавлен дополнительный интервал, вставляемый перед первой или после последней колонки (это может помочь, если таблица немного не помещается на страницу по ширине).
Иногда интервал между колонками, автоматически устанавливаемый окружением {tabular} или {array}, является неудачным (ниже мы разберем соответствующий пример).


В этом случае можно самостоятельно установить для него подходящее значение. Для этого надо присвоить новое значение параметру \tabcolsep для окружения {tabular} или \arraycolsep для окружения {array} (см.выше по поводу параметров). По обе стороны от каждой колонки таблицы добавляется пробел размером \tabcolsep (соответственно \arraycolsep). Стало быть, значение этих параметров — половина расстояния между соседними колонками.
Наряду с расстоянием между колонками можно менять толщину линеек в линованных таблицах (обозначается \arrayrulewidth; относится этот параметр как к {array}, так и к {tabular}), а также расстояние между соседними линейками - это расстояние обозначается \doublerulesep, и оно также относится в равной мере к {array} и к {tabular}.
Теперь разберем обещанный пример, в котором приходится менять заданное по умолчанию расстояние между колонками. Посмотрите на такую формулу:
Она была создана с помощью следующих LaTeX'овских команд:
$$ \arraycolsep=0.05em \begin{array}{rrr@{\,}r|r} x^2&{}+2x&,{}-12&&\,x+5\\ \cline{5-5} x^2&{}+5x&&&\,x-3\\ \cline{1-2} &{}-3x&{}-12\\ &{}-3x&{}-15\\ \cline{2-3} &&3 \end{array} $$ Сразу же скажем, зачем нам понадобилось менять \arraycolsep: без этого интервалы между слагаемыми в каждой строке выходили непомерно большими. А теперь разберем исходный текст подробнее. Начнем с преамбулы rrr@{\,}r|r. В ней первые три колонки отведены под слагаемые, наподобие
,
или
; пятая колонка предназначена для делителя и частного (
и
), а вертикальная черточка в преамбуле перед буквой r, задающей пятую колонку — для вертикального отрезка, входящего в состав "уголка". С другой стороны, в четвертой колонке нет вообще никакого текста: между третьим и четвертым знаками & ни в одной строке ничего не написано. Эту пустую колонку мы создали для того, чтобы вертикальный отрезок не пошел ниже, чем нужно: без нее с преамбулой rrr|r вертикальный отрезок относился бы к четвертой колонке, и в результате третья строка закончилась бы вертикальным отрезком, что нам совсем ни к чему.


Осталось заметить, что пары долларов, ограничивающие выключную формулу, заодно ограничивают и группу, так что по окончании формулы закончится и группа, и старое значение \arraycolsep восстановится автоматически.
Наш последний пример использования окружения {tabular} связан с проблемой, с которой мы столкнулись на ранее: как ликвидировать разрыв в вертикальных линейках, получающийся, если в линованной таблице написать две команды \hline подряд? Первое, что приходит в голову, — создать еще одну графу в таблице, в которой поместить только невидимую линейку высотой, скажем, 2 пункта; казалось бы, тогда горизонтальные линейки будут на расстоянии 2 пункта друг от дружки, а вертикальные линейки не будут прерываться. Результат, однако, получается совершенно неудовлетворительный:
\begin{tabular}{|c|c|} \hline Северо-Запад & Северо-Восток\\ \hline \rule{0pt}{2pt}&\\ \hline Юго-Запад & Юго-Восток\\ \hline \end{tabular} Чтобы понять, в чем тут дело, нам придется обсудить, каким образом LaTeX собирает таблицу из отдельных строк.
Таблицы, созданные с помощью окружения {tabular} или {array}, собираются из строк, которые вплотную приставляются друг к другу. При этом, чтобы расстояния между строками были одинаковыми, в каждую строку предварительно вставляется невидимая линейка (именно, линейка, создаваемая командой \strut). Из-за этой линейки расстояние между горизонтальными отрезками оказалось слишком большим, а наша линейка высотой в 2 пункта LaTeX'у не помогла: ведь \strut все равно выше! Чтобы обойти эту трудность, в LaTeX'е предусмотрен способ отменить автоматическую постановку \strut'ов во всех строках таблицы. Именно, для этого надо написать (не внутри окружения {tabular} или {array}!) так:
\renewcommand{\arraystretch}{0} Что такое \renewcommand, мы будем обсуждать в лекции 7 , а пока давайте воспринимать этот рецепт догматически. Скажем только, что, во-первых, если эта команда была дана внутри группы, то по выходе из группы ее действие отменяется, и, во-вторых, в явном виде восстановление режима, когда в каждую строку таблицы вставляется \strut, достигается с помощью команды


\renewcommand{\arraystretch}{1} Теперь уже легко добиться желаемого эффекта; надо только не забыть поставить в нужные строки команду \strut в явном виде, коль скоро автоматически это теперь не делается. Итак, таблица
набирается следующим образом:
{\renewcommand{\arraystretch}{0}% \begin{tabular}{|c|c|} \hline \strut Северо-Запад & Северо-Восток\\ \hline \rule{0pt}{2pt}&\\ \hline \strut Юго-Запад & Юго-Восток\\ \hline \end{tabular}% } Знаки процента в конце некоторых строк мы поставили, чтобы концы этих строк не воспринимались как пробелы (на самом деле в данной ситуации вреда от пробелов не было бы). Закрывающая фигурная скобка в последней строке закрывает группу, из которой была дана команда \renewcommand.
Если граф в таблице много, то, возможно, вам не захочется много раз писать \strut. В этом случае можно включить эту команду в преамбулу с помощью at-выражения. Возможный вариант такой:
{\renewcommand{\arraystretch}{0}% \begin{tabular}{|@{\strut\hspace{\tabcolsep}}c|c|} \hline Северо-Запад & Северо-Восток\\ \hline \multicolumn{1}{|c|}{\rule{0pt}{2pt}}&\\ \hline Юго-Запад & Юго-Восток\\ \hline \end{tabular} } Если бы в аргументе at-выражения не был указан горизонтальный пробел размером \tabcolsep, то левая вертикальная линейка была бы напечатана вплотную к тексту (потому что at-выражение подавляет автоматически вставляемый горизонтальный пробел); заметим также, что теперь, когда \strut включен в at-выражение, нам пришлось воспользоваться командой \multicolumn, чтобы этот \strut не попал и в ту строку, где мы так старались от него избавиться.
Описанный способ набрать таблицу с удвоенной горизонтальной линейкой — не единственный. Если подключить описываемый в следующем разделе стилевой пакет hhline, то можно это сделать, и не играя с командой \arraystretch.
Можно не только отменять автоматическое добавление \strut'а в строки таблицы, но и изменять его высоту. Например, если мы хотим, чтобы размер этой линейки увеличился (во всех строках) в
раза, можно написать:
\renewcommand{\arraystretch}{3.7} (вместо десятичной точки можно поставить и десятичную запятую).

Таблицы


При пользовании окружением {tabbing} вы должны самостоятельно следить, чтобы разные колонки не накладывались друг на друга. Можно, однако, передать эти заботы программе: TeX предоставляет возможности для печати таблиц, в которых ширина колонок выбирается автоматически (по максимальной ширине их содержимого). В LaTeX'е для этих целей используются окружения {tabular}(для набора таблиц с текстом) и {array} (для набора таблиц из формул). Помимо автоматизированного определения ширины колонки, эти окружения дают возможность печатать разлинованные таблицы, таблицы, в которых некоторые записи охватывают несколько колонок, и т.д. В лекции 2 уже шла речь про окружение {array}; здесь мы подробно разберем, как работает {tabular}; все возможности этого окружения, о которых идет речь в этой лекции, доступны и для {array}, и ниже мы дадим примеры их использования.



Таблицы, простирающиеся на несколько страниц


Как уже отмечалось, окружения {array} и {tabular} рассматриваются LaTeX'ом как одна большая буква, и потому не разбивается по страницам. Можно, однако, создавать таблицы, в которых и разбиение на страницы, и определение ширины колонок происходит автоматически. Для этого надо подключить стилевой пакет {longtable} и использовать окружение {longtable}. Как и окружение {tabular}, оно принимает один обязательный параметр — преамбулу (устроенную точно так же, как у {tabular}); внутри окружения действуют в точности те же правила записи текста, что и в окружении {tabular} (в частности, допустимы команды \hline, \cline и \multicolumn). Разница с окружением {array} в том, что получаемая при этом таблица может занимать несколько страниц и иметь произвольную длину.

Опишем теперь некоторые особенности окружения {longtable}, связанные с разбиением на страницы.

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

Во-вторых, вы имеете возможность сделать так, чтобы заголовок таблицы повторялся на каждой новой странице, на которой таблица продолжается. Для этого надо оформить заголовок в виде строки или группы строк (и/или команд \hline), и при этом последнюю из этих строк надо завершить не командой \\, а командой \endhead. Обычно, впрочем, повторяющийся заголовок не идентичен тому, который ставят в самом начале таблицы. Отдельный заголовок для начала таблицы также оформляют в виде одной или нескольких строк, последняя из которых завершается командой \endfirsthead. Кроме того, можно предусмотреть специальную группу строк, которая будет ставиться на каждой странице внизу таблицы — для этого надо записать строку или группу строк, завершив последнюю из них не командой \\, как обычно, а командой \endfoot.
Можно также предусмотреть отдельную группу строк, которая ставится внизу таблицы только на последней из занимаемых таблицей страниц. Для этого надо вместо \endfoot написать \endlastfoot. Группы строк, завершающиеся командами \endhead, \endfirsthead, \endfoot или \endlastfoot, должны стоять в начале окружения {longtable}. Вот пример использования этих средств:



Этой таблице соответствовал такой исходный текст:
\begin{longtable}{|l|l|l|l|} \multicolumn{4}{c}{Итоги собачьей выставки}\\ \hline Кличка & Пол & Порода & Оценка\\ \hline 1&2&3&4\\ \hline\endfirsthead \hline 1 amp; 2 & 3 & 4\\ \hline\endhead \hline \multicolumn{4}{c}{\textit{Продолжение на следующей странице}} \endfoot \hline\endlastfoot Алекс & кобель & миттельшнауцер & отл.\\ ... Эмир & кобель & эрдельтерьер & оч. хор.\\ \end{longtable} В таблице, оформленной с помощью {longtable}, можно явно указать место разрыва страницы с помощью \newpage (а также \pagebreak в окружении {longtable} или \nopagebreak). Эти команды должны следовать непосредственно после \\ (можно с новой строки).
При пользовании пакетом {longtable} предусмотрена возможность автоматической нумерации таблиц, созданных окружением {longtable}. Для этого используется та же команда \caption, в окружении {longtable}} что и в окружениях {table} или {picture}, но пользоваться ей надо чуть по-другому: после этой команды необходимо поставить \\, \endhead или \endfirsthead (или \endfoot,\ldots).
При этом автоматически нумеруемые таблицы можно обычным образом метить с помощью \label (и потом ссылаться на эти места с помощью \ref), но необходимо соблюдать два ограничения:
метку нельзя ставить в строки, которые появятся на печати более одного раза (благодаря повторению заголовков на других страницах);с команды \label не должна начинаться ни одна графа таблицы.На автоматически нумерующийся заголовок выделяется по умолчанию 4 дюйма. Чтобы изменить этот размер, надо присвоить соответствующее значение параметру \LTcapwidth.


В отличие от окружения {tabular}, таблица в окружении {longtable} не рассматривается как одна большая буква, а сразу располагается между абзацами, по умолчанию - по центру. Чтобы таблица была прижата к правому краю, надо указать у окружения {longtable} необязательный аргумент r (в квадратных скобках, между \begin{longtable} и преамбулой); необязательный аргумент l даст таблицу, прижатую влево.
  1)   Мы выбрали для него такое название, поскольку официально символ @ называется " коммерческое at"; неофициально этот символ называют самыми разными именами, от "собаки" до "блямбы".