Как устанавливать шрифты Type 1 в teTeX

Что нужно иметь

  1. Установленный и работающий teTeX. Рассказ про версию 0.9. Если у вас 0.4, все практически так же. Могут немного отличаться пути к файлам, ну, и PDFTEX у вас отсутствует.
  2. Шрифты, которые будем устанавливать :-) Сами шрифты бывают в файлах .pfa или .pfb. Это совершенно одно и то же. Известные мне бесплатные русские шрифты формата Type 1 перечислены на моей TEX-страничке.
  3. Метрики шрифтов. Для каждого шрифта должен быть файл с метриками (.afm). Если .afm у вас нет, можно их сгенерить из шрифта, например, при помощи Ghostscript (см. скрипт printafm). Но это лишит вас информации о кернинге, так что лучше ищите настоящие .afm. Все коммерческие шрифты должны иметь метрики в комплекте.

Обозначения

Далее под $TEXMF понимается каталог, в который у вас установлен teTeX. Это может быть /usr/lib/texmf, /usr/local/teTeX и т.п.

Что мы будем делать

Конечная цель наших трудов -- создание стилевого пакета, который можно подключить командой, например,

\usepackage{localps}

и получить в результате текст, набранный Type 1 (POSTSCRIPT) шрифтами. При этом команды \textrm, \textsf, \textit, \texttt и т.д. будут работать по-прежнему, но выбираться будут Type1 шрифты. Для этого нам нужно иметь три шрифтовых гарнитуры: нормальную, без засечек и моноширинную. Каждая должна включать в себя несколько шрифтов: прямой, наклонный, курсив, полужирный, жирный и их сочетания. Если ваш шрифт не включает все возможные варианты -- большой беды в этом не будет, можно будет использовать подстановки. Скажем, если некоторый шрифт есть только в прямом, наклонном, и прямом полужирном начертании -- то вместо курсива можно будет подставить наклонный, вместо наклонного полужирного -- прямой полужирный или наклонный светлый. В таком духе.

Использование Type 1 шрифтов позволит вам:

Шрифты

Будем подключать три шрифта: College в качестве основного (roman), Textbook в качестве шрифта без засечек (sans serif), Courier в качестве моноширинного шрифта (typewriter). Составляем табличку соответствия имен файлов и названий шрифтов:

КаталогФайлШрифт
Collegecolle10College-Bold
Collegecolle8College-Italic
Collegecolle9College
Textbooktextb18Textbook-Italic
Textbooktextb19Textbook
Textbooktextb20Textbook-Bold
Couriercrr35__kCourierKOIC
Couriercrr36__kCourierKOIC-Oblique
Couriercrr55__kCourierKOIC-Bold
Couriercrr56__kCourierKOIC-BoldOblique

Как устанавливать

  1. Придумываем название поставщика шрифтов. Пусть будет local.
  2. Создаем каталоги: $TEXMF/fonts/{type1,afm}/{College,Textbook,Courier} и раскладываем туда файлы .pfb и .afm, соответственно.
  3. Создаем вектор кодировки шрифтов. Дело это муторное, но, во-первых, несложное, во-вторых, делается только один раз, а используется этот для всех шрифтов с одинаковым названием символов. Создаем каталог $TEXMF/dvips/local и кладем туда файлы adobe2alt.enc, iso2alt.enc. Первый вектор я делал для Adobe Standard Cyrillic Font Specification. Второй -- для дикого, но не редкого случая, когда в шрифте русские буквы называются именами соответствующих букв Latin-1.

    Если вам встретится шрифт, у которого русские буквы будут называться еще как-то, то вам придется написать еще один вектор кодировки. Делать это несложно. В вектор пишутся названия символов шрифта. Их можно посмотреть, например, Ghostscript'ом (см. prfont.ps). Позиции символов в векторе соответствуют их кодам (альтернативная кодировка в моем случае).

  4. Делаем из адобовских метрик .afm TEX'овские .tfm. Раскладываем их в $TEXMF/fonts/tfm/local/{College,Textbook,Courier}. Их имена должны совпадать с именами файлов .pfb. Для каждого файла метрики filename.afm) выполняем:
    $ afm2tfm filename.afm -v filename.vpl -p adobe2alt.enc filename.ftm

    В получившиеся файлы .vpl дописываем лигатуры <<, >>, -- и --- (кроме шрифта "пишущей машинки", то есть, Courier). Делается так. Ищем секцию LIGTABLE, и делаем ее выглядящей (для альтернативной внутренней кодировки TEX'а) так:

    (LIGTABLE
       (LABEL O 74) (comment less)
       (LIG O 74 O 363)
       (STOP)
       (LABEL O 76) (comment greater)
       (LIG O 76 O 364)
       (STOP)
       (LABEL O 55) (comment hyphen)
       (LIG O 55 O 173)
       (STOP)
       (LABEL O 173) (comment endash)
       (LIG O 55 O 174)
       (STOP)
       )
    	  

    Она означает:

  5. Генерим метрики TEX (.tfm):
    $ vptovf filename.vpl /dev/null filename.tfm
  6. Полученные .tfm раскладываем в $TEXMF/fonts/tfm/local/{College,Textbook,Courier}.
  7. К $TEXMF/dvips/base/psfonts.map дописываем такое:
    colle10 College-Bold " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <colle10.pfb
    colle8 College-Italic " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <colle8.pfb
    colle9 College " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <colle9.pfb
    crr35__k CourierKOIC " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <crr35__k.pfb
    crr36__k CourierKOIC-Oblique " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <crr36__k.pfb
    crr55__k CourierKOIC-Bold " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <crr55__k.pfb
    crr56__k CourierKOIC-BoldOblique " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <crr56__k.pfb
    textb18 Textbook-Italic " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <textb18.pfb
    textb19 Textbook " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <textb19.pfb
    textb20 Textbook-Bold " AdobeToAltEncoding ReEncodeFont " <adobe2alt.enc <textb20.pfb
    	  

    (Для некоторых шрифтов вместо "<файл.pfb" может понадобиться "<<файл.pfb", чтобы они корректно вставлялись в PDF. По умолчанию в PDF вставляются только используемые символы, "<<" вставляет шрифт целиком.)

  8. Если у вас стоит PDFTEX (например, teTeX-0.9), то надо познакомить и его со свежеустановленными шрифтами. Дописываем к $TEXMF/pdftex/base/tetex.map:
    colle10 College-Bold 10 <colle10.pfb adobe2alt.enc
    colle8 College-Italic 42 <colle8.pfb adobe2alt.enc
    colle9 College 10 <colle9.pfb adobe2alt.enc
    crr35__k CourierKOIC 3 <crr35__k.pfb adobe2alt.enc
    crr36__k CourierKOIC-Oblique 3 <crr36__k.pfb adobe2alt.enc
    crr55__k CourierKOIC-Bold 3 <crr55__k.pfb adobe2alt.enc
    crr56__k CourierKOIC-BoldOblique 3 <crr56__k.pfb adobe2alt.enc
    textb18 Textbook-Italic 8 <textb18.pfb adobe2alt.enc
    textb19 Textbook 8 <textb19.pfb adobe2alt.enc
    textb20 Textbook-Bold 8 <textb20.pfb adobe2alt.enc
    	  

    В tetex.map могут уже быть определения для ваших шрифтов. Тщательно их оттуда удалите и добавьте вышеуказанные.

    Формат этих строчек, из README от PDFTEX'a:

    Each line in this file should contain these fields in fixed order:

    `tex_name base_name flags fname encoding_file'

    where

    `tex_name' is the TFM name

    `base_name' is the PostScript base font name and should be matched with the font name defined in Type1/TrueType font file (by `/FontName' key). If they don't match then the font name defined in Type1/TrueType font file is ignored.

    `flags' is the font flags (see PDF manual for details how to specify it)

    `fname' is the file name of Type1/TrueType font. If starts by character `<' it means this font should be embbed, otherwise only the font parametrs are extracted to generating FontDescriptor. Font names with suffix `.ttf'/`.TTF' mean TrueType fonts, others mean Type1 fonts. 'encoding_file' is the file that defines new encoding for this font. It should work for 'standard' encoding files DC.enc, CMtext.enc,... The first line in encoding file which starts by other character than `%' should contain only the name of the encoding (which will be ignored). A line with prefix `] def' signs the end of the encoding.

    Здесь все понятно, кроме font flags. Их можно найти в PDF manual, а можно поверить мне на слово:

    Номер битаЗначение
    1Fixed-width font
    2Serif font
    3Symbolic font
    4Script font
    6Uses the Adobe Standard Romand Character Set
    7Italic font
    17All-cap font
    18Small-cap font
    19Force bold at small text sizes
  9. Создаем $TEXMF/tex/latex/local/localps.sty такого, примерно, вида:
    \def\fileversion{1}
    \def\filedate{1997/05/06}
    \ProvidesPackage{localps}[\filedate\space\fileversion
     \space PSNFSS LaTeX2e package loading local PostScript fonts]
    \renewcommand{\rmdefault}{College}
    \renewcommand{\sfdefault}{Textbook}
    \renewcommand{\ttdefault}{CourierKOIC}
    \endinput
    	
  10. Создаем $TEXMF/tex/latex/local/{LCYCollege,LCYTextbook,LCYCourierKOIC}.fd. Например, вот LCYCollege.fd:
    %Filename: LCYCollege.fd
    \ProvidesFile{LCYCollege.fd}
       [1998/01/28 Font definitions for LCY/College.]
    \DeclareFontFamily{LCY}{College}{}
    \DeclareFontShape{LCY}{College}{b}{n}{ <-> College-Bold }{}
    \DeclareFontShape{LCY}{College}{m}{n}{ <-> College }{}
    \DeclareFontShape{LCY}{College}{m}{it}{ <-> College-Italic }{}
    \DeclareFontShape{LCY}{College}{bx}{n}{<->ssub * College/b/n}{}
    \DeclareFontShape{LCY}{College}{b}{it}{ <->ssub * College/b/n }{}
    \DeclareFontShape{LCY}{College}{bx}{sl}{<->ssub * College/b/sl}{}
    \DeclareFontShape{LCY}{College}{bx}{it}{<->ssub * College/b/it}{}
    \DeclareFontShape{LCY}{College}{b}{sl}{<->ssub * College/b/it}{}
    \DeclareFontShape{LCY}{College}{m}{sl}{<->ssub * College/m/it}{}
    \DeclareFontShape{LCY}{College}{mx}{n}{<->ssub * College/m/n}{}
    \DeclareFontShape{LCY}{College}{mx}{sl}{<->ssub * College/m/sl}{}
    \DeclareFontShape{LCY}{College}{mx}{it}{<->ssub * College/m/it}{}
    \endinput
    	  

    Здесь мы определяем три шрифта: LCY/College/m/n (нормальный), LCY/College/b/n (полужирный) и LCY/College/m/it (курсив), а остальные делаем их псевдонимами. Если в семействе шрифтов больше, значит, здесь большее число шрифтов будет "настоящими".

    LCYCourierKOIC.fd и LCYTextbook.fd устроены аналогично.

  11. Копируем LCY{College,Textbook,CourierKOIC}.fd в OT1{College,Textbook,CourierKOIC}.fd, по пути меняя в них все вхождения LCY на OT1.
  12. Запускаем texhash

Пробуем

Создаем тестовый файл probe.tex:

\documentclass{article}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{pslatex,localps}
\begin{document}

This is a test. Это проба пера.

\end{document}
      

Компилируем его latex'ом или pdflatex'ом.


Boris Tobotras
Last modified: Mon May 4 13:35:16 MSD 1998