--- title: Шрифты и FreeBSD subtitle: Пособие authors: - author: Dave Bodenstab email: imdave@synet.net trademarks: ["freebsd", "adobe", "apple", "linux", "microsoft", "opengroup", "general"] --- = Шрифты и FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/fonts/ ifdef::env-beastie[] ifdef::backend-html5[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] :imagesdir: ../../../images/{images-path} endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [.abstract-title] Аннотация Этот документ содержит описание различных файлов шрифтов, которые могут использоваться с FreeBSD и драйвером системной консоли, системой X11, программами Ghostscript и Groff. Даются реально работающие примеры по переключению экрана системной консоли в режим 80x60 и использованию файлов шрифтов формата Type 1 с перечисленными выше прикладными программами. ''' toc::[] [[intro]] == Введение Существует много мест, где можно найти файлы шрифтов, но встает вопрос о возможных способах их использования с FreeBSD. Ответ может быть найден в результате тщательного изучения документации по тем компонентам, которые вы собираетесь использовать. На это тратится очень много времени, и это пособие является попыткой дать готовые ответы для тех, кто заинтересуется такими вопросами. [[terminology]] == Основные термины Имеется множество различных форматов файлов шрифтов и соответствующих окончаний имен файлов. Здесь обсуждаются лишь следующие из них: [.filename]#.pfa#, [.filename]#.pfb#:: Файлы шрифтов PostScript(R) type 1. Файлы [.filename]#.pfa# являются текстовым ( __A__scii) представлением, а [.filename]#.pfb# - двоичным (__B__inary). [.filename]#.afm#:: Параметры (метрики) соответствующих шрифтов типа type 1. [.filename]#.pfm#:: Метрики для принтеров соответствующих шрифтов типа type 1. [.filename]#.ttf#:: Файл шрифтов TrueType(R) [.filename]#.fot#:: Неявная ссылка на файл шрифтов TrueType (реальной информации о шрифте здесь не содержится) [.filename]#.fon#, [.filename]#.fnt#:: Файлы экранных шрифтов с побитным представлением Файлы [.filename]#.fot# используются в Windows(R) в качестве некой символической ссылки на файл со шрифтом в формате TrueType(R) ([.filename]#.ttf#). Файлы шрифтов [.filename]#.fon# также используются в Windows(R). Мне неизвестно, как можно использовать этот формат шрифтов во FreeBSD. [[font-formats]] == Какие форматы файлов шрифтов я могу использовать? То, файл шрифтов какого формата будет полезен, зависит от используемого приложения. Сама по себе FreeBSD шрифтов не использует. Прикладные программы и/или драйверы могут использовать файлы шрифтов. Вот краткий справочник по типам файлов шрифтов и приложениям/драйверам: Драйвер:: vt::: [.filename]#.hex# syscons::: [.filename]#.fnt# Приложение:: Ghostscript::: [.filename]#.pfa#, [.filename]#.pfb#, [.filename]#.ttf# X11::: [.filename]#.pfa#, [.filename]#.pfb# Groff::: [.filename]#.pfa#, [.filename]#.afm# Povray::: [.filename]#.ttf# Окончание [.filename]#.fnt# используется достаточно часто. Я полагаю, что когда кто-нибудь собирается создать файл шрифтов для своего приложения, чаще всего выбирается именно это окончание. Поэтому файлы с таким окончанием не все имеют одинаковый формат; в частности, формат файлов [.filename]#.fnt#, используемых драйвером syscons во FreeBSD, может отличаться от формата файлов [.filename]#.fnt#, встречающихся в MS-DOS(R)/Windows(R). Я даже не пытался использовать другие файлы [.filename]#.fnt#, кроме тех, что поставляются с FreeBSD. [[virtual-console]] == Настройка виртуальной консоли на режим работы 80x60 Во-первых, должен быть загружен шрифт размера 8x8. Для этого файл [.filename]#/etc/rc.conf# должен содержать строчку (измените в ней имя файла со шрифтом на соответствующий вашей локализации): [.programlisting] .... font8x8="iso-8x8" # font 8x8 from /usr/shared/syscons/fonts/* (or NO). .... Команда для переключения режимов называется man:vidcontrol[1]: [source,shell] .... % vidcontrol VGA_80x60 .... Различные программы, ориентированные на работу с экраном, такие, как man:vi[1], должны уметь определять текущие размеры экрана. Так как это делается через вызовы `ioctl` к драйверу консоли (такому, как man:syscons[4]), то размеры будут определяться правильно. Чтобы это проходило более гладко, можно включить эти команды в скрипты начальной загрузки, чтобы они выполнялись при запуске системы. Чтобы это сделать, добавьте такую строчку в [.filename]#/etc/rc.conf# [.programlisting] .... allscreens_flags="VGA_80x60" # Set this vidcontrol mode for all virtual screens .... Справочная информация: man:rc.conf[5], man:vidcontrol[1]. [[type1-fonts-x11]] == Использование шрифтов type 1 с системой X11 X11 может использовать файлы шрифтов в формате [.filename]#.pfa# или [.filename]#.pfb#. Шрифты для X11 располагаются в различных подкаталогах в [.filename]#/usr/X11R6/lib/X11/fonts#. На каждый файл со шрифтом имеется ссылка по его X11-имени в файле [.filename]#fonts.dir# в каждом таком каталоге. Существует каталог по имени [.filename]#Type1#. Самым простым способом добавить новый шрифт заключается в помещении его в этот каталог. Но лучше хранить все новые шрифты в отдельном каталоге и использовать символические ссылки для добавляемых шрифтов. Это позволяет легко управлять отдельными добавляемыми шрифтами, не путая их с изначально поставляемыми. Например: [source,shell] .... Создаем каталог для файлов шрифтов % mkdir -p /usr/local/shared/fonts/type1 % cd /usr/local/shared/fonts/type1 Помещаем сюда файлы .pfa, .pfb и .afm Кому-то может потребоваться хранить здесь также сопроводительные файлы и документацию к шрифтам % cp /cdrom/fonts/atm/showboat/showboat.pfb . % cp /cdrom/fonts/atm/showboat/showboat.afm . Обновление индексного файла со ссылками на файлы шрифтов % echo showboat - InfoMagic CICA, Dec 1994, /fonts/atm/showboat >>INDEX .... Теперь, чтобы использовать новый шрифт с X11, нужно дать доступ к файлу шрифтов и обновить файлы и именами шрифтов. Имена шрифтов в X11 выглядят следующим образом: [source,shell] .... -bitstream-charter-medium-r-normal-xxx-0-0-0-0-p-0-iso8859-1 | | | | | | | | | | | | \ \ | | | | | \ \ \ \ \ \ \ +----+- набор символов | | | | \ \ \ \ \ \ \ +- средняя ширина | | | | \ \ \ \ \ \ +- spacing | | | \ \ \ \ \ \ +- разрешение по вертикали | | | \ \ \ \ \ +- разрешение по горизонтали | | | \ \ \ \ +- пунктов | | | \ \ \ +- пиксел | | | \ \ \ foundry family weight slant width additional style .... Для каждого нового файла шрифтов необходимо создать новое имя. Если у вас есть какая-либо информация из сопроводительной документации к шрифту, то она может служить основой для создания имени. Если информации нет, то можно получить некоторую информацию от использования программы man:strings[1] над файлом шрифта. Например: [source,shell] .... % strings showboat.pfb | more %!FontType1-1.0: Showboat 001.001 %%CreationDate: 1/15/91 5:16:03 PM %%VMusage: 1024 45747 % Generated by Fontographer 3.1 % Showboat 1991 by David Rakowski. Alle Rechte Vorbehalten. FontDirectory/Showboat known{/Showboat findfont dup/UniqueID known{dup /UniqueID get 4962377 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 12 dict begin /FontInfo 9 dict dup begin /version (001.001) readonly def /FullName (Showboat) readonly def /FamilyName (Showboat) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -106 def /UnderlineThickness 16 def /Notice (Showboat 1991 by David Rakowski. Alle Rechte Vorbehalten.) readonly def end readonly def /FontName /Showboat def --stdin-- .... Пользуясь этой информацией, можно составить возможное имя: [source,shell] .... -type1-Showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1 .... Компонентами нашего имени являются: Foundry:: Давайте называть все новые шрифты `type1`. Family:: Имя шрифта. Weight:: Normal, bold, medium, semibold, и так далее. Из результата работы команды man:strings[1] похоже, что этот шрифт имеет ширину __medium__. Slant:: __r__oman, __i__talic, __o__blique, и так далее. Так как _ItalicAngle_ равен нулю, то будет использоваться __roman__. Width:: Normal, wide, condensed, extended, и так далее. Пока это не будет проверено, предполагаем __normal__. Дополнительный стиль:: Обычно опускается, но он будет указывать, что в шрифте есть декоративные заглавные буквы. Spacing:: proportional или monospaced. Используется __proportional__, потому что _isFixedPitch_ равен false. Все эти имена произвольны, но нужно стараться следовать существующим соглашениям. В программе для X11 на шрифт ссылаются по имени с применением шаблонов, так что в выбираемом имени это должно учитываться. Можно начать с простого использования [source,shell] .... ...-normal-r-normal-...-p-... .... в качестве имени, а затем использовать man:xfontsel[1] для его проверки и изменения имени на основе того, как выглядит шрифт. Итак, завершая наш пример: [source,shell] .... Делаем шрифт доступным для X11 % cd /usr/X11R6/lib/X11/fonts/Type1 % ln -s /usr/local/shared/fonts/type1/showboat.pfb . Редактируем файлы fonts.dir and fonts.scale, добавляя строку, описывающую шрифт и увеличивая количество шрифтов в первой строке. % ex fonts.dir :1p 25 :1c 26 . :$a showboat.pfb -type1-showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1 . :wq fonts.scale идентичен fonts.dir... % cp fonts.dir fonts.scale Указываем X11, что произошли изменения % xset fp rehash Проверяем новый шрифт % xfontsel -pattern -type1-* .... Справочная информация: man:xfontsel[1], man:xset[1], The X Windows System in a Nutshell, http://www.ora.com/[O'Reilly & Associates]. [[type1-fonts-ghostscript]] == Использование шрифтов type 1 с пакетом Ghostscript Ghostscript ссылается на шрифт через свой файл [.filename]#Fontmap#. Он должен быть подправлен так же, как и файл [.filename]#fonts.dir# в случае X11. Ghostscript может использовать файлы шрифтов в форматах [.filename]#.pfa# или [.filename]#.pfb#. Взяв шрифт из предыдущего примера, его можно использовать с Ghostscript вот так: [source,shell] .... Помещаем файл со шрифтом в каталог со шрифтами Ghostscript % cd /usr/local/shared/ghostscript/fonts % ln -s /usr/local/shared/fonts/type1/showboat.pfb . Редактируем Fontmap, чтобы Ghostscript знал о шрифте % cd /usr/local/shared/ghostscript/4.01 % ex Fontmap :$a /Showboat (showboat.pfb) ; % From CICA /fonts/atm/showboat . :wq Используем Ghostscript для проверки шрифта % gs prfont.ps Aladdin Ghostscript 4.01 (1996-7-10) Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Loading Times-Roman font from /usr/local/shared/ghostscript/fonts/tir_____.pfb... /1899520 581354 1300084 13826 0 done. GS>Showboat DoFont Loading Showboat font from /usr/local/shared/ghostscript/fonts/showboat.pfb... 1939688 565415 1300084 16901 0 done. >>showpage, press to continue<< >>showpage, press to continue<< >>showpage, press to continue<< GS>quit .... Справочная информация: [.filename]#fonts.txt# из дистрибутива Ghostscript 4.01 [[type1-fonts-groff]] == Использование шрифтов в формате type 1 с программой Groff Теперь, когда новый шрифт может быть использован как с X11, так и в Ghostscript, как использовать его с программой Groff? Во-первых, так как мы имеем дело со PostScript(R)-шрифтами формата type 1, то подходящим устройством Groff является __ps__. Для каждого шрифта, который может использоваться программой Groff, должен быть создан файл шрифта. Имя шрифта для Groff является просто именем файла из каталога [.filename]#/usr/shared/groff_font/devps#. В нашем примере файлом шрифта может быть [.filename]#/usr/shared/groff_font/devps/SHOWBOAT#. Файл должен быть создан с помощью утилит, поставляемых с программой Groff. Первой утилитой является `afmtodit`. Обычно она не устанавливается, так что она должна быть получена из дистрибутива с исходными текстами. Я обнаружил, что нужно изменить первую строку файла, что я делал так: [source,shell] .... % cp /usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.pl /tmp % ex /tmp/afmtodit.pl :1c #!/usr/bin/perl -P- . :wq .... Эта утилита создаст файл шрифтов для Groff из файла метрик (с окончанием [.filename]#.afm#). Продолжая с нашим примером: [source,shell] .... Многие файлы .afm в формате Mac ... строки разделены символом ^M. Нам нужно преобразовать их в разделитель ^J в стиле UNIX(R) % cd /tmp % cat /usr/local/shared/fonts/type1/showboat.afm | tr '\015' '\012' >showboat.afm Теперь создаем файл шрифтов groff % cd /usr/shared/groff_font/devps % /tmp/afmtodit.pl -d DESC -e text.enc /tmp/showboat.afm generate/textmap SHOWBOAT .... Теперь к шрифту можно обращаться по имени SHOWBOAT. Если в системе для управления принтерами используется программа Ghostscript, то больше ничего делать не нужно. Однако, если используются настоящие PostScript(R)-принтеры, то для использования шрифта его нужно загрузить в принтер (если только в принтере шрифт showboat не встроен или не имеется на диске со шрифтами). Последний шаг заключается в создании загружаемого шрифта. Утилита `pfbtops` используется для создания шрифта в формате [.filename]#.pfa#, а файл для [.filename]#загрузки# изменяется для указания нового шрифта. Файл для [.filename]#загрузки# должен ссылаться на внутреннее имя шрифта. Оно может быть легко определено из файла шрифтов groff, как это показывается здесь: [source,shell] .... Создание файла шрифта .pfa % pfbtops /usr/local/shared/fonts/type1/showboat.pfb >showboat.pfa .... Конечно, если файл [.filename]#.pfa# уже имеется, для его использования создаем символическую ссылку на него. [source,shell] .... Получение внутреннего имени шрифта % fgrep internalname SHOWBOAT internalname Showboat Указываем утилите groff, что шрифт должен быть загружен % ex download :$a Showboat showboat.pfa . :wq .... Для тестирования шрифта: [source,shell] .... % cd /tmp % cat >example.t <example.ps Для использования с ghostscript/ghostview % ghostview example.ps Для его печати % lpr -Ppostscript example.ps .... Справочная информация: [.filename]#/usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.man#, man:groff_font[5], man:groff_char[7], man:pfbtops[1]. [[convert-truetype]] == Преобразование файлов шрифтов TrueType в формат groff/PostScript для использования с groff Потенциально это требует некоторых усилий, просто потому что зависит некоторых утилит, которые в качестве части системы не устанавливаются. Это: `ttf2pf`:: Утилита для преобразования TrueType в PostScript. Она позволяет преобразовать шрифт TrueType в метрику шрифта в текстовом формате (файл [.filename]#.afm#). + Доступна по адресу http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf/[http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf/]. Замечание: Эти файлы являются PostScript-программами и должны быть скачаны на диск щелчком на ссылке при нажатой клавише kbd:[Shift]. В противном случае для их просмотра ваш браузер может попытаться запустить программу ghostview. + Интерес представляют следующие файлы: ** [.filename]#GS_TTF.PS# ** [.filename]#PF2AFM.PS# ** [.filename]#ttf2pf.ps# + Смесь верхнего/нижнего регистров присутствует из-за того, что эти файлы предназначены и для DOS. [.filename]#ttf2pf.ps# использует остальные с именами в верхнем регистре, так что при переименовании это нужно учитывать. (На самом деле [.filename]#GS_TTF.PS# и [.filename]#PFS2AFM.PS# предположительно являются частью дистрибутива Ghostscript, но их легко использовать как отдельные утилиты. В поставку FreeBSD они не включены.) Вы можете также установить их в каталог [.filename]#/usr/local/shared/groff_font/devps#(?). `afmtodit`:: Создает файлы шрифтов для использования с программой Groff из текстовых файлов с метриками шрифта. Она обычно располагается в каталоге [.filename]#/usr/src/contrib/groff/afmtodit# и для ее использования требуется проделать некоторую работу. + [NOTE] ==== Если вы избегаете работать в дереве [.filename]#/usr/src#, просто скопируйте содержимое вышеупомянутого каталога во временный рабочий каталог. ==== + Во рабочем каталоге вам нужно построить утилиту. Просто введите такую команду: + [source,shell] .... # make -f Makefile.sub afmtodit .... + Вам может также потребоваться скопировать [.filename]#/usr/contrib/groff/devps/generate/textmap# в [.filename]#/usr/shared/groff_font/devps/generate#, если его не существует. Как только эти утилиты готовы, вы можете начать: . Создайте файл [.filename]#.afm# по такой команде: + [source,shell] .... % gs -dNODISPLAY -q -- ttf2pf.ps TTF_name PS_font_name AFM_name .... + Здесь _TTF_name_ обозначает ваш файл со шрифтом TrueType, _PS_font_name_ является именем для файла [.filename]#.pfa#, _AFM_name_ задает имя для файла [.filename]#.afm#. Если вы не укажете имена выходных файлов, для форматов [.filename]#.pfa# или [.filename]#.afm#, то по умолчанию будут использоваться имена, получаемые из имени файла со шрифтом TrueType. + При этом также будет создан файл [.filename]#.pfa#, текстовый файл с метриками PostScript-шрифта (([.filename]#.pfb# для двоичного представления). Это не не обязательно, но может быть (я думаю) полезным для сервера шрифтов. + Например, для преобразования шрифта 30f9 Barcode с именами файлов по умолчанию, воспользуйтесь следующей командой: + [source,shell] .... % gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf Aladdin Ghostscript 5.10 (1997-11-23) Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Converting 3of9.ttf to 3of9.pfa and 3of9.afm. .... + Если вы хотите, чтобы преобразованные шрифты сохранялись в файлы [.filename]#A.pfa# and [.filename]#B.afm#, то выдайте такую команду: + [source,shell] .... % gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf A B Aladdin Ghostscript 5.10 (1997-11-23) Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Converting 3of9.ttf to A.pfa and B.afm. .... . Создайте PostScript-файл для Groff: + Смените текущий каталог на [.filename]#/usr/shared/groff_font/devps# для облегчения запуска упоминаемых далее программ. Для этого вам может понадобиться иметь привилегии администратора системы. (Или, если вы избегаете здесь работать, обязательно посмотрите файлы [.filename]#DESC#, [.filename]#text.enc# и [.filename]#generate/textmap# в этом каталоге.) + [source,shell] .... % afmtodit -d DESC -e text.enc file.afm \ generate/textmap PS_font_name .... + Здесь [.filename]#file.afm# является файлом _AFM_name_, созданным программой `ttf2pf.ps` выше, а _PS_font_name_ является именем шрифта, используемым в той команде, так же, как и имя, которое будет использовать утилита man:groff[1] для ссылки на этот шрифт. Например, полагая, что вы использовали первую команду `tiff2pf.ps` выше, то шрифт 3of9 Barcode может быть создан при помощи такой команды: + [source,shell] .... % afmtodit -d DESC -e text.enc 3of9.afm \ generate/textmap 3of9 .... + Проверьте, что полученный файл _PS_font_name_ (к примеру, [.filename]#3of9# из примера выше) расположен в каталоге [.filename]#/usr/shared/groff_font/devps#, скопировав или перенеся его сюда. + Заметьте, что если [.filename]#ttf2pf.ps# назначает имя шрифта, используя один из найденных в файле шрифта TrueType, а вы хотите использовать другое имя, то вы должны отредактировать файл [.filename]#.afm# до запуска команды `afmtodit`. Это имя к тому же должно совпадать с тем, что используется в файле Fontmap, если вы собираетесь перенаправлять вывод man:groff[1] утилите man:gs[1]. [[truetype-for-other-programs]] == Можно ли использовать шрифты в формате TrueType с другими программами? Формат TrueType используется в Windows, Windows 95 и на компьютерах Macintosh. Он достаточно популярен и в этом формате имеется большое количество шрифтов. К сожалению, я знаю лишь несколько программ, которые могут использовать этот формат: на ум приходят Ghostscript и Povray. Его поддержка в программе Ghostscript, согласно документации, находится в зачаточном состоянии и получаемый результат хуже того, что получается при использовании шрифтов type 1. Программа Povray версии 3 также может использовать шрифты TrueType, но я очень сомневаюсь, что много кто создает документы как последовательность анимированных страниц :-). Такая весьма печальная ситуация может вскоре измениться. В рамках проекта http://www.freetype.org/[FreeType Project] в настоящее время разрабатывается полезный набор инструментов для работы с FreeType: * Сервер шрифтов `xfsft` для X11 может работать и со шрифтами TrueType, и с обычными шрифтами. Хотя в настоящее время он еще находится в стадии отладки, но его уже можно использовать. Посмотрите http://www.dcs.ed.ac.uk/home/jec/programs/xfsft/[страницу Juliusz Chroboczek], чтобы получить более полную информацию. Указания по переносу на FreeBSD можно найти на странице http://math.missouri.edu/~stephen/software/[Стивена Монтгомери] (Stephen Montgomery), посвященной программному обеспечению. * xfstt является еще одним сервером шрифтов для X11, доступный по адресу link:ftp://sunsite.unc.edu/pub/Linux/X11/fonts[ftp://sunsite.unc.edu/pub/Linux/X11/fonts]. * Программа, которая называется `ttf2bdf`, может генерировать BDF-файлы, которые можно использовать в системе X Window, из файлов шрифтов TrueType. Выполнимые файлы Linux могут находиться по адресу link:ftp://crl.nmsu.edu/CLR/multiling/General[ftp://crl.nmsu.edu/CLR/multiling/General]. * и другие ... [[obtaining-additional-fonts]] == Где можно найти дополнительные шрифты? Много шрифтов можно найти в сети Интернет. Они либо абсолютно бесплатны, либо условно-бесплатны. В добавок, множество шрифтов находится в категории [.filename]#x11-fonts/# Коллекции Портов. [[additional-questions]] == Дополнительные вопросы * Для чего предназначены файлы [.filename]#.pfm#? * Можно ли получить файл [.filename]#.afm# из файла [.filename]#.pfa# или [.filename]#.pfb#? * Как получить файлы преобразования символов Groff для PostScript-шрифтов с нестандартными названиями символов? * Можно ли настроить xditview и устройства devX?? на работу всех новых шрифтов? * Хорошо бы иметь примеры использования шрифтов TrueType с программами Povray и Ghostscript.