Здравствуй, Хабр!
Русские шрифты в Groff, пошаговая инструкция по установке. Groff - небольшой и очень-очень винтажный программный пакет, система набора текста, в каком-то смысле прадедушка TeX, LaTeX. Но если TeX создан Дональдом Кнутом, то Брайан Керниган приложил немало усилий для развития концепций Troff. Итак, две легенды и две дороги.
Конечно, сегодня программы troff (GNU версия называется по традиции groff) применяют в основном для форматирования man-страниц, но возможности процессора намного шире.
...Осенью прошлого года мне пришлось форматировать текстовой файл. Правда, банальная задача? Но дьявол живет в деталях: у меня на руках было 60000 страниц текста из базы данных, где смешались русские, английские и немецкие слова, сцементированные и притертые, как камни пирамиды Хеопса. Мой «текстовой процессор» (OO) намертво завис. Я растерялся, расстроился, попытался найти простенькое решение для командной строки.
В самом деле, как работали во времена Ноя и мониторов EGA с текстом? Emacs, vim, jed? Это все насыщенные функциями, как мед сахаром, многорежимные редакторы. Но насущная задача казалась очевидной: создать текстовой файл со строкой в 70 знаков, с возможностью центрирования и необязательного переноса слов. Помнится, в «эпоху DOS» был популярный «процессор» Лексикон, да? Что-то такое я захотел установить на свой компьютер. Только чтобы буквы в utf-8 не резались на биты.
Впрочем, чудо случилось: во время поисков я нашел русскоязычную документацию программы nroff, написанную… как вы думаете, кто переводил мануалы? Ну да, производственно-внедренческий кооператив "ИНТЕРФЕЙС" озаботился русскоязычной справкой аж в конце 80 годов, еще во времена СССР.
Мои поиски закончились и я за несколько минут подготовил файл с форматированием.
Следующая команда прекрасно справилась с текстом utf-8, конечно, без переноса слов.
$ groff -Dutf8 -Tutf8 utf-8.txt > russian.txt
Получилось очень красиво. Мне тут же захотелось продолжить знакомство с легендарной программой и я решил перевести на русский язык документацию Groff, чтобы поглубже изучить, понять всю прелесть старой программы. В процессе перевода у меня также возникло необъяснимое желание создать документ PostScript на русском языке со своими шрифтами. И вот здесь начались сложности: процесс установки «своих» шрифтов в Groff не такой уж простой.(Проблема в том, что некоторые программы не ставятся «по умолчанию» в дистрибутив Debian, которым я пользуюсь, поэтому их придется устанавливать самому.)
Ниже я попытаюсь максимально подробно описать компиляцию шрифтов ttf для работы с программой Groff.
Шрифты в Groff «настраиваются» несколько необычно, хотя существует небольшой и удобный скрипт install-font.sh, созданный Питером Шаффтером, автором макроса mom Groff; скрипт я быстро нашел в Сети и переписал «под себя». В частности, мне не понравилось, что исходный скрипт пытается положить шрифты в какую-то далекую директорию, хотя намного проще, чтобы скрипт всего-навсего компилировал файлы «по месту жительства».
Также я перевел сообщение Т. Курта Бонда, но применительно к русскому языку и с необходимыми правками. Ниже инструкция Бонда с моими замечаниями.
А в этом архиве лежат все необходимые утилиты, даже программа afmtodit, она написана на Perl. Исходный скрипт Питера лежит по адресу.
В настоящее время install-font.sh не входит в пакет groff, как пишет Бонд, поэтому могут быть небольшие трудности, если возникает необходимость установить шрифты в форматах OpenType или TrueType.
И для удобной работы потребуется программа Fontforge — бесплатный редактор шрифтов с открытым исходным кодом. Этот редактор может выполнять сценарии преобразований между форматами шрифтов в командной строке.
Примечание. Можно также создать шрифтовые метрики AFM, например, с помощью входящей в пакет ghostscript программы, или программы ttf2afm из пакета tetex.
Скрипт install-font.sh использует Fontforge для преобразований между шрифтами OpenType и TrueType в PostScript Type42 (.t42) и Type1 (.pfa).
Затем с помощью утилиты afmtodit (по умолчанию не поставляется с пакетом Groff, но доступна в исходниках) создаются необходимые для Groff файлы.
Установите Fontforge.
$ sudo apt install fontforge
Скачайте afmtodit (или архив).
Создайте директорию, например, FONT. Положите исполняемые файлы install-font.sh и afmtodit, необходимые шрифты в эту директорию.
Для автоматизации я написал небольшой скрипт, который в автоматическом режиме компилирует шрифты. Скрипт также доступен в архиве как auto-convert.sh
#!/bin/bash
EXT="ttf" # (расширение)
# EXT="TTF"
# В директории FONT должны размещаться файлы textmap и text.enc
mkdir ./install-font
# Необходимая для работы afmtodit директория
mkdir ./install-font/DESC
# Программа на Perl, можно отключить проверку DESC
mkdir ./site-font
DEST=`pwd`
cp tex* ./install-font
# Начинаем цикл
for FILE in *.$EXT; do
# "Меняем" имя файла (расширение)
input=`echo $(basename "$FILE" .$EXT).afm`
output=`echo $(basename "$FILE" .$EXT)`
# Конвертируем
echo "conversion $FILE >> $input"
# Опция +R определяет шрифт Regular, см. ниже комментарий
sudo ./install-font.sh -n -d -P "$DEST" -F $output -f +R $FILE
# Смотрим файлы в директории, это всего лишь удобная фича
input=`ls $DEST/site-font/devps/$output*`
echo "$input"
done
exit 0
Как видите, ничего сложного — создается директория install-font с обязательной поддиректорией DESC и директория site-font. В последнем каталоге будут «появляться» шрифты, необходимые для работы с Groff. Обратите внимание! В директорию install-font следует положить два файла: textmap и text.enc (они есть в архиве). Эти файлы нужны для работы программы afmtodit и они входят в оригинальный пакет Groff.
Также скрипт install-font.sh потребует определенных прав для исполнения. Наверное, от этого можно избавиться, отключив в скрипте две-три команды, но я не стал изменять скрипт.
После запуска скрипта auto-convert.sh в директории site-font появятся две субдиректории - devps и devpdf. Последняя директория пока что не нужна, ведь мы создаем шрифты для работы с устройством PS (PostScript).
Groff называет директории шрифтов как «dev» (устройство) и «формат», поэтому все необходимые файлы перемещаются в site-font/devps, причем каталогу назначаются привилегии и права. Также из-за какой-то путаницы afmtodit в созданных «шрифтах» будет ошибка — неправильная строка «spacewidht 0», ее можно закоментировать «# spacewidht 0». Или опять-таки переписать старенькую программу afmtodit.
Например, вы собираетесь использовать шрифт Russian.ttf, программа Groff предполагает, что будут доступны варианты Regular, Italic, Bold и Bold Italic (R, I, B и BI, если говорить в терминологии Groff).
Значит, вам потребуются соответствующие шрифты: Russian-Regular.ttf, Russian-Italic.ttf, Russian-Bold.ttf и Russian-BoldItalic.ttf. Обычно на сайтах со шрифтами предлагаются подборки семейств, так что вы всегда сможете скачать необходимые шрифты.
Шрифты следует скопировать в каталог FONT (который мы создали ранее), разумеется, в этом же каталоге должны лежать все исполняемые файлы.
Скрипт auto-convert.sh запускает для каждого ttf шрифта следующую команду:
$ sudo install-font.sh -n -P " $DEST " -d -F Font -f +R Font-Regular.ttf
Параметр -f принимает аргумент, указывающий используемый стиль шрифта: +R, +I, +B или +BI.
В данном случае установлена опция +R, создается шрифт Regular.
Если вы хотите создать шрифты Italic, Bold и Bold Italic, опция приобретает иной вид: +I, +B и +BI соответственно.
Параметр -F принимает аргумент, указывающий используемое имя семейства шрифтов. Это имя для запроса .fam или -f groff, чтобы сообщить процессору, какое семейство шрифтов будет использоваться.
Для примера, такая команда создаст RussianI (курсив) шрифт
$ sudo install-font.sh -n -P " $DEST " -d -F Font -f +I Russian-Italic.ttf
Очевидно, можно «встроить» алгоритм, автоматически «называющий» шрифт так, как необходимо процессору Groff.
Если компиляция была успешной, в директории ./site-font/devps/ будут созданы шрифты, их следует скопировать в /usr/share/groff/site-font/devps/ (для дистрибутива Debian).
Теперь можно написать файл test.txt для тестирования нового шрифта.
.sp 2
.ps 16
.ft RussianR
.ti +1
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код
.br
настолько умно, насколько можете, то вы по определению недостаточно
.br
сообразительны, чтобы его отлаживать.
.br
Управление сложностью является сущностью компьютерного программирования.
.sp 1
.ps 12
.ce
.ft RussiandB
Брайан Керниган, автор Troff
Затем создадим файл PostScript
$ groff -P-pa4 -P-l -Dutf8 -Tps test.txt > text.ps
Вот и все, и надеюсь, несмотря на почтенный возраст программы Groff, она еще способна вызвать у любителей ручной верстки какие-то чувства =)