Шрифты TrueType (Одна из немногих хороших вещей в Windows)

По той интересной причине, что ребята в Redmond-е значительно сильнее заботятся о внешнем виде своего программного обеспечения (чем о нормальности внутреннего содержания ;) они встроили поддержку шрифтов TrueType в Windows. Windows 9x и почти все остальные варианты Windows поставляются сейчас со шрифтами Arial, Times New Roman, и Courier New, которые являются почти полными аналогами шрифтов Helvetica, Times и Courier. Шрифты TrueType - векторные, поэтому они выглядят хорошо при больших размерах, и они прекрасно описаны, поэтому они хорошо читаются даже при очень маленьких размерах. Многие Windows-программы поставляются с дюжинами шрифтов TrueType. Не используйте пока ваш Windows CD, как горючее для микроволновой печи, сначала достаньте оттуда шрифты.

К великому сожалению, в XFree86 3.x не встроена поддержка шрифтов TrueType, поэтому вам придется самим ее добавить. Однако, эта поддержка встроена в XFree86 версий 4.x (см. раздел Разд. XFree86 версий 4.x). Это означает, что вам надо установить сервер шрифтов, поддерживающий TrueType, и, конечно, сами шрифты. Вы не найдете хороших шрифтов ни в одном дистрибутиве. Наиболее вероятная причина этого - ни один хороший качественный шрифт до сих пор не имеет подходящей для этого открытой лицензии.

Делаем шрифты TrueType доступными

Давайте начнем со шрифтов. Для этого подойдет любой шрифт TrueType, включенный в любую реализацию MS Windows. Не забудьте, что текстовые процессоры и другие программы тоже могут включать в себя свои шрифты. Шрифты MacOS для этого не подойдут. Существуют также несколько наборов "бесплатных" шрифтов, которые вы можете скачать из сети, если вы уже сожгли свой CD с Windows (см. ссылки в разделе3 Разд. Ссылки).

Для того, чтобы использовать TrueType, шрифты должны быть всегда доступны серверу шрифтов. Это означает, что они должны быть на файловой системе, которая всегда подключена. Я бы не советовал вам использовать Windows-раздел, если у вас система с двойной загрузкой. Шрифты лучше скопировать в Linux-раздел. Во-первых, станем пользователем root при помощи команды su:

 # su -
 # mkdir -p /usr/local/share/fonts/ttfonts
 

Теперь перейдем в наш новый каталог:

  # cd  /usr/local/share/fonts/ttfonts
 

Затем перенесите шрифты в этот каталог, например, скопировав их из вашей Windows-системы:

 # cp /mnt/<путь_к_шрифтам>/*ttf  .
 

или загрузив те, которые доступны прямо в Microsoft. Эти шрифты поставляются в саморазжимающихся zip-архивах. Вы также можете установить их в linux-е (для этого возьмите те шрифты, которые предназначены для Windows 3.1):

 # ls *exe | xargs -n 1 unzip -L
 

Опция '-L' преобразует имена шрифтов в нижний регистр (это необходимо для того, чтобы нормально работали xfsft и xfs из Redhat). Заметьте, что текущая версия утилиты zip в Linux не работает с 32-битными архивами шрифтов для Win9x. (Также, кажется, что Microsoft на этом сайте больше не поддерживает 16-битные шрифты Arial, Courier и Times-Roman.) Вы можете скачать RPM с Веб-Шрифтами, который содержит часть TrueType шрифтов Microsoft, по этому адресу. В нем есть достаточно шрифтов для удовлетворения потребностей Netscape и других веб-обозревателей.

Затем добавьте новый каталог TrueType шрифтов к FontPath вашего X-сервера:

FontPath        "/usr/local/share/fonts/ttfonts"
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"
 

Серверы шрифтов

Существует несколько различных версий серверов шрифтов, которые нам подойдут: xfstt, xfsft, а также подправленная Redhat версия xfs, основанная на xfsft. Несмотря на похожесть имен, это абсолютно различные программы. Скорее всего, ваш дистрибутив включает в себя один из этих пакетов, и, возможно, часть из них вы уже установили.

Раньше, серверы шрифтов использовать для передачи шрифтов по сети. В этом случае шрифты могли находиться на одной машине, и клиенты могли обращаться к ним по мере необходимости. Однако, в настоящее время разработчики встроили в них возможность вывода шрифтов (Эта возможность уже встроена в XFree86 4.x, поэтому вам не понадобится отдельный сервер шрифтов, если вам нужна лишь поддержка TrueType)

xfstt

Один из таких серверов шрифтов - xfstt. xfstt был создан специально для работы с шрифтами TrueType.

Установка

xfstt очень просто установить. Сначала, загрузите его из сети, или проверьте CD с вашим дистрибутивом. Самую свежую версию можно найти по адресу http://metalab.unc.edu/pub/Linux/X11/fonts/

После того, как вы получите архив, разархивируйте его:

 $ tar -zxvf xfstt-*tgz
 

Потом соберите и установите его. Прочтите файл INSTALL, в нем есть краткие инструкции, но там все достаточно просто.

Все, что вам надо сделать, это запустить команды:

 # make
 # make install
 

Запустите xfstt, набрав

 # xfstt --sync        # обновляет базу данных шрифтов xfstt
 # xfstt &             # запускает xfstt в фоновом режиме.
 

xfstt должен быть запущен до запуска X-сервера. После того, как это все нормально заработает, вы можете добавить эти строки в файл /etc/rc.d/rc.local, или любой другой подходящий для этого инициализационный скрип. Затем наберите:

 $ xset +fp unix/:7101     # сообщить X о xfstt.
 

или добавьте:

FontPath "unix/:7101"
  

в ваш файл XF86Config для того, чтобы сообщить X о новом шрифтовом сервисе. Запускайте команду xfstt --sync каждый раз при изменении переменной FontPath или содержимого каталога шрифтов.

Изменение размера шрифта, устанавливаемого по умолчанию

Если ваши шрифты TrueType будут слишком мелки, то вам, наверняка, помогут следующие команды.

Добавьте опцию -dpi к командной строке вашего Х-сервера (см. раздел 3, чтобы узнать как это сделать.)

Используйте ключ --res для того, чтобы указать xfstt увеличить разрешение экрана по умолчанию. Используйте следующую командную строку:

 # xfstt --res 120
 

xfs, входящий в состав дистрибутива Redhat

В комплект дистрибутива RedHat (начиная с версии 6.0), а также производных ему (Mandrake, и т.п.) входит специальная измененная версия пакета xfs - сервера шрифтов XFree86, а также подправленные версии X-серверов. Этот исправленный xfs включает в себя патч xfsft, который, в свою очередь, основан на библиотеке FreeType Font. Этот xfs делает практически то же самое, что и xfstt. xfs обрабатывает шрифты Truetype и Type 1, а также обычные шрифты X Window.

Если ваш дистрибутив основан на RedHat, то у вас уже должен быть установлен xfs. Если нет, то он находится в пакете XFree86-xfs*rpm. Для того, чтобы убедиться в том, что он работает в качестве стандартного сервиса, используйте ntsysv или:

 # chkconfig --add xfs
 

Теперь xfs будет запускаться при каждой загрузке системы.

Установка переменной FontPath для xfs

Стандартная установка xfs в RedHat работает со шрифтами через Доменные Сокеты Unix (Unix Domain Socket). Мы должны указать X-серверу, где искать xfs, а, соответственно, и шрифты. FontPath в файле /etc/X11/XF86Config должен содержать строку:

 FontPath   "unix/:-1" 

Так, по крайней мере, сделано в стандартной установке. Здесь приводится ссылка на сокет, на котором находится xfs. Вы можете также включить сюда ссылки на другие каталоги, но их будет обрабатывать X-сервер, а не xfs. В стандартной установке RedHat 6.x это делается по умолчанию, но, если вы обновляете старую версию, то вам придется указать эту строку вручную!

Переменная FontPath, которую использует xfs, находится в отдельном файле /etc/X11/fs/config. В этом файле находится список каталогов со шрифтами. Он не имеет никакого отношения к FontPath в XF86Config. Вы можете либо добавить каталоги вручную, либо использовать для этого команду chkfontpath:

 # chkfontpath --add /usr/local/share/fonts/ttfonts
 

Переменная FontPath должна быть задана до запуска chkfontpath. Соответствующая секция файла /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

 

Подготовка шрифтов

Нам надо сделать кое-что еще перед тем, как использовать шрифты TrueType. Для использования xfs должны быть выполнены некоторые правила. Во-первых, имена файлов шрифтов должны быть написаны маленькими буквами. Во-вторых, для работы надо создать пару файлов.

Используйте команду su для того, чтобы стать пользователем root, и перейдите в каталог со шрифтами TrueType:

 # su -
 # cd /usr/local/share/fonts/ttfonts
 

Если у вас там есть шрифты с большими буквами в именах, то вам надо использовать следующий скрипт для того, чтобы преобразовать все имена в нижний регистр:


 #!/bin/sh
 #
 ## -------- преобразование букв имен файлов в строчные ---------
 
 ls * | while read f
  do
    if [ -f $f ]; then
      if [ "$f" != "`echo \"$f\" | tr A-Z a-z`" ]; then
       # Внимание, файл 'This' будет перезаписан файлом 'this'!
       mv -iv "$f" "`echo \"$f\" | tr A-Z a-z`"
      fi
    fi
  done

 ## eof
 
 

Обратите внимание на символы -- очень важны обратные апострофы! Уберите из имен файлов все пробелы. После этого создайте файлы fonts.dir и fonts.scale. Это можно сделать при помощи следующих команд:

 # ttmkfdir -o fonts.scale
 # mkfontdir
 

Теперь у вас в каталоге с TrueType-шрифтами должны появиться файлы fonts.dir и fonts.scale. Команда ttmkfdir входит в состав RPM Freetype, и ее надо запускать до запуска mkfontdir. Эти команды не всегда выдают сообщения об ошибках, поэтому надо убедиться в том, что они создали не пустые файлы:

 $ ls -l fonts.*
  -rw-r--r--  1 root   root    11657 Aug 17 10:31 fonts.dir
  -rw-r--r--  1 root   root    11657 Aug 17 10:31 fonts.scale
 

Если у вас возникли проблемы, то используйте опцию -m команды ttmkfdir. В результате из файлов шрифтов будут отброшены все плохие символы. Задайте число 50 или 100 (ttmkfdir -m 50). Полученные файлы являются текстовыми, и вы можете на них взглянуть:

 $ less  fonts.dir
  114
  webdings.ttf  -microsoft-Webdings-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-ascii-0
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-fcd8859-15
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-15
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-9
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-1
 [...]
 

После этого обновитье переменные FontPath вашего xfs (это может быть не обязательно в случае XFree86 4.x) и X-сервера:

 # /etc/rc.d/init.d/xfs restart
 $ xset +fp /usr/local/share/fonts/ttfonts
 $ xset fp rehash
 

Запускайте первую и последнюю команды каждый раз при добавлении или удалении шрифтов. Команда xset +fp необходима только в тех случаях, когда вы добавляете новый каталог шрифтов к существующим.

Теперь все должно работать. Проверьте доступность шрифтов командой:

 $ xlsfonts | less
 

или проверьте их при помощи xfontsel, или gfontsel. Если их видит xlsfonts, то они должны быть доступны X и наоборот. Если их нет, то попоробуйте перезапустить X клавишами Ctrl-Alt-BS.

xfsft

xfsft - это решение для работы с TrueType, предложенное Juliusz Chroboczek. xfsft основан на библиотеке работы со шрифтами FreeType, которая разработана Mark Leisher. Также существует патч для xfs XFree86, и связанная с ним библиотека -- xfs + ft. xfs, входящий в состав Redhat является на самом деле xfsft с небольшими изменениями. Более того, XFree86 версий 4.x включает в себя модуль работы со шрифтами freetype, который также сделан Juliusz Chroboczek.

Сборка xfsft требует наличия части исходных текстов XFree86 (кроме самих исходных текстов xfsft), так что это не очень быстрое занятие. Инструкции по сборке и настройке xfsft находятся в самом файле исходных текстов, поэтому я не буду вдаваться в подробности. Там все достаточно просто. На домашней странице xfsft также есть ссылки на уже собранные программы (см. выше).

Заметьте, что xfsft требует наличия файлов fonts.scale и fonts.dir. Файл fonts.scale можно создать вручную (уф!), или при помощи утилиты ttmkfdir. Она не входит в состав xfsft, но вы найдете ее здесь или, возможно, на других известных Linux-сайтах. Она также входит в состав RPM Freetype в RedHat.

Вам необходимо настроить файл конфигурации. Ниже приведен пример:

-----------------------------------------------------

clone-self = off
use-syslog = off

client-limit = 20

catalogue = /usr/local/share/font/ttfonts

error-file = /home/jec/fonts/xfs.errors

# в деципунктах
default-point-size = 120

# x,y
default-resolutions = 100,100,75,75

-----------------------------------------------------

 

После этого вы можете запустить:

 # xfs -port 7100 -config /путь/к/вашему/файлу/конфигурации &
 

Затем вы можете добавить xfsft к переменной FontPath вашего X-сервера:

 $ xset +fp tcp/localhost:7100
 

Если все пойдет хорошо, то добавьте эту строку к переменной FontPath вашего файла XF86Config.

Файл fonts.alias

fonts.alias - это еще один конфигурационный файл, который можно использовать для изменения способа работы со шрифтами. Подобно файлам fonts.scale и fonts.dir, файл fonts.alias должен быть в том же каталоге, что и шрифты, к которым вы задаете алиасы. Этот файл не обязятелен, но он может решить некоторые проблемы. Ниже приведен пример строки из файла /usr/X11R6/lib/X11/fonts/misc/fonts.alias в системе Redhat:

 fixed    -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1
 

fixed - это алиас. При каждом запросе мы на самом деле получаем определение шрифта из второй колонки. Шрифт слишком мал? Мы просто изменяем определение шрифта. (Внимание: этот файл критичен для работы системы, по крайней мере в RedHat.) Этот принцип справедлив для всех шрифтов, включая и TrueType. На самом деле, если у вас нет TrueType шрифтов, вы можете использовать эту хитрость для подстановки подобного ему шрифта Type 1, или другого шрифта, алиас которого ссылается на TrueType.

Файл fonts.alias очень важен для некоторых программ, которые не совсем правильно работают с данными, которые есть в файле fonts.scale. Одной из таких программ является Netscape. Если у вас нет файла fonts.alias, то вы заметите, что Netscape показывает размеры шрифтов от 0 до 12. Это можно исправить при помощи fonts.alias. Вы также можете заметить, что, если вы зададите другой размер в опции scalable font в пункте меню Preferences, 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. Ниже приведена его часть (касающаяся Arial):


 -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. Обратите внимание на различие поля pointsize записей первой и второй колонок первых двух строк. В первой колонке в этом поле написано "6", а во второй - "9". Таким образом, можно обойти синдром "очень мелких шрифтов" Netscape. Подправьте этот файл по вашему вкусу, разрешению экрана и т.п.

Этот файл можно создать вручную при помощи текстового редактора, или, что проще, при помощи специальных скриптов, использующих sed и awk. Прекрасное обсуждение содержимого этого файла есть здесь. Там же есть ссылка на python-скрипт, который может почти автоматически создать этот файл прямо на том сайте.