Приложение A. Архитектура TeX'а и LaTeX'а
В этом приложении не содержится никаких практических рецептов. Его цель в том, чтобы читатель, прочитавший основную часть книги, получил общее представление о структуре работающего комплекта TeX'а.
Немного истории
Как гласит легенда, Дональд Кнут (Donald E. Knuth) написал программу TeX для себя, чтобы готовить к печати книги серии "Искусство программирования для ЭВМ". Первая версия TeX'а появилась в 1978 году; начиная с 1989 года все изменения в TeX'е сводятся в основном к исправлению ошибок (Кнут сознательно не стремится совершенствовать TeX дальше, чтобы предотвратить распространение несовместимых версий). Тому, кто первым обнаружит очередную ошибку, Кнут выплачивает денежную премию; время от времени ставка удваивается, и тем не менее Кнут отнюдь не разорился1На данный момент сумма составляет \ 2^{15} \,2.56..
Программа TeX распространяется свободно, а ее исходные тексты полностью доступны: помимо книги [2], обязательной для изучения каждому, кто собирается стать TeX ником, в виде книги опубликован и полный текст программы с комментариями. Текст программы написан на изобретенном Кнутом псевдокоде под названием Web; раньше Web транслировали в Pascal (с помощью программы, написанной все тем же Кнутом), в настоящее время используется транслятор из Web'а в язык C.
Макропакеты и форматы
Если получить программу TeX из кнутовского исходного текста (то есть перевести псевдокод в Pascal или C, а затем скомпилировать), то использовать полученную программу (" чистый TeX" — по-английски говорят еще "virgin TeX") для обработки текстов будет еще невозможно: чистый TeX не знает смысла ни спецзнаков2Кроме символа "\"., ни макросов. В него встроены только "примитивные команды".
Стало быть, прежде чем использовать 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'а.
Реализации 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'ом? Первоначальный комплект шрифтов создал сам Дональд Кнут. Для этого он вместе со своими коллегами
- разработал специальный формат, в котором записываются данные о размерах букв tfm;
- разработал специальный формат, в котором записываются данные о форме букв (pk}, есть также pk-файл} промежуточный формат gf); эти данные для каждой буквы указывают матрицу из черных и белых точек, которая должна быть напечатана на месте этой буквы;
- разработал специальный язык METAFONT, на котором удобно описывать буквы, и программу METAFONT (сокращенно mf), которая по такому описанию изготавливает tfm-файлы, а также pk-файлы для разных разрешений (измеряемых обычно числом точек на дюйм);
- написал описание семейства шрифтов Computer Modern на языке METAFONT (все шрифты, использованные до сих пор в этой книге, в своей латинской части повторяют шрифты Computer Modern);
- подготовил к изданию три книги, содержащие подробное описание программы METAFONT, ее комментированный текст, а также тексты шрифтов семейства Computer Modern (в дополнение к двум другим книгам: описанию TeX'а и комментированному тексту программы TeX!).
Вот пример: описание шрифта Computer Modern Roman (прямой светлый, как в основном тексте книги) размера 10 pt на языке METAFONT содержится в файле cmr10.mf (точнее, этот файл устанавливает значения параметров и затем отсылает к другим файлам). Программа 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, более подробно говорится в приложении Б.