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


На странице Бориса Тоботраса рассматривается способ использования в TeX
шрифтов PostScript.

Система генерации шрифтов называется 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. В GNU/Linux его нет. Скорее всего,
наиболее безопасно сказать "mode:=localfont", устройство "localfont" имеется
как в DOG, так и в GNU/Linux, но его истинное значение может быть различно.
Например, в DOG (sbmf) это imagen, в GNU/Linux --- ljfour. Следующий параметр определяет
масштабирование шрифта (в TeX и METAFONT определены стандартные коэффициенты
масштабирования, называемые magstep(0)--magstep(6), образующие геометрическую
прогрессию: 1, 1.2, 1.44 и т.д., естественно, также имеется способ задания
произвольного масштаба.).
Наконец, последнее определяет имя генерируемого шрифта.


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


gftopk cmr10.180

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


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

Настройка 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 подставляется разрешение и файл шрифта ищется в этом
каталоге. (Имя каталогов не обязательно должно быть исключительно
числовым, можно и так: "d:\dview\pxl\dpi$r" для имен вида "dpi180").


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


4. Запуск




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


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


tex

при этом должно появиться сообщение типа:

This is TeX, C Version 3.14t3

и приглашение ко вводу:

**

это говорит о том, что система готова исполнять команды. Например,
команду "пустая операция":

**\relax

все команды обычно начинаются символом '\' (в некоторых форматах это не
так), поэтому в именах файлов, даже в M$-DOG, принято использовать как
разделитель каталогов '/'. Приглашение при этом изменится:

*

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

** file

и TeX попытается найти файл file.tex. Вместо этого можно задать

**\input file.txt

и будет предпринята попытка загрузить file.txt (расширение указано
явно). Отмечу для *nix'истов: можно указывать путь, но не
используя символ '~' (он имеет специальное значение в формате plain TeX,
хотя, вообще говоря, в других форматах его применение в имени файла может
быть вполне допустимым).


Загруженный файл интерпретируется, как если бы он был введен с
клавиатуры, а по его окончании 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



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


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


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

This is the second.

\bye

Командная строка может быть такой:

tex first.tex

или такой:

tex "\batchmode\input first.tex"

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

tex "Hello, \TeX. This is the 1st paragraph.\par This is the 2nd.\bye"



Если все прошло, как надо, мы получим два выходных файла: texput.dvi и
texput.log. В первом содержится отформатированный текст, а во
втором---протокол, в котором фиксируются наши действия и реакция TeX'а.
В случае, когда введенный текст содержит ошибки, они будут выведены сюда
же. Если ваша система не поддерживает русской символьной таблицы, то
в логе для каждого русского символа :-( появится отдельное сообщение,
что шрифт "..." не содержит символа "..." Кроме сообщений об ошибках,
протоколируются самые различные факты из жизни TeX'а: например, имена
вводимых файлов (немаловажно, если документ составной), номера страниц,
а также сообщения о переполненных и недополненных боксах (overfull and
underfull [hv]boxes), где hbox и vbox соответственно "горизонтальный"
и "вертикальный боксы". Эти сообщения нефатальны, их смысл в том, что
не удается отыскать удачное разбиение текста на строки/страницы. В TeX
принято правило, что если не удается сделать это удачно (например, TeX
никогда, если не приказать ему это явно, не пытается растянуть промежутки
между словами слишком сильно), то конфликтное слово не разделяется и
попросту вылазит на правое поле листа. Сообщение об этом записывается в
протокол, а на полях, рядом с местом аварии, ставится черный прямоугольник,
отмечающий его. (Английское название --- "slug"). Имеется возможность
как гибко управлять автоматическими правилами разбиения, так и задавать
свои точки разрыва строки, переноса слова и т.п. Очень существенным для
получения красивого вывода является хорошая таблица переносов. Следует
с сожалением отметить, что использованная автором зачастую не действует,
поэтому при форматировании Кнута, в частности, вы получите множество
переполнений. Они не исправлялись вручную, поскольку возможно, что ваша
таблица окажется более полной. На всякий случай, вот вкратце способ
лечения неправильного переноса: найти в тексте проблемное слово и
прямо в нем поставить в нужном месте точку(и) переноса:


обо\-роноспособ\-ность

(Это возможные точки переноса).


Существует и другой способ, который более предпочтителен. С его помощью
можно как задать переносы в словах, которые не определяются по имеющейся
таблице автоматически, так и задать слова-исключения, если стандартный
метод дает неправильное разбиение. (Самые известные случаи становятся
анекдотами: Дональд Кнут упоминает в [2], что одна из систем автоматического
форматирования текстов умудрилась перенести слово "God", а другая ---
"weeknights", но совсем не там, где нужно :).

Вот как это делается. В начале текста задается словарь исключений:


\hyphenation{frame-work ef-fi-ciency Lo-mo-no-sov}

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


"Родным" языком TeX является, конечно, английский, но автор спроектировал
его с учетом нужд и других языков. Как писал Дональд Кнут в предисловии
к русскому переводу "The TeX book", он всегда помнил о том, что "тех"---важное
русское слово.
Чтобы научить TeX символам кириллицы и правилам переноса, принятым у нас,
существуют различные макропакеты "локализации". В качестве примера
популярных локализаций можно назвать babel и LaTeX2e.
Эти пакеты поддерживают множество различных языков и допускают
настройку на новые.


К сожалению, идеального по всем параметрам выбора сделать не удается.
Правила ввода текста существенно меняются от пакета к пакету.
Например, вместо русских букв в AmSTeX употребляются командные слова,
другие требуют явного переключения между языками и т.п.
Лучшие позволяют вводить русский текст без каких-либо ухищрений.

Вот пример набора текста [Алексей Абрамычев]:


\documentclass[12pt,a4paper]{article}
% "Раскомментируйте" свою кодировку.
% \usepackage[cp1251]{inputenc}
% \usepackage[koi8-r]{inputenc}
\usepackage[russian]{babel}
\begin{document}
Папа у Васи силен в математике, учится папа у Васи весь год.
Навуходоносор.
\end{document}

Этот пример пользователи GNU/Linux могут опробовать в своей системе, выдав
команду:

latex example.tex

(конечно, если файл с текстом примера называется example.tex.)


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

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



Русификация, используемая при оцифровке "Искусства программирования", может
быть имитирована самым простым способом:


  1. Берется обычный формат plain.tex и в нем все стандартные шрифты
    заменяются на другие, аналогичные по начертанию, но с русскими символами.
    Т.е. для шрифта cmr10 нужно подыскать некий романский шрифт размером 10pt,
    в котором будут русские литеры. (Ясно, что лучше всего такой, верхняя
    половина кодовой таблицы которого точно совпадает по начертанию со шрифтом
    cmr10, чтобы английские тексты воспроизводились правильно.)
    Какие именно --- что найдете. Были использованы русские шрифты 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'у, что есть русские буквы с такими кодами
(catcode), и для каждой задается соответствующая строчная (lccode)
либо прописная (uccode) буква. Обязательным является задание
catcode, прочее можно опустить, но при этом командные слова \uppercase
и \lowercase работать не будут, а также возникнут проблемы с переносами.
Набор текста ведется без какого-либо переключения языков, русские буквы
допустимо использовать в именах командных слов.
Эта русификация пользуется кодировкой 866, как в использованных шрифтах,
вы можете сделать, как вам нужно.


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


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


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

Литература



  1. The Hacker's Dictionary, rev. 2.9.11 ed. by Eric Raymond.
  2. Д. Кнут. "Все про TeX."




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


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


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


Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.