Это "нулевая версия" --- относитесь к ней достаточно критично.

Введение

Идея написать этот FAQ появилась у меня после того, как большинство писем, которые я стал получать в связи с работой по оцифровке книги "Искусство программирования для ЭВМ", были вопросами типа "как получить читаемую копию?" Чтобы сэкономить свое и ваше время, в этом файле собраны те рекомендации, которые я бы послал в ответ на такие письма.

Отмечу, что мне придется по ходу дела перескакивать между M$-DOG и Linux, так что имена файлов в основном даны в стиле Linux (кстати говоря, все виденные мною TeX'и понимают только их, поскольку перенесены из Unix, а еще, как правило, '\' имеет для них особое значение и воспользоваться ним в имени файла затруднительно). Кроме того, стоит поубирать кавычки с параметров командных строк --- они, опять-таки, нужны в Linux.

То, что касается Linux, может по-видимому большей частью применяться и вообще в любом *nix, кроме библиотеки поиска файлов kpathsea --- я не уверен, что это повсеместный стандарт.

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

Знатокам TeX по-видимому, стоит прочесть исключительно раздел "Русификация", где описан мой способ. Остальное -- пояснения по установке и настройке из серии "для чайников".

Также попрошу читателей не начинать со мной дискуссию в письмах на тему, что лучше: TeX или, к примеру Word либо PageMaker. Каждый из нас останется при своем мнении, а утерянного времени не вернешь.

ПРЕДУПРЕЖДАЮ: как и что пойдет в Вашей системе, я не знаю!!! Поэтому АВТОР ЭТОГО РУКОВОДСТВА НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВОЗМОЖНЫЕ СБОИ В РАБОТЕ ВАШЕЙ СИСТЕМЫ (ВОЗМОЖНО, СОПРОВОЖДАЮЩИЕСЯ ПОТЕРЕЙ ИНФОРМАЦИИ) ВЫЗВАННЫЕ ИСПОЛЬЗОВАНИЕМ ИЗЛОЖЕННОГО НИЖЕ.

1. Что такое TeX

Система TeX (произносится "тех", от слова "технология") была задумана профессором Стэнфордского университета Дональдом Э. Кнутом в процессе подготовки к изданию 3-го тома "Искусства программирования для ЭВМ". Оказалось, что существовавшие тогда средства подготовки к печати математических текстов совершенно непригодны для выполнения столь сложной работы быстро и качественно. Работа по созданию TeX началась в 1978 году и Кнут планировал закончить ее в течение своего годичного отпуска (sabbatical year, полагается университетским профессорам каждые семь лет), но несколько ошибся в сроках [1] -- окончательный вариант программы появился в 1985. С тех пор TeX сделался стандартом de facto для многих серьезных издательских проектов: все книги самого Кнута набираются в TeX, статьи в издания American Mathematical Society, American Physical Society принимаются только в этом формате, он использовался во множестве проектов онлайн-документации.

Основные преимущества системы таковы:

К сожалению, у системы есть и определенные недостатки. Например, нет стандартного способа вставки рисунков. Впрочем, возможность вставки файлов PostScript распространена достаточно широко. Также не определено стандартом использование цветов. К недостаткам некоторые относят также "невизуальность" процесса, но лично я особого дискомфорта не чувствую.

Краткое описание работы с TeX

Последовательность действий такая:
  1. Установить и заставить TeX работать :-)
  2. Подготовить текстовый файл (по умолчанию расширение .tex), содержащий текст документа, в котором текст содержит команды форматирования.
  3. Пропустить этот файл через TeX, получив версию документа в формате DVI (DeVice Independent). В таком виде он переносим между платформами.
  4. Просмотреть DVI-файл с помощью специальной утилиты просмотра либо вывести его на принтер с помощью программы "драйвер принтера".
  5. Наслаждаться безупречным результатом.

2. Где взять

Пользователи Linux, примите мои поздравления. Помимо того, что вы работаете с исключительно удобной и мощной системой, у вас не будет хлопот с поисками системы TeX. Все версии Linux, которые я видел, начиная со Slackware 2.0.1 и заканчивая Red Hat 5.1, имеют TeX в своем составе. Правда, к примеру, в Slackware 3.30 и RedHat 5.1 различается местоположение каталога TeX по отношению к корневому, так что относитесь к моим рекомендациям критически.

Остальным придется поискать в Сети. Адреса могу посоветовать такие:

http://www.tug.org/ --- TeX Users' Group

http://tug2.cs.umb.edu/ctan --- CTAN -- Comprehensive TeX Archive Network

этот сайт что-то вроде интерфейса к распределенному ftp-архиву, в котором лежит все, связанное с этой системой. Если раньше не приходилось иметь дела с TeX, очень рекомендую книгу: D.E. Knuth "The TeX book", или, в русском переводе, "Все про TeX", (Протвино, АО RDTeX, 1993, ISBN 5-900614-01-8).

Онлайновый вариант английского издания "The TeX Book" вроде бы доступен в CTAN по имени

    texbook.tex
полностью:
    systems/knuth/tex/texbook.tex
(там есть что-то вроде своей поисковой системы, попробуйте).

http://www-cs-faculty.stanford.edu/~knuth/index.html --- автор TeX, профессор Дональд Кнут.

есть еще вроде группы новостей, точно не знаю.

Искать надо следующее:

Вместо программ работы с dvi-файлами можно искать транслятор dvips, который очень аккуратно перегоняет все в PostScript. Чего делать дальше с PS --- это уже решайте сами.

Помимо этого, существуют конверторы в другие популярные форматы. Например, я слышал о таком, как latex2html. Никогда этих конверторов не пробовал, но видел результаты их деятельности --- ужасно, но читать можно. Еще подозреваю, что для их работы требуется все же установить TeX --- если это так, то зачем они вообще нужны?

Пользователям Micro$oft Widows :-) можно использовать версию TeX для M$-DOG. Там есть как минимум две версии, одна из которых работает под расширителем DOS4GW и называется texas (вторая --- sbtex, пользуется только стандартной DOS-памятью, но ее можно полноценнее настроить на русский язык). Советую брать texas (или другие, если есть, которые используют расширенную память), так как русификация обычно требует много памяти. К сожалению, я свой TeX нашел на CD, так что онлайновых координат DOS-версий у меня просто нет.

Лучшая смотрелка dvi-файлов, которую я видел, называется DVIWIN v.2.7, автор Hippocrates Sendoukas, версия от June 15, 1993. Она же и печатает на любом принтере через виндовый драйвер.

Всем остальным, увы, ничего более конкретного не посоветую.

3. Установка

В основном, здесь приводятся пояснения по DOG-версии, поскольку в Linux все уже вообще-то говоря сделано автоматически, хотя и тем, кто сидит в Linux, стоит прочитать этот раздел, так как в нем будет разъясняться назначение форматов файлов и пр.

Виденные мною версии TeX для M$-DOG распространялись в архиве с уже заданной структурой каталогов, так что их установка сводится к распаковке архива. Например, получается такая структура подкаталогов:

\TeX+
    |
    +FONTTFMS
    |
    +FORMATS.BIG
    |
    +INPUTS
Для программы sbtex нужно запустить sb38set.exe, которому требуется указать, на каком логическом диске установлена программа и в каком каталоге искать некоторые файлы. Эта информация прописывается прямо в исполняемый файл (туповато, но уж так сделали).

Подкаталоги следующие:

FONTTFMS --- хранит описания шрифтов *.tfm (TeX Font Metrics). Эти файлы имеют имена вида cmr10.tfm, что значит шрифт начертания "Computer Modern Roman", размером 10 pt. Для каждого размера шрифта в TeX, вообще говоря, свой .tfm: cmr5.tfm, cmr7.tfm и т.п. В отличие от виндовых True Type шрифты TeX масштабировать в несколько раз не принято (хотя и возможно чисто технически). Это сделано потому, что для одного и того же начертания в размерах 5 pt и 10 pt полагается для улучшения читаемости изменять пропорции элементов букв, т.е. это вообще говоря, разные шрифты (небольшие коэффициенты масштабирования, тем не менее, применяются широко, скажем 1.2 и 1.44). Кроме того, графическое изображение символов в .tfm-файлах не сохраняется, для этого служат файлы GF и PK (см. ниже).

FORMATS.BIG ("BIG" он потому, что "big TeX for i386", т.е. с расширенной памятью) --- хранит "форматные" файлы. Что такое форматный файл? Дело в том, что в TeX принято создавать "стили" документов --- наборы макроопределений, которые могут иметь большой объем. Например, пакет PiCTeX, позволяющий рисовать простенькие картинки, весит аж 120K текста. Так вот, чтобы при обработке очередного документа не приходилось каждый раз транслировать макросы во внутреннее представление, делается "форматный файл". По сути, это просто дамп памяти TeX после того, как были проглочены определенные файлы. (И поэтому ОН НЕ ПЕРЕНОСИМ.)

ВАЖНО: при генерации форматного файла в него записывается информация о некоторых используемых шрифтах (так называемые preloaded fonts), Поэтому при повторной генерации шрифтов нужно обновить и форматы, использующие эти шрифты. (Если изменился только тип выводного устройства, например, со 180dpi на 600dpi (см. ниже), но не содержимое шрифта, то этого делать не надо).

При запуске TeX ему можно сказать, какой формат загрузить:

tex '&plain' ...

INPUTS -- в этом каталоге хранятся стандартные файлы .tex, такие, как, к примеру, стили (самый первый из них --- plain.tex).

Имена каталогов не фиксированы и могут задаваться в переменных окружения: ниже просто приводится кусок .bat-файла, который доводит конфигурацию "до ума" в момент запуска программы:

set TEXFORMATS=d:\tex\formats.big
set TEXPOOL=d:\tex\formats.big
set TEXFONTS=d:\tex\fonttfms
set TEXINPUTS=d:\tex\inputs
кроме того, позаботьтесь о том, чтобы расширитель dos4gw был доступен через PATH. Переменная TEXPOOL указывает каталог, в котором расположен файл tex.pool (tex.poo в M$-DOG). В этом файле находятся символьные строки сообщений об ошибках.

В Linux все гораздо проще и сложнее. С одной стороны, установка происходит автоматически, а структура каталогов стандартизована (стандарт TDS, TeX Directory Structure, детали ищите в CTAN), но с другой --- когда что-то идет не так, гораздо сложнее найти причину. Я не могу в настоящий момент похвастать достаточно глубокими знаниями тонкостей конфигурирования TeX под Linux, поэтому вам придется почитать документацию (как я успел заметить, сделана она там очень хорошо).

Генерация формата plain

По умолчанию TeX при старте должен загрузить какой-нибудь форматный файл. Если он его не находит, выдается сообщение об ошибке
I can't find the default format file!
Это значит, что TeX не может отыскать файл формата (он зовется plain.fmt в двух из трех версий, что я видел). Поищите его. Например, под Linux он лежит здесь:
/usr/lib/texmf/texmf/web2c/plain.fmt
Вообще-то структура каталогов TeX стандартизована, но именно место для форматных файлов определено как системно-зависимое. Посмотрите manpage--- там оно может указываться, а еще у TeX'а должны быть переменные окружения и если формат не находится, нужно задать путь к нему в TEXFORMATS. Кстати, в этой же manpage сказано, что теперь по умолчанию загружается не plain.fmt, а формат с таким именем, по которому программа была вызвана (т.е. argv[0]), так что искать надо уже не plain.fmt, а к примеру, tex.fmt. У меня система постарше, так что проверить, так ли это, не могу.

Если же форматов вообще нет, можно попробовать его изготовить:

если есть

/TeX/INPUTS/plain.tex (/usr/lib/texmf/texmf/tex/plain/base/plain.tex)
то это делается так (sbtex):
initex '\input plain.tex \dump \end'

в другой версии нет initex (texas):

tex -i '\input plain.tex \dump \end'
после этого появится два файла: plain.fmt и plain.log. Если в логе нет ошибок, а только сообщения о загруженных шрифтах и т.д., то формат готов. У меня он создается в текущем каталоге и я его руками перекладываю по назначению. Может случиться, что не будет найден файл tex.pool --- есть переменная TEXPOOL.

В дальнейшем можно явно указать, какой формат загрузить при вызове TeX:

tex '&plain' ...

Настройка METAFONT и генерация шрифтов

Как уже было упомянуто, шрифты TeX хранят размеры литер и их начертания порознь. Файлы начертаний символов шрифта имеют формат GF и PK, т.е. "графические образы литер" и "упакованная графика". По умолчанию, GF-файлы имеют имена, совпадающие с именем tfm-файла, и расширение, указывающее разрешающую способность устройства, для которого сгенерирован шрифт. Да, именно так! Шрифты TeX генерируются для конкретного разрешения на конкретном устройстве. Выглядит это, конечно, странновато, но подумайте, что различные устройства вывода имеют свои особенности, к примеру, у одних точка (пиксел) квадратная, у других -- нет (да еще и aspect ratio различается) и т.п. Все эти особенности и учитываются при генерации шрифта. Честно говоря, на мой взгляд, это единственный "недостаток" TeX, который досаждает при активной работе с различными размерами шрифтов. Но! Лично мне пришлось столкнуться с проблемой масштабирования шрифтов один раз в течение двух лет постоянной работы в TeX, а в Linux генерация нужного шрифта уже делается автоматически.

Система генерации шрифтов называется METAFONT. В M$-DOG версии (из дистрибутива sbtex) при установке получается такая структура каталогов:

MF-+
   |
   +-MFBASES
   |
   +-MFINPUTS
Назначение этих каталогов сходно с аналогами TeX. Настройка системы сводится к запуску программы sbmfset.exe, установки переменных окружения не требуется (список переменных см. прилагаемую документацию).

У программы mf (основная утилита системы) также существуют загружаемые дампы памяти, называемые "базами" (например, у TeX --- plain.fmt, у METAFONT --- plain.base), среди которых особо выделим cm.base --- основу генерации шрифтов Computer Modern.

Создание базы делается так:

inimf plain input local dump
Команда "input local" по-видимому, специфична именно для sbmf. (Не то, чтобы ее нельзя было реализовать в другой системе, просто там нет по умолчанию исходника local.mf.)

Полученный "plain.bas" ("plain.base") переносится в MFBASES, лог можно удалить.

Сгенерировать шрифт, к примеру, cmr10, можно следующей командой:

mf '&cm' 'mode:=cdvi; mag:=magstep(0);input cmr10'
Расшифруем написанное. Первый параметр имеет то же назначение, что и для TeX --- имя базы. Далее идет "имя устройства". Как уже было сказано, METAFONT учитывает в своей работе особенности конкретных физических устройств, для чего в файле modes.mf хранится множество их описаний. Устройство cdvi по-видимому, нестандартно, оно определяется дополнительно в файле local.mf. В Linux его нет. Скорее всего, наиболее безопасно сказать "mode:=localfont", устройство "localfont" имеется как в DOG, так и в Linux, но его истинное значение может быть различно. Например, в DOG (sbtex) это imagen, в Linux --- ljfour. Следующий параметр определяет масштабирование шрифта (его я разъяснять не буду, пока не надо). Наконец, последнее определяет имя генерируемого шрифта.

Если программа отработает без ошибок, то она выведет на экран поочередно все символы шрифта (если найдет поддержку графики), а в log-файл --- текстовые сообщения об этом же. Для шрифта создается два файла: метрическая информация о шрифте (.tfm) и графический образ символов --- GF-файл, который имеет имя вида: cmr10.180, если ваше устройство вывода поддерживает 180 точек на дюйм. С помощью стандартной программы GFtoPK можно упаковать его:

gftopk cmr10.180
и получить из него cmr10.180pk в Linux либо cmr10.pk в M$-DOG.

Настройка DVI viewer'а

DVIWIN также устанавливается распаковкой архива в каталог, допустим, DVIEW. Далее нужно ее настроить. Основной пункт настройки --- указание пути к файлам шрифтов. В M$-DOG принято распределять шрифты по каталогам. Например, у меня они лежат в каталоге "DVIEW\PXL\". Значит, шрифты под разрешение 180 нужно собрать в "DVIEW\PXL\180\", и т.д. Настройка DVIWIN сводится к тому, что нужно определить в "Options/Custom Resolutions" разрешение вашего принтера, если его нет среди стандартных, и монитора (я советую не вычислять его точно, поскольку получите очень мелкий шрифт, а взять "с запасом", так, я использую 132dpi при истинном разрешении монитора 96dpi). После этого нужно задать "Options/Font Directory" (в моем случае "d:\dview\pxl\$r"). Эта строка при поиске шрифта используется так: вместо $r подставляется разрешение и файл шрифта ищется в этом каталоге.

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

4. Запуск

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

Попробуйте просто запустить TeX:

tex
при этом должно появиться сообщение типа:
This is TeX, C Version 3.14t3
и приглашение ко вводу:
**
это говорит о том, что система готова исполнять команды. Например, команду "пустая операция":
**\relax
все команды обычно начинаются символом '\' (в некоторых форматах это не так). Приглашение при этом изменится:
*
Когда приглашение имеет вид '**', это значит, что строка, начинающаяся '\' будет интерпретирована как команда, в противном случае считается, что введено имя файла, из которого нужно считать текст документа. То есть, можно ввести
** file
и TeX попытается найти файл file.tex. Вместо этого можно задать
**\input file.txt
и будет предпринята попытка загрузить file.txt (расширение указано явно). Отмечу для Linux'истов: в имени файла можно указывать путь, но не используя символ '~' (долго пояснять, почему).

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

This is TeX, C Version 3.14t3
**\relax

*Hello, \TeX.

*This is the first paragraph.

*
(Please type a command or say `\end')
*This is the second.

*
(Please type a command or say `\end')
*\bye
Если все прошло, как надо, мы получим два выходных файла: texput.dvi и texput.log. В первом содержится отформатированный текст, а во втором---протокол, в котором фиксируются наши действия и реакция TeX'а. В случае, когда введенный текст содержит ошибки, они будут выведены сюда же. Если ваша система не поддерживает русской символьной таблицы, то в логе для каждого русского символа :-( появится отдельное сообщение, что шрифт ... не содержит символа ...

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

Теперь то же самое со вводом из файла:

first.tex:
Hello, \TeX.
This is the first paragraph.

This is the second.

\bye
Командная строка может быть такой:
tex "\batchmode\input first.tex"
Команда "\batchmode" приводит к тому, что TeX не будет останавливаться на каждой встреченной ошибке, ожидая ваших команд по ее исправлению. Вообще говоря, содержимое командной строки просто интерпретируется TeX'ом как будто оно было введено с клавиатуры, и там могло бы быть все, что угодно, например:
tex first.tex

5. Русификация

Моя русификация может быть имитирована самым простым способом:

  1. Берется обычный формат plain.tex и в нем все стандартные шрифты заменяются на другие, аналогичные по начертанию, но с русскими символами. Какие именно --- что найдете. Я воспользовался русскими шрифтами N.Glonti, которые нашел в поставке Slackware 2.0.1. Модифицированный формат сохраняется под другим именем, скажем, rplain.tex.
  2. Генерируется форматный файл:
    tex -i "rplain \input rus \input ruhyph \dump \end"
    
  3. Далее он используется:
    tex '&rplain' ...
    

Первый из дополнительных файлов, rus.tex, содержит нечто вроде

\catcode`\^^80=11 \lccode`\^^80="A0 % А
\catcode`\^^81=11 \lccode`\^^81="A1 % Б
...
\catcode`\^^9f=11 \lccode`\^^9f="EF % Я
\catcode`\^^a0=11 \lccode`\^^a0="A0 \uccode`\^^a0="80 % а
\catcode`\^^a1=11 \lccode`\^^a1="A1 \uccode`\^^a1="81 % б
...
\catcode`\^^ef=11 \lccode`\^^ef="EF \uccode`\^^ef="9F % я
т.е., просто указывает TeX'у, что есть русские буквы с такими кодами (моя русификация пользуется кодировкой 866, как в использованных шрифтах, вы можете сделать, как вам нужно).

Второй файл, ruhyph.tex, был взят из поставки Русский Linux "Красная Шапочка", 5.0. В нем заданы таблицы переноса для русских слов. К сожалению, многие слова не переносятся. Для облегчения поисков приведу размер и дату файла: 32345 байт, датирован 16-м ноября 1997.

Такой метод русификации сравнительно прост как в исполнении, так и в пользовании. Единственный его недостаток, который я пока что знаю --- его не получится "просто так" приспособить к другим языкам, пользующимся кириллицей, например, украинскому: придется вводить механизм явного переключения языков, т.е. имитировать пакеты типа babel. Но такой цели не ставилось --- требовался простой способ набирать смешанные русско-английские тексты. IMHO, для этого он годится.

Литература

  1. The Hacker's Dictionary, rev. 2.9.11 ed. by Eric Raymond.

Любая конструктивная критика будет с благодарностью рассмотрена.

© 1999 Сергей Короп, <svk@lib.ru>


Last-modified: Mon, 12-Jul-99 14:52:51 GMT