Может возникнуть вопрос: а надо ли подробно разбирать вопрос русификации, не лучше ли просто сразу установить русифицированный дистрибутив? Тем более, что в последних версиях дистрибутивов Red Hat Cyrillic Edition, ASPLinux и AltLinux русификация выполнена на вполне приемлемом уровне. Однако, даже в случае установки русифицированного дистрибутива вы имеете шанс столкнуться с проблемой русификации на последующих этапах. Может получиться так, что новая версия нерусифицированного дистрибутива появится раньше, чем соответствующий русифицированный вариант, и вы захотите его установить. Не всегда хочется дожидаться пока выйдет русская версия. Русификация может нарушиться при обновлении отдельных программных пакетов. У меня, например, что-то случилось с русификацией после установки XFree86 версии 4.0.1. Таким образом, задача русификации может встать перед любым пользователем ОС Linux.
Когда я начинал работать с ОС Linux, самым лучшим материалом по русификации был "The Linux Cyrillic HOWTO" Александра Беликова (Версия 4.2 b2, Декабрь 11, 1998) в переводе Е.М. Балдина. Кроме этого HOWTO были доступны только материалы со странички Леонида Кантера. Однако оба этих источника уже в то время существенно устарели, так как в Red Hat версии 6 изменились даже команды выбора шрифта. Переводчик "The Linux Cyrillic HOWTO" Е. Балдин в настоящее время создает свой вариант HOWTO по кириллизации [П13.1]. Думаю, что в ближайшее время (когда автор закончит работу над ним) он станет исчерпывающим источником сведений по этому вопросу. Очень полезен также RU.LINUX.FAQ [П13.16]. Настоящая глава во многом следует этим двум основным источникам..
Начать надо с двух замечаний. Во-первых, поскольку способы вывода информации на экран в графическом и текстовом режимах принципиально различны, придется отдельно рассмотреть вопрос о русификации текстового и графического режима. Во-вторых, в системе Linux существуют два конкурирующих пакета управления консольными шрифтами и клавиатурой:
• kbd (ftp://ftp.win.tue.nl/pub/linux/utils/kbd/ или )
• и consoletools (http://lcr.sourceforge.net).
В разных дистрибутивах применяются или один, или другой. Например, в Red Hat 4.х и 5.x для русификации консоли применялся пакет kbd. В Red Hat 6.x применяется уже другой пакет - consoletools. Приводимое ниже описание ориентировано, в основном, на пакет consoletools.
11.1. Предварительные сведения
В разд. 9.3. мы уже рассмотрели вопрос о кодировке символов и о работе клавиатуры, а также научились задавать (изменять) раскладку клавиатуры, т. е. вопрос о вводе информации в компьютер. Теперь надо рассмотреть вторую сторону этого вопроса - вопрос о выводе информации для восприятия человеком.
11.1.1 Вывод символов на экран
Обычно (если не считать управляющих комбинаций) код нажатой клавиши либо записывается в файл, либо соответствующий символ отображается на экране. В файл, разумеется, записываются последовательности байтов, а не символы как таковые, но и они в конечном итоге предназначены для прочтения человеком, а человек воспринимает только изображения печатных знаков на экране или в распечатке.
Текстовый режим
Работа экранного драйвера текстового режима основана на использовании 16 битовой кодировки символов UNICODE (UCS2). Изображение каждого символа, соответствующего любому двухбайтовому коду кодировки UNICODE, представляется матрицей из нолей и единиц размером 8 столбцов на H строк (обычно H принимает значения 8, 14 или 16). Единица в этой матрице соответствует светящейся точке на экране, а ноль - затемненной точке. Каждая строка этой матрицы кодируется одним байтом. Совокупность таких матриц (точнее, их байтовых представлений) для всех символов UNICODE образует таблицу экранного шрифта (Screen Font Map - SFM). Файл, в котором хранится такая таблица, может содержать шрифт одного размера по высоте (H) или шрифты нескольких размеров.
Сам экранный драйвер может работать в одном из двух режимов: режиме UTF или байтовом режиме. Выбор режима определяется приложением, которое обращается к этому драйверу для вывода символов на экран.
В режиме UTF последовательности байтов, получаемые от приложения для отображения на экране консоли, преобразуются по алгоритму UTF в коды UNICODE. После такого преобразования драйвер экрана обращается к загруженной в память таблице экранного шрифта (SFM) за соответствующим данному коду изображением символа.
В байтовом режиме драйвер экрана использует дополнительную таблицу - таблицу перекодировки символов (Application Charset Map или кратко ACM) для преобразования получаемых от приложения последовательностей байтов в коды UNICODE. Эта таблица зависит от кодировки символов, применяемой приложением. В дальнейшем драйвер экрана, как и в режиме UTF, обращается к таблице экранного шрифта (SFM) для того, чтобы извлечь из нее изображение нужного символа.
Примечание:
Для того, чтобы определить, работает ли виртуальная консоль в режиме UTF или в байтовом режиме, можно воспользоваться скриптом vt-is-UTF8, а для переключения режимов работы виртуальной консоли служат два скрипта: unicode_start и unicode_stop.
В ядре Linux отведено место для хранения четырех таблиц перекодировки ACM. Первые три таблицы определяют 437 кодовую страницу IBM (cp437), таблицу для набора символов терминала DEC VT100 (vt100) и таблицу для набора символов ISO latin1 (iso01). Эти три таблицы встроены в ядро и никогда не меняются. В качестве четвертой таблицы перекодировки в ядре может быть записана таблица перекодировки, выбранная пользователем.
Консольный драйвер Linux позволяет для каждой виртуальной консоли определить (с помощью команды charset) две ссылки (в документации их называют "сокетами") на таблицы перекодировки ACM. Эти две ссылки обозначаются как G0 и G1, причем для каждого виртуального терминала значения, присвоенные этим ссылкам, выбираются независимо. Однако, хотя ссылки G0 и G1 задаются независимо для каждого виртуального терминала, выбор таблицы перекодировки, определяемой каждой ссылкой, можно производить только из четырех таблиц, записанных в ядре. Поэтому реально все терминалы используют одну и ту же пользовательскую таблицу ACM. То есть, вы можете задать для tty1 использование G0=cp437 и G1=vt10 0, а для tty2 использование G0=iso01 и G1=user1 (определяемая пользователем кодировка), но не можете сделать так, что в одно и то же время tty1 использует таблицу user1, а tty2 использует таблицу user2.
Команда consolechars используется для изменения ACM, так же как и для задания шрифта и ассоциированной с ним таблицы SFM. С помощью команды consolechars можно считать консольный шрифт (таблицу экранного шрифта SFM) 8xH из файла и загрузить его в память, а также сохранить в файле шрифт, загруженный в память. Эта же команда служит для загрузки в ядро таблицы перекодировки, а также позволяет переопределить ссылки G0 и G1.
В качестве одной из опций команды consolechars при загрузке экранного шрифта из файла может быть задан размер шрифта по вертикали H. Значение H должно считываться из файла шрифта. Однако файлы некоторых форматов (в частности, файлы, содержащие только битовые образы символов) не содержат прямого указания на этот размер. В таком случае значение опции -H вычисляется исходя из размера файла (обычно -H 8, -H 14 или -H 16). Поскольку в настоящее время Linux не позволяет программно переключать режим работы дисплея, то выбор подходящего значения H в зависимости от установленного разрешения экрана полностью возлагается на пользователя.
В заключение отметим еще, что файлы с экранными шрифтами по умолчанию располагаются в каталоге /usr/lib/kbd/consolefonts/, а каталог /usr/lib/kbd/consoletrans/ используется для хранения как таблиц ACM, так и SFM.
Графический режим
В графическом режиме нет разбиения экрана на знакоместа, изображение любого символа можно вывести практически в любую позицию экрана. Изображения символов для конкретного набора символов составляют шрифт. Шрифты хранятся в файлах, которые принято называть файлами шрифтов. Вывод символов того или иного шрифта на экран организуется с помощью специального сервера шрифтов. Поэтому проблема русификации графического режима сводится к выбору русифицированного шрифта. Вопрос о том, что такое шрифты и как работает сервер шрифтов, подробно рассмотрен ниже в разд. 11.4.
11.1.2. Локализация
Только организовать ввод и вывод символов национального языка еще недостаточно для того, чтобы можно было считать решенным проблему применения компьютеров в той или иной стране. В разных странах в силу сложившихся традиций имеются различия не только в используемом алфавите, но и в способах представления некоторых конкретных данных. Это касается, например, символов, используемых для обозначения валюты, форматов представления даты и времени, обычаев записи (чтения) текстов слева направо или справа налево и т.д. При создании ПО, рассчитанного на применение в разных странах, приходится учитывать такие местные особенности. Кроме того, большие трудности вызывают такие вопросы как проверка орфографии на конкретном языке, автоматическая расстановка переносов при вводе текста или перевод на данный язык всех меню и служебных сообщений в программном обеспечении.
Способ проектирования ПО (включая ОС), при котором возможность многоязыковой поддержки закладывается с самого начала, принято называть интернационализацией (кстати, загадочное i18n - это просто сокращение для слова internationalization: i - потом еще 18 букв - n, аналогично, l10n = localization). При интернационализации программного обеспечения КОД не зависит от национальных особенностей. Все языково-зависимые данные сосредотачиваются в особых "объектах локализации", которые разбиты на функциональные группы: категории локализации. При таком подходе локализация - это процесс настройки программной системы на особенности конкретной страны.
В стандарте POSIX (Portable Operating System) были определены средства локализации, которые состоят из следующих компонент:
• набор библиотечных (libc) вызовов (locale API): setlocale(), isalpha(), toupper(), и т.д;
• исходные тексты описания средств локализации, в том числе файл(ы) описания кодировки (Character Set Definition File);
• наборы данных для локализации, которые в Linux размещаются в каталогах /usr/share/i18n/* и /usr/share/locale/*;
• утилита для получения информации о средствах локализации: locale;
• утилита для изготовления (компиляции) объектов локализации: localedef;
• переменные окружения, для управления средствами локализации: LANG, LC_ALL, LC_CTYPE, LC_TIME, LC_COLLATE, LC_NUMERIC и LC_MONETARY (они соответствуют категориям локализации).
В табл.11.1 кратко перечислено, на что именно влияет та или иная из этих переменных (или категорий локализации).
Таблица 11.1. Категории локализации.
Категория | Описание |
LC_CTYPE | Определяет правила классификации и преобразования одиночных символов . Позволяет правильно определять вид символа: цифра, буква, значок, заглавная буква или прописная и т.д. Другими словами, включает правильную работу системных вызовов isalnum(), isalpha(), iscntrl(), isdigit(),… и т.п. для местного алфавита. Вдобавок, включает правильный перевод строчных - прописных букв: toupper() и tolower() |
LC_COLLATE | Определяет правила сравнения и преобразования строк . Позволяет определять лексикографический порядок символов (порядок сортировки) в местном алфавите. Включает правильную работу strcoll() и strxfrm() . Оказывает непосредственное влияние на работу утилит типа sort и т.д. |
LC_TIME | Определяет правила национального представления времени и даты . Задает именование дней недели, месяцев и т.п. а также задает способ написания даты и времени (12/24). Hепосредственно влияет на strftime() , а через нее на утилиты date и т.д. |
LC_NUMERIC | Определяет правила национального представления чисел с плавающей точкой. Влияет на strtod() и форматы %f и %g printf(), scanf() |
LC_MONETARY | Определяет правила национального представления денежных величин |
Особая переменная LC_ALL служит для обращения одновременно ко всем категориям.
Заметим, что включение средств локализации изменяет также некоторые пути поиска, в частности, пути поиска к файлам помощи (man-страницам), так что вначале команда man ищет переведенные man-страницы и только при их отсутствии выдает информацию на английском.
Подводя краткий итог всему вышеизложенному, можно сказать, что процедура русификации системы состоит из следующих этапов:
• настройка средств локализации;
• русификация текстового режима (консоли);
• русификация графического режима;
• русификация используемого ПО;
• русификация процесса печати.
В последующих разделах каждый из этих этапов рассматривается по отдельности.
11.2. Настройка системных средств локализации
11.2.1. Проверка наличия средств локализации
Современные дистрибутивы Linux (а тем более русифицированные) по умолчанию содержат системные средства локализации, перечисленные в предыдущем разделе.
Чтобы убедиться в этом, проверьте, что у вас имеются каталоги /usr/share/locale/* и /usr/share/i18n/*, а также файл /etc/sysconfig/i18n.
Кроме того, дайте команду
[user]$ locale
В ответ вы должны получить значения, присвоенные переменным окружения для управления средствами локализации. Я, например, увидел следующее:
LANG=ru
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R
Можно также дать команду locale с параметром, совпадающим с именем одной из переменных окружения, например:
[user]$ locale LC_TIME
(но я не берусь объяснить то, что вы увидите).
Если результат этих проверок отрицательный (что маловероятно), то установите пакет локализации для русского языка. Найти его можно в коллекции средств локализации по адресу http://www.ping.be/linux/locales/ или на www.kiarchive.ru.
После этого надо сказать Linux, какой язык вы хотите использовать, для чего необходимо задать значения переменных окружения для управления средствами локализации: LC_CTYPE, LC_TIME, LC_COLLATE, LC_NUMERIC, и LC_MONETARY. Вообще говоря, достаточно задать всего одну переменную LC_ALL, задание которой одновременно определяет значения всех перечисленных выше переменные.
Есть еще две переменных окружения, которые имеют отношение к локализации: LANG и LINGUAS. Они действуют примерно так же, как и LC_ALL, в том смысле, что они определяют значения по умолчанию всех других переменных локализации, но, в отличие от LC_ALL, они не переопределяют значений других переменных LC_*, для которых значения заданы отдельно.
Переменная LINGUAS является GNU-расширением переменой LANG. Не все программы знают о существовании этой переменой (хотя не знают очень немногие, и таких все меньше), но эта переменная обладает тем преимуществом, что она позволяет задать несколько вариантов локализации, в порядке предпочтения. В большинстве случаев достаточно задать только одну переменную локализации - LANG. Если вы хотите использовать несколько вариантов локализации, то надо задать LANG и LINGUAS. Остальные переменные необходимо задавать только в особых случаях, которые мы здесь не рассматриваем.
11.2.2. Формат задания значений переменных локализации
В качестве значений переменных локализации используются строки формата
ll[_CC[.EEEE]][@dddd],
где
• ll - это двухбуквенный код языка в соответствии со стандартом ISO для названий языков (ISO 639), записываемый в нижнем регистре (строчными латинскими буквами);
• CC - это двухбуквенный код страны в соответствии со стандартом ISO для названий стран (ISO 3166), записываемый в верхнем регистре;
• EEEE - это имя (название) таблицы кодировки, записываемое в верхнем регистре;
• dddd - название диалекта языка, который задается в том случае, если названия кодировки недостаточно для однозначного определения варианта локализации.
Для переменной LINGUAS задаваемые значения разделяются двоеточиями. Пример строки задания значений переменной вы уже видели: ru_RU.KOI8-R.
Как уже говорилось, стандарта на названия кодовых таблиц нет, тем более на название диалектов. То, что в шаблоне дано только 4 символа, ничего не означает - символов может быть и больше, и меньше. Квадратные скобки, как всегда, выделяют необязательные элементы. Обязательным в этом шаблоне является только название языка, но в некоторых источниках рекомендуется для русского языка указывать все три части. Напомню еще, что аббревиатура SU теперь означает Судан, а не нашу страну.
11.2.3 Включение средств локализации
Включение системных средств локализации в Red Hat Linux (а, следовательно, и в других дистрибутивах, основанных на Red Hat) осуществляется из файла /etc/profile.d/lang.sh.
Как известно, при старте любого shell-а сначала выполняется /etc/profile. В Red Hat в /etc/profile прописаны команды, благодаря которым на исполнение вызываются также все файлы /etc/profile.d/*.sh
Значения переменных локализации в файлах lang.sh задаются путем вызова на выполнение файла /etc/sysconfig/i18n. В файле /usr/doc/initscripts-4.16/sysconfig.txt.rus приведены краткие рекомендации относительно того, как задавать значения переменных в файле /etc/sysconfig/i18n, в частности, предлагается для LANG указать в качестве значения просто двухбуквенный код ISO для желаемого языка; для переменной LINGUAS - список кодов языков, разделенных двоеточием, а переменной LC_ALL присвоить имя в соответствии с приведенным выше описанием формата для переменных локализации. Таким образом, в файле /etc/sysconfig/i18n рекомендуется прописать три строки следующего вида:
LANG="ru_RU.KOI8-R"
LINGUAS="ru:en"
LC_ALL="ru_RU.KOI8-R"
Заметим, что в RU.LINUX.FAQ написано следующее: "Хотя в принципе допустимо задавать короткое именование, вроде LANG=ru_RU или даже LANG=ru, лучше использовать полное имя: LANG=ru_RU.KOI8-R. Совершенно недопустимо задавать LANG=ru_SU, такой страны больше нет :-)".
Если все, что было перечислено, сделано, можно считать, что локализация включена.
Правда, это верно только для случая, когда вы имеете права суперпользователя root. Но даже если вы простой пользователь Linux-системы и не можете редактировать файл /etc/sysconfig/i18n, то вы все же можете включить локализацию для себя, но несколько иным способом. А именно, поместите в свой файл $HOME/.profile (или в любой файл, который исполняется в процессе логирования пользователя: $HOME/.Xclients, $HOME/.xinitrc или другой) следующие строки:
export LANG=ru_RU.KOI8-R
export LINGUAS=ru_RU:en
export LC_ALL="ru_RU.KOI8-R"
Вот и все! (О том, как проверить, что локализация заработала, было сказано выше.)
11.3. Русификация консоли
11.3.1. Что нужно сделать
Если вы внимательно прочитали разд. 9.3 и разд. 11.1, то представляете, что для русификации консоли (а консоль - это, грубо говоря, совокупность клавиатуры и дисплея) требуется загрузить в драйвер консоли три таблицы:
• таблицу раскладки клавиатуры;
• таблицу экранного шрифта (SFM), в которой хранятся изображения символов;
• таблицу перекодировки символов (ACM).
Таблицы раскладки клавиатуры находятся в каталоге /usr/lib/kbd/keymaps/i386/qwerty. Выбор конкретного файла раскладки задается файлом /etc/sysconfig/keyboard. Этот файл можно отрегулировать вручную, а можно с помощью программы kbdconfig. В последнем случае нужная таблица с раскладкой клавиатуры загружается в память. При ручном изменении файла /etc/sysconfig/keyboard перезагрузка таблицы произойдет только после перезапуска компьютера или после выполнения команды (в примере загружается раскладка из файла ru-win.map):
[root]# loadkeys /usr/lib/kbd/keymaps/i386/qwerty/ru-win.map
Второй шаг русификации состоит в задании и загрузке таблицы экранного шрифта (SFM) в драйвер дисплея. Эти таблицы хранятся в виде файлов в каталоге /usr/lib/kbd/consolefonts. Загрузка шрифтов осуществляется немного по-разному в пакетах kbd и consoletools (соответственно, в версиях 5.2 и 6.x Red Hat Linux). В версии 5.2 загрузка шрифта осуществлялась с помощью команды setfont. Например, чтобы загрузить кодовую страницу из файла Cyr_a8x16, нужно дать команду
[root]# setfont /usr/lib/kbd/consolefonts/Cyr_a8x16
В версии 6.0 и последующих надо использовать команду consolechars с опцией -f:
[root]# consolechars -f /usr/lib/kbd/consolefonts/Cyr_a8x16
(Отметим, что команда setfont тоже сработает, только выдаст предупреждение о том, что надо пользоваться командой consolechars.)
Файлы шрифтов являются бинарными файлами размером 256*H байт, содержащими битовые образы для каждого из 256 символов, по одному байту на каждую линию образа и по H байт на символ (0 ‹ H ‹= 32). В этом случае о размере шрифта по вертикали можно судить по длине файла. В качестве файлов шрифтов могут использоваться файлы.psf; они имеют тот же самый формат и, кроме того, заголовок размером 4 байта. Некоторые файлы шрифтов содержат сразу три шрифта разного размера (например, 8х8, 8х14, 8х16), тогда в команде consolechars надо добавить опцию -H, например: -H 16, для выбора одного из размеров. Поскольку ядро Linux не поддерживает пока переключение режимов работы экрана, consolechars (как и setfont) не может изменить текущий режим EGA/VGA. Таким образом, пользователь полностью ответственен за выбор шрифта, соответствующего текущему режиму экрана.
Соответствие между символами кода ASCII и образами (или изображениями символов) из файла шрифта можно изменить, используя таблицу перекодировки (ACM - Application Charset Map). Если эту таблицу не загрузить, то, например, в программе Midnight Commander вы можете вместо красивых рамочек увидеть столбцы и строки из непонятных символов. Некоторые файлы шрифтов включают таблицу перекодировки шрифта, и тогда consolechars загрузит эту таблицу. По умолчанию файлы шрифтов находятся в каталоге /usr/lib/kbd/consolefonts, а таблицы перекодировки - в каталоге /usr/lib/kbd/consoletrans.
Таблицу перекодировки в 6-ой версии Red Hat (т. е. в пакете consoletools) можно загрузить отдельной командой consolechars с опцией -m file:
[root]# consolechars -m /usr/lib/kbd/consoletrans/koi2alt
Если таблица перекодировки не включена в файл шрифта и не указана в опции -m, то используется "тривиальная" таблица.
В версии 5.2 для загрузки таблицы перекодировки используется команда mapscrn:
[root]# mapscrn /usr/lib/kbd/consoletrans/koi2alt.
В этом случае драйвер консоли должен быть дополнительно переведен в режим перекодировки, задаваемый таблицей, путем вывода на консоль специальной escape-последовательности. Эта последовательность есть ‹esc›(K для набора символов G0 (G0 character set) и ‹esc›)K для набора символов G1 (G1 character set). Заметим, что активизировать эту таблицу необходимо в каждой консоли. При этом команда loadkeys действует одновременно во всех виртуальных консолях, а вот команда mapscrn действует только в той виртуальной консоли, в которой выполнена команда echo -ne '\033(K'.
Замечание:
Esc(K требуется, когда загружается альтернативная кодировка и активизируется таблица перекодировки псевдографики командой mapscrn koi2alt. Если шрифт koi-8, то никаких Esc(K не надо.
Замечание:
Все это не действует из-под Midnight Commander!
Существует еще таблица перекодировки для символов UNICODE. Некоторые файлы шрифтов включают эту таблицу, и она будет загружена командой consolechars, если только не задана опция -force-no-sfm. Отдельно загрузить таблицу перекодировки символов Unicode можно командой consolechars с опцией -u (см. руководство man).
Итак, для того, чтобы русифицировать консоль, нужно выполнить следующую последовательность команд:
• - для версии 5.2 Red Hat:
loadkeys /usr/lib/kbd/keytables/i386/qwerty/ru.map
setfont /usr/lib/kbd/consolefonts/Cyr_a8x16
mapscrn /usr/lib/kbd/consoletrans/koi2alt
echo -ne '\033(K'
• - для версии 6.0 Red Hat (и последующих):
loadkeys /usr/lib/kbd/keytables/i386/qwerty/ru.map
consolechars -f /usr/lib/kbd/consolefonts/Cyr_a8x16
consolechars -m /usr/lib/kbd/consoletrans/koi2alt
Но выполнять эту последовательность команд после каждого перезапуска компьютера, да еще в каждой виртуальной консоли, слишком обременительно. Поэтому рассмотрим вкратце, как русификация выполняется в дистрибутиве Black Cat Linux.
11.3.2 Как это сделано в дистрибутиве Black Cat
Во-первых, в файле /etc/sysconfig/i18n вводится новая переменная: в версии 5.2 это переменная SCRNMAP, а в версии 6.02 - SYSFONTACM. Этой переменной по умолчанию присваивается значение "koi2alt". Вот стандартный файл i18n из Black Cat Linux версии 6.02:
LANG=ru
LINGUAS=ru
LC_ALL=ru_RU.KOI8-R
SYSFONT=RUSCII_8x16
SYSFONTACM=koi2alt
Вызов файла i18n для задания значений переменных осуществляется из скрипта /sbin/setsysfont, из которого вызываются также команды setfont и mapscrn (в версии 5.2) или consolechars (в версии 6.0). Вот этот скрипт из Black Cat Linux версии 5.2:
-----------------------------------
#!/bin/sh
if [ -f /etc/sysconfig/i18n ]; then
. /etc/sysconfig/i18n
fi
if [ -x /usr/bin/setfont ]; then
if [ -n "$SYSFONT" ]; then
/usr/bin/setfont $SYSFONT
fi
if [ -x /usr/bin/mapscrn ]; then
if [ -n "$SCRNMAP" ]; then
/usr/bin/mapscrn $SCRNMAP
fi
fi
else
echo "can't set font"
exit 1
fi
------------------------------------
Как видно, при вызова скрипта /sbin/setsysfont выполняются команды "setfont Cyr_a8x16" и "mapscrn koi2alt". После этого, для включения в ядре кодовой таблицы пользователя, необходимо выдать на каждую виртуальную консоль последовательность "\033(K". Это реализовано путем добавления этой последовательности к файлу /etc/issue, который генерируется при загрузке системы скриптом /etc/rc.d/rc.local и вызывается на исполнение при логировании каждого пользователя. Вот пример скрипта /etc/rc.d/rc.local из версии 5.2:
-------------------------------------
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
if [ -f /etc/blackcat-release ]; then
R=$(cat /etc/blackcat-release)
elif [ -f /etc/redhat-release ]; then
R=$(cat /etc/redhat-release)
else
R="release 3.0.3"
fi
arch=$(uname -m)
a="a"
case "_$arch" in
_a*) a="an";;
_i*) a="an";;
esac
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
. /etc/sysconfig/i18n
echo "" > /etc/issue.net
echo "Black Cat Linux $R" >> /etc/issue.net
echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue.net
if [ -n "$SCRNMAP" ]; then
echo -ne "\033(K" > /etc/issue
else
echo "" > /etc/issue
fi
if [ -f /usr/bin/linux_logo ]; then
/usr/bin/linux_logo -n -o 2 >> /etc/issue
echo "" >> /etc/issue
fi
cat /etc/issue.net >> /etc/issue
echo "" >> /etc/issue
-------------------------------------
В версии 6.02 все происходит примерно так же. Просмотрите упомянутые выше файлы, и вы убедитесь в этом сами.
11.3.3. Переключение кодировок
Теперь поговорим о том, как "на лету" изменить кодировку символов. Необходимость в этом возникает в тех случаях, когда просматриваешь какой-то файл и вместо читаемого текста видишь непонятную абракадабру. В таких случаях хочется превратить ее в нормальный текст нажатием пары горячих клавиш. Можно, конечно, для каждого из необходимых шрифтов создать специальную команду, записав в небольшой файл приведенные выше команды, естественно соответствующим образом модифицированные. Однако ясно, что это не совсем удобно. В этом отношении хочется работать так же комфортно, как в программе FAR Е. Рошаля, где в том случае, когда просматриваешь файл по клавише ‹F3› или редактируешь его по ‹F4›, достаточно набрать ‹Shift›+‹F8› и получаешь возможность перекодировать выводимый на экран текст в любую из нескольких кодировок. Можно считать, что это уже роскошь, но что поделаешь, все мы быстро привыкаем к хорошему, и отказываться уже трудно.
2 июля 2000 г на сайте linux.ru.net появилась сообщение о заплате (патче) к Midnight Commander версии 4.5.50, которая позволяет производить перекодировку как в FAR, по нажатию клавиш ‹Ctrl›+‹T›. Тогда это можно было делать только во встроенной программе просмотра. На сегодня автор патча В. Студенников доработал его, так что перекодировка стала возможна и во встроенном редакторе (см. http://www.linux.zp.ua:8100/mc/ или http://www.sama.ru/~despaire/mc/my-patches.html).
Это что касается перекодировки «на лету». Как видите, такая перекодировка является функцией отдельных программ просмотра файлов. Если перекодировка «на лету» недоступна, то можно перекодировать сам текстовый файл. Для преобразования потока символов из одной кодовой страницы (charset) в другую, в стандарте POSIX существуют утилита iconv и функция iconv(). О других программах перекодировки мы поговорим в гл. 12.
11.4. Русификация X Window
Так же, как и в текстовом режиме, в графическом русификация определяется таблицей раскладки клавиатуры и файлами шрифтов. Впрочем, о том, как разобраться с клавиатурой, было достаточно сказано в разд. 9.3. Давайте теперь подробно рассмотрим, как организовать вывод на экран символов кириллицы.
11.4.1. Немного о терминологии
Для начала надо пояснить некоторые термины, часть из которых появилась еще в те времена, когда типографии называли словолитнями, а часть - уже в наше время, вместе с широким внедрением компьютеров в типографское дело. Некоторые из этих терминов получены прямым заимствованием из английского языка, например, фонт-сервер, рендеринг, глиф.
Пожалуй, важнейшим типографским термином является шрифт. В обычном, или «бытовом», если так можно выразиться, понимании шрифт - это только набор графических изображений символов, который служит для представления букв на бумаге или другой поверхности (например, экране, причем экране в широком смысле слова - экране кино, телевизора, компьютера). Поскольку можно сказать, что шрифты появились вместе с изобретением книгопечатания, история разработки и создания шрифтов исчисляется уже веками. За это время создание шрифтов превратилось в особый вид деятельности (может быть, даже в отрасль науки) со своей терминологией, инструментарием, традициями, школами и т.д. Новый импульс эта наука получила с переходом на компьютерные технологии.
Субъективное замечание:
Вместе с широким распространением компьютеров в русском языке появился новый термин - фонт. Первоначально это была простая подмена русскоязычного термина его английским эквивалентом, применявшаяся только в компьютерном сленге. Однако постепенно стало проявляться различие в употреблении этих терминов. Понятие "фонт" стало охватывать понятие "шрифт", но начало трактоваться в более широком смысле, подразумевая не только собственно шрифт, как набор изображений символов, но и способ формирования этих изображений на экране и/или бумаге, и способ сохранения этих изображений в файле. Кроме того, словом "фонт" называют просто файл, содержащий закодированные неким образом изображения символов шрифта (например, битовые карты изображений символов). Мне кажется, что в последнем случае правильнее употреблять термин "файл фонта", а термин "фонт" следует употреблять во втором смысле: как совокупность собственно шрифта (как набора изображений символов), способа вывода этих изображений символов на печать или экран и способа сохранения шрифта в виде файла. Таким образом, можно сказать, что шрифт - понятие типографское, а фонт - компьютерное. Впрочем, такая трактовка этих терминов не является пока общепринятой и всюду ниже употребляется единый термин - шрифт.
Существует два основных типа шрифтов: растровые и контурные (их еще называют векторными).
В растровых шрифтах изображение символа составляется из отдельных точек и сохраняется в файле в виде двоичной матрицы или "битовой карты" (bitmap). Поэтому такие шрифты можно назвать матричными. Растровые шрифты являются аппаратно-зависимыми - они предназначены для получения только определенных разрешений. Матричный шрифт с разрешением 75 точек на дюйм (75 DPI) даст только 75 точек на дюйм даже на принтере, обеспечивающем разрешение 1200 DPI. Для обеспечения возможности изменения размера шрифта приходится либо хранить в файле битовые карты для разных размеров шрифта, либо изображение приходится увеличивать или уменьшать в целое число раз, что приводит к деформации изображений символов. Кроме того, при использовании растровых шрифтов для печати необходимы дополнительные принтерные шрифты, соответствующие экранным.
Матричные экранные шрифты обычно используются в терминальных окнах, в консоли и в простых текстовых редакторах, где отсутствие масштабируемости и тот факт, что они не могут использоваться для печати, не так существенны.
В контурных (или векторных) шрифтах для вывода изображения символа применяется математический аппарат, основанный на использовании кривых Безье. Как известно, для описания прямой линии нам необходимо и достаточно задать только две точки - начало и конец прямой. Кривая Безье задается своими начальной и конечной точками, и, кроме того, набором промежуточных точек, к которым стремится данная кривая. Регулируя отклонение кривой от этих промежуточных точек, можно достичь гладких изгибов кривой Безье. Каждый символ (точнее говоря, глиф, см. ниже) контурного шрифта представляется набором контуров, задающих границы изображения. Контура описываются замкнутыми кривыми Безье. При выводе изображения на экран или принтер производится преобразование заданного таким образом изображения символа в матрицу точек (грубо говоря, в растровое изображение соответствующего размера).
Достоинством контурных шрифтов является их независимость от устройства вывода - они одинаково выглядят как на экране, так и на принтере. Каждый символ может иметь различное начертание: курсив, полужирный, подчеркивание и обычное. Кроме того, он может иметь абсолютно любой размер (т. е. эти шрифты являются масштабируемыми), что невозможно в случае с растровыми шрифтами.
Отдельным элементом контурного шрифта, выводимым на экран или принтер, является не символ, что казалось бы более естественным для незнакомого с предметом человека, а так называемый глиф (этот термин является прямым заимствованием соответствующего английского термина "glyph"). Глиф может представлять либо отдельный символ, либо два или большее число символов (так называемые лигатуры), либо часть изображения символа.
Еще одно понятие, которое необходимо для описания и классификации шрифтов - это сериф. Серифы - это небольшие выступы у оснований символов и в верхней части изображений символов. Например, буква "i" в таких шрифтах как Times Roman имеет серифы у основания и в верхней части вертикальной черты. Серифы появились в изображениях символов шрифтов относительно недавно и позволили улучшить зрительное восприятие символов. Шрифты, в которых используются серифы, считаются более читабельными, чем шрифты без серифов. При малых размерах символов серифы обычно не используются, так как отсутствие лишних элементов позволяет легче их воспринимать. Например, фирма Microsoft рекомендует шрифт Verdana как наиболее подходящий для очень малых размеров символов при выводе на экран.
Межсимвольное расстояние задает интервал, на который символы шрифта отстоят друг от друга. Бывают шрифты с фиксированным межсимвольным расстоянием и фиксированным размером символов (речь идет о ширине, высота символов у обычных шрифтов и так фиксирована) или fixed width fonts, и шрифты переменной ширины - variable width fonts. Шрифт фиксированной ширины выглядят как текст, напечатанный на пишущей машинке, поскольку все буквы имеют одну и ту же ширину. Это качество желательно для таких применений как компьютерная консоль, но нежелательно для больших печатных документов. Шрифты с фиксированной шириной символов часто используются, например, в примерах, иллюстрирующих компьютерные команды.
В шрифтах переменной ширины для повышения читабельности и улучшения внешнего вида текста варьируется как ширина отдельных символов, так и межсимвольное расстояние, для чего используется техника трекинга и кернинга.
Трекинг - это специальные приемы улучшения оптических свойств текста при больших и малых размерах за счет изменения расстояния между символами. Трекинг определяет межсимвольное расстояние как функцию от размера шрифта.
Кернинг улучшает качество восприятия текста, изменяя межсимвольное расстояние в некоторых парах символов, которые называются парами кернинга. Например, при изображении пары символов "То" маленькая буква "о" должна быть приближена к заглавной "Т", и даже размещаться частично "под" этой "Т", что повышает качество изображения.
Для достижения наилучшего качества отображения символов шрифта при работе с малыми размерами используется такое средство, как хинтинг (hinting). При отображении символа в малом размере учитывают, какие части контура символа следует использовать, а какие нет. Для этого в описание контура символа помещаются "хинты" - специальные инструкции, указывающие каким образом надо изменять форму контура для достижения наилучшего качества. Как правило, редакторы шрифтов сами выполняют хинтинг, избавляя пользователя от дополнительной работы над шрифтом.
Совокупность данных о ширине символов, межсимвольном расстоянии, а также информации, необходимой для кернинга и трекинга, называют метриками шрифта.
Варианты шрифтов. Каждый шрифт обычно содержит несколько вариантов изображений каждого символа. Большинство шрифтов содержат такие варианты как полужирный (bold), курсив (italic) и полужирный курсив (bold-italic). Некоторые шрифты имеют дополнительные варианты, например, жирный или small caps, когда строчные буквы заменяются уменьшенными заглавными (этот вариант шрифта чаще всего используется для создания заголовков).
11.4.2. Форматы файлов шрифтов
В недавние времена буквально каждый графический редактор или издательская программа использовали свой формат файлов шрифтов и, как правило, одни программы не поддерживали форматы других. Со временем число реально используемых форматов существенно сократилось, так как происходит своеобразный "естественный отбор".
Растровые шрифты (Bitmap Fonts)
Существует два типа матричных шрифтов - принтерные матричные шрифты (bitmap printer fonts), такие как шрифты pk, генерируемые программой dvips, и матричные экранные шрифты, используемые в системе X Window и в консольном режиме. Файлы матричных шрифтов обычно имеют расширения bdf или pcf.
Шрифты Type1
В Linux ведущим форматом шрифтов является Adobe PostScript. Вообще, PostScript - это язык для описания страницы документа, он используется для вывода страницы с текстом и графикой на экран и на принтер (который поддерживает этот язык). Шрифты Adobe Type основаны на данном языке. Существуют две основные разновидности: Type 1 PostScript font и Type 3 PostScript font. Стандартом является Type 1. Шрифт Type 3 используется довольно редко. Шрифты Type 1 применяются в различных графических и издательских программах, например Adobe PageMaker, но они не являются стандартными в Microsoft Windows и поэтому их использование ограничивается программами, специально разработанными для поддержки данных шрифтов.
Язык Postscript традиционно используется для печати в UNIX, и поэтому шрифты Type 1 широко применяются в Linux. Они поддерживаются в графической системе X Window и программе управления печатью ghostscript.
Обычно шрифт Type 1 для UNIX задается двумя файлами: файлом метрик с расширением afm (adobe font metric), и файлом контуров, который имеет расширение pfb (printer font binary) или pfa (printer font ascii). Файл контуров содержит все глифы, а файл метрик содержит метрики шрифта.
Шрифты Type 1 для других платформ могут поставляться в других форматах. Например, шрифты postscript для Windows часто используют формат pfm для файла метрик.
Шрифты Type3
Эти шрифты распространяются примерно таким же образом, как шрифты Type1 - в виде пары afm-файла метрик и pfa-файла контуров. Хотя они поддерживаются стандартом postscript, но не поддерживаются в X Window, поэтому имеют ограниченное применение.
Шрифты True Type
Технология True Type была создана фирмой Apple для использования в операционной системе MacOS в 1990 году. Позже лицензию на эту технологию приобрела фирма Microsoft. Благодаря гигантской популярности MS Windows шрифты True Type стали ведущим форматом для компьютерных шрифтов. Шрифты True Type хранят метрики и информацию о начертаниях символов в одном файле (обычно с расширением ttf). Недавно были разработаны серверы шрифтов, или фонт-серверы, которые сделали шрифты True Type доступными для X Window. С некоторых пор стандарты postscript и ghostscript тоже поддерживают True Type шрифты. В силу этого, а также из-за того, что имеется большое количество высококачественных и доступных шрифтов True Type, они становятся все более популярными в Linux.
Шрифты Type42
Шрифты Type42 в действительности являются просто шрифтами True Type с дополнительным заголовком, что делает возможным обработку их интерпретатором PostScript. Большинство приложений, таких как ghostscript и SAMBA могут работать с этими шрифтами. Однако, если вы имеете postscript-принтер, может оказаться необходимым явно создать файлы шрифтов типа Type42.
Сравнение форматов Type1 и TrueType
Несмотря на длительное противостояние между сторонниками шрифтов Type1 и True Type, эти форматы имеют много общего. Оба они представляют масштабируемые контурные шрифты. Разница в том, что шрифты Type1 используют для построения глифов кривые Безье третьей степени в отличие от квадратичных кривых, на которых строятся шрифты True Type. Теоретически это является преимуществом, поскольку тем самым Type1 включает все кривые, которые можно построить с помощью True Type. На практике, однако, разница очень незначительна.
Шрифты True Type имеют преимущество, заключающееся в том, что обеспечивают лучшую поддержку хинтинга (шрифты Type1 тоже поддерживают хинтинг, но не так эффективно). Это существенно только для устройств с низким разрешением, таких как экраны (улучшение хинтинга не дает заметной разницы на принтерах с разрешением 600dpi, даже при малых размерах точки). Улучшенный хинтинг не имеет большого практического значения еще и потому, что шрифты True Type с хорошим хинтингом встречаются достаточно редко. Причина этого в том, что пакеты программного обеспечения для создания шрифтов, поддерживающих хинтинг, слишком дороги для большинства дизайнеров шрифтов. Только крупные фирмы, такие как Monotype, создают шрифты с полноценной поддержкой хинтинга.
Основная разница между шрифтами True Type и Type1 состоит в доступности и поддержке приложениями. Широкое распространение шрифтов True Type для Windows привело к тому, что многие страницы на сайтах Интернета создаются в предположении, что определенные шрифты True Type установлены на компьютере пользователя. Многие пользователи имеют на своих компьютерах большое число шрифтов True Type, поставляемых с приложениями Windows. Однако, под Linux большинство приложений поддерживают шрифты Type1, но не поддерживают на том же уровне шрифты True Type. Кроме того, некоторые из основных производителей шрифтов поставляют свои шрифты в формате Type1. Например, фирма Adobe выпускает очень мало шрифтов True Type. Учитывая, что преобразование из одного формата в другой не может быть проведено без определенных потерь качества, надо стараться использовать в каждом приложении те шрифты, на использование которых это приложение рассчитано.
Метафонт
Метафонт был разработан Дональдом Кнутом (Donald E Knuth) как часть его типографской системы TEX. Метафонт - это язык программирования графики (a graphics programming language), подобный Postscript. Сфера применения этого языка шире, чем просто вывод изображений символов. У метафонта имеется ряд очень привлекательных качеств. Одна из очень важных особенностей, - то, что масштабирование выполняется очень изящно. Символы метафонта Computer Modern имеют различный вид при размере 20 точек и 10 точек. Изображения символов изменяются при изменении размера, потому что для малых размеров желательно увеличить ширину несколько больше, чем высоту (это делает символы больших размеров более элегантными, а символы маленьких размеров более читабельными).
Файлы метафонтов обычно имеют расширение mf. При выводе на печать или экран они преобразуются в растровые шрифты, определяемые устройством вывода. Это преобразование, хотя и дает высокое качество, осуществляется медленно, так что эти шрифты не очень удобны для использования в WYSIWYG-приложениях.
11.4.3. Конфигурация X-сервера
Теперь, когда введены все используемые в последующем термины и даны необходимые сведения о форматах шрифтов, можно перейти к рассмотрению того, как настроить ваш Linux на корректную работу со шрифтами. При этом я буду ориентироваться на пользователей дистрибутива Red Hat и его аналогов (я проверял изложенные ниже рекомендации на дистрибутиве Black Cat 6.02).
Выводом изображений и, в частности, изображений символов, на экран занимается X-сервер. Когда приложение обращается к X-серверу с требованием вывести на экран какой-то текст, X-сервер обращается к своему конфигурационному файлу XF86Config, в котором должен быть определен перечень каталогов со шрифтами (FontPath). Откройте файл XF86Config (обычно он находится в каталоге /etc/X11/ или /usr/X11R6/lib/X11/) с помощью любого текстового редактора. Недалеко от начала файла в секции "Files" вы должны увидеть примерно такие строки:
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
Это и есть перечень каталогов шрифтов X-сервера, который в англоязычной документации называется коротко FontPath. Порядок перечисления каталогов в этом перечне существенен: когда приложение запрашивает вывод текста на экран определенным шрифтом, X-сервер поочередно просматривает каталоги из FontPath и использует для вывода текста первый шрифт, который соответствует запросу приложения.
Если используются установки, задаваемые по умолчанию, то растровые шрифты с разрешением 75 DPI обычно оказываются размещены в этом перечне перед шрифтами с разрешением 100 DPI. Следствием этого может оказаться то, что на экранах с высоким разрешением символы будут очень маленькими. Если такой эффект у вас проявляется, поменяйте порядок перечисления каталогов в FontPath.
Еще один момент, относящийся к растровым шрифтам, связан с их масштабированием. При отображении символов большого размера с помощью таких шрифтов может оказаться, что изображение символа распадается на отдельные точки. Этот эффект проявляется, например, в Netscape при выводе крупных заголовков. Чтобы избежать этого, вы можете указать после имени каталога ключевое слово "unscaled" (не масштабировать), отделив его двоеточием:
FontPath "/usr/X11R6/lib/X11/fonts/misc/:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
При этом можно, как в приведенном выше примере, указать как возможность использования масштабируемых, так и немасштабируемых шрифтов, определив свои предпочтения порядком перечисления строк в XF86Config.
Кстати, раз уж вы заглянули в XF86Config, неплохо заодно проверить и другие установки, определяющие конфигурацию X-сервера. Неправильное задание параметров работы монитора может доставить гораздо больше головной боли, чем неправильный выбор шрифта. В частности, убедитесь, что частота обновления экрана выбрана максимально возможной для вашей аппаратной конфигурации (85 Hz - это великолепно, 75 Hz - неплохо, а 60 Hz - это просто вредно для вашего зрения).
11.4.4. Фонт-серверы
Хотя вывод символов на экран с помощью X-сервера графической подсистемы XFree86 и обеспечивает вывод текста, однако, этот способ имеет два крупных недостатка. Во-первых, шрифты должны располагаться на том же компьютере, на котором запущен X-сервер. Во-вторых, не обеспечивается вывод шрифтов True Type. Для преодоления этих недостатков были разработаны специальные серверы шрифтов или фонт-серверы (надо отметить, что в версии XFree86 4.x второй недостаток уже отсутствует, так что специальный фонт-сервер уже не нужен, если речь идет только о поддержке шрифтов True Type).
В настоящее время существует три разных сервера фонтов: xfs, xfstt и xfsft.
Фонт-сервер xfs
Если вы пользуетесь дистрибутивом, основанным на Red Hat (Mandrake и т.п.), то фонт-сервер xfs у вас, вероятно, установлен. Сообщение о запуске фонт-сервера xfs появляется на экране монитора в процессе загрузки, а, кроме того, соответствующее сообщение об успешном запуске xfs можно найти в файле /var/log/messages.
В случае применения xfs, в файле XF86Config вместо перечня каталогов со шрифтами вы увидите всего одну строку следующего вида:
FontPath "unix/:-1"
Эта строка является ссылкой на номер порта, который будет использоваться для связи с фонт-сервером.
Использование фонт-сервера не означает, что имеет место полный отказ от перечня каталогов со шрифтами. Только теперь это перечень переносится в конфигурационный файл программы xfs. По умолчанию это файл /etc/X11/fs/config. В секции "catalogue" этого файла и перечислены теперь все каталоги со шрифтами. Соответствующая секция файла /etc/X11/fs/config должна выглядеть примерно так: catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/100dpi:unscaled,
/usr/X11R6/lib/X11/fonts/75dpi:unscaled,
/usr/X11R6/lib/X11/fonts/Type1,
/usr/X11R6/lib/X11/fonts/Speedo,
/usr/X11R6/lib/X11/fonts/misc,
/usr/X11R6/lib/X11/fonts/100dpi,
/usr/X11R6/lib/X11/fonts/75dpi,
/usr/local/share/fonts/ttfonts
(обратите внимание на отсутствие запятой в последней строке).
Правда, вы можете по-прежнему включить строки с указанием путей к каталогам шрифтов в файл XF86Config (вместе со строкой "FontPath "unix/:-1"), но они будут обрабатываться не фонт-сервером, а X-сервером. xfs от Redhat способен обслуживать как шрифты Type 1, так и шрифты True Type.
Фонт-сервера xfstt и xfsft
Если ваш дистрибутив не включает фонт-сервер xfs, вы можете воспользоваться одним из альтернативных фонт-серверов
• xfstt (http://metalab.unc.edu/pub/Linux/X11/fonts/) или
• xfsft ().
xfstt - это фонт-сервер, созданный исключительно с целью обслуживания шрифтов True Type на локальной машине. Поэтому он поддерживает только шрифты True Type и не может обслуживать шрифты на нескольких машинах в сети. Учитывая это, предпочтительнее пользоваться фонт-сервером xfsft или фонт-сервером xfs от Red Hat, о котором мы уже говорили. Заметим, что фонт-сервер xfsft послужил основой для доработки xfs, и модуль работы со шрифтами в XFree86 версии 4 создан разработчиком xfsft. Наверное поэтому этот фонт-сервер перестал поддерживаться разработчиком, так что вам лучше сразу ориентироваться на xfs или переходить на XFree86 версии 4.
11.4.5. Ревизия шрифтового хозяйства
Установлен ли фонт-сервер?
Давайте начнем такую ревизию с проверки того, что корректно установлен фонт-сервер xfs. Вначале запустите команду:
[root]# ps ax | grep xfs
Если xfs уже установлен в вашей системе (в противном случае установите его), вы должны увидеть строку примерно такого вида:
401? S 0:04 xfs -droppriv -daemon -port -1
По этой строке можно определить, какой порт использует эта программа. Этот же номер должен быть указан в строке вида
FontPath "unix/:port_number"
в секции "Files" в конфигурационном файле X-сервера (в xfree86 это файл /etc/X11/XF86Config). Скорее всего секция "Files" в этом случае вообще содержит только одну строку FontPath, например, такую:
FontPath "unix/:-1"
Впрочем, можно не искать файл /etc/X11/XF86Config, а выполнить команду:
[root]# xset -q,
в выводе которой вы должны увидеть такие строки:
FontPath
"unix/:-1"
Если перечень каталогов шрифтов XFree86 содержит строку типа unix:/port_number, где port_number совпадает с номером порта, используемым программой xfs (Вы получили его по команде ps), то сервер xfs у вас установлен корректно. В противном случае, вы должны добавить ссылку на него в перечень каталогов шрифтов XFree86 либо с помощью команд:
[root]# xset fp+ unix/:port_number
[root]# xset fp rehash
либо путем непосредственной корректировки файла /etc/X11/XF86Config и последующего перезапуска X Window.
Для редактирования файла /etc/X11/XF86Config вы должны иметь права суперпользователя. Если вы таких прав получить не можете, то для корректной установки фонт-сервера вы должны обратиться к администратору. Какие шрифты имеются в Вашей системе?
Давайте теперь посмотрим, какие шрифты установлены в системе. Поскольку вы уже знаете (загляните еще раз в FontPath), в каких каталогах находятся файлы шрифтов, вы можете непосредственно просмотреть эти каталоги. Но одного наличия файла со шрифтом еще недостаточно для того, чтобы шрифт был доступен для X-сервера. Для того, чтобы увидеть список шрифтов, известных X-серверу, лучше воспользоваться командой xlsfonts, которая выводит на экран перечень таких шрифтов. Если запустить ее с опцией -lll, то она дополнительно выдаст массу информации о каждом шрифте. Перенаправьте вывод в файл:
[root]# xlsfonts › fontlist
и вы получите список доступных шрифтов в файле fontlist.
Но для того, чтобы этот список прочитать, надо иметь представление о том, как именуются шрифты. Без этого прочитать полученный файл fontlist будет очень трудно.
Существует стандарт консорциума X (X Consortium) на имена шрифтов для X Window System, который называется X Logical Font Description Conventions (обычно упоминаемый как XLFD). Полное описание его дано в [П13.11]. В соответствии с этим стандартом имя шрифта состоит из 14 полей:
• foundry (fndry) - производитель шрифта (Adobe, Bitstream и т.п.);
• family (fmly) - название семейства шрифтов (например, Times);
• weight (wght) - толщина (bold, demibold, medium);
• slant (slant) - наклон (roman, italic, oblique);
• set width (sWdth) - ширина (normal, condensed, double wide);
• add style (adstyl) - стиль (serif, sans serif, decorated);
• pixel size (pxlsz) - размер символа по вертикали (в пикселах, 0 означает масштабируемый шрифт);
• point size (ptSz) - размер символа по горизонтали;
• resolutionX (resx) - разрешение по горизонтали;
• resolutionY (resy) - разрешение по вертикали;
• spacing (spc) - ширина символов (пропорциональный, моноширинный);
• avg width (avgWdth) - среднее значение ширины глифов шрифта;
• registry (rgstry) - название стандарта на кодировку символов (koi8, iso8859);
• encoding (encdng) - язык или кодовая страница (r, u).
Здесь в начале каждой строки указано наименование поля, затем (в скобках) сокращение этого наименования, используемое в программе xfontsel (о ней чуть ниже), после чего дается перевод (приблизительный) наименования поля. В скобках после русского перевода названия поля приводится по несколько примеров возможных значений этого поля, которые поясняют его назначение.
При задании конкретного шрифта поля в его имени принято разделять дефисами. Приведем пару примеров имен в стандарте XLFD:
-adobe-times-medium-r-normal-*-14-140-75-75-p-74-iso8859-1
-misc-fixed-medium-i-semicondensed-*-13-120-75-75-c-60-koi8-r
-adobe-courier-bold-o-normal-*-10-100-75-75-M-60-iso8859-1
(если какое-то поле не определено, то в соответствующей позиции ставится звездочка; таким образом можно одной строкой задать множество шрифтов).
В качестве параметра команде xlsfonts можно указать имя конкретного шрифта или семейства шрифтов (этой возможностью просто необходимо воспользоваться, если вы задали опцию -lll, иначе масса полученной информации окажется слишком велика).
Но просмотр списка шрифтов, выдаваемого командой xlsfonts, мало информативен в том смысле, что при этом вы не видите изображений символов, которые будет давать на экране данный шрифт. В этом плане гораздо удобнее воспользоваться программой xfontsel, которая работает в графическом режиме и выводит в своем окошке изображения некоторых символов данного шрифта, позволяющих представить себе, как будет выглядеть выводимый текст.
Эти две команды могут оказаться полезными, как для определения того, какие шрифты уже имеются в системе, так и для проверки того, что новые шрифты успешно установились. Я не буду здесь подробно описывать, как пользоваться этими командами. Воспользуйтесь соответствующими man-страницами или системой info.
На мой взгляд, пользователь обычно руководствуется в выборе шрифта только следующими признаками из перечисленных выше: семейство шрифтов (fmly), вариант шрифта - жирный шрифт или обычный (wght), наклон (slant), ширина шрифта (sWdth), размер шрифта в пикселах (pxlsz), стандарт (rgstry) и язык (encdng).
Попробуйте выбирать разные значения этих параметров в программе xfontsel и вы получите неплохое представление о том, какие шрифты установлены в вашей системе. Для русскоязычных пользователей выбор шрифта для просмотра стоит начать с двух последних полей. Задайте для поля rgstry значение koi8, а для поля encdng - значение r, и вы увидите сколько русскоязычных шрифтов в кодировке koi8-r у вас установлено. Кириллические шрифты задаются также значениями iso8859-5 в двух последних полях.
Кроме xlsfonts и xfontsel cуществуют еще несколько программ для просмотра установленных в системе шрифтов.
• Чтобы увидеть полный набор символов шрифта, можно воспользоваться командой xfd -fn fontname. В качестве fontname здесь можно использовать как полное имя шрифта, так и строку с символами маскирования (*), а также синонимы имен шрифтов, заданные в файле font.alias. Пример:
xfd -fn -*-helvetica-medium-r-*
• В графической среде KDE имеется Менеджер шрифтов, который тоже показывает все установленные шрифты, а также позволяет удалить некоторые (но устанавливать новые, кажется, не умеет!).
• В Gnome имеются утилиты font selector, character picker и gfontview.
Файлы fonts.dir, fonts.alias и fonts.scale
Если вы последуете приведенному Выше совету и выполните команду
xlsfonts › fontlist
а после этого пересчитаете число файлов в каталогах, перечисленных в FontPath, то скорее всего обнаружите, что в fontlist перечислено гораздо больше шрифтов, чем имеется файлов со шрифтами. Чтобы понять, почему это так, надо разобраться с файлами fonts.dir, fonts.alias и fonts.scale. Если вы заглянете в любой каталог со шрифтами, то найдете там по крайней мере файл fonts.dir, а может быть и два других: fonts.alias и fonts.scale. Для чего же они нужны?
Структура файла fonts.dir очень проста и из нее становится ясно, зачем этот файл нужен. Каждая строка файла fonts.dir (кроме первой) содержит имя одного из файлов со шрифтом, содержащегося в том каталоге, где расположен данный файл fonts.dir, вслед за которым (после пробела или символа табуляции) указывается имя содержащегося в этом файле шрифта. Пример:
koi12x24.pcf.gz -cronyx-fixed-medium-r-normal-24-170-100-100-c-120-koi8-u
Первая строка файла fonts.dir содержит число шрифтов, перечисленных в этом файле (и, соответственно, имеющихся в данном каталоге со шрифтами). Файл fonts.dir совершенно необходим для того, чтобы X-сервер мог работать со шрифтами. По-видимому (я могу судить об этом только на основании проведенных экспериментов, поскольку в литературе такого описания не встречал), при запуске X-сервера или фонт-сервера на основе файлов fonts.dir из каталогов шрифтов в оперативной памяти создается таблица доступных для системы шрифтов.
Файл fonts.scale, по-видимому, задает список масштабируемых шрифтов и необходим некоторым приложениям для корректной работы с такими шрифтами. В большинстве случаев это либо точная копия файла fonts.dir, либо просто ссылка на fonts.dir. Естественно, что в каталогах с растровыми шрифтами мы такого файла не найдем.
Файл fonts.alias - это еще один конфигурационный файл, оказывающий влияние на работу со шрифтами. Уже по названию ("alias" - прозвище, кличка) можно догадаться о его назначении. Строки этого файла имеют следующий вид:
синоним XLFD_имя_реального_шрифта
При этом каждая строка должна оканчиваться только символом конца строки и владельцем файла должен быть суперпользователь. Вот для примера первые строки из файла /usr/X11R6/lib/X11/fonts/misc/fonts.alias в системе Redhat:
fixed -misc-fixed-medium-r-semicondensed-13-120-75-75-c-60-iso8859-1
variable -*-helvetica-bold-r-normal-*-*-120-*-*-*-*-iso8859-1
Слово fixed здесь является синонимом или ссылкой ('alias'). Каждый раз, когда запрашивается шрифт fixed, будет фактически происходить обращение к шрифту, указанному во второй колонке. Шрифт кажется маловат? Просто поменяйте имя, на которое дана ссылка этим определением. Тот же самый принцип применим ко всем шрифтам, включая True Type. Более того, если у вас не установлены шрифты True Type, вы можете использовать этот же трюк для того, чтобы использовать какой-то из шрифтов Type 1 вместо запрашиваемых приложением шрифтов True Type.
Маленькое ПРЕДОСТЕРЕЖЕНИЕ для тех, кто имеет привычку "сильно быстро делать": некоторые синонимы должны быть известны системе в любой момент времени! В первую очередь это относится к синонимам "cursor", "fixed" и "variable" в каталогах /misc. Если таких строк в misc/fonts.alias нет, или они указывают на несуществующий шрифт, то графическая оболочка просто откажется запускаться.
Файл fonts.alias важен для некоторых приложений, которые не могут нормально обрабатывать данные, предоставляемые файлом fonts.scale. Самый характерный пример - Netscape. Без fonts.alias вы можете столкнуться с тем, что Netscape будет отображать только шрифты с размером символов от 0 до 12 точек. Создав корректный файл fonts.alias в каталоге со шрифтами True Type, вы получите возможность выбирать из большего числа вариантов в "Preferences | fonts" в Netscape. Приведем небольшой пример. Предположим, что в файле fonts.scale имеются строки:
arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-ascii-0
arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-fcd8859-15
arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-15
arial.ttf -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-1
Это масштабируемые шрифты, так что в их именах не указаны размеры. Поэтому в файле fonts.alias должны, соответственно, присутствовать строки (в файле они должны быть записаны без переносов, просто в книге строка целиком не умещается в рамках страницы):
-monotype-Arial-medium-r-normal- 6-60-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--9-90-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--7-70-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--9-90-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--8-80-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--10-100-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--9-90-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--11-110-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--10-100-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--11-110-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--12-120-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--13-130-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--13-130-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--14-140-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--14-140-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--15-150-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--15-150-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--18-180-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--18-180-75-75-p-0-iso8859-1
-monotype-Arial-medium-r-normal--24-240-0-0-p-0-iso8859-1 -monotype-Arial-medium-r-normal--24-240-75-75-p-0-iso8859-1
После этого Netscape будет корректно масштабировать шрифт Arial.
Обратите внимание на различие в размерах шрифта в правой и левой колонках. Например, в первой строке слева указан размер в 6 точек, а справа - 9 точек. С помощью этого приема удается преодолеть "склонность" Netscape к использованию слишком маленьких шрифтов. Просто подберите справа цифры в соответствии с Вашими вкусами.
Создавать файлы fonts.dir, fonts.scale и fonts.alias вручную - занятие не из простых. Поэтому разработаны специальные программы, которые запускаются в каталоге со шрифтами и создают эти файлы. Файл fonts.dir в каталоге с растровыми шрифтами можно создать с помощью команды mkfontdir. Для создания файлов fonts.dir и fonts.scale в каталогах со шрифтами Type1 надо воспользоваться утилитой type1inst (ftp://ftp.metalab.unc.edu/pub/Linux/X11/xutils/). Это скрипт на языке perl, который автоматически создает файлы fonts.dir и fonts.scale, необходимые для того, чтобы система X-Window могла использовать шрифты. Рекомендации по установке и настройке этого скрипта вы найдете в файле README, который поставляется вместе с пакетом.
Для шрифтов True Type необходима своя утилита ttmkfdir, которую можно найти на многих сайтах с программным обеспечением для Linux. В Redhat эта утилита включена в состав rpm-пакета Freetype.
На странице "Some Linux for Beginners" (http://home.c2i.net/dark/linux.html) вы можете найти скрипт на языке python, с помощью которого можно создать файл fonts.alias.
Удаление ненужных шрифтов
Когда я просмотрел с помощью программы xfontsel, какие шрифты установлены в системе, я с удивлением обнаружил, что по умолчанию устанавливаются шрифты с какими-то иероглифами (поскольку я не знаю ни китайского, ни японского, то не могу точно сказать, какому языку эти иероглифы соответствуют). Естественно, что появилось желание удалить эти ненужные шрифты, хотя бы для того, чтобы не занимать зря драгоценное место на диске. Теперь, когда мы знаем, где эти шрифты расположены (см. перечень каталогов шрифтов), а также как шрифты именуются, удалить ненужные довольно просто.
Вначале давайте удалим шрифты с иероглифами (если вы не возражаете!). При работе с программой xfontsel я обнаружил, что иероглифы появляются на экране программы xfontsel тогда, когда в поле registry стоит комбинация jisx с какими-то еще цифрами. Перейдя в каталог /usr/X11R6/lib/X11/fonts/misc я просмотрел файл fonts.dir, устанавливающий связь между именами шрифтов и именами файлов, в которых хранятся соответствующие шрифты. С помощью этого файла нужно найти имена файлов с иероглифами и удалить их. После этого надо запустить команду mkfontdir, которая подкорректирует файл fonts.dir. Можно, конечно, и просто вручную удалить из fonts.dir строки, соответствующие удаленным файлам. Только не забудьте, что первая строка файла fonts.dir должна указывать число разных вариантов шрифта (не файлов в каталоге, а уменьшенное на единицу число строк в файле fonts.dir).
Кроме шрифтов с иероглифами, которые являются просто самым характерным примером, имеются еще множество шрифтов, которые вы, скорее всего, никогда не будете использовать. Но здесь я не буду давать советов, экспериментируйте, если не боитесь.
11.4.6. Подключение новых шрифтов
Источники шрифтов
Итак, вы удалили ненужные вам шрифты. Теперь предположим, что вы хотите добавить в набор шрифтов вашей системы какие-то новые шрифты (скорее всего кириллические). Вначале возникает вопрос, где их взять.
Очень часто большие коллекции шрифтов поставляются вместе с некоторыми графическими, издательскими или офисными программами. Примером может служить Microsoft Office или Corel Draw, в состав поставки которого входит громадный набор шрифтов. Если пакет русифицирован, то в этом наборе шрифтов найдутся и кириллические шрифты.
В Internet тоже существует громадный выбор бесплатных или условно-бесплатных шрифтов, однако не многие из них являются кириллическими. Адреса наиболее крупных и полезных сайтов с кириллическими шрифтами перечислены ниже.
• Паратайп (http://www.paratype.com/) - Сайт отечественной компании, занимающейся созданием кириллических шрифтов. На данном сайте можно заказать как шрифты, так и диспетчеры шрифтов и редакторы шрифтов.
• Веди (http://www.vedi.d-s.ru/obzory/f_art/fart1.htm) - Сайт независимого центра по разработке и распространению кириллических шрифтов.
• sunsite.unc.edu (ftp://sunsite.unc.edu/pub/Linux/X11/fonts/) - Здесь есть несколько пакетов кириллических шрифтов.
• Freshmeat (http://freshmeat.net/) - Задайте поиск по слову "font" и вы найдете несколько пакетов кириллических шрифтов.
• www.funet.fi (http://www.funet.fi/pub/culture/russian/comp/fonts/) - Архив, предоставляющий довольно неплохой выбор кириллических шрифтов.
• КиАрхив (http://ftp.kiae.su/pub/linux/) - На КиАрхив тоже проще всего воспользоваться предоставляемой там возможностью поиска. Там имеется, в частности, классический набор шрифтов от Cronyx.
• На странице Д.Болховитянова CYR-RFX (ftp://ftp.inp.nsk.su/pub/BINP/X11/fonts/cyr-rfx/doc/README.ru.html) вы найдете разработанные им шрифты.
В этот список включены далеко не все сайты, на которых имеются кириллические шрифты.
Кроме того, существует много сайтов со шрифтами для английского и других языков. Конечно, коллекции англоязычных шрифтов гораздо богаче, чем для русского языка. Если вы хотите отыскать какой-то конкретный шрифт для латиницы или просто пополнить свою коллекцию таких шрифтов, начните поиск с одного из следующих сайтов:
,
,
,
,
.
После того, как вы скачали пакет шрифтов, можно приступить к его инсталляции. Процедура инсталляции несколько отличается для шрифтов Type 1 и True Type, поэтому рассмотрим эти два случая отдельно.
Инсталляция растровых шрифтов и шрифтов Type1
Будем предполагать, что вы можете получить права суперпользователя. В таком случае выполните команду su и проделайте следующее.
Создайте новый каталог и распакуйте в него полученный пакет шрифтов. Кстати, я встречал где-то рекомендацию, что лучше ставить новые шрифты в отдельный каталог, чтобы не нарушить работоспособность ранее установленных шрифтов. Можете последовать этому совету.
Перейдите в новый каталог (если не сделали этого ранее). Если производится инсталляция растровых шрифтов (когда в новом каталоге вы видите файлы с расширением pcf), то выполните в этом каталоге команду
[root]# mkfontdir
которая создает в каталоге со шрифтами файл fonts.dir.
Если производится инсталляция шрифтов Type1, то чтобы сделать эти шрифты доступными для X-Window, надо воспользоваться утилитой type1inst (ftp://ftp.metalab.unc.edu/pub/Linux/X11/xutils/), которая создаст файлы fonts.dir и fonts.scale. После установки утилиты просто перейдите в каталог с новыми шрифтами и запустите type1inst:
[root]# cd directory
[root]# type1inst
Далее необходимо добавить имя нового каталога со шрифтами к перечню каталогов шрифтов. Если пакет xfs у вас уже запущен, вы можете сделать это путем редактирования конфигурационного файла /etc/X11/fs/config.
Теперь надо заставить шрифт-сервер перечитать перечень каталогов, что можно сделать командой:
[root]# /etc/rc.d/init.d/xfs restart
Ваши новые шрифты должны быть теперь доступны для X.
Если вы не используете шрифт-сервер, то вам необходимо добавить имя каталога, содержащего файлы Ваших новых шрифтов, к перечню каталогов шрифтов X-сервера в файле /etc/X11/XF86Config. Это можно сделать в каком-либо текстовом редакторе, а можно с помощью команды
[root]# xset fp+ /usr/share/fonts/new
(имя каталога будет добавлено в конец списка) или
[root]# xset +fp /usr/share/fonts/new
(имя каталога будет добавлено в начало списка). После этого надо дать команду
[root]# xset fp rehash
чтобы X-сервер нашел новые шрифты.
Инсталляция шрифтов TrueType
Мы подробно рассмотрим случай, когда используется дистрибутив, основанный на Red Hat, и фонт-сервер xfs..
Создайте новый каталог и распакуйте в него полученный пакет шрифтов. Для примера будем предполагать, что новые шрифты оказались в каталоге /usr/share/fonts/ttf.
Первым делом надо проверить, что в именах файлов шрифтов не встречаются заглавные буквы и пробелы (это требование xfs). Так что получите права суперпользователя, перейдите в каталог с вновь установленными шрифтами:
[root]# cd /usr/share/fonts/ttf
и, если в именах файлов встречаются заглавные буквы, преобразуйте все имена в нижний регистр. В [П13.2] приводится небольшой скрипт для автоматического преобразования имен файлов в нижний регистр, однако у меня этот скрипт отказался работать. Но в любом случае преобразовать имена и удалить пробелы из имен файлов можно и вручную.
Далее необходимо создать в каталоге со шрифтами True Type файлы fonts.scale и fonts.dir. Это, конечно, тоже можно сделать вручную, если вы внимательно прочитали весь предыдущий материал, но я, например, не хотел бы этим заниматься. Тем более, что существует утилита ttmkfdir, которую можно найти на многих сайтах с программным обеспечением для Linux. В Redhat эта утилита включена в состав rpm-пакета Freetype. Выполните следующие команды:
[root]# /usr/sbin/ttmkfdir -o fonts.scale
[root]# mkfontdir
После этого в каталоге с новыми шрифтами True Type должны появится файлы fonts.dir и fonts.scale.
К сожалению, команды ttmkfdir и mkfontdir не всегда сообщают об ошибках, поэтому после их запуска необходимо убедиться, что нужные файлы созданы, не пусты и содержат корректно сформированные (т. е. соответствующие XLFD, смотри выше) наименования шрифтов. Как пишут авторы [П13.2, П13.13], неприятности могут возникнуть потому, что иногда файлы шрифтов могут не в полной мере соответствовать формату True Type. Если такое имеет место, то описание этого шрифта, выдаваемое по команде ttmkfdir, будет существенно отличаться от формата описаний шрифтов, определяемого стандартом XLFD. Возможно, содержащееся в файле описание шрифта не корректно. Файлы шрифтов, вызывающие такой эффект, рекомендуется просто удалить. Поэтому до создания файла fonts.scale надо запустить программу ttmkfdir без параметров. В этом случае вывод идет на экран. Длина выдаваемых строк может отличаться, но их структура должна быть одинаковой и соответствовать стандарту XLFD. Если же какой-то из файлов со шрифтами вызывает появление в выводе чего-то другого, то такой файл лучше удалить. Только после этого можно выполнять команду
[root]# ttmkfdir -o fonts.scale
Еще одна причина возникновения проблем состоит в том, что ttmkfdir почему-то сортирует имена шрифтов в файле fonts.scale в обратном порядке. Этот факт не вызывает затруднений, если вы используете команду ttmkfdir в указанном выше формате. Но если вы попытаетесь подключить декоративные шрифты, которые часто содержат изображения не для всех возможных символов, то просто дать команду
[root]# ttmkfdir -o fonts.scale
уже недостаточно. Дело в том, что по умолчанию ttmkfdir допускает отсутствие в шрифте не более 5 символов. Но имеется специальная опция (-m nnn, где nnn - число), которая позволяет увеличить допустимое число отсутствующих изображений. Если запустить ttmkfdir в следующем виде:
[root]# ttmkfdir -m 100 -o fonts.scale
то созданный в том же каталоге и при тех же файлах шрифтов файл fonts.scale получится гораздо большего объема, т. е. будет содержать больше наименований шрифтов. При этом, как раз из-за обратного порядка перечисления имен, файлы с неполным набором символов окажутся в начале файла fonts.scale. В силу этого приложения могут быть "введены в заблуждение" и "схватить" первый попавшийся (в данном случае - неполный) шрифт. Тогда вместо отсутствующих символов вы увидите просто пробелы. Впрочем, с этой проблемой нетрудно справиться. Просто после создания файла fonts.scale надо изменить порядок строк в нем, для чего после выполнения команды
[root]# ttmkfdir -m 100 -o fonts.scale
надо сделать следующее:
1. Выполнить команду [root]# tac fonts.scale › fonts.dir
2. Перенести строку с числом шрифтов из конца полученного таким образом файла fonts.dir в его начало;
3. Убедиться, что файл fonts.dir заканчивается символом конца строки.
Теперь мы имеем корректно сформированный файл fonts.dir! Но список в файле fonts.scale все еще имеет обратный порядок. Однако, поскольку эти два файла (по крайней мере в данном случае) должны быть идентичны, то остается только выполнить команду
[root]# cat fonts.dir › fonts.scale
или
[root]# cp fonts.dir fonts.scale
Следующий шаг, вообще говоря, не является обязательным, но позволяет в некоторых случаях повысить читаемость шрифтов на экране. Этот шаг заключается в создании файла fonts.alias в каталоге с TT-шрифтами (или в корректировке существующего файла). О том, как это можно сделать, говорилось выше, в разд. 11.4.5. В том же разделе упоминался скрипт, который позволяет (по словам автора интернет-страницы [П13.14] легко создать файл fonts.alias в каталоге со шрифтами True Type. Полученный с помощью скрипта файл fonts.alias может оказаться очень большим, особенно если создавали файл fonts.dir (который используется скриптом как основа для создания fonts.alias) с помощью команды ttmkfdir с опцией "-m 100". Да и без этого в нем окажется масса имен шрифтов, которые вы никогда не будете использовать. Поскольку в типичном случае вполне достаточно только кириллических шрифтов, можно попробовать удалить из fonts.alias все неиспользуемые шрифты с помощью следующей последовательности команд (оставляем только кириллические шрифты):
[root]# grep 'iso8859-5"' fonts.alias › newfonts.alias
[root]# grep 'koi8-r"' fonts.alias ›› newfonts.alias
[root]# cat newfonts.alias › fonts.alias
Возможно, этот же прием стоит применить к файлам fonts.dir и fonts.scale, только предварительно продумав все последствия. Если вы войдете в азарт и захотите провести такие же корректировки не только в каталогах со шрифтами True Type, но в других каталогах со шрифтами, то, по крайней мере, не забывайте, что нельзя просто удалить шрифты, которые имеют в качестве второго имени (синонима) названия cursor, fixed и variable.
Теперь вы можете добавить новый каталог к перечню каталогов шрифтов xfs. Пользователи дистрибутивов, основанных на Redhat, могут сделать это с помощью утилиты chkfontpath (она тоже входит в пакет Freetype):
[root]# /usr/sbin/chkfontpath -add /usr/share/fonts/ttf
Если такой утилиты нет, это можно сделать редактированием конфигурационного файла фонт-сервера xfs, а именно, файла /etc/X11/fs/config. (Помните, что имена каталогов в перечне НЕ ДОЛЖНЫ иметь слэша (/) в конце!)
После этого осталось только перестартовать фонт-сервер xfs. Если вы пользовались утилитой chkfontpath, то она осуществляет рестарт xfs автоматически. Если вы вручную редактировали перечень каталогов со шрифтами, то перестартовать xfs можно командой
[root]# /etc/rc.d/init.d/xfs restart
После того, как вы перезапустили xfs, перезапустите также X-сессию.
На этом все! Вы можете проверить, подключились ли новые шрифты с помощью команды xlsfonts. Например, если среди устанавливаемых шрифтов должны были быть шрифты arial, можно выполнить команду:
[root]# xlsfonts | grep arial
(можно также воспользоваться командой xfontsel). Если новые шрифты видны через xlsfonts, тогда они доступны и для X Window, и наоборот.
Теперь, когда шрифты True Type установлены, вы можете попробовать, как они работают, например, в Netscape.
1. Запустите Netscape.
2. Откройте окно "Preferences/Appearence/Fonts" и раскройте выпадающий список "Variable Width Fonts". Там теперь должны появиться вновь установленные шрифты (я, например, увидел "Verdana (Microsoft)", именно тот единственный ttf-шрифт, который устанавливал). Выберите один из них.
3. Разрешите масштабирование, нажав кнопку "Allow Scaling" рядом со списком "Variable Width Font".
4. Установите опцию "Use my default fonts".
5. Затем выберите размер 12 в выпадающем списке справа.
6. Щелкните по кнопке OK.
Теперь текст в окне Netscape должен отображаться выбранным Вами шрифтом.
11.5. Кириллизация shell и других программ
К сожалению, в Linux нет единой системы работы со шрифтами. Каждую отдельную программу, каждое приложение надо отдельно настраивать для того, чтобы эта программа могла использовать шрифты True Type, Type 1 или какие-то другие, почему-либо привлекательные для вас. И в каждой программе это может делаться по-своему! Я приведу здесь краткие рекомендации по русификации некоторых наиболее употребительных программ. Эти рекомендации заимствованы из [П13.1]. Однако, перечень этот далеко не полон, так что ответы на те вопросы, которые мне не удалось осветить, ищите в источниках, ссылки на которые приведены в конце книги.
Для полноценной работы с кириллицей в текстовом режиме необходимо, чтобы программы умели интерпретировать значения 8-го бита в коде ASCII (напомним, что первоначально этот код был 7-ми битным). Вот этого давайте и добьемся.
bash
Хотя для большинства программ вполне достаточно установки LANG=ru_RU.KOI8-R чтобы начать распознавать русские буквы, многие программы, основанные на библиотеке readline (например bash) все равно считают символы с кодами больше 128 особыми META-символами (пищит при вводе).
Чтобы "отучить" библиотеку readline от этого, необходимо установить три переменные.
set meta-flag on
set convert-meta off
set output-meta on
Этого можно добиться разными способами. Поскольку вы являетесь суперпользователем своего компьютера, можно определить переменную INPUTRC=, например, создав файл /etc/profile.d/readline.sh следующего содержания:
#!/bin/bash
INPUTRC="/etc/inputrc"; export INPUTRC
и сделать этот файл исполняемым. Кроме того, прописать в файле /etc/inputrc
set meta-flag on
set convert-meta off
set output-meta on
После этого библиотека readline (и bash) начнет воспринимать русские буквы.
Еще один вариант: не задавать INPUTRC=, а прописать те же значения в файле ~/.inputrc в домашнем каталоге каждого пользователя.
См. страницу man readline.
less
Если локализация не настроена (а она обязана быть настроенной), то вывод кириллицы через less можно получить, установив переменную окружения LESSCHARSET:
export LESSCHARSET=koi8-r
Это решение годится для всех 8-битовых кириллических кодировок.
При правильно настроенной локализации указывать LESSCHARSET НЕ НАДО. Более того, в ~/.lesskey надо добавить
#env
LESSCHARSET=
чтобы программа игнорировала установку LESSCHARSET= другими "глупыми" программами (к примеру, man). После этого надо запустить lesskey для получения бинарного файла ~/.less. В противном случае он не будет вызывать setlocale(LC_CTYPE,") и, как следствие, не будет icase search для русских букв.
man
В последнее время появляется все больше и больше man-статей, переведенных на русский язык, но вот отобразить их не всегда удается. Для исправления этого неудобства следует поправить соответствующие строки в /usr/lib/man.config, если этот файл есть, или правильно настроить less.
nroff
Для того, чтобы через nroff можно было "пропустить" символы кириллицы, надо использовать его с ключом -Tlatin1. Пропишите где-нибудь в стартовом скрипте (если у вас bash, то в .bashrc)
alias nroff='nroff -Tlatin1'
Просмотр некоторых файлов в mc запускается через nroff, вызов которого осуществляется по расширению имени файла. Поэтому в файле /usr/lib/mc/mc.ext следует в строке вызова nroff изменить параметр вызова с -Tascii на -Tlatin1.
ls
Если локализация настроена неправильно, то ls не будет печатать кириллические символы. В этом случае, возможно, поможет одна из следующих команд: ls -N, dir -N или ls -show-control-chars.
mc (The Midnight Commander)
Чтобы корректно отображался текст кириллицы, необходимо установить флажки в опции Полный 8-битный вывод (full 8 bits) и Полный 8-битный ввод в команде меню Настройки | Биты символов (Options | Display).
Диски Win'95 и DOS
Чтобы подмонтировать диск Windows'95 и DOS с правильной поддержкой русских букв, необходимо воспользоваться командой:
[user]$ mount -t vfat -o umask=002,noexec,gid=500,codepage=866,iocharset=koi8-r /dev/hdb1 /mnt
То есть все русские имена на диске FAT сохраняются в Codepage 866! Для работы этой опции ядро (›2.0.36) должно быть пересобрано с поддержкой NLS, кодовыми страницами CP866, NLS KOI8-R и, конечно же, с поддержкой VFAT.
Samba
Чтобы увидеть русские буквы в именах файлов на диске Samba, в файл /etc/smb.conf следует добавить строки:
[global]
character set = koi8-r
client code page = 866
preserve case = yes
short preserve case = yes
Первые две опции указывает внутреннюю кодировку имен файловой системы (client code page) и внешнюю кодировку пользователя (character set).
Следующие две опции указывают, что надо сохранять регистр длинных и коротких имен файлов.
rlogin
Удостоверьтесь, что shell на месте адресата установлена правильно. Если ваш rlogin не работает как надо по умолчанию, то используйте 'rlogin -8'.
Пропишите в стартовом скрипте (если вы используете bash, то это .bashrc)
alias rlogin='rlogin -8'
telnet
Если возникают проблемы с вводом русских символов, надо создать файл ~/.telnetrc со следующей строкой:
DEFAULT set outbinary
Вы можете встретить проблемы при работе в кодировке cp1251 - не передается маленькая русская буква "я" (ASCII-код 0xff). У протокола Telnet 0xff - это первый символ управляющей последовательности. Дабы передать собственно "я", нужно его удваивать: 0xff, 0xff. При использовании KOI8-R такая проблема отсутствует.
IrcII
Добавить в файл конфигурации ~/.ircrc следующие строчки:
/set translation russian
/set eight_bit_characters on
11.6. Кириллизация печати
До сих пор наше внимание было сосредоточено на выводе текста на экран. Однако, когда мы говорим об использовании шрифтов, нельзя совсем уж оставить в стороне вопрос о том, как можно организовать печать на принтере различными шрифтами.
В отличие от других операционных систем (например, Windows и MacOS), Linux, как и другие UNIX-системы, не имеет аппаратно-независимой подсистемы печати. Некоторые приложения сами обеспечивают поддержку печати, но большая часть приложений предполагает, что принтер обладает возможностью интерпретировать язык Adobe PostScript. Но принтеры со встроенными PostScript-интерпретаторами достаточно дороги и довольно редко встречаются в наше время. Для того, чтобы можно было использовать другие типы принтеров, была разработана специальная программа, Ghostscript, которая может интерпретировать код PostScript, преобразовывать контурный шрифт в растровый, формировать соответствующие команды для принтера, обеспечивая тем самым печать на большинстве типов принтеров.
Поскольку все версии PostScript и Ghostscript поддерживают как шрифты Type 1 и Type 42, а Ghostscript версии 4 и выше поддерживает и шрифты True Type, то больших трудностей с организацией красивой печати под Linux не возникает. По умолчанию (в Red Hat) шрифты для Ghostscript устанавливаются в каталог /usr/share/fonts/defaults/ghostscript/. Поэтому если вы хотите добавить какие-то шрифты для печати, поместите файлы новых шрифтов в этот каталог или создайте в нем символические ссылки на новые шрифты. Впрочем, можно поместить файлы шрифтов и в другие каталоги, но тогда нужно будет указывать точный путь к шрифтам в файле /usr/share/ghostscript/N.M/Fontmap, который делает шрифты доступными для Ghostscript.
Например, для того, чтобы добавить шрифт Times New Roman и его варианты, скопируйте файлы times.ttf, timesbd.ttf, timesbi.ttf, и timesi.ttf в каталог /usr/share/fonts/defaults/ghostscript/ и добавьте следующие строки в файл Fontmap
/Times New Roman (times.ttf);
/Times New Roman Bold (timesbd.ttf);
/Times New Roman Bold Italic (timesbi.ttf);
/Times New Roman Italic (timesi.ttf);
Более подробные инструкции вы найдете в документации к программе Ghostscript и в разд. 9.6.
Конечно, я рассказал далеко не обо всех моментах, связанных с подключением новых и использованием имеющихся шрифтов для системы X Window. Например, за рамками рассмотрения остались вопросы настройки шрифтов в конкретных приложениях, а также вопросы преобразования шрифтов True Type в шрифты Type1. Но все изложить невозможно, поэтому остается только отослать читателя к списку доступной литературы (см. [П13] приложения).