Работа в системе LaTeX
Автоматическая генерация ссылок
Система LaTeX предоставляет возможность организовать ссылки на отдельные страницы или разделы документа таким образом, чтобы программа сама определяла номера страниц или разделов в этих ссылках. Объясним это на примере.Представим себе, что вам нужно сослаться на какое-то место в вашем тексте. Проще всего было бы указать страницу, на которой это место находится, написав "... как мы уже отмечали на с. 99" или что-то в этом роде, но как угадать, на какую страницу печатного текста попадет это место? Вместо того, чтобы гадать, можно сделать следующее:
\label{wash} Ссылка на страницу, на которой расположена метка, производится с помощью команды \pageref. У нее также один обязательный аргумент — та самая метка, на которую вы хотите сослаться. Пример:
![]() | Обязательно мойте руки\label{wash} перед едой, чтобы не заболеть. Как известно (см. с.~\pageref{wash}), руки надо мыть. |
В этом примере мы использовали еще значок "~ " (" неразрывный пробел"), чтобы при печати сокращение " с." попало на ту же строку, что и номер страницы. Подробности см. в разд."Неразрывный пробел" лекции 3.
После того как вы впервые вставите в свой файл команды \label и \pageref, при трансляции вы получите сообщение о том, что ваша ссылка не определена, а на печати или при просмотре увидите на месте своих ссылок вопросительные знаки.
Дело в том, что в этот момент LaTeX еще не знает значения ваших меток: он только записывает информацию о них в специальный файл (с тем же именем, что у обрабатываемого файла, и расширением aux при следующем запуске он прочтет эту информацию и подставит ссылки. Если в промежутке между двумя запусками в файл были внесены изменения, это может привести к сдвигу нумерации страниц. Если такие изменения действительно произошли, LaTeX сообщит вам об этом и попросит запустить программу еще раз, чтобы получить корректные ссылки. (На практике иногда нужно и больше запусков программы LaTeX — если в книге есть оглавление, предметный указатель и др.)
Если вы после двух запусков подряд получите сообщение о неопределенной ссылке, значит, в исходном тексте присутствует ошибка (вероятнее всего, опечатка в аргументе команды\pageref; возможно, вы забыли включить в текст команду \label).
На место, помеченное с помощью команды \label, можно сослаться с помощью команды \ref, а не \pageref — тогда на печати получится не номер страницы, а номер раздела документа, в котором находится метка, или номер рисунка, или номер элемента в нумерованном перечне и т.п. — пометить с возможностью ссылки можно почти любой элемент документа. Об этом мы будем подробно говорить в разд. "Еще о метках и ссылках" лекции 4.
Что такое TeX и LaTeX
Как уже отмечалось в предисловии, TeX (произносится "тех", пишется также "TeX") - это созданная американским математиком и программистом Дональдом Кнутом (Donald E. Knuth)- система для верстки текстов с формулами. Сам по себе TеX представляет собой специализированный язык программирования (Кнут не только придумал язык, но и написал для него транслятор, причем таким образом, что он работает совершенно одинаково на самых разных компьютерах), на котором пишутся издательские системы, используемые на практике. Точнее говоря, каждая издательская система на базе ТеХ-а представляет собой пакет макроопределений (макропакет) этого языка. В частности, LaTeX (произносится "латех" или "лэйтех", пишется также "LaTeX") - это созданная Лесли Лэмпортом (Leslie Lamport) издательская система на базе TeX-а.Прежде чем углубиться в изучение собственно LaTeX'а, скажем несколько слов о других издательских системах на базе TeX'а. Наряду с LaTeX'ом распространены также макропакеты Plain-TeX и AMS-TeX. Макропакет Plain-TEX был разработан самим Дональдом Кнутом, рассматривавшим его в качестве платформы для построения более сложных систем; на практике он используется и как средство для обмена текстами (текст, подготовленный для Plain TeX'а, сравнительно несложно переделать в исходный текст для того же LaTeX'а). Что касается AMS-TeX'а, то эта издательская система сориентирована на важный, но узкий круг приложений: верстку статей для математических журналов и книг, издаваемых Американским математическим обществом. Соответственно, в AMS-TeX'е предусмотрено большое количество весьма изощренных возможностей для создания сложных математических формул, но при этом нет многих вещей, которые естественно было бы ожидать в издательских системах общего назначения (например, автоматической нумерации частей документа). Современные версии LaTeX'а включают в себя AMS-TeX'овские возможности для набора формул (и используются Американским математическим обществом).
Настоящее издание этой книги посвящено описанию LaTeX'а версии
(она называется LaTeX
, произносится " два е" или "два эпсилон"). Эта версия, вышедшая в 1994 году, в настоящее время стала стандартной. Ее создатели Йоханнес Браамс (Johannes Braams), Михаэль Гуссенс (Michael Goossens), Алан Джеффри (Alan Jeffrey), Дэвид Карлайл (David Carlisle), Франк Миттельбах (Frank Mittelbach), Крис Роули (Chris Rowley) и Райнер Шепф (Rainer Schopf). Иногда встречаются тексты, набранные в более старой версии LaTeX'а (так называемый LaTeX 2.09, описанный в предыдущих изданиях этой книги). Во многих случаях файл, подготовленный в LaTeX'e 2.09, успешно обрабатывается и с помощью LaTeX'а
, хотя абсолютной совместимости "снизу вверх" все же нет.Достоинства и недостатки
Все издательские системы на базе TeX'а обладают достоинствами, заложенными в самом TeX'е. Для новичка их можно описать одной фразой: напечатанный текст выглядит "совсем как в книге". LaTeX как издательская система предоставляет удобные и гибкие средства достичь этого полиграфического качества. В частности, указав с помощью простых средств логическую структуру текста, автор может не вникать в детали оформления, причем эти детали при необходимости нетрудно изменить (чтобы, скажем, сменить шрифт, которым печатаются заголовки, не надо шарить по всему тексту, а достаточно заменить одну строчку в так называемом " стилевом файле"). Такие вещи, как нумерация разделов, ссылки, оглавление и т.п. получаются почти что "сами собой".Огромным достоинством систем на базе TeX'а является высокое качество и гибкость верстки абзацев и математических формул (в этом отношении TeX до сих пор не превзойден).
Программа TeX (и все издательские системы на ее базе) неприхотлива к технике (в свое время автор этих строк с успехом работал в TeX'е на компьютерах на базе всеми забытого 80286-процессора, и даже на таком электронном тихоходе, как IBM XT, а уж с современными компьютерами проблем заведомо не возникает).
С другой стороны, TeX'овские файлы (особенно английские — с русскими дело обстоит хуже; см приложение E) обладают высокой степенью переносимости: вы можете подготовить LaTeX'овский исходный текст на своей IBM PC, переслать его (скажем, по электронной почте) в издательство, и надеяться, что там ваш текст будет правильно обработан и на печати получится в точности то же, что получилось у вас при пробной печати на вашем любимом принтере (с той единственной разницей, что фотонаборный автомат даст отпечаток более высокого качества). Благодаря этому обстоятельству TEX стал очень популярен как язык международного обмена статьями по математике и физике.
Есть у TeX'а и недостатки. Тем, кто привык к редакторам наподобие Word'а, может не понравиться, что TeX не является системой типа WYSIWYG: работа с исходным текстом и просмотр того, как текст будет выглядеть на печати, — разные операции. На взгляд автора, благодаря этой особенности время на подготовку текста типографского качества только сокращается, но представления об удобстве у всех разные.
Далее, хотя параметры оформления менять легко, создать принципиально новое оформление (новый "класс документов") — совсем не простое дело.
Переносимость TeX'овских текстов снижается, если в них предусмотрен импорт графических файлов (эта возможность в TeX'е зависит от его реализации). Впрочем, в последнее время в этом отношении наметился определенный прогресс: стандартом de facto в TeX'овском мире становится представление графики в формате PostScript, причем в LaTeX'e появились удобные средства для включения этой графики в текст.
Наконец, как мы отмечали в предисловии, TeX плохо приспособлен для верстки страниц со сложным взаимодействием текста и графики.
Дроби
Дроби, обозначаемые косой чертой (так рекомендуется обозначать дроби во внутритекстовых формулах), набираются непосредственно:
![]() | Неравенство $x+1/x\ge 2$ выполнено для всех $x>0$. |
Наряду со знаками для нестрогих неравенств, TeX предоставляет большое количество специальных символов для математических формул (греческие буквы также рассматриваются как специальные символы). Все эти символы набираются с помощью специальных команд (не требующих параметров). Списки этих команд вы найдете в таблицах в начале следующей лекции.
Если вы используете в формуле десятичные дроби, в которых дробная часть отделена от целой с помощью запятой, то эту запятую следует взять в фигурные скобки (в противном случае после нее будет оставлен небольшой дополнительный пробел, что нежелательно):
| \pi\approx 3{,}14 |
, а команда /approx дает знак
(" приближенно равно"). Десятичную точку в дробях заключать в скобки не нужно.Дроби, в которых числитель расположен над знаменателем, набираются с помощью команды \frac.Эта команда имеет два обязательных аргумента: первый - числитель, второй - знаменатель.
Пример:
![]() | $$ \frac{(a+b)^2}{4}-\frac{(a-b)^2}{4}=ab $$ |
![]() | $$ \frac12+\frac x 2= \frac{1+x}2 $$ |
Единицы длины
Многие параметры, используемые TeX'ом, являются размерами (пример тому мы видели в разд. "Параметры"; в табл.1.1 собраны единицы длины (кроме нескольких экзотических), которые можно использовать в TeX'е при задании размеров.| pt | пункт ? 0.35,миллиметра |
| pc | пика=12pt |
| mm | миллиметр |
| cm | сантиметр = 10 mm |
| in | дюйм = 25,4 mm |
| dd | пункт Дидо ? 1.07pt |
| cc | Цицеро = 12 dd |
Можно задавать размеры с помощью любой из этих единиц; при записи дробного числа можно использовать как десятичную запятую, так и десятичную точку (в таблице мы использовали оба способа); прописные и строчные буквы в обозначениях единиц длины не различаются.
Даже если длина, которую вы указываете TeX'у, равна нулю, все равно необходимо указать при этом нуле какую-нибудь из используемых TeX'ом единиц длины. Например, если написать
\parindent=0 то вы получите сообщение об ошибке; вместо "0" надо было бы писать, например, "0pt" или "0in".
Кроме перечисленных, в TeX'е используются еще две " относительные" единицы длины, размер которых зависит от текущего шрифта. Это em приблизительно равная ширине буквы "М" текущего шрифта, и ex приблизительно равная высоте буквы "x" текущего шрифта. Эти единицы удобно использовать в командах, которые должны работать единообразно для шрифтов разных размеров.
Группы
Важным понятием TeX'а является понятие группы. Чтобы понять, что это такое, рассмотрим пример.При обработке TeX'ом исходного файла набор текста в каждый момент идет каким-то вполне определенным шрифтом (он называется текущим шрифтом). Изначально текущим шрифтом является " обычный" прямой шрифт (по-английски "roman"). Команда\slshape, с которой мы уже столкнулись в разд."Команды и их задание в тексте", переключает текущий шрифт на наклонный, а upshape выполняет обратное переключение. Аналогичным образом команды bfseries и mdseries меняют жирность шрифта4).
![]() | Полужирный шрифт начнется с \bfseries этого слова. Снова \mdseries светлый, теперь \slshape наклонный, до нового переключения; вновь \upshape прямой. |
![]() | Полужирным шрифтом набрано только {\bfseries это} слово; после скобок все идет, как прежде. |
![]() | Сначала {переключим шрифт на \itshape курсив; теперь сделаем шрифт еще и {\bfseries полужирным;} посмотрите, как восстановится} шрифт после кон{ца г}руппы. |
p> Как видите, группы могут быть вложены друг в дружку. Обратите внимание, что внутри внешней группы курсив начался не c того места, где была открывающая скобка, а только после команды itshape (именно команда, а не скобка, переключает шрифт). Шутки ради мы создали еще одну группу из двух последних буквы слова конца, первой буквы слова группы и пробела между ними; как и должно быть, на печати это никак не отразилось: ведь внутри скобок мы ничего не делали!
Трюк с постановкой пары скобок "{}" после имени команды, о котором шла речь выше - тоже пример использования групп. В этом случае скобки ограничивают "пустую" группу; ставятся они в качестве не-букв, ограничивающих имя команды и при этом никак не влияющих на печатный текст.
Фигурные скобки в исходном тексте должны быть сбалансированы5): каждой открывающей скобке должна соответствовать закрывающая. Если вы почему-либо не соблюли это условие, при трансляции вы получите сообщение об ошибке.
Некоторые команды, называемые глобальными, сохраняют свое действие и за пределами той группы, где они были употреблены. Всякий раз, когда идет речь о глобальной команде, это будет специально оговариваться.
Имена функций
Функции наподобие
,
и т.п., имена которых принято печатать прямым шрифтом, набираются с помощью специальных команд (обычно одноименных с обозначениями соответствующих функций).
![]() | Как знают некоторые школьники, $\log_{1/16}2=-1/4$, а $\sin(\pi/6)=1/2$. |
Полный список команд, аналогичных \log или \sin, приведен в разд."Операции с пределами и без" лекции 2
В стандартный набор команд TeX'а не входят команды для функций
и
(в англоязычных странах эти функции принято обозначать
и
соответственно). Большой беды тут нет, поскольку эти недостающие команды легко определить самому (см.лекцию 2).Исходный файл
Исходный файл для системы LaTeX представляет собой собственно текст документа вместе со спецсимволами и командами, с помощью которых системе передаются указания касательно размещения текста. Этот файл можно создать любым текстовым редактором, но при этом необходимо, чтобы в итоге получился так называемый "чистый" текстовый файл. Это означает, что текст не должен содержать шрифтовых выделений, разбивки на страницы и т.п.Исходный текст документа не должен содержать переносов (TeX сделает их сам). Слова отделяются друг от друга пробелами, при этом TEX не различает, сколько именно пробелов вы оставили между словами (чтобы вручную управлять пробелами, есть специальные команды, о которых пойдет речь позже). Конец строки также воспринимается как пробел. Соседние абзацы должны быть отделены друг от друга пустыми строками (опять-таки все равно, сколько именно пустых строк стоит между абзацами, важно, чтоб была хоть одна).
В правой колонке приведен фрагмент исходного текста, а в левой - то, как он будет выглядеть на печати после обработки системой LaTeX.
![]() | Слова разделяются пробелами, а абзацы - пустыми строками. Абзацный отступ в исходном тексте оставлять не надо: он получается автоматически. |
Предупреждение: мы используем русские буквы в наших примерах, хотя стандартный LaTeX (без специальной "русификации") их не понимает, и, строго говоря, следовало бы использовать латинские буквы. Подробнее об этом написано в приложении E.
Как изучать курс дальше?
Наш обзор основных понятий завершен, и вы уже можете подготовить с помощью LaTeX'а несложный текст. Дальнейшее чтение, в зависимости от ваших потребностей, можно построить по-разному: несколько последующих лекций почти независимы друг от друга, а внутри каждой из них материал расположен в порядке возрастания трудности.В лекции 2 подробно рассказано про набор математических формул.
Лекция 3 посвящена набору текста " в малом": в ней рассказывается, в частности, как задавать в тексте шрифты разных начертаний и размеров, как набирать ударения над буквами и специальные типографские значки наподобие знака параграфа, как делать сноски и т.п.
Лекция 4 посвящена оформлению текста " в целом": в ней подробно рассказано про то, какие бывают классы документов и чем они отличаются друг от друга, как устроить разбиение текста на разделы таким образом, чтобы LaTeX автоматически создавал заголовки этих разделов и к тому же автоматически их нумеровал, как оформлять титульный лист, как создать оглавление, и тому подобное.
В лекции 5 описаны так называемые псевдорисунки - примитивные картинки, которые можно создавать, не выходя за рамки LaTeX'а.
В лекции 6 рассказывается о печати таблиц с помощью LaTeX'а.
В лекции 7 объяснено, как можно повысить эффективность своей работы в LaTeX'е, создавая собственные команды. Первые разделы этой лекции можно (а скорее всего, и нужно) читать параллельно с лекцией 2.
Две последние лекции предназначены прежде всего для читателей, интересующихся не только набором, но и версткой. В лекции 8 рассказывается о таких фундаментальных понятиях TeX'а, как "блоки" и "клей"; заключительная лекция 9, предполагающая знание всего предыдущего материала, рассказывает, как изменить стандартный стиль оформления документов, предоставляемый LaTeX'ом, применительно к своим нуждам.
Курс завершается различными приложениями, посвященными более частным вопросам; об их содержании можно узнать из оглавления.
![]() |
![]() |
![]() |
2) Или даже на матричном.
3) В LaTeX 2.09 говорилось \documentstyle вместо \documentclass.
4) Подробнее о переключении шрифтов будет рассказано в разделе лекции 3 "Смена шрифтов в тексте"
5) Это не относится к скобкам, входящим в состав команд \{ и \}.
6) Примечание для полиграфистов: TeX'овский кегль 10 примерно соответствует нашему девятому кеглю
7) На моем домашнем компьютере TeX'овская память иссякла, когда длина абзаца превысила 34 страницы.

Как проходит работа с системой LaTeX
В дальнейшем мы будем отмечать, какие свойства системы специфичны для LaTeX'а, а какие относятся вообще к TeX'у и ко всем издательским системам на его базе, но при первом чтении вы можете об этих тонкостях не задумываться и воспринимать слова TeX и LaTeX как синонимы.В частности, все, что сказано в этом разделе, применимо не только к LaTeX'у, но и к любому другому макропакету для TeX'а, хотя мы всегда будем говорить "LaTeX".
Для начала автор должен подготовить с помощью любого текстового редактора файл с текстом, оснащенным командами для LaTeX'а. Такие файлы по традиции имеют расширение "tex" (описанию того, что должно быть в таком файле, и посвящена вся эта книга)1). Дальнейшая работа протекает в два этапа. Сначала надо обработать файл с помощью программы-транслятора; в результате получается файл с расширением "dvi" (device independent - не зависящий от устройства).
Теперь полученный файл (его называют еще dvi-файлом) можно с помощью программ, называемых -драйверами, распечатать на лазерном или струйном2). принтере, посмотреть на экране (текст будет в таком же виде, как он появится на печати) и т.д. (для разных устройств есть разные драйверы). Неудовлетворенный результатом, автор вносит изменения в исходный файл — и цикл повторяется.
На самом деле повторений цикла будет больше, так как придется еще исправлять синтаксические ошибки в исходном тексте.
Перед тем, как начать работать в системе LaTeX, вам необходимо уяснить для себя три вопроса:
Ответы на эти вопросы проще всего получить у знакомых, которые уже пользуются TeX'ом; они же помогут его достать (практически все реализации TeX'а являются свободно распространяемыми) и установить. Некоторые сведения о реализациях TeX'а для систем типа Unix (Linux, FreeBSD и др.) и для DOS/Windows приведены в приложении E.
Команды и их задание в тексте
Задание печатного знака процента с помощью последовательности символов "\%" — пример важнейшего понятия TeX'а, называемого командой. С точки зрения их записи в исходном тексте, команды делятся на два типа. Первый тип — команды, состоящие из знака "\" и одного символа после него, не являющегося буквой. Именно к этому типу относятся команды "\{", "\}",\ldots, "\%", о которых шла речь выше.Команды второго типа состоят из "\" и последовательности букв, называемой именем команды (имя может состоять и из одной буквы). Например, команды \TeX, \LaTeX и \LaTeXe генерируют эмблемы систем TeX, LaTeX и LaTeX
. В имени команды, а также между "\" и именем, не должно быть пробелов; имя команды нельзя разрывать при переносе на другую строку.В именах команд прописные и строчные буквы различаются. Например, \large, \Large и \LARGE — это три разные команды (как вы в дальнейшем узнаете, они задают различные размеры шрифта).
После команды первого типа (из "\" и не-буквы) пробел в исходном тексте ставится или не ставится в зависимости от того, что вы хотите получить на печати:
![]() | В чем разница между \$1 и \$ 1? |
![]() | \slshape2 turtle doves \slshape and a partridge in a pear tree. |
С другой стороны, если после команды из "\" и букв в исходном тексте следуют пробелы, то при трансляции они игнорируются. Если необходимо, чтобы TeX все-таки "увидел" пробел после команды в исходном тексте (например, чтобы сгенерированное с помощью команды слово не сливалось с последующим текстом), надо этот пробел специально организовать.
Один из возможных способов — поставить после команды пару из открывающей и закрывающей фигурных скобок "{}" (так что TEX будет знать, что имя команды кончилось), и уже после них сделать пробел, если нужно. Иногда можно также поставить команду \ (backslash с пробелом после него), генерирующую пробел. Вот пример.
![]() | Освоить \LaTeX\ проще, чем \TeX. Человека, который знает систему \TeX{} и любит ее, можно назвать \TeX ником. |
Команды с аргументами
Команды наподобие LaTeX или, скажем, bfseries действуют " сами по себе"; многим командам, однако, необходимо задать аргументы. Первый пример тому дает команда documentclass: слово, указываемое в фигурных скобках, — ее аргумент; если его не указать, то произойдет ошибка. В LaTeX'е аргументы команд бывают обязательные и необязательные. Обязательные аргументы задаются в фигурных скобках если для команды предусмотрено наличие обязательных аргументов, она без них правильно работать не будет. У многих команд предусмотрены также и необязательные аргументы: они влияют на работу команды, коль скоро они указаны, но их отсутствие не ведет к сообщению об ошибке. Необязательные аргументы задаются в квадратных скобках.В частности, у команды documentclass предусмотрен обязательный аргумент, о котором уже шла речь, и необязательный: в квадратных скобках перед обязательным аргументом можно указать список (через запятую) так называемых классовых опций, т.е. дополнительных особенностей оформления. Например, если мы хотим, чтобы книга набиралась шрифтом кегля 12 вместо кегля 10, принятого по умолчанию6) , и притом в две колонки, мы должны начать файл командой
\documentclass[12pt,twocolumn]{book}
Есть также классовая опция 11pt, означающая, что текст будет набираться кеглем 11. Полный список возможных классовых опций приведен в разд. "Классы, пакеты и классовые опции" лекции 4.
Наряду с классовыми опциями в LaTeX'е используются и так называемые стилевые пакеты. После команды \documentclass, начинающей файл, может следовать команда \usepackage, в аргументе которой стоит (через запятую) список подключаемых этой командой стилевых пакетов. (Можно использовать и несколько команд usepackage.) Например, первые две строки файла могут быть такими:
\documentclass[12pt,twocolumn]{book} \usepackage{amsfonts,longtable} Здесь пакет amsfonts подключается, чтобы использовать в математических формулах дополнительные шрифты, позволяющие напечатать что-нибудь вроде
, а пакет longtable нужен, чтобы иметь возможность набирать таблицы, простирающиеся на несколько страниц. Когда мы говорим: "чтобы воспользоваться этой возможностью, необходимо подключить такие-то стилевые пакеты", мы молчаливо предполагаем, что поставка LaTeX'а, которой вы пользуетесь, все эти пакеты содержит. В приложении Ж мы расскажем о том, откуда их взять.Необязательных аргументов может быть предусмотрено несколько; иногда они должны располагаться до обязательных, иногда после. В любом случае порядок, в котором должны идти аргументы команды, надо строго соблюдать. Между скобками, в которые заключены обязательные аргументы, могут быть пробелы, но не должно быть пустых строк.
Корни
Квадратный корень набирается с помощью команды \sqrt , обязательным аргументом которой является подкоренное выражение; корень произвольной степени набирается с помощью той же команды \sqrt с необязательным аргументом — показателем корня (необязательный аргумент у этой команды ставится перед обязательным). Пример:
![]() | По общепринятому соглашению, $\sqrt[3]{x^3}=x$, но $\sqrt{x^2}=|x|$. |
Литература по TeX'у
Каноническое описание языка TEX и макропакета Plain TeX — трудная книга Дональда Кнута [2]. У рядового пользователя LaTeX'а необходимость читать эту книгу обычно не возникает.Каноническое описание AMS-TeX'а — книга [5], также написанная самим создателем AMS-TEXа Майклом Спиваком (Michael Spivak).
Наконец, каноническое описание LaTeX'а — книга Лесли Лэмпорта[1]. Настоящее пособие в чем-то уже, чем книга[1], а в чем-то — шире: мы не упоминаем о некоторых средствах LaTeX'а, которые, на наш взгляд, редко используются на практике, но при этом рассказываем о многих полезных вещах, о которых в [1] не упоминается. Разнообразные модификации стандартного стиля оформления (" пакеты") описаны в книге Миттельбаха, Гуссенса и Самарина [6], рассчитанной на читателя, уже умеющего работать в LaTeX'е. Некоторые другие книги по LaTeX'у приведены в списке литературы .
Одной из первых книг по LaTeX'у на русском языке была брошюра [4], представляющая собой выполненный А.Шенем перевод краткого руководства [3] с дополнением переводчика, посвященным описанию одной из популярных реализаций TeX'а под DOS - системы emTEX.
Обработка ошибок
В исходных текстах для TeX'а, которые вы будете готовить, неизбежно будут присутствовать ошибки. В настоящем разделе мы обсудим, как TeX на них реагирует и как вам, в свою очередь, следует реагировать на эти реакции TeX'а.Все сообщения, которые TeX выдает на экран в процессе трансляции исходного текста, все ваши ответы на эти сообщения, вообще все, что в процессе трансляции появляется на экране, записывается в специальный файл — протокол трансляции. Обычно файл-протокол имеет то же имя, что обрабатываемый TeX'ом файл, и расширение .log, поэтому он называется .log-файлом. Когда трансляция будет завершена, вы можете в спокойной обстановке просмотреть . log - файл и проанализировать, что произошло.
Часть информации, выдаваемой при трансляции на экран и в .log-файл, представляет собой предупреждения (например, о нештатных ситуациях при верстке абзаца), при выдаче которых трансляция не прерывается . Если, однако, TeX натыкается на синтаксическую ошибку в исходном тексте, трансляция приостанавливается, а на экран выдается сообщение об ошибке.
Чтобы понять, что делать с этими сообщениями, проведем эксперимент. Наберите следующий файл test.tex из 14 строк, в котором умышленно допущено несколько ошибок (только не сделайте лишних ошибок при наборе):
\documentclass{article} \begin{document} По-английски специалист по \TeX'у называется \TeXpert. Следующая строка будет центрирована: \begin{center} Строка в центре. \end{centrr} А теперь попробуем формулы, например, такие, как $(2x+1)^3=5x$. И еще выключную формулу: $$\frac{25}{36}=\lrft(\frac{1} {1+\frac{1}{5}}\right)^2. $$ И последняя формула: $\sqrt{4 = 2$. \end{document} Теперь обработайте наш файл test.tex с помощью LaTeX'а. Вскоре вы увидите на экране вот что:
! Undefined control sequence. l.3 ...алист по TeX'у называется TeXpert . ? Первая строка TeX'овского сообщения об ошибке всегда начинается с восклицательного знака, после которого идет краткое указание на характер ошибки (в нашем случае речь идет о том, что обнаружена несуществующая команда).
Второй обязательный элемент сообщения об ошибке - строка, начинающаяся с l., после которой идет номер строки исходного текста с ошибкой (в нашем случае 3). После номера на экран выдается сама эта строка или та ее часть, которую TeX успел прочесть к моменту обнаружения ошибки. В нашем случае текст был прочитан до несуществующей команды "TeXpert" включительно (эта "команда" получилась потому, что мы забыли оставить пробел, ограничивающий имя команды \TeX, на которой TeX и прервал чтение файла. Наконец, третий основной элемент сообщения об ошибке — строка, состоящая из одного вопросительного знака. Этот вопросительный знак представляет собой "приглашение" пользователю: вам теперь предстоит на сообщение об ошибке отреагировать. Рассмотрим возможные реакции.
Во-первых, всегда можно нажать клавишу x или X (латинскую) и после этого "ввод" ("Enter"): тогда трансляция немедленно завершится. Может быть, именно так стоит поступать начинающему TeXнику, чтобы разбираться с ошибками по очереди. Но можно и просто нажать клавишу "ввод": при этом TeX исправит обнаруженную ошибку "по своему разумению" и продолжит трансляцию. Догадаться о том, что ошибка произошла именно из-за забытого пробела, программа, естественно, не может: исправление будет заключаться попросту в том, что будет проигнорирована несуществующая команда "TeXpert" (так что из печатного текста будет неясно, как по-английски называют специалиста по TeX'у). Нажимать "ввод" в ответ на сообщения об ошибках — довольно распространенная на практике реакция. Если вы твердо намерены нажимать на "ввод" в ответ на все сообщения об ошибках, то можно в ответ на первое же из этих сообщений нажать на "S" или "s", а затем на " ввод"; при обнаружении дальнейших ошибок трансляция прерываться не будет (TeX будет обрабатывать ошибки так, как если бы вы все время нажимали на "ввод"), по экрану пронесутся сообщения об ошибках, а затем вы сможете их изучить, просмотрев log-файл.
Итак, трансляция продолжается. Следующая остановка будет с таким сообщением:
! LaTeX Error: \begin{center} on input line 5 ended by \end{centrr}. See the LaTeX manual or LaTeX Companion for explanation. Type H for immediate help. ... l.7 \end{centrr} ? Это сообщение об ошибке начинается со слов LaTeX Error. Такого рода сообщения не встроены в TeX , а создаются LaTeX'ом. В них также присутствуют строка, начинающаяся с !, строка, начинающаяся с l., и приглашение - вопросительный знак. Есть на экране и объяснение ошибки: из-за опечатки ( centrr вместо center) получилось, что команда \begin, открывающая окружение, не соответствует команде \end , закрывающей его : имена окружений при открывающем \begin и закрывающем \end должны совпадать). Так или иначе, давайте снова нажмем на "ввод"; тут же мы увидим вот что:
! Missing inserted. ^ l.9 как (2x+1)^ 3=5x . И еще выключную формулу: На сей раз мы забыли знак доллара, открывающий формулу; TeX , однако, понял это не сразу, а лишь наткнувшись на символ "^", который вне формул таким образом использовать нельзя. Нажмем "ввод": TeX исправит положение, вставив знак доллара непосредственно перед знаком "^", и пойдет дальше (все такие исправления не вносятся в ваш файл, а происходят только в оперативной памяти компьютера). На печати формула будет иметь странный вид, поскольку "(2x+1)" будет набрано прямым шрифтом, а "5x" - курсивным, но TeX сможет продолжить трансляцию (и искать дальнейшие ошибки).
Следующая ошибка будет уже знакомого нам типа, только на сей раз несуществующая команда получается не из-за забытого пробела, а из-за опечатки ( "\lrft" вместо \left ):
! Undefined control sequence. l.10 $$\frac{25}{36}=\lrft (\frac{1} ? Нажав очередной раз на "ввод", мы немедленно увидим сообщение еще об одной ошибке:
! Extra \right. l.11 {1+\frac{1}{5}}\right) ^2 ? Откуда это, ведь в строке 11 у нас все правильно?! Оказывается, эта ошибка была наведена предыдущей.
В самом деле, перед этим TeX проигнорировал " команду" "\lrft", набранную вместо \left (именно так TeX и делает, если в ответ на ошибку "несуществующая команда" нажать на клавишу " ввод"), так что команду \left TeX вообще не видел; теперь выходит так, что в тексте, который видит TeX , присутствует \right без \left , что запрещено . Ввиду возможности появления таких " наведенных" ошибок, исправлять ошибки надо, начиная с самой первой; не исключено, что при ее исправлении часть последующих пропадет сама собой.
Нажмем на "ввод" и на этот раз; TeX опять по-свойски исправит ошибку, и вскоре вы увидите такое сообщение:
! Missing } inserted. l.13 И последняя формула:$\sqrt{4 = 2$. ? На сей раз ошибка в том, что мы забыли закрывающую фигурную скобку. Нажмем на "ввод"; TeX вставит недостающую скобку (в результате чего на печати получится забавная формула
, соответствующая тексту "\sqrt{4=2}": пропажа закрывающей скобки обнаружилась не там, где мы ее забыли, а там, где ее отсутствие вошло в противоречие с синтаксическими правилами TeX'а), после чего трансляция наконец завершится. Кстати, цифра 1 в квадратных скобках, появляющаяся при этом на экране, означает, что TeX сверстал страницу номер 1 и записал ее содержимое в dvi-файл. Теперь можно и просмотреть, как будет выглядеть наш текст на печати.Количество различных сообщений об ошибках, которые может выдавать TeX , составляет несколько сотен, и нормальная реакция на них обычно такая же, как в нашем эксперименте; сейчас мы рассмотрим еще две типичные ошибки, реакция на которые должна быть иной.
Во-первых, может случиться, что в качестве аргумента команды \input задано имя несуществующего файла. В этом случае вы получите сообщение наподобие следующего:
! LaTeX Error: File `ttst.tex' not found. Type X to quit or
Если вообще никакого файла нет (например, TeX запущен по ошибке), наберите null — это всегда существующий пустой файл. (В некоторых версиях — nul с одним l.)
Можно отреагировать на эту ошибку и так же, как на любую другую: нажать x и "ввод" (трансляция прервется) или s и "ввод" (неправильная команда \input будет проигнорирована, на дальнейшие ошибки TeX будет реагировать так, как если бы вы все время нажимали " ввод"). А если вы работаете с LaTeX'ом под операционной системой UNIX или каким-то ее аналогом (Linux, например), то в ответ на сообщение о такой ошибке можно и попросту нажать "ввод", и она будет проигнорирована.
Если команда \input с именем несуществующего файла попадется TeX'у после того, как вы в ответ на какую-то из прежних ошибок сказали s, то трансляция на этом месте тем не менее остановится и TeX поинтересуется верным именем файла.
Вторая ошибка, о которой мы хотели сказать, строго говоря, ошибкой не является; скорее, это нештатная ситуация. Чтобы смоделировать ее, проведем такой эксперимент: удалим из нашего файла test.tex последнюю строчку, гласящую "\end{document}", и снова запустим LaTeX для обработки этого файла. Нажав сколько-то раз "ввод", мы обнаружим, что работа TeX'а не закончилась, а на экран выдана звездочка: *. Эта звездочка — приглашение TeX'а ввести еще текст или команды; она появляется, когда в исходном тексте отсутствует команда для TeX'а "завершить работу" (в LaTeX'е эта команда входит в качестве составной части в комплекс действий, выполняемых командой \end{document}). Теперь можно вводить с клавиатуры любой текст и команды - TeX отреагирует на них так же, как если бы этот текст и команды присутствовали в вашем файле. Не будем баловаться, а просто наберем \end{document} и нажмем на "ввод", после чего трансляция благополучно завершится. Вряд ли вы будете очень часто забывать последнюю строчку в исходном тексте, но иногда, в результате какой-либо сложной ошибки, может случиться так, что TeX "не заметит" строки \end{document}, и вот тогда-то вы и окажетесь лицом к лицу с TeX'овским приглашением-звездочкой.
Бывают и такие хитрые ошибки, что \end{document} в ответ на приглашение-звездочку LaTeX не удовлетворяет и на экране снова появляется звездочка. На этот случай в LaTeX'е предусмотрено последнее средство: команда \stop. Если вы введете ее в ответ на TeX'овское приглашение, то, скорее всего, трансляция все-таки прервется. Если и \stop не помогает, остается только перезагрузить компьютер или "убить процесс" более цивилизованным способом.
Скажем еще об одном нередко встречающемся TeX'овском сообщении. Если вы открыли группу с помощью фигурной скобки, но забыли ее закрыть, то, даже если трансляция не будет прерываться, в конце вы заведомо получите такое TeX'овское предупреждение:
(\end occurred inside a group at level 1) (вместо 1 может стоять и другая цифра, в зависимости от того, сколько вложенных групп вы забыли закрыть). В частности, такое сообщение будет, если вы забыли закрыть или неправильно закрыли какое-то LaTeX'овское окружение (но в этом случае LaTeX выдаст вам и свое сообщение об ошибке, как в нашем примере с \begin{center} и \end{centrr}).
Наряду с пассивной реакцией на ошибки — все время нажимать на " ввод" или сказать s — есть и другая возможность: прямо с клавиатуры вносить исправления в тот текст, который " видит" TeX . На содержимое файла это не повлияет, но изменения в файл можно будет внести и позднее, руководствуясь тем, что записано в log-файле. При этом может сэкономиться время за счет того, что будет меньше "наведенных" ошибок и, как следствие, потребуется меньше прогонов TeX'а для отладки.
Чтобы внести исправления с клавиатуры, надо нажать i или I и затем "ввод". На экране появится такое приглашение:
insert> В ответ на это приглашение следует ввести тот текст и/или команды, которые вы хотите вставить в текст, читаемый TeX'ом. Чтобы продемонстрировать это на практике, давайте приведем файл test.tex в исходное состояние, вернув в него строку \end{document}, и еще раз запустим LaTeX для его обработки.
В ответ на первое же сообщение (по поводу несуществующей команды "TeXpert") нажмем i , а затем, в ответ на приглашение insert>, наберем правильный текст.
TeX pert и нажмем на "ввод". В ответ на вторую ошибку (когда мы в команде \end допустили опечатку в имени окружения center) скажем сначала i, а затем (в ответ на приглашение) "\end{center}" (кстати, можно делать такие вещи и в один шаг: сразу набрать "i\end{center}" и нажать " ввод"). В ответ на следующую ошибку ничего не остается, как по-прежнему нажать на "ввод": те символы в исходном тексте, между которыми должен был стоять пропущенный знак доллара, уже поглощены TeX'ом, и вставить его куда надо в данный момент невозможно; зато в ответ на следующую ошибку ( "\lrft" вместо \left ) наберем "i\left" и нажмем на "ввод". Следующей (" наведенной") ошибки вообще не будет (ведь на сей раз в тексте, который видит TeX , команда \left присутствует, а поэтому и на команду \right он отреагирует правильно); наконец, в ответ на последнюю ошибку опять ничего не остается, кроме как нажать на "ввод": вставить закрывающую фигурную скобку между 4 и знаком равенства прямо с клавиатуры невозможно. Теперь можно просмотреть, как на сей раз будет выглядеть на печати наш текст; некоторые несуразности наподобие
в нем останутся, но их будет меньше, чем если бы мы нажимали на "ввод" : не будет потеряно слово "TeXpert", центрированная строка будет действительно центрирована, формула 
будет выглядеть так, как надо. Теперь остается внести исправления в исходный файл (справляясь с тем, что записано в log-файле) и запустить LaTeX вторично, чтобы получить безошибочный текст.
Как мы уже отмечали, в ответ на сообщение об ошибке всегда можно прервать трансляцию, нажав X или x и "ввод"; кроме того, бывают случаи, когда TeX прерывает трансляцию "по своей инициативе". На практике важны два случая:
Иногда памяти может действительно не хватить. Так бывает, если в тексте встречаются чудовищно длинные абзацы7) или сверхсложные таблицы с очень большим количеством строк и столбцов (см. лекцию 4 по поводу таблиц). Если вы встретились с такой проблемой, то можно проконсультироваться со специалистом (или самому изучить по книге [2]), как использовать TeX более эффективно (в частности, TeX можно научить переваривать сколь угодно длинные абзацы). Можно также попробовать найти транслятор TeX'а, дающий возможность работать с увеличенным объемом памяти.
Скажем пару слов про более редкие способы реакции на ошибки. Во-первых, в ответ на приглашение ? можно набрать h или H и нажать "ввод". В этом случае TeX выдаст на экран дополнительную информацию по поводу вашей ошибки (вряд ли вы много из нее почерпнете, если вы не TeX ник), а затем еще раз приглашение ?. Во-вторых, можно набрать r или R (и " ввод", естественно); результат будет такой же, как если бы вы сказали s , с той разницей, что в случае, когда аргументом команды \input служит несуществующий файл, никаких вопросов задаваться не будет, а трансляция просто прервется. Наконец, можно набрать Q или q (и "ввод"): результат будет такой же, как от R , с той разницей, что на экран не будет выдаваться вообще ничего (в log -файл все будет записано).
Наконец, режимы реакции на ошибки, задаваемые с клавиатуры с помощью клавиш s , r или q , можно задать прямо в файле, написав в преамбуле одну из перечисленных ниже команд:
Окружения
Еще одна важная конструкция LaTeX'а - это окружение(environment)Окружение - это фрагмент файла, начинающийся с текста
\begin{"TeXtit{имя\_окружения} "} где TeXtit{имя\_окружения} представляет собой первый обязательный (и, возможно, не единственный) аргумент команды \begin. Заканчивается окружение командой
\end{"TeXtit{имя\_окружения} "} (команда \end имеет только один аргумент - имя завершаемого ею окружения). Например:
![]() | \begin{center} Все строки этого абзаца будут центрированы; переносов не будет, если только какое-то слово, как в дезоксирибонуклеиновой кислоте, не длинней строки. \end{center} |
Важным свойством окружений является то, что они действуют и как фигурные скобки: часть файла, находящаяся внутри окружения, образует группу. Например, внутри окружения center в вышеприведенном примере можно было бы сменить шрифт, скажем, командой \itshape, и при этом после команды \end{center} восстановился бы тот шрифт, что был перед окружением.
Основные принципы
В документе, подготовленном с помощью TeX'а, различают математические формулы внутри текста и " выключные" (выделенные в отдельную строку). Формулы внутри текста окружаются знаками $ (с обеих сторон). Выключные формулы окружаются парами знаков доллара $$ с обеих сторон. Формулами считаются как целые формулы, так и отдельные цифры или буквы, в том числе греческие, а также верхние и нижние индексы и спецзнаки. Пробелы внутри исходного текста, задающего формулу, игнорируются (но по-прежнему надо ставить пробелы, обозначающие конец команды): TeX расставляет пробелы в математических формулах автоматически (например, знак равенства окружается небольшими пробелами). Пустые строки внутри текста, задающего формулу, не разрешаются. Если нужен пробел до или после внутритекстовой формулы, надо оставить его вне долларов. То же самое относится и к знакам препинания, следующим за внутритекстовой формулой: их также надо ставить после закрывающего формулу знака доллара. (В выключных формулах приходится указывать знаки препинания внутри долларов, иначе эти знаки попадут на следующую строку.) Каждая буква в формуле рассматривается как имя переменной и набирается шрифтом " математический курсив" (в отличие от обычного курсива, в нем увеличены расстояния между соседними буквами).Часть файла, составляющая математическую формулу, образует группу : изменения параметров, произведенные внутри формулы, забываются по ее окончании.
о котором уже шла речь,
Наряду с текущим шрифтом, о котором уже шла речь, TeX в каждый момент обработки исходного текста учитывает значения различных параметров, таких, как величина абзацного отступа, ширина и высота страницы, расстояние по вертикали между соседними абзацами, а также великое множество других важных вещей. Расскажем, как можно менять эти параметры, если это понадобится.Параметры TeX'а обозначаются аналогично командам: с помощью символа "\" (" backslash"), за которым следует либо последовательность букв, либо одна не-буква. Например, \parindent обозначает в TeX'е величину абзацного отступа; если нам понадобилось, чтобы абзацный отступ равнялся двум сантиметрам, можно написать так:
\parindent=2cm (Это изменение распространяется лишь на текущую группу: после конца группы восстановится старое значение отступа.)
Аналогично поступают и в других случаях: чтобы изменить параметр, надо написать его обозначение, а затем, после знака равенства, значение, которое мы "присваиваем" этому параметру; в зависимости от того, что это за параметр, это может быть просто целое число, или длина (как в нашем примере), или еще что-нибудь.
Разбиение исходного файла на части
Команды, рассматриваемые в этом разделе, помогают разумно организовать исходный текст.Часто бывает удобно разбить большой текст на несколько частей, хранящихся в разных файлах. Чтобы можно было объединить их в одно целое, в LaTeX'е предусмотрена команда \input. Если в тексте написать
\input{имя\_файла} то TeX будет работать так, как если бы вместо строки с командой \input стоял текст файла, имя которого вы указали.
Обычно, готовя текст большого объема, создают небольшой " головной файл", в котором между \begin{document} и \end{document} размещены строки с командами \input, задающими включение файлов, в которых и записана основная часть текста. Например, книгу из четырех глав, записанных в файлах "ch1.tex",..., "ch4.tex", можно организовать в виде файла из девяти строчек (именно его, а не файлы с отдельными главами, надо будет передать для обработки LaTeX'у):
\documentclass[11pt]{report} \frenchspacing \pagestyle{plain} \begin{document} \input{ch1} \input{ch2} \input{ch3} \input{ch4} \end{document} (Если расширение файла, являющегося аргументом команды \input, не указано, то LaTeX по умолчанию добавляет расширение tex.)
Ради реализма мы в этом примере включили в преамбулу парочку команд, которые могли бы там появиться и на практике. Первая из них означает, что после знаков препинания пробелы не увеличиваются, как это и принято в России и континентальной Европе (по умолчанию эти пробелы увеличиваются в соответствии с англо-саксонской традицией), а вторая — что номера страниц будут печататься снизу и при этом колонтитулов не будет. Позже мы рассмотрим эти вещи подробнее.
Если в вашем тексте присутствуют команды \input, то в процессе трансляции при начале чтения соответствующего файла на экран выдается его имя, чтобы вы понимали, к какому из ваших файлов будут относиться дальнейшие сообщения TeX'а (если таковые будут).
Если вы хотите, чтобы TeX прочитал только часть вашего файла, можно воспользоваться командой без параметров \endinput .
Если она присутствует в файле, то файл будет прочитан только до строчки, в которой написано \endinput , после чего его чтение прекратится.
Если фрагменты текста, включаемые с помощью команд \input , должны на печати начинаться с отдельной страницы (например, если это главы книги, как в приведенном примере), то удобно вместо \input воспользоваться командой \include (ее единственный обязательный аргумент — имя включаемого файла). Выгода здесь в том, что при пользовании командой \include можно в процессе работы над текстом попросить LaTeX обрабатывать только часть включаемых файлов.
Для этого надо добавить в преамбулу команду \includeonly, в аргументе которой приведен (через запятые) список обрабатываемых файлов. Пусть, скажем, в вышеприведенном примере работа над первой главой уже завершена, за четвертую главу вы еще не принялись, а вторую и третью уже вовсю редактируете. Тогда головной файл можно организовать так:
\documentclass[11pt]{report} \frenchspacing \pagestyle{plain} \includeonly{ch2,ch3} \begin{document} \include{ch1} \include{ch2} \include{ch3} \include{ch4} \end{document} (Внимание! В аргументе команды \include расширение ".tex" опускать необходимо! Файлы с расширениями, отличными от ".tex", с помощью этой команды подключать нельзя.) Когда вы перейдете к работе над другими главами, аргумент команды \includeonly надо будет соответствующим образом изменить, а когда весь текст будет готов, можно вообще удалить \includeonly из файла. При этом количество запусков LaTeX'а, необходимых для получения правильных ссылок, задаваемых командами \ref и \pageref , будет меньше, чем при проведении аналогичных манипуляций с \input .
Команду \include нельзя употреблять в файле, который сам включается в текст с помощью \include (для \input такого запрета нет).
Штрихи и многоточия
Штрихи в математических формулах обозначаются знаком "'" (и не оформляются как верхние индексы):
![]() | Согласно формуле Лейбница, $$ (fg)''=f''g+2f'g'+fg''. $$ Это похоже на формулу квадрата суммы. |
штрих в квадрате", возьмите x' в фигурные скобки, вот так: ${x'}^2$. Обратите еще внимание на то, что точку мы поставили в конце выключенной формулы (если бы мы поставили ее после знаков $$, то с нее начался бы абзац, следующий после формулы).В математических формулах встречаются многоточия; TeX различает многоточие, расположенное внизу строки (обозначается \ldots), и расположенное по центру строки (оно обозначается \cdots). Первое из них используется при перечислениях, второе — когда нужно заменить пропущенные слагаемые или сомножители (такова американская традиция; в России обычно многоточие ставят внизу строки и в этом случае):
![]() | В детстве К~.-Ф.~Гаусс придумал, как быстро найти сумму $$1+2+\cdots+100=5050; $$ это случилось, когда школьный учитель задал классу найти сумму чисел $1,2,\ldots,100$. |
Скобки
Круглые и квадратные скобки набираются как обычно, для фигурных скобок используются команды \{ и \},для других также есть специальные команды (см. следующую лекцию).
![]() | $$ 1+\left(\frac{1}{1-x^{2}} \right)^3 $$ |
Подробнее о скобках, размер которых выбирается автоматически, рассказано в следующей лекции .
Спецсимволы
Большинство символов в исходном тексте прямо обозначает то, что будет напечатано (если в исходном тексте стоит запятая, то и на печати выйдет запятая). Следующие 10 символов:{}, $, &, #, %, _, ",^, \ имеют особый статус; если вы употребите их в тексте " просто так", то скорее всего получите сообщение об ошибке (и на печати не увидите того, что хотелось). Печатное изображение знаков, соответствующих первым семи из них, можно получить, если в исходном тексте поставить перед соответствующим символом без пробела знак "\" (по-английски он называется "backslash"):
![]() | Курс тугрика повысился на 7\%, и теперь за него дают \$200. |
![]() | Это % глупый % Лучше: поучительный пример. Жил-был у бабушки сере% нький козлик. |
Скажем вкратце о смысле остальных спецсимволов. Фигурные скобки ограничивают группы в исходном файле. Знак доллара ограничивает математические формулы. При наборе математических же формул используются знаки "_" и "^" (" знак подчеркивания" и " крышка"). Знак "" обозначает "неразрывный пробел" между словами . Со знака "\" начинаются все TeX'овские команды . Знаки "#" и "&" используются в более сложных конструкциях TeX'а, о которых сейчас говорить преждевременно.
Отметим еще, что символы "< > |" в тексте употреблять можно в том смысле, что сообщения об ошибке это не вызовет, но напечатается при этом нечто, совсем на эти символы не похожее. Подлинное место для этих символов, так же как и для символов "=" и "+", — математические формулы, о которых речь пойдет позже.
Степени и индексы
Степени и индексы набираются с помощью знаков "^" и "_" соответственно.
![]() | Катеты $a$,$b$ треугольника связаны с его гипотенузой $c$ формулой $c^2=a^2+b^2$ (теорема Пифагора). |
![]() | Из теоремы Ферма следует, что уравнение $$ x^{4357}+y^{4357}=z^{4357} $$ не имеет решений в натуральных числах. |
![]() | Обозначение $R^i_{jkl}$ для тензора кривизны было введено еще Эйнштейном. |
![]() | Можно также написать $R_j{}^i{}_{kl}$, хотя не всем это нравится. |
).Структура исходного текста
LaTeX-файл должен начинаться с команды\documentclass задающей стиль оформления документа (в LaTeX'е
принято говорить "класс документа".3) Пример:
\documentclass{book}
Слово {book} в фигурных скобках указывает, что документ будет оформлен, как книга: все главы будут начинаться с нечетных страниц, текст будет снабжен колонтитулами некоторого определенного вида и т.п. Кроме класса book, в стандартный комплект LaTeX'а входят классы article (для оформления статей), report (нечто среднее между article и book, proc (для оформления изданий типа " труды конференции") и letter (для оформления деловых писем так, как это принято в США). Чтобы задать оформление документа с помощью одного из этих классов, надо в фигурных скобках после команды \documentclass указать вместо {book} название требуемого класса. Стандартные классы можно (а иногда и нужно) менять, можно создавать и новые классы, но пока что будем исходить из стандартных классов.
После команды \documentclass могут следовать команды, относящиеся ко всему документу и устанавливающие различные параметры оформления текста, например, величину абзацного отступа (вообще-то все эти параметры определяются используемым классом, но может случиться, что вам понадобится сделать в них изменения). Далее должна идти команда \begin
\begin{document}
Только после этой команды может идти собственно текст. Если вы поместите текст или какую-нибудь команду, генерирующую текст (например, \LaTeX до \begin{document}, то LaTeX выдаст сообщение об ошибке. Часть файла, расположенная между командами \documentclass и \begin{document}, называется преамбулой.
Заканчиваться файл должен командой
\end{document}
Если после \end{document} в файле написано что-то еще, LaTeX это проигнорирует.
Следующий пример показывает LaTeX-файл, составленный по всем правилам. Ничего интересного в результате его обработки не напечатается, но уж зато и сообщений об ошибках вы не получите.
\documentclass{article} \begin{document} Проба пера. \end{document} Совет: если вы до сих пор не работали с системой LaTeX на компьютере, сейчас самое время попробовать (только замените русские буквы на латинские, если доступный вам LaTeX не " русифицирован").
Звездочка после имени команды
В LaTeX'е некоторые команды и окружения имеют варианты, в которых непосредственно после имени команды или окружения ставится звездочка "*". Например, команда \section означает "начать новый раздел документа", а команда \section* означает "начать новый раздел документа, не нумеруя его".Работа в системе LaTeX
Альтернативные обозначения для математических формул
Наряду со стандартными TeX'овскими обозначениями для математических формул, LaTeX предоставляет альтернативные обозначения. Именно, внутритекстовую формулу, которая в стандартных обозначениях ограничивается одним знаком доллара в начале и одним в конце, можно вместо этого заключить в знаки "\(" (в начале) и "\)" (в конце):
| \(2\times2=4\) |
Выключную формулу LaTeX позволяет окружить с обеих сторон не только парами знаков доллара, как предусмотрено стандартом, но знаками \[ (в начале) и \] (в конце). Кроме того, можно оформить выключную формулу как окружение с именем displaymath. В одном и том же файле можно использовать как стандартные, так и LaTeX'овские обозначения для формул.
Эти альтернативные обозначения полностью эквивалентны стандартным TeX'овским (со знаками доллара), за одним важным исключением: если выключные формулы обозначаются LaTeX'овскими, а не TeX'овскими обозначениями, то можно сделать так, что выключные формулы будут не центрированы, а прижаты влево .
Чего мы еще не сказали
Для читателя-математика того, что мы уже рассказали о наборе формул, должно быть, в принципе, достаточно, за одним важным исключением: при написании математической статьи полезно знать, как грамотно оформлять тексты теорем, определений и тому подобные вещи. Об этом у нас рассказывается в разд."Окружение типа "теорема","Окружение типа "теорема" в пакете amsthm" лекции 7 вы можете прочитать это уже сейчас, пропуская непонятные места и справляясь при необходимости с разд."Рубрикация документа" лекции 4, посвященным рубрикации документа.Фантомы и прочее
Ранее мы столкнулись с командой \lefteqn, позволяющей напечатать фрагмент формулы и при этом сообщить TeX'у, что отдельного места (по горизонтали) на этот фрагмент отводить не надо. Иногда бывает полезно сделать обратное: включить в формулу символ, который сам не печатается, но место занимает. Вот пример такой ситуации.Команда \sqrt автоматически выбирает размер знака радикала таким образом, чтобы он точно соответствовал высоте подкоренного выражения, и это очень хорошо. Иногда, однако, такой автоматический выбор приводит к не очень удачным результатам:
| В формуле $\sqrt{a}+ \sqrt{d}$ два знака радикала имеют разные размеры. |
и
имеют разную высоту. Чтобы сделать знаки радикала одинаковыми, TeX надо обмануть: добавить в подкоренные выражения по символу, который чуть выше, чем
или
, чтобы подкоренные выражения оказались одной высоты. Этот символ, естественно, не должен печататься и не должен занимать места по горизонтали (лишние пробелы под корнем нам тоже ни к чему). Такой невидимый символ генерируется TeX'овской командой \mathstrut:
| В формуле $\sqrt{\mathstrut a} +\sqrt{\mathstrut d}$ оба знака радикала имеют одинаковые размеры. |
и не имеющий ширины.Невидимый символ, создаваемый командой \mathstrut, является частным случаем TeX'овской конструкции "фантома". Именно, если в формуле вы напишете
"\phantom{"TeXtit{какая-то формула} "}" то результат будет такой же, как если бы эта самая "какая-то формула" была сначала напечатана по всем правилам TeX'а, а затем аккуратно стерта с бумаги. Пример:
| Все мы знаем, что знак радикала выглядит так: $\sqrt{\phantom{x}}$. |
Создается вертикальный фантом командой \vphantom. В частности, команда \mathstrut - это сокращение для "\vphantom{(}" . Возможны, наконец, и горизонтальные фантомы, занимающие по горизонтали столько же места, сколько заняла бы формула, и не занимающие места по вертикали. Создаются они командой \hphantom:
| На пустое место $\hphantom{\sin^2\alpha}$ можно вписать формулу вручную. |
| $$ \lefteqn{\overbrace{ \phantom{1+2+3}}} 1+\underbrace{2+3+4} $$ |
, а над ее фантомом. В результате команда \overbrace печатает фигурную скобку над пустым местом. Далее, вся эта конструкция стоит, в свою очередь, в аргументе команды \lefteqn, вследствие чего TeX считает, что места по горизонтали она не занимает. Поэтому формула
начинается с того же места, что и фантом формулы
; в результате
попадает аккурат под верхнюю скобку! Все это, конечно, — еще один пример "грязного трюка").Если бы формула была не выключная, а внутритекстовая, то этот трюк прошел бы не столь гладко. Дело в том, что команда \lefteqn всегда набирает формулы в \displaystyle, поэтому размер фантома, над которым ставилась скобка, мог в принципе не совпасть с размером реально печатаемого фрагмента формулы. Чтобы уж совсем себя обезопасить, следовало бы в этом случае аргумент команды \lefteqn начать с \textstyle.
Формула в рамочке
Очень важную формулу хочется взять в рамку. Если подключить пакет amsmath, то этого можно добиться с помощью команды \boxed:
| $$ \boxed{\iint_{\mathbb R^2}e^{-(x^2+y^2)}\,dx\,dy=\pi} $$ |
Горизонтальные отбивки вокруг формул
Некоторые авторы и издатели считают, что математический текст выглядит понятнее, когда каждая формула окружена дополнительным пробелами справа и слева от нее {Это актуально для текстов на языках с латинской графикой. В русских текстах формулы обычно достаточно выделяются уже за счет того, что в них используется латиница, а в тексте — кириллица.}. Для этих целей в TeX'е предусмотрен параметр \mathsurround . Значение этого параметра — размер дополнительного пробела, вставляемого по обе стороны каждой внутритекстовой математической формулы (этот пробел не добавляется перед формулой, попавшей при печати в начало строки, и после формулы, попавшей в конец строки). При запуске LaTeX'а значение этого параметра равно нулю, так что расстояния между формулами и окружающим текстом такие же, как между словами в тексте. Можно, однако, присвоить параметру \mathsurround ненулевое значение. Например, команда \mathsurround=2pt (будучи включена в преамбулу) окружает каждую формулу дополнительными пробелами по 2 пункта с обеих сторон.Если нужно организовать дополнительные горизонтальные отбивки вокруг какой-то одной формулы, можно поместить команду, присваивающую значение параметру \mathsurround, непосредственно в саму формулу (между ограничивающими ее знаками доллара, в любое место). Важно только не забыть сделать пробел после обозначения для единицы длины (скажем, pt).
![]() |
![]() |
![]() |
2) Иногда полезно поставить пустые фигурные скобки {\{\}}, чтобы создать фиктивный аргумент бинарной операции и тем самым обеспечить желательные пробелы; мы делали это в примере на с.38

Как набирать формулы
О некоторых простейших приемах набора формул уже шла речь в первой лекции, но для серьезной работы этого, бесспорно, недостаточно; хочется верить, что после изучения этой лекции профессиональному математику (или техническому редактору) не будет страшна никакая, даже самая изощренная, формула.Некоторые из приемов, описываемых здесь, становятся доступными только после подключения специальных стилевых пакетов. Напомним, что слова наподобие "чтобы сделать то-то и то-то, надо подключить стилевые пакеты yweird и queer" означают, что в преамбулу документа следует включить строчку вида
\usepackage{weird,queer} Особенно полезны возможности, предоставляемые пакетами amssymb и amsmath, рекомендуем подключать их всегда, если в вашем тексте присутствуют сколько-нибудь сложные формулы.
Имея все это в виду, приступим к делу.
Какие еще есть символы
В наших таблицах собрано более четырехсот математических символов, не считая операций типа
или
. Тем не менее, для набора формул этого мало. Во-первых, в формулах встречаются скобки разнообразных начертаний (и размеров). О них речь пойдет в разд. "Скобки переменного размера". Во-вторых, часто бывает нужно, чтобы обозначения переменных в формуле печатались не курсивом, как это делается в TeX'е по умолчанию, а другим шрифтом. Как этого добиться, рассказано в разд. "Смена шрифтов в формуле". Если вам и этого не хватает, попробуйте поискать недостающие шрифты в Интернете (в приложении Ж рассказано, где именно искать).Многострочные выключные формулы
Программа TeX никогда не делает автоматических переносов в выключных формулах, поэтому, если ваша формула не умещается в строку, необходимо разбить ее на отдельные строки самостоятельно. Первое, что приходит в голову начинающим, — это оформить каждую из этих строк как отдельную выключную формулу с помощью $$...$$ и записать эти выключные формулы подряд. При этом расстояние по вертикали между двумя строками получается слишком большим, так что на глаз они не воспринимаются как части одной формулы. В этом разделе мы описываем, как грамотно организовать такое разбиение.Как и в случае с матрицами, наиболее удобные (и рекомендуемые нами) средства открываются, если подключить пакет amsmath; с их описания мы и начнем, а в конце опишем скромные средства набора многострочных формул, доступные без подключения дополнительных пакетов.
Итак, пусть вы подключили amsmath. Тогда самое простое средство для набора многострочных выключных формул — это окружение multline:
| \begin{multline} 1+2+3+4+\ldots\\ +46+47+48+\ldots\\ +99+100=5050 \end{multline} |
На самом деле первая и последняя строки печатаются не вплотную к полям, а с отступом, равным \multlinegap. Значение этого параметра можно изменить обычным образом, написав в преамбуле что-нибудь вроде
\multlinegap=.5in Чтобы какая-то из средних строк была не центрирована, а выключена влево, надо воспользоваться командой \shoveleft, написав, скажем,
\shoveleft{+46+47+48+\ldots}\\ вместо "+46+47+48+\ldots\\". Для выключки вправо аналогичным образом используется команда \shoveright.
Когда несколько выключных формул идут подряд, можно не оформлять каждую из них с помощью "$$" или окружения equation, но воспользоваться окружением gather:
| \begin{gather} 2\times 2=4\\ 9\times 9=81 \end{gather} |
p> При использовании gather формулы также не должны быть заключены в символы "$$". Каждая из формул, собранных в gather, автоматически нумеруется. Чтобы на пронумерованную таким образом формулу можно было сослаться (а иначе зачем нумеровать?), надо ее пометить, поставив перед |\\| команду \label.
Если какую-то из них нумеровать не надо, следует поставить непосредственно перед "\\" команду \notag. Если вы не хотите нумеровать ни одну из формул, можно воспользоваться "вариантом со звездочкой" — окружением gather* .
При разбиении выключной формулы на части нередко бывает желательно расположить строки одна под другой так, чтобы они были определенным образом выровнены. Для достижения такого эффекта удобно воспользоваться окружением split:
| \begin{equation} \begin{split} 1999&=1000+900+{}\\ &+90+9 \end{split} \end{equation} |
Формулы, разбитые на части с помощью split , можно использовать также внутри окружений gather или align (о последнем речь пойдет ниже), со звездочками или без.
Нередко возникает необходимость напечатать один или несколько выровненных столбцов формул. Для этих целей предназначено окружение align:
| \begin{align} 7\times 9& =63 & 63:9& =7\\ 9\times 10& =90 & 90:10& =9 \end{align} |
По-прежнему не нужны знаки "$$", каждая строка уравнений автоматически получает номер, который можно подавить, написав \notag перед "\\", и по-прежнему есть вариант со звездочкой align* , который формулы не нумерует.
При грамотном применении окружения align в строке должно стоять нечетное число знаков "&". Именно, если у нас
столбцов с уравнениями, то имеется
знаков "&", отделяющих друг от друга столбцы, плюс еще
знаков — по одному на каждый столбец, а всего
. Полезное применение align возникает, когда идущие подряд выключные формулы содержат текстовые комментарии. Желательно, чтобы эти комментарии были выровнены. Вот как можно этого добиться с помощью align:
| \begin{align*} 3\cdot 5+7\cdot 5&=(3+7) \cdot5 &&\text{(ясно)}\\ &=50&&\text{(очевидно)} \end{align*} |
Не всегда удобно включать комментарии к выкладкам прямо в формулы. Иногда хочется, чтобы какой-то из комментариев шел в отдельной строке. Команда \intertext позволяет сделать это так, чтобы выравнивание не нарушилось:
| \begin{align*} 3\cdot 5+7\cdot 5&=(3+7) \cdot5 &&\text{(ясно)}\\ &=50&&\text{(очевидно),}\\ \intertext{откуда} 15+35 &=50 \end{align*} |
| $$ \left\{ \begin{aligned} x^2+y^2&=7\\ x+y & = 3.\\ \end{aligned} \right. $$ |
Наконец, еще один тип многострочных выключных формул возникает, когда выражение в правой части равенства должно выглядеть по-разному в разных случаях.
На этот случай в пакете amsmath предусмотрено окружение cases. Продемонстрируем его работу сразу на примере:
| $$ |x|=\begin{cases} x,&TeXt{если $x>0$;}\\ 0,&TeXt{если $x=0$;}\\ -x,&TeXt{если $x<0$.} \end{cases} $$ |
Теперь, когда вы ознакомились с возможностями набора многострочных формул с помощью пакета amsmath, расскажем и о том, что можно сделать в этом направлении без подключения дополнительных стилевых пакетов.
Системы уравнений можно набирать с помощью окружения array таким образом:
| $$ \left\{ \begin{array}{rcl} x^2+y^2&=&7\\ x+y & = &3.\\ \end{array} \right. $$ |
Можно заметить, что пробелы (отбивки) до и после знака равенства получаются больше, чем это допускается типографскими правилами (и чем получается при использовании окружения aligned из пакета amsmath). К сожалению, бороться с этим трудно; проще раздобыть комплект, в который входит пакет amsmath .
Если необходимо, чтобы отдельные уравнения в системе были пронумерованы, можно воспользоваться окружением eqnarray . Оно работает так же, как окружение array с преамбулой rcl в вышеприведенном примере, но при этом у каждого уравнения автоматически печатается его номер (подобно тому, как автоматически печатается номер у выключной формулы, созданной с помощью окружения equation —. Если пометить какое-либо уравнение с помощью команды \label, то в дальнейшем можно на него ссылаться с помощью команды \ref или \pageref.
| \begin{eqnarray} 2\times3&=&6\\ 2+3&=&5\label{silly} \end{eqnarray} На с.~\pageref{silly} приведено глупое уравнение~\ref{silly} |
В этом примере символ "~ "между "с."\ и \pageref поставлен, чтобы слово "с."\ и номер страницы не попали на разные строки ; для аналогичных целей мы использовали этот символ и вторично.
При использовании окружения eqnarray не надо писать знаки "$$" (подобно тому, как не надо их писать при пользовании окружением equation).
Если вы хотите нумеровать не все уравнения, надо уравнения, которые вы нумеровать не будете, пометить командой \nonumber (непосредственно перед "\\"):
| \begin{eqnarray} \int_{-\infty}^\infty e^{-x^2}dx & = & \sqrt{\pi}\nonumber\\ \sqrt{576} & = & 24 \end{eqnarray} |
Окружение array можно использовать не только в выключных, но и во внутритекстовых формулах, хотя результат при этом обычно выглядит некрасиво. Окружения eqnarray и eqnarray* создают только выключные формулы.
Чтобы разбить выключную формулу на несколько выровненных частей, также можно воспользоваться окружением eqnarray или eqnarray*:
| \begin{eqnarray*} x^{20}&=&(x-1)^{20}+ 20(x-1)^{19}+\ldots+\\ &&{}+20(x-1)+1 \end{eqnarray*} |
не подошел слишком близко к первому символу второй строки, что в сочетании со увеличенными отбивками вокруг знака равенства было бы уже слишком (можете поставить эксперимент самостоятельно). Природа описанного эффекта объясняется ниже в разд. "Тонкая настройка"; он частично учтен в пакете amsmath (к сожалению, разные версии этого пакета могут давать разные результаты). Набор коммутативных диаграмм
Чтобы набирать в LaTeX'е "коммутативные диаграммы", необходимо подключить стилевой пакет amscd. Пусть это сделано. Тогда коммутативная диаграмма оформляется в виде окружения CD. Читателю, знакомому с AMS-TeX'ом, дальнейшее можно объяснить одной фразой: между "\begin{CD}" и "\end{CD}" надо поместить в точности тот же текст, что в MS-TeX'е пишут в аналогичном случае между \CD и \endCD . Для всех остальных удобнее пояснить правила набора коммутативных диаграмм на примере. Рассмотрим следующую диаграмму:
При подключенном пакете amscd она набирается следующим образом:
$$ \begin{CD} 0 @”> E' @>f” E @>g” E'' @”> 0\\ @. @VVpV @VVqV @VVrV @.\\ 0 @”> F' @>f” F @>g” F'' @”> 0 \end{CD} $$ Первая строка в этой записи соответствует верхней строке диаграммы. Стрелка, направленная слева направо, задается конструкцией "@”>" (а стрелка справа налево — конструкцией "@“<"); если над стрелкой надо поставить какую-то надпись (например, просто букву), то нужно ее разместить между первым и вторым знаками неравенства; чтобы надпись получилась под стрелкой, надо ее разместить между вторым и третьим знаками неравенства.
Вторая строка задает вертикальные стрелки. Конструкция "@VVV" задает стрелку, направленную вниз; если справа от стрелки нужна надпись, то ее надо разместить между второй и третьей буквами {V} (чтобы надпись оказалась слева от стрелки, она должна быть, естественно, между первой и второй буквами V). Вертикальная стрелка, направленная вверх, задается конструкцией "@AAA" (буква A — максимальное приближение к устремленной вверх стрелке); справа и слева от нее также можно сделать надпись (аналогичным образом).
Конструкция "@." задает "пустую" стрелку (в нашем случае — между двумя нулями); она необходима, чтобы LaTeX не сбился со счета, выясняя, в какие колонки ставить вертикальные стрелки.
Опишем работу окружения CD более аккуратно. Каждую коммутативную диаграмму окружение CD рассматривает как таблицу, состоящую из перемежающихся "горизонтальных" и " вертикальных" строк.
Каждая "горизонтальная" строка состоит из формул, перемежающихся горизонтальными стрелками. Во всех горизонтальных строках должно быть одинаковое количество формул. Если некоторые из мест, предназначенных для формул, должны остаться пустыми, то на этом месте надо оставить пробел или, если вам так приятнее, написать "{}". Между каждой парой формул должна быть стрелка. Если какие-то из этих стрелок не нужны, на их месте надо поставить "@." (" пустую" стрелку).
Каждая "вертикальная" строка состоит из вертикальных стрелок. Их должно быть столько же, сколько формул в любой из горизонтальных строк. Если какие-то из вертикальных стрелок не нужны, на их месте надо поставить "@." (пустую стрелку).
Если надпись при стрелке, направленной вниз (и задаваемой, стало быть, конструкцией "@VVV"), сама содержит букву V, то нужно ее (надпись) взять в фигурные скобки — иначе TeX не сможет понять, какая из букв V относится к надписи, а какая — к обозначению стрелки. Аналогичные меры надо принять, если надпись при стрелке, направленной вверх, содержит букву A (а также, естественно, если надпись при горизонтальной стрелке содержит знак ">" или "<", хотя ввиду математического смысла таких надписей последнее менее вероятно).
Наряду со стрелками, в коммутативных диаграммах встречаются горизонтальные и вертикальные "растянутые знаки равенства":

$$ \begin{CD} A @= B @”> C \\ @V{V_1}VV @AfAA @| \\ D @“g< E @“< F \end{CD} $$ Как видно из этого примера, такие знаки задаются конструкциями "@=" (горизонтальный) и "@|" (вертикальный). Обратите также внимание, как мы защитили фигурными скобками символ {V} в надписи к левой вертикальной стрелке.
Конструкция "\pretend" \ldots\ "\haswidth" системы AMSTeX в LaTeX'е не поддерживается.
Математики знают, что в коммутативных диаграммах могут встречаться не только горизонтальные и вертикальные стрелки: бывают и наклонные, и изогнутые, и пунктирные\...\ Возможностей пакета amscd для печати таких стрелок недостаточно; если вам нужны такие более сложные диаграммы, стоит воспользоваться стилевым пакетом Xy-pic (см.
приложение Д).
В "чистом" (без подключения стилевых пакетов) LaTeX' е набор диаграмм не предусмотрен. На самый крайний случай, если нет ни amscd, ни Xy-pic'а, можно сделать так:
$$ \begin{array}{ccccccccc} 0&\longrightarrow & E' & \stackrel{f}{\longrightarrow}& E & \stackrel{g}{\longrightarrow} & E'' & \longrightarrow & 0\\ &&\downarrow\lefteqn{p}&&\downarrow \lefteqn{q}&&\downarrow\lefteqn{r}\\ 0&\longrightarrow & F' & \stackrel{f}{\longrightarrow}& F & \stackrel{g}{\longrightarrow} & F'' & \longrightarrow & 0 \end{array} $$ В результате получится почти такая же диаграмма, как в нашем первом примере (правда, буквы при вертикальных стрелках будут крупнее букв при горизонтальных, поскольку команда \stackrel уменьшает буквы). Единственное, что тут нуждается в пояснении, — команды \lefteqn. Они нужны для того, чтобы вертикальные стрелки с надписями были правильно центрированы. Если эти \lefteqn'ы опустить (и писать p вместо \lefteqn{p} и т.п.), то вертикальные стрелки с подписями окажутся не по центру, а сдвинутыми влево.
Для интересующихся объясним, в чем тут дело. В процессе верстки текста TeX учитывает, сколько места занимает тот или иной фрагмент формулы. В TeX'е предусмотрены специальные команды, позволяющие фальсифицировать эти данные. В частности, команда \lefteqn печатает формулу, являющуюся ее аргументом, но при этом сообщает TeX'у, что по горизонтали эта формула не занимает места вообще. Стало быть, с точки зрения TeX'а ширина элемента, стоящего во второй строке нашей таблицы, определяется только шириной стрелки, и при центрировании текст располагается так, чтобы именно стрелка была на равном расстоянии от краев, сколь бы длинна на самом деле ни была формула, стоящая в \lefteqn. Создатель TeX'а Дональд Кнут назвал такого рода приемы работы с TeX'ом "грязными трюками" (dirty tricks). Впрочем, при написании TeX'овских макропакетов используются трюки и похлеще.
Набор матриц
Сначала мы объясним, как набирать матрицы при подключенном пакете amsmath (что во всех отношениях лучше и удобнее), а в конце этого раздела расскажем, для полноты картины, о тех средствах набора матриц, которые доступны в " чистом" LaTeX'е (без подключения дополнительных стилевых пакетов).Итак, предположим, что пакет amsmath подключен. Тогда для набора матриц, заключенных в круглые скобки, стоит воспользоваться окружением pmatrix. Вот как оно работает:
| $$ \begin{pmatrix} a_{11}-\lambda & a_{12}&a_{13}\\ a_{21}& a_{22}-\lambda &a_{23}\\ a_{31}& a_{32}&a_{33}-\lambda\\ \end{pmatrix} $$ |
Прямоугольные таблицы из формул бывают заключены не только в круглые скобки; соответственно, определены окружения bmatrix, vmatrix и Vmatrix, отличающиеся от pmatrix только тем, что вместо круглых скобок таблица заключена соответственно в квадратные скобки
, вертикальные черточки
и удвоенные вертикальные черточки
. Есть также окружение \matrix, которое дает на печати только прямоугольную таблицу, без всяких скобок. Комбинируя окружение matrix с парой ограничителей, можно получить матрицу со скобками более экзотического вида.Если вам нужны матрицы с более чем десятью столбцами, нужно изменить максимальное количество столбцов, написав в преамбуле что-нибудь вроде следующего:
\setcounter{MaxMatrixCols}{20} (после этого максимальное число столбцов в матрице станет равно двадцати; на TeX'ническом языке это действие называется " присваивание нового значения счетчику MaxMatrixCols" см. лекцию 7 ).
Можно также дать эту команду не в преамбуле, а в начале той выключной формулы, в которую входит ваша матрица; тогда разрешение увеличить число столбцов будет действительно только для матриц, входящих в эту выключную формулу.
Вот как можно набрать с помощью окружения matrix треугольник Паскаля:

Исходный текст для него выглядит так:
$$ \setcounter{MaxMatrixCols}{20} \begin{matrix} &&&& 1 && 1\\ &&& 1 && 2 && 1\\ && 1 && 3 && 3 && 1\\ && 1 && 4 && 6 && 4 && 1\\ 1 && 5 && 10 && 10 && 5 && 1 \end{matrix} $$ (заметим кстати, что в этом примере пустые элементы таблицы в конце строки опущены, так что число символов "&" в разных строках таблицы разное). Если бы мы не увеличивали MaxMatrixCols, то последняя строка вызвала бы сообщение об ошибке.
Чтобы получить в матрице горизонтальный ряд точек, простирающийся на несколько столбцов, используется команда \hdotsfor; ее обязательный аргумент — количество столбцов, занятых точками. В приведенном ниже примере обратите внимание на расстановку знаков "&" в строках, содержащих \hdotsfor:
| $$ \begin{vmatrix} 0 & 0&\hdotsfor{2} &a_1\\ 1 & 0&\hdotsfor{2} &a_2\\ \hdotsfor{5}\\ \hdotsfor{2} &1 &0 &a_{n-1}\\ 0 & \hdotsfor{2} &1 &a_n \end{vmatrix} $$ |
Наряду с горизонтальными рядами точек, в матрицах приходится использовать вертикальные и диагональные многоточия. Для их набора используются команды \vdots и \ddots:
| $$ \begin{pmatrix} a_{11}& a_{12} &\ldots & a_{1n}\\ a_{21}& a_{22} &\ldots & a_{2n}\\ \vdots& \vdots &\ddots & \vdots\\ a_{n1}& a_{n2} &\ldots & a_{nn} \end{pmatrix} $$ |
Наряду с матрицами, используемыми в выключных формулах, иногда приходится поместить небольшую матрицу и в формулу внутритекстовую. Естественно, и размеры символов, и интервалы между ними в такой матрице должны быть поскромнее. Для таких целей предназначено окружение smallmatrix (оно также становится доступным при подключении пакета amsmath). Вот пример его использования:
| $[X,Y]=\bigl(\begin{smallmatrix}1 & 0\\0 & -1\end{smallmatrix}\bigr)$ |
Теперь, как мы и обещали, сообщим, какие возможности для набора матриц остаются, если не подключать дополнительных пакетов. В этом случае необходимо пользоваться LaTeX'овским окружением array. Вот как получить этими средствами пример со 73:
| $$ \left(\begin{array}{ccc} a_{11}-\lambda & a_{12}&a_{13}\\ a_{21}& a_{22}-\lambda &a_{23}\\ a_{31}& a_{32}&a_{33}-\lambda \end{array}\right) $$ |
Надстрочные знаки
Часто требуется поставить дополнительный значок над буквой или фрагментом формулы: черточку, "крышку", и т.п. В TeX'е для этих целей есть специальные команды.Во-первых, можно поставить горизонтальную черту над любым фрагментом формулы с помощью команды \overline, как в следующем примере:
| Часто используется обозначение $$ \overline{a_na_{n-1}\ldots a_1a_0}=10^na_n+\ldots+a_0. $$ Особенно часто так пишут в научно-популярных книгах. |
:| \hat a | ![]() |
| \check a | ![]() |
| \tilde a | ![]() |
| \acute a | ![]() |
| \grave a | ![]() |
| \dot a | ![]() |
| \ddot a | ![]() |
| \breve a | ![]() |
| \bar a | ![]() |
| \vec a | ![]() |
Если поставить значок над буквой
или
, так, чтобы сохранилась и точка над буквой, то это будет некрасиво. Поэтому значки следует ставить не прямо над этими буквами, а над символами
и
):
| Писать $\tilde i$ некрасиво; лучше писать так: $\tilde\imath$. |
; TeX предоставляет возможность поставить "крышку" подходящего размера над целым фрагментом формулы с помощью команды \widehat:
| Тождество $\widehat{f*g}=\hat f\cdot\hat g$ означает, что преобразование Фурье переводит свертку в произведение. |
Кроме того, существует команда \overrightarrow, предназначенная для постановки стрелки над формулой:
| Рассмотрим вектор $\overrightarrow{AB}$. |
Остальные команды для постановки акцентов в формулах не имеют " широких" вариантов.
Формулы типа \hat{\hat A}, в которых акцент ставится над буквой, уже имеющей акцент, могут выглядеть неудачно. Если вам нужны такие "двойные акценты", подключите пакет \amsmath и пользуйтесь командами \Hat, \Check, \Tilde, \Acute, \Grave, \Dot, \Ddot, \Breve, \Bar и \Vec:
| Правильно $\Hat{\Hat Z}$, а не $\hat{\hat Z}$. |
Впрочем, в последних версиях пакета amsmath команды типа \hat исправлены и действуют так же, как их аналоги с большой буквы.
Отметим, что TeX позволяет ставить надстрочные знаки над буквами не только в математической формуле, но и в обычном тексте (в этом случае такие знаки обычно называют "диакритическими"), но команды для постановки этих знаков совершенно другие. Об этом подробно в лекции 4.
Нумерация формул
В математических текстах обычно приходится для удобства ссылок нумеровать формулы; LaTeX позволяет организовать эту нумерацию таким образом, чтобы номера формул и ссылки на них генерировались автоматически . Нумеровать таким образом можно только выключные формулы. Делается это так.Выключная формула, которую вы нумеруете, должна быть оформлена как окружение equation (знаков "$$" быть не должно!). Каждая такая формула на печати автоматически получит номер. Чтобы на него можно было ссылаться, надо формулу пометить: в любом месте между \begin{equation} и \end{equation} поставить команду \label, и после этого команда \ref будет генерировать номер формулы ; напомним, что может понадобиться повторный запуск LaTeX'a). Поясним сказанное примером:
| Как известно, \begin{equation} \label{trivial} 7\times9=63. \end{equation} ......................... Из формулы~(\ref {trivial}) следует, что $63/9=7$. |
Можно также использовать команду \pageref вместо \ref — тогда на печати получится не номер формулы, а номер страницы, на которую попала эта формула.
То, как именно выглядит на печати номер формулы, зависит от класса документа : например, в классе Tarticle (статья) формулы имеют сплошную нумерацию, а в классе book(книга) нумерация формул начинается заново в каждой лекции, и номер, скажем, формулы 5 из главы 3, генерируемый окружением equation, имеет вид (3.5). В лекции, посвященной модификации стандартных классов, мы расскажем, как можно самостоятельно менять вид номеров формул.
Кроме того, вы можете вообще не пользоваться автоматической генерацией номеров формул, а ставить их вручную.
Чтобы номер выглядел при этом красиво, удобно воспользоваться TeX'овской командой \eqno. Следующий пример показывает, как это делать:
| Простое тождество $$ 7\times9=63\eqno (3.2) $$ известно каждому школьнику. |
Никаких автоматических ссылок на формулу, генерируемую командой \eqno или \leqno, TeX не создает, и в этом случае за корректность ссылок отвечаете только вы.
Одно над другим
В этом разделе речь пойдет о тех случаях, когда в формуле необходимо поместить один символ над другим. В разд."Операции с пределами и без" уже шла речь о частном случае этой проблемы: постановке " пределов" у знака суммы, интеграла или чего-нибудь еще в этом роде. Сейчас мы рассмотрим общий случай.Операции, отношения и просто значки
Начнем с греческих букв. Имя команды, задающей строчную греческую букву, совпадает с английским названием этой буквы (например, буква
задается командой \alpha). Исключение составляет буква
(она называется "омикрон"): по начертанию она совпадает с курсивной латинской o, так что специальной команды для нее не предусмотрено, и для ее набора достаточно просто написать o в формуле. Некоторые греческие буквы имеют по два варианта начертаний; это также отражено в следующей ниже таблице.![]() | \alpha |
![]() | \beta |
![]() | \gamma |
![]() | \delta |
![]() | \epsilon |
![]() | \varepsilon |
![]() | \zeta |
![]() | \eta |
![]() | \theta |
![]() | \vartheta |
![]() | \iota |
![]() | \kappa |
![]() | \lambda |
![]() | \mu |
![]() | \nu |
![]() | \xi |
![]() | \pi |
![]() | \varpi |
![]() | \rho |
![]() | \varrho |
![]() | \sigma |
![]() | \varsigma |
![]() | \tau |
![]() | \upsilon |
![]() | \phi |
![]() | \varphi |
![]() | \chi |
![]() | \psi |
![]() | \omega |
задается командой Psi ). Некоторые прописные греческие буквы (" альфа", например) совпадают по начертанию с латинскими, и для них специальных команд нет — надо просто набрать соответствующую латинскую букву прямым шрифтом. Не надо использовать греческие буквы
и
из этой таблицы в качестве знаков суммы и произведения: для этих целей есть специальные команды, о которых пойдет речь дальше. Итак, вот прописные греческие буквы, не совпадающие по начертанию с латинскими:![]() | \Gamma |
![]() | \Delta |
![]() | \Theta |
![]() | \Lambda |
![]() | \Xi |
![]() | \Pi |
![]() | \Sigma |
![]() | \Upsilon |
![]() | \Phi |
![]() | \Psi |
![]() | \Omega |
), прочтите о том, как их получить, в разд."Смена шрифтов в формулах".Следующая серия символов — символы, рассматриваемые TeX'ом как символы бинарных операций (наподобие знаков сложения, умножения и т.п.); TeX оставляет в формуле небольшие пробелы по обе стороны этих знаков, кроме случаев, когда есть основания считать, что эти знаки используются не для обозначения операций, а для других целей (если, например, стоят два плюса подряд, то дополнительного пробела между ними не будет). Итак, вот список символов бинарных операций:
![]() | + |
![]() | - |
![]() | * |
![]() | \pm |
![]() | \mp |
![]() | \times |
![]() | \div |
![]() | \setminus |
![]() | \cdot |
![]() | \circ |
![]() | \bullet |
![]() | \cap |
![]() | \cup |
![]() | \uplus |
![]() | \sqcap |
![]() | \sqcup |
![]() | \vee |
![]() | \wedge |
![]() | \oplus |
![]() | \ominus |
![]() | \otimes |
![]() | \odot |
![]() | \oslash |
![]() | \triangleleft |
![]() | \triangleright |
![]() | \amalg |
![]() | \diamond |
![]() | \wr |
![]() | \star |
![]() | \dagger |
![]() | \ddagger |
![]() | \bigtriangleup |
![]() | \bigcirc |
![]() | \bigtriangledown |
p> Обозначения для многих из выписанных знаков длинны и сложны. С этим неудобством борются следующим образом: если в вашем тексте часто встречается какое-то длинное обозначение для математического символа, имеет смысл определить для этого символа свою более удобную команду (например, btu вместо bigtriangleup). Как это сделать, рассказано в начале лекции 7; вы можете прочитать это уже сейчас.
В следующей таблице мы собрали символы "бинарных отношений". Вокруг них TeX также оставляет дополнительные пробелы (не такие, как вокруг символов бинарных операций). Вообще говоря, нет смысла много задумываться об этих пробелах, поскольку TeX оформляет математические формулы в достаточно разумном стиле; о тех случаях, когда размер пробелов в математических формулах приходится корректировать вручную, речь пойдет дальше в этой лекции.
| < |
![]() | > |
![]() | = |
![]() | : |
![]() | \le |
![]() | \ge |
![]() | \ne |
![]() | \sim |
![]() | \simeq |
![]() | \approx |
![]() | \cong |
![]() | \equiv |
![]() | \ll |
![]() | \gg |
![]() | \doteq |
![]() | \parallel |
![]() | \perp |
![]() | \in |
![]() | \notin |
![]() | \ni |
![]() | \subset |
![]() | \subseteq |
![]() | \supset |
![]() | \supseteq |
![]() | \succ |
![]() | \prec |
![]() | \succeq |
![]() | \preceq |
![]() | \asymp |
![]() | \sqsubseteq |
![]() | \sqsupseteq |
![]() | \models |
![]() | \vdash |
![]() | \dashv |
![]() | \smile |
![]() | \frown |
![]() | \mid |
![]() | \bowtie |
![]() | \propto |
![]() | $M=\{\,x\in A\mid x>0\,\}$ |
Стоит еще отметить, что при записи отображений нужно использовать не двоеточие, а команду \colon:
![]() | $f\colon X\to Y$ |
Если вы подключите стилевой пакет latexsym, то вам, кроме того, будут доступны следующие семь символов:
![]() | \lhd |
![]() | \unlhd |
![]() | \rhd |
![]() | \unrhd |
![]() | \sqsubset |
![]() | \sqsupset |
![]() | \Join |
p> В следующей таблице собраны стрелки различных видов.
| \to |
![]() | \longrightarrow |
![]() | \Rightarrow |
![]() | \Longrightarrow |
![]() | \hookrightarrow |
![]() | \mapsto |
![]() | \longmapsto |
![]() | \leadsto |
![]() | \gets |
![]() | \longleftarrow |
![]() | \Leftarrow |
![]() | \Longleftarrow |
![]() | \hookleftarrow |
![]() | \leftrightarrow |
![]() | \longleftrightarrow |
![]() | \Leftrightarrow |
![]() | \Longleftrightarrow |
![]() | \uparrow |
![]() | \Uparrow |
![]() | \downarrow |
![]() | \Downarrow |
![]() | \updownarrow |
![]() | \Updownarrow |
![]() | \nearrow |
![]() | \searrow |
![]() | \swarrow |
![]() | \nwarrow |
![]() | \leftharpoondown |
![]() | \leftharpoonup |
![]() | \rightharpoonup |
![]() | \rightharpoondown |
![]() | \rightleftharpoons |
(она задается командой \leadsto). Из привычных российскому читателю символов в вышеприведенных таблицах нет знаков
и
, выглядящих гораздо лучше, чем
и
; кроме того, греческая буква " каппа" лучше смотрится в виде
, чем в виде
(\kappa). Эти символы становятся доступными, если подключить стилевой пакет amssymb. При условии, что это сделано, можно задавать в математических формулах букву
командой \varkappa, а символы
и
— командами \leqslant и \geqslant.Операции с пределами и без
В следующей таблице собраны названия функций — команды для воспроизведения названий математических операций наподобие
,
и т.п., обозначаемых последовательностью букв, набираемых прямым шрифтом. Любую из этих операций можно снабдить верхним и/или нижним индексом . ![]() | \log |
![]() | \lg |
![]() | \ln |
![]() | \arg |
![]() | \ker |
![]() | \dim |
![]() | \hom |
![]() | \deg |
![]() | \exp |
![]() | \sin |
![]() | \arcsin |
![]() | \cos |
![]() | \arccos |
![]() | \tan |
![]() | \arctan |
![]() | \cot |
![]() | \sec |
![]() | \csc |
![]() | \sinh |
![]() | \cosh |
![]() | \tanh |
![]() | \coth |
,
и т.д. — не что иное, как принятые в англоязычной литературе обозначения для тангенса, арктангенса и т.д. В отечественной литературе, однако же, принято обозначать
,
и т.д. Так как в стандартном комплекте TeX'а или LaTeX'а команд для этого нет, их приходится, при необходимости, определять самому. Это просто: надо подключить пакет amsmath, после чего добавить в преамбулу такую строчку:\DeclareMathOperator{\tg}{tg} В первом аргументе команды \DeclareMathOperator ставится придуманное вами имя команды (незанятое, естественно), во втором — то, что вы хотите получить на печати. Содержимое второго аргумента будет обработано, как математическая формула, но при этом символы - (дефис), * и ' будут иметь такое же значение, как в обычном тексте (это удобно, если вы хотите, чтобы имя вашего нового оператора включало тот же дефис). Разумеется, \DeclareMathOperator должно следовать в преамбуле документа после \usepackage{amsmath}.
Если не подключать amsmath, то собственную функцию, например tangens, определить также можно. Для этого достаточно написать в преамбуле документа \newcommand{\tg}{\mathop{\mathrm{tg}}\nolimits} После этого команда \tg будет создавать в математической формуле запись
с правильными пробелами вокруг нее. Другие команды такого типа определяются аналогично, надо только вместо tg написать то название функции (скажем, arctg), которое должно появиться на печати.В частности, так приходится делать, чтобы определить команды \Re и \Im для обозначения вещественной и мнимой части комплексного числа; в LaTeX'е такие команды есть, но на печати они дают не
и
, а
и
, что не принято в России (да и на Западе не очень принято).
При этом, поскольку обозначения \Re и \ Im уже заняты, приходится говорить \renewcommand вместо \newcommand:
\renewcommand{\Im}{\mathop{\mathrm{Im}}\nolimits} Даже при подключенном пакете \amsmath команда \DeclareMathOperator в этом месте не сработает, т.к. уже существующие команды она не переопределяет.
Описанный выше способ определения команд для функций является частным случаем существующей в LaTeX'е конструкции для (пере)определения новых команд (см. лекцию 7).
Еще один символ, который принято набирать прямым шрифтом, — это символ
, используемый в записи "сравнений по модулю". Обычно он употребляется не сам по себе, а в сочетании со знаком
(см. пример ниже); в этом случае для записи сравнения удобна команда \pmod, которой пользуются так:![]() | Легко видеть, что $23^{1993}\equiv 1\pmod{11}$ |
получаются автоматически; правая часть сравнения — весь текст, заключенный между \equiv и \pmod.Если подключить пакет amsmath , то станут доступны команды \mod и \pod, обозначающие то же понятие, что \mod, другими способами:
![]() ![]() |
$a^{p-1}\equiv 1\mod p$ $a^{p-1}\equiv 1\pod p$ |
используется и как символ бинарной операции, например, так:
| $f_*(x)=f(x)\bmod G$ |
Теперь обсудим, как можно было бы получить, скажем, формулу
c дополнительными элементами над и под знаком операции. В данной формуле эти элементы называются "пределы суммирования", поэтому в TeX-нической терминологии записи над и под знаком операции принято называть "пределами" (по-английски limits). В исходном тексте "пределы" обозначаются точно так же, как индексы; имея в виду, что знак суммы генерируется командой \sum, заключаем, что вышеназванную формулу можно получить так:
В этом примере существенно, что формула была выключной; во внутритекстовой формуле "пределы" печатаются на тех же местах, что и индексы:
| Тот факт, что $\sum_{i=1}^n (2n-1)=n^2$ следует из формулы для суммы арифметической прогрессии. |
ниже). Вот список операций, ведущих себя так же, как \sum:
![]() | \sum |
![]() | \prod |
![]() | \bigcup |
![]() | \bigcap |
![]() | \coprod |
![]() | \bigoplus |
![]() | \bigotimes |
![]() | \bigodot |
![]() | \bigvee |
![]() | \bigwedge |
![]() | \biguplus |
![]() | \bigsqcup |
![]() | \lim |
![]() | \limsup |
![]() | \liminf |
![]() | \max |
![]() | \min |
![]() | \sup |
![]() | \inf |
![]() | \det |
![]() | \Pr |
![]() | \gcd |
![]() | \varlimsup |
![]() | \varliminf |
![]() | \injlim |
![]() | \projlim |
![]() | \varinjlim |
![]() | \varprojlim |
![]() ![]() |
$\varlimsup_{n\to\infty} a_n=\inf_n\sup_{m\ge n}a_m$ $\mathcal F_x= \varinjlim_{U\ni x}\mathcal F(U)$ |
Кроме того, пакет amsmath предоставляет возможность определить и собственную команду "с пределами". Для этого надо воспользоваться командой \DeclareMathOperator*; синтаксис этой команды такой же, как у команды \DeclareMathOperator , но при "операторе", определенном такой командой, " пределы" будут ставиться так же, как при
.Еще одна "математическая операция", для которой требуются " пределы", — это интеграл. В LaTeX'е есть команды \int для обычного знака интеграла
и \oint для знака "контурного интеграла"
; если подключить пакет amsmath, то станут доступны также команды \iint, \iiint и \iiiint для двойного, тройного и " четверного" интегралов (если просто написать несколько команд \int подряд, то между знаками интеграла получатся слишком большие пробелы).При этом, для экономии места, пределы интегрирования помещаются не сверху и снизу от знаков интеграла, а по бокам (даже и в выключных формулах):
| $$ \int_0^1x^2 dx=1/3 $$ |
| $$ \int\limits_0^1 x^2 dx=1/3 $$ |
Если, с другой стороны, надо, чтобы в выключной формуле " пределы" у какого-либо оператора стояли не над и под знаком оператора, а сбоку, то после команды для знака оператора надо записать команду \nolimits, а уже после нее — обозначения для "пределов"
| $$ \prod\nolimits_{i=1}^ni=n! $$ |
Перечеркнутые символы
Чтобы получить в математической формуле изображение перечеркнутого символа, надо перед командой, генерирующей этот символ, поставить команду \not. Пример:
| Множество $\{x\mid x\not\ni x\}$ существовать не может. В этом состоит парадокс Рассела. |
лучше не писать "\not\in", а воспользоваться командой \notin — при этом знак получится более красивым. Если подключен пакет amssymb, то можно также вместо команды \not пользоваться готовыми командами для перечеркнутых символов .Переносы в формулах
При необходимости TeX может перенести часть внутритекстовой формулы на другую строчку. Такие переносы возможны после знаков "бинарных отношений", наподобие знака равенства1) или "бинарных операций", наподобие знаков сложения или умножения , причем последний знак в строке, вопреки российской традиции, не дублируется в начале следующей. Чтобы избежать этих переносов, можно воспользоваться тем обстоятельством, что TeX не разрывает при переносе часть формулы, заключенную в фигурные скобки. В частности, можно заключить в фигурные скобки всю формулу, в которой произошел нежелательный перенос, от открывающего ее знака доллара до закрывающего: после этого можно быть уверенным, что переноса этой формулы ни при каких обстоятельствах не произойдет.Вышеописанный способ борьбы с неудачными переносами в формулах имеет один недостаток: при этом затрудняется верстка абзацев и возрастает вероятность появления неприятных сообщений "Overfull \hbox"(см. разд."Абзацы" лекция 3 ).
Более гибкий способ борьбы с переносами в формулах — записать в преамбуле файла строку
\binoppenalty=10000" и/или строку
relpenalty=10000 Первая из этих строк запретит все разрывы строк после знаков бинарных операций, а вторая — после знаков бинарных отношений, и при этом помех верстке абзаца будет меньше, чем при заключении всей формулы в фигурные скобки.
Для любознательных поясним, что \binoppenalty и \relpenalty — параметры (TeX'овские), значением которых может быть целое число . Эти параметры определяют степень нежелательности разрыва строки после символов бинарной операции и бинарного отношения соответственно (чем больше значение соответствующего параметра, тем менее желателен разрыв строки). По умолчанию значение \binoppenalty равно
, а значение \relpenalty равно
. Можно присвоить им в преамбуле большие значения, тогда вероятность разрывов уменьшится. Значение 10000 означает абсолютный запрет.При заключении всей формулы в фигурные скобки верстка абзацев затрудняется, поскольку TeX лишается возможности варьировать в ней интервалы между символами для выравнивания строк (см.
разд."Абзацы"лекция 3 ).
Наконец, существует способ дублировать знаки операций, который мы приведем безо всяких пояснений. Включив
\newcommand*{\hm}[1]{#1\nobreak\discretionary{}% {\hbox{\mathsurround=0pt #1}}{}}в преамбулу, можно написать $a\hm+b\hm+c\hm+d$, при этом в формуле
при переносе знак
будет продублирован.Выключные формулы, в отличие от внутритекстовых, TeX никогда не переносит. Если выключная формула не помещается в строку, то при трансляции вы получите сообщение "Overfull \hbox" (в разд. "Абзацы"лекция 3 подробно рассказано, в каких еще ситуациях выдается такое сообщение), и вам придется разбить формулу на строки вручную. Как это делать, мы объясним в разд. "Многострочные и выключные формулы".
Пробелы вручную
Бывают случаи, когда промежутки между символами в формулах, выбранные TeX'ом автоматически, выглядят неудачно. В этом случае в формулу можно включить команды, задающие промежутки в явном виде. Вот основные из них:
Команда \! из этой таблицы уменьшает промежуток на столько же, на сколько команда \, его увеличивает.
В следующем примере собраны типичные случаи, когда в этих командах возникает нужда.
| $$ Пробелы надо корректировать в таких формулах, как $\int f(x)\,dx$, $\int\!\!\int f\,dx\,dy$ или $\sqrt{3}\,x$. $$ |
Простейшие случаи
Для начала рассмотрим такие возможности расположения одной части формулы над другой:Начнем с одного дополнения по поводу описанной в первой лекции команды \frac, задающей дроби. Если дробь, заданная с помощью команды \frac, встречается во внутритекстовой формуле, то ее числитель и знаменатель печатаются довольно мелким шрифтом, что не всегда приемлемо. Чтобы этого избежать, можно, подключив пакет amsmath, воспользоваться командой \dfrac: тогда шрифт будет более крупным. Если дробь во внутритекстовой формуле входит в показатель степени или индекс, то иногда имеет смысл задавать ее с помощью команды \tfrac (опять-таки чтобы шрифт был не слишком мелким; эта команда также доступна при подключении amsmath). Вот примеры:
и ![]()
| $\frac23$ и $\dfrac23$ $2^{\frac35}$ и $2^{\tfrac35}$ |
Если у вас подключен пакет amsmath, можно добиться требуемого эффекта с помощью ограничителей и окружения smallmatrix:
| Раньше вместо $\Gamma^k_{ij}$ писали $\left\{ \begin{smallmatrix}ij\\k \end{smallmatrix}\right\}$. |
Для наиболее часто встречающегося случая "биномиальных коэффициентов", когда ограничителями являются обычные круглые скобки, в пакете amsmath предусмотрена специальная команда \binom, работающая аналогично \frac:
| $\binom{12}7=792$ |
p>У команды \binom есть также аналоги \dbinom и \tbinom, относящиеся к ней так же, как \dfrac и \tfrac относятся к \frac.
В пакете amsmath предусмотрена также конструкция " обобщенной дроби", предназначенная для создания команд, аналогичных \frac и \binom. По определению, обобщенная дробь — это фрагмент формулы, устроенный так: левый ограничитель, затем дробь (толщина дробной черты может быть произвольной, в том числе нулевой), затем правый ограничитель. Напомним, что ограничители — это скобки и им подобные символы, способные автоматически менять размер; в обобщенной дроби ограничители могут и отсутствовать (так что обычная дробь — действительно частный случай обобщенной). Для набора обобщенной дроби предусмотрена команда \genfrac с шестью аргументами. Чтобы понять, как она работает, посмотрим на пример:
| Формула $\genfrac{(}{]}{1pt}{0}{x}{y-z}$ лишена всякого смысла. |
Если оставить третий аргумент пустым, написав просто "{}" вместо фигурных скобок, в которых записана толщина, то будет выбрана толщина дробной черты по умолчанию (она равна 0.4 пункта). Если оставить первый и второй аргумент пустыми, то ограничителей не будет (если, однако, левый ограничитель указан, то должен быть указан и правый). Например, "\dfrac{x}{y}" - это то же самое, что
\genfrac{}{}{}{0}{x}{y} В частности, наш пример с символом Кристоффеля можно записать как

Конечно, команда \ genfrac хороша не сама по себе, а как сырье для определения макросов, приспособленных к вашим конкретным нуждам.
Теперь о том, как быть, если вы не подключаете пакет amsmath. В этом случае удобно воспользоваться TeX'овской командой \atop:
![]() | Раньше вместо $\Gamma^k_{ij}$ писали $\left\{ij\atop k\right\}$. |
Для биномиальных коэффициентов есть TeX'овская команда \choose\,
| $$ {n\choose k}=\frac{n!}{k!(n-k)!} $$ |
вместе со знаком равенства.Команда \atop определяет, что пойдет вверх, а что — вниз, по тем же правилам, что и \choose . В примере выше с \atop мы обошлись без фигурных скобок, поскольку в математической формуле их функцию исполняют также команды \left и \right .
При подключенном пакете amsmath командами \atop и \choose пользоваться нельзя.
Интересный случай использования дробей — так называемые " цепные дроби"
Наивная попытка набрать эту формулу выглядит так:
| $$ \frac{7}{25}= \frac{1}{ 3+\frac{1}{ 1+\frac{1}{ 1+\frac{1}{3}}}} $$ |
| $$ \frac{7}{25}= \cfrac{1}{ 3+\cfrac{1}{ 1+\cfrac{1}{ 1+\cfrac{1}{3}}}} $$ |
Еще один случай, когда надо напечатать две формулы одинакого размера одну под другой, встречается, когда выражение для индексов суммирования занимает несколько строчек.
В этом случае надо, подключив пакет amsmath, воспользоваться командой \substack:
| $$ \sum_{\substack{i\in[0;n]\\ j\in[0;m]}} a_{ij} $$ |
Рассмотрим случай, когда нижняя часть формулы должна остаться на уровне строки. Чтобы добиться этого эффекта, используется LaTeX'овская команда \stackrel. У этой команды два аргумента: первый — то, что будет над строкой, второй — то, что останется в строке:
| $A\stackrel{f}{\longrightarrow}B$ |
| $$ A\xleftarrow[z]{f}B \xrightarrow{f+g-h}C $$ |
получается следующим образом:$$ \underbrace{1+3+5+7+ \ldots+(2n-1)}_{\mbox{$n$ слагаемых}}=n^2 $$ Если у вас подключен пакет amsmath, разумно воспользоваться командой \text вместо \mbox.
Горизонтальная фигурная скобка над фрагментом формулы генерируется командой \overbrace, надпись над ней оформляется как верхний индекс. В одной формуле могут присутствовать горизонтальные фигурные скобки как над, так и под фрагментом формулы:
| $$ \overbrace{\underbrace{ a+b+\ldots+z }_{26}+1+ \ldots+10}^{36} $$ |
Размер символов в формулах
В большинстве случаев вам не приходится задумываться о том, какой размер будут иметь символы в формуле: TeX автоматически выбирает более мелкий шрифт для степеней, индексов, числителей и знаменателей дробей, созданных командой \frac, и т.п. Бывают, однако, случаи, когда в этот процесс автоматического выбора размера приходится вмешаться. Сейчас мы вкратце опишем, как TeX выбирает размеры символов в формулах и как можно на него при этом влиять.При наборе формулы TeX в каждый момент руководствуется одним из следующих "стилей":
| displaystyle | " выключной" стиль |
| textstyle | " текстовый" стиль |
| scriptstyle | стиль для индексов |
| scriptscriptstyle | стиль для индексов к индексам. |
TeX использует выключной стиль при наборе
, текстовый стиль при наборе
и
, стиль для индексов при наборе
и двойки в показателе степени, и стиль для индексов к индексам при наборе семерок в показателях степени.
Стиля {scriptscriptscriptstyle} и дальнейших не предусмотрено, так что индексы третьего и более высоких порядков набираются теми же шрифтами, что и индексы второго порядка (расстраиваться по этому поводу не надо, поскольку эти шрифты и так мелкие).
Если вы хотите изменить стиль набора формулы, можно в явном виде указать его с помощью TeX'овской команды, имя которой совпадает с английским названием этого стиля (\displaystyle... \scriptscriptstyle)). Вот типичный пример, когда это может понадобиться. Предположим, в вашем тексте встречаются "цепные дроби". На стр.79 показано, какой неудачный результат выйдет, если набирать цепную дробь наивным образом. Теперь мы видим, что этот результат формально полностью согласуется с правилами TeX'а: вся формула, коль скоро она выключная, набирается в выключном стиле, стало быть числитель и первый из знаменателей будут уже в текстовом стиле, следующий знаменатель — как индексы, следующий — как индексы к индексам, и т.д. Если нет возможности воспользоваться командой \cfrac из пакета amsmath, то надо набирать так:
$$ \frac{7}{25}= \frac{1}{\displaystyle 3+\frac{1}{\displaystyle 1+\frac{1}{\displaystyle 1+\frac{1}{3}}}} $$
Каждая из трех команд \displaystyle необходима для того, чтобы каждая из последующих дробей набиралась в выключном стиле, невзирая на то, что она стоит в знаменателе.Разное
Мы уже перечислили почти все символы, используемые LaTeX'ом в математических формулах (кроме большого количества тех, доступ к которым открывается при подключении пакета amssymb — см. разд. "Символы из пакета amssymb "ниже. Остались скобки различных видов (им будет посвящен специальный разд. "Скобки переменного размера"), а также ряд значков (среди них есть и часто встречающиеся), не входящих ни в какой из разделов нашей классификации. Они собраны в следующей таблице.
![]() | \partial |
![]() | \triangle |
![]() | \angle |
![]() | \infty |
![]() | \forall |
![]() | \exists |
![]() | \emptyset |
![]() | \neg |
![]() | \aleph |
![]() | \prime |
![]() | \hbar |
![]() | \nabla |
![]() | \imath |
![]() | \jmath |
![]() | \ell |
![]() | \surd |
![]() | \flat |
![]() | \sharp |
![]() | \natural |
![]() | \top |
![]() | \bot |
![]() | \wp |
![]() | \Re |
![]() | \Im |
![]() | \backslash |
![]() | \| |
![]() | \spadesuit |
![]() | \clubsuit |
![]() | \diamondsuit |
![]() | \heartsuit |
| \dag |
![]() | \S |
![]() | \copyright |
![]() | \ddag |
![]() | \P |
![]() | \pounds |
Если подключить стилевой пакет latexsym, то будут также доступны следующие команды:
![]() | \mho |
![]() | \Box |
![]() | \Diamond |
(\emptyset) - это, конечно, обозначение для пустого множества. В отечественной литературе более принято другое начертание для этого символа:
. Символ пустого множества в этом начертании задается командой \varnothing, доступной при подключении стилевого пакета amssymb.Не следует смешивать команды \parallel и \|. На печати они дадут один и тот же значок
, но с разными пробелами (полиграфист бы сказал "отбивками" вокруг него. Команда \parallel нужна для обозначения бинарного отношения "параллельность", в то время как \|- это один из видов скобок:
| В школьных учебниках геометрии встречаются такие формулы, как $AB\parallel CD$. В университетских учебниках анализа часто пишут, что $\|A\|=\sup(|Ax|/|x|)$. |
и
(об этом пойдет речь в разд."Надстрочные знаки").Команды \nabla и \bigtriangledown задают разные символы, и их не надо путать. Обратите также внимание на символ, задаваемый командой \prime.
Это — тот самый штрих, который используется в качестве верхнего индекса, если после символа в формуле поставить знак "'" ; на самом деле записи "x'" и "x^" практически равносильны.
Приведем еще таблицу синонимов. В ней представлены математические символы, которые можно набирать двумя различными способами:
![]() | * или \ast |
![]() | \ne или \neq |
![]() | \le или \leq |
![]() | \ge или \geq |
![]() | [ или \lbrack |
![]() | ] или \rbrack |
![]() | \{ или \lbrace |
![]() | \} или \rbrace |
![]() | \to или \rightarrow |
![]() | \gets или \leftarrow |
![]() | \ni или \owns |
![]() | \wedge или \land |
![]() | \vee или \lor |
![]() | \neg или \lnot |
![]() | \Vert или \| |
Символы из пакета amssymb
Математических знаков в стандартном LaTeX'овском наборе очень много, но порой и их не хватает. Если вы подключите пакет amssymb, то сможете воспользоваться дополнительными математическими знаками, разработанными Американским математическим обществом (сокращенно AMS — American Mathematical Society). Этих знаков более полутора сотен; мы опять разобьем их на группы.Начнем с бинарных операций. Стилевой пакет amssymb дает возможность воспользоваться такими символами, относящимися к этой категории:
![]() | \boxdot |
![]() | \centerdot |
![]() | \barwedge |
![]() | \Cap |
![]() | \leftthreetimes |
![]() | \intercal |
![]() | \circleddash |
![]() | \gtrdot |
![]() | \smallsetminus |
![]() | \boxplus |
![]() | \boxminus |
![]() | \doublebarwedge |
![]() | \rightthreetimes |
![]() | \circledcirc |
![]() | \divideontimes |
![]() | \ltimes |
![]() | \boxtimes |
![]() | \veebar |
![]() | \Cup |
![]() | \curlyvee |
![]() | \dotplus |
![]() | \circledast |
![]() | \lessdot |
![]() | \rtimes |
![]() | \rightleftharpoons | ![]() | \leftrightharpoons |
![]() | \Vdash | ![]() | \Vvdash |
![]() | \vDash | ![]() | \upharpoonright |
![]() | \downharpoonright | ![]() | \upharpoonleft |
![]() | \downharpoonleft | ![]() | \Lsh |
![]() | \Rsh | ![]() | \circeq |
![]() | \succsim | ![]() | \gtrsim |
![]() | \gtrapprox | ![]() | \multimap |
![]() | \therefore | ![]() | \because |
![]() | \doteqdot | ![]() | \triangleq |
![]() | \precsim | ![]() | \lesssim |
![]() | \lessapprox | ![]() | \eqslantless |
![]() | \eqslantgtr | ![]() | \curlyeqprec |
![]() | \curlyeqsucc | ![]() | \preccurlyeq |
![]() | \leqq | ![]() | \leqslant |
![]() | \lessgtr | ![]() | \risingdotseq |
![]() | \fallingdotseq | ![]() | \succcurlyeq |
![]() | \geqq | ![]() | \geqslant |
![]() | \gtrless | ![]() | \sqsubset |
![]() | \sqsupset | ![]() | \vartriangleright |
![]() | \vartriangleleft | ![]() | \trianglerighteq |
![]() | \trianglelefteq | ![]() | \between |
![]() | \blacktriangleright | ![]() | \blacktriangleleft |
![]() | \vartriangle | ![]() | \eqcirc |
![]() | \lesseqgtr | ![]() | \gtreqless |
![]() | \lesseqqgtr | ![]() | \gtreqqless |
![]() | \varpropto | ![]() | \smallsmile |
![]() | \smallfrown | ![]() | \Subset |
![]() | \Supset | ![]() | \subseteqq |
![]() | \supseteqq | ![]() | \bumpeq |
![]() | \Bumpeq | ![]() | \lll |
![]() | \ggg | ![]() | \pitchfork |
![]() | \backsim | ![]() | \backsimeq |
![]() | \lvertneqq | ![]() | \gvertneqq |
![]() | \lneqq | ![]() | \gneqq |
![]() | \lneq | ![]() | \gneq |
![]() | \precnsim | ![]() | \succnsim |
![]() | \lnsim | ![]() | \gnsim |
![]() | \precneqq | ![]() | \succneqq |
![]() | \precnapprox | ![]() | \succnapprox |
![]() | \lnapprox | ![]() | \gnapprox |
![]() | \varsubsetneq | ![]() | \varsupsetneq |
и
в привычном отечественному читателю начертании, а также знаки
и
, доступ к которым открывается уже при подключении пакета latexsym. Символы
,
,
и
, задаваемые командами \vartriangleleft, \trianglelefteq, \vartriangleright и \trianglerighteq, также доступны уже при подключении пакета latexsym, но там они называются иначе: \lhd, \unlhd, \rhd и \unrhd соответственно.Специальные команды предусмотрены для отрицаний отношений из предыдущей таблицы. В принципе "отрицание" (перечеркнутый символ) можно напечатать, поставив перед этим символом команду \not , но взаимное расположение черты и перечеркиваемого символа при этом не всегда удачно. Поэтому Американское математическое общество выделило для перечеркнутых символов специальные литеры (ради красоты приходится страдать ...). Итак:
![]() | \nleq | ![]() | \ngtr |
![]() | \nleqslant | ![]() | \nsucceq |
![]() | \nsupseteqq | ![]() | \nsim |
![]() | \nparallel | ![]() | \nshortparallel |
![]() | \nvDash | ![]() | \ntrianglelefteq |
![]() | \nleftarrow | ![]() | \nRightarrow |
![]() | \ngeq | ![]() | \nprec |
![]() | \ngeqslant | ![]() | \nleqq |
![]() | \ncong | ![]() | \nsubseteq |
![]() | \nmid | ![]() | \nvdash |
![]() | \nVDash | ![]() | \ntriangleleft |
![]() | \nrightarrow | ![]() | \nLeftrightarrow |
![]() | \nless | ![]() | \nsucc |
![]() | \npreceq | ![]() | \ngeqq |
![]() | \nsubseteqq | ![]() | \nsupseteq |
![]() | \nshortmid | ![]() | \nVdash |
![]() | \ntrianglerighteq | ![]() | \ntriangleright |
![]() | \nLeftarrow | ![]() | \nleftrightarrow |
![]() | \circlearrowright | ![]() | \circlearrowleft |
![]() | \twoheadrightarrow | ![]() | \twoheadleftarrow |
![]() | \leftleftarrows | ![]() | \rightrightarrows |
![]() | \upuparrows | ![]() | \downdownarrows |
![]() | \rightarrowtail | ![]() | \leftarrowtail |
![]() | \rightsquigarrow | ![]() | \leftrightsquigarrow |
![]() | \looparrowleft | ![]() | \looparrowright |
![]() | \Rrightarrow | ![]() | \Lleftarrow |
![]() | \nleftarrow | ![]() | \nrightarrow |
![]() | \nLeftarrow | ![]() | \nRightarrow |
![]() | \nLeftrightarrow | ![]() | \nleftrightarrow |
![]() | \curvearrowleft | ![]() | \curvearrowright |
доступна и при использовании пакета latexsym, но там она называется \leadsto.В приведенной выше таблице присутствует команда \rightleftharpoons, входящая в основной набор LaTeX'а; ниже можно найти еще несколько аналогичных примеров. Такое дублирование — не прихоть TeXнологов из AMS: в базовом LaTeX'е символы, задаваемые этими дублирующимися командами, собирались из отдельных кусочков, вследствие чего они не меняли должным образом размеры при помещении в индексы. В пакете amssymb те же команды отсылают к специальным литерам, входящим в шрифты AMS, в результате чего символы
(\rightleftharpoons) или, скажем,
(\hbar) правильно ведут себя и в индексах. Теперь перечислим обыкновенные символы, доступ к которым открывается при подключении пакета amssymb:
![]() | \square | ![]() | \blacksquare |
![]() | \lozenge | ![]() | \blacklozenge |
![]() | \backprime | ![]() | \bigstar |
![]() | \blacktriangledown | ![]() | \blacktriangle |
![]() | \triangledown | ![]() | \angle |
![]() | \measuredangle | ![]() | \sphericalangle |
![]() | \circledS | ![]() | \complement |
![]() | \diagup | ![]() | \diagdown |
![]() | \varnothing | ![]() | \nexists |
![]() | \Finv | ![]() | \Game |
![]() | \mho | ![]() | \eth |
![]() | \beth | ![]() | \gimel |
![]() | \daleth | ![]() | \digamma |
![]() | \varkappa | ![]() | \Bbbk |
![]() | \hslash | ![]() | \hbar |
, доступ к которому открывает уже пакет latexsym, а также греческая буква
и обозначение для пустого множества
. Символы
и
также доступны уже при подключении пакета latexsym, но там они называются \Box и \Diamond соответственно.Команды \yen, \checkmark, \circledR и \maltese можно использовать не только в формулах, но и в тексте (кстати, \yen — это обозначение для японской иены).
У некоторых из символов, определенных в пакете amsfonts, тоже есть синонимы. Вот их список:
![]() | \dasharrow или \dashrightarrow |
![]() | \Doteq или \doteqdot |
![]() | \Cup или \doublecup |
![]() | \Cap или \doublecap |
![]() | \lll или llless |
![]() | \ggg или gggtr |
![]() | \yen | ![]() | \checkmark |
![]() | \circledR | ![]() | \maltese |
![]() | \dasharrow | ![]() | \dashleftarrow |
![]() | \sqsubset | ![]() | \sqsupset |
![]() | \vartriangleleft | ![]() | \vartriangleright |
![]() | \trianglelefteq | ![]() | \trianglerighteq |
![]() | \square | ![]() | \lozenge |
![]() | \rightsquigarrow | ![]() | \rightleftharpoons |
Скобки переменного размера
Если заключенный в скобки фрагмент формулы занимает много места по вертикали (за счет дробей, степеней и тому подобного), то и сами скобки должны быть большего размера, чем обычные. В TeX'е на этот случай предусмотрен механизм автоматического выбора размера скобок. Пользуются им так.В формуле
скобки обычного размера вокруг
смотрелись бы плохо; поэтому при ее наборе надо поставить команду \left перед открывающей скобкой и команду \right перед закрывающей: $$ e=\lim_{n\to\infty} \left(1+\frac{1}{n}\right)^n $$ Если перед одной скобкой стоит \left, а перед другой скобкой стоит \right, то на печати размер этих скобок будет соответствовать максимальной высоте фрагмента формулы, заключенного между \left и \right.
Конструкция с \left и \right применима не только к круглым скобкам. В следующей таблице перечислены скобки и некоторые другие символы, которые с помощью \left и \right автоматически принимают нужный размер. TeXнический термин для таких символов — ограничители (по-английски delimiters).
![]() | ( |
![]() | ) |
![]() | [ |
![]() | ] |
![]() | { |
![]() | } |
![]() | \lfloor |
![]() | \lceil |
![]() | \rceil |
![]() | \langle |
![]() | \rangle |
![]() | | |
![]() | \| |
![]() | / |
![]() | \ |
Если подключить стилевой пакет amssymb, то станут доступны еще две пары ограничителей:
![]() | \ulcorner |
![]() | \urcorner |
![]() | \llcorner |
![]() | \lrcorner |
Вместо "ограничителя" после команды \left или \ right можно поставить точку. На месте этой точки ничего не напечатается, а другой "ограничитель" будет необходимого размера. Вот два примера того, как можно использовать этот прием. Во-первых, таким способом можно создать косую дробную черту увеличенного размера (символ {/} также является "ограничителем"- см. ниже):
| $$ M(f)=\left.\left( \int\limits_a^b f(x)\,dx \right) \right/(b-a) $$ |
и
- это один из немногих случаев, когда TeX не может автоматически создать требуемые пробелы, и ему надо помочь. Подробнее о таких вещах речь пойдет ниже, в разд. "Пробелы вручную". Другой пример использования ограничителя без пары таков:
| $$ \int\limits_a^b\frac12 (1+x)^{-3/2}dx= \left.-\frac{1}{\sqrt{1+x}} \right|_a^b $$ |
Наконец, важный пример использования ограничителей без пары — использование их для набора систем уравнений, о чем пойдет речь в разд."Многострочные включные формулы".
До сих пор у нас речь шла только о том, что размеры ограничителей выбираются автоматически с помощью команд \left и \right; бывают, однако, ситуации, когда такой автоматический выбор размера приводит к неудовлетворительным результатам или даже вообще невозможен. Вот, например, ситуация, когда \left и \right не срабатывают:
| $\left| |x+1|-|x-1|\right|$ |
А иногда бывает так, что автоматически получающиеся ограничители слишком велики. В следующем примере совсем не обязательно, чтобы скобки охватывали и пределы суммирования, что получается при использовании \left и \right:
| $$ \left( \sum_{k=1}^n x^k \right)^2 $$ |
p> Во всех этих случаях имеет смысл указать размер ограничителя явно. Для этого предусмотрены TeX'овские команды \bigl, \Bigl, \biggl и \Biggl для левых ограничителей и \bigr, \Bigr, \biggr и \Biggr для правых ограничителей. Мы перечислили эти команды в порядке возрастания размера создаваемого ими ограничителя. В частности, для модулей можно было бы написать так:
| $\bigl| |x+1|-|x-1|\bigr|$ |
| $$ \Bigl(\sum_{k=1}^n x^k\Bigr)^2 $$ |
К сожалению, команды для явного указания размера ограничителя имеют одну неприятную особенность: если " основной шрифт" документа крупнее, чем кегль 10 (иными словами, если указаны классовые опции 11pt или 12pt — , то может случиться так, что скобка, размер которой задан, например, командой \bigl, имеет точно такой же размер, как и скобка "в чистом виде". Чтобы избежать этой неприятности, надо подключить пакет amsmath: тогда команды наподобие \bigl будут работать корректно.
Смена шрифтов в формуле
По умолчанию все латинские буквы в формулах набираются курсивом. Что делать, если вам нужен другой шрифт?В первой лекции мы приводили примеры смены шрифтов в тексте с помощью команд наподобие \bfseries или \itshape. В формулах, однако же, для этих целей надо использовать другие средства.
Пусть, например, вам нужна буква
, набранная прямым жирным шрифтом. Тогда надо воспользоваться командой \mathbf:
| $\mathbf P^n$ |
(в таком начертании) встречается в формулах часто, разумно определить для нее сокращенное обозначение. Чтобы узнать, как это делается, посмотрите начало
лекции 7.Вот полный список начертаний символов в формулах, которые можно получить без подключения дополнительных стилевых пакетов:
![]() | $\mathbf x+y$ |
![]() | $\mathrm x+y$ |
![]() | $\mathtt x+y$ |
![]() | $\mathsf x+y$ |
![]() | $\mathcalT_X$ |
![]() | $\mathit\Gamma+y$ |
Команда \mathit дает одну из возможностей (и не лучшую, надо сказать) получить прописные греческие буквы в наклонном начертании. Дело в том, что если у вас подключен пакет amsmath, то команда \mathit работать откажется (по крайней мере, в некоторых версиях этого пакета). В этом случае для печати в формуле прописных греческих букв в наклонном начертании применяются специальные команды, в которых перед названием буквы стоит var:
![]() | \varGamma |
![]() | \varDelta |
![]() | \varTheta |
![]() | \varLambda |
![]() | \varXi |
![]() | \varPi |
![]() | \varSigma |
![]() | \varUpsilon |
![]() | \varPhi |
![]() | \varPsi |
![]() | \varOmega |
| Множество особенностей многообразия $X$ обозначается $X_{\mathrm{sing}}$. |
Дело в том, что, в дополнение к сказанному ранее, действует еще одно правило: если после имени команды, принимающей обязательный аргумент, следует не открывающая фигурная скобка, а буква, то в качестве аргумента будет воспринята именно эта буква. Так что можно было бы писать и \mathbf{x} вместо \mathbf x, но так обычно не делают, чтобы не нажимать лишний раз на клавиши.
Если подключить стилевой пакет amsfonts или amssymb, то в математических формулах можно использовать еще два шрифта: ажурный (
,
,
,... и готический (
,
,
,...). Ажурным шрифтом можно печатать только прописные буквы; он задается командой \mathbb (как и в случае с остальными командами, описываемыми в этом разделе, ажурным шрифтом печатается буква, следующая непосредственно после команды \mathbb; если надо напечатать этим шрифтом несколько букв, их следует взять в фигурные скобки). Готический шрифт задается командой \mathfrak; она также действует только на непосредственно следующую букву (или на несколько букв, если они взяты в фигурные скобки):
| Алгебра $\mathfrak{sl}_2(\mathbb C)$ играет особую роль в теории представлений. |
Наконец, есть возможность использовать в формулах вариант рукописного шрифта, в котором буквы имеют более изысканные очертания:
Для этого надо подключить стилевой пакет \euscript; команда, задающая этот шрифт, называется \EuScript.
Теперь, когда вы знаете, как печатать символы в формулах прямым шрифтом, может возникнуть искушение восполнить отсутствие в стандартном комплекте LaTeX'а команды, дающей функцию
, путем набора чего-нибудь вроде \mathrm{tg}x. Так делать, однако, не надо, поскольку при этом пробелы будут неправильными:
| В формуле $\mathrm{tg} x$ буква $x$слишком близка к знаку тангенса. А вот в формуле $\sin x$ пробелы правильные. |
Если вам хочется узнать, почему все так получается, прочтите разд."Снова об интервалах и формулах".
Если вы хотите включить в формулу какой-либо текст, то одной команды \mathrm для этого также недостаточно: любой текст, заключенный между знаками доллара, пусть даже он набирается прямым шрифтом, TeX рассматривает как часть математической формулы, и в соответствии с этим игнорирует те пробелы, которые ставите вы, и расставляет пробелы по собственным правилам:
| $$ \sqrt{x^3}=x \mathrm{для всех} x. $$ |
Остается только отметить, что ажурный и готический шрифты, о которых шла речь сейчас, можно использовать только в формулах, и набирать с их помощью обычный текст невозможно (так же, как невозможно набирать греческий текст с помощью команд \alpha, \beta и т.д.).
Кроме описанного выше (и рекомендуемого нами) способа переключения шрифтов в формулах, в LaTeX'е пока сохраняется (ради совместимости с LaTeX'ом 2.09) еще один способ, с которым можно ознакомиться из приведенной ниже таблицы.
| \mathrm x+y | {\rm x}+y | ![]() |
| \mathbf x+y | {\bf x}+y | ![]() |
| \mathsf x+y | {\sf x}+y | ![]() |
| \mathtt x+y | {\tt x}+y | ![]() |
| \mathcal T_X | {\cal T}_X | ![]() |
Снова об интервалах в формулах
Сейчас мы обсудим вкратце, какими правилами руководствуется TeX при расстановке интервалов в математических формулах. В стандартных ситуациях мы об этом не задумываемся, а полностью доверяем LaTeX'у. То, о чем мы будем говорить, пригодится, если мы пользуемся в формулах сложными конструкциями (например, конструируем знак двойного интеграла из двух знаков интеграла и "отрицательных пробелов", и при этом не хотим подбирать верные интервалы экспериментально.При наборе формулы TeX рассматривает ее как состоящую из частей одного из следующих типов:
| Обыкновенный символ | например, \alpha |
| Бинарная операция | |
| Бинарное отношение | |
| Математический оператор | |
| Подформула | например, {x^2} |
| Знак препинания | , или ; или \colon или \ldotp |
| Скобка |
| Сравните $2+3$ и $2{+}3$: во втором случае знак плюс является подформулой, а не символом бинарной операции. |
Мы не будем вдаваться в точные правила расстановки пробелов (они перечислены в книге [2]). Для нас сейчас важнее то, что TeX можно заставить рассматривать любой фрагмент формулы как бинарную операцию, бинарное отношение или математическую операцию: для этого надо применить команды \mathbin, \mathrel или \mathop соответственно. Вот примеры того, как работают эти команды.
Иногда возникает нужда в символе
, рассматриваемом как символ бинарной операции. Естественно, этот символ можно сгенерировать, если написать \hat{\otimes}, но тогда вокруг этого символа будут неправильные пробелы:
| Хотелось бы, чтобы в формуле $E\hat{\otimes}F$ были такие же пробелы, как и в формуле $E\otimes F$. |
не как обычный символ, а как символ бинарной операции, надо сделать так:
| В формуле $E\mathbin{\hat{\otimes}}F$ пробелы такие же, как и в $E\otimes F$. |
встречается в вашей рукописи часто, то вам вряд ли понравится всякий раз делать по 23 нажатия на клавиши для его набора. В этом случае очень удобно ввести для него собственное сокращенное обозначение (посмотрите начало лекции 7 по поводу того, как это сделать).Типичный пример использования команды \mathop - определение имени операции, записываемой прямым шрифтом. Обозначения такого типа встречаются в математических текстах очень часто, и набора команд для них, предусмотренного LaTeX'ом , вполне может не хватить; в этом случае, чтобы получить на печати, скажем,
, надо написать$\mathop{\mathrm{Ext}}\nolimits^1(E,F)$ Здесь \mathop необходимо для того, чтобы между
и
автоматически вставлялся маленький дополнительный пробел, делающий формулу более читаемой:
| Сравните $\sin x$ и $\mathrm{sin}x$. |
А вот пример, когда TeX' у надо объяснить, что некоторый сложный символ есть символ математического оператора. Пусть нам понадобилась формула
Проблема тут в том, чтобы поставить штрих у знака суммы. Впрямую это сделать не удается:
| $$ \sum'_{x\in\Gamma}f(x). $$ |
$$ \sum^\prime_{x\in\Gamma}f(x). $$ и в этой записи штрих рассматривается как предел суммирования. Не будем, однако, отчаиваться, а просто создадим новый оператор "сумма со штрихом":
$$ \mathop{{\sum}'}_{x\in\Gamma}f(x). $$ Можете проверить, что на сей раз все получается как надо. В этой записи очень существенно, что \sum взято в фигурные скобки: благодаря этому символ, генерируемый командой \sum, рассматривается TeX'ом просто как подформула, поэтому и штрих после него стоит где положено, а не там, где бывают пределы суммирования. Вся подформула "{\sum}" передается в качестве аргумента команде \mathop, благодаря чему наш новый символ "сумма со штрихом" рассматривается как математический оператор и пределы суммирования (в выключной формуле) ставятся у него, где положено.
Здесь опять разумно создать сокращенное обозначение, которое заменяло бы эту громоздкую запись.
Таблицы спецзнаков с комментариями
В этом разделе мы перечислим математические знаки, предоставляемые LaTeX'ом. Знаков этих очень много, поэтому разобьем их на несколько групп. Это разбиение делается не только для удобства восприятия: как мы увидим в разд. "Снова об интервалах и формулах", расстановка интервалов в формулах зависит от того, к какой группе (бинарная операция, бинарное отношение, обыкновенный символ и т.д.) относится математический символ.Тонкая настройка
В этом разделе мы рассмотрим некоторые более изысканные вопросы, связанные с набором математических формул. Рекомендуем читателям, не являющимся полиграфистами, пропустить в этом разделе мелкий шрифт (хотя бы при первом чтении).Вертикальные отбивки вокруг выключных формул
За размер вертикальных отбивок, автоматически создаваемых TeX'ом вокруг выключных формул, отвечают следующие TeX'овские параметры:| \abovedisplayskip | \abovedisplayshortskip | перед формулой |
| \belowdisplayskip | \belowdisplayshortskip | после формулы |
\abovedisplayskip=.7\abovedisplayskip (и аналогично для трех остальных параметров).
Можно не только пропорционально изменять отбивки вокруг выключных формул, как в примере выше, но и присваивать этим интервалам конкретные значения. При этом следует иметь в виду следующее обстоятельство. Интервалы, создаваемые между текстом и формулами, обладают определенной растяжимостью, что помогает TeX'у выравнивать страницы по высоте (говоря на TeX'ническом языке, эти интервалы являются "клеем"), и присваивая абсолютное значение таким интервалам, желательно также задавать их растяжимость и сжимаемость; (более подробно — разд. "Клей" лекции 8 по поводу того, как это делается.
Включение текста в формулы
В математическую формулу можно включить фрагмент обычного текста с помощью LaTeX'овской команды \mbox. В следующем примере продемонстрировано, как это можно сделать; в нем используется еще команда \qquad, делающая в тексте или формуле пробел размером 2em ; подробнее по поводу команд, создающих пробелы в формулах, см. разд. "Пробелы вручную"; по поводу команд, создающих пробелы в тексте, см. разд. "Установка прромежутков вручную ".лекция 3
| $$ \sqrt{x^3}=x\qquad \mbox{для всех }x. $$ |
будет недостаточен). Команда \qquad была использована по аналогичной причине.На самом деле можно было бы написать даже так:
$$ \sqrt{x^3}=x\qquad\mbox{для всех $x$.} $$ Аргумент команды \mbox рассматривается как текст, но этот текст вполне может, в свою очередь, содержать формулы!
При включении текста в формулы с помощью команды \mbox важно иметь в виду вот что. Как читатель, видимо, уже заметил, в математических формулах верхние и нижние индексы, числитель и знаменатель дробей, созданных с помощью команды \frac, и тому подобные фрагменты набираются более мелким шрифтом, чем остальная часть формулы. Однако в тексте, созданном с помощью \mbox, размер шрифта не изменится, в какую бы часть формулы этот текст не попал. Если вас это не устраивает, подключите стилевой пакет \amsmath и воспользуйтесь командой \text вместо \mbox\,: тогда включенный в формулу текст будет правильно менять размеры в степенях и индексах, а если аргумент команды \text сам, в свою очередь, содержит формулу, то размеры символов в этой формуле будут выбраны более правильно, чем при использовании \mbox.
Вне математических формул команду \text использовать нельзя.
Команда \mbox еще встретится нам в следующей лекции, когда речь пойдет о предотвращении переносов в словах; более подробно мы ее рассмотрим в лекции 8.
Работа в системе LaTeX
Абзацы без выравнивания и переносов
Можно перевести TeX в режим, при котором он вообще не будет пытаться выравнивать текст по правому краю и не будет (почти никогда) делать переносов. Для этого служит команда \raggedright. Ее можно дать как в преамбуле, так и внутри документа; в любом случае, чтобы она подействовала на абзац, необходимо, чтобы ее действие не прекратилось до того, как TeX'ом будет прочтена пустая строка, завершающая абзац (ср. выше обсуждение команды \sloppy). Вот пример:
![]() | Этот абзац мы сверстали без выравнивания и переносов. Может быть, вид и не очень аккуратный, зато без overfull'ов.{\raggedright } |
Абзацы нестандартной формы
Пусть нам потребовалось создать абзац c "отрицательным" абзацным отступом, в котором все строки, кроме первой, начинаются на расстоянии одного сантиметра от полей. Этого можно добиться следующим образом:
![]() | \hangindent=1cm \noindent Отрицательный абзацный отступ (по-английски hanging indentation). |
Пусть теперь нам хочется, чтобы дополнительный отступ, величина которого задана параметром \hangindent, начинался не со второй строки, а, скажем, с третьей. Для этого надо установить еще один TeX'овский параметр, обозначаемый \hangafter:
![]() | \hangindent=1cm \hangafter=2 \noindent Можно сделать так, чтобы отступ начался не с первой строки, а там, где нам это потребовалось. |
Можно также добиться того, чтоб дополнительный отступ не начинался после какой-то строки, а напротив, присутствовал только в нескольких первых строках абзаца. Для этого надо присвоить параметру \hangafter отрицательное значение: если величина \hangafter равна
, то дополнительный отступ, равный \hangindent, будет присутствовать в строках номер
. Пример:
![]() | \hangindent=1.5cm \hangafter=-3 \noindent С помощью рассмотренных нами средств TeX'а можно выкапывать в абзацах небольшие ямки. На место образующегося белого прямоугольника можно, например, вклеить иллюстрацию. |
, то дополнительный отступ размером
будет отсчитываться от правого, а не левого поля (в каких именно строках будет этот дополнительный отступ, по-прежнему определяется значением \hangafter):
![]() | \hangindent=-2cm \hangafter=2 \noindent На сей раз нам захотелось приклеить картинку не слева, а справа. Что ж, TeX\ позволяет сделать и так, было бы желание. Вскоре вы сможете убедиться, что и это — не предел. |
p>После каждой команды "завершить абзац" ( иными словами, после каждой пустой строки или команды \par восстанавливаются принятые по умолчанию значения параметров \hangindent и \hangafter. Отметим еще, что не следует менять эти параметры внутри LaTeX'овских окружений наподобие itemize или quote: в таких окружениях LaTeX устанавливает эти параметры самостоятельно, и их ручная переустановка может привести к непредсказуемым результатам.

Начало этого причудливого абзаца выглядело в исходном тексте так:
\parshape=14 0cm 6cm .1cm 5.8cm .17cm 5.66cm .5cm 5cm .9cm 4.2cm 1.05cm 3.9cm 1.1cm 3.8cm 1.1cm 3.8cm 1.05cm 3.9cm .9cm 4.2cm .5cm 5cm .17cm 5.66cm .1cm 5.8cm 0cm 6cm \noindent \small Если вам не хватает возможностей... Смысл этого текста следующий. Число
, следующее непосредственно после \parshape и знака равенства, задает количество строк, имеющих нестандартные длину и/или отступ от левого поля. После этого числа, через пробел (конец строки, как мы помним, — тоже пробел), перечислены отступы от левого поля и длины строк: 0cm - отступ первой строки от левого поля, 6cm - ее длина, 0.1cm - отступ второй строки от левого поля, 5.8cm - ее длина, и т.д. Если написано, что \parshape равно
, то после этого должно следовать
длин. Если реально в абзаце получится менее
строк, то указания на длину и отступ отсутствующих строк будут проигнорированы TeX'ом; если строк получается больше, чем
, то все последующие строки будут иметь те же отступ и длину, что заданы для строки номер
. Заметим, наконец, что абзац мы начали командой \noindent, чтобы отступ самой первой строки был действительно равен нулю (если абзац начинается без \noindent, то в первой строке будет еще присутствовать пробел длиной в \parindent).После пустой строки или команды \par действие параметров, заданных командой \parshape, прекращается.
У абзаца, форма которого задана с помощью \hangindent или \parshape, длина и отступ строки зависят, как вы могли заметить, от ее номера. Если такой абзац содержит выключную формулу, то TeX считает, что эта формула занимает три строки, причем сама формула расположена в средней из этих трех (реально формула может, разумеется, занимать больше места).
Абзацы
Чтобы TeX сверстал абзац, никаких специальных усилий прилагать не нужно: достаточно оставить в исходном тексте пустую строку, указывающую TeX'у на конец абзаца. В этом разделе речь пойдет о тех " нештатных ситуациях", которые могут при этом возникнуть. Система TeX предоставляет множество способов реакции на эти ситуации; некоторые из них важны для всех пользователей, но большая часть — только для полиграфистов. Рекомендуем читателям, полиграфистами не являющимися, пропускать весь мелкий шрифт в этом разделе.Более тонкая настройка
Режимы, задаваемые командами \sloppy и \fussy, представляют собой две крайности. Здесь мы расскажем вам о более аккуратных способах управления разбиением на строки.Параметр \hfuzz. Если вы получаете слишком много сообщений о переполнениях, можно попросить TeX вообще не считать слишком длинными те строки, которые выдаются за край не очень сильно. Для этих целей предусмотрен параметр \hfuzz. Например, команда
\hfuzz=2.5pt указывает, что как overfull будут восприниматься лишь те строки, которые выступают за край более, чем на два с половиной пункта. В обычном режиме значение параметра \hfuzz равно одной десятой пункта.
Если \hfuzz равен примерно
пункта, то получается приемлемый для ординарных изданий результат. Дело в том, что на фоне идеально выровненных абзацев одна выдающаяся на
пункта строка смотрится хуже, чем длинный текст, где все абзацы выровнены не идеально, а "с точностью до
пункта".Мера разреженности строки. Как вы помните, в сообщении TeX'а о разреженной строке фигурирует такая мера разреженности строки, как "badness". Посмотрите, как выглядят на печати разреженные строки с различными значениями этой меры:

У последней из наших строк значение badness равно 10000. Если растянуть пробелы в строке еще сильнее, то badness уже не увеличится, а останется равной 10000: с точки зрения TeX'а, такие разреженные строки настолько плохи, что нет смысла делать различие между ними.
Для интересующихся объясним подробнее, как вычисляется badness. Как мы уже говорили в разд. "Промежутки между предложениями", промежутки между словами в тексте не фиксированы, а могут растягиваться или сжиматься. Каковы эти пробелы и насколько они могут растягиваться, зависит от шрифта (для примера: у основного шрифта кегля 10 обычный промежуток между словами равен примерно
пункта, а его растяжимость составляет
пункта; промежуток же между предложениями в этом шрифте равен
пункта и имеет растяжимость в
пунктов)6). Когда TeX растягивает строку с целью выравнивания, он находит сумму "пределов растяжимости" всех промежутков — это "предел растяжимости" строки — и вычисляет, насколько требуемая длина строки больше " естественной" (определяемой размерами слов и нерастянутых промежутков между словами)- это "требуемое растяжение" строки.
Отношение "требуемого растяжения" к " пределу растяжимости" строки определяет, насколько разреженной получится строка. Традиционно это отношение обозначается буквой
. Практически в качестве меры разреженности используется не само число
, а число
--- это и есть badness. Если даже окажется, что
, badness все равно будет считаться равной
: строки, для которых отношение
больше или равно
(примерно при этом значении получается
), рассматриваются TeX'ом как одинаково плохие.В том счастливом случае, когда требуемая длина строки совпадает с естественной, мера разреженности равна нулю; если мера разреженности не превосходит
, то растяжение строки не превосходило предела; на самом деле даже строки, мера разреженности которых не превосходит
, выглядят всё еще хорошо, хотя они уже и рассматриваются TeX'ом как слегка разреженные: TeX старается, чтобы такая "слегка разреженная" строка не попалась в абзаце рядом со строкой, в которой промежутки между словами сжимались. Сообщения об underfull'е появляются, когда badness превосходит 1000.Теперь мы можем объяснить точный смысл параметра \emergencystretch. Если при верстке абзаца не удалось избежать переполнения, то — при условии, что значение \emergencystretch отлично от нуля, — TeX делает еще одну попытку, при которой в процессе перебора вариантов разбиения абзаца на строки (и вычислений соответствующих значений badness) к "пределу растяжимости" каждой из строк прибавляется значение \emergencystretch.
Параметр\tolerance. Теперь в нашем распоряжении есть все необходимые понятия, чтобы объяснить, как TeX выбирает между разреженной строкой и переполнением.
При разбиении абзаца на строки TeX никогда не создает строки, мера разреженности (badness) которых больше, чем значение TeX'овского параметра, называемого \tolerance. При невозможности удовлетворить этому условию создаются строки, выходящие за край: возникает overfull. С другой стороны, если мера разреженности строки не превосходит значения \tolerance, то будет создана именно столь разреженная строка, но не overfull.
В отличие от некоторых других систем компьютерной верстки, TeX никогда не растягивает и не сжимает отдельное слово.
В стандартном режиме значение параметра \tolerance равно
. Если установить значение \tolerance равным
, т.е. максимально возможному, то может получиться так, что одна из строк абзаца окажется совершенно ужасной: TeX вложит в нее "всю разреженность", чтобы не увеличивать то число, которое TeX минимизирует при переборе различных вариантов разбиения абзаца на строки (грубо говоря, это число тем больше, чем больше разреженных строк). Поэтому разумным решением во многих случаях будет увеличить значение \tolerance, но не до максимума, а до более разумной величины (скажем, 300 или 400). После этого TeX, с одной стороны, получит большую свободу действий, а с другой — не сможет создавать абзацы, в которых все строки, кроме одной, приемлемы, а одна разрежена до безобразия.В частности, именно так работает команда \sloppy: она устанавливает \tolerance=9999, а не 10000 (так что сколь угодно разреженные строки все-таки не допускаются) и при этом задает значение \emergencystretch , равное 3em (так что при необходимости растянуть строки TeX может равномерно распределить дополнительную растяжимость по всему абзацу).
Увеличить значение \tolerance можно "глобально", во всем документе, дав в преамбуле команду наподобие
\tolerance=400 или же "локально", дав аналогичную команду внутри группы, содержащей данный абзац. В последнем случае не забывайте, что закрывающая группу фигурная скобка должна идти после пустой строки, завершающей абзац (см. выше обсуждение команд \sloppy и \raggedright ).
Как менять длину абзаца. Иногда абзац не помещается на полосу из-за того, что он на строку-другую длиннее, чем нужно, и хочется его укоротить. Команда
looseness=-1 побуждает TeX стараться, чтобы абзац занял на одну строку меньше, чем при оптимальной верстке. Если абзац короткий (скажем, занимает всего две строки), то из этого, конечно, ничего не получится.
Если же абзац достаточно длинный, то у TeX'овского алгоритма обычно хватает гибкости, чтобы достигнуть этой цели.
Можно присвоить параметру \looseness и значение
; в этом случае TeX будет стараться сделать абзац короче на две строки (если не выйдет, то хоть на одну, а если и это не выходит, то оставит все как есть). Можно также присваивать \looseness положительные значения — в этом случае TeX будет стараться делать абзацы, которые содержат больше строк, нежели оптимальные.По умолчанию значение параметра \looseness равно, естественно, нулю, и по окончании верстки каждого абзаца этот параметр также устанавливается в нуль. Тем самым нет нужды заботиться о том, чтобы значение \looseness менялось внутри группы, и бессмысленно присваивать этому параметру какое-то значение в преамбуле (оно забудется после первого же абзаца текста). Для каждого абзаца, для которого это вообще нужно, значение \looseness надо устанавливать заново.
Борьба с последней строкой.
Нехорошо, когда последняя строка абзаца слишком коротка (например, короче, чем абзацный отступ следующего абзаца). Чтобы бороться с этим, можно использовать те средства, с которыми мы уже знакомы. Если, например, последняя короткая строка представляет собой обрубок слова, завершающего абзац, то можно либо запретить переносы в этом слове, взяв его в \mbox , либо сказать перед этим словом \linebreak, либо, если это слово длинное, указать в нем место для переносов в явном виде (с помощью команды \-\,) только в начале (в надежде, что поджаться на меньшее расстояние TeX'у будет легче). Другой вариант — сказать \looseness=-1 перед пустой строкой, завершающей абзац: если TeX'у удастся сделать абзац на строку короче, то вряд ли завершающая строка разбитого по-новому абзаца будет короткой.
Разумеется, чудес не бывает: эти рецепты могут подействовать, если абзац достаточно длинен, а не состоит из пары строк.
Другой нежелательный эффект возникает, когда длина последней строки абзаца лишь чуть-чуть меньше, чем ширина полосы. В этом случае разумно довести последнюю строку до края.
В этом может помочь еще не рассматривавшийся нами параметр \parfillskip. Именно, скажите (перед завершающей абзац пустой строкой) \parfillskip=0pt, и TeX постарается растянуть последнюю строку (увеличивая промежутки между словами не только в последней строке, но, при необходимости, и в остальных). Если в результате этих действий не случится overfull'а или underfull'а, то все в порядке.
После окончания абзаца прежнее значение параметра \parfillskip не восстанавливается, так что менять его надо внутри группы.
Дополнительные тонкости с переносами. Вы можете влиять на частоту переносов в абзацах с помощью параметра \hyphenpenalty. По умолчанию его значение равно
. Если присвоить этому параметру большее значение, то переносов будет меньше. Точнее говоря, если у TeX'а будет возможность выбирать, сделать лишний перенос или же обойтись без него, растянув строку чуть больше,7) то TeX будет склоняться ко второму варианту тем чаще, чем больше значение \hyphenpenalty. Максимально возможное значение параметра \hyphenpenalty равно
. Если в момент верстки абзаца это значение именно таково, то переносы в этом абзаце вообще запрещены. Такой режим разумно, например, установить для абзацев, написанных на языке, для которого в вашей реализации TeX'а нет таблицы переносов, чтобы TeX не сделал переносов во французском тексте по английским правилам.Наряду с параметром \hyphenpenalty (отвечающим как за автоматически вставленные переносы, так и за переносы, возможные места для которых вы отметили с помощью команды \-), есть и параметр \exhyphenpenalty, отвечающий за переносы в словах с дефисом или командой \slash. Напомним, что в таких словах автоматический перенос возможен только в том месте, где дефис (или \slash) делит слово на части. Так вот, чем больше значение \exhyphenpenalty, тем с меньшей охотой TeX будет делать переносы в этих местах. Если же значение \exhyphenpenalty равно
, то такие переносы будут и вовсе запрещены.Значение двух описанных выше параметров используется TeX'ом в тот момент, когда он видит пустую строку, завершающую абзац.
Соответственно, если вы присваиваете этим параметрам новые значения внутри группы, то группа не должна завершаться до этой пустой строки. Учтите также, что если вы увеличиваете значение \hyphenpenalty и тем самым затрудняете TeX'у переносы слов, то вам может понадобиться увеличить и \tolerance или \emergencystretch, чтобы он смог побольше растягивать строки.
Полиграфические правила не допускают, чтобы в абзаце шло подряд много (скажем, более трех) строк с переносами. Бороться с таким недостатком помогает параметр \doublehyphendemerits: чем его значение больше, тем менее выгодны для TeX'а будут такие последовательности строк, и тем более настойчиво он будет их избегать при переборе вариантов разбиения абзаца на строки. По умолчанию значение этого параметра равно 10000; если переносы идут подряд, можно увеличить значение этого параметра, скажем, до миллиона (такое большое число выбрано не случайно: чтобы этот параметр оказал действие, его значение должно быть того же порядка, что и квадрат встречающихся при переборе возможных разбиений значений badness); если вы делаете это увеличение не в преамбуле документа, а в группе, то, как водится, нужно, чтобы эта группа содержала и пустую строку, завершающую абзац.
Есть также аналогичный параметр \finalhyphendemerits: чем больше его значение, тем с меньшей охотой TeX будет делать перенос в предпоследней строке абзаца. Значение этого параметра по умолчанию равно 5000.
Наконец, вот заключительная хитрость. Если вы присвоите значение
параметру \uchyph, написав\uchyph=0 то TeX никогда не будет делать переносов в словах, начинающихся с прописной буквы. Такой режим полезен, например, в том случае, если вы не хотите делать переносы в именах собственных. Чтобы снова разрешить TeX'у переносить слова, начинающиеся с прописной буквы, присвойте параметру \uchyph значение
. Борьба с переносами
Вероятно, читатель был шокирован тем, что в нашем примере с overfull'ом TeX не смог найти, где сделать перенос в слове " если". Дело, в частности, в том, что обычно TeX не делает переносов, при которых от слова отрываются две последние буквы. Это соответствует нормам английской орфографии, но для русского языка такое ограничение неуместно. Поэтому при работе с русскими текстами можно (и нужно) установить такой режим, в котором перенос двух последних букв допустим. Устанавливается этот режим с помощью изменения параметра \righthyphenmin. Значение этого параметра — целое число, равное наименьшему количеству букв в слове, которые можно переносить на следующую строку. Стало быть, если написать в файле\righthyphenmin=2 то при обработке всех абзацев, кончающихся после этой команды, переносы с отрывом двух последних букв будут разрешены. Если вам встретится абзац английского текста, то перед завершающей его пустой строкой дайте команду
\righthyphenmin=3 дабы не сделать неверных переносов в английских словах3)
Общее облегчение режима переносов с помощью \righthyphenmin может, тем не менее, не помочь преодолеть встретившийся вам overfull: не исключено, что TeX действительно не знает, как перенести какое-то слово. Таких слов не очень много, но они встречаются. Кроме того, TeX не делает автоматических переносов в словах, содержащих диакритические знаки (например, если в слове указано ударение или если буква ё задана в тексте как \"е)4), а также в словах, в которых присутствуют наряду с буквами цифры, знаки препинания (не в конце слова) и т.п. Далее, если в слове присутствует дефис, то TeX сможет сделать в нем перенос только на месте этого дефиса, но так, что "{генерал-" останется в конце строки, а "губернатор" начнет следующую строку). Что делать в таких случаях, когда автоматически вставляемых TeX'ом переносов не хватает?
Совет номер один — попробуйте немного отредактировать абзац. Обычно после небольших изменений в абзаце неприятности с переносами исчезают; качество текста при этом тоже зачастую улучшается (с точки зрения языка, а не TeX'а).
Пусть, однако, улучшать изложение дальше некуда, а абзац все равно получается неудачный. Что еще можно сделать, чтобы избавиться от переполнения?
Если TeX не может перенести слово, перенос которого по правилам русского языка возможен, то есть два способа указать TeX'у на это обстоятельство.
Во-первых, существует "одноразовый" способ указать TeX'у места переносов в слове. Это делается с помощью команды \- таким, например, образом:
тво\-р\'ог Команда \- означает, что данное слово можно переносить в тех и только тех местах, где стоят знаки \- (хотя бы и вопреки тому, что диктует TeX'овский алгоритм переноса). Она годится для любых слов (с диакритическими знаками, цифрами и т.д.). Однако при этом TeX не запоминает, какие слова и в каких местах позволила ему перенести команда \-. Если, например, то же слово "творог" встретится в тексте еще раз, места переносов придется указывать заново.
Во-вторых, если слово-исключение встречается в тексте неоднократно, имеет смысл указать это TeX'у "раз и навсегда" (в пределах данного документа). Для этого предназначена команда \hyphenation. В качестве ее аргумента указываются слово или слова, в которых дефисами обозначены разрешенные места переносов. Например:
hyphenation{вклю-чен об-ласть}" Теперь слова "включен" и "область" всегда будут переноситься так, как было указано (хотя бы и вопреки тому, что диктует алгоритм переноса). Если в слове, указанном в качестве аргумента команды \hyphenation, дефисов не поставить, то это будет означать, что переносить его вообще нельзя. Разумное место для команды \hyphenation — преамбула документа.
Слова, указанные в аргументе команды \hyphenation, должны быть разделены пробелами (конец строки — тоже пробел, так что слова можно располагать и в нескольких строках). Пустой строки в аргументе \hyphenation быть не должно. В качестве аргумента команды \hyphenation нельзя указывать слова с диакритическими знаками или небуквенными символами.
Слова в исходном тексте, в которые вставлены \-, будут переноситься именно там, где указано этими командами, невзирая на то, что говорит команда \hyphenation.
Иногда в тексте встречаются пары слов, объединенные знаком /,. По общим TeX'овским правилам такое "слово" перенесено быть не может. Если вместо символа / использовать команду \slash, то станет возможен перенос, при котором на одной строке останется первое слово и символ /, а на второй строке — второе слово:
![]() | Перенаправление ввода\slash вывода — одна из характерных черт систем типа UNIX\slash Linux. |
Буквальное воспроизведение(verbatim, verb)
Окружение verbatim предназначено для буквального воспроизведения имеющихся в файле символов (шрифтом типа пишушей машинки). Одной только команды \ttfamily для этого недостаточно, поскольку воспроизводимый текст может содержать, например, команды TeX'а, и необходимо, чтобы они печатались, а не исполнялись.Между \begin{verbatim} и \end{verbatim} могут идти любые символы (в том числе символ "\" и непарные фигурные скобки), за исключением последовательности символов \end{verbatim}. После этого надо написать \end{verbatim} в отдельной строке, ничего, кроме этого текста, не содержащей (для всех прочих LaTeX'овских окружений это не обязательно). При этом между "\end" и "{verbatim}" не должно быть пробела (также вопреки общим правилам: обычно такой пробел, как и вообще пробел после имени команды, состоящего из букв, ни на что не влияет).
Короткие последовательности символов удобно набирать для буквального воспроизведения с помощью команды \verb. Непосредственно после \verb должен стоять любой символ, не являющийся буквой или звездочкой, далее — воспроизводимый текст (укладывающийся в одну строку), не содержащий того символа, который стоял непосредственно после \verb, а затем — снова тот символ, что стоял непосредственно после \verb. После \verb не должно быть пробела. Пример:
| Команда \verb"\dots" задает многоточие. Знак~\verb|"| в TeX'е используется редко. |
У команды \verb и окружения verbatim есть варианты "со звездочкой". От своих вариантов без звездочки они отличаются тем, что пробел изображается знаком
.Команду \verb и окружение verbatim нельзя использовать в сносках; если вам необходимо напечатать в сноске что-нибудь вроде \sqrt, то придется делать это вручную, с помощью команды \symbol: \texttt{\symbol{`\\}sqrt} или \texttt{\symbol{"5C}sqrt}.
Если вы забудете "закрывающий символ" в команде \verb или сделаете опечатку в тексте \end{verbatim}, то в лучшем случае получите уйму сообщений об ошибке, а в худшем — завесите компьютер.
Если вы воспроизводите в режиме verbatim текст, простирающийся на многие страницы (например, компьютерную программу), то TeX'у может не хватить памяти. Чтобы избежать такой неприятности, надо или распределить воспроизводимый текст по нескольким окружениям verbatim, или подключить стилевой пакет verbatim, после чего можно будет спокойно задавать сколь угодно длинные окружения verbatim и verbatim* (только не забудьте про \end{verbatim} в конце). Кроме того, при подключении этого пакета становится доступной команда \verbatiminput, позволяющая дословно воспроизвести содержимое произвольного текстового файла: именно, если вы напишете '\verbatiminput{something.txt}', то это будет равносильно тому, как если бы вы написали
\begin{verbatim} (содержимое файла something.txt) \end {verbatim}
Центрирование, выравнивание текста по краю
Для этих целей используются окружения center (для центрирования), а также flushleft и flushright (для выравнивания по левому и правому краю соответственно).Внутри каждого из этих окружений можно в принципе набирать и самый обычный текст, стандартным образом разбитый на абзацы с помощью пустых строк, но при этом каждая строка получающегося "абзаца" будет центрирована (для окружения center) или выровнена по левому/правому краю (для окружений flushleft и flushright соответственно).
Окружение flushleft по своему действию практически эквивалентно команде \raggedright; но вообще, конечно, все перечисленные окружения нужны не для создания абзацев столь странного вида, а для организации текста в виде последовательности строк, каждая из которых центрирована или сдвинута влево или вправо; для этого достаточно после каждой строки, которую вы хотите центрировать (или сдвинуть к краю), поставить команду \\ ; следующая строка будет принадлежать тому же абзацу, и, стало быть, опять же будет центрирована (сдвинута). А если вы не будете делать разбиения на строки командой \\, то это будет сделано автоматически, с появлением несколько странных абзацев (на стр.25 приведен пример того, что может в этом случае получиться). Примеры:
![]() | \begin{flushleft} левый\\марш \end{flushleft} |
![]() | \begin{flushright} наше дело\\ правое |
![]() | \begin{center} а вот мы позиционируемся\\ в центристской части\\ политического спектра \end{center} |
Цитаты
Если вам нужно включить в текст цитату, пример, предупреждение и т.п., то удобно воспользоваться окружением quote. Это окружение набирает текст, отодвинутый от краев (полиграфист сказал бы: "втянутый". Пример:
![]() | Каждый сознательный гражданин должен понимать, что \begin{quote} весьма небезопасно содержать экзотических животных в городской квартире. \end{quote} Поэтому подумайте, прежде чем покупать на рынке крокодила. |
Для длинных цитат, состоящих из нескольких абзацев, можно использовать окружение quotation. Оно полностью аналогично quote, за тем исключением, что в тексте, оформленном этим окружением, делается абзацный отступ.
Дефисы, минусы и тире
При печати на пишущей машинке эти знаки по внешнему виду не различаются. В издательских системах, основанных на TeX'е, различают дефис - (по-английски hyphen), (en-dash), длинное тире — (em-dash) и знак минуса - (обратите внимание, что он отличается от обоих тире).Чтобы получить на печати дефис, короткое тире или длинное тире, надо в исходном тексте набрать один, два или три знака "-" соответственно. В русских текстах часто используют длинное тире в качестве тире как такового, а короткое тире — в сочетаниях типа "я вернусь через 2-3 часа" (в исходном тексте это выглядит как "через 2-3 часа"; обратите внимание на отсутствие пробелов вокруг тире). Длинное тире в русском тексте обычно окружают (следуя традиции) пробелами; в английском обычно пробелов не делают. См. также разд. "Экзотика" ниже по поводу альтернативы длинному тире.
Знак минуса, в отличие от короткого тире, встречается только в математических формулах, и там он, как вы помните, изображается просто знаком "-" (см. разд. "Многоточие").
Любознательный читатель может спросить, как получается, что запись жж в исходном тексте дает на печати всего-навсего две буквы "ж", а запись -- дает тире, которое шире, чем два дефиса. Ответ: TeX'овские шрифты так устроены, что некоторые последовательности подряд идущих символов заменяются на печати на новый знак
Другой пример лигатур — это то, как выглядит в основных шрифтах сочетание букв
: не так, как поставленные рядом
и
(
).Близкое к этому явление — так называемый кернинг, когда некоторые пары букв, стоящие рядом, на печати автоматически сближаются: сравните
(полученное на печати естественным образом) и
(набранное со специальной командой, убирающей кернинг).Диакритические знаки и прочее
Во многих языках используются буквы с дополнительными значками, размещающимися над или под буквой (они называются диакритическими знаками). Кроме того, в ряде языков, использующих латинский алфавит, есть специальные дополнительные буквы. В TeX'е имеются команды для набора таких букв из почти всех европейских языков. Команды для получения диакритических знаков собраны в нижеследующей таблице, где знаки проставлены, для примера, при букве e.
В следующей таблице вы найдете команды для набора букв специального вида, а также перевернутых вопросительного и восклицательного знаков (последние используются в испанском языке).

Обратите внимание на команды \i и \j в этой таблице: они нужны для того, чтобы ставить диакритические знаки над буквами i и j. Если просто сказать, допустим, \=i, то получится \=i, а это не то, что требуется. Правильно писать \=\i. Вот несколько примеров.
![]() | Ch\'erie, \c{c}a ne me pla\^\i t pas! G\"otterd\"ammerung !`Besa me mucho! |
Команды \c, \' и т.д. имеют один обязательный аргумент — букву, над (или под) которой надо ставить диакритический знак. Читатель может заметить противоречие со сказанным на : ведь обязательный аргумент должен быть заключен в фигурные скобки, а в нашей таблице в записях вроде \`e или \"e: фигурных скобок нет. На самом деле противоречия нет, просто ранее было сказано не все: если у LaTeX'овской команды предусмотрен один обязательный аргумент и в исходном тексте после имени команды непосредственно следует буква, то в качестве аргумента будет воспринята именно эта буква . Так что можно, в принципе, не ставить букву в фигурные скобки и при командах наподобие \c или \u (но психологически приятнее, когда слово, которое на печати выйдет без пробелов, не будет содержать пробелов и в исходном тексте):
![]() | La fa\c{c}ade est la fa\c cade. |
Над буквами в математических формулах также приходится ставить надстрочные знаки, но описанные в настоящем разделе команды для этого непригодны; команды, делающие это в формулах, описаны в разд. .
В заключение нашего обсуждения диакритических знаков отметим вот что. Хотя описанные в этом разделе команды дают возможность набирать все знаки алфавита почти любого европейского языка, это еще не значит, что вы так просто сможете набирать длинные тексты на этих языках. Дело в том, что при отсутствии ориентированной на соответствующий язык таблицы переносов TeX будет, скорее всего, переносить слова в этих текстах неправильно (а слова с диакритическими знаками перенести вообще не сможет — см. разд."Параграф"). Таблица переносов для русского языка в любой русификации LaTeX'а имеется, а для английского языка такая таблица присутствует в TeX'е изначально. Если же вам придется набирать хотя бы абзац текста на каком-то другом языке, а соответствующей таблицы переносов у вас нет, то лучше переключиться на режим, в котором переносы вообще запрещены (как это сделать, будет рассказано в разд. "Параграф" этой лекции). Можно также попробовать воспользоваться стилевым пакетом babel, помогающим набирать тексты с правильными переносами на разных языках. См. приложение E.
Интерлиньяж
В полиграфии этим красивым словом называется интервал между строками. Команды наподобие \small, устанавливающие размер шрифта, автоматически устанавливают и размер интервала между строками, так что вручную менять его не следует (потому мы и не рассказываем, как это делать; любопытствующий читатель может узнать некоторые подробности в приложении Е и все подробности в книге [2]). Можно, однако (и иногда это бывает необходимо), пропорционально увеличить или уменьшить все интервалы между строками — например, чтобы подогнать число полос в документе к требуемому. Если, скажем, вы хотите увеличить интервалы между строками на 1%, т. е. в
раза, то в преамбуле следует написать так:\renewcommand{\baselinestretch}{1.01} Если нужно пропорционально увеличить или уменьшить интерлиньяж в каком-то фрагменте текста, то можно написать так:
{% Открывающая фигурная скобка небходима \renewcommand{\baselinestretch}{1.01} \selectfont Текст, в котором надо изменить интерлиньяж... .... Конец этого текста }% Закрывающая скобка, парная к открывающей (если опять надо увеличить на 1%; в других случаях — соответственно). Не забудьте, что закрывающая фигурная скобка должна стоять после пустой строки, завершающей последний абзац, иначе ничего не выйдет .
Почему этот прием работает и каков смысл команды \selectfont, объясняется в приложении В.
Между абзацами можно организовать дополнительные вертикальные интервалы. Именно, в TeX'е есть параметр \parskip со значением длины; если присвоить ему ненулевое значение, например, написав
\parskip=3mm то между абзацами будет делаться отступ в 3mm (в дополнение к обычному межстрочному интервалу). Без особой необходимости не следует присваивать параметру \parskip новое значение, поскольку оно вполне разумно устанавливается в стандартных LaTeX'овских классах.
На самом деле в стандартных классах \parskip является растяжимой длиной . Именно, естественный размер \parskip равен нулю, но у него есть еще plus-компонента, равная одному пункту. Стало быть, если вертикальные интервалы на странице не варьируются, то никакого дополнительного интервала между абзацами не делается, но если страницу при верстке приходится растягивать по вертикали, то каждый из интервалов между абзацами может быть растянут. При желании можно изменить как естественный размер, так и растяжимую компоненту параметра \parskip с помощью команды \setlength, о которой пойдет речь в разд. "Параметры со значением длины" лекции 7.
Экзотика
В поставку LaTeX'а входит стилевой пакет textcomp, открывающий доступ к большому числу типографских значков. Если его подключить (для чего надо сказать в преамбуле \usepackage{textcomp}), то становятся доступными следующие символы:![]() | \textquotestraightbase | ![]() | \textquotestraightdblbase |
![]() | \texttwelveudash | ![]() | \textthreequartersemdash |
![]() | \textleftarrow | ![]() | \textrightarrow |
![]() | \textblank | ![]() | \textquotesingle |
![]() | \textasteriskcentered | ![]() | \textdblhyphen |
![]() | \textfractionsolidus | ![]() | \textzerooldstyle |
![]() | \textoneoldstyle | ![]() | \texttwooldstyle |
![]() | \textthreeoldstyle | ![]() | \textfouroldstyle |
![]() | \textfiveoldstyle | ![]() | \textsixoldstyle |
![]() | \textsevenoldstyle | ![]() | \texteightoldstyle |
![]() | \textnineoldstyle | ![]() | \textlangle |
![]() | \textminus | ![]() | \textrangle |
![]() | \textmho | ![]() | \textbigcircle |
![]() | \textohm | ![]() | \textlbrackdbl |
![]() | \textrbrackdbl | ![]() | \textuparrow |
![]() | \textdownarrow | ![]() | \textasciigrave |
![]() | \textborn | ![]() | \textmarried |
![]() | \textdivorced | ![]() | \textdied |
![]() | \textleaf | ![]() | \textmusicalnote |
![]() | \texttildelow | ![]() | \textdblhyphenchar |
![]() | \textasciibreve | ![]() | \textasciicaron |
![]() | \textgravedbl | ![]() | \textacutedbl |
![]() | \textdagger | ![]() | \textdaggerdbl |
![]() | \textperthousand | ![]() | \textpertenthousand |
![]() | \textbardbl | ![]() | \textbullet |
![]() | \textcelsius | ![]() | \textcolonmonetary |
![]() | \textdollar | ![]() | \textdollaroldstyle |
![]() | \textcent | ![]() | \textcentoldstyle |
![]() | \textflorin | ![]() | \textwon |
![]() | \textnaira | ![]() | \textguarani |
![]() | \textpeso | ![]() | \textlira |
![]() | \textdong | ![]() | \textbaht |
![]() | \textsterling | ![]() | \textyen |
![]() | \textrecipe | ![]() | \textinterrobang |
![]() | \textinterrobangdown | ![]() | \texttrademark |
![]() | \textpilcrow | ![]() | \textnumero |
![]() | \textdiscount | ![]() | \textestimated |
![]() | \textopenbullet | ![]() | \textservicemark |
![]() | \textlquill | ![]() | \textrquill |
![]() | \textbrokenbar | ![]() | \textsection |
![]() | \textasciidieresis | ![]() | \textcopyright |
![]() | \textordfeminine | ![]() | \textcopyleft |
![]() | \textlnot | ![]() | \textcircledP |
![]() | \textregistered | ![]() | \textdegree |
![]() | \textpm | ![]() | \texttwosuperior |
![]() | \textthreesuperior | ![]() | \textasciiacute |
![]() | \textmu | ![]() | \textparagraph |
![]() | \textperiodcentered | ![]() | \textreferencemark |
![]() | \textonesuperior | ![]() | \textonehalf |
![]() | \textthreequarters | ![]() | \texttimes |
![]() | \textdiv | ![]() | \textsurd |
![]() | \textordmasculine | ![]() | \textonequarter |
![]() | \texteuro | ![]() | \textcurrency |
![]() | \textasciimacron |
вместо \textasteriskcentered; если набрать просто *, то звездочка напечатается в верхней части строки, а не в ее середине), но многие другие являются для нас новыми (кстати, команды, включающие в свое имя florin, won и т.п., суть обозначения для различных валют). Хотя в этой таблице и есть символ для " евро" (\texteuro), но его изображение довольно далеко от принятого; соответствующие шрифты и способы их подключения к LaTeX'у есть, но они пока не стандартизированы.Полезно обратить внимание на команду \textthreequartersemdash: тире, задаваемое ей, может оказаться более приемлемым в русских текстах, чем "длинное тире", задаваемое как |---|.
Если какая-то из команд, перечисленных в этой таблице, встречается в вашем тексте часто, разумно определить для нее более короткое обозначение; в начале лекции 7 объясняется, как это сделать.
Кавычки
В отличие от пишущей машинки, книжный набор использует различные знаки для открывающей и закрывающей кавычек (вместо нейтрального знака "). В английских текстах открывающая кавычка изображается во входном тексте двумя подряд идущими обратными апострофами, закрывающая — двумя апострофами.The "definitions" are translations rather than explanations. Образование знака кавычек из двух апострофов — еще один пример лигатуры.
В русских текстах употребляются кавычки типа «елочки» и „лапки“. В исходном комплекте TeX'овских шрифтов эти символы отсутствовали; при установке системы LaTeX вы должны выяснить, как именно они задаются в полученной вами русификации.
Если в тексте встречаются кавычки внутри кавычек, то, согласно типографским правилам, внутренние кавычки должны отличаться от внешних: в английских текстах снаружи ставятся двойные кавычки, задаваемые как "``" и "''", а внутри одинарные, задаваемые как "`" и "'"; в русских текстах можно, например, снаружи поставить «елочки », а внутри „лапки“. Если при этом наружная и внутренняя кавычка соседствуют, их надлежит разделить дополнительным небольшим пробелом. В LaTeX'е этой цели служит команда \. Пример (в русификации LaTeX'а, использованной при наборе этой книги, «елочки » задаются командами (с именами из русских букв!) \лк и пк, а „лапки“ лап командами \glqq и \grqq:
![]() | \лк\,\glqq Карова\grqq{} или \glqq корова\grqq, как правильно?\пк~--- спросил он. |
Команда \sloppy и параметр \emergencystretch
Существует простой и грубый способ раз и навсегда избавиться от переполнений. Для этого достаточно включить в преамбулу файла команду \sloppy — больше сообщений о слишком длинных строках вы, скорее всего, не увидите. Для черновых распечаток команды \sloppy, помещенной в преамбулу, чаще всего бывает достаточно. При изготовлении оригинал-макета, однако же, доверяться ей полностью было бы рискованно, так как иногда в этом режиме могут появиться недопустимо разреженные строки. Разумнее задать эту команду не в преамбуле, а перед концом того абзаца, в котором произошел overfull (см. ниже по поводу того, как это сделать), и посмотреть, что из этого получится.Чтобы отменить действие команды \sloppy, надо либо вернуться в обычный режим с помощью команды \fussy, либо давать команду \sloppy внутри группы, с тем, чтобы этот режим кончился по выходе из группы. В любом случае необходимо понимать, на какие участки текста распространяется действие команд типа \sloppy, влияющих на вид абзаца. Правило таково:
режим верстки абзаца определяется в тот момент, когда TeX читает пустую строку, завершающую абзац. В частности, если вы решили дать команду \sloppy внутри группы, то для того чтобы она подействовала на абзац, необходимо, чтобы закрывающая фигурная скобка шла после пустой строки, завершающей абзац. Вот пример того, как надо действовать в таких случаях:
Черепаховый суп — изысканное деликатесное и диетическое блюдо {\sloppy } А вот — типичная ошибка начинающего:
{\sloppy Черепаховый суп — изысканное деликатесное и диетическое блюдо} К моменту, когда TeX увидел пустую строку, группа завершилась, поэтому TeX получил команду " разбить абзац на строки", находясь в стандартном режиме, и вместо желаемых разреженных, но не выходящих за край строк произошло переполнение (в первой строке).
Для более тонкого управления выбором между разреженными строками и overfull'ами используется параметр со значеним длины \emergencystretch. Его точный смысл мы объясним ниже, а для начала скажем, что если установить его значение равным примерно 20-30 пунктам, т.е. написать, например,
\emergencystretch=25pt
то в случае, когда без переполнений сверстать абзац не удается, TeX попробует сделать все строки абзаца более разреженными (тем более разреженными, чем больше величина этого параметра). Точную величину \emergencystretch надо подбирать экспериментально.
Линейки в простейшем виде
Один из часто встречающихся элементов полиграфического оформления — так называемые "линейки". Например, в книге, которую вы читаете, колонтитулы отделены линейкой от основной части страницы. В TeX'е линейкой (rule по-английски) называется любой черный прямоугольник. Для создания линеек в LaTeX'е используется команда \rule. У этой команды два обязательных аргумента: первый задает ширину прямоугольника-линейки, второй — высоту (оба этих размера должны быть заданы в используемых TeX'ом единицах измерения). Линейка, созданная командой \rule, рассматривается TeX'ом так же, как буква.Если необходимо, чтобы созданный командой \rule прямоугольник был сдвинут по вертикали относительно уровня строки, надо воспользоваться командой \rule с необязательным аргументом. Этот аргумент — расстояние, на которое надо сдвинуть линейку по вертикали, — ставится перед обязательными; если расстояние положительное, то сдвиг идет вверх, если отрицательное, то вниз. Пример:
![]() | В этом месте, прямо посреди абзаца, будет линейка \rule{.5em}{15pt}, а после нее продолжится обычный текст. Сравните также \rule{5pt}{5pt} и \rule[-3pt]{5pt}{5pt} |
Между абзацами
В предыдущих разделах мы обсуждали, что происходит с документом "на уровне строки". Теперь изменим масштаб наших рассмотрений: будем смотреть не только на строки и абзацы, но и на то, как они расположены на странице.Многоточие
На пишущей машинке многоточие — это три точки подряд (каждая из которых имеет стандартную ширину буквы). При наборе это не так: для многоточия есть специальная команда \ldots или \dots.
![]() | Вместо ``...'' пишем: Нет, что-то здесь не так \ldots |
При подключении стилевого пакета amsmath (а это приходится делать очень часто) могут появиться нежелательные пробелы около многоточий, задаваемых команды \dots и \ldots. Случится это или нет, зависит от версии пакета amsmath, но самый простой способ справиться с этой проблемой, если это произошло — употреблять в тексте (но не в формулах!) вместо \dots или \ldots команду \textellipsis, никаких лишних пробелов не создающую.
Набор в две колонки
Если вам необходимо набирать в две колонки весь документ, то это надо сделать, указав в команде \documentclass соответствующую " классовую опцию". Если же в две колонки надо набрать не весь текст, а только его часть, к вашим услугам команда \twocolumn. Действует она так: сначала выполняется команда \clearpage, а затем с новой страницы, созданной этой командой, начинается набор в две колонки.Если вы хотите, чтобы колонки на печати были разделены вертикальной линейкой, присвойте ненулевое значение параметру под названием \columnseprule (его значение равно ширине линейки). По умолчанию значение этого параметра равно 0pt, так что линейка не печатается; хорошая линейка получается при значении 0.4pt.
К сожалению, на последней странице двухколонного набора высоты колонок не выравниваются; см. ниже по поводу того, что можно с этим сделать.
Иногда бывает необходимо в начале новой страницы поместить один или несколько абзацев текста во всю ширину страницы, а оставшийся текст на этой странице набрать в две колонки. Для этих целей можно использовать команду \twocolumn с необязательным аргументом. Необязательный аргумент (в квадратных скобках, как водится) — это тот текст, который будет напечатан во всю ширину страницы; если он состоит из нескольких абзацев, то абзацы, как обычно, разделяются пустыми строками.
Команда \onecolumn осуществляет переход от двухколонного набора к одноколонному (предварительно она опять-таки выполняет команду \clearpage).
Если вам хочется, чтобы колонки на последней странице были одинаковой высоты, чтобы можно было начинать двухколонный набор не только с новой страницы, а также если вам нужны не две колонки, а три или больше, можно подключить стилевой пакет multicol. В этом случае к вашим услугам окажется окружение multicols.
Единственный обязательный аргумент окружения multicols — целое число, равное числу колонок. Если, скажем, вам нужно, начиная с какого-то места, начать набор в три колонки, скажите
\begin{multicols}{3} Текст \end{multicols} Набор в три колоноки начнется с того места на странице, куда попало \begin{multicols}, колонки на последней странице трехколонного набора будут выровнены по высоте. Присвоив ненулевое значение параметру \columnseprule, можно разделить колонки линейками.
Неразрывный пробел
Иногда необходимо обеспечить, чтобы два соседних слова не попали на разные строки. В этом случае между ними надо вставить " символ неразрывного пробела" "~". Такая необходимость возникает, например, в сочетаниях типа "на с.5": нельзя отрывать номер страницы от сокращения "с.". Вот еще примеры:
![]() | Число овец в стаде обозначено буквой~$x$. Да здравствует император Франц-Иосиф~I! Муж и жена~--- одна сатана. С~кем вы, мастера культуры? |
Невидимые линейки
Высота и/или ширина линейки может быть и нулевой. Линейки нулевой высоты или ширины не печатаются, но тем не менее могут оказать влияние на вид текста. Например, линейка нулевой ширины и ненулевой высоты занимает место по вертикали; если ее высота больше высоты букв в строке, то высота строки, содержащей эту невидимую линейку, увеличится:
Для того, чтобы раздвинуть две строки, можно в одну из них поместить невидимую линейку\rule{0pt}{5mm} нулевой ширины и ненулевой высоты. Один частный случай линейки нулевой ширины настолько важен, что в TeX'е и LaTeX'е для такой линейки предусмотрена специальная команда \strut. Невидимая линейка, создаваемая этой командой, имеет нулевую ширину; высота же ее установлена автором LaTeX'а с таким расчетом, чтобы она была чуть выше максимальной высоты букв текущего шрифта и опускалась ниже уровня строки настолько, насколько могут опускаться буквы текущего шрифта. Например, в прямом светлом шрифте кегля 11 команда \strut создает линейку ширины 0, поднимающуюся над уровнем строки на 9.52pt и опускающуюся ниже уровня строки на 4.08 pt.
Линейки нулевой ширины и ненулевой высоты действуют подобно команде \vspace*. Смысл невидимых линеек в том, что они позволяют создать вертикальные или горизонтальные пробелы в таких ситуациях, когда \vspace или \hspace не помогают. Вот пример ситуации, когда возникает нужда в невидимых линейках. Пусть в нашем тексте мы

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

\underline{три\strut} \underline{\strut слова} \underline{подряд\strut} Как видите, \strut можно ставить хоть после слова, хоть перед ним (и даже посередине, если вы не запутаетесь с пробелами).
Назначение этой команды в данном случае сводится к тому, чтобы не позволить линейке, подчеркивающей слово, подойти к этому слову слишком близко. Кстати, в переводе с английского слово strut- означает " распорка".
В лекции 2 рассказывалось про команду \mathstrut, выполняющую аналогичные функции в математических формулах.
Другие примеры использования невидимых линеек читатель найдет в лекции 4, посвященной набору таблиц; в лекции 8, посвященной " блокам", мы также встретимся с линейками.
![]() |
![]() |
![]() |
2) Если не предпринимать для этого специальных усилий.
3) Сказанное в этом абзаце относится к вариантам русификации, где русские и английские слова включены в общую таблицу переносов (такова, например, русификация, использованная при подготовке этой книги и описанная в приложении babel. В других случаях могут потребоваться явные команды переключения языков (которые могут также заодно менять \righthyphenmin).
4) Если вы пользуетесь пакетомbabel вместе с так называемыми EC-шрифтами и соответствующими "форматными файлами", то слова с диакритическими знаками иногда могут переноситься.
5) При печати книг оригинал-макет часто уменьшают; в этом случае, естественно, пропорционально изменяются и промежутки. Вот для сравнения промежуток, который в оригинал-макете имел размер в один сантиметр:\vrule\hspace*{1cm}\vrule
6) Кроме того, промежутки могут и сжиматься; пока речь идет только о жидких строках, это несущественно.
7) Не превышая значения \tolerance, разумеется!
8) Вроде этой.
9) Вот эта.
10) Свойства которого мало похожи на свойства настоящего клея. См. лекцию 8

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

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

При этом выдается на экран и записывается в файл с расширением log сообщение наподобие такого:
Overfull \hbox (3.2673pt too wide) in paragraph at lines 8--13 []\OT1/cmr/m/n/10.95 Еще од-но пра-ви-ло от-но-си-тель-но уве-ли-че-ния про-бе-лов: если [] Давайте разберем, что в нем написано. Сначала идет надпись "Overfull\hbox", указывающая, что произошло " переполнение" (overfull) строки. В скобках указано, на какое именно расстояние строка выходит за край: на
пункта. (Напомним, что пункт примерно равен одной трети миллиметра). Далее сказано, что переполнение произошло при верстке абзаца (слова "in paragraph"), а затем указаны номера строк исходного файла, в которых был записан этот абзац.Наконец, в этом сообщении приведен фрагмент неудачной строки вблизи ее конца (конца не в исходном тексте, а на печати){Загадочный набор символов, предшествующий фрагменту строки, характеризует текущий шрифт;}. Обратите внимание, что в некоторые слова вставлены дефисы: они показывают те места, в которых TeX в принципе мог бы сделать переносы. Если вглядеться повнимательнее, то станет ясна и причина катастрофы: в слове "если", которым заканчивается строка, дефиса не стоит вообще; значит, программа не смогла найти подходящего места для переноса и оказалась перед неприятным выбором: либо перенести это "если" целиком на другую строку (что, видимо, вызвало бы проблемы в других местах), либо оставить его на этой строке и создать overfull. Выбрано было второе (ниже мы объясним, как можно в какой-то мере управлять этим выбором).
Сообщения о разреженных строках выглядят так:
Underfull \hbox (badness 1142) in paragraph at lines 885--892 []\OT1/cmr/m/n/10.95 Некоторым со-че-та-ни-ям атри-бу-тов ни-ка-ко-го ре-аль-но-го шриф-та [] Главных элементов в этих сообщениях три:
Параграф, копирайт и прочее
Знак параграфа набирается с помощью команды \S, знак
— с помощью команды \copyright; о том, что знаки $ и & набираются с помощью команд \$ и \&, мы уже говорили (см. лекцию 1); знак фунта стерлингов
набирается с помощью команды \pounds или ее синонима \textsterling. Чтобы получить на печати знак
, можно подключить стилевой пакет textcomp (см. разд."Экзотика" ниже), после чего этот знак можно будет набирать с помощью команды \textnumero. (Заодно подключение этого пакета может несколько улучшить вид знака параграфа.) Кроме того, в тексте можно использовать и любой из великого множества математических символов, если оформить его как математическую формулу:
![]() | Я $\heartsuit$ TeX. |
Перечни
Для печати перечней используются окружения itemize (для простейших перечней), enumerate (для нумерованных перечней) и description (для перечней, в которых каждый пункт имеет заголовок — например, словарных статей или иных описаний). В любом случае элементы перечня вводятся командой \item (иногда — с необязательным аргументом). Разберем последовательно, как работают указанные окружения.Простейшие перечни (itemize). Каждый элемент перечня вводится командой \item без аргумента.
\begin{itemize} \item На печати каждый... \item Перечни могут быть вложенными друг в друга: \begin{itemize} \item максимальная глубина вложенности равна 4 \item тступы и символы перед элементами выбираются автоматически. \end{itemize} \item На втором уровне элементы... \item При попытке вложить... \end{itemize} Внутри окружения itemize до первой команды \item не должно идти никакого текста или же команд, генерирующих текст. Если вы попытаетесь проигнорировать этот запрет, то LaTeX выдаст вам сообщение об ошибке. Другие команды (например, команды смены шрифта) могут идти и до первого \item.
Окружение itemize можно использовать также для создания перечней, в которых каждый элемент имеет короткий заголовок. Для создания такого заголовка надо задать команде \item необязательный аргумент (в квадратных скобках, как водится). При наличии у этой команды необязательного аргумента стандартный значок, отмечающий элемент перечня (" горошина", звездочка и т.п.) не печатается, а вместо него печатается текст, заданный в необязательном аргументе:
![]() | \begin{itemize} \itemЭтот элемент перечня помечен стандартно. \item[\sffamily A] Здесь мы сами задали заголовок. \item[999] Здесь тоже. \end{itemize} |
p> Обратите внимание, что заголовки, заданные нами в необязательных аргументах команд \item, печатаются выровненными по правому краю, а также что команды смены шрифта в этих аргументах не распространяются на дальнейший текст.
Если заголовок, заданный вами в необязательном аргументе команды \item, будет слишком длинен, то он заедет на левое поле. В таких случаях лучше пользоваться окружением description, о котором речь пойдет ниже.
Если первый отличный от пробела символ после команды \item является открывающей квадратной скобкой, то LaTeX решит, что эта скобка начинает необязательный аргумент команды \item. Если при этом вы использовали эту скобку просто как типографский знак, то в результате получится сообщение об ошибке. Чтобы избежать такой неприятности, надо в этом случае квадратную скобку "спрятать", заключив ее в фигурные скобки:
\item {[} - редко встречающийся знак... Нумерованные перечни (enumerate). В таких перечнях каждый элемент также вводится командой \item без аргумента, но на печати он будет отмечен не значком, а номером (эти номера создаются LaTeX'ом автоматически; если вы переставите какие-то элементы перечня, что-то добавите или удалите, нумерация автоматически изменится).

В исходном тексте это выглядело так:
\begin{enumerate} \item В окружении \texttt{enumerate}... \item Нумерация производится автоматически. \item Перечни могут быть вложенными друг в друга: \begin{enumerate} \item максимальная глубина вложенности равна 4; \item отступы и обозначения для элементов... \end{enumerate} \item На втором уровне элементы обозначаются... \item При попытке вложить пять таких окружений... \end{enumerate} Внутри окружения enumerate до первой команды \item не должно идти никакого текста или же команд, генерирующих текст.
На номера элементов нумерованного перечня можно организовать автоматические ссылки с помощью команды \ref. Делается это так.
Представим себе, что вам нужно сослаться на какой-то пункт нумерованного перечня (например, чтобы написать "Согласно пункту 3 настоящих Правил ...").
Если вы в ходе работы над текстом переставите какие-то пункты или добавите новые, то номер пункта может измениться. Вместо того чтобы каждый раз отсчитывать, которым по счету идет этот пункт, можно пометить элемент перечня с помощью команды \label . Команду \label лучше ставить сразу после команды \item, вводящей помечаемый элемент перечня. но можно поставить ее и позже — до следующего \item.
Ссылка на метку производится с помощью команды \ref. У нее также один обязательный аргумент — та самая метка, на которую вы хотите сослаться (ссылка на страницу, на которой расположена метка, производится, как обычно, с помощью команды \pageref. Пример:
![]() | \begin{enumerate} \item Переходите улицу только на зеленый свет. \item \label{tram} Стоящий трамвай обходить можно, а автобус — нет. \end {enumerate} Согласно правилу ~\ref{tram}, сформулированному на с.~\pageref{tram}, обходить стоящий автобус нельзя. |
В окружении enumerate команда \item может иметь необязательный аргумент, который работает так же, как в окружении itemize. Если первый отличный от пробела символ после \item является открывающей квадратной скобкой, необходимо взять эту квадратную скобку в фигурные скобки (как и в случае с окружением itemize).
Перечни с заголовками (description). В этих перечнях каждый элемент, как уже было сказано, снабжен заголовком. Поэтому элементы перечня вводятся командой \item с необязательным аргументом (заключенным, стало быть, в квадратные скобки), представляющим собой этот заголовок. Пример:
![]() | Летом можно собирать различные ягоды: \begin{description} \item[черника:] темно-синие, очень вкусные, хороши в свежем виде, варенье тоже получается хорошее; \item[голубика:] синие, более водянистые, чем черника, и не такие вкусные; \item[брусника:] ярко-красные, из них получается очень вкусное варенье. \end{description} |
Если вас не устраивает этот шрифт, можно аргумент команды \item начать с команды переключения шрифта, скажем, \normalfont или \slshape.
Внутри окружения description до первой команды \item не должно идти никакого текста или же команд, генерирующих текст.
Если в заголовке элемента перечня присутствует закрывающая квадратная скобка, то LaTeX решит, что именно на ней заканчивается необязательный аргумент команды \item, в результате чего на печати получится совсем не то, что вы хотели. Чтобы избежать этой неприятности, надо эту квадратную скобку (либо, что еще проще, весь заголовок) заключить дополнительно в фигурные скобки (внутри квадратных).
Другие виды перечней. Если вас не устраивает стандартное оформление перечней (например, вид пометок, которыми отмечаются элементы перечня itemize), его несложно изменить. Как это сделать, будет рассказано в разд."Модификация разделов перечней" лекции 7. Несколько труднее, к сожалению, сделать так, чтобы буквы, которыми нумеруются элементы нумерованного перечня, были русскими, а не латинскими, как в примерах в этой книге (в лекции 9 мы расскажем, как этого добиться). Можно менять оформление перечней и более серьезным образом, создавая перечни иного типа, чем рассмотренные выше. На данный момент наш TeX-нический уровень не столь высок, чтобы можно было освоить эти возможности LaTeX'а, но в лекции 9 будет рассказано и об этом.
Подавление абзацного отступа
Иногда возникает необходимость создать абзац, в котором нет абзацного отступа. Для этой цели удобно воспользоваться командой \noindent. В том абзаце, отступ в котором вы хотите подавить, эта команда должна идти первой (до любого текста):
![]() | \noindent В этом абзаце отступа не будет.\par В этом абзаце отступ будет \noindent присутствовать. |
В большинстве случаев, когда разумно сделать абзац без отступа, LaTeX заботится об этом сам, так что вам не придется пользоваться командой \noindent чересчур часто.
Пользуясь понятием режима, можно сказать так: в вертикальном режиме команда \noindent означает "начать новый абзац без абзацного отступа", а в горизонтальном (и математическом, коль на то пошло) режиме она означает "ничего не делать".
Подчеркивания, рамки
Чтобы подчеркнуть текст, используется команда \underline. У нее один обязательный аргумент — подчеркиваемый текст:
![]() | Это слово будет \underline{подчеркнуто}. |
Чтобы взять часть текста в рамку, используется команда \fbox:
![]() | Два слова будут \fbox{в рамке.} |
При использовании подчеркивания и рамок могут пригодиться невидимые линейки, описанные в разд. "Линейки".
Подробности о шрифтах
Каждый из доступных в LaTeX'е текстовых шрифтов характеризуется следующими четырьмя атрибутами: семейством (family), насыщенностью (series), начертанием (shape) и размером (size)1) Что такое размер, читатель разберется самостоятельно, а смысл остальных атрибутов следующий:Каждый из шрифтовых атрибутов можно менять независимо от остальных. Разберем, какие команды для этого предусмотрены.
Все команды для изменения размера вам уже известны: это десять команд, от \tiny до \Huge, перечисленных в предыдущем разделе. Каждая из команд для изменения остальных атрибутов существует в LaTeX'е в двух вариантах:
Ниже перечислены все команды для смены атрибутов в обоих вариантах.

Обратите внимание, что в трех строках этой таблицы шрифт совпадает с основным шрифтом текста: это строки, в которых стоят команды, устанавливающие семейство "с засечками", среднюю насыщенность или прямое начертание. Поскольку текущий шрифт и так обладает этими атрибутами, от соответствующей команды он не меняется.
Вот пример применения этих команд:
![]() | Сменим сначала \slshape начертание, затем \ttfamily семейство, затем \small размер, затем \bfseries насыщенность, затем \upshape\mdseries \rmfamily\normalsize все вернем на место. |
А вот пример, когда для смены атрибутов шрифта используются команды с аргументом:
![]() | Выберем \textbf{полужирный шрифт в \textit{курсивном} начертании} (временно, конечно же). |
После многочисленных изменений атрибутов шрифта хочется вернуться к обычному шрифту "одним махом", не устанавливая заново все четыре атрибута. Для этих целей предусмотрена команда \normalfont, переключающая шрифт на " нормальный" — основной шрифт документа. Наряду с ней есть, как водится, и команда с одним аргументом \textnormal, печатающая текст, являющийся ее аргументом, основным шрифтом.
В стандартных TeX'овских шрифтах (гарнитура Computer modern и ее русские аналоги) жирный шрифт, задаваемый командами \bfseries, \textbf и т.п., выглядит, по мнению многих, довольно неудачно.
Можно сделать его несколько более приемлемым, если написать в преамбуле такую строку:\renewcommand{bfdefault}{b}.
Если по какой-либо причине вы используете команды изменения атрибутов без аргумента, следует иметь в виду одну тонкость. При соседстве слова, набранного шрифтом с наклоном (курсивным в частности) и слова, набранного прямым шрифтом, последняя буква " наклонного" и первая буква "прямого" слова могут слишком сблизиться, что на печати выглядит некрасиво. Чтобы избежать этого явления, необходимо после последней буквы слова, которое будет набрано наклонным шрифтом, поставить команду \/ ; она создаст после буквы небольшой дополнительный пробел (зависящий от шрифта и от буквы), который скомпенсирует наклон и предотвратит нежелательное сближение со следующей буквой:
![]() | You {\itshape and} I\\ You {\itshape and \/} I |
Если фрагмент текста, имеющий наклон, завершается точкой или запятой, то после них ставить \/ не нужно: требуемый эффект достигается за счет места, занимаемого в тексте этим знаком.
Всё это, повторим, относится лишь к командам изменения атрибутов без аргумента; команды \textit, \textsl и \emph вносят нужную поправку автоматически.
Если команда \/ поставлена между двумя символами, дающими на печати лигатуру, то вместо лигатуры на печати получатся два этих символа по отдельности; если эту команду поставить в слове между двумя символами, между которыми в текущем шрифте предусмотрен кернинг, то кернинг между этими символами будет отключен.
Понятие о режимах TeX'а
Несколько упрощая ситуацию, можно сказать, что в процессе обработки исходного текста TeX в каждый момент находится в одном из трех режимов: горизонтальном, вертикальном или математическом.В качестве команды "закончить абзац" можно использовать, наряду с известной вам пустой строкой, команду \par:
![]() | Это — абзац, который мы не намерены завершать пустой строкой, как раньше.\par А это другой абзац. |
Идущие подряд несколько команд \par, команда \par, за или перед которой следует пустая строка, и т.п. — все это равносильно одной пустой строке или одной команде \par (точно так же, как несколько пустых строк равносильны одной); дополнительный промежуток между абзацами вы таким образом не создадите. В разд. "Вертикальные промежутки" рассказывается, как получить на печати дополнительные вертикальные промежутки.
Сказанное в предыдущем абзаце можно с помощью понятия режима сформулировать так: в вертикальном режиме команда \par ничего не делает.
Промежутки между предложениями
В обычном режиме TeX выравнивает справа строки абзаца, при необходимости делая переносы и слегка растягивая или сжимая промежутки между словами. Промежутки между предложениями при этом сами по себе шире и являются более растяжимыми, чем между словами внутри предложения. Посмотрите внимательно на следующий пример (из "Винни-Пуха"; для наглядности все промежутки равномерно растянуты):North Pole. Discovered by Pooh. Pooh found it. Такая печать соответствует английским типографским правилам, но в русских текстах промежутки между словами и между предложениями отличаться не должны. Чтобы так и было, следует включить в преамбулу команду \frenchspacing.
Если среди русского текста встречается фрагмент, написанный по-английски, то можно командой \nonfrenchspacing восстановить действие английского правила относительно межсловных промежутков. Когда английский текст кончится, надо восстановить действие российского правила командой \frenchspacing (другой вариант: заключить английский фрагмент вместе с командой \nonfrenchspacing в группу — по выходе из группы действие команды \nonfrenchspacing забудется).
Для читателей, которым необходимо набирать английские тексты, объясним более подробно правила расстановки промежутков в тех случаях, когда команда \frenchspacing не дается.
Чтобы отличить промежутки между словами от промежутков между предложениями, TeX применяет следующие правила:
Как это и бывает обычно с "машинными эвристиками", сформулированные правила иногда приводят к неверным результатам: точка после строчной буквы может встретиться и в середине предложения, например, в сокращении, а точка после прописной буквы может, напротив, попасть в конец предложения. В этих случаях надо следующим образом помочь TeX'у сделать правильные пробелы:
![]() | If $n$ is even (resp.\ odd), then $(-1)^n$ equals one (resp.\ minus one). This research was supported by the NSF\@. The author is grateful to Prof.~Smith. |
Простые средства
Обычно шрифт, отличный от используемого в основной части текста, применяется для выделения каких-то частей этого текста. Например, шрифтом выделяют заголовки разделов; по этому поводу вам беспокоиться незачем, поскольку для таких выделений LaTeX выбирает шрифт автоматически (если, разумеется, вы оформляете разделы текста с помощью команд, описываемых в следующей лекции, а не пытаетесь сделать это вручную).Но может потребоваться выделить шрифтом не заголовок, который LaTeX делает сам, а какую-то выбранную вами часть текста — скажем, слово, на которое вы хотите обратить внимание читателя. Например, так выделено слово меньше в нашем предупреждении (и в этой фразе). Для этого использована команда \emph, аргументом которой служит выделяемое слово:
Например, так выделено слово \emph{меньше} в... Выделяемое слово набирается курсивом, если текущий шрифт прямой, и прямым шрифтом, если текущий шрифт наклонный. Это полезно, так как в некоторых ситуациях (в заголовках, колонтитулах, в текстах " теорем" и т.п.), LaTeX выбирает шрифт за вас, и потому рекомендуется для выделения текста использовать в первую очередь именно эту команду.
Но можно указать шрифт и явно. Команда \textit набирает свой аргумент курсивом, так что в обычном тексте \textit{слово} неотличимо от \emph{слово}. Команда \textsl набирает свой аргумент наклонным шрифтом (обратите внимание на разницу между этим шрифтом и курсивом); команда \textbf — полужирным шрифтом. Есть еще команда \texttt, которая набирает свой аргумент шрифтом "типа пишушей машинки". В этом шрифте все буквы имеют одинаковую ширину (как часто бывает на экране компьютера), и потому его часто используют для изображения программ, команд и сообщений операционной системы и т.п. В этой книге такой шрифт используется в примерах TeX'овских исходных текстов. Чтобы получить шрифт без засечек, надо воспользоваться командой \textsf. Шрифт "капитель", в котором строчные буквы представляют собой уменьшенные прописные}, можно получить с помощью команды \textsc.
Эти два шрифта обычно используются не для выделений в тексте, а для заголовков, подписей к рисункам и таблицам и др.
Вот, пожалуй, и все употребительные команды переключения шрифтов. Еще есть команда \textup, которая набирает свой аргумент прямым шрифтом (внутри наклонного или курсивного текста); часто ее применяют, чтобы набрать знаки препинания (скобки и др.) прямым шрифтом:
![]() | \textit{Рядом с $f(x)$ \textup{(}значением функции $f$ в точке $x$\textup{)} лучше использовать прямые скобки (а не курсивные)}. |
Когда одно из {\scriptsize слов} набрано шрифтом другого кегля, это выглядит плохо.

Реальный размер шрифтов, задаваемых командами \large, \small и т.п., зависит от класса документа и классовых опций . В стандартных классах с основным шрифтом кегля 12 команды \huge и \Huge задают один и тот же размер (кегль 25).
Обратите внимание, что команды изменения размера текстового шрифта меняют и размер букв в формулах. Меняется и расстояние между строками по вертикали, если только не сделать одной распространенной ошибки. Если вы набрали шрифтом измененного размера (скажем, \small или \footnotesize) целый абзац, то в момент, когда TeX видит пустую строку (или команду \par —, этот шрифт не должен быть еще переключен на обычный, иначе интервалы между строками получатся неправильные. Вот пример того, как надо и как не надо делать:
![]() | {\footnotesize Мы закрываем группу и возвращаемся к обычному шрифту только после пустой строки, завершающей абзац. } Вот шрифт обычного размера. |
![]() | {\footnotesize Здесь мы вернулись к обычному шрифту раньше времени, и межстрочные интервалы оказались слишком велики. } Вот шрифт обычного размера. |
Ручное управление разрывами строк
Иногда возникает необходимость повлиять на то, в каком месте TeX начинает новую строку. Для этой цели есть соответствующие команды, с одной из которых мы уже встречались — это "неразрывный пробел", запрещающий разрыв строки между двумя словами.Иногда надо обеспечить, чтобы в каком-то слове не делалось переносов, причем не вообще никогда (тогда разумно применить команду \hyphenation), а только в данном месте. Можно добиться этого, например, с помощью команды \mbox, написав так:
![]() | Параметр \mbox{\textbf{filename}} задает имя файла. |
Вы уже встречались с командой \mbox, если прочли в предыдущей лекции раздел о включении текста в формулы; более подробно мы ее рассмотрим в лекции о "блоках".
Теперь посмотрим, что делать, если вам понадобилось насильно разорвать строку в каком-то месте, не начиная при этом нового абзаца. Для этого есть несколько способов, в зависимости от того, что вы хотите получить. Один из вариантов — воспользоваться командой \\ и получить возможно не доходящую до края, но не растянутую строку:
![]() | Эта строка\\ была разорвана. Справа осталось пустое место, но зато строка не разреженная. |
![]() | Эта строка была\linebreak разорвана. Она выровнена по правому краю, но для этого ее пришлось безбожно растянуть. |
Команда \\ допускает и необязательный аргумент: если в квадратных скобках указать какое-то расстояние (в TeX'овских единицах длины — то после оборванной строки будет оставлено это расстояние (по вертикали). Пример:
![]() | Разорвем строку\\[5pt] и оставим место. |
| \smallskipamount | маленький вертикальный пробел; |
| \medskipamount | вертикальный пробел побольше; |
| \bigskipamount | еще больше. |
У команды \linebreak с необязательным аргументом} также может присутствовать необязательный аргумент. При этом команда \linebreak[n] указывает, что в данном месте желателен переход на новую строку, причем
указывает "силу" этого желания (
должно быть целым числом от 0 до 4). Если
, то это полностью равносильно \linebreak без необязательного аргумента, если
, то это означает только, что строку в данном месте разрешается разорвать (так что применять эту команду с аргументом 0 между словами обычно бессмысленно); когда
возрастает от 1 до 3, команда \linebreak[n] "усиливает давление" на TeX'овский алгоритм верстки абзаца, делая для него разрыв в указанном месте все более выгодным, невзирая на возможное появление разреженных строк.Есть также команда\nolinebreak, действующая противоположно; она также может принимать необязательный аргумент — целое число от 0 до 4. Будучи заданной с аргументом 4, эта команда запрещает разрыв строки в указанном месте. Когда ее необязательный аргумент возрастает от 1 до 3, TeX начинает рассматривать разрыв строки в указанном месте как все менее желательный, даже невзирая на то, что из-за отказа от этого разрыва могут появиться разреженные строки.Команда \nolinebreak[0] равносильна, как это ни странно, команде \linebreak[0]. Команду \nolinebreak надо давать непосредственно после слова и до пробела, иначе она не сработает.
Для простых приложений, о которых идет речь в этой лекции, команда \nolinebreak, как правило, не нужна: чтобы запретить разрыв, гораздо удобнее "неразрывный пробел". Команда \nolinebreak иногда бывает полезна при разработке собственных макроопределений, о чем сейчас говорить преждевременно.
Смена шрифтов в тексте
В первой лекции мы уже сталкивались с командами, изменяющими текущий шрифт. Сейчас мы рассмотрим их более подробно, но начнем с предупреждения, которое не требуется полиграфистам, но не повредит остальным читателям:Не увлекайтесь переключением шрифтов! Чем меньше различных видов шрифта использовано в тексте, тем легче его читать и тем красивее он выглядит.
Сноски
Чтобы сделать сноску к какому-то месту в тексте, достаточно использовать команду \footnote с одним обязательным аргументом — текстом сноски. В стандартных классах LaTeX'а сноски8) нумеруются подряд на протяжении всей лекции или даже (в классе article) всего документа. В исходном тексте предыдущий фрагмент выглядел так:сноски\footnote{Вроде этой.} нумеруются ... В разделе, посвященном "счетчикам", мы расскажем о том, какие возможности есть для того, чтобы помечать сноски по-другому.
Если после слова, к которому делается сноска, должен стоять знак препинания, то в исходном тексте его надо поставить после закрывающей фигурной скобки, ограничивающей аргумент команды \footnote.
Текст сноски может состоять из нескольких абзацев; в этом случае они, как обычно, разделяются пустой строкой.
К сожалению, весьма непросто заставить TeX автоматически нумеровать сноски так, чтобы нумерация начиналась заново на каждой странице. В LaTeX'е, в частности, такая возможность не предусмотрена. Если вы готовы пожертвовать автоматической нумерацией сносок, то можно воспользоваться командой \footnote с необязательным аргументом. Этот необязательный аргумент ставится (в квадратных скобках) перед обязательным\footnote[2003]{Вот какой интересный номер!}. Предыдущий фрагмент выглядел в исходном тексте так:
обязательным\footnote[2003]{Вот какой ... } При использовании команды \footnote с необязательным аргументом автоматическая нумерация сносок не сбивается: предыдущая сноска имела номер \arabic{footnote}, затем мы искусственно создали сноску номер 2003, а следующая сноска9) будет иметь номер \arabic{footnote}.
В случае, если вы хотите сделать сноску к тексту, входящему в " блок" (например, в аргумент команды \mbox; в лекции 8 мы расскажем о том, что такое блок в общем случае и какими командами блоки генерируются), команда \footnote непригодна. Вот как надо ставить сноски в этом случае:
Роман \mbox{``Три\footnotemark\ мушкетера''}\footnotetext{А не четыре!} написал Дюма. В этом случае получится нормальная сноска, напоминающая нам, что в названии романа \mbox{``Три\footnotemark\ мушкетера''}\footnotetext{А не четыре!} фигурируют три мушкетера, а не четыре. Если бы мы просто написали \footnote, то увидели бы на печати только номер, но не саму сноску. Обратите также внимание на "backslash с пробелом" после команды \footnotemark: мы его поставили, чтобы между словами " три" и "мушкетера" на печати был пробел.
Если вы к тому же хотите вручную задать номер сноски к тексту, входящему в "блок", то нужно задать этот номер дважды: первый раз в качестве необязательного аргумента команды \footnotemark (обязательных аргументов у этой команды не предусмотрено), а второй раз — в качестве необязательного аргумента команды \footnotetext (необязательный аргумент этой команды должен идти перед обязательным):
Роман \mbox{``Три\footnotemark[99] мушкетера''}\footnotetext[99]{А не четыре!} написал Дюма.
Специальные абзацы
В разделе, посвященном абзацам, уже упоминалось о том, как можно печатать текст без выравнивания по правому краю. Сейчас речь пойдет о других подобных случаях, когда требуются абзацы специального вида. Большинство описываемых в этом разделе способов верстки реализовано в виде окружений ; не забывайте, что всякое окружение ограничивает группу, так что если вам нужно будет не только получить текст специального вида, но и сменить шрифт, вы можете дать команду переключения шрифта (наподобие \itshape) внутри окружения и не заботиться специально о восстановлении прежнего шрифта: вместе с окружением кончится и группа, и прежний шрифт восстановится автоматически.Специальные типографские знаки
Большинство знаков препинания (точка, запятая, двоеточие и т.п.) набираются очевидным образом: точке в исходном тексте, например, соответствует типографская точка на печати. В этом разделе речь пойдет о знаках, требующих специального набора."Старые" команды изменения шрифта
Наряду с описанными выше, в LaTeX'е пока сохраняются (для совместимости с LaTeX'ом 2.09) команды переключения шрифта, перечисленные в таблице 3.1 .| \bf | \normalfont\bfseries |
| \it | \normalfont\itshape |
| \sl | \normalfont\slshape |
| \sf | \normalfont\sffamily |
| \sc | \normalfont\scshape |
| \tt | \normalfont\ttfamily |
| \rm | \normalfont\rmfamily |
Стихи
В принципе стихи можно набирать с помощью окружений flushleft или center, разделяя строки командой \\, а строфы, например, пустой строкой и командой \smallskip. Кроме того, в LaTeX'е для набора стихов предусмотрено специальное окружение verse. Строки в нем разделяются командой \\, а строфы — пустой строкой. При этом строки получаются выровненными по левому краю и отодвинутыми от левой границы текста. Если строка окажется слишком длинной, она будет перенесена на следующую строку (не исключено, что в каких-то словах будет сделан перенос) и сдвинута примерно на 15 пунктов вправо. Пример:
![]() | \begin{verse} Здесь любит медведь\\ Иногда посидеть\\ И подумать: ``А чем бы такое заняться?'' \end{verse} |
Наличие или отсутствие абзацного отступа в абзаце после окружения verse определяется по тем же правилам, что для quote и quotation.
TeX'овские команды для генерации линеек
Рассмотренная нами LaTeX'овская команда \rule обладает рядом недостатков. Например, то обстоятельство, что создаваемые с ее помощью линейки воспринимаются TeX'ом как буквы, усложняют печать линейки, простирающейся во всю ширину страницы. Если между абзацами, т. е. в "вертикальном режиме", сказать \rule{10cm}{1pt}, то линейка начнется не с левого края текста, а после абзацного отступа: TeX решит, что с этой "буквы" начинается новый абзац. Кроме того, при печати линеек с помощью команды \rule необходимо заранее знать их длину и ширину, что не всегда удобно (например, если линейка должна идти во всю ширину текста, то надо точно знать, чему эта ширина равна, или, по крайней мере, как она обозначается в TeX'е). Избавиться от этого неудобства можно с помощью TeX'овских команд \hrule и \vrule. Команда \hrule употребляется в "вертикальном режиме" (между абзацами). Она создает линейку высотой 0.4pt и шириной, равной ширине колонки текста. Команда \vrule употребляется в "горизонтальном режиме" (внутри абзацев). Она создает линейку шириной 0.4pt, простирающуюся по высоте до максимальной высоты букв в содержащей ее строке (если в строке присутствуют буквы наподобие "у", опускающиеся ниже уровня строки, то и линейка будет опускаться ниже уровня строки). Пример:
\hrule\smallskip Весь этот текст будет заключен между двумя линейками. Внутри абзаца тоже будет \vrule{} линейка. \Large Если буквы в строках выше, то и линейка \vrule{} будет больше. \smallskip\hrule Если вас не устраивает, что генерируемая командой \hrule линейка имеет высоту 0.4pt, то требуемую вам высоту можно указать в явном виде. Например, для задания линейки шириной во всю колонку и высотой 2 пункта надо написать (как водится, между абзацами) так:
\hrule height 2pt Отсутствие символа \ перед \height не является опечаткой height - не команда, а одно из так называемых " ключевых слов" TeX'а, наподобие уже встретившихся нам ранее слов plus и minus). Для явного задания ширины линейки, генерируемой командой \vrule, используется ключевое слово width:
\vrule width 2mm В принципе можно указывать при команде \hrule не только высоту, но и ширину, а при команде \vrule - не только ширину, но и высоту, но в таком случае обычно проще воспользоваться LaTeX'овской командой \rule.
Если после команды \hrule или \vrule в тексте идет слово, совпадающее с одним из используемых этими командами ключевых слов (то бишь height, width или depth, о котором у нас речи не было), то это слово будет воспринято TeX'ом как ключевое, что приведет к сообщению об ошибке. В русском тексте вероятность такого стечения обстоятельств исчезающе мала, но если вы хотите, чтоб неприятностей не было с гарантией, то после чего-нибудь вроде \hrule height 2mm. пропустите строку (между абзацами это ничего не испортит), а после команды наподобие \vrule width 2mm поставьте еще команду \relax, означающую " ничего не делать".
Управление разрывами страниц
Как вы могли убедиться, TeX предоставляет широкие возможности для управления видом абзаца, местами разрывов строк и т.п. С разрывами страниц все обстоит не столь хорошо. Дело в том, что при верстке абзаца TeX сначала читает его целиком, а затем перебирает различные способы разбиения на строки и выбирает из них оптимальный. При разбиении на страницы такой подход невозможен: если читать сразу весь текст, а затем перебирать различные варианты разбиения его на страницы, то компьютеру не хватит памяти. Поэтому разбиение на страницы в TeX'е — процесс " одноразовый". Обработав очередной абзац, TeX проверяет, набралось ли уже достаточно строк, чтоб заполнить страницу. Если оказывается, что достаточно, он производит разрыв страницы, и при этом выбор обычно невелик (часто бывает возможно сместить место разрыва страницы на строчку - другую за счет того, что некоторые интервалы между строками можно слегка растягивать или сжимать; таковы обычно интервалы между абзацами, между текстом и выключными формулами, но не между строками внутри абзаца). Имея все это в виду, рассмотрим, какие команды предоставляет LaTeX для управления разрывами страниц.Запрет разрыва страницы. Чтобы запретить разрыв страницы, используется команда \nopagebreak. Если поставить ее после конца абзаца, то разрыв страницы после этого абзаца будет запрещен. Если после конца абзаца присутствуют совместно как команда \nopagebreak, так и команда для дополнительных вертикальных промежутков, то команда \nopagebreak должна идти первой, в противном случае она не подействует.
Команда \nopagebreak может принимать необязательный аргумент — целое число от 0 до 4. Будучи снабжена этим аргументом, она не запрещает разрыв страницы в указанном месте, но делает его менее выгодным с точки зрения TeX'а (тем менее выгодным, чем больше аргумент). Команда \nopagebreak[4] означает полный запрет разрыва, как если бы команда была дана вообще без аргумента. Если аргумент равен 0, это означает только, что в данном месте страницу в принципе можно разорвать.
Принудительный разрыв страницы. Для принудительного разрыва страниц в LaTeX'е существует несколько способов. Первый и самый простой — команда \newpage. Под действием этой команды текущая страница завершается и дополняется снизу пустым пространством, если высота страницы получается меньше, чем надо.
Команда \clearpage также предназначена для принудительного разрыва страницы. Если пользоваться только теми средствами LaTeX'а, которые были описаны до этого момента в нашей книге, то она будет работать в точности так же, как \newpage. В том же случае, если к моменту подачи этой команды остались так называемые "плавающие" иллюстрации или таблицы , то перед выдачей новой страницы они будут, скорее всего, напечатаны.
Команда \cleardoublepage делает то же, что и \clearpage, но при этом в некоторых классах документов (в тех, которые предусматривают разное оформление страниц с четными и нечетными номерами — см. разд."Классы, пакеты и классовые опции" лекции 4 по поводу классовой опции twoside) новая страница обязательно имеет нечетный номер (если необходимо, при этом создается дополнительная пустая страница).
Если поставить подряд две команды \newpage (или \clearpage), то в печатном тексте чистая страница не получится. Чтобы создать чистую страницу, надо LaTeX немного обмануть: между двумя командами для разрыва страницы дать команду \mbox{}.
Наконец, существует команда \pagebreak, формально аналогичная команде \linebreak. Если дать ее без аргументов, то страница в этом месте будет разорвана; при этом не исключено, что будет сделана попытка выровнять ее по высоте с остальными страницами за счет растяжения тех вертикальных интервалов, которые можно растянуть — как правило, это интервалы между абзацами. (Команда \newpage такой попытки не делает.) Если дать команду \pagebreak с необязательным аргументом (целым числом от 0 до 4), то этот аргумент будет выражать степень желательности разрыва страницы в данном месте: если 0, то это всего лишь разрешение разорвать страницу, если 4, то разрыв обязателен, в остальных случаях степень желательности растет с ростом аргумента от 1 до 3.
Каждую из названных команд можно дать не только между абзацами, но и внутри абзаца; при этом разрыв страницы произойдет (или будет запрещен) после той строки, в которую попадает текст, соседствующий с этой командой.
Изменение высоты отдельной страницы. Иногда при окончательной отделке текста бывает необходимо немного увеличить или уменьшить размер отдельно взятой страницы (чтобы, например, втиснуть в нее еще одну строку, которая иначе окажется в одиночестве на следующей полосе). Для этого есть следующее средство: на той странице, размер которой надо увеличить на одну строку, поместить между абзацами команду
\enlargethispage{\baselineskip} Если надо увеличить размер на две строки, а не на одну, напишите в фигурных скобках 2\baselineskip вместо \baselineskip; можно также в аргументе команды \enlargethispage написать \baselineskip, -2\baselineskip, и т. п. В этом случае высота полосы уменьшится на одну, две и т.д. строки.
Добавим несколько TeX'нических подробностей. Во-первых, если текст набирается в две колонки, то команда \enlargethispage действует только на одну из них — на ту, в которую она попала. Во-вторых, при действии команды \enlargethispage увеличенная полоса может наложиться на строку с колонцифрой, если таковая предусмотрена стилем оформления документа. И наконец, в аргументе команды \enlargethispage может стоять не только кратное \baselineskip, но и любая длина, выраженная в TeX'овских единицах (скажем, 5mm).
Подробности о параметре \baselineskip и колонцифре — в следующей лекции. О двухколонном наборе будет рассказано в разд. "Набор в две колонки".
Висячие строки. Вообще говоря, не следует допускать, чтобы на страницу попадала только первая или только последняя строка абзаца. В TeX'е предусмотрены два параметра, влияющие на вероятность появления разрывов страницы в этих местах. Именно, параметр \clubpenalty определяет нежелательность разрыва страницы после первой строки абзаца, а \widowpenalty — перед последней. Чем выше значение этих параметров, тем с меньшей охотой TeX будет допускать такие разрывы (если, конечно, есть возможность выбора); значение 10000 означает, что разрыв полностью запрещен.По умолчанию и \clubpenalty, и \widowpenalty равны 150.
Установка промежутков вручную
Как команда "backslash с пробелом" "\ ", так и символ неразрывного пробела "~" генерируют пробел, но делать пробелы вручную с помощью набора чего-нибудь вроде "~~~" или "\ \ \ "неразумно, поскольку эти пробелы, как правило, могут растягиваться или сжиматься ради выравнивания строк, и вы не сможете проконтролировать реальный размер пустого пространства, полученного таким способом.Чаще всего требуется получить промежуток величиной в один или два em . Для этого служат команды \quad, дающая промежуток в 1em, и \qquad, дающая промежуток в 2em. Команда \enskip дает промежуток, в два раза меньший, чем \quad (в стандартных шрифтах он равен ширине цифры). Про команду \, (" backslash с запятой") уже шла речь в разд." Кавычки".
Если необходимо задать промежуток с указанием конкретной длины, можно воспользоваться командой \hspace {длина}
Если этот промежуток должен сохраняться также и в начале (или конце) строки, используется команда \hspace * вместо \hspace . Указание длины состоит из числа и названия единицы , например,\hspace{1.5cm}
Пользуясь командами типа \quad, не сделайте лишнего пробела (разумеется, кроме того, который ограничивает имя команды, состоящей из букв). Вот примеры того, как надо и как не надо делать:
![]() | Здесь\quad 1em промежутка.\\ Здесь\quad{}1em промежутка.\\ Здесь\quad{} 1em плюс еще немного. |
Вертикальные промежутки
Большинство вертикальных промежутков (например, между заголовком раздела и его текстом) LaTeX устанавливает самостоятельно, и вам об этом можно не заботиться. Иногда возникает необходимость сделать дополнительный вертикальный промежуток между абзацами. Как вы помните, как внутри абзацев для задания промежутков вручную разумнее пользоваться не командами, явно задающими размер промежутка, а командами вроде \, или \quad; аналогичным образом, для задания промежутков между абзацами рекомендуются такие команды:
промежуток;

промежуток;

промежуток.
![]() | После этого абзаца мы оставим дополнительный пробел. \par\smallskip А теперь начнем новый абзац. |
Если вы хотите задать размер вертикального промежутка в явном виде, можно воспользоваться командой \vspace. Подобно команде \hspace, у нее есть один обязательный аргумент — величина промежутка. Например, можно написать
\vspace{2ex} Команду \vspace удобнее всего ставить после конца абзаца (подобно таким командам, как \smallskip).
Можно поставить команду \vspace (или \smallskip и т.п.) не после пустой строки или \par, а непосредственно перед ними, после всего текста абзаца. Если поставить какую-либо из этих команд внутри абзаца, то дополнительный вертикальный пробел получится не между абзацами, а между строками абзаца.
Если дать команду \vspace сразу же после \newpage или \clearpage, то вертикального отступа в начале новой страницы не получится; вертикальный отступ, создаваемый \vspace, пропадет и в том случае, если он оказывается в начале новой страницы, получившейся "естественным образом". Чтобы вертикальный отступ в начале страницы не пропадал, надо воспользоваться вариантом со звездочкой после имени команды: если написать \vspace*{1cm}, то будет создан вертикальный промежуток в 1cm, не пропадающий даже в том случае, если команда дана сразу после \newpage или \clearpage или в этом месте произошел разрыв страницы.
Можно заставить команду \ vspace создать промежуток не фиксированной, а переменной длины. Именно, в самом общем виде эта команда записывается так:
\vspace{x plus y minus z} Здесь
,
и
- длины, выраженные в TeX'овских единицах, а plus и minus — так называемые "ключевые слова" TeX'а (в отличие от команд, перед ними не надо ставить backslash). При этом
обозначает "естественную" величину отступа: если при верстке страницы вертикальные интервалы не приходится растягивать или сжимать (например, в случае, когда, мы разрешили TeX'у оставлять внизу страницы пустое место; в дальнейшем мы обсудим, как это делать), то будет сделан пробел размером ровно
. При необходимости, однако (например, ради того, чтобы все страницы имели одинаковую высоту), этот интервал можно будет и изменить:
указывает степень растяжимости, а
— степень сжимаемости интервала. Говоря TeXническим языком, команда \vspace вставляет в страницу "клей"10); расстояния, указанные после plus и minus, называются соответственно plus- и minus-компонентами этого клея. Если plus- или minus-компонента в аргументе команды \vspace не указана, то соответствующий интервал не сможет растягиваться (сжиматься). Большинство вертикальных интервалов, автоматически вставляемых LaTeX'ом, обладают растяжимостью и/или сжимаемостью, что помогает при нахождении оптимальных разрывов страниц.Один частный случай растяжимых промежутков настолько важен, что в LaTeX'е для него предусмотрена специальная команда. Именно, в аргументе \vspace или \vspace* можно вместо длины, заданной в TeX'овских единицах, написать \fill. Это задает промежуток нулевого размера, но обладающий способностью бесконечно растягиваться. Если, например, написать
\clearpage\vspace*{\fill} \begin{center} Заголовок \end{center} \vspace*{\fill}\clearpage то слово "заголовок" будет расположено точно по центру отдельной страницы, созданной командами \clearpage.
Перед командой \fill в аргументе \vspace или \vspace* можно поставить коэффициент — целое число или десятичную дробь, и тогда растяжимость умножится на этот коэффициент.Например, если написать
\clearpage\vspace*{0.5\fill} \begin{center} Заголовок \end{center} \vspace*{\fill}\clearpage то перед словом "заголовок" будет оставлено ровно в два раза меньше места, чем после него, так как 0.5\fill растяжим в два раза меньше, чем \fill.
Теперь можно признаться, что горизонтальные промежутки, создаваемые командой \hspace, также могут быть растяжимыми; чтобы этого добиться, надо задать в аргументе команды \hspace не только " естественную длину", но еще и plus- и/или minus-компоненту. Например, если сказать
\hspace{1cm plus 2mm minus 1em} то при верстке абзаца соответствующий интервал сможет растягиваться или сжиматься. Можно также, вместо длин с plus- или minus-компонентами, написать \fill (возможно, с коэффициентом). В простых приложениях такие конструкции, как правило, не встречаются. Мы еще будем говорить о них в лекции 8.
Вызов символа по коду
Можно добраться до любого символа в текущем шрифте, если знать код этого символа. Для этих целей предназначена команда \symbol. Ее единственный обязательный аргумент — код символа. Для латинских букв и цифр эти коды совпадают с обычными ASCII-кодами:
![]() | Кошка по-английски будет \symbol{99}\symbol{97}\symbol{116}. |
Если вы не знаете ASCII -кода нужного вам символа, можно в аргументе команды \symbol вместо номера поставить символы `\ и требуемый вам символ:
![]() | {\ttfamily\symbol{`\\}\symbol{`\s}qrt} |
Заключительные замечания о разрывах страниц и вертикальных интервалах
Мы уже отмечали, что TeX'овские алгоритмы создания страниц не обладают той же гибкостью, что алгоритм разбиения абзаца на строки. Поэтому не надо слишком увлекаться принудительными разрывами и запретами разрывов страниц и командами наподобие \vspace*. Даже такая замечательная программа, как TeX, не сможет удовлетворить логически противоречивым требованиям; если ограничений на разрывы страниц слишком много, то TeX будет вынужден сделать эти разрывы, исходя из формального смысла своих алгоритмов. При этом, скорее всего, на печати вы получите много страниц, разорванных в самых неожиданных и неудачных с точки зрения человека местах, а на экране — много сообщений вроде такого:Underfull \vbox (badness 10000) has occurred while \output is active Если вы регулярно сталкиваетесь с такими неприятностями, имеет смысл заново продумать принципы организации вашего текста. Избавиться от растянутых по вертикали страниц можно, если дать в преамбуле документа команду \raggedbottom, разрешающую делать страницы неодинаковой высоты (некоторые классы документов дают эту команду автоматически, но если вы ее продублируете, ничего плохого не случится). Действие, противоположное \raggedbottom, вызывается командой \flushbottom.
Наконец, если трудности возникают оттого, что вы часто оставляете в тексте место для рисунка командой \vspace*, то вам стоит воспользоваться "плавающими" иллюстрациями (см. разд. "Плавающие иллюстрации и таблицы" лекция 4).
Работа в системе 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 означает, что с этого места начинается приложение к документу. Сама она никакого текста не производит, а делает вот что:
Еще о метках и ссылках
В разных местах этой книги уже шла речь о том, как можно помечать различные места документа, а затем на эти помеченные места ссылаться. В настоящем разделе мы систематизируем эту информацию. Дополнительные сведения о том, как можно влиять на вид ссылок, создаваемых командой \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 для того, чтоб на печати появлялись именно эти переводы. В нескольких ближайших разделах мы объясним, как именно получить на печати упоминаемые в этой таблице список таблиц, список иллюстраций и т.п.
| \chaptername | Chapter | Глава |
| \contentsname | Contents | Оглавление (или Содержание) |
| \listfigurename | List of Figures | Список рисунков |
| \listtablename | List of Tables | Список таблиц |
| \abstractname | Abstract | Аннотация |
| \refname | References | Литература |
| \bibname | Bibliography | Литература |
| \indexname | Index | Предметный указатель |
| \figurename | Figure | Рис. |
| \tablename | Table | Таблица |
| \partname | Part | Часть |
| \appendixname | Appendix | Приложение |
Какие бывают разделы документа
Теперь перечислим все команды для задания разделов документа, предоставляемые стандартными классами 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 перечислены некоторые черты оформления, присущие стандартным классам. В ней знак
означает "всегда присутствует", знак
означает "всегда отсутствует", знак
означает "по умолчанию отсутствует, но будет присутствовать, если задать классовую опцию или специальную команду", знак
означает "по умолчанию присутствует, но можно отменить с помощью классовой опции или специальной команды".| Автоматически нумерующиеся разделы | ![]() | ![]() | ![]() | ![]() |
| Разбиение на главы | ![]() | ![]() | ![]() | ![]() |
| " Двусторонняя" печать | ![]() | ![]() | ![]() | ![]() |
| Титульный лист | ![]() | ![]() | ![]() | ![]() |
| Колонтитулы | ![]() | ![]() | ![]() | ![]() |
| Одинаковая высота всех страниц | ![]() | ![]() | ![]() | ![]() |
| Набор в две колонки | ![]() | ![]() | ![]() | ![]() |
| Набор в одну колонку | ![]() | ![]() | ![]() | ![]() |
Опишем теперь классовые опции. Напомним , что список классовых опций через запятую ставится в квадратных скобках перед основным аргументом команды \documentclass. Самые часто употребляемые классовые опции — это 11pt и 12pt. Они означают, что основной текст документа будет набран шрифтом кегля 11 или 12 соответственно. Если этих опций не указывать, то будет шрифт кегля 10.
Можно указать классовую опцию, задающую формат используемой бумаги, после чего TeX рассчитает размеры текста и полей так, чтобы они максимально соответствовали этому формату. Эти опции таковы (единица измерения указана в скобках):
(миллиметры) — самый ходовой в нашей стране;
(миллиметры);
(миллиметры);
(дюймы);
(дюймы).
(этот формат бумаги иногда называют "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})~--- большие и сильные животные. |
Иногда хочется, чтобы сокращенный вариант заголовка попал только в колонтитул, а в оглавлении был его полный вариант. Как этого добиться, рассказано в лекции 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\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} |
В аргументе команды \index могут быть любые символы, и вообще текст в аргументе этой команды может быть неосмысленным или недопустимым с точки зрения TeX'а — в любом случае аргумент команды \index будет в неизменном виде переписан в idx-файл. Смысл тут в том, что в аргументе команды \index можно задавать вспомогательную информацию для программы обработки idx-файла (примеры тому вы найдете ниже). Единственное ограничение — не должно быть "несбалансированных" фигурных скобок, даже если эти скобки входят в состав команд \{ или \} (напомним, что вместо \{ или \} всегда можно написать \lbrace или \rbrace соответственно).
Наконец, еще одна тонкость: команду \index нельзя использовать внутри необязательного аргумента таких команд, как \section, \chapter, \caption (подрисуночная подпись; см. следующий раздел) и т.п.
Общие принципы
Как мы знаем, любое место в тексте можно пометить с помощью команды \label с одним аргументом; на помеченное место можно сослаться с помощью команды \ref или \pageref с тем же самым аргументом. Команда \pageref дает на печати номер страницы, на которую попала соответствующая метка; поэтому \label нужно ставить вплотную к тому слову, к которому относится ссылка (при наличии пробела слово и ссылка на него могут попасть на разные страницы).Что же до команды \ref, то с ней дело обстоит так. Многие конструкции LaTeX'а автоматически нумеруют те или иные элементы документа. Из тех, с которыми мы уже сталкивались, можно назвать следующие:
если в тексте стоит команда \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'е не полностью. Именно, вы можете сделать две вещи:Простейшие средства
В простейшем случае программа 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} |
Как это обычно и происходит с автоматически генерируемыми 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'ом автоматически, а задается пользователем в явном виде. |
Наряду с командой \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,...) |
На этом мы прерываем наше обсуждение того, как изменять стандартное оформление страницы. На самом деле можно изменить гораздо больше, но речь об этом пойдет в лекции 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 внутри этого окружения делает только три вещи:
Тонкости
Для каждого ключевого слова программа 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 | минимальное расстояние по вертикали между соседними заметками. |
Внутри "блоков" (например, внутри аргумента команды \mbox или внутри окружения {tabular}, предназначенного для верстки таблиц) команду \marginpar применять нельзя.
![]() |
![]() |
![]() |
2) Или по-русски, если это предусмотрено в используемой вами русификации.
3) У вас может возникнуть искушение пометить все места, на которые надо сослаться, с помощью команды \label, а в окружении {theindex} получить номера страниц с помощью \pageref. При этом, однако, есть опасность, что TeX'у не хватит памяти для обработки такого огромного числа ссылок.
4) В наших примерах мы используем русские буквы, хотя на самом деле использование русских букв в предметном указателе зависит от применяемой вами русификации. Прежде всего, в ее состав должна входить версия программы makeindex, учитывающая русский алфавитный порядок. Кроме того, иногда (например, при использовании русского варианта пакета babel) в idx-файл попадают не русские буквы, а их условные обозначения, а в других случаях (при использовании старых версий TeX'а) их шестнадцатеричные коды, и это создает дополнительные сложности. Возможны также сложности с буквой "ё" при сортировке. При подготовке этой книги использован вариант русификации (см. приложение E), где такие проблемы не возникают.
5) Напомним, что конкретное название программы и возможность использования русских букв может зависеть от используемой системы и русификации. См. приложения E и Ж
6) В том, конечно, случае, если в преамбуле была команда \makeindex.
7) Он может идти и позже — в зависимости от конкретной версии программы makeindex и ее отношения к русским буквам.
8) На верстку эти надпечатки не влияют.
9) Для каждого из файлов, включаемых в текст с помощью команды \include, создается отдельный aux-файл.

Работа в системе LaTeX
Дополнительные возможности
Иногда бывает нужно нанести на псевдорисунок несколько регулярно расположенных объектов. В этом случае, вместо того чтобы много раз писать \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 | левая половина. |

\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} Кроме текста, на псевдорисунках можно размещать отрезки, стрелки, окружности, круги и овалы (прямоугольники с закругленными углами). Далее мы опишем, как задавать эти объекты.
Работа в системе LaTeX
Более сложные случаи
Надписи, охватывающие несколько колонок. Чтобы создать такую надпись, нужно на месте соответствующей графы таблицы записать команду \multicolumn. У этой команды три обязательных аргумента:![]() | (1) |
\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-выражения (о них речь пойдет ниже), разделение преамбулы на колонки происходит по таким правилам:
Поэтому в конце графы таблицы с такой преамбулой, оборванной после третьей колонки, будут напечатаны два вертикальных отрезка, поскольку они принадлежат третьей колонке. А если на месте второй графы такой таблицы написано "Что-то&\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), то надо руководствоваться такой таблицей:
| \=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) |
Рассмотрим теперь, как устроена вторая графа (начинающаяся с местоимения "мой"). Текст
образует в нашей таблице одну "запись" (часть таблицы, расположенную на пересечении графы и колонки).
Чтобы получить фигурную скобку требуемого (и неизвестного нам заранее) размера, мы воспользовались командами \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} (вместо десятичной точки можно поставить и десятичную запятую).
Таблицы, простирающиеся на несколько страниц
Как уже отмечалось, окружения {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), но необходимо соблюдать два ограничения:
В отличие от окружения {tabular}, таблица в окружении {longtable} не рассматривается как одна большая буква, а сразу располагается между абзацами, по умолчанию - по центру. Чтобы таблица была прижата к правому краю, надо указать у окружения {longtable} необязательный аргумент r (в квадратных скобках, между \begin{longtable} и преамбулой); необязательный аргумент l даст таблицу, прижатую влево.
![]() |
![]() |
![]() |

Таблицы
При пользовании окружением {tabbing} вы должны самостоятельно следить, чтобы разные колонки не накладывались друг на друга. Можно, однако, передать эти заботы программе: TeX предоставляет возможности для печати таблиц, в которых ширина колонок выбирается автоматически (по максимальной ширине их содержимого). В LaTeX'е для этих целей используются окружения {tabular}(для набора таблиц с текстом) и {array} (для набора таблиц из формул). Помимо автоматизированного определения ширины колонки, эти окружения дают возможность печатать разлинованные таблицы, таблицы, в которых некоторые записи охватывают несколько колонок, и т.д. В лекции 2 уже шла речь про окружение {array}; здесь мы подробно разберем, как работает {tabular}; все возможности этого окружения, о которых идет речь в этой лекции, доступны и для {array}, и ниже мы дадим примеры их использования.Работа в системе LaTeX
Команда \newcommand со звездочкой
У команд \newcommand и \renewcommand существуют варианты " со звездочкой", называемые \newcommand* и \renewcommand. Они работают точно так же, как их тезки без звездочек, со следующим отличием: если команда с аргументами определена с помощью \newcommand* или \renewcommand*, то в ее аргументе не может содержаться пустая строка или команда \par. Если ваша команда определена с помощью \newcommand или \renewcommand без звездочки, то никаких ограничений на этот счет нет.Смысл этого запрета таков. В большинстве случаев команды с аргументами, которые вы определяете, все равно не будут предусматривать подстановку вместо аргумента фрагмента текста, содержащего пустую строку или \par, так что этот запрет ни на чем не скажется (во всех примерах, приведенных в этой книге к настоящему моменту, можно совершенно безболезненно заменить \newcommand и \renewcommand на их варианты " со звездочкой"). А вот диагностика ошибок при наличии такого запрета облегчается. В самом деле, представим себе, что вы забыли набрать закрывающую фигурную скобку в аргументе команды (весьма распространенная ошибка!), как в следующем примере (забыта фигурная скобка в самой первой формуле; команду \smb мы определили в учебных целях раньше):
Символ Лежандра $\smb{a{l}$, где $a$ не делится на $l$, равен по определению $1$, если $a$ является квадратичным вычетом по модулю $l$, и $-1$ в противном случае. Вопрос о том, как зависит $\smb{a}{l}$ от $l$ при фиксированном $a$, является весьма важным и трудным. Великий немецкий математик К.-Ф.Гаусс... Если пустые строки в аргументе команды \smb не запрещены (так оно и будет, если определять \smb с помощью \newcommand без звездочки), то TeX будет терпеливо ждать, когда ему встретится закрывающая фигурная скобка, парная к первой из открывающих фигурных скобок в первой строке, а пока таковой нет — рассматривать весь читаемый им текст как составную часть первого аргумента команды \smb. В конце концов TeX либо доложит, что он прочел уже весь файл, а закрывающей фигурной скобки так и не нашел, либо прервет работу, объявив, что ему не хватило памяти.
Если же мы определим \smb с помощью \newcommand*, написав
\newcommand*{\smb}[2]{\left(\frac{#1}{#2}\right)} то ошибка не пойдет дальше текущего абзаца: как только TeX увидит пустую строку среди текста, рассматриваемого им как аргумент команды, он тут же прервет дальнейшее чтение и выдаст следующее стандартное сообщение об ошибке:
Runaway argument? {a{l}$, где$a$ не делится на $l$, равен п\ETC. ! Paragraph ended before \smb was complete.
Команды \newcommand и \renewcommand* обладают еще одним преимуществом перед своими вариантами без звездочек: при их использовании происходит (небольшая) экономия памяти.
Рекомендуем вам определять и переопределять команды с аргументами при помощи \newcommand* и \renewcommand*. Варианты без звездочек используйте только тогда, когда вы действительно намерены подставлять в аргумент своего макроса текст, состоящий из нескольких абзацев.
Команды без аргументов
Начнем с примера. Пусть вы пишете текст, в котором регулярно встречается математический значок
(он означает " равно по определению"). Пользуясь тем, что вы узнали из
лекции 2 , нетрудно понять, что генерируется этот значок внутри математической формулы такой последовательностью команд:\stackrel{\mathrm{def}}{=} Часто писать такой длинный набор команд утомительно. Вот бы в LaTeX'е была предусмотрена команда, скажем, \eqdef, генерирующая символ бинарного отношения
,! Правда, такой команды нет, но мы ее можем создать. Для этого следует написать так:\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}} После того как TeX прочтет эту строку, он всюду, встречая команду \eqdef, будет реагировать точно так же, как если бы он видел текст \stackrel{\mathrm{def}}{=}. Например, формула
теперь получается так:x^2\eqdef x\cdot x Новая команда TeX'а, которую мы определили, называется макросом (еще говорят: макроопределение, макрокоманда, макро). Рассмотрим точные правила для создания макросов средствами LaTeX'а.
Для создания макросов используется команда \newcommand. Эта команда имеет два обязательных аргумента. Первый из них — имя, которое вы придумали для вашего макроса. Имена макросов должны подчиняться тем же правилам, что имена TeX'овских команд, либо backslash и после него одна не-буква, либо backslash и после него — последовательность букв. Второй обязательный аргумент команды \newcommand, называемый " замещающим текстом", сообщает TeX'у смысл макроса: на этот текст ваш макрос будет замещаться в процессе трансляции (как говорят, макрос будет "разворачиваться").
При пользовании командой \newcommand нельзя в качестве имени макроса выбирать имя уже существующей команды или окружения (если вы попробуете так сделать, LaTeX выдаст сообщение об ошибке).
Во втором аргументе команды \newcommand (иными словами, в "замещающем тексте") вместе с каждой открывающей фигурной скобкой должна присутствовать соответствующая ей закрывающая1), так что определения наподобие
\newcommand{\nachatkursiv}} \newcommand{\konchitkursiv}{}} приведут в лучшем случае к сообщению об ошибке (и желаемого эффекта не дадут). Если вам кажется, что такие ограничения стеснительны, можете изучить по книге [2], как их обходить; для большинства практических целей возможности создания макроопределений, предоставляемые LaTeX'ом, вполне достаточны.
К сожалению, некоторые русификации TeX'а не позволяют использовать в именах макросов русские буквы.
Еще одно ограничение: имя новой команды не должно начинаться на end.
Наконец, в замещающем тексте макроопределения нельзя пользоваться командой \verb или окружением {verbatim}.
Если команда \newcommand дана внутри группы, то смысл определяемой ею новой команды будет забыт TeX'ом по выходе из группы. Если новая команда определяется в преамбуле, то, естественно, она будет понятна TeX'у на протяжении всего документа.
Давайте теперь разберем несколько примеров, обращая внимание на типичные ошибки.
Макросы хороши как средство скорописи. Например, если в вашем тексте часто встречается знак
, то вам может надоесть все время писать длинную команду \bigtriangleup. Коли так, придумайте сокращенное обозначение (скажем, \btu), напишите в преамбуле\newcommand{\btu}{\bigtriangleup} и вы сможете писать формулы наподобие
$(A\btu B)\cap C= (A\cap C)\btu (B\cap C)$ Ранее было рассказано, что делать, чтобы создать согласующееся с нашими традициями обозначение для тангенса. Теперь мы понимаем, что это был пример макроопределения (если вам интересно знать, что значит команда \mathop в замещающем тексте).В лекции 2 вы найдете массу других примеров громоздких конструкций, для которых имеет смысл создать макросы.
А теперь — пример типичной ошибки. Пусть в тексте, который вы набираете, регулярно встречаются фразы наподобие
Подмногообразия проективного пространства
- основной объект изучения алгебраической геометрии, и пусть для сокращения письма вы написали в преамбуле\newcommand{\Pn}{$\mathbf P^n$} Теперь можно писать, например, так:
... пространства~\Pn{} - основной объект... Однако для набора формулы
написать $x\in\Pn$ не удастся: появится сообщение о том, что символ ^ и команда \mathbf преступно употреблены вне математической формулы.
Причина проста: TeX исправно подставляет вместо \Pn тот "замещающий текст", который вы ему сообщили во втором аргументе команды \newcommand. В результате этого при развертывании макроса \Pn текст $x\in\Pn$ превращается в незаконный текст $x\in$\mathbf P^n$$, в котором математическая формула заканчивается со вторым из знаков доллара, а символ ^ оказывается посреди обычного текста. Чтобы можно было напечатать
не только изолированно, не надо включать знаки доллара в определение:\newcommand{\Pn}{\mathbf{P}^n} При этом придется, конечно, ставить знаки доллара вокруг \Pn в тех случаях, когда в тексте встречается просто
, но зато наш макрос можно будет использовать и как составную часть более сложных формул.Есть, впрочем, и более удачный способ борьбы с этой проблемой: определите\Pn как
\newcommand{\Pn}{\ensuremath{\mathbf{P}^n}} (без всяких знаков доллара) — и вы сможете спокойно пользоваться своей новой командой \Pn как в тексте, так и в формулах:
Пусть \Pn~ — $n$---мерное проективное пространство, а $X\subset \Pn$~ — неприводимое многообразие... (знаки ~ мы поставили, чтобы строчка не смогла начаться с тире —c.103). Команда \ensuremath всегда обрабатывает свой аргумент как математическую формулу, независимо от того, в тексте или в формуле вы ее используете.
Создавать макросы полезно не только для сокращения числа нажатий на клавиши при наборе формул. Вот пример, когда макросы помогают и при наборе обычного текста. Предположим, в нашем тексте много задач, причем условие каждой из задач начинает новый абзац (как обычно и бывает). Предположим также (временно), что эти задачи никак не нумеруются. Слово "Задача", с которого начинается условие, хочется как-то выделить в тексте; предположим, мы решили выделять его жирным шрифтом. Давайте создадим макрос, который будет делать все это за нас, чтобы можно было не печатать каждый раз слово "Задача", а просто написать \z. Первым обычно приходит в голову что-нибудь такое:
\newcommand{\z}{\bfseries Задача} Посмотрите, что из этого выйдет:
| \z. Пять парней за пять дней съели пять окуней. За сколько дней пятнадцать парней съедят пятнадцать окуней? |
p> Почему же жирным шрифтом напечаталось не только слово "Задача", но и весь дальнейший текст? Ответ: TeX опять пунктуально заменил \z на "замещающий текст", в результате чего получилось вот что:
\bfseries Задача. Пять парней ... Команда \bfseries оказалась не внутри группы, и весь текст напечатался жирным шрифтом. Чтобы не попадаться в такую ловушку, надо помнить, что при развертывании макроса фигурные скобки, ограничивающие замещающий текст в команде \newcommand, отбрасываются. Правильнее было бы дать такое определение:
\newcommand{\z}{\bfseries {Задача}}" На сей раз \z будет заменяться на {\bfseries Задача} (отбрасывается внешняя пара фигурных скобок, ограничивающая второй аргумент команды \newcommand, и только она!). А можно (это, пожалуй, даже лучше) написать и так:
newcommand{\z}{\textbf{Задача}} Впрочем, наш макрос \z еще не идеален. Во-первых, после слова, напечатанного жирным шрифтом, точку лучше поставить тоже жирным шрифтом, поэтому разумно и ее включить в макроопределение. Далее, согласно общему правилу игнорирования пробелов после имени команды, состоящего из букв, в тексте при этом нельзя будет написать
\z Пять парней... так как при этом пропадет пробел между словом "Задача." и следующим словом. Можно этот пробел, как водится, всякий раз специально организовывать и писать
\z{} Пять парней... но лучше вставить и пробел прямо в определение:
\newcommand{\z}{\textbf{Задача. }} Теперь запись \z Пять парней... даст то, что нужно. Впрочем, если угодно, вот еще один штрих. Если вы в какой-нибудь момент забудете оставить пустую строку перед очередной задачей, то слово "Задача" при этом будет не начинать абзац, а продолжать предшествующий текст. Чтобы этого раз и навсегда избежать, можно вставить команду "закончить абзац" в наше макроопределение. Как вы помните, эта команда называется \par:
\newcommand{\z}{\par\textbf{Задача. }} Если перед нашим макросом \z пустая строка все-таки будет, то лишняя команда \par ни на что не повлияет, а если ее не будет, то \par сыграет роль недостающей пустой строки.
Если какой-то элемент текста оформлен с помощью макроса, становится удобно менять это оформление. Например, если вдруг понадобилось оформлять все задачи так, чтобы соответствующие абзацы начинались без отступа, достаточно внести небольшое изменение в наше определение команды \z:
\newcommand{\z}{\par\noindent\textbf{Задача. }} Если бы каждую задачу мы оформляли вручную, нам пришлось бы перед каждым словом "Задача" вписывать команду \noindent. В дальнейшем, познакомившись с LaTeX'овскими " счетчиками", мы усовершенствуем наш макрос \z таким образом, чтобы он еще и автоматически нумеровал задачи.
Мы уже говорили, что переопределить значение уже существующей команды с помощью \newcommand невозможно. Иногда, однако, это бывает необходимо. Пример тому приведен в лекции 3 : если мы хотим, чтобы в заголовках глав печаталось именно слово "Глава", а не " Chapter", то необходимо определить по-новому команду \chaptername. Для такого рода целей используется команда \renewcommand. Она устроена точно так же, как \newcommand, с тем отличием, что в качестве ее первого аргумента надо указывать имя уже существующей команды; в этом случае по выполнении команды \newcommand значение этой команды изменится: она превратится в сокращенное обозначение для текста, указанного в качестве ее второго аргумента. Например, если написать
\renewcommand{\alpha}{Ку-ку} то команда \alpha будет генерировать не то, что обычно (букву
в математической формуле и сообщение об ошибке, если эта команда употреблена вне математической формулы), а текст "Ку-ку".Если команда \renewcommand дана внутри группы, то созданное ею переопределение значения команды забудется по выходе из этой группы. Если в качестве первого аргумента команды \renewcommand указать имя несуществующей команды, то вы получите сообщение об ошибке.
Команда \renewcommand при неаккуратном обращении может привести к неприятностям. Дело в том, что нередко команды LaTeX'а определяются в терминах других команд LaTeX'а, причем знать эти сложные связи рядовой пользователь вовсе не обязан.
На практике такое незнание может привести к тому, что безобидное на первый взгляд использование в своих целях имени какой-нибудь команды, которая в вашем тексте ни разу не встречается, вызовет необъяснимо неправильную работу других команд. Поэтому используйте \renewcommand только тогда, когда вы полностью отдаете себе отчет в своих действиях.
Выше мы часто называли макросы просто командами, и это — не просто небрежность речи: на самом деле принципиальной разницы между макросами и TeX'овскими командами почти нет. В частности, почти все команды LaTeX'а, о которых говорилось и еще будет говориться в нашей книге, являются именно макросами; в отличие от макросов, создаваемых нами с помощью \newcommand, их смысл уже известен TeX'у к моменту запуска программы, так что определять их каждый раз не нужно. Макросы, в свою очередь, могут ссылаться на другие макросы (кстати, команда \stackrel, на которую ссылалась наша команда \eqdef, также является макросом) - и так далее, пока не дойдет до так называемых "примитивных команд" TeX'а. Из команд, о которых мы вам рассказывали, примитивными являются считанные единицы: \left, \right, \noindent и некоторые другие.
Команды с аргументами
Мы уже научились создавать новые команды, не требующие аргументов. Но мы хорошо знаем, что многие LaTeX'овские команды принимают аргументы, и часто возникает потребность создать новую команду с такими возможностями. Пусть, например, в вашем тексте часто встречается "символ Лежандра", выглядящий так:
. Для получения этого символа в исходном тексте надо написать (внутри формулы, естественно) так:\left(\frac{a}{l}\right) Хорошо бы создать команду \smb с двумя аргументами, чтобы можно было написать в формуле "\smb{a}{l}" и получить на печати
. Что ж, LaTeX предоставляет нам возможность сделать и это. Для создания команды с аргументами используется все та же команда \newcommand, но с необязательным аргументом2). Посмотрите, как можно определить команду \smb:\newcommand{\smb}[2]{\left(\frac{#1}{#2}\right)} Разберем, что означает эта запись. В квадратных скобках стоит количество аргументов в нашем макросе (в нашем случае 2). Далее, в самом "замещающем тексте" появились значки "#1" и "#2" . При развертывании макроса на их место будут подставляться соответственно первый и второй аргументы нашей новой команды \smb. Например, если в формуле написать
\smb{a+b}{c} то будет напечатано
.Теперь рассмотрим точные правила. Необязательный аргумент команды \newcommand, который должен быть расположен между двумя обязательными, указывает, сколько аргументов будет требовать создаваемая вами команда (макрос). Это количество аргументов не может быть более 9. В "замещающем тексте" места, на которые при развертывании макроса будут подставляться аргументы, обозначаются символами "#1" для первого аргумента, "#2" для второго аргумента и т.д. Эти символы могут идти в любом порядке и присутствовать любое количество раз (в том числе и ни разу). Когда мы будем использовать нашу новую команду в тексте, после ее имени в фигурных скобках должны будут следовать аргументы, ровно в том количестве и в том порядке, который мы указывали в необязательном аргументе команды \newcommand, каждый — в своей паре фигурных скобок (как обязательные аргументы любой другой LaTeX'овской команды).
При развертывании макроса на место его и его аргументов будет подставлен " замещающий текст", в котором вместо "#1" всюду стоит первый аргумент, вместо "#2" — второй аргумент и т.д.
Проиллюстрируем все сказанное примером. Пусть мы определили команду \shuffle следующим образом:
\newcommand{\shuffle}[4]{К#4к#2#1л} Тогда будет получаться, например, такое:
| \shuffle{ди}{о}{го}{ро} Гена и его друзья. |
Ни аргументы LaTeX'овских команд (в том числе и определенных вами), ни "замещающий текст" в \newcommand не должны содержать "несбалансированных" (не имеющих пары) фигурных скобок (это не относится к \{ и \}).
Если вы хотите создать макрос с аргументами, имя которого совпадает с именем уже существующей команды, то надо воспользоваться командой \renewcommand с необязательным аргументом. Место постановки и значение этого необязательного аргумента, а также правила употребления символов #1, #2 и т.д. при этом будут такие же, как для команды \newcommand.
Приведем еще один пример практически полезного макроса с аргументами. При написании этой книги автор широко пользовался ссылками на страницу, автоматически генерируемыми с помощью команды \pageref. Например, если какое-то место в тексте было помечено с помощью команды \label{units}, то ссылка на соответствующую страницу выглядела так:
Как мы уже отмечали на с. \pageref{units}, ... После первого десятка таких ссылок возникает желание сократить число нажатий на клавиши. В результате в преамбуле появилась строка
\newcommand{\str}[1]{стр. \pageref{#1}} и ссылки на страницы стало возможно оформлять так:
Как мы уже отмечали на \str{units}, ... (Автор вначале не знал, что надо писать "с.", а не " стр.", но мгновенно исправился, всего лишь удалив две буквы из определения команды \str!)
Модификация оформления перечней
Начнем с {itemize}. Чтобы поменять значки, которыми помечаются элементы перечня, надо переопределить команду \labelitemi. Если, например, мы хотим, чтобы элементы перечня отмечались не черными кружками, а галочками
, то достаточно написать в преамбуле\renewcommand{\labelitemi}{$\surd$} . Если окружение {itemize} расположено внутри другого окружения {itemize}, как в примере на {itemize}, то значки для пометки элементов перечня будут уже, вообще говоря, другими: их вид задается командой \labelitemii; вид значков для пометок элементов itemize на третьем и четвертом уровнях вложенности задается командами \labelitemiii и \labelitemiv; их также можно переопределять.
Правильнее было бы определять заголовки для itemize чуть хитрее. Например, наше определение \labelitemi лучше дать так:
\renewcommand{\labelitemi}{$\mathsurround=0pt \surd$} Если дать определение именно так, то вокруг галочки не появится дополнительный пробел даже в случае, если вы в какой-то момент решите установить ненулевое значение параметра \mathsurround. Поскольку формула образует группу, в дальнейшем предыдущее значение \mathsurround восстановится. Полезно иметь в виду этот прием, если вы пользуетесь математическими символами в качестве типографских значков.
Теперь рассмотрим окружение {enumerate}. Коль скоро оно автоматически нумерует элементы перечня, можно предположить, что это окружение связано с LaTeX'овскими счетчиками. Так оно на самом деле и есть: это окружение использует счетчик enumi. Если одно {enumerate} вложено в другое, то используются счетчики enumii, enumiii и enumiv для нумерации элементов перечня на втором, третьем и четвертом уровнях вложенности. С другой стороны, сами значки, помечающие элементы перечня, порождаются командами \labelenumi, \labelenumii, \labelenumiii и \labelenumiv — в зависимости от уровня вложенности. Например, команда \labelenumi определена так:
\newcommand{\labelenumi}{\theenumi.} в то время как the-команда, определяющая представление счетчика enumi на печати, определена просто как
\newcommand{\theenumi}{\arabic{enumi}} Стало быть, если мы не меняем стандартного стиля оформления, то элементы перечня {enumerate} (не вложенного в другой {enumerate}) будут нумероваться цифрами с точкой. Если же мы хотим, скажем, чтобы после цифры шла не точка, а скобка (как в нашей книге), то можно в преамбуле написать
\renewcommand{\labelenumi}{\theenumi)} Если же мы к тому же хотим, чтобы элементы перечня нумеровались римскими цифрами, то можно написать еще и так:
\renewcommand{\theenumi}{\Roman{enumi}} Аналогичным образом можно менять оформление нумерованных перечней на других уровнях вложенности.
Если вы хотите изменить оформление перечня более серьезным образом (например, установить другую величину полей, или сделать так, чтобы значки, помечающие элементы перечня, были выровнены по левому, а не по правому краю), то вам придется подождать до лекции 9.
Новые окружения: общий случай
Как мы уже имели возможность убедиться, для сокращения времени на написание длинных последовательностей команд удобно пользоваться макросами. В тех случаях, когда для достижения необходимого нам эффекта требуется сложная последовательность команд в начале и в конце какого-то текста, LaTeX дает возможность оформить соответствующие макросы в виде нового окружения. Как это делается, разберем на примере.Предположим, нам хочется взять в рамку абзац текста шириной
. Один из возможных способов таков:\begin{tabular}{|p{7cm}|} \hline Этот текст будет заключен в рамку. Как видите, окружение, предназначенное для верстки таблиц, можно использовать и для этих целей.\\ \hline \end{tabular} При этом будет напечатано вот что:
Если таких рамок с текстом у вас много, то можно сократить число нажатий на клавиши, определив окружение с именем, скажем, {ramka}, так, чтоб можно было бы просто писать\begin{ramka} Этот текст будет ... ... этих целей. \end{ramka} Определяется это окружение так:
\newenvironment{ramka}{\begin{tabular}{|p{7cm}|} \hline}{\\\hline\end{tabular}} В общем случае команда \newenvironment имеет такой формат:
\newenvironment{имя}{открывающие\_команды}{закрывающие\_команды} Здесь имя — имя определяемого окружения, открывающие\_команды — команды и/или текст, подставляемые вместо команды \begin с именем окружения, закрывающие\_команды — команды и/или текст, подставляемые вместо команды \end с именем окружения.
Вместо окружения, определяемого с помощью \newenvironment, можно с тем же успехом создать два макроса: один — для открывающих\_команд, другой — для закрывающих. Например, в нашем случае с рамкой можно было бы написать
\newcommand{\nachalo}{\begin{tabular}{|p{7cm}|}\hline} \newcommand{\konec}{\\\hline\end{tabular}} и создавать рамки так:
\nachalo Этот текст... \konec Преимущество оформления такого рода конструкций в виде окружений состоит в том, что при этом легче контролировать ошибки: если вы напишете \begin{ramka} и при этом забудете написать соответствующую команду \end{ramka}, то LaTeX выдаст сообщение об ошибке, в котором именно это вам и скажет; если же вы забудете команду \konec, то сообщения об ошибке будут менее понятными.
Кроме того, нелишне напомнить, что команды \begin и \end, ограничивающие окружение, ограничивают группу: все неглобальные определения и изменения параметров, происходящие внутри окружения, забываются по выходе из него.
Новые окружения можно определять так, чтобы они принимали аргументы. Пусть, например, в зависимости от обстоятельств нам нужны рамки разной ширины. Тогда разумно модифицировать определение окружения {ramka} таким образом, чтобы ширина текста в рамке передавалась ему как аргумент. Соответствующее определение будет выглядеть так:
\newenvironment{ramka}[1]{\begin{tabular}{|p{#1}|} \hline}{\\\hline\end{tabular}} После этого можно писать, например,
\begin{ramka}{6cm} Текст... \end{ramka} или даже
\begin{ramka}{.85\textwidth} Текст... \end{ramka} Общие правила таковы. Чтобы создать окружение с аргументами, надо воспользоваться командой \newenvironment c необязательным аргументом. Этот необязательный аргумент ставится между первым и вторым обязательными; как и в случае с \newcommand, он означает количество аргументов, которые будет требовать окружение, и это количество не может превышать девяти; места, куда будут вставлены аргументы, по-прежнему обозначаются #1,...,#9, причем эти значки можно употреблять только в открывающих командах (т.е. во втором обязательном аргументе команды \newenvironment)
С помощью \newenvironment нельзя переопределить уже существующее окружение (если вы все же попробуете так сделать, LaTeX выдаст сообщение об ошибке). Если вам действительно необходимо такое переопределение, надо пользоваться командой \renewenvironment, работающей точно так же, как и \newenvironment, с тем различием, что в качестве первого аргумента ей можно передавать только имя уже существующего окружения.
У команд для пере)пределения окружения также существуют " варианты со звездочкой": \newenvironment* и \renewenvironment*. Если окружение с аргументами определено с помощью одной из этих команд, то в его аргументе запрещены пустые строки или команды \par.
Окружения типа "теорема" в пакете amsthm
Все LaTeX'овские "теоремы", определяемые пользователем при помощи окружения {newtheorem}, оформляются в одном и том же стиле, что не всегда приемлемо. Пакет {amsthm}, распространяемый Американским математическим обществом, позволяет внести в это оформление некоторое разнообразие. Итак, предположим, что вы его подключили. Что нового, по сравнению с "чистым" LaTeX'ом, можно сделать?Во-первых, в этом пакете определен "вариант со звездочкой" команды \newtheorem. Именно, если определить очередной тип " теорем" с помощью \newtheorem* вместо \newtheorem, то "теоремы" указанного типа не будут нумероваться.
Во-вторых, для управления стилем оформления окружений типа "теорема" предназначена команда \theoremstyle, аргументом (единственным) которой может быть слово plain , definition или remark. Если в преамбуле дать эту команду с одним из трех допустимых аргументов, то все "теоремы", определяемые с помощью \newtheorem после этой команды \theoremstyle, будут оформлены в соответствующем стиле; чтоб определить тип теорем, оформляемый в другом стиле, надо написать еще одну команду\theoremstyle (с другим аргументом, разумеется), а уж после нее — очередную \newtheorem. Стиль plain рекомендуется для собственно теорем, предложениий и лемм, definition — для определений, remark — для замечаний3). Если в преамбуле нет ни одной команды \theoremstyle, подразумевается стиль plain.
В-третьих, в пакете amsthm предусмотрено также окружение proof, предназначенное для оформления доказательств. Это окружение автоматически ставит слово Proof в начало доказательства и автоматически же завершает доказательство символом
. Если вас не устраивает, что слово "доказательство" пишется по-английски, нужно переопределить с помощью \renewcommand команду \proofname. Если символ
нужен вам сам по себе (например, как знак завершения какого-то рассуждения, не выделенного в качестве доказательства нумерованного утверждения), можно воспользоваться командой \qed.Окружение proof допускает и необязательный аргумент: если написать, скажем,
\begin{Proof}[Доказательство основной теоремы] то вместо слова Proof появится текст, записанный нами в квадратных скобках.
![]() |
![]() |
![]() |
2) Можно (и разумно) использовать в этой ситуации команду \newcommand* (" вариант со звездочкой"). См. по этому поводу ниже.
3) В стиле plain заголовок печатается жирным шрифтом, а текст " теоремы" — курсивом, в стиле definition заголовок печатается жирным шрифтом, а текст " определения" — прямым, в стиле remark заголовок печатается курсивом, а текст "замечания" — прямым шрифтом.

Окружения типа " теорема"
Если вы пишете математический текст, то в этом тексте будет содержаться немалое количество теорем, лемм, определений и тому подобных вещей. Эти элементы математического текста желательно оформлять специальным образом. Например, формулировки теорем часто печатают, для ясности, другим шрифтом, само слово "теорема" также выделяют (третьим) шрифтом и т.д. Чтобы задать такое оформление, в исходном тексте приходится написать довольно много TeX'овских команд, и лучше не повторять этот длинный набор команд много раз, а создать заменяющее его макроопределение, что, в свою очередь, может потребовать некоторого труда (чем-то подобным мы занимались в предыдущих разделах, когда разрабатывали команду \z). Если же вы или редакция, с которой вы имеете дело, не слишком требовательны к деталям оформления, то соответствующие макросы (точнее говоря, новые окружения) легко создать из полуфабрикатов, предоставляемых нам для этих целей LaTeX'ом.Окружения, используемые в LaTeX'е для оформления фрагментов текста типа "теорема", заранее не определены. Дело в том, что количество различных типов объектов наподобие теоремы, присутствующих в одном тексте, может быть достаточно велико (предложение, утверждение, лемма, определение, замечание,...), так что LaTeX в целях экономии машинной памяти и исходя из того, что на все вкусы таких окружений все равно не напасешься, определять их предоставляет вам. Как это делать, удобнее всего разобрать на примере.
Пусть в нашем тексте присутствуют "предложения". Давайте создадим окружение {predl} таким образом, чтобы можно было, например, писать
\begin{predl} Волга впадает в Каспийское море. \end{predl} \textbf{Доказательство.} См. любую географическую карту. Для создания такого окружения используется команда \newtheorem:\newtheorem{predl}{Предложение} Как видите, команда \newtheorem имеет два обязательных аргумента: первый - название окружения, которое мы создаем, второй - заголовок нашей "теоремы".
Теперь обсудим, как работают окружения, созданные при помощи команды \newtheorem (будем называть их просто окружениями типа "теорема"). Во-первых, как вы уже заметили, формулировка печатается курсивом, а заголовок — полужирным шрифтом. Во-вторых, абзац, идущий после нашего окружения, начинается с абзацным отступом, если после закрывающей окружение команды \end идет пустая строка, и без отступа в противном случае (так что в этом отношении окружения типа "теорема" ведут себя совершенно аналогично таким окружениям, как {quote}, {itemize} и т.п.). В-третьих, окружение типа " теорема" может иметь необязательный аргумент (как обычно, в квадратных скобках). Текст, стоящий в этих квадратных скобках, будет напечатан в скобках после заголовка "теоремы" и ее номера. Обычно это используется для указания ученого, чьим именем названа "теорема":
При пользовании классами документов, предоставляемыми Американским математическим обществом, появляются дополнительные возможности влиять на оформление "теорем". См. следующий пункт. Вместе с окружением типа "теорема" автоматически создается и счетчик, хранящий его номер. Имя этого счетчика совпадает с именем окружения (так что в нашем примере счетчик называется predl); чтобы изменить представление на печати номеров наших "теорем", можно обычным образом переопределить соответствующую the-команду. Например, если мы хотим, чтобы предложения нумеровались прописными латинскими буквами, надо в преамбуле написать:
\renewcommand{\thepredl}{\Alph{predl}} " Теоремы", определяемые описанным выше способом, будут иметь сплошную нумерацию на протяжении всего документа. Как мы уже понимаем, это далеко не всегда удобно. Часто хотелось бы сделать так, чтоб, например, в каждом разделе нумерация " теорем" начиналась заново. Для таких целей предусмотрена команда \newtheorem с необязательным аргументом. Этот аргумент ставится после двух обязательных и представляет собой имя того счетчика, которому будет подчинен счетчик нашей " теоремы".
Пусть, например, в нашем тексте есть не только предложения, но и теоремы (без кавычек), и мы хотим, чтобы нумерация теорем начиналась заново в каждом разделе. Тогда можно написать в преамбуле так:
\newtheorem{theorem}{Теорема}[section] После этого можно будет писать, например, вот что:
\begin{theorem} Сумма углов треугольника равна $180^{\circ}$. \end{theorem}
Обратите внимание, что, если "теорема" определена таким образом (со счетчиком, подчиненным другому счетчику), то представление ее номера на печати изменяется: при определении\newtheorem{xyz}[abcd] (счетчик "теоремы" типа xyz подчинен счетчику abcd) команда \thexyz будет определена как
\theabcd.\arabic{xyz} (если вы хотите, чтобы нумерация "теоремы" представлялась на печати иначе, вы опять-таки можете переопределить the-команду).
Наконец, LaTeX предоставляет еще одну возможность нумерации определяемых вами "теорем". Предположим, что кроме теорем в вашем тексте есть еще и леммы, и при этом вы хотите, чтобы леммы и теоремы нумеровались совместно: теорема 2.1, теорема 2.2, затем лемма 2.3, затем теорема 2.4 и т.д. Тогда, предполагая, что окружение {theorem} уже определено, как выше, можно определить окружение {lemma} так:
\newtheorem{lemma}[theorem]{Лемма} В этом случае необязательный аргумент команды \newtheorem располагается между двумя обязательными; этот аргумент - имя того окружения типа "теорема", совместно с которым будет нумероваться определяемая вами "теорема".
Команду \newtheorem можно использовать или с одним необязательным аргументом, или с другим, но не с обоими вместе.
Организация автоматических ссылок
Вернемся последний раз к нашей команде \z. Раз она автоматически нумерует задачи, то неплохо было бы, если б пронумерованные ею задачи можно было метить командой \label и ссылаться на эти метки командой \ref ссылка на счетчик, определенный пользователем} (проблема именно в ней, поскольку команда \pageref, дающая номер страницы, сработает в любом случае). Если коротко, то решение этой проблемы таково: увеличивать на единицу значение счетчика \ctr{zadacha} надо не с помощью команды \addtocounter, которой мы пользовались до сих пор, а с помощью команды \refstepcounter, о которой уже шла речь по другому поводу в предыдущем разделе. Если мы определим команду \z так:\newcommand{\z}{\par\refstepcounter{zadacha}% \textbf{Задача \arabic{section}.\arabic{zadacha}.} } то после этого можно будет написать, например, так:
\z Решить уравнение... \z Доказать...\label{prove} \z Найти сумму... Если теперь в другом месте текста мы сошлемся на помеченную задачу так:
В задаче \ref{prove} предлагалось доказать... то будет печататься ее номер (тот самый, который LaTeX автоматически ей присвоил). Впрочем, с такими автоматическими ссылками не все будет благополучно: если помеченная нами задача была второй по счету в разделе номер 3, то называться она будет Задача 3.2, а вот ссылка на нее, сгенерированная командой \ref, будет выглядеть просто
В задаче 2 предлагалось доказать... в то время как хотелось бы автоматически получить В задаче 3.2. Иными словами, надо изменить текст, генерируемый командой \ref. Чтобы узнать, как этого добиться, нам придется познакомиться с еще одной LaTeX'овской конструкцией, связанной со счетчиками.
Мы уже знаем, что значение LaTeX'овского счетчика можно вывести на печать командами \arabic, \roman и т.п. Однако, кроме этого, с каждым счетчиком связана индивидуальная команда, определяющая, в какой форме его значение будет выводиться на печать, и именно в соответствии с этой командой печатается ссылка, сгенерированная с помощью \label и \ref. Имя этой команды получается, если поставить the перед именем счетчика.
Например, команда для вывода на печать номера раздела называется \thesection, для вывода на печать номера главы — \thechapter, команды для вывода на печать определенных нами счетчиков slave и master — \theslave и \themaster. При создании счетчика автоматически определяется и соответствующая the-команда. Именно, при создании счетчика по имени, скажем, abcd автоматически определяется команда \theabcd таким образом:
\newcommand{\theabcd}{\arabic{abcd}} В дальнейшем эту команду можно переопределять:
| \renewcommand{\theabcd}% {\Roman{abcd}} \setcounter{abcd}{14} Людовика \theabcd{} звали ``Король-Солнце''. |
\renewcommand{\thezadacha}{\thesection.\arabic{zadacha}} Если включить эту команду в преамбулу документа, то ссылки на сгенерированные нашей командой \z номера задач будут выглядеть должным образом.
В нашем переопределении команды \thezadacha мы воспользовались командой \thesection, чтобы наши макросы правильно работали с любым классом документов. Дело в том, что при разумном оформлении номер раздела, предшествующий при ссылке номеру задачи, должен печататься таким же образом, как и номер раздела при ссылке на раздел, а это в разных классах делается по-разному: в классе article, например, \thesection — это то же самое, что и \arabic{section} (иными словами, ссылка на раздел, сгенерированная командой \ref, печатает просто номер раздела), а в классе report команда \ref при печати ссылки на раздел печатает не номер раздела, а номер главы, точку и номер раздела. Поскольку мы написали \thesection, все эти тонкости будут учтены автоматически.
Приведем еще один (игрушечный) пример использования счетчиков в макроопределениях, отчасти чтобы еще раз продемонстрировать применение подчиненных счетчиков, а отчасти чтобы убедить читателя, что не боги горшки обжигают. Именно, давайте разработаем свои собственные команды для создания разделов документа, не полагаясь на \chapter, \section и т.п.
из стандартных LaTeX' овских классов. Для простоты предположим, что заголовки глав и разделов будут укладываться в одну строку, и не будем заботиться о том, насколько удачным выйдет оформление заголовков. Итак, пусть наш документ делится на главы, которые, в свою очередь, делятся на разделы. Каждую главу будем начинать с новой страницы, перед каждым разделом оставлять 1cm (если, конечно, раздел не начинает новой страницы). Наконец, предусмотрим, чтобы главы и разделы автоматически нумеровались с возможностью создания автоматических ссылок на эти номера. Команды для создания главы и раздела назовем \glava и \razdel; это будут команды, требующие одного аргумента — названия главы или раздела.
Чтобы номера глав и разделов генерировались автоматически, нам необходимо создать счетчики, содержащие эти номера. Пусть счетчик с номером главы называется glava, а счетчик с номером раздела — razdel (имена счетчиков могут совпадать с именами команд). Имея в виду, что нумерация разделов в каждой главе будет начинаться заново, напишем в преамбуле так:
\newcounter{glava} \newcounter{razdel}[glava] Теперь определим команду \glava:
\newcommand*{\glava}[1]{\clearpage % с новой страницы \vspace*{4cm}% оставить место сверху \refstepcounter{glava}% новый номер главы {\LARGE\rmfamily\bfseries\upshape % шрифт для заголовка Глава \theglava. #1% заголовок \par % кончить заголовок \vspace{5mm plus 1mm minus .5mm}% Промежуток между % заголовком и текстом }% завершить группу, внутри которой менялся шрифт }% конец макроопределения Поскольку номер главы устанавливается командой \refstepcounter, при этом будет начата заново и нумерация разделов, а на номера глав можно будет делать автоматические ссылки с помощью \label и \ref. В определении шрифта для заголовков мы в явном виде установили все четыре атрибута, чтобы быть уверенными, что он будет какой надо (если бы мы, например, не сказали \upshape, а предыдущая глава заканчивалась курсивом, определенным командой \itshape, данной вне группы, то заголовок напечатался бы жирным курсивом).
Обратите также внимание на команду \theglava. Мы воспользовались ею, поскольку не хотим на этом этапе предрешать, в каком виде номер главы будет представлен в заголовке: в виде арабской цифры, римской цифры или еще как-нибудь. Если в дальнейшем нам захочется изменить вид этого представления, то не придется менять, с риском ошибиться, длинное определение команды \glava, а будет достаточно переопределить команду \theglava. Заметьте, что промежуток между заголовком и текстом мы сделали растяжимым, чтобы помочь TeX'у найти правильное разбиение на страницы.
Определение команды \razdel можно дать, например, так:
\newcommand{\razdel}[1]{\par % завершить предыдущий абзац \pagebreak[2]\vspace{1cm plus 3mm minus .5mm} % см. ниже \refstepcounter{razdel}% новый номер раздела {\Large\rmfamily\bfseries\upshape % шрифт для заголовка \therazdel{} #1% заголовок \par % закончить заголовок }% завершить группу, внутри которой менялся шрифт \nopagebreak % чтобы не оторвать текст от % заголовка \vspace{2mm plus 1mm}% Промежуток между заголовком % и текстом }% конец макроопределения Пояснений тут требует команда \pagebreak[2]. Мы включили ее в макроопределение, чтобы поменьше разделов начиналось внизу страницы. В самом деле, команда \pagebreak[2] предлагает TeX'у начать в этом месте новую страницу; если так и будет сделано, то дополнительный вертикальный промежуток, созданный командой \vspace, пропадет, и заголовок раздела начнется с самого верха новой страницы; если же разрыва страницы все-таки не произойдет, то перед заголовком раздела будет вертикальный промежуток в один сантиметр (обладающий указанными в макроопределении растяжимостью и сжимаемостью).
Нам осталось только задать вид, в котором будут представляться на печати номера глав и разделов. Иными словами, надо переопределить должным образом команды \theglava и \therazdel (в момент создания счетчиков они, как мы помним, были автоматически определены таким образом, что \theglava и \therazdel — номера главы и раздела, набранные арабскими цифрами).Предположим, мы решили, что номера глав будут печататься римскими цифрами, а номер второго раздела четвертой главы будет иметь вид IV-2. Тогда требуемые переопределения таковы:
\renewcommand{\theglava}{\Roman{glava}} \renewcommand{\therazdel}{\theglava--\arabic{razdel}} Еще одно замечание: точки после номера главы мы включили в определение команды \glava, а не \theglava, чтобы можно было пользоваться автоматическими ссылками: если бы \theglava определялось как
\Roman{glava}. то исходный текст
в главе \ref{metka} мы пишем... дал бы на печати
в главе IV. мы пишем что нелепо.
По сравнению с макроопределениями, реально используемыми в стандартных классах LaTeX'а, мы многого не предусмотрели: не позаботились ни о колонтитулах, ни об автоматически генерируемом оглавлении, внешний вид заголовков оставляет желать лучшего и т.д. Прочитав лекцию 9, вы сможете усовершенствовать эти определения.
Отношение подчинения между счетчиками
Команда \z, как мы ее определили ранее, нумерует задачи автоматически, но при этом нумерация получается " сплошной". Часто, однако, требуется, чтобы в каждом разделе документа нумерация задач начиналась заново, так что шестая задача в разделе с номером 3 была озаглавлена Задача 3.6, а первая задача в разделе с номером 4 — Задача 4.1. Сейчас мы узнаем, как этого добиться.Выше мы упоминали, что к моменту начала обработки LaTeX'ом нашего текста некоторые счетчики уже определены. В частности, это счетчики, содержащие номера текущих разделов документа. Их имена совпадают с именами команд, генерирующих эти разделы: chapter (если классом предусмотрено разбиение на главы), section, subsection и т.д. При каждом исполнении, например, команды \section значение счетчика section увеличивается на 1, и значение этого счетчика в каждый момент равно номеру текущего раздела. Поэтому, если в определении команды \z написать
\arabic{section}.\arabic{zadacha}. то перед номером задачи будет печататься номер текущего раздела и точка.
Но как же все-таки сделать, чтобы в каждом разделе нумерация задач начиналась заново? Можно, конечно, в начале каждого раздела присваивать счетчику zadacha значение
с помощью \setcounter, но это некрасиво и ненадежно (а вдруг забудем?). Лучше сразу определить счетчик zadacha так:\newcounter{zadacha}[section] При этом счетчик zadacha будет подчинен счетчику section: всякий раз, когда значение счетчика section увеличивается на единицу командой \section, значение счетчика zadacha будет устанавливаться в нуль, и тем самым счет задач будет в каждом разделе начинаться заново. Одновременно надо в очередной раз исправить определение команды \z и написать
\newcommand{\z}{\par\addtocounter{zadacha}{1}% \textbf{Задача \arabic{section}.\arabic{zadacha}.} } При этом нумерация задач будет начинаться заново в каждом разделе, и вторая задача третьего раздела будет иметь номер 3.2.
Теперь сообщим точные правила создания счетчика, подчиненного другому счетчику. Они просты: команда \newcounter может принимать один необязательный аргумент (после обязательного) — имя того счетчика, которому будет подчинен определяемый нами счетчик.
Параметры со значением длины
Наряду со счетчиками — переменными с целочисленными значениями, — при создании собственных макроопределений возникает нужда и в переменных, значениями которых являются длины. Например, в предыдущем разделе мы, разрабатывая команду \razdel, в явном виде задали промежуток между заголовком раздела и остальным текстом. Если этот промежуток нам почему-либо захочется изменить, то придется снова залезать в определение команды \razdel. Было бы удобнее, если бы в нашем распоряжении был параметр под названием, скажем, \otstup, так что можно было бы в определении команды \razdel написать\vspace{\otstup} и потом отдельно написать, допустим,
\otstup=1cm plus 3mm minus .5mm Правда, в богатом наборе TeX'овских и LaTeX'овских параметров требуемого нам параметра \otstup нет, но это не страшно, поскольку его можно создать. Для этого используется команда \newlength:
\newlength{\otstup} После того, как вы (допустим, в преамбуле) дали эту команду, будет определен новый параметр со значением длины; его можно будет обычным образом использовать в аргументах команд наподобие \vspace, и ему можно будет обычным образом присваивать значения.
Теперь — точные правила. Команда \newlength имеет один обязательный аргумент — имя команды, обозначающей определяемый вами параметр. Это имя должно подчиняться обычным правилам для TeX'овских команд (backslash, после которого следует либо одна не-буква, либо последовательность букв). Если это имя уже занято, LaTeX выдаст сообщение об ошибке. Определение нового параметра, совершаемое командой \newlength, является "глобальным": даже если эта команда была дана внутри группы, TeX будет помнить о существовании этого параметра и по выходе из группы. По этой причине разумное место для команды \newlength — преамбула.
Определенный нами параметр со значением длины приобретает такой же статус, как уже существующие TeX'овские и LaTeX'овские параметры (\parindent, \textwidth и другие). Рассмотрим, что можно делать с этими параметрами.
Во-первых, параметрам со значением длины можно присваивать значения.
Делается это точно так же, как это объяснялось ранее на примере параметра \parindent: для присваивания значения надо написать имя параметра, знак равенства, а после знака равенства — величину присваиваемой длины. Пробелы после указания единицы длины TeX'ом игнорируются (скорее всего, вы будете присваивать значения параметрам в преамбуле документа или между абзацами, где лишние пробелы никого не волнуют). Длина должна быть выражена в единицах, воспринимаемых TeX'ом. Даже если вы присваиваете нулевую длину, какая-то единица длины должна быть явно указана (например, 0pt). Кроме того, можно воспользоваться LaTeX'овской командой \setlength, имеющей два обязательных аргумента: первый — имя параметра, второй — значение длины, присваиваемое этому параметру. Таким образом, команды
\parindent=1.5em и
\setlength{\parindent}{1.5em} равносильны. Наконец, присваивания, сделанные внутри группы, забываются по выходе из этой группы.
В предыдущем абзаце мы умолчали об одной возможной неприятности. Дело в том, что если после команды присваивания, не использующей \setlength, следует (пусть даже после пробела) слово plus или minus, то TeX, скорее всего, выдаст сообщение об ошибке, поскольку решит, что длина должна иметь, помимо " естественного размера", еще и plus- или minus-компоненту. Если вы пишете текст на русском языке, вероятность такого стечения обстоятельств ничтожна, но тем не менее забывать о такой опасности не следует, особенно если команда присваивания входит в макроопределение: вы же не знаете заранее, в какое место может попасть новый макрос. Чтобы застраховаться от этой неприятности раз и навсегда, пользуйтесь командой \setlength, хоть это и длиннее.
Параметры со значением длины можно использовать всюду, где в аргументе LaTeX'овской команды требуется указать размер. Пусть, например, в преамбуле документа написано
\newlength{\primer} Тогда посмотрите на следующий пример:
\primer=10mm 9\hspace{\primer}9
{\primer=20mm 8\hspace{\primer}8}
9\hspace{\primer}9
Обратите внимание, что, если присваивание параметру нового значения происходило внутри группы, то по выходе из группы новое значение забывается, а прежнее — восстанавливается.Параметры со значением длины можно указывать с коэффициентом - положительной или отрицательной десятичной дробью (можно использовать как десятичную точку, так и десятичную запятую). Например, если значение параметра \primer равно
, то команда \hspace{2.71\primer} сделает пробел длиной
.Параметры со значением длины (возможно, с числовыми коэффициентами) могут также стоять в правой части оператора присваивания (или во втором аргументе команды \setlength):
\primer=1.45\parindent \setlength{\primer}{.45\tabcolsep} Можно также прибавлять длину к значению параметра: если значение параметра \abcd равно
, то после выполнения команды\addtolength{\abcd}{"$y$\verb"} где
- длина, значение параметра "\abcd" станет равно
. В качестве
в этой команде может использоваться как явно указанная длина (например, 1.2in), так и параметр со значением длины (возможно, с числовым коэффициентом). Наконец, LaTeX предоставляет полезную команду\settowidth{"\textit{параметр}\verb"}{"\textit{текст}\verb"} которая присваивает параметру значение, равное ширине текста. Вот пример:
\settowidth{\primer}{\Large слово } {\Large слово }слово
\hspace{\primer}слово (обратите внимание, что у нас получилось выравнивание без помощи {tabbing} или {tabular}).Существуют также команды \settoheight и \settodepth, аналогичные \settowidth. Команда \settoheight присваивает параметру значение, равное максимальному расстоянию, на которое текст возвышается над строкой (точнее, над ее базисной линией). \settodepth присваивает параметру значение, равное максимальному расстоянию, на которое текст опускается ниже базисной линии.
Ранее у нас шла речь о том, что некоторые используемые в TeX'е длины могут обладать растяжимостью или сжимаемостью. Параметрам, созданным с помощью команды \newlength, также можно присваивать значения, содержащие plus и/или minus -компоненту. Если, например, мы хотим, чтобы параметр \primer имел естественный размер
, растяжимость
и сжимаемость в один пункт, то можно написать так:\setlength{\primer}{2cm plus 4mm minus 1pt}
Счетчики, которые уже определены
Мы уже мельком упоминали, что при начале работы LaTeX'а некоторые счетчики определены сразу. Например, это те счетчики, которые перечислены выше. Кроме того, заранее определен счетчик page, отвечающий за нумерацию страниц, а также счетчик footnote, ответственный за нумерацию сносок. Нумерацией плавающих иллюстраций и таблиц занимаются счетчики, называемые figure и table. В одном из разделов перечислены все эти заранее определенные счетчики и указано, каким счетчикам они подчинены (это иногда зависит от класса документа).Для каждого из этих счетчиков вы имеете возможность переопределить соответствующую the - команду и тем самым изменить стиль оформления документа. Например, вы можете сделать так, чтобы главы нумеровались римскими цифрами:
\renewcommand{\thechapter}{\Roman{chapter}} Если вы хотите, чтоб сноски нумеровались не цифрами, а латинскими буквами, то можно в преамбуле написать:
\renewcommand{\thefootnote}{\alph{footnote}}
Счетчики
Теперь мы научимся самостоятельно организовывать автоматическую нумерацию, подобно тому, как LaTeX автоматически нумерует главы, страницы, формулы и т.д. Для этого нам надо познакомиться с понятием счетчика. Счетчик — это специальная переменная, значение которой является целым числом. Ей можно присваивать различные значения, выводить значение счетчика на печать, а также организовывать с помощью счетчиков автоматическую генерацию ссылок. Рассмотрим последовательно, как все это делается.Создание новых команд
Средства LaTeX'а, описываемые в этой лекции, позволяют сократить число нажатий на клавиши при наборе сложных текстов. Именно, мы расскажем, как создавать новые команды (или, если угодно, сокращенные обозначения), заменяющие собой длинные фрагменты из текста и TeX'овских команд. Официально такие новые команды называются макроопределениями, а в разговорной речи — макросами.Создание счетчиков и простейшие операции с ними
Каждый LaTeX'овский счетчик имеет свое имя — последовательность букв (без знака \ ). Прописные и строчные буквы в именах счетчиков различаются; если в используемой вами русификации русские буквы нельзя употреблять в именах команд, то нельзя их употреблять и в именах счетчиков. Чтобы можно было работать со счетчиком, надо его создать командой \newcounter, имеющей один обязательный аргумент — имя, которое вы придумали для счетчика. Например, команда\newcounter{abcd} создает новый счетчик с именем abcd. Если имя, которое вы придумали для счетчика, уже занято (так может случиться, даже если команда \newcounter в вашем тексте всего одна: некоторые счетчики в LaTeX'е уже определены в момент начала обработки вашего текста), то LaTeX создавать счетчик с таким именем откажется и выдаст сообщение об ошибке.
В отличие от многих других LaTeX'овских команд, команда для создания нового счетчика является "глобальной": даже если она давалась внутри группы, LaTeX не забудет о существовании определенного ею счетчика и после выхода из этой группы. Это отличает \newcounter от \newcommand и \renewcommand.
Что же можно делать со счетчиком? Во-первых, можно менять его численное значение (на программистском жаргоне: "присваивать счетчику различные значения"). При создании счетчика его значение устанавливается в
; чтобы установить какое-то другое значение, используется команда \setcounter, имеющая два обязательных аргумента: первый — имя счетчика, второй — значение, которое счетчику присваивается. Если, например, написать\setcounter{abcd}{1998} то после того, как TeX прочтет эту команду, значение счетчика abcd установится равным
. Значение, которое присваивается счетчику, может быть и отрицательным, но обязано быть целым.Другой способ изменить значение счетчика — это прибавить к нему какое-то целое число. Для этого используется команда \addtocounter. Эта команда также имеет два обязательных аргумента: первый — имя счетчика, второй — число, которое прибавляется к счетчику.
Например, после выполнения команд
\setcounter{abcd}{100} \addtocounter{abcd}{-27} значением счетчика abcd будет число
.Команды, изменяющие значение счетчика, также являются " глобальными": если с их помощью внутри группы значение счетчика было изменено, то по выходе из группы его прежнее значение не восстановится.
Перейдем к самому главному: как вывести значение счетчика на печать. Самый распространенный случай — печать значения счетчика обычными (" арабскими") цифрами. Для этого используется команда \arabic:
| \setcounter{abcd}{40} Шел по улице отряд - \arabic{abcd} мальчиков подряд. |
Чтобы напечатать значение счетчика римскими цифрами, надо воспользоваться командой \Roman (если мы хотим, чтобы римские цифры записывались прописными латинскими буквами) или \roman (чтобы записать римскую цифру строчными латинскими буквами):
| \setcounter{abcd}{14} Людовика \Roman{abcd} звали ``Король-Солнце''. |
Можно, наконец, напечатать букву латинского алфавита, порядковый номер которой равен значению счетчика. Для этого используются команды \alph(для печати строчной буквы) и \Alph(для печати прописной буквы):
| \setcounter{abcd}{7} Наконец я узнаю, какая буква стоит в латинском алфавите на седьмом месте! Вот она: \alph{abcd}. |
В LaTeX'е отсутствует команда, позволяющая напечатать русскую букву с номером, равным значению счетчика. Средствами TeX'а такую команду нетрудно создать.
Наконец, можно напечатать один из девяти символов, используемых иногда в англоязычных странах для обозначения последовательных сносок (вместо цифр).
Для этого используется команда \fnsymbol, применять которую можно только внутри формул:
| \setcounter{abcd}{0} Для сносок в Англии применяют такие символы: $\addtocounter{abcd}{1}\fnsymbol{abcd}$, $\addtocounter{abcd}{1}\fnsymbol{abcd}$, $\addtocounter{abcd}{1}\fnsymbol{abcd}$, а дальше попробуйте сами. |
В командах для изменения значений счетчиков можно вместо явного указания чисел использовать значения других счетчиков, для чего употребляется команда \value. Например, в результате выполнения команд
\newcounter{efgh} \setcounter{abcd}{10} \setcounter{efgh}{100} \addtocounter{efgh}{-\value{abcd}} значение счетчика efgh станет равно
. Можно даже писать, например,\setcounter{efgh}{1000} \tolerance=\value{efgh} но большого смысла в таких трюках, как правило, нет.
Применим наши познания к делу. Ранее мы обещали вам так усовершенствовать макрос \z, начинающий новый абзац и печатающий жирным шрифтом слово "Задача", чтоб он еще и автоматически нумеровал эти задачи, так, что можно было бы просто писать в исходном тексте
\z Найти сумму... \z Решить уравнение... \z Поезд вышел из пункта А... и при этом знать, что номера LaTeX проставит сам. Теперь мы в состоянии решить эту проблему. Во-первых, для этого надо создать счетчик, значение которого в каждый момент будет равно номеру последней обработанной задачи; во-вторых, в определении команды \z надо предусмотреть, чтобы всякий раз значение этого счетчика увеличивалось на единицу, а затем печаталось в качестве номера задачи. В качестве имени счетчика выберем бесхитростное "zadacha":
\newcounter{zadacha} (напомним, что при выполнении этой команды счетчику zadacha будет присвоено значение
). Теперь модифицируем определение макроса \z так:\newcommand{\z}{\par\addtocounter{zadacha}{1}% \textbf{Задача \arabic{zadacha}.} } Напомним, что команда \par означает "завершить предыдущий абзац, если он еще не был завершен"; без нее можно обойтись, если мы будем ставить команду \z только после пустой строки.Знак процента мы поставили, чтобы убрать лишний пробел, порождаемый концом строки. Теперь при первом исполнении команды \z значение счетчика zadacha станет равно
и будет напечатано "Задача 1.", при втором исполнении этой команды значение счетчика станет равно уже
и напечатается "Задача 2." ... и т.д., что нам и нужно!Работа в системе LaTeX
Бесконечно сжимаемые интервалы
Мы уже два раза упомянули про клей с бесконечной сжимаемостью. Настало время объяснить, какими командами его создавать. Из многих способов укажем один, наиболее часто встречающийся. Команда \hss вставляет в строку клей, естественный размер которого равен нулю, и который при этом обладает бесконечной растяжимостью (подобно \hfil) и бесконечной сжимаемостью. Типичное применение такого "бесконечно сжимаемого" клея — создавать блоки, ширина которых меньше реального размера текста, или блоки с наложением текстов. В самом деле, посмотрите на такой пример:
\hbox to 50pt {Кот\hss Пес} \hbox{Кот\hss Пес} \hbox to 30pt {Кот\hss Пес} \hbox to 15pt {Кот\hss Пес} \hbox to 0pt {Кот\hss Пес} Если мы просим сделать ширину блока больше естественной, команда \hss действует так же, как и \hfil; когда мы создаем блок с естественной шириной, слова "Кот" и " Пес" стоят вплотную друг к другу (естественная ширина клея, созданного \hss, равна нулю). Интересные вещи начинаются, когда мы просим, чтобы ширина была
(что меньше естественной). Интервал между словами при этом приходится уменьшить; поскольку его естественный размер равен нулю, то после уменьшения интервал становится отрицательным, т. е. слово " пес" сдвигается влево (накладываясь на слово "Кот"), причем сдвигается так, чтобы ширина блока (т. е. расстояние от начала слова "Кот" до конца слова "Пес") равнялась требуемым
. Когда же мы наконец просим, чтобы ширина блока равнялась нулю, слову "Пес" приходится сдвинуться влево настолько, чтобы расстояние от его конца до начала слова "Кот" равнялось нулю - иными словами, кот и пес меняются местами! Заметим, кстати, что точка отсчета всех наших блоков совпадает с точкой отсчета буквы К из слова "Кот".Еще один пример использования \hss: как создать блок, точка отсчета которого будет находиться в правом, а не левом конце текста (мы столкнулись с этой проблемой в лекции 5)? Ответ: надо сказать
\hbox to 0pt{\hss текст} и все будет в порядке. В самом деле, \ текст имеет ширину, отличную от нуля; чтобы блок имел в итоге нулевую ширину, приходится "уменьшать" тот интервал, где стоит \hss; так как интервал уже нулевой, то это уменьшение сводится к тому, что текст сдвигается влево до тех пор, пока расстояние между его концом и точкой отсчета не станет равным нулю - а это и означает, что правый конец текста стал его точкой отсчета. В лекции 5 мы сказали, что эта проблема решается с помощью TeX'овской команды \llap, а теперь мы видим, как ее можно определить:
\newcommand{\llap}[1]{\hbox to 0pt{\hss #1}} Кстати говоря, именно так она и определяется.
А если сказать
\hbox to 0pt{текст \hss} то что, спрашивается, будет? Ответ: на сей раз будет уменьшаться интервал после текста; стало быть, сам текст никуда не сдвинется, но после него будет сделан такой "отрицательный пробел", чтобы суммарная ширина равнялась нулю. Иными словами, TeX будет просто считать, что ширина блока равняется нулю - мы обманули TeX, убедив его, что наш текст не занимает места по горизонтали! Для такого обмана (к нему приходится прибегать нередко) предусмотрена специальная TeX'овская команда \rlap, определяемая так:
\newcommand{\rlap}[1]{\hbox to 0pt{#1\hss}} Все это также напоминает ситуацию с командой \lefteqn — и напоминает не случайно, поскольку эта команда определяется фактически так:
\newcommand{\lefteqn}[1]{\rlap{$\displaystyle #1$\hss}}
Блоки из абзацев
Если необходимо создать блок, в котором размещается сверстанный TeX'ом абзац текста, то можно воспользоваться командой \parbox. У этой команды два обязательных аргумента: первый — длина строк в получаемом абзаце, второй — собственно текст. Например, такой текст
![]() | В строку\qquad \parbox{4cm}{вставили целый абзац текста, сверстанного по всем TeX'овским правилам. После этого продолжается}\qquad прерванная строка. |

получается из такого исходного текста:
$$ \int_a^b f'(x)\,dx=f(b)-f(a)\qquad \parbox{4cm}{для всех функций f, производная которых интегрируема по Риману} $$ Если дать команду \parbox с необязательным аргументом} с необязательным аргументом, то создаваемый ею блок можно расположить относительно строки и по-иному: чтобы вровень с остальной строкой шла самая верхняя строка абзаца (для этого нужен аргумент t) или самая нижняя (аргумент b); можно также указать аргумент c — тогда блок будет расположен по центру, так же, как если бы необязательного аргумента вообще не было. Необязательный аргумент у этой команды должен идти перед обязательными.
Во втором обязательном аргументе команды \parbox, задающем текст, может присутствовать всё то же, что в обычном тексте, в том числе команды для вертикальных пробелов наподобие \vspace, пустые строки, разделяющие абзацы, выключные формулы и т.п. Абзацы, создаваемые командой \parbox, по умолчанию делаются без абзацного отступа и в режиме \sloppy. Если вы хотите чего-то другого, можно прямо внутри аргумента команды \parbox установить нужное вам значение абзацного отступа, параметра \tolerance и т.п.
Можно также указать LaTeX'у высоту, которую должен иметь блок, полученный в результате применения команды \parbox. Для этого используется второй необязательный аргумент, идущий непосредственно после первого.
Наряду с явным указанием размера, можно воспользоваться командой \height, обозначающей " естественную" высоту текста, а также командой \totalheight (высота плюс глубина).
Наконец, в команде \parbox можно указать, как именно должен быть расположен текст внутри блока. Для этого используется третий необязательный аргумент, следующий непосредственно после второго. Этот аргумент — буква t, b, c или s. Буква t означает " сверху", b — "снизу", c — "по центру". Если третий необязательный аргумент не указан, то по умолчанию считается, что он совпадает с первым. Если же третьим необязательным аргументом является s, это означает, что текст будет растянут или ужат в соответствии с размером, указанным во втором необязательном аргументе. Если вы не позаботитесь о специальных командах, обеспечивающих такую растяжимость или сжимаемость, то получите сообщение об Overfullе или Underfullе.
В следующем примере блоки, созданные командой \parbox, для наглядности взяты в рамку (с помощью \fbox):

\fbox{% \parbox[b][1.3\height]{2cm}{% Мы едем, едем, едем в далекие края.}}\qquad \fbox{% \parbox[t][1.3\height]{2cm}{% Мы едем, едем, едем в далекие края.}} Команды \height и \totalheight, так же как и \depth, можно использовать только в необязательном аргументе команды \parbox (а также \framebox или \makebox).
Наряду с \parbox, существует еще один способ создать блок из абзацев. Именно, существует окружение {minipage} (" министраница"), генерирующее блок из текста, расположенного внутри этого окружения; блок состоит из абзацев, ширина которых задается в обязательном аргументе окружения {minipage} (так же, как в команде \parbox); перед обязательным аргументом этого окружения может стоять необязательный: буква t, b или c, причем смысл этого аргумента опять-таки такой же, как в команде \parbox. Основное отличие minipage от \parbox в том, что к тексту внутри этого окружения можно делать сноски с помощью команды \footnote, причем текст сноски появляется не внизу страницы, а внизу блока, генерируемого окружением minipage.При наборе книги, которую вы читаете, это окружение использовалось для печати примеров.
Блоки из строки
С одной командой для генерации блоков мы уже знакомы: это команда \mbox. Эта команда создает блок из текста, набираемого в одну строку. Полученный блок рассматривается TeX'ом как одна буква:
![]() | Проказница мартышка, \mbox{осел, козел} и косолапый мишка\ldots |
Теперь, когда мы знаем, что такое TeX'овские блоки, можно признаться, что окружения {picture},{tabular} и {array} тоже генерируют блоки, и именно поэтому создаваемый ими текст воспринимается TeX'ом как одна большая буква.
В аргументе команды \mbox может присутствовать все то же, что может быть в обычном тексте в пределах одной строки: математические формулы, команды смены шрифта или присваивания значений каким-то параметрам, команды для генерации блоков (например, тот же \mbox, или даже окружения {picture} или {array}) и т.д. Запрещены в аргументе команды \mbox пустые строки или команды \par, выключные математические формулы, окружения, определяющие абзацы специального вида (скажем, {itemize} или {center}), команда \\ и тому подобные вещи, "не вписывающиеся в строку". Если в аргументе команды \mbox происходит смена шрифта, изменение каких-то параметров или определение команд, то по выходе из блока все эти изменения забываются, поскольку фигурные скобки, ограничивающие аргумент команды \mbox, ограничивают также и группу (" глобальные" команды вроде \setcounter сохраняют свое действие и по выходе из блока).
Блок, создаваемый командой \mbox, имеет ширину, равную " естественной" длине строки текста, являющегося его аргументом. Можно также создать блок из строки текста, ширина которого отлична от ее естественной длины.
Для этого используется команда \makebox. Эта команда имеет один обязательный аргумент, имеющий такой же смысл, как аргумент команды \mbox, и, кроме того, необязательный аргумент — ширину блока, порождаемого командой:
![]() | Туда \makebox[5em]{и} обратно. |

Для ясности мы использовали в этом примере крупный шрифт. А вот как такой "выпирающий за края" блок взаимодействует с окружающим текстом:
![]() | текст\makebox[1.5em]{123456}текст |
![]() | \parindent=0pt \makebox[10em][r]{текст}\\ \makebox[10em][r]{екст}\\ \makebox[10em][r]{кст}\\ \makebox[10em][c]{текст}\\ \makebox[10em][l]{текст} |
Кстати, обратите внимание, что у нас получилась верстка с выравниванием без помощи таких вещей, как tabbing или tabular.
У команды \makebox значение ширины блока можно установить равным нулю. Если при этом присутствует необязательный аргумент l, то получится блок нулевой ширины, а текст будет выходить за его пределы вправо (и, стало быть, наложится на последующий текст в строке, если таковой присутствует); если присутствует необязательный аргумент r, то текст будет выходить влево за пределы блока (и тем самым накладываться на предшествующий текст):
![]() | текст\makebox[0pt][l]{???}текст\\ текст\makebox[0pt][r]{???}текст\\ |
До сих пор мы задавали ширину блока в команде \mbox в явном виде. Можно, кроме того, выразить эту ширину через " естественную" ширину текста. Для этого служит команда \width. Вот, например, как сделать, чтобы чтобы ширина блока, получаемого с помощью \makebox, была на 30% больше естественной:
![]() | \makebox{скоросшиватель}\\[2pt] \makebox[1.3\width][r]{скоросшиватель} |
Блоковые переменные
В тех случаях, когда один и тот же фрагмент текста (например, фрагмент псевдорисунка, являющийся аргументом команды \multiput) используется многократно, бывает полезно сверстать этот фрагмент раз и навсегда, а затем просто повторять его: это сэкономит как количество нажатий на клавиши, так и машинное время. Использование макроопределения в данном случае времени не сэкономит: если мы напишем, например,\newcommand{\abcd}{\parbox{6cm}% {Когда в товарищах согласья нет, на лад их дело не пойдет, и выйдет из него не дело — только м\'ука.}} то при каждой обработке команды \abcd это макроопределение будет заново развертываться, и TeX будет заново находить переносы и места разрыва строк в одном и том же отрывке из " Лебедя, рака и щуки". Чтобы не заставлять TeX много раз повторять идентичные операции по верстке текста, надо сделать так. Во-первых, определим "блоковую переменную", которая будет хранить сверстанный фрагмент текста. Это делается с помощью команды \newsavebox. Единственный аргумент этой команды - имя новой блоковой переменной, которое должно удовлетворять тем же условиям, что любые имена TeX'овских команд: либо backslash с одной не-буквой, либо backslash с последовательностью букв. Имя новой блоковой переменной не должно совпадать с именем уже существующей команды или переменной длины (если вы попытаетесь нарушить это правило, LaTeX выдаст сообщение об ошибке). Во-вторых, присвоим нашей блоковой переменной значение — блок, и будем в дальнейшем этот блок использовать.
Давайте приведем пример того, как можно этим пользоваться. Выше мы приводили пример псевдорисунка — наклонной решетки, и там же мы отметили, что экономнее было бы создать наклонный отрезок раз и навсегда, а затем только повторять его. Теперь мы можем объяснить, как это сделать. Создадим блоковую переменную под названием \blok, написав в преамбуле следующее:
\newsavebox{\blok} Теперь сверстаем тот текст, который будет храниться в нашей блоковой переменной, и запишем его в эту переменную.
Для этих целей используется команда \sbox с двумя обязательными аргументами: первый — имя блоковой переменной, второй — текст, который в нее записывается. Итак:
\sbox{\blok}{\line(1,5){10}} А теперь можно воспользоваться нашей блоковой переменной. Чтобы напечатать содержимое блоковой переменной, используется команда \usebox с одним обязательным аргументом — именем переменной. В нашем случае мы используем блоковую переменную в аргументе команды \multiput:

\begin{picture}(100,50) \multiput(0,0)(10,0){10}% {\usebox{\blok}} \multiput(0,0)(2,10){6}% {\line(1,0){90}} \end{picture} Можно было бы сделать аналогичный трюк и с горизонтальными линейками решетки, но большой экономии это не даст: горизонтальные и вертикальные линейки на псевдорисунках LaTeX не собирает из отдельных символов, а создает "в один присест" с помощью команд \hrule и \vrule, что и так достаточно быстро.
Текст, присутствующий в аргументе команды \sbox, будет сверстан в виде блока так, как если бы этот текст был передан в качестве аргумента команде \hbox или \mbox. Тем самым в аргументе \sbox может быть все то же, что может присутствовать в аргументе \hbox или \mbox. Если команда \sbox была дана внутри группы, то по выходе из этой группы содержимое блоковой переменной забудется.
Наряду с командой \sbox есть еще и команда \savebox, относящаяся к ней примерно так же, как \makebox относится к \mbox: между первым и вторым обязательным аргументами команды \savebox могут присутствовать необязательные аргументы, имеющие тот же смысл и записывающиеся так же, как необязательные аргументы команды \makebox. Например,
\savebox{\пример}[4cm][r]{Слово} даст тот же результат, что и
\sbox{\пример}{\makebox[4cm][r]{Слово}} Наряду с LaTeX'овской командой \usebox есть похожая на нее, но не идентичная, TeX'овская команда \copy. Используется она так:
![]() | \sbox{\blok}{Рак} Однажды Лебедь, \copy\blok{} и Щука\ldots |
Эту разницу следует иметь в виду, когда вы работаете с командой \leaders: выгоднее сверстать блок один раз и записать его в блоковую переменную, а затем в команде \leaders писать просто \copy. Пример:
![]() | \savebox{\blok}[1cm]{$*$} \hbox to \textwidth {\leaders\copy\blok\hfil} |
Для тех, кто будет читать следующую лекцию, скажем еще об одной конструкции, связанной с блоковыми переменными. Именно, если \blok — блоковая переменная, то можно " измерить" ширину, высоту и глубину блока, записанного в этой переменной, с помощью TeX'овских команд \wd, \ht и \dp. Точнее говоря, сочетания \wd\blok, \ht\blok и \dp\blok можно использовать в точности так же, как TeX'овские параметры со значением длины, значения которых равны ширине, высоте и глубине блока:
![]() | \sbox{\blok}{12345}\copy\blok\\ \hbox to \wd\blok{\hfil 345}\\ \hbox to \wd\blok{\hfil 45} |
![]() |
![]() |
![]() |
2) Пустых строк, однако, быть не должно.
3) Если мы заставим такую пружину растянуться или сжаться больше, чем сказано, то получим сообщение "Underfull \hbox" или "Overfull \hbox"; см.\ ниже.

Еще раз о линейках
В аргументе команды \hbox может присутствовать и TeX'овская команда \vrule. Ее ценность в том, что она автоматически создает линейку, высота и глубина которой равна высоте и глубине объемлющего блока (ширина этой линейки будет по умолчанию равна
пункта). Как объяснялось в разд. 3.10 , можно задать в явном виде ширину линейки с помощью ключевого слова width, высоту - с помощью ключевого слова height, а также (о чем в лекции 3 не говорилось) глубину с помощью ключевого слова depth (эти три ключевых слова могут следовать после \vrule в произвольном порядке). Приведем один пример использования \vrule внутри \hbox.
Предыдущий абзац в исходном тексте выглядел так:
\begin{flushleft} \hbox{% \vrule\hspace{.5em}\parbox{.9\textwidth}% {Иногда используется следующий способ выделения текста: абзац набирается с некоторым отступом от левого поля, а слева от него, вровень с левым полем, печатается вертикальная линейка.}} \end{flushleft} Этот текст нуждается в некоторых пояснениях. Во-первых, в последней строке первая из фигурных скобок закрывает аргумент команды \parbox, а вторая - \hbox. Во-вторых, мы воспользовались окружением \flushleft, чтобы LaTeX сам позаботился о разумных отступах до и после абзаца. Параметр \textwidth означает, как мы помним, ширину страницы. Теперь рассмотрим, что присутствует внутри \hbox. Сначала там идет линейка, затем отступ на
, и затем — огромная " буква", созданная командой \parbox. Согласно общему правилу, высота и глубина линейки, заданной командой \vrule, равна высоте и глубине объемлющего блока, а они в нашем случае совпадают с высотой и глубиной "огромной буквы" (ведь кроме нее, другого текста в нашем \hbox нет). Тем самым линейка получается как раз нужных размеров, что и требовалось!Обратите еще внимание на знак процента после \hbox — без него получилось бы, что аргумент команды \hbox начинается с пробела, соответственно и линейка начиналась бы не с начала, а после пробела .
На самом деле в предыдущем примере было бы лучше, если бы правый край выделенного абзаца шел вровень с правым краем остального текста. Чтобы добиться этого, надо первый аргумент команды \parbox не взять с потолка, а вычислить. Для этого нам понадобятся переменные со значением длины. Предполагая, что мы определили с помощью \newlength переменные \shirina и \raznost, сделаем вот что:
\begin{flushleft} \shirina=\textwidth \settowidth{\raznost}{\vrule\hspace{.5em}} \addtolength{\shirina}{-\raznost} \noindent\hbox{% \vrule\hspace{.5em}\parbox{\shirina}% {Иногда используется ... ... линейка.}} \end{flushleft} Мы воспользовались командой \settowidth, чтобы найти размер, который занимает линейка вместе с пробелом. Кстати, если просто написать \hbox{\vrule\hspace{.5em}}, то на печати мы ничего не увидим (внутри \hbox'а никакого текста нет, так что высота и глубина линейки равна нулю и она тем самым невидима); однако же эта команда создаст пробел, величина которого равна 0.4pt плюс 0.5em. Заключительное замечание: поскольку {flushright}, как и всякое окружение, ограничивает группу, все наши манипуляции с параметрами \shirina и "\raznost" забудутся по выходе из этого окружения.
Клей
Выше мы рассмотрели команды \hfil и \hfill, которые действуют подобно вставленным в строку пружинам. Можно вставлять в строку пружины с самыми разнообразными свойствами, указав LaTeX'овской команде \hspace аргумент, содержащий plus- или minus-компоненту (в разд.3.9.4 мы упоминали об этой возможности, но в тот момент у нас еще не было серьезных примеров). Именно, если вы скажете\hspace{"$x$ plus $y$ minus $z$"} где
,
и
- длины, то вставите в текст пружину, которая в свободном состоянии имеет длину
, может увеличивать свою длину на
и уменьшать свою длину на
(в отличие от пружин, встречающихся в жизни, может выполняться неравенство
, и, того пуще, длины
и
могут быть отрицательными, но мы не будем объяснять, как TeX поведет себя в столь странной ситуации).3)
Здесь plus и minus - это, как мы помним, очередные ключевые слова TeX'а, наподобие to, width и height. Если мы создаем блок естественной ширины, то команда \hspace с таким аргументом создаст пробел размером
; если же мы в команде \hbox попросим TeX создать блок, ширина которого отличается от естественной, то для достижения требуемой ширины размеры пробелов будут изменяться. В TeXнической терминологии эти "пружины" называются клеем (Дональд Кнут отмечает, что название "клей" неудачно, но менять его поздно, поскольку оно, по его словам, "уже прилипло"). Длины
и
, указанные после ключевых слов plus и minus, называются plus- и minus- компонентами клея. Длина
называется естественным размером клея. С этой точки зрения команда \hfil также помещает в строку клей - с бесконечной растяжимостью и нулевым естественным размером.Опишем более точно, как именно растягивается или сжимается клей при выполнении команды \hbox to ... Для простоты предположим дополнительно, что plus- и minus- компоненты клея всюду неотрицательны и что в строке отсутствует клей с бесконечной растяжимостью или сжимаемостью (в частности, в строке нет \hfil'ов или \hfill'ов; про клей с бесконечной сжимаемостью речь пойдет ниже).
В этом случае TeX вычисляет "естественную ширину" блока, складывающуюся из ширин составляющих его элементов и естественных размеров клея, и сравнивает ее с требуемой шириной блока, указанной в команде \hbox после ключевого слова to. Если эти две ширины совпали, то все пробелы будут иметь естественный размер. Если требуемая ширина больше естественной, то TeX вычисляет, насколько больше, после чего "разверстывает" эту добавку между всеми пробелами пропорционально величинам plus - компонент клея в этих пробелах.
Вот пример. Предположим, мы создаем блок с помощью команды
\hbox to $a$ {А\hspace{0pt plus 2em}% Б\hspace{1cm plus 1em minus 2mm}В} где величина
на
мм больше суммы ширин букв А, Б и В, то пробел между А и Б будет равен
, а пробел между Б и В -
, поскольку plus - компонента клея между А и Б в два раза больше, чем plus - компонента клея между Б и В (и никакого другого клея в строке нет, так что ничего более растянуть нельзя). Если требуемая ширина меньше естественной, то уменьшение длины также распределяется между всеми элементами клея пропорционально величинам их minus-компонент. Если продолжить аналогию между TeX'овским клеем и пружинами, то можно сказать, что жесткость пружины при растяжении обратно пропорциональна величине plus-компоненты.В приведенном примере оба пробела в блоке были созданы вручную командой \hspace; если же в аргументе команды \hbox присутствуют пробелы, то следует учесть, что эти пробелы также, как мы объясняли ранее, обладают растяжимостью и сжимаемостью, которая также берется в расчет.
В случае, когда пробелы надо растягивать и требуемое растяжение блока больше, чем сумма plus - компонент всех элементов клея, на экран и в log -файл выдается знакомое вам сообщение Underfull \hbox; если пробелы надо уменьшать и величина, на которую надо уменьшить ширину блока, меньше, чем сумма minus - компонент всех элементов клея, то выдается не менее знакомое сообщение Overfull \hbox.
Все сказанное относилось к случаю, когда бесконечно растяжимого клея в аргументе команды \hbox нет.
Если же таковой присутствует (например, есть команда \hfil) и пробелы надо растягивать, то растяжимость клея с конечными значениями plus -компонент утрачивается: соответствующие интервалы будут иметь естественный размер (что бы ни было написано в аргументе команды \hspace после plus), а все растяжения будут происходить только за счет команд \hfil. При этом сообщение об Underfull'е выдаваться не будет, как бы ни растянулись пробелы. Аналогично, если пробелы надо ужимать и присутствует клей с бесконечной сжимаемостью, все уменьшения пробелов произойдут только за его счет и никогда не будет выдано сообщения об Overfull'е.
Если в аргументе команды \hbox присутствуют команды \hfil и \hfill совместно, то при необходимости растягивать пробелы учитывается только \hfill, в то время как "в бесконечное число раз менее растяжимый" \hfil в расчет не берется (не говоря уж о клее с конечной растяжимостью):
![]() | \hbox to 4cm{\hfil Блоки и клей\hfil} \hbox to 4cm{\hfil Блоки и клей\hfill} \hbox to 4cm{\hfill Блоки и клей\hfill} |
Команда \hbox
Возможности, предоставляемые LaTeX'ом для генерации блоков, достаточны для простых приложений, но в более серьезных случаях их не хватает. В этом и следующем разделах мы рассмотрим более гибкие средства, предоставляемые для этой цели непосредственно языком TeX и макропакетом Plain - TeX. Мы не будем пытаться описать все TeX'овские команды для генерации блоков (книгу [2] ничто заменить не может), но сообщим тот минимум сведений, который необходим для модификации LaTeX'овского стандартного оформления, о чем пойдет речь в следующей лекции. Подчеркнем, что всеми описываемыми в этом и следующем разделах TeX'овскими средствами можно пользоваться в LaTeX'овских исходных текстах.Прежде всего давайте вспомним, что в каждый момент трансляции исходного текста TeX находится в одном из трех следующих режимов: горизонтальном (в процессе верстки абзаца), вертикальном (между абзацами), или математическом (в процессе набора математической формулы); при появлении первой же буквы или LaTeX'овской команды для генерации блока или линейки (к таковым относятся \mbox, \makebox, \fbox, \framebox, окружения {array}, {tabular} или {picture}, а также команда \rule1)) TeX из вертикального режима выходит и начинает очередной абзац.
Одна из основных TeX'овских команд для генерации блоков называется \hbox. В своем простейшем виде она полностью аналогична LaTeX'овской команде \mbox, с одним важным отличием: в вертикальном режиме команда \hbox не начинает нового абзаца, а только добавляет сгенерированный ею блок (т. е.\ фактически строку) к уже сверстанной части страницы. Внутри абзаца (в горизонтальном режиме) команда \hbox действует точно так же, как и \mbox. Вот пример:

На странице \hbox{уже} присутствует абзац текста. После того, как он кончится, TeX{} перейдет в вертикальный режим. \hbox{Строка} \hbox{Еще строка} Только теперь начинается новый абзац. Сравните с тем, что было бы при использовании LaTeX'овской команды \mbox вместо \hbox:

На странице уже присутствует абзац текста. После того, как он кончится, TeX перейдет в вертикальный режим. \mbox{Эти слова} сразу начинают новый абзац.
Команда \vbox
Теперь рассмотрим вторую основную команду TeX'а для генерации блоков — команду \vbox. Эта команда создает блок, обрабатывая текст в вертикальном режиме. Вот первый пример:
\vbox{\hbox{Слово} \hbox{Еще слово}} Получаемый блок имеет вид:

Как видите, блоки, создаваемые \hbox, ставятся один под другим таким образом, чтобы их точки отсчета лежали на одной вертикальной прямой.
Прежде чем идти дальше, обсудим, что может содержаться в аргументе команды \vbox. Там могут присутствовать любые TeX'овские команды, допустимые между абзацами (т.е. в вертикальном режиме): команды \vspace, команды смены шрифта, присваивания значений различным параметрам, команды \newcommand и \renewcommand и т.п. Что же касается команд, которым соответствует что-либо на печати, то будем считать, что из них в аргументе \vbox возможны только TeX'овские команды \hbox, \vbox и \hrule, а также \copy, о которой речь пойдет позже. В частности, недопустим ни текст, ни LaTeX'овские команды \mbox, \parbox, \rule и т.п. Если вам требуется воспользоваться возможностями таких команд, "прячьте" их в \hbox, например, так:
\hbox{\raisebox{1pt}[2em][3em]{...}} На самом деле в аргументе команды \vbox может находиться и обычный текст; при появлении первой же буквы или, скажем, команды \mbox или другой команды LaTeX'а для генерации блоков TeX переходит в горизонтальный режим, который продолжается до команды, завершающей абзац (\par или пустой строки). Мы не будем вдаваться в детали; для тех приложений, которые мы имеем в виду, достаточно использовать команду \vbox так, как было предписано выше.
Когда TeX при выполнении команды \vbox составляет блоки друг с другом, он располагает их так, чтобы их базисные линии были, по возможности, на равных расстояниях друг от друга, так что обычно между блоками будет присутствовать дополнительный пробел. С другой стороны, линейки, созданные командой \hrule, приставляются к блокам без дополнительного пробела. Чтобы при этом линейка не оказалась вплотную к тексту, удобно в соответствующий блок вставить \strut.
Следующий пример призван пояснить сказанное:

Неудачно:\\ \vbox{\hbox{Два слова} \hrule} Лучше так:\\ \vbox{\hbox{\strut Два слова} \hrule} Как обычно, \ vbox посреди абзаца ведет себя просто как большая буква. Обратите также внимание, что мы не пытались убрать лишний пробел между \hbox и \hrule: в вертикальном режиме пробелы никакого влияния на текст не оказывают.
Вот еще пример, когда с помощью комбинации блоков и линеек текст берется в рамку:

\vbox{\hrule \hbox{\vrule\,\strut Текст в рамке\,\vrule} \hrule} По-прежнему мы используем \strut, чтобы горизонтальные линейки не подходили слишком близко к тексту (и \ для той же цели по горизонтали).
Лидеры
В оглавлении к этой книге (и ко многим другим тоже) место между названием раздела и номером страницы заполняется рядом из точек. Это можно сделать с помощью LaTeX'овской команда \dotfill. Она работает так же, как и \hfill, с той разницей, что пробел, образующийся в результате действия этой команды, заполняется точками:
![]() | \hbox to 3cm{А\dotfill Б} |

\hbox to 5cm{1\hrulefill 2\hrulefill 3} В TeXнической терминологии такие заполнители называют лидерами (leaders).
На самом деле можно заполнить пробел не только точками или линейкой, но и любым повторяющимся текстом. Вот как это делается. Пусть мы хотим заполнить пробел повторяющимися твердыми знаками. Тогда можно написать так:
![]() | \hbox to 5cm{1\leaders \hbox{Ъ}\hfil 2} |
\hbox to 2em{\hfil Ъ\hfil} В общем случае применяйте команду \leaders так:
\leaders $\langle$ \textit{блок}$\rangle$ $\langle\mbox{\cs(hfil) \textit{или} \cs(hfill)}\rangle$ Здесь
- это любая TeX'овская команда для генерации блока, например, \hbox, с которой мы уже познакомились, или \vbox или \copy, о которых еще пойдет речь. Команды LaTeX'а (\mbox, \makebox, \parbox и т.п.) применять в этом контексте нельзя; если, тем не менее, хочется воспользоваться их возможностями, то их надо " спрятать" в \hbox, написав, например,\hbox{\makebox[3em][r]{...}} Между командой для генерации блока и командой \hfil или \hfill может быть пробел (например, конец строки). Команда \leaders работает так: выделяется столько свободного места, сколько получилось бы, если бы стояло просто \hfil или \hfill, а затем это место заполняется идущими вплотную друг к другу копиями
столько раз, сколько этот блок поместится по ширине на выделенное место (если ширина свободного места меньше ширины блока, то ни разу).С помощью команды \leaders можно также изменить толщину линейки, заполняющей свободное место. Именно, команда \hrulefill является по существу сокращением от
\leaders\hrule\hfill Если же мы скажем, например,
\leaders\hrule height 1pt \hfill то линейка будет иметь толщину 1 пункт, вместо принятых по умолчанию 0.4 пункта. Можно также написать \hfil вместо \hfill, с очевидными последствиями.
Растяжимые интервалы
До сих пор шла речь о важных, но непринципиальных различиях между TeX'овским \hbox и LaTeX'овским \mbox. Теперь поговорим о дополнительных возможностях, предоставляемых TeX'овской командой.Команда \hbox "в чистом виде" создает блок, ширина которого равна естественной длине текста, являющегося ее аргументом. Кроме этого, она может создавать блоки любой заданной ширины. Для этого нужно сказать
\hbox to {ширина}{текст} Здесь {ширина}должна быть выражена в воспринимаемых TeX'ом единицах длины: это может быть, например, 20pt, или 2.3cm, или, например, 0.12\textwidth - параметр со значением длины (возможно, с коэффициентом) тоже годится. Между to и обозначением ширины, а также между обозначением ширины и открывающей фигурной скобкой могут быть пробелы - TeX их проигнорирует2). Наконец, отсутствие backslash в слове to не является опечаткой: это не команда, а одно из "ключевых слов" TeX'а (подобно ключевым словам plus и minus, с которыми мы вскоре снова встретимся, или width и height, с которыми мы уже встречались в разделе, посвященном линейкам). Давайте опробуем эту новую возможность команды \hbox:
![]() | \hbox to 3cm {Два слова} |
Underfull \hbox Дело в том, что пробел между словами "Два" и " слова" не может растянуться настолько, чтобы наш блок имел ширину три сантиметра; в ситуациях, когда пробел насильно заставляют растянуться больше, чем положено, возникает сообщение об Underfull'е, как это было объяснено в разд. 3.6.6.
Можно, однако, заставить TeX создать блок требуемой ширины " без скандала". Для этого в том промежутке, который мы хотим растянуть, надо поставить команду \hfil:
![]() | \hbox {Два слова}\\ \hbox {Два \hfil слова}\\ \hbox to 2cm {Два \hfil слова}\\ \hbox to 3cm {Два \hfil слова}\\ \hbox to 4cm {Два \hfil слова} |
Если в аргументе команды \ hbox присутствует не одна команда \hfil, а несколько, то растяжение произойдет на месте каждой из этих команд, причем размер этого растяжения будет распределен между командами \hfil равномерно: если необходимо превысить естественную ширину блока на
\,см, а в аргументе команды \hbox стоят два \hfil, то на месте каждого из них будет добавлен пробел в
см. Вот пример с несколькими \hfil:
![]() | \hbox to 4cm{Раз \hfil два \hfil три} |

\hbox to 0.7\textwidth {Слева\hfil} \hbox to 0.7\textwidth {\hfil Справа} \hbox to 0.7\textwidth {\hfil В центре\hfil} Можно считать, что на месте каждого \hfil в строку вставляется пружина; все эти пружины имеют одинаковую жесткость, в свободном состоянии все они имеют нулевую ширину, и все эти пружины могут сколь угодно широко растягиваться.
Наряду с \hfil существует команда \hfill, также задающая бесконечно растяжимые пробелы, причем эта растяжимость "в бесконечное число раз больше", чем у пробелов, задаваемых \hfil. Если в аргументе команды \hbox присутствуют \hfil и \hfill совместно, то все растяжения происходят только за счет "более растяжимых" \hfill:
![]() | \hbox to 4cm{\hfil Слово\hfil}\\ \hbox to 4cm{\hfill Слово\hfil}\\ \hbox to 4cm{\hfil Слово\hfill} |
Сдвиги относительно базисной линии
Когда при исполнении команды \makebox или \mbox TeX создает блок из меньших блоков (каждая буква, как мы помним, - это блок, из букв составляются слова - тоже блоки; наконец, блоки могут быть заданы в явном виде, в частности, командой \mbox), то блоки эти размещаются в строке таким образом, что все их точки отсчета расположены на одной высоте (иными словами, их базисные линии продолжают одна другую). Можно, однако, сдвинуть блок по вертикали относительно базисной линии. Для этого удобно воспользоваться LaTeX'овской командой \raisebox. Эта команда требует двух обязательных аргументов. Первый из них - расстояние, на которое сдвигается по вертикали фрагмент текста, второй - сам этот фрагмент текста. Пример:![]() | Слово \raisebox{2pt}{подскочило} в строке. |
\newcommand{\TeX}{T\nolinebreak\hspace{-.1667em}\raisebox {-.5ex}{E}\nolinebreak\hspace{-.125em}X} Тут же мы видим и примеры использования отрицательных промежутков для того, чтобы буквы сблизились. Команды \nolinebreak нужны, чтобы не случилось разрыва строки посередине эмблемы.
На самом деле команда \TeX определяется более экономным способом, который требует меньше машинного времени и памяти, но использует не рассматриваемые нами средства TeX'а. Время от времени мы будем приводить определения команд "в переводе с TeX'а на LaTeX".
Кроме вертикального сдвига блоков, команда \raisebox может делать еще одно полезное дело: с ее помощью можно обмануть TeX, заставив его считать, что блок, полученный после сдвига, имеет любую заданную нами высоту и глубину, независимо от того, сколько места реально занимает текст. Именно, эта команда может принимать, наряду с обязательными, необязательные аргументы. Между двумя обязательными аргументами можно указать необязательный аргумент — высоту, которую, по мнению TeX'а, должен иметь сдвинутый блок. Кроме того, после первого необязательного аргумента может стоять второй — глубина, которую, по мнению TeX'а, будет иметь сдвинутый блок. Вот пример:
![]() | Строка.\\ Вторая \raisebox{7pt}[1pt][10pt]{Ы}\\ Третья строка. |
Иногда разумно использовать команду \raisebox даже с нулевым обязательным аргументом, только для того, чтобы менять (в глазах TeX'а) высоту и/или глубину блока, не сдвигая его относительно базисной линии. В лекции 9 мы увидим пример такого использования этой команды.
Текст состоит из блоков
Мы уже отмечали, что в процессе набора TeX не принимает во внимание, как буквы будут выглядеть на печати, а лишь учитывает, сколько места надо отвести на каждый символ. Давайте обсудим этот процесс подробнее.С точки зрения TeX'а, каждая буква представляет собой блок (английский термин: box), т.е. прямоугольник с выделенной точкой отсчета; горизонтальная прямая, проходящая через точку отсчета, называется базисной линией (английский термин: baseline). Блок характеризуется тремя размерами: шириной, высотой и глубиной. См. рисунок, на котором также изображен блок, соответствующий букве у.

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

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

В приведенных выше примерах мы сталкивались с блоками, которые TeX создает автоматически; в настоящей лекции пойдет речь о командах, предназначенных для создания блоков вручную. Сначала мы расскажем, какие средства для этого предоставляет нам LaTeX, а затем рассмотрим некоторые TeX'овские команды, дающие дополнительные возможности.
Текст в рамке; комбинации блоков
В лекции 3 мы уже упоминали про команду \fbox, берущую в рамку фрагмент текста, помещающегося в строку. Наряду с ней есть и команда \framebox, относящаяся к ней так же, как \makebox относится к \mbox: она берет текст в рамку заданного размера, причем текст внутри этой рамки либо центрирует (если необязательного аргумента нет или же задан необязательный аргумент c), либо прижимает к правому или левому краю рамки (если задан необязательный аргумент r или l). Смысл и расположение обязательных и необязательных аргументов у команды \framebox такой же, как и у команды \makebox.Точнее говоря, первый обязательный аргумент команды \framebox задает не ширину рамки, а ширину текста, помещаемого в эту рамку. Сама же рамка отделена от текста пробелом ширины \fboxsep; толщина линий в рамке равна \fboxrule. Обоим этим параметрам можно обычным образом присваивать новые значения.
Коль скоро каждый блок, создаваемый LaTeX'овскими командами, рассматривается TeX'ом просто как большая буква, возможны любые, сколь угодно причудливые, комбинации таких "букв". Пусть, например, нам надо взять в рамку абзац текста шириной
см, чтобы получилось так:
Просто поместить этот текст в аргумент команды \fbox не получится, поскольку наш текст в одну строку не укладывается, а команда \fbox, подобно команде \mbox, текстов, не укладывающихся в строку, не переваривает. Поэтому нужно сделать из нашего абзаца блок с помощью команды \parbox и этот блок (т.е. уже "букву") передать в качестве аргумента команде \fbox:
\fbox{% \parbox{6cm}{% Внутри TeX'овских блоков может ... ... друг в друга, как матрешки.}% } Обратите внимание на знаки процента, которыми заканчиваются первая и предпоследняя строки. Если бы их не было, то рамка отстояла бы от текста больше, чем надо, так как TeX решил бы, что аргумент команды \fbox имеет пробел до и после "буквы", созданной командой \parbox. См.лекцию 1 по поводу использования знака процента для удаления нежелательных пробелов.
Работа в системе LaTeX
Что нумеровать и что включать в оглавление
Будет ли раздел документа иметь номер, зависит от двух вещей: "уровня вложенности" раздела и значения счетчика secnumdepth. Раздел документа получает номер, если уровень его вложенности меньше или равен значению secnumdepth (разумеется, все сказанное относится к случаю, когда LaTeX'овская команда для раздела документа дана без звездочки — иначе нумерации не будет заведомо). Уровни вложенности в стандартных стилях приведены в табл. 9.1| \section | 1 |
| \subsection | 2 |
| \subsubsection | 3 |
| \paragraph | 4 |
| \subparagraph | 5 |
\setcounter{secnumdepth}{2} Что касается команд \chapter и \part, то соответствующие разделы документа будут нумероваться тогда и только тогда, когда значение secnumdepth является неотрицательным числом.
Какие разделы включать в оглавление, определяется другим счетчиком, а именно tocdepth: информация о разделе документа вносится в оглавление в том и только том случае, если уровень вложенности раздела меньше или равен значения этого счетчика (и раздел вводится командой без звездочки).
Изменение отбивок в перечнях
Теперь настало время объяснить, как именно можно менять вышеописанные параметры. При "входе" в перечень LaTeX в первую очередь вычисляет уровень вложенности перечней: если перечень не вложен ни в какой другой, то этот уровень равен 1, для перечня, вложенного в перечень, уровень равен 2 и т. д. После этого исполняется команда \@listI, если уровень равен 1, \@listii, если уровень равен 2, и т.д.: имя команды — слово @list, к которому добавлен уровень вложенности, записанный римскими цифрами (если уровень вложенности равен 1, то римская цифра записывается прописной буквой I, в остальных случаях римские цифры записываются строчными латинскими буквами). В стандартных классах команды \@listI, \@listii и т.п. определены таким образом, что они в момент входа в перечень устанавливают значение параметров оформления перечня на соответствующем уровне. Именно поэтому переустановка (некоторых из) параметров перечня в стилевом пакете может ничего не дать.Итак, чтобы менять отбивки в перечнях, надо переопределять команды \@listI, \@listii, ..., \@listvi. Видимо, самое практичное — переопределить в своем стилевом пакете команды \@listI, \@listii, ..., \@listvi (или не все из них — в зависимости от того, какова реальная максимальная глубина вложенности перечней в вашем документе), присвоив всем перечисленным в предыдущем разделе десяти параметрам явные значения. Например, можно написать что-нибудь в таком роде:
\renewcommand{\@listI}{% \leftmargin=25pt \rightmargin=0pt \labelsep=5pt \labelwidth=20pt \itemindent=0pt \listparindent=0pt \topsep=8pt plus 2pt minus 4pt \partopsep=2pt plus 1pt minus 1pt \parsep=0pt plus 1pt \itemsep=\parsep} Здесь всем параметрам оставлены стандартные значения, за исключением \parsep и \itemsep: в отличие от положительных значений, задаваемых в стандарте, мы устанавливаем их такими же, как обычная вертикальная отбивка между абзацами (как вы помните, она обозначается \parskip и обладает нулевым естественным размером и растяжимостью 1pt). На взгляд автора, такие перечни смотрятся лучше.
Если какой-то из параметров (например, \labelsep) одинаков в перечнях всех уровней, то достаточно прописать его установку только в определении \@listI: при входе в перечень верхнего уровня этот параметр будет установлен командой \@listI, и LaTeX будет его помнить, пока не выйдет из " наружного" перечня.
Как подчинить один счетчик другому
Первый из приемов, о которых пойдет речь, связан с отношением подчинения между счетчиками. Мы знаем, что при создании счетчика с помощью команды \newcounter можно задать и счетчик, которому он будет "подчинен". Но как быть, если уже существует никому не подчиненный счетчик, а мы хотим его кому-то подчинить? Например, за нумерацию сносок отвечает счетчик footnote; в стиле article этот счетчик определяется как никому не подчиненный, благодаря чему нумерация сносок выходит сплошной в пределах всего документа. Если мы хотим, чтоб нумерация сносок начиналась заново в каждом разделе, то можно в стилевом пакете написать так:\@addtoreset{footnote}{section} Первый аргумент команды \@addtoreset — имя подчиняемого счетчика, второй — имя подчиняющего.
Разумеется, для того чтобы осмысленно применять описанную команду, надо знать, какие счетчики определены в стандартных стилях и кому они подчинены (или не подчинены). Эта информация содержится в конце раздела.
При ознакомлении с командой \@addtoreset может возникнуть искушение написать
\@addtoreset{footnote}{page} чтобы сноски нумеровались заново на каждой странице. К сожалению, по TeXническим причинам это может не дать желаемого результата: если сноски оказываются на нескольких страницах подряд, то может случиться так, что на второй из этих страниц нумерация сносок начнется не с
.Типичный случай использования команды \@addtoreset возникает, если класс документа — article. В этом случае часто пишут
\@addtoreset{equation}{section} чтобы нумерация уравнений была не сплошной, как предусмотрено стандартом, а начиналась заново в каждом разделе. Разумеется, в этом случае надо будет переопределить команду \theequation.
Если вы подключили пакет {amsmath}, то эту операцию можно осуществить и попросту в преамбуле документа: команда \numberwithin, принимающая в точности те же аргументы, что и \@addtoreset, осуществляет подчинение счетчика и к тому же переопределяет соответствующим образом the-команду.
Колонтитулы
Страницу документа, подготовленного с помощью LaTeX'а, можно рассматривать как состоящую из трех частей: тела страницы, верхнего колонтитула и нижнего колонтитула3).. Мы знаем, что с помощью команды \pagestyle на оформление колонтитулов можно в какой-то мере влиять. Возможностей для этого, однако же, не слишком много. Сейчас мы увидим, как можно радикально менять вид колонтитулов.За оформление верхних колонтитулов отвечают команды \@oddhead и \@evenhead. Точнее говоря, если стиль оформления документа "двусторонний", то команда \@oddhead задает верхний колонтитул на страницах с нечетными номерами, а команда \@evenhead — на страницах с четными номерами. Если же стиль оформления документа " односторонний", то \@oddhead задает все верхние колонтитулы, а команда \@evenhead на оформление документа вообще не влияет. Аналогично обстоит дело с \@oddfoot и \@evenfoot, отвечающими за нижние колонтитулы. Все четыре названные команды получают некоторое определение в LaTeX'овском стандарте, так что переопределять их надо с помощью \renewcommand.
Теперь обсудим, как вышеназванные команды влияют на оформление колонтитулов. Основной принцип таков. При оформлении страницы верхний колонтитул получается в результате исполнения команды
\hbox to\textwidth{\@evenhead} (мы предположили, что стиль двусторонний и страница четная; в других случаях — с очевидными изменениями). Можно сказать, что в каждой из команд \@evenhead и ей подобных записан текст и TeX'овские команды, которые при верстке страницы будут подставлены в \hbox to \textwidth.
Пусть, например, мы готовим к изданию роман Л.Н.Толстого " Война и мир"; стиль документа выберем двусторонний. Предположим, что мы выбрали такое оформление:
\renewcommand{\@evenhead}{\hfil Л.Н.ТОЛСТОЙ} \renewcommand{\@oddhead}{ВОЙНА И МИР\hfil} \renewcommand{\@evenfoot}{\hfil --- \thepage ---\hfil} \renewcommand{\@oddfoot}{\hfil --- \thepage ---\hfil} Если мы хотим, чтобы каких- то колонтитулов вообще не было, то надо переопределить соответствующую команду на "ничего не делать", например, так:
\renewcommand{\@oddfoot}{} Итак, мы научились менять оформление колонтитулов, переопределяя команду \@evenhead и ей подобные. А теперь — важное предупреждение: команда \pagestyle также переопределяет команды типа \@evenhead; если вы проведете переопределения в своем стилевом пакете, то первой же командой \pagestyle ваши переопределения будут отменены. Стало быть, если уж вы переопределяете команды наподобие \@evenhead, то после этого переопределения командой \pagestyle в документе пользоваться не надо (\thispagestyle можно).
Прежде чем перейти к более сложным вещам, скажем еще о трех стилевых параметрах. Во-первых, интервалы между колонтитулами и текстом регулируются параметрами со значением длины \headsep, задающим интервал между верхним колонтитулом и текстом, и \footskip, задающим расстояние между базисной линией последней строки в теле страницы и базисной линией нижнего колонтитула. Во-вторых, существует параметр \headheight, задающий высоту верхних колонтитулов. Если сумма высоты и глубины заданного вами колонтитула будет превышать \headheight, то при трансляции вы получите сообщение
Overfull \vbox occurred while \output was active. Приведем пример, когда надо учитывать \headheight. Пусть мы хотим в том же издании "Войны и мира" отделять верхние колонтитулы от текста линейками. Разумный способ это сделать — передать в \hbox to \textwidth уже готовый блок шириной \textwidth, содержащий как текст колонтитула, так и линейку. Так как линейку под текстом удобно проводить в вертикальном режиме с помощью команды \hrule, в голову приходит вот что (здесь и далее мы для краткости приводим только определение \@evenhead):
\renewcommand{\@evenhead}% {\vbox{\hbox to\textwidth{\hfil Л.Н.ТОЛСТОЙ}\hrule}} У такого определения есть, однако, два недостатка. Во-первых, так как линейки в вертикальном режиме добавляются "впритык" к предшествующему блоку, у нас нет гарантии, что линейка не подойдет к тексту слишком близко; если бы к тому же текст в колонтитулах на разных страницах варьировался, как в дальнейших примерах, то может случиться и так, что две соседние линейки на развороте окажутся на разной высоте (из-за того, что в колонтитуле на одной странице будет буквы вроде у, опускающиеся ниже базисной линии, а на другой — нет). Средство от этого недостатка — добавить \strut в наш блок:
\renewcommand{\@evenhead}% {\vbox{\hbox to\textwidth{\hfil \strut Л.Н.ТОЛСТОЙ}\hrule}} Второй недостаток — это то, что к размеру блока с текстом добавится ширина линейки, в результате чего этот размер превысит \headheight и мы будем получать уйму сообщений об overfull'е. Чтобы уйти от этого, надо еще чуть-чуть схитрить:
\renewcommand{\@evenhead}% {\raisebox{0pt}[\headheight][0pt]{% начало блока \vbox{\hbox to\textwidth{\hfil \strut Л.Н.ТОЛСТОЙ}\hrule}}% конец блока }% конец макроопределения Понятно ли, что происходит? С помощью \raisebox мы заставляем TeX считать, что блок имеет высоту \headheight (нам даже незачем вникать, чему она фактически равна) и нулевую глубину (чтобы в сумме получилось то, что надо). Теперь ни о каких переполнениях речи не будет; пробел между колонтитулом и текстом можно при желании изменить, изменив значение \headsep.
Для нижних колонтитулов параметра, аналогичного \headheight, нет, так что смело делайте их любой высоты.
Кстати говоря, команду \@evenhead в этом примере можно было бы переопределить более простым образом, без \vbox, с использованием команды \underline. Наш способ, однако, более гибок: например, мы можем регулировать толщину линейки, чего с \underline не добьешься.
Итак, мы научились создавать собственные колонтитулы. Однако в LaTeX'овском стандарте в колонтитулы обычно помещается не только номер страницы, но и, например, номер и заглавие текущего раздела.
Давайте научимся делать и это.
Чтобы передать в колонтитул какую-то информацию из текста, в LaTeX'е используются команды \markboth и \markright. Разберем, как они работают. Команда \markboth, требующая двух обязательных аргументов, запоминает пару " пометок" — два фрагмента текста (возможно, с TeX'овскими командами). Например, если мы скажем (где-нибудь между абзацами)
\markboth{Кот}{Пес} то поместим между этими абзацами пару пометок: "левую пометку" Кот и "правую пометку" Пес. Сами по себе эти пометки никак не отражаются на печати. Однако же в определениях команд \@oddhead и ей подобных мы можем на эти пометки ссылаться. Именно, в этих определениях команда \leftmark дает левую пометку, а команда \rightmark — правую пометку. Например, если мы переопределим верхние колонтитулы как
\renewcommand{\@evenhead}{\leftmark\hfil} \renewcommand{\@oddhead}{\hfil\rightmark} то, начиная с той страницы, на которую попали наши пометки, в левом верхнем колонтитуле будет стоять выключенное влево слово "Кот", а в правом — выключенное вправо слово " Пес"4). Кстати, если никаких пометок в тексте нет, то как \leftmark, так и \rightmark дают " пустой" текст.
До сих пор мы молчаливо предполагали, что на каждой странице присутствует только одна пара пометок. Что будет, если таких пар пометок попадет на страницу несколько? Ответ: команда \leftmark в этом случае означает левую пометку из самой верхней пары пометок, попавших на страницу, а команда \rightmark означает правую пометку из самой нижней пары пометок, попавших на данную страницу. С другой стороны, если на страницу вообще ни одна пара пометок не попала, то \leftmark и \rightmark означают соответственно левую и правую пометки из последней пары пометок, встретившихся до этого.
Поясним сказанное примером. Пусть пометки
\markboth{x}{y} и \markboth{z}{t} попали (в указанном порядке) на страницу 1, на страницу 2 вообще никаких пометок не попало, на страницу 3 попали целые три пары пометок:
\markboth{u}{v}, \markboth{a}{b} и \markboth{m}{n}, а на страницах 4 и дальнейших никаких новых пометок не появлялось. Тогда значения команд \leftmark и \rightmark в процессе обработки этих страниц были таковы:
| 1 | ![]() | ![]() |
| 2 | ![]() | ![]() |
| 3 | ![]() | ![]() |
| 4 и далее | ![]() | ![]() |
\markboth{Кот}{Пес} а затем команда
\markright{Собака} (и в промежутке между этими командами никаких других пометок в текст не вносится), то это равносильно тому, как если бы вторая из этих команд была
\markboth{Кот}{Собака} Выше мы уже отмечали, что команды типа \section ставят в тексте пометки автоматически. Понять, как это делается и как можно влиять на этот процесс, проще всего на примере. Сделаем такие предположения о документе: класс — article, разделы и подразделы нумеруются (иными словами, значение счетчика {secnumdepth} больше единицы), действует стилевая опция twoside и в преамбуле была дана команда \pagestyle{headings}.
Во-первых, отметим, что в этом случае пометки в текст вставляют только команды \section и \subsection. При этом команда \section ставит пометки, автоматически выполняя команду \sectionmark, имеющую один обязательный аргумент — заглавие раздела (если команда \section была дана без необязательного аргумента) или вариант заглавия, заданный в необязательном аргументе команды \section (если таковой присутствует). Вот как определена \sectionmark (на место #1 будет подставляться вариант заглавия, идущий в колонтитулы):
\newcommand{\sectionmark}[1]{\markboth{% \MakeUppercase{\thesection\hspace{1em}#1}}% левая пометка {}% правая пометка (она пуста) }% конец макроопределения Здесь используется LaTeX'овская команда \MakeUppercase, которую мы ранее не рассматривали.
Не вдаваясь в подробности, скажем, что эта команда переводит все буквы в тексте5), попавшем в ее аргумент, из строчных в прописные. Коль о том зашла речь, отметим, что есть еще и команда \MakeLowercase, которая наоборот переводит все буквы в тексте, попавшем в ее аргумент, из прописных в строчные. (Не пытайтесь, пожалуйста, использовать \MakeUppercase и \MakeLowercase вне аргументов \markboth или \markright, если не любите неприятных сюрпризов.) Если вы не хотите, чтобы в колонтитулах строчные буквы заменялись на прописные, можно при переопределении просто опустить команду \MakeUppercase (так и было сделано при оформлении книги, которую вы читаете).
Команда \subsectionmark, определяющая вид пометок, автоматически вставляемых в текст командой \subsection, определена следующим образом:
\newcommand{\subsectionmark}[1]{\markright {\thesubsection\hspace{1em}#1}} Здесь также аргумент #1 — это заглавие подраздела (точнее, его вариант для колонтитулов).
Итак, в рассматриваемом нами случае команда \section вносит в текст следующую пару пометок: заглавие раздела, в котором все буквы заменены на прописные, в качестве левой пометки, и пустой текст в качестве правой пометки. Команда же \subsection вносит в текст пару пометок, в которой левая пометка такая же, как в предыдущей паре, а правая — заглавие подраздела (точнее, его вариант для колонтитулов), причем на сей раз "в натуральном виде", без замены строчных букв на прописные. Как уже отмечалось выше, команды \subsubsection и более мелкие никаких пометок в текст не вносят.
Посмотрим, как в этом стиле используются пометки. Колонтитулы на четных страницах в этом случае определены так:
\newcommand{\@evenhead}{\thepage\hfil \normalfont\slshape\leftmark} Тем самым на страницах с четными номерами (они будут левыми на развороте) колонтитул будет выглядеть следующим образом: выключенный влево номер страницы (прямым шрифтом) и заглавие текущего раздела (наклонным шрифтом, прописными буквами) — выключенное вправо6): ведь никаких других левых пометок в тексте нет!
Команда \@oddhead, отвечающая за верхние колонтитулы на страницах с нечетными номерами, определена в стиле article (при условии, что была команда \pagestyle{headings}) так:
\newcommand{\@oddhead}{{\normalfont\slshape\rightmark}% \hfil\thepage} Стало быть, верхние колонтитулы к нечетным страницам выглядят так: название текущего подраздела наклонным шрифтом — выключенное влево, номер страницы прямым шрифтом — выключенный вправо. Впрочем, если в текущем разделе команд \subsection еще не было, то вместо заглавия будет пустое место, так как \rightmark будет пуста (определение команды \sectionmark, данное выше, показывает, что при исполнении команды \section в текст вносится пустая правая пометка, и пустой она остается до первой команды \subsection).
Приведем пример переопределения команд наподобие \sectionmark. Если нам не нравится, что в правом колонтитуле иногда бывает пустое место, то можно попросить команду \section вносить в текст непустую правую пометку — то же заглавие раздела. Для этого напишем в преамбуле так:
\newcommand{\sectionmark}[1]{\markboth {\uppercase{\thesection\hspace{1em}#1}}% левая пометка {\uppercase{\thesection\hspace{1em}#1}}% правая пометка }% конец макроопределения Теперь, если в разделе нет подразделов, то на правых страницах в верхнем колонтитуле будет также печататься заглавие текущего раздела. Оформление колонтитулов при этом будет стандартным. Если вы хотите еще и отойти от этого стандарта, то надо будет, вместо использования команды \pagestyle, напрямую переопределить команды типа \@oddhead и \@evenhead; надо думать, теперь вы найдете, как применить в этих определениях команды \leftmark и \rightmark.
Если в документе присутствует команда \pagestyle (с каким бы то ни было аргументом), то она отменит ваши переопределения команд типа \sectionmark. Поэтому все команды \pagestyle должны идти до ваших личных переопределений команд типа \@evenhead.
Если вы вообще не хотите, чтобы при исполнении, скажем, команды \subsection в текст вносились какие-либо пометки, то можно "отключить" команду \subsectionmark, переопределив ее на "ничего не делать":
\renewcommand{\subsectionmark}[1]{} Бывает и так, что вас устраивает стандартный стиль оформления колонтитулов, но при этом не устраивает, что именно в эти колонтитулы автоматически записывается. Например, у ваших разделов длинные заглавия, и вы при этом хотите, чтобы они в несокращенном виде попали в оглавление, а сокращенные варианты заглавий пошли только в колонтитулы. Команда \section с необязательным аргументом тут не спасет, так как этот необязательный аргумент запишется и в оглавление тоже. Вот бы задать информацию для колонтитулов вручную, без того, чтобы это автоматически делали команды типа \section! Можно, конечно, переопределить на "ничего не делать" все команды типа \sectionmark, как в приведенном выше примере, но LaTeX предоставляет вам более простой способ. Если написать в стилевом файле (до того, как вы переопределяете команды наподобие \@oddhead)
\pagestyle{myheadings} то все LaTeX'овские команды для создания разделов не будут вносить пометок в текст, а оформление колонтитулов будет стандартным. После этого можно самостоятельно переопределить \@oddhead и пр., если вам это нужно: пометки в текст командами рубрикации вноситься все равно не будут.
Теперь вы сможете, например, писать
\section {О некоторых специальных свойствах подмножеств пустых множеств, не рассматривавшихся в предыдущих разделах статьи}% \markboth{\thesection\hspace{1em}Подмножества}{} и в оглавлении будет заголовок целиком, а в колонтитуле — лишь слово "Подмножества" (мы подразумеваем, что стиль все тот же, только аргументом команды \pagestyle был myheadings вместо headings). Команда \markboth помещена после команды \section, чтобы номер раздела, генерируемый командой \thesection, был правильным. Кроме того, мы убрали с помощью знака процента пробел (конец строки) между командами \section и \markboth, чтобы пометки с гарантией попали на ту же страницу, что и заголовок раздела.
Другие команды, отвечающие за автоматическую расстановку пометок в тексте, устроены аналогичным образом: команда \chapter ставит пометки с помощью команды \chaptermark, команда \section — с помощью команды \sectionmark и т.
д. — вообще, если команда, генерирующая раздел документа, определена с помощью \@startsection с первым аргументом abcd, то она будет ставить пометки с помощью команды \abcdmark. Все эти команды автоматически выполняются в процессе выполнения соответствующей команды, генерирующей раздел. Они должны иметь один обязательный аргумент, в качестве которого им передается заглавие раздела (точнее, вариант этого заглавия, предназначенный для колонтитулов и оглавления). Варианты "со звездочкой" команд, генерирующих разделы документа, никаких пометок в текст не вносят (как и следовало ожидать).
Если в аргументе команды \markboth или \markright присутствует не только текст, но и какие-то команды, то в пометки будут записаны не буквально эти команды, но их значение на момент запоминания пометок. Например, если в аргументе \markboth присутствует команда \thesection, то в пометку реально запишется (а потом и прочтется из \leftmark или \rightmark) номер раздела. Если же необходимо, чтобы какая-то команда записалась в пометку в том же виде, в каком она была задана в аргументе \markboth или \markright, то надо "защитить" ее, поставив перед ней \protect.
Еще один случай, когда пометки в текст вносятся LaTeX'ом автоматически, возникает при оформлении таких фрагментов документа, как оглавление, список иллюстраций или таблиц, список литературы и предметный указатель. Как именно они вносятся, зависит от класса документа и от того, пользовались ли мы (и как пользовались) командой \pagestyle. Именно, если класс — article, то никаких пометок при оформлении оглавления и т.п. в текст автоматически вноситься не будет; точно так же не будет этих пометок в любом классе после того, как выполнится команда \pagestyle с аргументом empty, plain или myheadings. С другой стороны, если класс документа — report или book, то, например, при исполнении команды \tableofcontents автоматически выполняется и команда
\markboth{\contentsname} (с очевидными изменениями для списка иллюстраций и т.п.).
Та же ситуация возникнет и после исполнения команды \pagestyle с аргументом headings (даже тогда, когда класс — article).
Итак, вы теперь имеете широкие возможности для создания собственного оформления колонтитулов. Во-первых, можно написать
\pagestyle{myheadings} При этом внешний вид колонтитулов будет стандартный, но материал для колонтитулов вы будете поставлять вручную с помощью команд \markboth и/или \markright. Во-вторых, можно переопределять команды типа \sectionmark): при этом внешний вид колонтитулов будет по-прежнему стандартный, но материал для помещения в колонтитул будет отбираться автоматически по схеме, отличной от стандартной. В-третьих, можно переопределять команды типа \@oddhead: при этом вы меняете как стиль оформления колонтитулов, так и способ обращения с пометками, вносимыми в текст (в частности, если в ваших определениях команд типа \@oddhead не участвуют \leftmark и \rightmark, то эти пометки будут вообще проигнорированы). Наконец, можно объединить второй и третий подходы. При этом вы самостоятельно разрабатываете как внешний вид колонтитулов, так и то, какая информация из текста и как будет в них отражена.
Кто кому подчинен в стандарте
Нам осталось выполнить свое обещание и рассказать, какие счетчики определены в LaTeX'овском стандарте и каковы отношения подчинения между ними.В классах article и proc счетчик section определен как
\newcounter{section} в то время как в классах report и book, в которых существуют еще и главы, определяется никому не подчиненный счетчик chapter для глав, а счетчик section определяется как подчиненный счетчику chapter:
\newcounter{chapter} \newcounter{section}[chapter] Остальные счетчики номеров разделов определяются во всех четырех стандартных классах одинаково:
\newcounter{part} \newcounter{subsection}[section] \newcounter{subsubsection}[subsection] \newcounter{paragraph}[subsubsection] \newcounter{subparagraph}[paragraph] Соответствующие этим счетчикам the-команды определены в классах article и proc так:
\renewcommand{\thepart}{\Roman{part}} \renewcommand{\thesection}{\arabic{section}} \renewcommand{\thesubsection}{\thesection.\arabic{subsection}} \renewcommand{\thesubsubsection}% {\thesubsection.\arabic{subsubsection}} \renewcommand{\theparagraph}% {\thesubsubsection.\arabic{paragraph}} \renewcommand{\thesubparagraph}% {\theparagraph.\arabic{subparagraph}} (мы пишем \renewcommand, поскольку все эти the-команды уже получили какое-то определение при создании счетчиков).
В классах report и book, кроме того, определена the-команда для счетчика chapter и по-другому определена \thesection:
\renewcommand{\thechapter}{\arabic{chapter}} \renewcommand{\thesection}% {\thechapter.\arabic{section}} За нумерацию сносок отвечает счетчик footnote. В классах article} и proc этот счетчик определяется как никому не подчиненный:
\newcounter{footnote} В классах же report и book этот счетчик подчинен счетчику chapter, так как в них присутствует еще и команда
\@addtoreset{footnote}{chapter} В таком же положении, как счетчик footnote, находится и отвечающий за нумерацию формул счетчик equation: в классах article и proc он определен как никому не подчиненный, а в классах report и book он подчинен счетчику chapter.
Однако же в классах report и book переопределяется \theequation:
\renewcommand{\theequation}{\thechapter.\arabic{equation}} Наконец, счетчики figure и table, отвечающие за нумерацию плавающих иллюстраций и таблиц соответственно, устроены точно так же, как счетчик equation: в классах article и proc они никому не подчинены, а в двух других стандартных классах они подчинены счетчику chapter и соответствующие the-команды определены как
\renewcommand{\thefigure}% {\thechapter.\arabic{figure}} (аналогично для table).
Остались еще счетчики, связанные с нумерованными перечнями. Как объяснялось в лекции 7, эти счетчики, в зависимости от уровня вложенности enumerate, называются enumi, enumii, enumiii и enumiv. Все эти счетчики, естественно, последовательно подчинены друг другу, а их ссылочные префиксы определены так (это — единственный случай, когда в стандарте используются нетривиальные ссылочные префиксы):
\renewcommand{\p@enumii}{\theenumi} \renewcommand{\p@enumiii}{\theenumi(\theenumii)} \renewcommand{\p@enumiv}{\p@enumiii\theenumiii}
Модификация команд, задающих разделы
Теперь рассмотрим, что надо делать, чтобы более серьезным образом изменить оформление разделов. Для этого надо переопределить команды \section, \subsection и т.п., а чтобы научиться их должным образом переопределять, надо узнать, как эти команды определены в стандартных LaTeX'овских классах.Почти все команды для создания разделов документа определяются в классовых файлах через команду \@startsection. Например, команда \section определяется (не буквально, а по существу) так:
\newcommand{\section}{\@startsection{section}{1}{0pt}% {-3.5ex plus -1ex minus -.2ex}{2.3ex plus.2ex}% {\normalfont\Large\bfseries}} В этом определении у команды \@startsection указаны шесть аргументов, в которых закодированы различные параметры оформления раздела. Разберем последовательно, что эти аргументы означают.
Первый из аргументов (в нашем случае section) — это " внутреннее имя", под которым LaTeX будет узнавать определяемый тип разделов документа. Если вы решили использовать команду \@startsection с "нестандартным" первым аргументом (скажем, abcd), то заодно придется определить счетчик с именем abcd, который будет отвечать за нумерацию разделов, а также команду \l@abcd, которая будет отвечать за сбор материала для оглавления, и команду \abcdmark, отвечающую за передачу информации для колонтитулов,так что без надобности командой \@startsection с нестандартным первым аргументом лучше не пользоваться.
Второй аргумент (в нашем случае 1) — это тот самый " уровень вложенности" раздела, о котором шла речь выше.
Третий аргумент задает отступ заголовка от левого поля (в нашем случае этот отступ равен нулю).
Четвертый аргумент команды \@startsection (в нашем случае это -3.5ex plus -1ex minus -.2ex) задает величину вертикального отступа, оставляемого перед заголовком. Точнее говоря, вертикальному отступу равен не сам четвертый аргумент, а его абсолютная величина (при определении отступа знаки - отбрасываются), а знак - означает, что первый абзац нашего раздела будет печататься без абзацного отступа, как и оформляются разделы в стандартных LaTeX'овских стилях.
Если задать эти расстояния как положительные числа, то абзацный отступ в первом абзаце подавляться не будет. Тот факт, что отступ перед началом раздела имеет plus- и minus-компоненты, означает, как водится, что этот пробел обладает растяжимостью и сжимаемостью.
Пятый аргумент (в нашем случае 2.3ex plus .2ex) задает величину вертикального отступа после заголовка раздела, а тот факт, что он положителен, означает, что заголовок раздела печатается на отдельной строке (или строках, если в строку он не умещается). Если он будет отрицательным, то заголовок раздела будет печататься не на отдельной строке, а в подбор; значение пятого аргумента \@startsection будет означать при этом (после отбрасывания знака минус, естественно) величину дополнительного горизонтального отступа между заголовком раздела и продолжающим его текстом из первого абзаца раздела.
Пятый аргумент \@startsection тоже, как видите, может содержать plus- и/или minus-компоненту.
Наконец, шестой аргумент команды \@startsection задает стиль оформления заголовка. Точнее говоря, в этом аргументе записан текст и/или команды, которые будут вставлены перед заголовком раздела. В нашем случае этот аргумент содержит только команды
\normalfont\Large\bfseries задающие шрифт, которым заголовок будет напечатан (на последующий текст эта смена шрифта не повлияет, поскольку команды, указанные в шестом аргументе \@startsection, будут выполняться внутри группы).
Приведем пример того, как можно изменить стандартное оформление. Пусть нам хочется, чтобы команда \section порождала раздел документа, оформленный таким образом:
;\renewcommand{\thesection}{\Roman{section}} А теперь переопределим и саму команду \section следующим образом:
\renewcommand{\section}{\@startsection{section}{1}% {\parindent}{3.5ex plus 1ex minus .2ex}% {2.3ex plus.2ex}{\normalfont\Large\S}} Мы воспользовались \renewcommand, поскольку команда \ section ранее уже была определена. В четвертом аргументе мы убрали знаки -, чтобы не подавлять абзацный отступ, а в третьем — задали отступ заголовка от левого поля, равный абзацному отступу (причина этого не программистская, а эстетическая: некрасиво, когда первый абзац раздела идет с отступом, а заголовок начинается вплотную к левому полю). Прочие параметры, задающие размеры отступов, мы оставили такими же, как в стандартной LaTeX'овской команде: они достаточно разумны, и незачем их трогать, если на то нет особых причин.
Как видите, для того, чтобы модифицировать оформление разделов, надо знать размеры стандартных LaTeX'овских параметров оформления, наподобие отступа перед или после заголовком. Для команды \section
| \subsection | 0pt | -3.25ex plus -1ex minus-.2ex | 1.5ex plus.2ex |
| \subsubsection | 0pt | -3.25ex plus -1ex minus-.2ex | 1.5ex plus.2ex |
| \paragraph | 0pt | 3.25ex plus 1ex minus.2ex | -1em |
| \subparagraph | \parindent | 3.25ex plus 1ex minus.2ex | -1em |
Шестой аргумент команды \@ startsection позволяет автоматически добавлять текст перед номером раздела. К сожалению, не так просто2) заставить LaTeX автоматически добавлять текст после номера, хотя такая потребность порой возникает (например, хочется, чтобы в заголовках разделов после номеров стояли точки, чего стандартное LaTeX'овское оформление не предусматривает).
Можно заставить LaTeX ставить точки после номеров, написав
\renewcommand{\thesection}{\arabic{section}.} но после этого автоматические ссылки на раздел, сгенерированные с помощью команды \ref, также будут заканчиваться точками, что нелепо.
Оформление глав отличается от оформления остальных разделов тем, что слово "Глава" и номер главы печатаются на отдельной строке. С помощью команды\@startsection определить такой раздел нельзя, поэтому главы определяются в LaTeX'овских классах иначе. Не будем вдаваться в подробности, как именно, а вместо этого рассмотрим единственно важный для нас вопрос: как можно менять оформление глав.
Большая часть оформления главы задается в определении команды \@makechapterhead, так что для модификации оформления именно ее и надо переопределять. Рассмотрим, как \@makechapterhead определяется в стандарте. Этой команде передается один аргумент — заголовок главы. В переводе с TeX'а на LaTeX определение выглядит так (не забудьте, что #1 — это аргумент, т. е. текст заголовка):
\newcommand{\@makechapterhead}[1]{% Начало макроопределения \vspace*{50 pt}% Пустое место вверху страницы {\parindent=0pt \raggedright \normalfont\huge\bfseries \@chapapp{} % \@chapapp печатает слово "Глава" (см. ниже) \thechapter \par % номер главы - в отдельной строке \vspace{20 pt} % между словом "Глава" и ее заголовком \normalfont\Huge\bfseries #1\par % заголовок главы \nopagebreak % чтоб не оторвать заголовок от текста \vspace{40 pt} % между заголовком и текстом }% конец группы. }% конец макроопределения Разберем эту "программу". Первая команда \vspace* оставляет пустое место вверху страницы (поскольку главы начинаются с новой страницы).
Далее печатается слово "Глава", ее номер и заголовок главы; поскольку заголовок может не поместиться в строку, надо предусмотреть, какие будут при этом параметры верстки абзаца. Как видите, устанавливается нулевое значение абзацного отступа и отсутствие выравнивания по правому краю; чтобы такой режим не распространился на дальнейший текст, соответствующие команды даны внутри группы. Внутри этой же группы определен шрифт, которым будет печататься заголовок.
Команда \@chapapp печатает слово " Chapter", "Глава",... — одним словом, то, как в вашем документе называются главы. Точнее говоря, по умолчанию эта команда работает так же, как \chaptername, а после команды \appendix (если таковая есть в вашем файле) начинает работать как \appendixname . Если в вашем тексте все главы называются одинаково, то при переопределении \@makechapterhead можно не мудрить, а прямо заменить \@chapapp на "Глава". Не забудьте только оставить пробел между этим словом и номером главы (выше это было сделано с помощью обычного трюка с парой фигурных скобок).
Остальное в приведенном выше определении разъяснений, надо думать, не требует. Скорее всего, вы захотите в этой команде изменить шрифт, которым печатается заголовок главы, или же интервалы, отделяющие заголовок от остального текста. Чтобы изменить вид, в котором представляется на печати номер главы, надо, как водится, переопределить команду \thechapter. Можно при желании задать и какое-нибудь более сложное оформление заголовка с помощью блоков и линеек — все зависит от вашей фантазии и вкуса!
Надо еще сказать, что мы немного обманули читателя: на самом деле в стандартных классах команда \@makechapterhead определена таким образом, что если значение счетчика secnumdepth отрицательно, то команды, записанные в строках с пятой по седьмую, не исполняются (и номер главы не печатается). В нашем определении эти команды будут исполняться всегда, вне зависимости от значения secnumdepth; если вы переопределяете \@makechapterhead и не хотите, чтобы главы нумеровались, просто удалите соответствующие строки из определения.
Кроме того, если в классе book вы переопределите \@makechapterhead, отталкиваясь от этого определения, то главы, заданные как \chapter без звездочки, будут нумероваться, невзирая на команды \frontmatter и \backmatter (но вы ведь сможете поставить две-три звездочки самостоятельно?).
За оформление заголовка главы, определенной командой \chapter со звездочкой, отвечает команда \@makeschapterhead. Ее определение в стандарте аналогично определению \@makechapterhead, с тем отличием, что из него удален фрагмент, отвечающий за печать номера:
\newcommand{\@makeschapterhead}[1]{% \vspace*{50 pt}% {\parindent=0pt \raggedright \normalfont\Huge\bfseries #1\par \nopagebreak \vspace{40 pt}}} Кроме оформления заголовка, с оформлением глав можно делать еще две вещи. Во-первых, главы начинаются либо просто с новой страницы (как в классе report), либо с новой нечетной страницы (как в классе book); чтобы повлиять на этот выбор, не надо ничего делать в личном стилевом пакете, достаточно просто указать классовую опцию openright или openany (в необязательном аргументе команды \documentclass). Во-вторых, по умолчанию абзацный отступ в первом абзаце главы подавляется; вы можете захотеть сделать так, чтобы он не подавлялся. Чтобы решить эту проблему, надо переопределять уже саму команду \chapter, а для этого надо знать, как она определяется в стандарте. Вот соответствующее определение, опять в переводе на LaTeX с TeX'а, в классе book:
\newcommand{\chapter}{\cleardoublepage \thispagestyle{plain}% \global\@topnum=0 \@afterindentfalse \secdef\@chapter\@schapter} Разбирать это определение мы не будем, чтобы не запутаться в некоторых слишком хитрых TeX'овских и LaTeX'овских конструкциях, а просто скажем две вещи:
Модификация стандартных классов
Мне кажется, гиппопотамаЗовут так длинно для того,
Чтоб сторож из глубокой ямы
Пореже вызывал его.
С.Я.Маршак
Эта лекция предназначена для тех, кого не удовлетворяет оформление, предлагаемое стандартными классами LaTeX'а. Возможно, вам даже захочется создать свой собственный класс документов вместо стандартных article, proc, report или book. Задача эта выполнимая, но для этого надо в деталях знать, во-первых, книгу [2], а во-вторых — исходные тексты LaTeX'а (они доступны). У читателя настоящей книги таких познаний не предполагается, так что мы предлагаем нечто более скромное: научиться модифицировать оформление одного конкретного документа.
Прежде чем двигаться дальше — два предупреждения. В этой лекции мы расскажем вам, как можно довольно сильно изменить стандартное LaTeX'овское оформление: вы научитесь менять по своему усмотрению шрифты в заголовках, интервалы, отделяющие заголовки от текста, и много других подобных вещей. Но вот первое предупреждение: если вы не являетесь профессиональным полиграфистом, применяйте эти познания с осторожностью. Не пытайтесь менять сразу много разных элементов оформления или резко изменять какие-то параметры: лучше осторожно менять только то, что вам действительно нужно. Учтите: когда дилетант берется за оформление книги, в девяти случаях из десяти результат бывает достоин сожаления.
Второе предупреждение: стиль оформления записан в специальных " стилевых" или "классовых" файлах, входящих в комплект поставки LaTeX'а. Ни в коем случае не меняйте ничего в этих файлах: все изменения в стиле оформления надо записывать в собственном стилевом пакете, как объяснено ниже.
Оформление подрисуночной подписи
Обсудим, как можно менять оформление подписи под рисунком (или таблицей), создаваемой командой \caption).Над и под подписью предусмотрены вертикальные отбивки. Их размеры хранятся в параметрах со значением длины (растяжимой) \abovecaptionskip (отбивка над подписью) и \belowcaptionskip (под подписью). В стандарте отбивка над подписью равна 10pt (без растяжимости или сжимаемости), а под подписью — нулю.
Чтобы изменить само оформление подписи, надо переопределить команду \@makecaption; вот ее стандартное определение в адаптированном виде (параметр #1 — номер иллюстрации или таблицы с подписью, то есть значение команды \thefigure или \thetable; параметр #2 — текст подписи):
\newcommand{\@makecaption}[2]{% \vspace{\abovecaptionskip}% \sbox{\@tempboxa}{#1: #2} \ifdim \wd\@tempboxa >\hsize #1: #2\par \else \global\@minipagefalse \hbox to \hsize {\hfil #1: #2\hfil}% \fi \vspace{\belowcaptionskip}} Разберем этот код. Во второй и последней строчках вокруг подписи делаются отбивки, как было объяснено выше. В третьей строке в блоковую переменную \@tempboxa (эта переменная используется LaTeX'ом для временного хранения данных такого рода) записывается текст подписи вместе с номером (пока что в одну строку; поскольку в данный момент этот текст еще не печатается, нас не волнует, не окажется ли он длинней, чем ширина полосы). В следующих шести строках (с помошью не рассматривавшейся нами TeX'овской конструкции "условных макросов") длина подписи с номером сравнивается с шириной текста (она обозначена \tex'овским параметром \hsize: при одноколонном наборе это то же самое, что \textwidth), а при многоколонном — \columnwidth). Если подпись вместе с номером длиннее строки, то она печатается как абзац (часть кода между \ifdim) и \else), а если не длиннее, то центрируется (часть кода между \else и \fi). Код на седьмой строке воспринимайте как данность.
Что можно изменить в этом определении? Поскольку #1 — это номер, а #2 — текст подписи, нетрудно заметить, что номер отделяется от подписи двоеточием, что с отечественными полиграфическими традициями не согласуется.
Разумно заменить в этом месте двоеточие на точку. Кроме того, можно изменить шрифт, которым печатается подпись. Только не забудьте, что при переопределении надо будет вставить команды смены шрифта в три места (всюду, где в исходном определении стоит #1: #2): и в "измеряющую размер" строку, начинающуюся с \sbox (от смены шрифта размер тоже может измениться), и в оба варианта печати. Наконец, вы можете решить (не знаю, насколько это правильно) никогда не центрировать подписи; тогда в измененном определении \@makecaption надо будет удалить строки, начинающиеся с \ifdim, \else и \fi, а также текст между \else и \fi (и, возможно, установить свои любимые параметры верстки абзаца). Возможны, наверное, и другие решения. В любом случае помните, что текст между \ifdim и \else относится к случаю, когда подпись с номером в строку не умещается, а текст между \else и \fi — к противоположному.
И последнее: команду \@makecaption вы будете, конечно, переопределять с помощью \renewcommand; имейте в виду, что в данном случае надо пользоваться вариантом \renewcommand без звездочки, поскольку второй аргумент этой команды (текст подписи) вполне может состоять из нескольких абзацев.
Оглавление, список иллюстраций и прочее
Автоматическая сборка оглавления — многоэтапный процесс. Сначала материал для оглавления (заглавия разделов и номера соответствующих страниц) записывается в специальный файл с тем же именем, что и у основного файла, и расширением toc (в нормальных условиях эта запись обеспечивается командами \chapter, \section и т.д.); при следующем запуске LaTeX'а этот toc-файл считывается (с помощью команды \input), команды, записанные в него, исполняются, и в результате происходит фактическая печать оглавления. Аналогичным образом составляются список иллюстраций и список таблиц (при этом информация записывается в файлы с расширениями lof или lot соответственно). Давайте научимся влиять на этот процесс.Сначала расскажем, как составлять оглавление полностью вручную, игнорируя его автоматическую сборку, обеспечиваемую командами типа \section. Итак, предположим, что все команды \section, \chapter и т.п. даны в исходном тексте в варианте со звездочкой, и посмотрим, как можно самому создать оглавление.
Команда \addtocontents служит для записи в toc- (соответственно,lof - или lot-)- файл любого текста и любых TeX'овских команд. У этой команды два обязательных аргумента. Первый из них должен быть toc, lof или lot, в соответствии с тем, в какой из файлов с оглавлениями вы пишете свой текст. Второй аргумент — то, что вы хотите записать в файл. Если, например, вам взбрело в голову внести в оглавление к вашей книге текст "У попа была собака" (не будем спрашивать, зачем), то можете написать
\addtocontents{toc}{У попа была собака\par} (\par поставить необходимо, так как до и после выполнения каждой команды, записанной в оглавлении, TeX должен находиться в вертикальном режиме). Если после этого запустить LaTeX два раза, то вы увидите в оглавлении свой текст (после первого раза он только попадет в toc-файл, а при втором запуске toc-файл с этим текстом будет обработан).
С помощью команды \addtocontents можно записывать в оглавление не только всякие глупости. Если, например, вы хотите в каком-то месте оглавления провести горизонтальную линейку шириной во всю страницу, то можно написать
\addtocontents{toc}{\hrule} и в оглавлении появится линейка. Имейте только в виду, что в аргументе \addtocontents необходимо защищать хрупкие команды с помощью команды \protect. В случае с \hrule мы обошлись без \protect, так как эта команда не хрупка, но если есть сомнения, то лучше команду защитить. Напомним, что \protect действует только на непосредственно следующую команду и что команды для смены шрифта или установки пробелов в защите с помощью \protect не нуждаются. Приведем пример более разумного применения \addtocontents, в котором требуется \protect. Пусть вы не хотите, чтобы какая-то из строк в оглавлении начинала новую страницу. Тогда надо перед командой, порождающей эту строку оглавления (обычно таковой будет команда наподобие \section), написать в своем файле вот что:
\addtocontents{toc}{\protect\nopagebreak} В результате в toc-файл запишется команда \nopagebreak, и нежелательный разрыв страницы в оглавлении будет предотвращен. Если опустить \protect, то получится весьма непонятное сообщение об ошибке.
При совместном использовании команд \addtocontents возникает следующий неприятный эффект. Пусть ваш файл имеет вид, скажем,
\documentclass{book} \usepackage{mystyle} \begin{document} \tableofcontents \include{ch1} \addtocontents{\hrule} \include{ch2} \end{document} Тогда, вопреки всем ожиданиям, в оглавлении линейка окажется не между записями, отвечающими файлам ch1.tex и ch2.tex, а после записей, отвечающих файлу ch2.tex. Чтобы этого избежать, запишите команду \addtocontents в начало файла ch2.tex (самой первой строчкой).
Чтобы составить полноценное оглавление, надо иметь возможность записать в toc - (соответственно, lof- или lot-) файл не только текст, но и номер той страницы, к которой этот текст относится. Это делается с помощью команды \addcontentsline, имеющей такой синтаксис:
\addcontentsline{тип\_файла}{тип\_записи}{текст} Здесь тип_файла — это toc, lof или lot, текст — тот текст, который будет записан в оглавление (например, команда \section в стандартном стиле article в качестве этого текста передает название раздела и его номер; подробности см.
ниже). Наконец, тип_записи определяет, каким образом будет обрабатываться этот текст при чтении файла с оглавлением. Именно, если второй аргумент в команде \addcontentsline был abcd, то, когда при следующем запуске LaTeX'а будет читаться toc- (соответственно, lof- или lot-) файл, будет исполнена команда \l@abcd с двумя аргументами, первый из которых - текст, записанный в третьем аргументе команды \addcontentsline, а второй - номер страницы, на которую попала ваша команда \addcontentsline. Например, если в файле было написано
\leavevmode \hbox to\hsize{\verb"\addcontentsline{toc}{abcd}{О слонах}"\hfill $\displaystyle(*)$ и если эта команда попала на страницу
, то при следующем запуске LaTeX'а в процессе чтения toc-файла будет исполняться команда\l@abcd{О слонах}{95} Разумеется, чтобы при этом не получилось сообщения об ошибке, надо, чтобы команда \l@abcd была определена. Стало быть, в стилевом пакете должно присутствовать ее определение. Если мы хотим, чтобы запись
в исходном файле порождала в оглавлении строкуО слонах................................ 95 то в преамбуле надо написать вот что:
\newcommand{\l@abcd}[2]{\hbox to\textwidth{#1\dotfill #2}} Чтобы при этом страница в оглавлении была указана верно, необходимо команду \addcontentsline разместить непосредственно после команды \section* (иначе есть опасность, что они попадут на разные страницы).
Если в третьем аргументе команды \addcontentsline присутствуют "хрупкие" команды, то их следует, как водится, защитить командой \protect, если, с другой стороны, в нем записана \the-команда, соответствующая какому-то счетчику, то в toc-файл будет записано печатное представление значения этого счетчика по состоянию на тот момент, когда выполнялась \addcontentsline. Таким способом можно, например, записать в оглавление номер текущего раздела документа: достаточно сказать
\addcontentsline{toc}{abcd}{\thesection. О слонах} Теперь рассмотрим, как именно собирают оглавление стандартные команды наподобие \chapter или \section.
Делают они это также с помощью \addcontentsline, при этом ее второй аргумент (" тип записи") будет section для команды \section, subsection для команды \subsection, — одним словом, " внутреннее имя", под которым LaTeX знает тип разделов документа (напомним, что внутреннее имя передается в качестве первого аргумента команде \@startsection). Стало быть, для модификации стиля оформления строк оглавления, соответствующих \section, надо переопределять команду \l@section, для модификации строк оглавления, соответствующих \subsection, надо переопределять \l@subsection и т.д. Чтобы было понятно, как их переопределять, рассмотрим, как они определены в стандарте.
В классе book команда \l@section определена так:
\newcommand{\l@section}{\@dottedtocline{1}{1.5em}{2.3em}} Смысл трех выражений, стоящих в фигурных скобках после команды \@dottedtocline, таков. Первое выражение — "уровень вложенности" элемента оглавления. Если этот уровень превышает значение счетчика tocdepth, то команда \@dottedtocline ничего в оглавлении не печатает. Второе выражение — отступ строки оглавления от левого поля. Третье выражение определяет, сколько места в строке оглавления TeX отведет на номер раздела. Результат выглядит на печати так: после отступа, указанного во втором выражении, печатается номер раздела, затем, отступя от начала этого номера столько, сколько сказано в третьем выражении, печатается заглавие раздела. Это сделано для того, чтобы заглавия всех разделов печатались в оглавлении одно под другим. После заглавия идут "лидеры" — ряд точек до завершающего строку номера страницы. Если заглавие в строку не укладывается, то оно обычным образом будет перенесено на следующую строку (если есть какие-то неясности, загляните в оглавление к этой книге). Из сказанного следует, что слишком длинный номер раздела может в оглавлении наложиться на заглавие. Средство борьбы с этим — переопределить команду \l@section (или \l@subsection...), увеличив должным образом второй аргумент команды \@dottedtocline.
Параметры оформления элемента оглавления, задаваемого командами, определенными через \@dottedtocline, можно менять. Именно, размер места, отводимого на номер страницы, задается значением команды \@pnumwidth, которую можно переопределить. В классе book эта команда определена как
\newcommand{\@pnumwidth}{1.55em} и соответственно на номер страницы отводится 1.55em места. Если мы хотим, чтобы на номер страницы отводилось \2em, надо написать
\renewcommand{\@pnumwidth}{2em} Еще одна команда, значение которой отвечает за оформление оглавления, — это \@tocrmarg. Если запись в оглавлении занимает более одной строки, то значение этой команды задает отступ от правого поля, который будет у всех строк, кроме той последней, что завершается номером страницы. Если вы хотите, чтобы размер этого отступа равнялся 3em, напишите так:
\renewcommand{\@tocrmarg}{3em} Хотя \@pnumwidth и \@tocrmarg используются для задания размеров, они не являются параметрами со значением длины; запись наподобие \@tocrmarg=4emприведет к ошибке!
Наконец, регулировать густоту точек-" лидеров" можно, если переопределить команду \@dotsep. В классе book она определена как
\newcommand{\@dotsep}{4.5} Если вы хотите, чтобы точки шли погуще, попробуйте переопределить ее, заменив 4.5 на число поменьше (число может быть дробным, в нем можно использовать как десятичную запятую, так и десятичную точку):
\renewcommand{\@dotsep}{3,9} Напрашивающаяся запись \@dotsep=3,9 приведет к ошибке.
Команды \l@subsection и "более мелкие" определяются в классе book так же, как \l@section, отличаются только аргументы команды \@dottedtocline. Мы собрали значения этих параметров в табл. 9.3
| \l@subsection | 2 | 3.8em | 3.2em |
| \l@subsubsection | 3 | 7.0em | 4.1em |
| \l@paragraph | 4 | 10em | 5em |
| \l@subparagraph | 5 | 12em | 6em |
Вот ( в адаптированном виде, как водится) определение команды \l@chapter из стандартного класса book. Чтобы было понятно, о чем идет речь, напомним, что в этом определении на место #1 подставляется информация о номере (если главы нумеруются) и названии главы, а на место #2 — номер страницы.
\newcommand{\l@chapter}[2]% {\pagebreak[3] \vspace{1em plus 1pt}% отбивка перед строкой оглавления \@tempdima=1.5em % место для номера главы {% Дальнейшее происходит внутри группы... \rightskip=\@pnumwidth % см. ниже \parfillskip=-\@pnumwidth \noindent\bfseries % Начать абзац, установить шрифт \addtolength{\leftskip}{\@tempdima}% см. ниже \hspace{-\leftskip}#1\nolinebreak \hfil\nolinebreak \hbox to \@pnumwidth {\hss #2}\par \nopagebreak[3] % лучше бы здесь не рвать страницу... }% конец этой группы }% конец определения Определение, как видите, длинное и сложное, к тому же автору не удалось полностью изгнать из него не упоминавшиеся ранее TeX'овские конструкции. Приведено оно здесь не для того, чтобы вы самостоятельно создавали подобные определения "с нуля", но чтобы вы при необходимости смогли в нем кое-что осторожно изменить. Разберем определение по порядку. В начале встречаются не рассматривавшиеся нами параметры \rightskip и \leftskip. Эти параметры со значением длины (по умолчанию они равны нулю) имеют следующий смысл: все строки абзаца начинаются с отступом \leftskip от левого поля и кончаются с отступом \rightskip от правого поля (если речь идет о последней строке, то в дополнение к отступу \parfillskip). У нас \rightskip устанавливается равным длине, записанной в определении команды \@pnumwidth (именно столько места будет отведено на номер страницы), а \leftskip устанавливается равным значению переменной \@tempdima, определяющей, сколько места будет отведено на номер главы. С другой стороны, параметр \parfillskip устанавливается равным отрицательной величине - \@pnumwidth. Тем самым, если название главы длинное и не поместится в одну строку оглавления, произойдет следующее: все строки, кроме последней, будут заканчиваться на расстоянии \@pnumwidth от правого края, а последняя строка, содержащая номер страницы, закончится на расстоянии
\leftskip + \parfillskip = @pnumwidth - \@pnumwidth =0, от края, так что номер страницы будет все-таки прижат вправо.
Между \@pnumwidth и \@tempdima есть существенная разница. Команда \@pnumwidth всегда определяет только место, отводимое на номер страницы, и эту команду можно переопределять в стилевом пакете. С другой стороны, параметр \@tempdima используется LaTeX'ом для самых разных целей (в основном — для временного хранения различных длин в процессе каких-то вычислений), и он может измениться в процессе выполнения очень многих LaTeX'овских команд, так что присваивать ему какое-то значение в стилевом пакете совершенно бессмысленно — все равно после этого оно сто раз изменится. Как мог заметить читатель, значение этому параметру присваивается в начале исполнения команды \l@chapter, и именно это значение принимается в расчет в дальнейшем. Поэтому, если вы захотите отводить на номер главы, скажем, 2em вместо 1.5em, то вам придется переопределить команду \l@chapter, заменив третью строку на
\@tempdima=2em Нужда в таком переопределении \l@chapter возникает, например, если мы переопределяем команду \thechapter, чтобы номер печатался римскими цифрами (как в книге, которую вы читаете). Далее, #1 - это, как уже было сказано, номер и заглавие главы. Точнее говоря, на месте #1 печатается такой текст (будем считать, что глава называется "Все о слонах"):
\makebox[\@tempdima][l]{\thechapter}Все о слонах Таким образом, величина отступа от левого поля до названия главы всегда равна \@tempdima; если номер занимает больше места, чем \@tempdima, то он наложится на название.
Команда \hfil в двенадцатой строке обеспечивает пробел между названием главы и номером страницы. Если вы хотите заполнить этот пробел лидерами, можете в определении \l@chapter заменить \hfil на, скажем,
\leaders\hbox to .5em{\hss.\hss}\hfil (автор не гарантирует, что именно при таком выборе параметров лидеры будут выглядеть красиво).
Наконец, команды \pagebreak[3] в начале и \nopagebreak[3] в конце играют следующую роль: первая из них призывает LaTeX не печатать, по возможности, строку оглавления, соответствующую главе, внизу страницы, а вторая — не разрывать страницу сразу после строки, посвященной главе (опять же по возможности).
Имейте также в виду, что мы удалили из нашего упрощенного определения \l@chapter проверку значения счетчика tocdepth, так что если вы в какой-то момент решите не включать главы в оглавление, эту команду надо будет переопределить на "ничего не делать" так:
\renewcommand{\l@chapter}[2]{} Команды, определяющие вид записей в списке иллюстраций (соответствующих плавающим иллюстрациям) и списке таблиц (соответствующих плавающим таблицам) называются \l@figure и \l@table соответственно и определяются в стандарте с помощью \@dottedtocline.
До сих пор речь шла о сборке материала для оглавления, списка иллюстраций и т.п. Однако же и у самого оглавления есть заголовок, и его оформление тоже можно менять. Чтобы было понятно, как это делать, опишем, как определена команда \tableofcontents стандартное определение} в стандартном стиле article:
\newcommand{\tableofcontents}% {\section*{\contentsname}\@starttoc{toc}} Здесь \contentsname — это уже знакомая нам команда, которую при работе с русскими текстами приходится переопределять. Как видите, заголовок оглавления оформляется просто как заголовок ненумерованного раздела. Вы можете вместо этого оформить заголовок, скажем, с помощью \subsection, или еще каким-либо образом. Новой для вас будет команда \@starttoc. У этой команды предусмотрен один обязательный аргумент. Этим аргументом должен быть toc (для оглавления), либо lot или lof (для списка таблиц или иллюстраций соответственно). Команда \@starttoc читает toc- (соответственно, lot- или lof-) файл и создает оглавление как таковое.
На самом деле в определении \tableofcontents присутствует еще команда, позволяющая задать текст для включения в колонтитулы (вспомним, что \section* сама по себе никакой информации для колонтитулов не дает). Мы не будем здесь вдаваться в скучные подробности. Когда вы научитесь задавать такие команды, вы сможете соответствующим образом переопределить и \tableofcontents.
Окружения list и trivlist
Все LaTeX'овские перечни являются на самом деле частными случаями одной общей конструкции — окружения list. Рассмотрим, как это окружение работает.Окружение list имеет два обязательных аргумента. Общий вид этого окружения в исходном тексте будет такой:
\begin{list}{заголовок\_по\_умолчанию}{команды} ... \end{list} Аргументы окружения list означают следующее. "Заголовок по умолчанию — это заголовок элемента перечня, печатающийся в том случае, когда этот элемент перечня вводится командой \item без аргумента. Пример:
![]() | \begin{list}{И какой-то}{} \item малыш показал ему шиш. \item барбос укусил его в нос. Нехороший барбос, невоспитанный! \end{list} |
![]() | Вот как выглядят первые буквы латинского алфавита: \begin{list}{\Alph{tmp}:}% {\usecounter{tmp}} \item Выглядит так же, как соответствующая русская буква, и читается так же. \item Читается не так, как похожая на нее русская буква. \item И с ней та же история. \end{list} |
Окружением list разумно пользоваться не непосредственно, как в приведенных примерах, а для определения нового окружения с помощью \newenvironment. Вот, например, как в стандарте определяется окружение {quote}:
\newenvironment{\quote}% {\begin{list}{}{\rightmargin=\leftmargin}\item[]}}% {\end{list}} Команда \item с пустым аргументом необходима, поскольку до команды \item в перечне не должно быть никакого текста.
Наряду с окружением list в LaTeX'е определен его важный частный случай — окружение trivlist. Его отличия от list таковы:
Окружения list можно вкладывать друг в друга; максимальная глубина вложенности равна шести. В окружениях наподобие {itemize} предусмотрен "ограничитель", снижающий эту макимальную глубину до четырех. В личном стилевом файле, не рассчитанном на общее пользование, предусматривать такой ограничитель большого смысла нет: просто следите за тем, чтобы не вкладывать слишком много list'ов друг в друга.
Отбивки в перечнях
Начнем с важного предупреждения. Чтобы изменить отбивки, с помощью которых оформляются перечни, необходимо, естественно, изменить значение каких-то из перечисляемых в этом разделе параметров. Однако же, если попросту присвоить этим параметрам новые значения в преамбуле или в стилевом пакете, то в большинстве случаев действия это не возымеет. Средства, которые надо применить, чтобы эти изменения подействовали, описаны в следующем подразделе.Теперь договоримся о терминологии. Каждый перечень LaTeX рассматривает как состоящий из элементов (каждый элемент вводится, как мы помним, командой \item). В свою очередь, каждый элемент перечня может состоять из одного или нескольких абзацев. Наконец, у каждого элемента перечня есть свой заголовок — " горошина" на первом уровне окружения {itemize}, заданный вами заголовок в окружении {description} и т.п. (У некоторых перечней — например, таковы "теоремы" — перечень состоит из одного-единственного элемента; у таких перечней, как {quote} или {verse}, кроме того, заголовок к этому единственному элементу всегда пуст.)
Вооружившись этими терминами и имея в виду предупреждение, приступим к утомительному перечислению параметров. Все они — параметры со значением длины. Во-первых, параметры \leftmargin и \rightmargin задают, с каким отступом от левого (правого) поля начинается (заканчивается) текст элементов перечня (полиграфист сказал бы: насколько втянуты элементы перечня). Если перечень вложен в другой перечень, то \leftmargin и \rightmargin обозначают величину втяжки по отношению к объемлющему перечню.
Следующие два параметра влияют на размещение заголовков в перечне. Параметр \labelsep задает расстояние между правым краем заголовка и началом текста в элементе перечня, к которому относится этот заголовок, а параметр \labelwidth задает место по горизонтали, которое по умолчанию занимает заголовок. Точный смысл этих параметров следующий. При обработке перечня LaTeX сначала пытается поместить заголовок в блок шириной \labelwidth.
Если места хватает, то именно в такой блок он и помещается, причем выключенным вправо: правый край блока при этом находится на расстоянии \labelsep от начала текста, составляющего элемент перечня (так что его левый край будет на расстоянии
\leftmargin - \labelwidth - \labelsep от левой границы основного текста или объемлющего перечня). Если же ширина заголовка больше, чем \labelwidth, то заголовок печатается как есть. Такое, например, регулярно случается при пользовании окружением {description}.
Мы не сказали еще об одном параметре, влияющем на размещение заголовков. Именно, если параметр \itemindent отличен от нуля, то каждый заголовок перечня будет дополнительно сдвинут на это расстояние вправо. Соответственно, при определении, на каком расстоянии начинается заголовок элемента перечня, надо будет прибавить значение \itemindent к тому, что получается по формуле
. По умолчанию значение этого параметра равно нулю. Если элемент перечня состоит из нескольких абзацев, то по умолчанию во всех этих абзацах абзацный отступ будет отсутствовать. Можно, однако, при желании задать такой режим, что во всех, кроме первого, абзацах каждого элемента перечня будет присутствовать абзацный отступ. Для этого надо задать ненулевую величину этого отступа в параметре \listparindent. Кстати, значение этого параметра может быть и отрицательным (в этом случае эффект будет похож на тот, что достигается в обычном тексте установкой параметров \hangindent и \hangafter).
Параметры, о которых шла речь до сих пор, относились к размещению материала по горизонтали. Теперь займемся "вертикальными" параметрами. Сразу отметим, что все эти параметры являются " растяжимыми" длинами, т.е. у них можно задавать plus- и minus -компоненты.
Первый (и основной) из этих параметров называется \topsep. Это величина дополнительного вертикального интервала, который делается перед перечнем и после него (в дополнение к \parskip).
Если перед перечнем оставлена пустая строка (или имеется команда \par), то перед и после перечня устанавливается еще и вертикальный отступ, равный \partopsep (в дополнение к отступам, заданным параметрами \parskip и \topsep).
Далее, вертикальный отступ между абзацами внутри одного элемента задается параметром \parsep (а не \parskip, как в обычном тексте). Между различными же элементами перечня, в дополнение к \parsep, оставляется еще и вертикальный отступ \itemsep. Таким образом, если \itemsep отличен от нуля, как это и сделано в стандартных классах, то различные элементы перечня будут более отделены друг от друга, чем абзацы внутри одного элемента перечня.
Перечни общего вида
В этом разделе мы завершим рассказ о том, как менять стиль оформления перечней. В лекции 3 мы назвали перечнями окружения {itemize}, {enumerate} и {description}; помимо этого, к перечням в LaTeX'овском смысле относятся {flushleft}, {flushright}, {center}, {quote}, {quotation}, {verse}, а также окружения, создаваемые с помощью \newtheorem; как мы увидим в лекции 5, все эти окружения — частные случаи одной LaTeX'овской конструкции. Поэтому многие параметры оформления этих окружений устанавливаются и модифицируются по единой схеме.Плавающие объекты
Этот раздел посвящен плавающим иллюстрациям и таблицам (короче: плавающим объектам).Предметный указатель
Первое, что вы можете изменить в оформлении предметного указателя (окружение {theindex}), - это отступы, создаваемые командами \item, \subitem и т.д. Для изменения отступов "на первом уровне" (создаваемых командой \item) надо переопределить команду \@idxitem (но не сам item!). Чтобы вам было от чего отталкиваться, посмотрите на стандартное определение этой команды. Оно очень простое:\newcommand{\@idxitem}{\par\hangindent=40pt} Для изменения отступов, создаваемых такими командами, как \subitem и subsubitem, надо переопределить непосредственно эти команды. Их стандартные определения также бесхитростны:
\newcommand{\subitem}{\par\hangindent=40pt\hspace*{20pt}} \newcommand{\subsubitem}{\par\hangindent=40pt\hspace*{30pt}} Наконец, команда \indexspace, создающая в предметном указателе дополнительный вертикальный пробел, определяется в стандартных стилях так:
\newcommand{\indexspace}{\par\vspace{10pt plus 5pt minus 3pt}} Иногда хочется изменить оформление предметного указателя более существенным образом. Например, вы можете захотеть, чтобы ссылка на предметный указатель присутствовала в оглавлении (в LaTeX'овском стандарте это не предусмотрено); возможно также, что вы захотите предпослать предметному указателю небольшое введение, набранное во всю ширину страницы. Чтобы добиться таких вещей, надо переопределить окружение \theindex. Его стандартное определение в стилях book и report выглядит так:
\newenvironment{theindex}{\@restonecoltrue \if@twocolumn\@restonecolfalse\fi \columnseprule=0pt \columnsep=35pt \twocolumn[\@makeschapterhead{\indexname}]% \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}% \thispagestyle{plain}\parindent=0pt \setlength{\parskip}{0pt plus .3pt}% \let\item=\@idxitem}% {\if@restonecol \onecolumn \else \clearpage \fi} Первая, вторая, предпоследняя и последняя строки этого определения содержат незнакомые вам команды; мы не будем пытаться объяснить, что они значат, а только скажем, что менять эти места в определении окружения {theindex} нельзя.
Зато все остальное в этом определении должно быть понятно читателю, усвоившему основную часть нашей книги. Именно, в третьей строке задаются параметры двухколонного оформления в предметном указателе: там сказано, что колонки в окружении theindex не надо разделять линейкой и задается промежуток между двумя колонками. В пятой строке дана команда, задающая (неким не рассматривавшимся нами способом) материал для колонтитулов. Она либо вносит левую и правую пометки, совпадающие со стандартным заглавием предметного указателя, либо ничего не делает. Если вы переопределяете \theindex, то можете в этой строке написать \markboth вместо \@mkboth с теми аргументами, с какими считаете нужным, или вообще убрать эту строку, чтоб пометок не было. В шестой строке обратите внимание на команду, устанавливающую нулевое значение абзацного отступа. Менять ее не надо, поскольку именно с таким значением абзацного отступа согласовано действие команд \item, \subitem и т.п. (вспомните, как действует команда \angindent).
Наконец, в четвертой строке стоит команда \twocolumn с необязательным аргументом. Как объяснялось в лекции 3, то, что стоит в необязательном аргументе, будет напечатано во всю ширину страницы. В стандартном определении тут стоит команда \@makeschapterhead, создающая заголовок ненумерованной главы, но вы можете записать туда и любой текст, который хотите предпослать собственно предметному указателю. Правда, тут возникает один технический момент: введение к предметному указателю вы, видимо, захотите редактировать, и нехорошо для этого всякий раз лазать в стилевой пакет. Один из возможных выходов таков. Запишите в вашем определении окружения {theindex} четвертую строку так:
\twocolumn[\@makeschapterhead{\indexname}\input{ukaz.tex}] Здесь ukaz.tex — файл, в который вы запишете свое введение к предметному указателю.
Если вы хотите, чтобы предметный указатель был отражен в оглавлении, то в необязательный аргумент команды \twocolumn надо добавить команду \addcontentsline, например, в таком виде:
\addcontentsline{toc}{chapter}{\indexname} Поскольку предметный указатель, задаваемый с помощью окружения {theindex}, использует команду \twocolumn, колонки на последней странице указателя могут оказаться разной высоты. Как обычно, лекарство от этого — подключить стилевой пакет {multicol} и сделать так, чтобы окружение {theindex} использовало для печати окружение {multicols}. Для этого нужно переопределить окружение {theindex} следующим образом (мы предполагаем, что пакет {multicol} подключен):
\renewenvironment*{theindex}{\columnseprule=0pt\columnsep=35pt \@makeschapterhead{\indexname}% \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}% \thispagestyle{plain}\parindent=0pt \setlength{\parskip}{0pt plus .3pt}% \let\item=\@idxitem \begin{multicols}{2}}% {\end{multicols}} Разумеется, вы можете также изменить параметры в этом определении по своему усмотрению.
Последнее, что нужно сказать про окружение {theindex}, это то, что в классе article четвертая строка его стандартного определения выглядит так:
\twocolumn[\section*{\indexname}]% (поскольку в классе article главы не определены).
![]() |
![]() |
![]() |
2) Но возможно: это сделано, например, в пакете {russcorr}, использованном при подготовке данной книги. См. приложения E и Ж.
3) Эта терминология не совпадает с традиционной, но удобна для наших целей.
4) Точнее говоря, так будет, если в тексте нет команд типа \section: эти команды, как мы увидим ниже, автоматически вставляют в текст свои пометки, что усложняет картину.
5) Но не в именах команд; что будет с русскими буквами, зависит от русификации.
6) Точнее говоря, это будет заглавие либо текущего раздела, либо первого из разделов, начинающихся на этой странице — см. выше обсуждение \leftmark и \rightmark.
7) Именно так, а не переопределить с помощью \renewcommand!

Размещение плавающих объектов на странице
Сейчас мы обсудим параметры, которыми руководствуется LaTeX при размещении плавающих объектов на странице.Сразу же отметим, что все эти параметры относятся в равной мере к плавающим иллюстрациям и плавающим таблицам, и любое изменение этих параметров также затрагивает плавающие объекты всех типов.
Часть параметров, отвечающих за плавающие объекты, представляет собой LaTeX'овские счетчики, которым можно присваивать новые значения командой \setcounter:
.
.
.
.Вторая группа параметров регулирует уже не количество плавающих иллюстраций на странице, а величину места, ими занимаемого. Все эти параметры являются командами наподобие \arraystretch или \baselinestretch; чтобы менять значения параметров, надо их переопределять с помощью команды \renewcommand. Эти параметры таковы:
. Это означает, что плавающие иллюстрации и таблицы, размещаемые вверху страницы, могут занимать не более 70% страницы по высоте.
Если мы хотим уменьшить эту долю, скажем, до 50%, надо написать \renewcommand{\topfraction}{0.5} Ниже слова "доля страницы" также всюду означают "доля страницы по высоте".
.
.
(стало быть, специальная страница для плавающих иллюстраций, которую вы требуете с помощью необязательного аргумента p к окружению {figure}, не будет создана, пока эти иллюстрации занимают менее 50% высоты страницы текста).
.
.
значения \floatsep, \intextsep и \dblfloatsep равны 12pt plus 2pt minus 2pt, а значения \textfloatsep и \dbltextfloatsep равны 20pt plus 2pt minus 4pt. По умолчанию плавающие объекты не отделены от текста ничем, кроме вышеперечисленных отбивок. Но можно сделать и так, чтобы иллюстрации (таблицы) отделялись от текста как-то иначе (линейками, например). Для этих целей предусмотрены следующие три команды:
Если вы хотите задать явные разделители между текстом и иллюстрациями (таблицами), то эти команды надо определить с помощью \newcommand.7). Определять эти команды нужно не произвольным образом: чтобы они правильно стыковались с LaTeX'овскими алгоритмами размещения плавающих объектов, нужно иметь в виду следующее:
\newcommand{\botfigrule}{\hrule\vspace{-0.4pt} (вспомним, что линейка, генерируемая командой \hrule, имеет по умолчанию толщину 0.4pt). Впрочем, формальной правильности мало: если вы опробуете такое определение на практике, то увидите, что линейка вплотную прилегает к иллюстрации, что никуда не годится. Правильно действовать, например, так:
\newcommand{\botfigrule}{\vspace{-3pt}\hrule \vspace{2.6pt}} Теперь мы проводим линейку не прямо по верхней кромке иллюстрации, а на три пункта выше; заключительное \vspace{2.6pt} нужно для того, чтобы в сумме получилось нулевое вертикальное смещение.
С \topfigrule и \dblfigrule вы сможете теперь разобраться самостоятельно.
В заключение отметим, что разделители, определяемые \topfigrule и ей подобными командами, не обязаны быть именно линейками: необходимо только при их определении учитывать три перечисленных выше обстоятельства.
Рубрикация
Здесь мы расскажем о том, как менять оформление разделов документа, предписываемое LaTeX'овским стандартом.Русский аналог \alph
В лекции 7 мы отмечали, что было бы желательно иметь команду, аналогичную \alph или \Alph, печатающую русскую букву с номером, равным значению счетчика. Сейчас мы расскажем, как вы ее можете определить в своем стилевом пакете. К сожалению, в этом определении используются не рассматривавшиеся нами средства TeX'а, так что рецепт вам придется воспринять сугубо догматически.Итак, пусть вам нужна команда \ralph, принимающая в качестве аргумента имя счетчика и дающая на печати русскую букву, чей номер в алфавите совпадает со значением счетчика; если этот номер неположителен или превышает число букв в алфавите, команда будет (как и команда \alph в аналогичном случае) выдавать сообщение об ошибке. Определить эту команду (в вашем стилевом пакете) можно так:
\newcommand*{\ralph}[1]{\@ralph{\@nameuse{c@#1}}} \newcommand*{\@ralph}[1]% {\ifcase #1\or а\or б\or в\or г\or д\or е\or ж\or з\or и\or к\or л\or м\or н\or о\or п\or р\or с\or т\or у\or ф\or х\or ц\or ч\or ш\or щ\or э\or ю\or я\else\@ctrerr \fi} (как иногда делают, мы пропускаем буквы ё, й, ъ, ы, ь). Аналогичным образом можно определить команду \Ralph, печатающую прописную букву (в этом случае "вспомогательную команду" с символом @ в имени надо тоже назвать как-нибудь по-другому, скажем, \@Ralph). Если вы будете модифицировать это определение, не сделайте в нем пробела между буквой и \or или \else (конец строки — это тоже пробел), иначе ваша команда будет печатать лишний пробел.
С чего начать
Кое-какие изменения в оформлении документа вы делать уже умеете: например, в лекции 4 рассказывалось, как можно, присвоив в преамбуле новые значения нескольким параметрам, изменить размер полей или текста. Однако для более серьезной модификации оформления приходится иметь дело со специальными командами LaTeX'а, содержащими в своем имени символ @. Поскольку @ — не буква, просто так до этих команд не добраться1). Поэтому действовать нужно следующим образом.Если вы хотите серьезно менять стандартное оформление, нужно создать свой собственный стилевой пакет. Пусть вы решили, что он будет называться {mystyle}. Тогда надо создать файл под названием mystyle.sty и начать документ так (подразумевается, что вы хотите печатать шрифтом кегля 11 и отталкиваетесь от класса book; в других случаях — c очевидными изменениями):
\documentclass[11pt]{book} \usepackage{mystyle} После \usepackage можно писать сразу \begin{document}; все установки параметров, определения макросов, и т.п. лучше делать уже не в преамбуле, а непосредественно в файле mystyle.sty (чтобы не запутаться, устанавливая один и тот же параметр по-разному в двух разных местах).
Для оформления документа вам, скорее всего, понадобятся какие-нибудь уже существующие стилевые пакеты (если в тексте много формул, то вы захотите подключить пакет {amsmath}, если есть таблицы, то пакет {array},...). Начать свой личный стилевой пакет надо с того, что подключить эти пакеты. При этом нужно использовать команду \RequirePackage (вместо знакомой вам \usepackage), например, так:
\RequirePackage{array,longtable} \RequirePackage[noamsfonts]{amsmath} (необязательный аргумент команды \RequirePackage означает то же самое и используется так же, как у команды \usepackage).
На крайний случай, если вам понадобилось использовать команду с символом @ в имени не в стилевом пакете, а прямо в тексте документа, предусмотрены команды \makeatletter и \makeatother. Первая из них делает @ буквой, а вторая восстанавливает status quo. Если вы использовали в тексте \makeatletter, не забудьте написать и \makeatother сразу после текста, в котором использовалась @ в имени команд.
Итак, стандартные стилевые пакеты загружены. После этого надо записать в свой стилевой пакет ваши личные команды для модификации оформления. Начнем.
Сноски
Стиль оформления сносок зависит от многих вещей. Начнем с пробела между страницей и сносками. Чтобы его изменить, надо применить команду \setlength с необычным первым аргументом. Вот, например, как выглядит команда, устанавливающая стандартную для LaTeX'а величину этого пробела:\setlength{\skip\footins}{12pt plus 4pt minus 4pt} Почему в первом аргументе\setlength целых две команды и что они означают, объяснить в рамках этой книги невозможно, так что воспринимайте этот рецепт для установки пробела между текстом и сносками догматически (для любознательных: вся правда содержится в пятнадцатой главе книги [2].
Далее, сноски обычно отделяются от текста не только пробелом, но и линейкой. Чтобы задать вид этой линейки, отличный от стандартного, либо задать какой-то другой разделитель, надо переопределить команду \footnoterule, которая в стандарте определена так:
\newcommand{\footnoterule}{\vspace*{-3pt} \hrule width .4\columnwidth \vspace*{2.6pt}} К этому макроопределению необходим комментарий: непонятно, зачем нужны команды \vspace. Дело в том, что "текст", генерируемый командой \footnoterule, не должен, с точки зрения TeX'а, занимать места по вертикали (фактически он располагается внутри пробела между текстом и сносками, о котором шла речь выше). Поэтому мы сначала отступаем на 3 пункта вверх, затем печатаем линейку (вспомним, что по умолчанию линейка, генерируемая командой \hrule, имеет толщину 0.4 пункта), а затем спускаемся на 2.6 пункта вниз. В итоге получается, что и линейка напечаталась, и места по вертикали мы не занимаем, поскольку
.Может возникнуть вопрос, зачем нужен \vspace*{-3pt}: не проще ли обойтись без этой команды, а после \hrule сказать \vspace*{-0.4pt}? Ответ: в этом случае линейка напечаталась бы вплотную к сноске.
Если вы хотите изменить ширину или толщину линейки, команду \footnoterule можно переопределить; только не забудьте проследить, чтобы отрицательный \vspace скомпенсировал толщину линейки. Можно, собственно говоря, сделать так, чтобы этой линейки вообще не было, сказав
\renewcommand{\footnoterule}{} (уж тут- то места по вертикали мы не займем!). Если вам вдруг понадобится задать совсем иной разделитель между сносками и текстом, можете переопределить команду \footnoterule принципиально по-иному. В этом случае необходимо знать следующее:
За вид номеров сносок в тексте отвечает команда \@makefnmark. По умолчанию она определена следующим образом:
\newcommand{\@makefnmark}{\hbox{\mathsurround=0pt $^{\@thefnmark}$}} Здесь на место команды \@thefnmark при выполнении будет подставлен номер сноски (или то, что его заменяет, если мы пользовались командой \footnotemark). Обратите внимание, что номер сноски оформлен как верхний индекс в математической формуле — именно благодаря этому номера сносок печатаются над строкой. По этой же причине внутри группы, являющей собой аргумент команды \hbox, устанавливается в нуль параметр \mathsurround - иначе, если вы установили для него ненулевое значение, номер сноски будет окружен лишними пробелами.
И, наконец, самое главное — команда, генерирующая собственно текст сноски. Она называется \@makefntext. Вот ее стандартное определение, в котором аргумент #1 обозначает текст сноски, а команда \@thefnmark означает то же, что и выше:
\newcommand{\@makefntext}[1]{\parindent=1em\noindent \hbox to 1.8em{\hss\@makefnmark}#1} При переопределении этой команды следует иметь в виду, что она будет выполняться внутри аргумента команды \parbox с длиной строки, равной ширине колонки текста; в приведенном выше определении применена команда \noindent, чтобы подавить абзацный отступ в первом абзаце сноски, в котором будет печататься ее номер.
Имейте в виду, что поскольку текст сноски, являющийся аргументом команды \@makefntext, может состоять из нескольких абзацев, переопределять эту команду надо с помощью \renewcommand без звездочки.
Снова о счетчиках
Для начала расскажем о некоторых манипуляциях со счетчиками, которые иногда бывают полезны. До сих пор мы обходили их молчанием, поскольку команды, используемые для этих манипуляций, содержат @ в своих именах.Список литературы
Если вам не нравится, что библиографические ссылки печатаются в квадратных скобках, то вы можете переопределить команды \@cite и \@biblabel. По умолчанию они определены так:\newcommand{\@cite}[2]{[{#1\if@tempswa , #2\fi}]} \newcommand{\@biblabel}[1]{[#1]\hfill} Мы не будем даже пытаться объяснить, что означают заковыристые команды в первом из этих макроопределений (#1 в нем означает номер источника, а #2 — дополнительную информацию, помещенную в необязательном аргументе команды \cite, если таковой имеется), а отметим только, что в " замещающем тексте" первого из этих определений можно заменить квадратные скобки на какие-нибудь другие (скажем, круглые или косые) — и тогда в соответствующих скобках будет печататься ссылка, генерируемая командой \cite; аналогично, если заменить скобки в "замещающем тексте" второго из этих определений, то в соответствующих скобках будет печататься номер источника в списке литературы. Разумеется, при переопределении этих команд надо писать \renewcommand вместо \newcommand.
Если вы хотите, чтобы дополнительная информация печаталась вне скобок, скажите
\renewcommand{\@cite}[2]{{[#1]\if@tempswa , #2\fi}} (не делайте пробела между закрывающей скобкой и \if@tempswa, иначе на печати выйдет лишний пробел). Текст между \if@tempswa и \fi будет выполняться тогда и только тогда, когда у команды \cite присутствует необязательный аргумент; если в вашем определении \@cite не будет участвовать #2, то необязательный аргумент команды \cite будет игнорироваться.
Ссылочный префикс
Вторая тонкость, о которой пойдет речь, связана с автоматическими ссылками и the-командами. Предположим, что перед исполнением команды \label{metka} последним счетчиком, подвергшимся увеличению с помощью \refstepcounter, был abcd. В лекции 7 мы говорили, что при этом команда \ref{metka} представит на печати значение этого счетчика "в соответствии с командой \theabcd". Настало время сознаться, что это полуправда. На самом деле команда \ref напечатает перед \theabcd еще и так называемый "ссылочный префикс" счетчика. Содержимое ссылочного префикса к счетчику abcd записано в команде \p@abcd (буква p, конечно, латинская). В момент создания счетчика эта команда определяется как макрос с "пустым" замещающим текстом, так что у таких счетчиков, как chapter или section в стандартных классах, ее следов не видно. Можно, однако, переопределить эту команду, чтобы ссылочный префикс реально печатался. Вот пример работы со ссылочным префиксом.В классе book вид номера главы и номера раздела определяется следующим образом: команда \thechapter определена стандартным образом как \arabic{chapter} (такое определение, как мы помним, автоматически производится при создании счетчика), а внешний вид номера раздела определен как
\renewcommand{\thesection}{\thechapter.\arabic{section}} Из-за этого номер третьего раздела второй главы печатается в заголовке как 2.3. Пусть мы хотим, чтобы номера разделов в заголовках не содержали номера главы; тогда можно написать
\renewcommand{\thesection}{\arabic{section}} но при этом возникнет другая неприятность. Автоматические ссылки на номер раздела, генерируемые командой \ref, теперь дадут на печати одно и то же число 3 как для третьего раздела второй главы, так и для третьего раздела четвертой главы: ведь из команды \thesection информация о номере главы ушла! Чтобы справиться с этой неприятностью, поместим утерянную информацию в ссылочный префикс счетчика section:
\renewcommand{\p@section}{\thechapter.} Теперь будет печататься 2.3 при ссылке на третий раздел второй главы и 4.3 при ссылке на третий раздел четвертой главы: хотя \thesection в обоих случаях дает просто 3, печатающийся перед ним \p@section обеспечивает печать номера главы и точки. Кстати говоря, именно такой прием применен при подготовке книги, которую вы читаете.
Теоремы, выключные формулы
Чтобы изменить оформление "теорем" (окружений, определяемых с помощью \newtheorem), надо переопределить команды \@begintheorem и \@opargbegintheorem (первая из них отвечает за оформление "теорем" без необязательного аргумента, вторая — за оформление "теорем" с необязательным аргументом). Первая из них определена так:\newcommand{\@begintheorem}[2]{\begin{trivlist} \item[\hspace{\labelsep}\bfseries#1\ #2] \itshape} Здесь аргумент #1 означает название "теоремы" (например, " Теорема", "Предложение", "Лемма",...- в команде \newtheorem это слово являлось вторым обязательным аргументом), а аргумент "#2" означает номер "теоремы". Если мы, например, хотим, чтобы после номера "теорем" стояла точка, нам достаточно переопределить эту команду, добавив точку после #2. Что делать для того, чтобы сменить шрифт, которым печатаются номер или текст "теорем", также достаточно ясно.
Команда \@opargbegintheorem определяется так:
\newcommand{\@opargbegintheorem}[3]{\begin{trivlist} \item[\hspace{\labelsep}{\bfseries #1\ #2\ (#3)}] \itshape} Здесь #1 и #2 по-прежнему означают название и номер " теоремы", а #3 — необязательный аргумент "теоремы" (обычно в качестве такового задается имя ученого, которому приписывается данная теорема).
Если оформление, задаваемое окружением trivlist, вас не устраивает, то можно переопределить две вышеуказанные команды более радикально. Общий принцип таков. Перед текстом "теоремы", не имеющей необязательного аргумента, исполняется команда \@begintheorem; у этой команды должно быть два аргумента, причем первый из них — название "теоремы", а второй — ее номер. Если "теорема" имеет необязательный аргумент, то вместо \@begintheorem перед ее текстом исполняется команда \@opargbegintheorem, имеющая три аргумента: первые два — такие же, как у \@begintheorem, и третий — необязательный аргумент "теоремы" (имя первооткрывателя).
Наконец, после текста "теоремы" исполняется команда \@endtheorem, которая изначально определена очень просто:
\newcommand{\@endtheorem}{\end{trivlist}} В принципе можно переопределить все три эти команды, чтобы получить свое оформление "теорем" (например, в духе наших макросов для автоматической нумерации задач из лекции 7). Только следите, чтобы переопределения всех трех команд были согласованы друг с другом: если, например, вы изгоните \begin{trivlist} из определения \@begintheorem, но при этом оставите команду \@endtheorem в неприкосновенности, то на каждой " теореме" LaTeX будет сообщать вам об ошибке (отсутствие баланса команд \begin и \end).
При пользовании AMS'овскими классами документов "теоремы" определяются иначе. Вряд ли, впрочем, вы сочтете нужным переделывать стандарт Американского математического общества.
Теперь скажем кое-что про стиль оформления номеров выключных формул, заданных в виде окружения {equation}. Как вам уже известно, можно переопределить команду \theequation или (с помощью команды \@addtoreset) изменить подчиненность счетчика {equation}; при этом изменится оформление самих номеров формул. Кроме этого, можно изменить то, что печатается возле этих номеров. Для этого следует переопределить команду \@eqnnum. Изначально она определена так:
\newcommand{\@eqnnum}{(\theequation)} При желании можно заменить тут круглые скобки на что-нибудь другое. Имейте в виду, что номер выключной формулы обрабатывается TeX'ом " в математическом режиме", как формула (латинские буквы по умолчанию набираются "математическим курсивом" и т.п.).
Работа в системе LaTeX
Макропакеты и форматы
Если получить программу TeX из кнутовского исходного текста (то есть перевести псевдокод в Pascal или C, а затем скомпилировать), то использовать полученную программу (" чистый TeX" — по-английски говорят еще "virgin TeX") для обработки текстов будет еще невозможно: чистый TeX не знает смысла ни спецзнаков2), ни макросов. В него встроены только "примитивные команды" (стр. 240).Стало быть, прежде чем использовать TeX для дела, его надо обучить смыслу тех многочисленных макросов, которые используются в реальных tex-файлах. Набор TeX'овских макросов, используемый для обработки текстов, называется макропакетом. С одним из TeX'овских макропакетов вы уже неплохо знакомы: это тот самый LaTeX, которому посвящена вся эта книга.
Как же TeX узнает определения макросов из используемого вами макропакета? Ответ таков. Среди известных чистому TeX'у примитивных команд есть и команда, предназначенная для определения макросов (чем-то похожая на известные вам \newcommand и \renewcommand); если перед началом файла с текстом и формулами, который вы хотите обработать, приписать "исходный текст макропакета" — список всех используемых в макропакете (скажем, том же LaTeX'е) макроопределений — и передать полученный файл для обработки программе TeX, то TeX сначала узнает смысл используемых вами макросов, а к моменту начала собственно текста будет уже "во всеоружии" и благополучно создаст нужный вам dvi-файл.
На практике, однако, так никогда не делается: макропакеты имеют достаточно большой размер, и обработка их TeX'ом даже на современных компьютерах происходит не мгновенно, а уж в конце семидесятых годов потери времени при работе по такой схеме были бы совершенно неприемлемы. Поэтому Кнут применил в этом месте следующую оптимизацию: при установке TeX'а для работы с каким-то макропакетом TeX считывает исходный текст этого макропакета и записывает содержимое своих внутренних таблиц в специальный файл, называемый форматным; при запуске для работы с текстом TeX предварительно считывает информацию о макросах, содержащуюся в макропакете, из форматного файла (или попросту " формата", как иногда говорят), что существенно быстрее, чем всякий раз обрабатывать исходный текст макропакета заново.
(Строго говоря, сказанное в предыдущем абзаце не вполне соответствует действительности. Использование файлов формата — не только оптимизация, поскольку таблицы переносов, необходимые для верстки абзацев, могут быть обработаны TeX'ом только на стадии генерации форматного файла.)
Первый макропакет написал одновременно с программой TeX сам Кнут: это пакет Plain TeX, который также описан в книге [2].
Следующим после Plain TeX'а макропакетом, получившим распространение, стал AMS-TeX, созданный Майклом Спиваком (Michael Spivak). По сравнению с Plain TeX'ом в него были добавлены удобные средства для набора сложных формул, особенно многострочных. Подчеркнем, что всех AMS-TeX'овских эффектов можно добиться и в Plain TeX'е — возможности TeX'а новый макропакет расширить не может, — но там это требует громоздких записей и довольно серьезного знания TeX'овских внутренних механизмов; Спивак создал для этих целей удобные сокращенные обозначения (то есть макроопределения!), которыми математики стали с удовольствием пользоваться (и до сих пор пользуются).
В 1984 году Лесли Лэмпорт (Leslie Lamport) создал макропакет LaTeX (его заключительная версия, вышедшая в 1989 году, называется LaTeX 2.09). Возможно, одной из важнейших новых черт LaTeX 'а явилась возможность автоматической нумерации и — главное — автоматической генерации ссылок с помощью команд \label, \ref и \pageref. Достижение этого эффекта средствами Plain TeX'а требует весьма изощренного программирования.
Наконец, в 1995 году появилась новая версия LaTeX'а, а именно тот самый LaTeX
, описанию которого посвящена вся эта книга. Одним из первоначальных толчков к коренной переработке LaTeX'а было желание включить в него возможности AMS-TeX'а, в частности, возможность пользоваться символьными шрифтами Американского математического общества (в "старом" LaTeX'е добавлять новые шрифты сверх стандартного комплекта было довольно неудобно). В настоящее время поддержкой и совершенствованием системы LaTeX
занимается группа TeXнологов (Frank Mittelbach, Michel Goossens и другие); после первоначального периода быстрых изменений LaTeX практически стабилизировался, хотя раз в год и выходит новая версия.Подведем предварительные итоги: при практической работе программу TeX запускают не просто так, но с указанием форматного файла, соответствующего используемому макропакету; форматные файлы генерируются при установке TeX'а из исходных текстов макропакетов. Отметим еще, что исходные тексты макропакетов переносимы между платформами (DOS, Linux и т.п.), а форматные файлы зависят от реализации TeX'а.
Немного истории
Как гласит легенда, Дональд Кнут (Donald E. Knuth) написал программу TeX для себя, чтобы готовить к печати книги серии "Искусство программирования для ЭВМ". Первая версия TeX'а появилась в 1978 году; начиная с 1989 года все изменения в TeX'е сводятся в основном к исправлению ошибок (Кнут сознательно не стремится совершенствовать TeX дальше, чтобы предотвратить распространение несовместимых версий). Тому, кто первым обнаружит очередную ошибку, Кнут выплачивает денежную премию; время от времени ставка удваивается, и тем не менее Кнут отнюдь не разорился1).Программа TeX распространяется свободно, а ее исходные тексты полностью доступны: помимо книги [2], обязательной для изучения каждому, кто собирается стать TeX ником, в виде книги опубликован и полный текст программы с комментариями. Текст программы написан на изобретенном Кнутом псевдокоде под названием Web; раньше Web транслировали в Pascal (с помощью программы, написанной все тем же Кнутом), в настоящее время используется транслятор из Web'а в язык C.
A. Архитектура TeX'а и LaTeX'а
В этом приложении не содержится никаких практических рецептов. Его цель в том, чтобы читатель, прочитавший основную часть книги, получил общее представление о структуре работающего комплекта TeX'а.Реализации TeX'а
Как мы уже говорили, программа TeX (то есть интерпретатор языка TeX) написана Кнутом не на каком-то из использовавшихся в то время языков программирования, но на специальном псевдокоде. Благодаря этому TeX можно сравнительно легко приспособить к различным типам компьютеров и операционных систем, и эти реализации будут работать одинаково. (Чтобы достичь единообразия, Кнут практически нигде не пользуется вычислениями с плавающей запятой: на разных компьютерах они могут дать разные результаты, а это, в свою очередь, может повлиять на верстку.)Конечно, пользовательский интерфейс и интерфейс с операционной системой в разных реализациях устроены по-разному, но при обработке одного и того же tex-файла с одним и тем же макропакетом на любой платформе получится один и тот же dvi-файл, при печати которого получится один и тот же текст.
Реализации TeX'а имеют свои названия. Например, долгое время была популярна созданная Эберхардом Маттесом (Eberhard Mattes)реализация TeX'а для DOS, называемая emTeX. Современная реализация TeX'а для UNIX (в частности, Linux, FreeBSD и др.) называется teTeX. Для Windows имеются реализации fpTeX и MiKTeX. Наконец, для Макинтошей существуют по крайней мере две реализации TeX'а: коммерческая, называемая TeXtures, и shareware-вариант OzTeX.
Не следует путать реализации с макропакетами: в принципе в любой из реализаций TeX'а можно установить любой макропакет (в частности, Plain, LaTeX и AMSTeX установлены всюду). Поэтому на задаваемый иногда новичками вопрос: "А у тебя LaTeX или MiKTeX?" ответить невозможно.
Шрифты и dvi-драйверы
Как мы уже говорили, программа TeX (с тем или иным макропакетом) читает TeX-файл и преобразует его в файл с расширением .dvi (от слов "device independent"). Этот файл содержит информацию о том, какие буквы из каких шрифтов и в каком месте страницы надо разместить. (Любопытные могут изучить структуру этого файла подробнее; для начала посмотрите, что выдает программа dvitype, которая переводит информацию из dvi-файла в текстовую форму.)Заметим, что в dvi-файлах указаны лишь номера букв, но не сказано, что, собственно говоря, надо напечатать на бумаге или показать на экране. На самом деле TeX этого и не знает: с его точки зрения каждая буква — это просто прямоугольник.
Откуда же берутся шрифты, используемые TeX'ом? Первоначальный комплект шрифтов создал сам Дональд Кнут. Для этого он вместе со своими коллегами
Программа METAFONT, запущенная на этом файле с указанием разрешения 600 dpi (оно предусмотрено во многих современных принтерах), порождает файл cmr10.tfm (который на самом деле не зависит от разрешения) и файл cmr10.600pk.
Из этих двух файлов TeX использует лишь первый. Второй понадобится, когда dvi-файл, ссылающийся на шрифт cmr10, будет фактически печататься на принтере (с разрешением 600 dpi). Для принтера с другим разрешением может потребоваться вновь запустить программу METAFONT, указав тот же файл cmr10.mf, но другое разрешение.
Помимо шрифта cmr10, в стандартный комплект TeX а входят шрифты других размеров (cmr5, cmr6, cmr7, cmr8, cmr9, cmr12, cmr17). Кроме того, можно масштабировать шрифты (при этом TeX использует тот же самый tfm-файл, но другой pk-файл, потому что число точек в увеличенном шрифте другое).
Вернемся к dvi-файлам. Как мы уже говорили, в результате обработки TeX'ом tex-файла получается dvi-файл. Формат его стандартизирован и не зависит ни от использованного макропакета, ни от реализации TeX'а. Этот файл содержит указания о размещении символов на странице. В dvi-файл записываются только названия используемых шрифтов, но не их начертания.
В свою очередь, dvi-файл обрабатывается с помощью программы, называемой dvi-драйвером, которая осуществляет печать, показ текста на экране и т.п. (для разных устройств и разных нужд есть разные драйверы); dvi-драйвер в процессе работы использует растровые описания шрифтов, то есть pk-файлы.
Например, драйвер dvihplj, входящий в состав системы emTeX (для DOS), преобразует dvi-файл в файл в языке PCL (который понимают многие лазерные принтеры). Драйвер xdvi, входящий в состав системы teTeX (для UNIX), показывает dvi-файл на экране, используя вызовы оконной системы X Window System (в этом контексте слово "Window" не имеет никакого отношения к системе с похожим названием одной известной фирмы). И так далее.
Современные dvi-драйверы действуют обычно по следующей схеме: если готового pk-файла нет, они запускают программу метафонт, которая из mf-файла генерирует этот pk-файл с нужным разрешением.
Некоторые реализации TeX'а идут в этом отношении еще дальше: если в процессе обработки tex-файла встречается запрос на шрифт, для которого нет соответствующего tfm-файла, то вызывается метафонт, который недостающий tfm-файл и генерирует (по канону в такой ситуации TeX должен выдавать сообщение об ошибке).
Строго говоря, TeX может работать с любыми шрифтами, надо только, чтобы для них были соответствующие tfm-файлы и чтобы соответствующие имена шрифтов были предусмотрены в используемом макропакете. В частности, довольно часто с TeX'ом используют так называемые "Type 1 PostScript-шрифты". О них, а также о языке PostScript, более подробно говорится в приложении Б.
![]() |
![]() |
![]() |
2^{15}
\,2.56.2) Кроме символа "\".

Работа в системе LaTeX
Что такое PostScript?
Язык программирования PostScript разработан фирмой Adobe прежде всего для программирования принтеров. Вот пример файла на языке PostScript и порождаемой им картинки:
![]() | %!PS %%BoundingBox: 0 0 110 150 0 9 9 10 mul { dup 0 moveto 150 lineto } for stroke 0 9 9 15 mul { dup 0 exch moveto 100 exch lineto } for stroke |
%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: kolm.ps %%Pages: 1 %%BoundingBox: 197 353 415 408 %%EndComments /readstring { currentfile exch readhexstring pop } bind def /picstr 227 string def %%EndProlog %%Page: 1 1 gsave 197.28 353.64 translate 217.44 54.72 scale 1812 456 1 [ 1812 0 0 -456 0 456 ] { picstr readstring } image ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff <...> fffffffffffffffffffffff0ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff <…> ffffffffffffffffffffffff grestore showpage %%Trailer (мы опустили большую часть строк — всего в файле их более трех тысяч) порождает рисунок

(определение колмогоровской сложности из рукописи Андрея Николаевича Колмогорова 1970 года; файл был получен ее сканированием). Структура этого файла понятна: строки из букв кодируют черные и белые точки (и буквы f составляют большинство: точки в основном белые).
Аналогично можно задавать и полутоновые рисунки, только нужен очень качественный принтер (или еще более дорогое фотонаборное устройство), чтобы они хорошо печатались.
В язык PostScript включен некоторый минимальный набор шрифтов. Вот пример файла, ссылающегося на встроенные шрифты, и соответствующего рисунка:
| %!PS %%BoundingBox: 0 0 160 40 /Times-Roman findfont 24 scalefont setfont 5 5 moveto (This is a string) show |
![]() |
Да и вообще разных шрифтов предусмотрено немного. Зато стандарт PostScript предусматривает возможность определять свои шрифты, и в этих шрифтах уже могут быть любые буквы, в том числе русские. Например, нехитрая картинка

может быть задана таким файлом:
%!PS-Adobe-2.0 EPSF-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software %%Title: exampl4.dvi %%BoundingBox: 148 654 241 666 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -E -o exampl4.ps exampl4.dvi %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2002.07.21:2027 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet TeXDict begin 40258437 52099154 1000 600 600 (exampl4.dvi) @start %DVIPSBitmapFont: Fa zcr10 10 16 /Fa 16 253 df<121C127FEAFF80A8EA7F00AB123EAB121CABC7FCA8121C127FEAFF80A5 EA7F00121C093C79BB17>33 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485A A2485AA212075B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA2 7F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20 >40 D<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA213 1F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C13 78A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I
Для начала мы применили LaTeX к файлу exampl4.tex такого содержания:
\documentclass{article} \pagestyle{empty} \begin{document} Это строка (string)! \end{document} Получился файл exampl4.dvi, который в свою очередь был обработан командой
dvips -E -o exampl4.ps exampl4.dvi Программа dvips (о которой мы еще будем говорить) и изготовила нам файл exampl4.ps (приведенный выше). Мы не беремся объяснить смысл входящих в этот файл команд, но видно, что вначале идут комментарии (строки с процентами), затем определения вспомогательных команд (занимающие целую страницу), затем (после пустой строки) идет описание шрифта zcr10 (основной русский шрифт в использованной нами русификации), и лишь потом идут собственно изображаемые символы (последние строки файла). При этом латинские буквы слова string так прямо и записаны в файле, а русские буквы заданы своими кодами. Например, "\317" (что означает восьмеричный код 317) соответствует букве "о" и встречается дважды: как третья буква в слове "Это" и как четвертая буква в слове "строка". (Знатоки смогут заключить отсюда, что в используемых нами шрифтах скорее всего применяется так называемая "кодировка koi8-r".)
Таким образом, на PostScript-принтере можно напечатать текст любым шрифтом, только надо предварить этот текст описанием шрифта.
Вероятно, вы уже догадались, что примеры программ на языке PostScript приведены лишь для удовлетворения любопытства читателя; при практической работе PostScript-файлы создаются и обрабатываются программами; читать их невооруженным глазом (и писать их вручную) вам, скорее всего, никогда не придется. Но некоторое представление о возможностях языка PostScript иметь все же полезно.
Драйвер dvips
предыдущем разделе мы уже упоминали программу dvips. Эта программа получает на вход dvi-файл и преобразует его в PostScript-файл. При этом она использует pk-файлы для шрифтов, ссылки на которые есть в dvi-файле, и включает описания этих шрифтов (или только нужных букв из этих шрифтов) в PostScript-файл. Таким образом, имея dvi-файл, программу dvips и PostScript-принтер, можно получить печатный текст: надо лишь1); для использования PostScript-файлов в этих системах при отсутствии PostScript-принтера полезны программы Ghostscript и GSView, см. приложение Ж}. направить результат работы программы dvips в принтер.При этом изготовление PostScript-файла и его печать могут быть разделены во времени и пространстве. Можно положить PostScript-файл статьи в архив препринтов, чтобы и через много лет (какой автор не мечтает об этом?) интересующиеся читатели его списывали и читали. Можно изготовить файл в одной стране и послать его по электронной почте в издательство другой страны.
Заметим, что для этого не нужно, чтобы в издательстве умели пользоваться системой TeX — вполне достаточно, чтобы там умели печатать PostScript-файлы.
Приведем примеры использования программы dvips. Команда
dvips -o article.ps article.dvi преобразует файл article.dvi в PostScript-файл article.ps. Команда
dvips -o article.ps -p 5 -l 7 article.dvi помещает в PostScript-файл только три страницы (с пятой по седьмую); указав только -p 5, можно напечатать все страницы с пятой до конца, а указав только -l 7, можно напечатать все страницы с начала до седьмой включительно. Команда
dvips -D 300 -o article.ps article.dvi указывает, что нужно использовать (и включить в PostScript-файл) шрифты с разрешением
dpi (по умолчанию обычно используются шрифты
dpi); это можно быть полезно для старых принтеров. Ключ -E мы уже видели выше, он применим к файлам из одной страницы и обрезает их по краям (в качестве BoundingBox берется минимальный блок, содержащий текст). Наконец, иногда полезен ключ -e 0, который говорит, что при вычислении положений букв не надо полагаться на округления, произведенные в pk-шрифте (это полезно, если без этого получаются нерегулярные промежутки между буквами).Ghostscript
Но как напечатать PostScript-файл, если принтер не понимает языка PostScript? (Как правило, дешевые лазерные принтеры, а также подавляющее большинство струйных и матричных принтеров его не понимают). Кроме того, неэкономно (и неэкологично) каждый раз печатать текст, когда хочется проверить, как он будет выглядеть после очередных изменений.Фирма Adobe, которая разработала язык PostScript, написала интерпретатор этого языка, который можно встраивать в другие продукты (принтеры, программы). Например, существует программа Adobe Acrobat, которая умеет показывать на экране PostScript-файлы и печатать их на разных принтерах (то есть преобразовывать в другие форматы, доступные этим принтерам).
К сожалению, продукты фирмы Adobe дороги, часто требуют для работы (также дорогой) системы Windows, а воровать (как в теории признавал, кажется, даже Остап Бендер) грешно. К счастью, разработчики свободно распространяемого программного обеспечения о нас позаботились. Peter Deutsch и его коллеги написали свободно распространяемую программу Ghostscript, которая представляет собой интерпретатор языка PostScript, умеющий работать с самыми разными принтерами (лазерными, струйными, матричными), а также выводить файлы в разнообразных форматах (включая PDF — Portable Document Format, также разработанный фирмой Adobe). При этом используются любезно предоставленные фирмой URW шрифты. Эта программа приспособлена практически для всех операционных систем (Linux, FreeBSD, другие виды UNIX, DOS, Windows и др.) и стала стандартом defacto. (Например, организаторы некоторых конференций просят, чтобы присылаемые на рецензию статьи в формате PostScript правильно обрабатывались этой программой.)
Программа Ghostscript является составной частью программ, показывающих PostScript-файлы на экране (популярные программы такого типа — gv, ghostview, GSView). Обычно в такие программы встроена также возможность печати всего текста (текущей страницы, выбранного множества страниц) на принтере. Именно эти программы вы скорее всего будете использовать на практике; их интерфейс зависит от операционной системы, и мы скажем про него в приложении Ж.
PostScript-рисунки
Если вы используете программу dvips, появляется возможность соединять набранный в программе TeX текст с PostScript-рисунками. (Именно таким способом было подготовлено это приложение.) Вот как это делается.Прежде всего, надо подключить стилевой пакет graphicx с опцией dvips. Последняя буква в названии пакета именно x; существует вариант этого пакета, называющийся graphics, но он немного отличается от описываемого нами. Для подключения пакета graphicx с опцией dvips следует написать в преамбуле
\usepackage[dvips]{graphicx} Затем надо подготовить собственно рисунок в виде PostScript-файла. Точнее говоря, требуется специальный тип PostScript-файлов, который называется Encapsulated PostScript (традиционное расширение: .eps). Такие файлы предназначены для включения в другие файлы, и потому подчиняются дополнительным ограничениям (например, там не должно быть нескольких страниц).
Как проще всего изготовить Encapsulated PostScript-файл, зависит от типа рисунка и ваших навыков. Например, автограф Колмогорова был просканирован (в системе Linux) с помощью программы xsane, затем полученный pgm-файл (полутоновая матрица) был почищен и обрезан по краям в программе gimp, затем преобразован в черно-белый (без полутонов) программой pgmtopbm, затем преобразован в PostScript программой pnmtops, и в результате получился файл exampl2.ps.2) В тексте мы написали
\begin{center} \includegraphics{exampl2.ps} \end{center} Здесь \includegraphics — команда (определенная в пакете graphicx), а ее аргумент — имя файла с рисунком. Команда \includegraphics имеет множество необязательных параметров. Например, картинку с текстом "Это строка (string)!" мы включили с увеличением в два раза, сказав
\begin{center} \includegraphics[scale=2]{exampl4.ps} \end{center} Можно также повернуть рисунок (скажем, на
), написав\begin{center} \includegraphics[angle=60]{exampl4.ps} \end{center} С точки зрения TeX'а фрагмент \includegraphics[...]{...} ведет себя как блок. Его размеры берутся из самого включаемого файла (из строки BoundingBox, где единицей измерения является
дюйма, а четыре числа означают левую, нижнюю, правую и верхнюю координаты; шириной блока считается разность между правой и левой, а высотой — между верхней и нижней координатами).
В принципе можно вручную такую строку добавить (если почему-либо изготовленный вами PostScript-файл ее не содержит) или исправить (если указанные там числа вас не устраивают).
Но того же самого эффекта можно добиться и средствами \TeX'а, используя команды \vbox и \hbox. Вот, например, как была помещена рисованная буква "В" в начало одного из разделов:
\newsavebox{\bukva} \sbox{\bukva}{\includegraphics{litera.ps}} \begin{wrapfigure}{l}{\wd\bukva} \vbox to 13mm{\vss\usebox{\bukva}\vspace*{-7mm}} \end{wrapfigure} предыдущем разделе мы уже упоминали программу dvips... Горизонтальные размеры буквы мы не меняли, а вертикальный размер и положение регулировали (13mm и -7mm были подобраны; команда \vss означает бесконечно сжимаемый и растяжимый клей, используемый в вертикальном режиме). Сам файл был получен сканированием иллюстрации из книги А.Г.Шицгала "Русский типографский шрифт"; эта иллюстрация, в свою очередь, представляет собой воспроизведение фрагмента из " Остромирова Евангелия" (рукописной книги XI века). Подрисуночная подпись (которую можно было бы сделать обычным способом, с помощью \caption), естественно, в этом случае была бы неуместна.
Если у документа (или у пакета {graphicx}) указана опция draft (иными словами, слово draft присутствует среди необязательных аргументов), то вместо PostScript-рисунков, включенных с помощью\includegraphics, будет печататься прямоугольник того же размера с названием PostScript-файла. (Это может сэкономить время и краситель в принтере.)
Сказанного достаточно, чтобы включать рисунки в статьи и книги. Но все же полезно понимать более конкретно, что происходит в этом месте в dvi-файле. Он не включает в себя описание рисунка. Зато он включает специальное указание (конструкция special), которое программа dvips интерпретирует как необходимость включить в это место текста фрагмент из PostScript-файла, указанного рядом со special. Тем самым программа dvips нуждается не только в dvi-файле, но и в PostScript-файлах рисунков. (Кстати, они нужны и LaTeX'у, хотя из них он читает лишь строку BoundingBox, чтобы определить размер блока.) Зато готовый PostScript-файл (выдаваемый программой dvips) уже самодостаточен; все необходимые рисунки включены в него и больше никаких файлов не надо.
Подчеркнем еще раз обстоятельство, которое внимательный читатель уже понял: использование PostScript-рисунков выходит за рамки официального стандарта TeX'а, поэтому могут существовать (и существуют) dvi-драйверы, которые попросту игнорируют соответствующие конструкции special. При их использовании рисунков не будет видно. К счастью, программа dvips стала одним из самых популярных dvi-драйверов, и в расчете на нее можно смело использовать пакет graphicx.
В заключение вернемся к исходному вопросу: как же включить рисунок в текст? Мы знаем, как включить PostScript-файл, но как получить этот файл? Если рисунок сканируется, то такой файл можно получить с помощью программ обработки изображений. Мы уже кратко упомянули о них, говоря об автографе Колмогорова; все упомянутые программы есть в системах типа UNIX, но и в Microsoft Windows для этого есть средства, в частности, входящие в комплект MiKTeX свободно распространяемые программы, см. приложение Ж.
Важно иметь в виду, что рисунок в формате .eps имеет некоторый размер в абсолютных единицах длины (в его заголовке указаны координаты Bounding Box, при этом единица принята равной
дюйма). С другой стороны, рисунки в растровых форматах имеют обычно размеры, измеряемые в точках. Поэтому при их преобразовании в .eps есть произвол: размер точки может быть взят любым. При печати .eps-файла (в составе текста) на принтере происходит обратное преобразование, поскольку принтер в реальности печатает черные и белые точки, и итоговое преобразование сводится к масштабированию растрового рисунка (с неизбежной при этом интерполяцией, если коэффициент масштабирования не равен
). Заметим, что коэффициент масштабирования пропорционален значению параметра scale в команде \includegraphics.Кроме того, если исходный рисунок был полутоновой (о цветных мы не говорим, там все еще сложнее), то в какой-то момент он должен быть тем или иным способом преобразован в черные и белые точки (большинство принтеров умеет печатать только их). Это может делаться и в принтере, и до него (в интерпретаторе Ghostscript); кроме того, можно не доверять этим механизмам и пытаться с самого начала преобразовать полутоновой рисунок в двуцветный, например, с помощью программы pgmtopbm.
Какой из этих многочисленных вариантов даст при печати лучшие результаты, зависит от конкретной ситуации. (Еще сложнее выбрать наилучший способ, если готовится оригинал-макет для типографии.)
Все сказанное относилось к сканированным оригиналам рисунков. Но при изготовлении чертежей и технических рисунков мы не советуем чертить их на бумаге и потом сканировать. Есть гораздо более удобные средства. Одно из них (кстати, входящее в большинство TeX-комплектов) — программа metapost (или mpost, иногда mp). Ее автор — John Hobby — переделал программу METAFONT так, чтобы вместо шрифтов она порождала PostScript-файлы с рисунками. Эта программа заслуживает отдельной небольшой книжки (которой на русском языке пока нет; есть авторское английское описание, которое обычно входит в комплект TeX'а в виде файла mpman.ps). Мы лишь приведем два примера ее использования.
Подготовим файл exampl5.mp такого содержания:
| beginfig(1) path a,b,c; a = halfcircle rotated -90 scaled 4cm; b = fullcircle scaled 4cm shifted (2.6cm,0); c = buildcycle(a,b); fill c withcolor 0.9 white; draw a; draw b; picture l; l=thelabel (btex $a\cap b$ etex, (1.3cm,0)); unfill bbox l; draw l; endfig; bye | ![]() |
mpost exampl5.mp Получится файл exampl5.1. Его можно включить в текст с помощью команды \includegraphics как PostScript-файл (строго говоря, он не является полноценным PostScript-файлом, но dvips умеет его включать). Соответствующий рисунок изображен справа от исходного текста metapost-программы.
А вот еще один пример использования системы metapost (заимствован из авторского руководства по этой системе):
beginfig(1); 3.2scf = 2.4in; path fun; # = .1; % Keep the function single-valued fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#)) scaled scf yscaled(1/#); vardef vertline primary x = (x,-infinity)..(x,infinity) enddef; primarydef f atx x = (f intersectionpoint vertline x) enddef; primarydef f whenx x = xpart(f intersectiontimes vertline x) enddef; z1a = (2.5scf,0); z1 = fun atx x1a; y2a=0; z1-z2a=whatever*direction fun whenx x1 of fun; z2 = fun atx x2a; y3a=0; z2-z3a=whatever*direction fun whenx x2 of fun; draw fun withpen pencircle scaled 1pt; drawarrow (0,0)..(3.2scf,0); label.bot(btex $x_1$ etex, z1a); draw z1a..z1 dashed evenly; makelabel(nullpicture, z1); draw z1..z2a withpen pencircle scaled .3; label.bot(btex $x_2$ etex, z2a); draw z2a..z2 dashed evenly; makelabel(nullpicture, z2); draw z2..z3a withpen pencircle scaled .3; label.bot(btex $x_3$ etex, z3a); endfig; bye Этот рисунок иллюстрирует метод Ньютона поиска корня уравнения
; заметим, что направления касательных и точки пересечения вычисляются автоматически.
PostScript-шрифты
Последнее, о чем мы хотим сказать в связи с языком PostScript, — это PostScript-шрифты. Фирма Adobe разрабатывала язык PostScript применительно к нуждам полиграфии. Естественно, что она параллельно изготовила описания сотен (если не тысяч) шрифтов в формате, понятном PostScript'у. Такие шрифты называют еще "Type 1"-шрифтами (строго говоря, есть и другие форматы шрифтов, доступные PostScript'у, но большинство шрифтов имеет формат Type 1). Часто такие шрифты хранятся в файлах с расширениями pfa или pfb.Вслед за фирмой Adobe множество других фирм изготовили тысячи шрифтов (оригинальных, а также напоминающих классические образцы литых шрифтов или шрифтов фотонабора). Возникает естественное желание использовать эти шрифты с системой TeX. Что для этого нужно? Об этом (и о возникающих трудностях) пойдет речь в приложении B.
![]() |
![]() |
![]() |
2) Если честно, то после всего этого в последних строках файла exampl2.ps все буквы были заменены на f с помощью текстового редактора, чтобы убрать грязь в низу рисунка.

Зеркальный вывод и кресты
При подготовке оригинал-макета для типографии часто возникает необходимость вывести текст (на пленки) в зеркальном изображении. Если вы пользуетесь драйвером dvips, то это удобно сделать с помощью стилевого пакета crop. Именно, если подключить пакет crop с опцией opt{mirror} (т.е. если записать в преамбуле документа строку \usepackage[mirror]{crop}), то в PostScript-файле, полученном после обработки dvi-файла программой dvips, все страницы будут записаны в зеркальном изображении, и именно так они напечатаются, если послать это PostScript-файл на принтер. Подчеркнем, что при использовании dvi-драйверов, отличных от dvips, этот прием не сработает.При использовании пакета crop открывается также возможность напечатать "кресты", помогающие при монтаже оригинал-макета в типографии; по поводу того, как это сделать, см. комментарии в файле crop.sty, который, собственно говоря, и представляет собой стилевой пакет crop.
Работа в системе LaTeX
Что нужно LaTeX'у от шрифта?
Допустим, нам понравилась какая-то гарнитура и мы хотим использовать такой (точнее говоря, очень похожий) на нее шрифт в системе LaTeX. Чтоб для этого нужно?Прежде всего нужно иметь файлы, описывающие формы букв выбранной нами гарнитуры. Проще всего, если эти файлы подготовлены в формате METAFONT (как это сделано Кнутом для шрифтов Computer Modern). Тогда с помощью программы METAFONT из них можно получить tfm-файлы с описанием размеров букв.
Немного сложнее обстоит дело со шрифтами в формате Type 1. Но и для этого формата написаны программы, позволяющие полуавтоматически изготавливать tfm-файлы (основная проблема, требующая ручного вмешательства, — несовпадение кодировок).
После этого можно попросить LaTeX использовать эти файлы вместо обычно используемых им tfm-файлов для шрифтов Computer Modern, и получить dvi-файл. (Подробнее об этом см. ниже). Но чтобы использовать этот файл, dvi-драйвер должен либо иметь pk-файлы с матрицами букв, либо уметь использовать вместо них описания шрифтов в формате Type 1 (и иметь эти описания). Обе возможности встречаются на практике. Например, программа xdvi (показывающая dvi-файлы на экране в X Window System под UNIX) использует pk-шрифты. Эти шрифты программа xdvi получает из шрифтов в формате Type 1 с помощью программы gsftopk. А программа dvips просто вставляет в результирующий PostScript-файл описания соответствующих шрифтов в формате Type 1. (При этом используется механизм "виртуальных шрифтов", но его описывать мы не будем.)
При этом получающийся файл имеет то достоинство, что он не зависит от разрешения: в нем содержатся не матрицы букв того или иного размера (как будет с pk-шрифтами), а векторные описания форм букв. Такие PostScript-файлы лучше выдерживают увеличение.
Для примера посмотрите на надпись "Это строка (string)!" в приложении Б. При изготовлении соответствующего PostScript-файла были использованы pk-шрифты разрешения
dpi. Затем эта надпись была включена в текст с увеличением вдвое, поэтому в итоговом оригинал-макете она соответствовала разрешению
dpi и выглядела хуже, чем такая же надпись в разрешении
dpi. Такого не случается с векторными шрифтами: сравните с надписью "This is a string", которая использует (предусмотренные стандартом PostScript) векторные шрифты. Впрочем, заметить разницу в плавности линий можно только на хорошем принтере и при внимательном разглядывании. Добавление одного шрифта
УСТЬ теперь у нас есть tfm- и pk-файлы для какого-то шрифта (и они находятся в тех местах, где TeX их ищет). Как добавить такой шрифт в наш текст? Самый простой и самый грубый способ добавить новый шрифт предоставляет команда \newfont. Ее формат таков:\newfont{команда}{описание_шрифта} Здесь команда — это придуманная вами команда для переключения на добавляемый вами шрифт. Имя этой команды надо выбирать так же, как первый аргумент команды \newcommand (оно не должно быть занято, не должно начинаться на end} и т.п.). Что же до описания_шрифта, то в простейшем виде это — просто имя tfm-файла, соответствующего данному шрифту.
Вот пример. В свое время Дональд Кнут шутки ради разработал причудливый шрифт, называемый cmff10 (его tfm-файл и mf-файл называются соответственно cmff10.tfm и cmff10.mf, и входят в стандартный комплект). Чтобы пользоваться этим шрифтом в своем тексте, включите в преамбулу строку
\newfont{\weird}{cmff10} и вы сможете писать тексты вроде
![]() | The letters look {\weird strange.} |
Тем не менее, если вы нашли какой-то экзотический символ, который хотите несколько раз использовать, и нашли шрифт, в котором он есть, команда \newfont может быть полезна.
Например, в шрифте wasy10, входящем во многие комплекты TeX'а, в позиции
имеется символическое изображение телефона. Зная это, можно написать в преамбуле\newfont{\wasyten}{wasy10} \newcommand{\telephone}{\hbox{\wasyten\symbol{7}}} и использовать команду \telephone для изображения телефона
.Еще одно применение этой команды — масштабирование шрифтов. Чтобы подключить масштабированный шрифт с помощью команды \newfont, надо задать требуемое увеличение или уменьшение во втором аргументе команды \newfont. Оно задается с помощью TeX'овского "ключевого слова" scaled (без backlash'а!), за которым следует коэффициент масштабирования, умноженный на
(после умножения коэффициента на
должно получиться целое число). Например, для подключения шрифта, увеличенного в два с половиной раза, надо после имени tfm-файла написать scaled 2500, а для шрифта, размеры которого уменьшены на 30%, надо написать scaled 700.Можно также задавать увеличение не в явном виде, а сообщить TeX'у требуемый "характерный размер" шрифта. Для этого надо во втором аргументе команды \newfont написать после имени tfm-файла масштабируемого шрифта
at размер где размер — требуемый "характерный размер", заданный обычным образом в TeX'овских единицах длины или через TeX'овские параметры длины, а at — еще одно TeX'овское " ключевое слово" (пишущееся без backslasha'а). Если основной шрифт документа имеет кегль
, то характерный размер разумно выбирать равным 10pt}, если
или
, то 11pt или 12pt.Но, конечно, это зависит от ситуации. Скажем, можно написать
\newfont{\wasytwenty}{wasy10 at 20pt} \newcommand{\bigtelephone}{\hbox{\wasytwenty\symbol{7}}} и получить вдвое больший рисунок телефона:
Еще одно применение масштабирования можно увидеть в начале этого раздела, где с его помощью изготовлен инициал "П". При этом использован такой код:
\newfont{\initial}{zcr17 at 48pt} \newbox{\literaP} \savebox{\literaP}{\hbox{\initial П}} \begin{wrapfigure}{l}{0.75\wd\literaP} \vbox to 0.4\ht\literaP{% \vss \usebox{\literaP}% \vspace*{-0.2\ht\literaP}% }% \end{wrapfigure} УСТЬ теперь...
Еще о русских шрифтах: подробности для знатоков
Сейчас мы сообщим вам две новости: хорошую и плохую. Хорошая состоит в том, что большая часть из сказанного выше совершенно не нужна для пользования различными шрифтами в LaTeX'е, поскольку разработчики стилевых пакетов о вас позаботились. Скажем, если организаторы конференции просят присылать статьи в гарнитуре Times, достаточно добавить в преамбулу команду\usepackage{times} После этого все шрифты заменятся на шрифты типа таймс без каких-либо дополнительных усилий с вашей стороны. (Правда, могут появиться новые overfull'ы, так как размеры букв другие). Эта команда не меняет шрифтов, используемых в формулах, и они выглядят не очень хорошо (гарнитура таймс в среднем жирнее обычной Computer Modern). Чтобы изменить и шрифты для формул, скажите
\usepackage{mathptmx} Более подробно смена шрифтов в тексте и формулах обсуждается в книге [6]; учтите только, что соответствующие пакеты часто меняются.
Теперь плохая новость: все перечисленные удобства (возможности легко использовать различные гарнитуры) доступны лишь при использовании латинских шрифтов. Если вы попробуете добавить русские буквы к нашим примерам, то ничего хорошего не получится. Прежде всего это связано с нехваткой свободно распространяемых русских шрифтов различных гарнитур, а также с различиями в кодировках русских символов. Этим бедам и посвящен настоящий раздел, в котором автор попытался кратко изложить известную ему информацию про положение дел с русскими шрифтами. Вряд ли она сильно поможет многим на практике, но если она побудит кого-либо из читателей взяться за дело и исправить положение (хотя бы немного), то автор будет считать свою задачу выполненной. Автор заранее приносит извинения тем (вероятно, многочисленным) коллегам, о работах которых у него нет достаточной информации; вина, разумеется, тут только его.
Для использования разнообразных русских шрифтов в LaTeX'е нужно решить две проблемы: (а) найти сами шрифты и (б) написать файлы для подключения их к LaTeX'у. В этом разделе мы обсудим первую из этих проблем, а второй из них посвятим следующий раздел.
Нас будут интересовать шрифты двух типов: METAFONT-шрифты и PostScript-шрифты. Еще бывают так называемые TrueType шрифты, их подключение к TeX'у в принципе возможно, но менее удобно, и о них мы говорить не будем.
Гарнитуры
Если при чтении книжек вы больше интересовались содержанием, чем оформлением, то могли и не заметить, что они набираются разными шрифтами. Здесь мы имеем в виду не шрифтовые выделения (скажем, жирный — или, как сказали бы полиграфисты, полужирный шрифт), а различные рисунки шрифтов. Полиграфисты называют их гарнитурами. Заглянув в выходные данные книги (особенно изданной несколько десятилетий назад), можно найти там слова " Гарнитура обыкновенная новая" или "Литературная гарнитура". Эти слова означают разные рисунки букв; каждая из гарнитур может включать в себя шрифты различных начертаний (прямые, курсивные, полужирные) и размеров.Вот несколько образцов различных гарнитур:

Вначале показаны четыре начертания гарнитуры Times1) — прямое светлое, курсивное светлое, прямое полужирное и курсивное полужирное. Аналогичные варианты есть и для других гарнитур нашего примера, но для экономии места они не показаны. Кроме того, не показаны (также входящие в число символов) цифры, знаки препинания и т.п.
METAFONT-шрифты.
Эти шрифты в свою очередь делятся на две категории. В первом случае авторы ставили своей целью экстраполировать Computer Modern на русские буквы (и, в частности, заимствовали формы общих букв из Computer Modern). Таковы шрифты AMS, шрифты Глонти и шрифты Лапко (см. ниже) Во втором случае авторы старались сделать русский шрифт определенного вида, не связывая себя требованиями единства стиля с Computer Modern.В комплект шрифтов AMS (Американского математического общества), распространяемый практически со всеми версиями TeX'а, входят шрифты, разработанные в Humanities and Arts Computing Center, University of Washington (в 1989 году). Эти шрифты использовались в различных публикациях AMS (в основном — для печати русских названий статей и книг в списках литературы). Вот образец шрифта wncyr10}:

Эти шрифты, если можно так выразиться, "импортные". Первыми " отечественными" русскими METAFONT-шрифтами, кажется, были шрифты, разработанные в Институте физики высоких энергий (Протвино) при участии Наны Глонти и Александра Самарина (их иногда называют шрифтами Глонти). Вот образец шрифта cmcyr10} (взят с сервера ftp.dante.de})

Эти шрифты (с небольшими изменениями отдельных букв, сделанными в основном А.Шенем) были использованы при подготовке этой книги. Приведем их (с этими изменениями) в том же масштабе:

Наконец, Ольга Лапко и Андрей Ходулев разработали шрифты, получившие название "LH-шрифтов". Многие считают, что из различных METAFONT-продолжений шрифта Computer Modern именно эти шрифты обладают наиболее высоким качеством. Кроме того, они включают в себя большой набор символов самых разных языков на кириллической основе. Можно надеяться, что они в будущем окончательно стабилизируются (пока что новые версии выходят довольно часто) и будут в разных версиях TeX'а столь же стандартны, как сейчас шрифты Кнута. (Уже сейчас LH-шрифты входят в большинство дистрибутивов TeX'а, обычно в не самых последних версиях. Впрочем, дело осложняется тем, что авторами этих шрифтов предусмотрено много разных версий для разных кодировок, причем они генерируются "на лету" с использованием довольно хитроумных и не везде работающих механизмов.)
Вот как выглядят русские буквы в этих шрифтах:

Разница между этими четырьмя образцами заметна, если приглядеться внимательно. (Обратите внимание на буквы "Л", " Д" и "Э".)
К шрифтам второй категории относятся шрифты, авторы которых не стремились следовать стилю Computer Modern.
При поддержке Российского фонда фундаментальных исследований в рамках проекта "Русский TeX" Л.Н.Знаменская и С.В.Знаменский разработали шрифты, отчасти напоминающие гарнитуру "Обыкновенная новая". Вот образцы этих шрифтов (мы воспроизводим предварительный вариант этих шрифтов, вошедший, с разрешения разработчиков, в использованную при подготовке книги русификацию):

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

Завершая разговор о METAFONT-шрифтах, отметим, что существует (не вполне завершенный) набор программ ps4mf (подробную информацию можно найти на сервере ftp.dante.de), который позволяет полуавтоматически изготавливать METAFONT-шрифты из Type 1 шрифтов. Однако получающиеся шрифты плохо приспособлены к печати при низких и средних разрешениях (например, для 300 dpi). Дело в том, что и METAFONT, и Type 1 предусматривают задание границ букв в виде кусочно-гладких кривых, и эти кривые легко перевести из одного формата в другой с минимальными изменениями. Проблема в том, что при переводе шрифтов в черно-белую матрицу кривые подвергаются округлению с неизбежными погрешностями. Если, скажем, ширина вертикальной палочки в букве "Ш" не есть точное кратное размера точки, то может случиться, что три палочки (которые имеют одну и ту же ширину в точном представлении) при округлении приобретут разную ширину.
Кроме того, из- за того же округления буква "Ш" может потерять осевую симмметрию, что нежелательно. Эта проблема существует и для METAFONT'а, и для Type 1, но решается по-разному. Язык METAFONT предоставляет автору шрифтов возможности самому влиять на округление так, как он этого пожелает. В шрифтах Type 1 используются указания особого вида (hints), которые побуждают интерпретатор PostScript'а производить округления так, как это хотелось автору шрифта. При этом формат и интерпретация этих указаний — дело довольно сложное, и без потерь в METAFONT они не переводятся.
Обратный перевод (из METAFONT'а в Type 1) сталкивается не только с проблемой округления, но и с тем, что в METAFONT'е (который представляет собой язык программирования) есть разнообразные средства описания шрифтов, а не только описание контуров. На практике, изготавливая Type 1 шрифты из METAFONT-шрифтов, сначала изготавливают матрицы букв в высоком разрешении, после чего применяют программы, восстанавливающие границы кривых, и добавляют указания (hints) вручную или полуавтоматически.
Подключение шрифтов и fd-файлы.
Итак, мы знаем, что имеются пять (вообще говоря) независимых атрибутов шрифта. Все эти атрибуты можно увидеть в сообщении об overfull'е (см. 116). Именно, там присутствует последовательность символов \OT1/cmr/m/n/10.95, в которой перечислены, через косую черту, атрибуты текущего шрифта (кодировка, семейство, насыщенность, начертание, размер). Их можно менять независимо.Через эти команды выражаются и команды более высокого уровня (скажем, \textbf или \emph). Например, \normalfont) в стандартных классах задается по существу так:
\newcommand*{\normalfont}{% \fontencoding{OT1}\fontfamily{cmr}% \fontseries{m}\fontshape{n}% \selectfont } Остается объяснить, как проинформировать LaTeX, какие шрифты соответствуют тем или иным комбинациям атрибутов. Это делается с помощью специального файла с расширением fd. Вот, например, файл, который (в использованной нами русификации) подключает шрифты типа гельветика.
\ProvidesFile{ot1zhr.fd} [Quasi Helvetica font definitions] \DeclareFontFamily{OT1}{zhr}{} \DeclareFontShape{OT1}{zhr}{m}{n} { <5> <6> <7> <8> zhr5 <9> <10> <10.95> zhr10 <12> <14.4> zhr12 <17.28><20.74><24.88> zhr12}{} \DeclareFontShape{OT1}{zhr}{b}{n} { <5> <6> <7> <8> <9> <10> <12> <10.95> <14.4> <17.28> <20.74> <24.88> zhb10}{} \DeclareFontShape{OT1}{zhr}{bx}{n} { <5> <6> <7> <8> <9> <10> <12> <10.95> <14.4> <17.28> <20.74> <24.88> zhbx10}{} \DeclareFontShape{OT1}{zhr}{m}{sl} { <5> <6> <7> <8> <9> <10> <12> <10.95> <14.4> <17.28> <20.74> <24.88> zhsl10}{} \DeclareFontShape{OT1}{zhr}{m}{it}{ <-> sub * zhr/m/sl }{} Сначала говорится, что определяется семейство zhr в кодировке OT1. (Что не вполне верно, так как в OT1 никаких русских букв нет.) Затем объясняется, что надо использовать в качестве светлых шрифтов прямого (не курсивного) начертания: шрифты zhr5, zhr10, zhr12 (выбор зависит от размера нужного шрифта, указанного в угловых скобках). Затем объясняется, что надо использовать в качестве полужирных ( bx) и наклонных ( sl) шрифтов. Наконец, в последней строке говорится, что (по причине отсутствия курсива в шрифтах типа гельветика) вместо курсива ( it) надо пользоваться наклонным ( sl) шрифтом.
Как видите, ничего сложного в подключении нового семейства нет, если внутренняя кодировка шрифтов совпадает с кодировкой семейства, для которого они применяются. Если же нет, то нужно изготавливать виртуальные шрифты, описание чего выходит за рамки этой книги (есть по крайней мере два способа: один описан в документации к драйверу dvips, второй содержится в пакете fontinst).
В заключение еще раз скажем, что все эти (полезные скорее для общего понимания ситуации, чем практически) сведения приведены здесь в качестве затравки — чтобы вдохновить читателей на изготовление хороших и доступных для применения русских шрифтов.
Может, попробуете?
![]() |
![]() |
![]() |
2) Впрочем, не всё так просто. Например, посмотрев на сайт www.paratype.com}, можно обнаружить разные типы лицензий. Одни ограничивают число принтеров, на которых можно печатать полученные файлы (тем самым, скажем, переслать статью с этими шрифтами коллегам уже нельзя), другие (лицензия на одну публикацию) требуют покупать отдельную лицензию на каждую статью и т.п. Вряд ли даже законопослушные пользователи станут широко использовать шрифты с такими лицензиями.
3) Недавно появились предназначенные для свободного распространения шрифты В.Филиппова, дополняющие упомянутые выше URW-шрифты русскими буквами; видимо, работа над ними еще не закончена. См. ftp://ftp.gnome.ru/fonts/urw}.

Подключение шрифтов
До сих пор мы говорили о наличии шрифтов как таковых, а не о механизме их подключения к системе LaTeX. Само по себе подключение не очень сложно, и можно надеяться, что если качественные разнообразные свободно распространяемые METAFONT- или PostScript-шрифты появятся, то вскоре будут написаны и LaTeX-определения, их подключающие.Тем не менее, скажем несколько слов о том, как работает механизм подключения шрифтов.
Понятие кодировки. Пример: кодировка T1.
Система LaTeX пытается реализовать следующую простую идею: набор символов и форма символов (гарнитура) являются независимыми координатами. Скажем, можно говорить о русских и латинских шрифтах (два значения первой координаты), а также о шрифтах гарнитуры таймс и гельветика (два значения второй координаты), и двигаться по каждой координате независимо.Несмотря на кажущуюся очевидность, этот принцип трудно реализовать буквально, и не только потому, что какие-то значения координат соответствуют отсутствующим в данном комплекте шрифтам, но и по более тонким причинам. Например, в какой-то гарнитуре может быть специальный символ { "fi"}, которым изображаются стоящие рядом буквы f и i (это называется " лигатурой", обратите внимание на отличие этого символа от набранных подряд букв:fi), а в другой гарнитуре соединять эти буквы не принято и такого символа нет.
Тем не менее в первом приближении можно считать, что в системе LaTeX есть два независимых параметра: кодировка (encoding) говорит, какие символы имеются, а семейство (font family) определяет внешний вид символов. Мы уже упоминали кодировку T1, используемую при работе с неанглийскими языками на латинской основе. Рисунок B.1 показывает символы кодировки T1, представленные шрифтами семейства Computer Modern.

Рис. B.1. Кодировка T1
Та же самая кодировка T1, представленная шрифтами семейства Helvetica, показана на рисунке B.2

Рис. B.2. Кодировка Т1:Helvetica
В теории эти две таблицы должны отличаться лишь формой символов, но на практике это не совсем так: в нынешней версии LaTeX'а некоторые позиции в кодировке T1 в шрифте типа Helvetica не заполнены соответствующими буквами.
Тем не менее кодировка T1 (ее еще называют Cork encoding, поскольку кодировка была утверждена на конференции TeXников в ирландском городе Корк) обеспечивает более или менее приемлемую основу для использования LaTeX'а с разными шрифтами и разными языками с латинской графикой.
Впрочем, до сих пор по умолчанию используется так называемая кодировка OT1, в которой всего
символов, представленных в оригинальных шрифтах Кнута.
Эта кодировка показана на рисунках B.3 и В.4. в двух видах (обычные шрифты и tt}-шрифты).

Рис. B.3. Кодировка ОТ1

Рис. B.4. Кодировка ОТ1:семейство cmtt
Читатель может заметить, что эти таблицы не соответствуют идее кодировки, объясненной выше: далеко не все символы в двух таблицах соответствуют друг другу. (А в курсивных шрифтах на месте доллара появляется фунт!) Причина этого понятна: шрифты разрабатывались Кнутом исходя из ограничения в
символов и до появления общей схемы переключения шрифтов.PostScript-шрифты.
В отличие от кириллических METAFONT-шрифтов, которые можно пересчитать по пальцам, PostScript-шрифты с русскими буквами существуют в изобилии. Некоторые из них распространяются западными производителями (скажем, той же фирмой Adobe), но подавляющее большинство сделано в России. Этим, в частности, много занималась фирма "Параграф" (впоследствии шрифтовое подразделение фирмы получило название Paratype).В отличие от METAFONT-шрифтов, которые (как правило) являются свободно распространяемыми, PostScript-шрифты надо покупать и нельзя выкладывать на сервер вместе с TeX-системой. Формально говоря, это не запрещает распространять вспомогательные файлы, необходимые для их подключения к TeX, как это делалось в течение многих лет с английскими PostScript-шрифтами. В конце концов, наиболее законопослушные пользователи могут шрифтыкупить2), а менее законопослушные пойдут в ближайший ларек за " пиратским" компакт-диском. Но и в том, и в другом случае нет никаких гарантий, что удастся достать именно ту версию шрифта, что была у разработчика вспомогательных файлов — русские шрифты еще менее стандартны, чем английские, и не только формы букв, но и их размеры и кодировка могут различаться в разных версиях.
В случае латинских шрифтов ситуация сильно упростилась благодаря фирме URW, которая разрешила распространять бесплатно некоторые наиболее популярные шрифты вместе с системой Ghostscript. Именно эти шрифты и были использованы нами в приведенных выше примерах гарнитур . К сожалению, насколько известно автору, этому примеру никто из фирм-производителей кириллических шрифтов не последовал, и "белых" (с ясным происхождением и свободно распространяемых без ограничений на использование при подготовке печатных и электронных документов) качественных PostScript-шрифтов автору найти не удалось3) Но есть некоторые "серые" шрифты:
В ее состав входили некоторые PostScript-шрифты с русскими буквами (в том числе комплект шрифтов типа литературной гарнитуры), однако они не содержали внутри себя сведений о копирайте. Возможно, какие-то из этих шрифтов послужили исходным материалом для пакета PSCyr (см. следующий пункт).
были собраны Сергеем Наумовым в 1995 г. В этих шрифтах отсутствовала информация об изготовителе, однако по некоторым признакам это были просканированные изображения широко распространенных русских типографских шрифтов...
В 1997 г. коллекция была дополнена шрифтами .Arial.}, Courier и Times фирмы Monotype, построенными из шрифтов стандартной поставки Windows...Свободно распространяемый шрифт ERKurier
был добавлен Константином Чумаченко в версии 0.2, а шрифт Academy (неизвестного происхождения) — им же в версии 0.3.}".Кроме того, говоря об изменениях в версии 0.3, Лебедев пишет:
для легализации коллекции шрифтов добавлен файл LICENSE. В этом файле говорится:
Permission is granted to use, copy, and freely redistribute the fonts from the PSCyr font collection in any media\ldots provided that
1. any modification of\/ \upshape *.afm} and\/ \upshape *.pfb} files is forbidden. 2. the redistribution of the font(s) and the whole collection as separate computer file(s) should retain this license information\/
В самих шрифтах встречаются: Monotype Corporation, AG Fonts Collection, Andrejs Grinbergs, Gavin Helf, Ares Software.В файле README к версии 0.3 написано:
The typefaces included in this package originally come from The Monotype Corporation plc. (with changes by Eugene V.Demidov), Gavin Helf (with changes by Andrey Chernov); Paratype, division of Paragraph International. As to my knowledge, these fonts are placed into public domain and can be freely redistributed. (AUTHOR: Konstantin Chumachenko)\/ Вопрос о том, насколько законно объявлять свободно распространяемыми шрифты неизвестного происхождения, не указывая никаких подтверждений того, что первоначальные разработчики поместили их в public domain, сложен, тем более что законы, касающиеся юридической защиты шрифтов, непросты для понимания и различны в разных странах.
Мы условно относим эти шрифты к категории "серых", имея в виду лишь, что вопрос о законности их распространения кажется сложным. Впрочем, в условиях, когда на уличных лотках можно найти по бросовой цене базы данных государственных организаций и новейшие версии Windows, трудно представить себе, что именно эти шрифты станут темой юридических дебатов.
In the following paragraphs ``fonts'' stands for Type 1 fonts together with metric files and also any conversions and renderings of them. You are allowed: to use fonts with any TeX distribution; to use fonts with any graphic editors for preparing pictures to be included with TeX documents; to use fonts with other programs (such as WWW browsers) for screening purpose only; to convert fonts into any format for above purposes; to include fonts into electronic documents (such as PDF); to distribute fonts together with RFBR TeX distribution Казалось, бы все возможные разумные использования тут предусмотрены и разрешены. Однако далее написано, что
You are not allowed to use fonts for hardcopy making with any programs except TeX drivers\/, что, формально говоря, запрещает печать включающего эти шрифты файла (полученного с помощью системы TeX) с использованием (скажем) программ Adobe Acrobat} или Ghostscript. Еще написано, что нельзя distribute this fonts as an independent package (так в оригинале), причем что такое в точности RFBR TeX distribution, с которой распространять можно, и где ее взять, не вполне ясно.
Можно надеяться, что это лишь нечеткость формулировки и что дух лицензии важнее ее буквы.
Шрифты эти были получены так: сначала из METAFONT-текстов были получены матрицы высокого разрешения, а затем они преобразованы в формат Type 1 с помощью программ TeXtrace и Autotrace.
Семейства шрифтов
Конечно, хотелось бы подключать к LaTeX'у не один шрифт фиксированного размера, а целый набор новых шрифтов таким образом, чтобы в tex}-файле можно было менять их начертание и размер с помощью команд, аналогичных рассмотренным нами в лекции 3.Такие возможности действительно есть. Например, образцы шрифтов типа Times, приведенные на с. 360, были получены с помощью таких команд:
{\fontfamily{ptm} \selectfont \begin{center} This is Times font sample\\ ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\\ \fontshape{it}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz \fontseries{b}\fontshape{n}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\\ \fontshape{it}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz \end{center} } В них устанавливаются желаемые параметры шрифта, а затем этот шрифт вызывается командой \selectfont.
Сначала мы устанавливаем семейство шрифтов с помощью команды
\fontfamily{ptm} (где ptm есть внутреннее имя семейства шрифтов типа таймс). При этом остальные параметры (размер, насыщенность, начертание) остаются неизменными. Команда \selectfont переключает шрифт. Затем мы меняем начертание с помощью команды \fontshape, делая его курсивным (it}, прямое начертание обозначается n), и снова переключаем шрифт с помощью \selectfont. После этого мы меняем насыщенность с помощью команды \fontseries (при этом b} означает полужирный шрифт, а обычный шрифт обозначается m}) и возвращаемся к прямому начертанию. И так далее.
Есть еще команда изменения размера шрифта, явно указывающая кегль и интерлиньяж. Например, команды
\fontfamily{ptm} \fontsize{17pt}{24pt} \selectfont This is Times Roman\\ 17 pt / 24 pt позволяют напечатать две строки шрифтом типа таймс с размером 17 pt и расстоянием между строками 24 pt:

Команды \fontfamily, \fontseries, \fontshape и \fontsize являются командами "нижнего уровня": как правило, надо использовать не их, а команды типа \textbf, \textit, \textsf или же команды смены начертания и насыщенности (\rmfamily, \sffamily, \upshape, \bfseries и др.).
Но откуда же LaTeX узнаёт, что, например, команда \rmfamily предписывает переключиться на семейство шрифтов, известное под внутренним именем cmr, а команда \bfseries устанавливает насыщенность, известную под внутренним именем bx? Эта информация содержится в определении следующих команд:
| \rmdefault | cmr |
| \sfdefault | cmss |
| \ttdefault | cmtt |
| \bfdefault | bx |
| \mddefault | m |
| \itdefault | it |
| \sldefault | sl |
| \scdefault | sc |
| \updefault | n |
Сказанное объясняет рецепт уменьшения ширины жирного шрифта, приведенный на стр.114: переопределяя команду \bfdefault, мы заставляем LaTeX по командам \textbf или \bfseries (а также \bf) выбирать шрифт насыщенности b}, менее широкой, чем насыщенность bx, получающаяся по умолчанию.
А если, например, вы захотите, чтобы основным шрифтом вашего документа был шрифт без засечек, то можно переопределить в преамбуле команду \rmdefault:
\renewcommand*{\rmdefault}{cmss} (согласно нашей таблице, cmss — это LaTeX'овское внутреннее имя для шрифта без засечек). Другой вопрос, будет ли это удачным полиграфическим решением. Не слишком увлекайтесь подобными экспериментами, если вы не полиграфист!
Входная и внутренняя кодировки.
Следует подчеркнуть, что слово "кодировка" в сочетании " кодировка T1" имеет не совсем обычный смысл. Эта кодировка, вообще говоря, не совпадает с кодировкой букв во входных файлах (а для некоторых символов вообще нет кода, который им соответствует во входном файле). Как же задается соответствие между ними? Есть два принципиально разных подхода.Первый вариант состоит в том, что в программу TeX встраивается дополнительный механизм (выходящий за рамки собственно TeX'а), который считывает таблицу соответствия между кодами и автоматически перекодирует входные символы. (Можно сказать, что TeX в узком смысле этого слова ничего не знает о входной кодировке.) Обратное перекодирование производится при выдаче log}-файлов и других текстовых файлов.
Второй вариант, не выходящий за рамки TeX'а и применяемый в пакете inputenc, состоит в том, что символы входного потока становятся "активными", то есть становятся командами, порождающими символы во внутренней кодировке. Это, конечно, противоречит всей архитектуре TeX'а, поскольку там есть специальная "категория", называемая буквами (letters), а активные символы — уже не буквы. В результате работа других пакетов может нарушиться, если они не готовы к такому повороту событий, в idx-файл попадают не буквы, а команды для них (что нарушает нормальную работу программ для обработки idx-файлов) и т.д. Зато, скажем, кодировку можно переключать "на лету" в середине текста, если это зачем-то понадобится.
Кстати, внутренняя кодировка (при использовании так называемых виртуальных шрифтов) может не совпадать и с кодировкой, используемой в шрифте (будь то PostScript- или METAFONT-шрифт). Но в tfm-файлах используется как раз внутренняя кодировка.

Рис. B.5. Кодировка T2A

Рис. B.6. Кодировка T2В

Рис. B.7. Кодировка T2C
Что же получается с русскими текстами? Для них есть несколько входных кодировок (koi8-r, cp1251, cp866) и несколько внутренних. Заметим, что при использовании одной внутренней кодировки не удается поместить в нее все кириллические символы, сохранив первую половину такой же, как в кодировке T1 (разных символов слишком много). Это было причиной появления кодировок T2A, T2B и T2C, в которых русские буквы стоят на одних и тех же местах, но вот дополнительные буквы разные. На рисунках В.5, В.6 и В.7 приведены соответствующие списки символов (набранные шрифтами LH — на сегодняшний день единственными кириллическими шрифтами, эти кодировки поддерживающими).
Представляет интерес также кодировка X2 (рис. В.8), в которой первая половина также используется для кириллических символов (в отличие от T2A, T2B и T2C, в ней присутствуют символы, необходимые для набора русских текстов в дореволюционной орфографии). Кроме этого, имеется кодировка OT2, соответствующая кодировке символов в русских шрифтах AMS, а также многие другие.

Рис. В.8. Кодировка X2
Г. Классы документов АMS
Американское математическое общество (AMS) распространяет три специализированные класса документов, предназначенные для набора математических текстов: amsart , amsproc и amsbook. Оставляя последний в стороне (уж если Американское математическое общество закажет вам монографию, то, наверное, снабдит и подробными инструкциями), остановимся на особенностях оформления документа "в целом", характерных для первых двух классов.Для начала отметим, что AMS'овские классы документов автоматически подключают стилевые пакеты amsmath и amsthm (если, однако, вам понадобились коммутативные диаграммы или дополнительные шрифты, то пакеты amscd, amsfonts или amssymb все же придется подключить в явном виде, с помощью команды \usepackage). Остальные особенности этих классов относятся к титульной информации (т.е. к тому, что идет до команды \maketitle) и рубрикации документа.
Начнем с титульной информации. Команды \title и \author могут принимать необязательный аргумент (в квадратных скобках, естественно), ставящийся перед обязательным. Эти необязательные аргументы суть сокращенные варианты заглавия и имени автора, предназначенные для включения в колонтитулы. Команда \thanks, в аргументе которой обычно выражается благодарность за финансовую поддержку, оформляется не как сноска к имени автора, а записывается в преамбулу самостоятельно, наравне с \author и \title. В преамбуле одного документа может быть несколько команд \thanks. Команда \address также принимает один обязательный аргумент — адрес автора (можно разбивать на строки командой \\). Если вы хотите, наряду с постоянным адресом, указать еще и адрес для текущей переписки, можно это сделать в аргументе команды \curraddr. А если автор хочет указать и электронный адрес, можно его указать в команде \email (вниманию привыкших к AmSTeX'у: символ "@" надо набирать непосредственно, не используя backslash и/или удвоения!). Команда \address должна следовать после команды \author; если вы пользуетесь командами \curraddr и/или \email, то они, в свою очередь, должны следовать после команды \address именно в таком порядке, как указано выше.
Все сказанное относилось к случаю, когда автор у документа один. Если авторов несколько, то информацию о каждом из них надо задавать отдельной командой \author; после каждой команды \author ставится своя команда \address, а также, если нужно, \curraddr и/или \email.
Если вы хотите посвятить кому-то свою работу, запишите это посвящение в аргументе команды \dedicatory. В аргументе команды \keywords вы можете записать список ключевых слов, определяющих вкратце, что надо знать для понимания вашего труда, а в аргументе команды \subjclass — указать, к какому разделу математики, согласно рубрикатору~AMS, относится ваш опус. Наконец, аннотация к статье, оформленная как окружение abstract , в AMS'овских классах должна идти до \maketitle (но все равно после \begin{document}).
Что касается самого текста статьи, то главное отличие от того, что нам привычно по "обычному" LaTeX'у, состоит в командах рубрикации. Классы amsart и amsproc допускают в качестве таковых только \section, \subsection, \subsubsection, а также команду \specialsection, задающую самые крупные рубрики (более крупные, чем \section).
Теперь вы знаете достаточно, чтобы оформить статью по математике в соответствии с канонами Американского математического общества. Осталось только эту статью написать. Успехов вам!

Работа в системе LaTeX
Еще об изогнутых стрелках
Кроме конструкции @/.../, изгиб стрелки можно задавать конструкцией @( направление_выхода,направление_входа), где направление_выхода и направление_входа — это буквы или пары букв, значение которых показано на следующем рисунке:
Пример:
![]() | $\xymatrix{ A\ar@(ul,dl)[]_f\ar[r]^g&B }$ |
Начертания стрелок
В следующей таблице собраны некоторые начертания стрелок (часть из них стрелками, строго говоря, не являются, но в диаграмме могут быть полезны), которые можно получить с помощью @{...}-конструкции.![]() | @{-->} |
![]() | @{=>} |
![]() | @{.>} |
![]() | @{>->} |
![]() | @3{->} |
![]() | @{<->} |
![]() | @{->>} |
![]() | @{<=>} |
![]() | @{|->} |
![]() | @{^{(}->} |
![]() | @{-^{>}} |
![]() | @{-_{>}} |
![]() | @{-} |
![]() | @{=} |
![]() | @3{-} |
Некоторые общие правила
Синтаксис Xy-pic'а весьма сложен, и мы не будем пытаться изложить его полностью (автор должен признаться, что в полном объеме он его и не знает). Вместо этого приведем несколько приемов, наиболее, на наш взгляд, полезных на практике.Оптимизация и предупреждение ошибок
Пакет Xy-pic заставляет TeX работать буквально на пределе возможностей; файлы, в которых используются Xy-pic'овские конструкции, обрабатываются довольно медленно. Для ускорения работы полезно включить в преамбулу команду \CompileMatrices: в этом случае при первом запуске LaTeX'а информация о ваших \xymatrix будет записана в специальные файлы, а при последующих запусках обрабатываться будут именно они, что сэкономит TeX'у время на развертывание (части из) чудовищного количества макроопределений.Иногда синтаксис Xy-pic'а вступает в конфликт с синтаксисом других LaTeX'овских команд, что приводит к весьма загадочным сообщениям об ошибках. Чтобы избежать этого, при пользовании Xy-pic'ом полезно применять следующие меры предосторожности:
Будем надеяться, что описанные выше возможности Xy-pic'а достаточны для набора ваших диаграмм. Как мы уже отмечали, этот пакет предоставляет гораздо большие графические возможности, но если нужна сложная графика, разумнее освоить программу metapost, подготавливающую рисунки в формате PostScript, и включать в текст полученные с ее помощью графические файлы так, как описано в приложении Б.

Д. Пакет Xy-pic
Как мы отмечали вранее, возможностей пакета amscd для печати "коммутативных диаграмм" хватает не всегда: бывают нужны стрелки наклонные, изогнутые и т.д. Для печати таких диаграмм можно воспользоваться стилевым пакетом Xy-pic.Этот пакет — большой и сложный, и в настоящем приложении мы рассмотрим только те его возможности, что относятся непосредственно к коммутативным диаграммам (обо всем прочем можно почитать в оригинальной документации, распространяющейся в электронном виде вместе с пакетом).
Пример с комментариями
Чтобы можно было пользоваться пакетом Xy-pic для набора коммутативных диаграмм, надо подключить стилевой пакет xy с опциями matrix, arrow и curve. Иными словами, надо написать в преамбуле\usepackage[matrix,arrow,curve]{xy} Объяснить, как набирать с помощью Xy-pic'а коммутативные диаграммы, удобно на примере.
Рассмотрим следующую диаграмму:

Ей соответствовал такой исходный текст:
$$ \xymatrix{ && M'\ar@{o->}[dl]^e \ar@/_1pc/@{-->}[ddll]_u\\ & K\ar[rr]^f \ar[dr]^h && L \ar[ul]_a \ar[dl]_g\\ L'\ar@{o->}[ur]_d \ar@/_1pc/@{-->}[rrrr]_v && M\ar[rr]^p \ar[ll]_c && K'\ar@{o->}[ul]_b } $$ Разберем его шаг за шагом.
Вся диаграмма записывается в аргументе команды \xymatrix.
Далее, диаграмма состоит из формул, соединенных стрелками. Прежде чем набирать исходный текст для диаграммы, надо мысленно расположить эти формулы в вершинах прямоугольной решетки. В нашем случае это решетка
:
стоит в третьей позиции верхней строки,
и
— во второй и четвертой позициях средней строки,
,
и
— в первой, третьей и пятой позициях нижней строки. Строки разделяются командами \\, элементы строки — символами &. Если в каких-то узлах решетки ни одной формулы нет, надо оставить пустое место; символы & в необходимом количестве присутствовать обязаны.После каждой из формул (и до следующего & или \\) следуют обозначения для всех стрелок, выходящих из этой формулы. Рассмотрим эти обозначения повнимательнее.
Каждое обозначение для стрелки состоит из пяти элементов (не все эти элементы обязательны).
Первый (обязательный) элемент обозначения для стрелки — команда \ar.
Второй элемент — обозначение для изгиба стрелки (если стрелка прямая, его можно опустить). Оно имеет вид @/.../, где на месте точек записывается указание о том, как именно эту стрелку надо изогнуть. Это указание состоит из символа ^ или _, за которым следует длина в TeX'овских единицах, указывающая степень изогнутости (в нашем примере у всех изогнутых стрелок эта длина равна 1pc).
Длину можно и не указывать, написав просто @/^/ или @/_/, — тогда стрелке буден придан некоторый изгиб "по умолчанию". В любом случае символ ^ или _ указывает, в какую сторону стрелка изгибается: если _, то вправо, если ^ то влево (если смотреть от начала стрелки к ее концу).
Третий элемент — указание на начертание стрелки (если стрелка " обычная", его можно опустить). Оно имеет вид @{...}, где на месте точек ставится условное обозначение, более или менее имитирующее требуемую форму. В нашем примере присутствуют пунктирные стрелки, для которых это обозначение имеет вид @{-->}, и стрелки с кружочком в начале, обозначаемые как @{o->}.
Четвертый (обязательный) элемент обозначения для стрелки указывает ее направление. Каждая стрелка рассматривается как идущая из одного узла решетки в другой. Для задания направления (или, если угодно, точки назначения) стрелки необходимо поместить в квадратные скобки комбинацию из букв u (вверх), d (вниз), r (вправо) и l (влево). Например, [ddll] означает, что пункт назначения стрелки находится на нашей решетке на два шага вниз и на два шага влево от той формулы, из которой стрелка выходит.
Пятый и последний элемент (необязательный) определяет надпись при стрелке. Он состоит из символа ^ или _ и текста надписи (если в надписи больше одного символа, ее надо, как водится, взять в фигурные скобки). Знак ^ указывает, что надпись должна быть слева от стрелки (если смотреть от начала к концу), знак _ — что справа. При одной стрелке могут быть надписи с обеих сторон.
Сдвинутые стрелки
Стрелки можно сдвигать параллельно себе. Для этого используется конструкция @<...>, где на месте точек стоит длина в TeX'овских единицах, указывающая величину сдвига. Если эта длина положительна, то сдвиг будет влево (если смотреть от начала к концу стрелки), если отрицательна, то вправо:
![]() | $\xymatrix{ A\ar@<1ex>[dr]^f \ar@<-1ex>[dr]_g\\ &B }$ |
Управление расположением надписей
По умолчанию надпись при стрелке, соединяющей две формулы, располагается посередине между центрами этих формул. Если размеры этих двух формул различны, надпись при этом оказывается слишком близко к одной из них, что нехорошо. В таком случае можно дать указание, чтобы надпись располагалась в середине именно стрелки: поставить между ^ или _ и надписью знак - (минус):M
![]() | $\xymatrix{ A\times B\times C\ar@{.>}[dr]^-{f_1}\\ &D }$ |
Можно также в явном виде указать, в каком месте между центрами формул, соединяемых стрелками, надо сделать надпись. Для этого надо между ^ или _ и надписью поставить в круглых скобках десятичную дробь из интервала
(скажем, (0.25) означает, что надпись должна быть на четверти пути из начала в конец):
![]() | $\xymatrix@1{ A\ar[rr]^(.25){f}&&B }$ |
Наконец, можно сделать так, чтобы надпись была не сбоку от стрелки, а разрывала стрелку; для этого надо вместо ^ или _ написать ^|^, как в следующем примере:
![]() | $\xymatrix{ A\ar@/^/[rd]|{f}\\ &B }$ |
Работа в системе LaTeX
Что делать?
Но все-таки, что же делать бедному автору, если ему нужно использовать LaTeX для обработки текстов не на английском языке? Главный совет — спросить у знакомых, чем они пользуются, и попытаться воспользоваться теми же самыми средствами. Для языков на латинской основе может пригодиться пакет babel — ниже мы скажем о нем несколько слов в разд. Е.6. С русским дело сложнее — даже при использовании пакета babel могут потребоваться действия, выходящие за рамки обычного подключения пакета, поскольку во многих распространенных комплектах (teTeX, MiKTeX и др.) в готовых форматах не предусмотрена обработка русских переносов.В предисловии к русскому переводу книги [6] приводится список из 12 различных вариантов русификации LaTeX'а (и это не полный список, как сказано в том же предисловии). Нет никакой возможности описать их все, к тому же с большинством из них автор и не знаком. Вместо этого мы в трех следующих разделах кратко опишем следующие три вещи: вариант русификации, который использовался при подготовке этой книги (его можно найти на приложенном к книге диске), русификацию LaTex'а с помощью пакета babel, и использование того же пакета babel для подготовки текстов на западноевропейских языках, отличных от английского.
Правда жизни
В основном тексте книги не раз говорилось, что LaTeX позволяет автору подготовить текст книги на домашнем компьютере, а затем послать его коллегам или в издательство, где его напечатают без проблем и в том самом виде, как автор хочет.Настало время признаться, что сказанное несколько идеализирует реальность, даже если речь идет об английских текстах, и грубо приукрашивает ее, если речь идет о русских.
Прежде всего, не все издательства вообще знают про TeX. В этом случае автор должен принести готовый оригинал-макет в каком-нибудь известном издательству формате. Чаще всего используется формат PostScript. Теоретически такой файл достаточно передать побайтно в фотонаборное устройство или PostScript-принтер, и текст будет напечатан в нужном виде. На практике, однако, возможны осложнения. В одном популярном московском издательстве не только не умели работать с TeX-файлами, но и PostScript-файл умудрились напечатать с непреднамеренным изменением масштаба, причем разным для разных страниц! (Что не так удивительно, если учесть, что в современных системах с дружественным интерфейсом не всегда легко предвидеть последствия того или иного движения мыши.)
" Патриотически" настроенным читателям будет приятно узнать, что эти проблемы отнюдь не ограничиваются Россией: в одном широко известном американском издательстве на компьютере было установлено несколько версий LaTeX'а, причем сотрудники издательства этого не осознавали и удивлялись, почему обработка одних и тех же файлов иногда дает слегка разные результаты. Проблема тут в том, что время от времени в LaTeX и стилевые пакеты к нему вносятся улучшения (исправляются старые ошибки и вносятся новые).
Вот еще одна, совсем свежая, история. В первоначальной версии этой книги объяснялось, что для двойных акцентов в математических формулах (типа
) надо использовать команду \Hat, а не \hat, поскольку команда \hat ставит акценты со сдвигом, и был пример плохого двойного акцента. При обработке текста книги с новой версией пакета {amsmath} выяснилось, что авторы этого пакета о нас позаботились и изменили команду \hat, из-за чего пример ее ошибочной работы пришлось создавать искусственно.Впрочем, надо отдать должное разработчикам LaTeX'а и макропакетов к нему: по сравнению с другими "программными продуктами" количество версий (LaTeX обновляется раз в год, а раньше — раз в полгода) невелико, а различия между ними незначительны. (Plain TeX меняется еще реже и меньше.)
babel для французского языка
Предположим, что вам надо подготовить с помощью LaTeX'а текст на французском языке. Тогда файл надо начать так:documentclass[12pt,a4paper]{article} usepackage[T1]{fontenc} usepackage[french]{babel} (другие команды \usepackage, если нужно) После этого в тексте будут при необходимости делаться переносы по французским правилам, в том числе и в словах, включающих буквы с диакритическими знаками (" аксанами", как сказал бы любитель французского), невзирая на то, что эти буквы задаются в тексте с помощью команд \', \^ и т.п. Стандартные заголовки (" глава", "список литературы" и т.п.) и дата (проставляемая автоматически или с помощью команды \today) будут печататься по-французски. Более того, в тексте будут автоматически учитываться различные французские полиграфические тонкости (например, некоторые знаки препинания будут печататься не вплотную к сл“ и ” (в шрифтах, используемых пакетом bову, а с небольшим отступом, как это во Франции и принято). Кавычки-" елочки", принятые во французских текстах, можно при этом набирать как abel, это лигатуры). Для некоторых других типично французских полиграфических эффектов предусмотрены специальные команды, с которыми можно ознакомиться в документации к пакету.
Кроме французского, аналогичным образом можно обойтись с немецким (вместо french надо написать german), итальянским и многими другими европейскими языками; впрочем, надо иметь в виду, что далеко не для всех из них будут доступны автоматические переносы (см. предыдущий раздел по поводу того, как выяснить, включена ли в формат нужная вам таблица переносов и как можно попытаться ее добавить). Если вы не уверены, что таблица переносов есть, то лучше вообще запретить переносы, сказав в преамбуле \hyphenpenalty=10000: худшее, что может случиться при использования русского babel'а без русских переносов, — это то, что в русских словах не будет делаться переносов, а вот при обработке, скажем, французского текста без французской таблицы переносов французские слова переноситься будут, но по английским правилам, что, надо полагать, хуже.
![]() |
![]() |
![]() |
1) Хотя и не всех: например, некоторых букв, использующихся в латышском или литовском языках, в кодировке T1 нет.

babel для русского языка
В некоторые установки системы TeX (в частности, в некоторых русских версиях Linux) включены средства для обработки русских текстов с помощью пакета babel. (Говоря TeX нически, нужно, чтобы (1) сам пакет был установлен в вашей TeX-системе и (2) таблица переносов для русского языка была включена в формат.) Чтобы выяснить, так ли это, создайте файл \tstbabel.tex следующего содержания:\documentclass{article} \usepackage[russian]{babel} \begin{document} Test text. \end{document} и обработайте его командой latex tstbabel.tex. Если обработка файла прошла успешно (TeX не пожаловался на отсутствие пакета babel или неизвестную стилевую опцию russian), это значит, что пакет babel с русскими дополнениями установлен. Теперь надо проверить наличие русской таблицы переносов; для этого загляните в получившийся файл tstbabel.log. Его начало должно выглядеть примерно так:
This is TeX, Version 3.14159 (Web2C 7.3.1) **tstbabel.tex (tstbabel.tex LaTeX2e <2001/06/01> Babel
Чтобы использовать babel с русскими текстами, необходимо включить в преамбулу строки
\usepackage[...]{inputenc} \usepackage[russian]{babel} В квадратных скобках вместо {...} нужно указать кодировку, в которой будет набираться русский текст: например, cp866 (DOS-кодировка), cp1251 (Windows-кодировка) или koi8-r (кодировка koi8-r). Эти строки должны находиться в преамбуле до вызова каких-либо пакетов, использующих русские буквы. После этого в тексте можно набирать русские буквы в указанной кодировке. Важное ограничение: русские буквы нельзя использовать в именах команд или меток!
Пакет babel с опцией russian определяет множество командных последовательностей и лигатур для набора различных символов: например, с помощью "<">' или '“','”' можно получить кавычки-" елочки", '---' дает тире. Кроме того, переопределяются команды для набора заголовков, списка литературы и проч. (например, команда \chapter теперь будет печатать слово "Глава", а не " Chapter" — ср. предыдущий раздел). Более подробную информацию можно найти в документации.
Использование пакета babel несовместимо с описанной выше (и использованной в книге) русификацией LaTeX'а, а также с некоторыми другими пакетами — не пытайтесь их соединить! Кроме того, вам могут потребоваться некоторые специальные средства для подготовки предметных указателей, чтения сообщений об ошибках и др.
использованная в книге русификация
Для обработки русских текстов вместо стандартной команды \latex используется специальная команда \rlatex. При этом тексты записываются в кодировке cp866 для DOS и Windows и в кодировке koi8-r для UNIX-подобных систем. Подключение дополнительных пакетов не обязательно: и без них русские буквы можно использовать наравне с латинскими (в том числе в названиях команд, счетчиков, меток и др.), переносы учитывают таблицу русских переносов, можно использовать команды \лк, \пк для кавычек и \номер для знака номера. Буква е является одной из
равноправных букв русского алфавита.Само по себе использование команды \rlatex не меняет оформления текстов (и для английских текстов она дает почти тот же результат, что и команда \latex). Но можно обычным способом (с помощью \usepackage) подключить пакет russcorr. Это приведет к следующим изменениям:
;
;
и
, принятые в русских текстах;Все необходимые файлы для установки указанного варианта русификации (дополнительные файлы для UNIX, комплект TeX (конкретно — MiKTeX) плюс GhostScript и GSView для Windows, комплект emTeX для DOS) имеются на прилагаемом к книге компакт-диске (программы GSView там может не быть по лицензионным причинам, и ее придется списывать из Интернета, а также доступны по ftp. См. приложение Ж.
Русскоязычные беды
С русскими текстами дела обстоят еще хуже. Если вы подготовите файл с русским текстом и пошлете его своему коллеге, у которого используется другая операционная система или просто другая русификация LaTeX'а, почти наверняка у него возникнут проблемы и текст не напечатается или напечатается не так.Прежде чем описывать это бедственное положение более подробно, попытаемся хотя бы немного оправдаться и объяснить, отчего так получается.
Естественно, что Дональд Кнут прежде всего заботился об англоязычных авторах. Если мы хотим использовать TeX для текстов на других языках, возникает несколько проблем.
символов и предусматривал только английские переносы. Затем Кнут добавил возможность хранить таблицы переноса для нескольких языков. Впрочем, это не решало проблем с переносом иноязычных слов, поскольку буквы с диакритическими знаками не были полноценными буквами с точки зрения алгоритмов переноса. К счастью, байт оказался восьмибитовым, и поэтому TeX нически несложно было перейти к шрифтам из
символов.
В эти
символов уже помещались буквы большинства языков на латинской графической основе1), и для LaTeX'а была разработана соответствующая кодировка (T1), в которой уже все буквы полноценные. (Не торопитесь, впрочем, завидовать европейцам: не успели они порадоваться достигнутой стандартизации, как оказалось, что символ для европейской денежной единицы вставить в T1 некуда, и он, в отличие от более удачливого доллара, был добавлен в кодировку TS1).Параллельно TeX приспосабливался к русскому языку. Прежде всего нужно было нарисовать русские буквы, которые были бы по внешнему виду аналогичны буквам из кнутовских шрифтов. Это было сделано, причем несколькими способами (см. приложение В).
Тем не менее мечты о стандартизации (" Чтобы использовать русские буквы, подключите такой-то стандартный стилевой пакет") пока остаются мечтами. Помимо субъективных причин (все привыкли к своим любимым вариантам русификации и не хотят переучиваться), есть и объективные проблемы.
Первая связана с невозможностью соединить в одном шрифте все желательные символы, поскольку шрифты более чем с 256 символами TeX (без серьезных переделок) не использует, а свободных мест в кодировке T1 нет. Более того, даже если отказаться от символов европейских языков, но хотеть разместить все известные буквы кириллического типа, то и тогда оказывается недостаточным 256 символов. Поэтому есть несколько стандартизованных кодировок, включающих русские и другие кириллические буквы (T2A, T2B,...), не говоря уже о других, не стандартизованных, вариантах.
Вторая связана с тем, что существует несколько способов представления русских букв в файлах. Наиболее распространены три: koi8-r (обычно она используется в UNIX-подобных системах), cp866 (DOS) и cp1251 (Windows). Поэтому само понятие совместимости становится спорным: если DOS-пользователь приносит своему Windows-собрату дискету с файлом в кодировке cp866, должен ли этот файл обрабатываться LaTeX'ом в системе Windows без дополнительного перекодирования или после перекодирования в cp1251? Должна ли одна и та же программа обрабатывать тексты в разных кодировках (а может, даже и тексты, разные части которых записаны в разных кодировках)? Этого можно достичь, применяя dirty tricks(сделав русские буквы "активными символами" — читатели книги [2] нас поймут) — но тогда нельзя использовать русские буквы в именах команд.И т.д. и т.п.
Работа в системе LaTeX
Дополнительная информация
Описанных команд достаточно для полного цикла работы с системой LaTeX. Но есть и другие полезные возможности.pstops "2:0L@0.7(21cm,0)+1L@0.7(21cm,14.85cm)" text.ps text2.ps создает файл text2.ps, каждая страница которого представляет собой две уменьшенные с коэффициентом
страницы файла text.ps (меняя числа, можно регулировать уменьшение и сдвиг). Команда
psselect 5-26 text.ps text2.ps
помещает в text2.ps страницы
--
файла text.ps (можно оставить все страницы, начиная с пятой, если написать 5-). Более подробные сведения об этих и других программах можно получить, сказав (например) man pstops.
Учтите, что эти программы работают не для любых PostScript-файлов (но обычно работают с файлами, выдаваемыми программойdvips). Зато они, к слову сказать, совсем маленькие (и написаны на языке C без всяких системно-зависимых хитростей).Кроме того, TeX может помещать создаваемые им файлы (например, файлы шрифтов) в директорию типа /var/lib/texmf.
DOS-подобные системы
В системе DOS можно использовать пакет emTeX(автор — Eberhard Mattes). Он был написан довольно давно и включает в себя различные версии программ, рассчитанные на процессор 8086, 80286 и 80386 и выше. Его можно использовать с большим или меньшим успехом и в Windows в режиме DOS-эмуляции или в DOS-окне (возможно, потребуется что-то перенастраивать по части управления дополнительной памятью). Предупреждение: при одновременной установке emTeX и других TeX-систем на одном компьютере может произойти путаница (будут вызываться не те программы).На прилагаемом компакт-диске имеются как исходные файлы (взятые с сервера CTAN, см.Ж), так и полный комплект установленных файлов вместе с добавлениями, сгенерированными форматами и др. Поэтому в оригинальные файлы можно не заглядывать, а воспользоваться этим комплектом. Как это сделать, описано в файле emtex.dos/readme.em.
Учтите, что этот комплект рассчитан на процессоры не ниже 386 и к тому же занимает довольно много места (несколько десятков мегабайтов), поскольку никакого отбора мы не делали и включили даже то, что вряд ли понадобится. На крайний случай — если ваш компьютер медленный и памяти мало — можно попробовать воспользоваться инсталляционной программой Виктора Хименко, которая написана в 1996 году и предназначена для установки emTeX'а и его русификации. Эта программа и соответствующие файлы из тогдашнего emTeX'а находятся в директории
/justincase/emtexrus.old/1996 Впрочем, это мы сообщаем лишь на крайний случай: во-первых, в этой программе есть ошибка, и она может отказываться работать на быстрых компьютерах или не находить нужных файлов. Во-вторых, изготовленные с помощью версии 1996 года dvi-файлы используют другие имена шрифтов и потому не будут обрабатываться теперешними dvi-драйверами.
Где взять дополнительные пакеты: архив CTAN
Мы старались включить в прилагаемый компакт-диск (содержимое и ISO-образ которого можно найти на сервере ftp.mccme.ru, директория pubtex) все необходимое для первоначальной установки LaTeX'а (об одном исключении см. выше в разделе о GSView). Но через некоторое время вам скорее всего понадобится какой-то стилевой пакет или вспомогательная программа, которой на диске нет. (Или новая версия одного из пакетов.)Стандартное место хранения TeX-материалов — архивы CTAN (Comprehensive TeX Archive Network). Главный сервер этой сети в настоящее время ftp.dante.de, см. также www.dante.de; в случае чего информацию об этой сети легко отыскать с помощью поисковых машин в Интернете.
Все материалы по TeX'у (за исключением материалов по использованной в книге русификации, которые можно найти на ftp.mccme.ru), помещенные на прилагаемый компакт-диск, были взяты именно из CTAN.
Большое количество русскоязычных материалов (версии русских шрифтов, разные вспомогательные пакеты) имеется на сервере Воронежского университета ftp.vsu.ru.
![]() |
![]() |
![]() |
2) Все эти файлы написаны по-русски в кодировке koi8-r (типичной для UNIX), так что прежде всего нужно будет научиться читать и редактировать такие файлы (для чего необходимо подключить шрифты системы X Window System в этой кодировке и/или консольные шрифты). В разных версиях UNIX эти шрифты устанавливаются по-разному, и описание этого процесса мы не приводим, но без русских экранных шрифтов трудно воспользоваться русским TeX'ом.

Изготовление PostScript-файлов
Теперь следует опробовать работу с PostScript-файлами. Начнем с их создания: находясь все в той же директории, где лежат файлы test.tex и test.dvi, дайте командуdvips -o test.ps test.dvi Она выдаст на экран сообщение наподобие следующего:
This is dvips(k) 5.86 Copyright 1999 Radical Eye Software (www.radicaleye.com) ` TeX output 2002.07.21:2137' -> test.ps
Ради любопытства можно заглянуть в него с помощью команды less: там написано что-то вроде
%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software <...> userdict /end-hook known{end-hook}if %%EOF (когда мы провели эксперимент, в этом файле оказалось
строк).Теперь следует опробовать работу с PostScript-файлами. Начнем с их создания: находясь все в той же директории, где лежат файлы test.tex и test.dvi, дайте команду
dvips -o test.ps test.dvi Программа dvips выдает на экран сообщение наподобие следующего:
This is dvips(k) 5.86 Copyright 1999 Radical Eye Software (www.radicaleye.com) ' TeX output 2002.07.25:0115' -> test.ps
Ради любопытства можно заглянуть в него с помощью текстового редактора: там написано что-то вроде
%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software <...> userdict /end-hook known{end-hook}if %%EOF (когда мы провели этот эксперимент, в файле оказалось 149 строк).
Как проверить наличие LaTeX'а
Скорее всего, TeX уже входит в состав имеющегося у вас комплекта. Обычно это система teTeX, и в дальнейшем мы описываем именно ее (для системы Linux, в других системах детали могут отличаться). Чтобы убедиться в том, что TeX установлен, запустите команду tex: должно появиться что-то вродеThis is TeX, Version 3.14159 (Web2C 7.3.1) ** То же самое должно появляться при запуске команды latex. (Прервать выполнение команды tex обычно можно при помощи одной из клавиш Control-C и Control-D; если появляется вопросительный знак, то можно нажать клавишу x и затем Enter.)
Если этого не происходит, скорее всего, это означает, что при установке системы (из "дистрибутива") вы не заказали установку системы TeX. В этом случае можно попытаться повторить инсталляцию, выбрав соответствующие пакеты1), или добавить эти пакеты в систему. Например, в дистрибутиве системы Linux фирмы RedHat для этого применяется программа rpm. Заново устанавливать TeX, минуя принятую систему инсталляции, мы не советуем. Лучше попытаться разыскать и установить отдельные недостающие пакеты, следуя инструкциям к использованному вами дистрибутиву.
Не всегда по умолчанию устанавливается комплект TeX-документации. Советуем вам проверить и при необходимости доустановить его (скорее всего, он есть на дисках, с которых вы устанавливали операционную систему). Искать документацию следует прежде всего в директории типа /usr/share/texmf/doc (в ней должно быть много поддиректорий, относящихся к разным частям системы: amstex, bibtex, context и т.д.)
Кроме того, для работы с LaTeX'ом вам понадобится X Window System (графическая подсистема UNIX, которая рисует на экране окна, курсор от мыши и т.п.). Скорее всего, она тоже уже установлена, а если нет, попросите знатоков это сделать. Если она есть, можно попробовать полный цикл обработки файла в LaTeX'е.
Обработка файла с помощью LaTeX'а
После того, как файл test.tex создан, надо дать командуlatex test.tex На экране должно появиться примерно следующее:
This is TeX, Version 3.141519 (Web2C 7.3.1) (test.tex LaTeX2e <2000/06/01> (/usr/share/texmf/tex/latex/base/article.cls Document Class: article 2000/05/19 v 1.4b Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) No file test.aux [1] (test.aux) ) Output written on test.dvi (1 page, 236 bytes). Transcript written on test.log (Такое сообщение появляется при первом запуске; при втором файл test.aux уже есть и на его отсутствие не жалуются.) При этом должны образоваться (помимо test.aux) еще файлы test.dvi и test.log. Последний файл должен содержать примерно то же самое, что было выведено на экран.
После того, как файл test.tex создан, надо дать команду
rlatex test.tex На экране должно появиться примерно следующее:
This is TeX, Version 3.14159 (MiKTeX 2 UP 1) (test.tex This is Russified LaTeX2e [2000/07], based on LaTeX2e 2000/06/01 (C:\texmf\tex\latex\base\article.cls Document Class: article 2000/05/19 v1.4b Standard LaTeX document class (C:\texmf\tex\latex\base\size10.clo)) No file test.aux. (C:\texmf\tex\latex\base\t1cmr.fd) [1] (test.aux) ) Output written on test.dvi (1 page, 284 bytes). Transcript written on test.log. (Такое сообщение появляется при первом запуске; при втором файл test.aux уже есть и на его отсутствие не жалуются.) При этом должны образоваться (помимо test.aux) еще файлы test.dvi и test.log. Последний файл должен содержать примерно то же самое, что было выведено на экран.
Печать PostScript-файла
Печать осуществляется командойlpr test.ps Правда, для этого должна быть настроена система печати. В многопользовательских системах настройка принтеров — задача системного администратора, который должен сообщить пользователям, как печатать файлы. (А задача пользователей — " достать" системного администратора настолько, чтобы он наладил бесперебойную работу принтеров.) На домашнем компьютере вы сами себе системный администратор, и печать придется настраивать самому или с помощью друзей. К сожалению, это очень по-разному делается в разных версиях UNIX и даже в разных дистрибутивах. В современных дистрибутивах Linux (типа RedHat или Mandrake) при настройке печати могут помочь специальные графические оболочки (например, printtool в RedHat Linux).
Подчеркнем, что вовсе не обязательно иметь PostScript-принтер, чтобы печатать PostScript-файлы. На самом деле годится почти любой принтер (который работает с операционными системами, отличными от Windows; избегайте неполноценных "Windows-only" принтеров). Система печати автоматически обрабатывает ваш файл с помощью программы Ghostscript, так что вам (если все настроено правильно) не о чем беспокоиться.
Ж. Откуда взять TeX?
До сих пор мы старательно уходили от разговора о том, как на практике воспользоваться системой LaTeX, — прежде всего потому, что это зависит от того, какая операционная система установлена на вашем компьютере и какая версия TeX'а выбрана. В этом приложении мы попытаемся сказать что-то более конкретное, имея в виду пользователей разных операционных систем.Просмотр dvi -файла на экране
Описанные действия можно было произвести и без графической системы (" на консоли", как иногда говорят). Но следующее действие уже требует работающей системы X. Получив доступ к командной строке (часто это можно сделать, выбрав пункт меню "New shell", или " Xterminal", или "xterm", или еще что-то в таком роде), надо запустить программу xdvi командойxdvi test.dvi При этом должно появиться новое окно, в котором показана (возможно, не полностью) страница сверстанного текста. Справа от нее, скорее всего, будут разные "кнопки", назначение которых в основном понятно из названий. Клавиши Page Up и Page Down переходят на предыдущую и следующую страницу (пока, впрочем, страница только одна, и они не действуют), стрелки позволяют перемещаться по странице (что можно делать и с помощью мыши). Из других полезных возможностей: нажав на клавишу с цифрой, а затем на s, можно получить на экране изображение, уменьшенное в соответствующее число раз (по сравнению с максимально возможным, когда одна точка в шрифтах соответствует одной точке экрана) — так что 1s дает изображение максимального размера. Аналогично, набрав число и потом нажав клавишу g, можно перейти на страницу с заданным номером. Еще одно полезное свойство: нажатие на кнопку мыши может действовать как лупа.
Многие другие возможности можно узнать из документации (в частности, с помощью команды man xdvi). Выйти из программы можно, нажав клавишу q.
Просмотр и печать dvi-файла
Чтобы просмотреть файл test.dvi на экране, нужно дать командуyap test.dvi При этом должно появиться новое окно, в котором показана (возможно, не полностью) страница сверстанного текста. Клавиши Page Up и Page Down переходят на предыдущую и следующую страницу (пока, впрочем, страница только одна, и они не действуют), стрелки позволяют перемещаться по странице (что можно делать и с помощью мыши). Клавиши
и
позволяют менять масштаб. Еще одна полезная возможность: набрав число и потом нажав клавишу g, можно перейти на страницу с заданным номером. Выйти из программы yap можно, нажав клавишу q.С помощью меню File
Print можно также напечатать dvi-файл, если он не содержит вставок в формате PostScript. Если же такие вставки есть, нужно преобразовать dvi-файл в формат PostScript, после чего напечатать его с помощью программы GSView, как описано ниже.Более подробно использование программы yap описано в документации.
Просмотр и печать PostScript-файла
На практике, естественно, читать PostScript-файл невооруженным глазом не надо, а надо просматривать его с помощью программы GSView. Вызвать ее можно либо с помощью меню Start
Programs (тогда придется открывать файл с помощью клавиши " O" или пункта меню File
Open), иногда достаточно щелкнуть мышью на файле test.ps в Windows Explorer или какой-нибудь файловой оболочке типа Far. (Если на машине установлены программы фирмы Adobe, они могут показывать на экране PostScript-файлы своим способом.)При запуске программы GSView появится окно с сообщением, что программа не зарегистрирована; это не мешает работе программы, но может быть устранено с помощью регистрации (платной). После запуска программы в ее окне будет изображена первая (в данном случае и единственная) страница вашего файла. В этой программе также можно использовать клавиши Page Up и Page Down (или клавиши "
" и "
") для движения по страницам, клавиши "
" и "
" для изменения масштаба. Нажав клавишу P или выбрав в меню File
Print, можно напечатать файл (рекомендуем в диалоге печати установить " Windows GDI printer" — тогда можно будет устанавливать параметры печати обычным для Windows способом).Отметим в заключение, что в комплект MiKTeX 2.0 входят разные полезные программы для обработки PostScript-файлов (программа psselect позволяет вырезать из файла отдельные страницы, программа pstops помещать несколько листов на один с уменьшением или без, программа psbook — печатать буклеты и т.п.), только вместо команды man надо читать файлы с документацией).
Кроме того, в него входят различные программы обработки графических файлов в разных форматах, которые могут вам пригодиться при подготовке иллюстраций для включения в текст (коллекция программ NetPBM).
Просмотр PostScript-файла
На практике, естественно, читать PostScript-файл невооруженным глазом не надо, а надо просматривать его с помощью команды gv (или ghostview). Дайте командуgv test.ps и убедитесь, что на экране появляется окно, в котором изображена первая (в данном случае и единственная) страница вашего файла. В этой программе также можно использовать клавиши Page Up и Page Down (переключаться между страницами можно также с помощью мыши и списка страниц слева). Увеличение регулируется в меню сверху. Есть и много других пунктов меню, которые можно опробовать. В частности, средней кнопкой мыши можно пометить некоторые избранные страницы, а затем записать их в файл (это будет PostScript-файл только с избранными страницами) с помощью кнопок меню. Можно также и напечатать избранные страницы, но в этом случае программа запрашивает, какова команда печати, поэтому лучше опробовать печать отдельно.
Русификация TeX'а в UNIX
Сейчас получают все большее распространение русифицированные варианты системы Linux и других UNIX-подобных систем. Хочется надеяться, что скоро в их состав будет входить готовая к использованию и хорошо работающая русификация TeX'а вместе с соответствующей документацией. (А если быть совсем оптимистами, то можно надеяться, что эти русификации будут совместимы друг с другом хотя бы в той же степени, что и разные версии исходного англоязычного LaTeX'а.) Может быть, когда вы читаете эту книгу, такое уже случилось (всегда хочется надеяться на лучшее), тем более что многое в этом направлении уже делается (группой CyrTUG и ее последователями, российскими производителями дистрибутивов UNIX и т.п.) Тогда вам не понадобится ни этот раздел, ни прилагаемый к книге компакт-диск.Возможно также, что вы работаете в системе коллективного пользования, где кто-то уже установил тот или иной вариант русского LaTeX'а и успешно им пользуется. И в этом случае ваша жизнь упрощается: мы советуем поговорить с местными экспертами и узнать, как именно вызывать и использовать этот вариант, а не пытаться что-то установить самим. (Тем более что попытка установить одну русификацию поверх другой может нарушить работу обеих!)
Тем не менее возможен и тот случай, когда в вашей системе есть оригинальный английский LaTeX, не тронутый попытками русификации. Именно к этому случаю относятся все дальнейшие советы. По понятным причинам описывается именно тот вариант русификации, который использовался при подготовке этой книги.
В прилагаемом к книге компакт-диске в директории tetex.unix содержатся все необходимые для русификации материалы, собранные в архив texkoi.tar.gz (его можно найти в ftp://ftp.mccme.ru/pub/tex рядом с текстами этой книги; он занимает около мегабайта). Спишите этот архив на жесткий диск и разархивируйте его с помощью команды
tar xzvf texkoi.tar.gz (которую нужно давать в той же директории, где лежит архив). Появится директория texkoi; в этой директории есть файл README, содержащий краткое описание русификации (более подробное описание имеется в файле DETAILS), а также файлы INSTALL.root и INSTALL.user.
Первый из них описывает действия, которые должен предпринять системный администратор, чтобы установить русскую версию LaTeX'а для всех пользователей, второй — что надо делать пользователю, не имеющему прав системного администратора, чтобы установить русскую версию LaTeX'а для себя2).
Установка русских дополнений совсем проста, если у вас установлена система Linux в версии RedHat 6.0 и выше (или другая система, совместимая по расположению TeX-файлов) и вы можете получить полномочия системного администратора ( root). В этом случае достаточно:
Если на втором шаге возникают сообщения об ошибках, значит, в вашей версии Linux файлы расположены несколько иначе и придется разбираться подробнее. Прочтите тогда внимательно сам файл install.sh и комментарии к нему в файле INSTALL.root.
Имеется также аналогичный файл installbsd.sh, который может помочь при установке русификации в системе FreeBSD и аналогичных (где TeX лежит в других директориях).
Проверьте, прошла ли русификация успешно. Для этого создайте тестовый файл testrus.tex, в котором будут русские буквы:
\documentclass{article} \begin{document} This is a test file. Это — тестовый файл. \end{document} (заметим в скобках, что можно сделать это с помощью примитивного редактора xreditor, который входит в состав русификации и должен к этому моменту быть уже установлен; кроме него, имеются программы reditor-dos2unix и reditor-unix2dos, которые преобразуют тексты из DOS-кодировки (cp866, иногда называемой " альтернативной") в UNIX-кодировку (\mbox{koi8-r}) и обратно).
Затем дайте команду
rlatex testrus.tex Она должна выдать на экране текст
This is TeX, Version 3.141519 (Web2C 7.3.1) (testrus.tex This is Russified LaTeX2e [2000/07], based on LaTeX2e 2000/06/01 (/usr/share/texmf/tex/latex/base/article.cls Document Class: article 2000/05/19 v 1.4b Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) No file testrus.aux (/usr/share/texmf/tex/latex/base/t1cmr.fd)[1] (testrus.aux) ) [1] (testrus.aux) ) Output written on testrus.dvi (1 page, 284 bytes).Transcript written on testrus.log. (или аналогичный) и создать файл testrus.dvi. При просмотре этого файла на экране с помощью программы xdvi ( dvi-драйверы не требуют специальной русификации и используются обычным образом) должны быть видны русские буквы, программа dvips должна создавать PostScript-файл, при просмотре и печати которого видны русские буквы и т.п.
Если все это прошло успешно, то русификация готова к использованию (о некоторых ее возможностях см. приложение E).
Создание файла
Прежде всего надо создать файл (скажем, test.tex) такого содержания:\documentclass{article} \begin{document} This is a test file. \end{document} Обратите внимание, что буквы здесь только латинские. Это существенно: сначала мы хотим проверить работу исходного LaTeX'а, а не его русской версии. Такой файл надо создавать с помощью текстового редактора. Этих редакторов много (emacs, pico, joe, jed, старинный редактор vi и многие другие). Есть также программа Midnight Commander (mc), которая напоминает знакомую многим программу Norton Commander или Volkov Commander; в нее встроен текстовый редактор (вызывается клавишей F4). Так или иначе, если вы вообще работаете с UNIX, то скорее всего каким-то текстовым редактором пользоватся уже умеете. На всякий случай содержимое файла можно проверить командой less test.tex (ее работу можно завершить клавишей q).
Прежде всего надо создать файл (скажем, test.tex) в кодировке DOS (cp866) такого содержания:
\documentclass{article} \begin{document} This is a test file. Это — тестовый файл. \end{document} Такой файл надо создавать с помощью текстового редактора (отметим, что WordPad, Notepad и Write годятся не всегда). Например, можно применять редактор, встроенный в файловую оболочку типа Far (он обычно вызывается нажатием на клавишу F4); можно использовать программы типа Norton Commander или Volkov Commander в DOS-окне.
Если вы почему-либо используете текстовый редактор Microsoft Word, необходимо сохранить файл в формате типа "текст MS-DOS с концами строк" (в разных версиях Microsoft Word этот формат может называться по-разному). Проверьте, что полученный файл действительно текстовый и действительно в кодировке cp866. Это можно сделать, дав команду type test.tex в DOS-окне.
Существуют многие другие (freeware или shareware) программы-редакторы, которые на практике применяются для подготовки TeX-файлов ( WinEdt, Quickpad, WinEdit, UltraEdit, Aditor и т.д.) — их можно найти в Интернете, но пользуясь ими, важно осознавать последствия своих действий (в какой кодировке записывается файл и др.).
UNIX-подобные системы
К их числу относятся популярная ныне система Linux, другая популярная система FreeBSD (обе они являются свободно распространяемыми), система Solaris фирмы Sun Microsystems и многие другие.Установка программ работы с PostScript-файлами
Установка GhostScript 7.05.Начните установку, перейдя в директорию 'miktex.win\gs705' и запустив программу gs705w32.exe. В появившемся окне нажмите кнопку Setup.
В следующем окне "GNU Ghostscript Setup" укажите директорию, куда нужно установить программу Ghostscript (директория, имя которой содержит пробелы, типа "Program Files", не рекомендуется), и место, куда нужно поместить ярлыки (shortcuts) для программы Ghostscript и документации к ней. После этого нажмите кнопку Install.
Установка GSView.
Лицензия, по которой распространяется программа GSView, не позволяет записать ее на компакт-диск, прилагаемый к книге, хотя и разрешает записать ее на компакт-диск, продаваемый (или раздаваемый) отдельно. Поэтому, если на имеющемся у вас диске программы {gsv43w32.exe (в директории 'miktex.win\gsview43') не оказалось, спишите эту программу из Internet'а (она по нынешним меркам небольшая — меньше двух мегабайтов), например, с сервера ftp.mccme.ru, где в директории pubtex лежит эта книга и материалы к ней.
Для установки GSView зайдите в директорию 'miktex.win\gsview43' и запустите программу gsv43w32.exe. Диалог:
Select Language - Выберите язык для программы установки (например, English [английский])
GSView Install - Трижды нажмите кнопку Next. После этого выберите директорию для установки GSView (можно оставить то, что предлагают) и нажмите Next. Наконец, укажите место, куда нужно поместить ярлыки для программы GSView и документации к ней, и нажмите кнопку Finish.
Когда установка будет завершена, нажмите кнопку Exit для выхода из программы установки.
После установки можно опробовать полный цикл обработки файла в LaTeX'е.
Windows-подобные системы
В этом разделе речь пойдет о том, как можно использовать LaTeX в рамках Windows. Прежде всего надо иметь в виду, что появляются все новые и новые системы Microsoft Windows, так что приведенные здесь рекомендации могут не вполне подходить к тому, что установлено на вашем компьютере (мы надеемся, что они более или менее применимы к Windows 95/98/ME и Windows NT/2000/XP).Существуют версии TeX для Windows, называемые fpTeX и MiKTeX. Обе они распространяются бесплатно, и выбор между ними — дело вкуса. Мы опишем установку и использование системы MiKTeX.
Заметим сразу же, что можно попробовать использовать и систему emTeX(о которой мы скажем несколько слов ниже) в режиме DOS-окна или DOS-эмуляции, хотя просмотр файлов на экране может быть менее удобным (а для просмотра PostScript-файлов все равно понадобятся программы Ghostscript и GSView).
В отличие от UNIX, стандартный комплект Windows не включает в себя TeX'а и — надо полагать — не будет его включать в обозримом будущем (а в необозримом будущем не будет самой системы Windows). Поэтому нужно устанавливать не только русские добавления, но и весь TeX (несколько десятков мегабайтов), и надо иметь либо быстрый доступ к Интернет, либо компакт-диск. Для удобства читателей мы поместили комплект MiKTeX 2.0 (не самый новый, но вполне действующий) и русификацию, использованную при подготовке этой книги, в директорию miktex.win на прилагаемом к ней компакт-диске. В этой директории есть файл readme, описывающий установку комплекта MiKTeX 2.0 с русскими добавлениями (а также Windows-версий программы Ghostscript). Прочтите его (скажем, в DOS-окне), даже если обычно вы не читаете инструкций — заодно убедитесь, что вы можете читать текстовые файлы в кодировке cp866 (с которой придется иметь дело).
Установка состоит из четырех этапов.
Мы предполагаем, что в системах типа Windows NT/2000/XP вам доступны права администратора.
Русские добавления к MiKTeX Установка системы MiKTeX с русскими добавлениями
Опишем процесс установки более подробно.
Помимо дистрибутива MiKTeX 2.0 (он находится в директории miktex.win\miktex20'), используются файлы zcmiktex.zip, unzip.exe (программа разархивирования) и test.tex (тестовый файл для проверки работы установленной системы).
[только для Windows NT/2000/XP и т.п.] Выберите "Install a shared MiKTeX environment".
Installation Directory
Укажите директорию 'C:\zcmiktex\texmf' (с очевидными изменениями, если для zcmiktex было выбрано другое место). Предлагаемую по умолчанию директорию не используйте.
Component Selection
Если на диске достаточно места (необходимо примерно 100Mb), рекомендуется выбрать все компоненты. В любом случае необходимы LaTeXe и LaTeXe Packages, AMSLaTeX & AMS Fonts, MetaPost и PSUtils.
Program Folder
Можно оставить то, что предлагается по умолчанию.
Local TEXMF Tree
Выберите "Create local TEXMF tree "и укажите
C:\zcmiktex\localtexmf в качестве имени директории для генерируемых файлов (с очевидными изменениями, если для zcmiktex было выбрано другое место).
Additional TEXMF Directory Trees
Выберите " Incorporate preexisting TEXMF directory trees" и нажмите Next. На следующем экране нажмите Add и укажите директорию 'C:\zcmiktex\zctexmf' (с очевидными изменениями, если для zcmiktex было выбрано другое место).
После этого нажмите Next; начнется процесс установки. В конце будет предложено модифицировать переменную окружения PATH. От этого нужно отказаться.
Закончите установку.
System
Advanced
Environment Variables. В Windows ME можно попробовать использовать программу msconfig.exe.
Реклама: Создание - PR - Софт
- Реклама
- Виды рекламы
- Реклама в СМИ
- Интернет реклама
- Создание рекламы
- Рекламные формы
- Русская реклама
- Рекламный софт
- QuarkXPress и реклама
- Publisher и реклама
- Adobe InDesign и реклама
- Adobe PageMaker
- Public Relations (PR)
- Русский PR
- Видео в DivX для PR
- Софт для звука и музыки для PR
- Создание звука для PR
- История музыки для PR




















































































































































































































и 





























































































































































































































































































































































































































































