LH キリル T2D/OT2 Type1 フォント集
since Dec. 14 2006
έν ὺδάτι γράφειν. 水に書く.
— ギリシアのことわざ

概要

本稿は LH キリル T2D/OT2 Type1 フォント集 lh-misc-type1(-all)-xxxx.​{tar.gz,​zip} について示す. OT2 フォントは現代スラヴ語と革命前のロシア旧正書法文字を含む 7 ビットエンコーディングフォントである. ASCII 翻字入力でキリル文字を出力できる特徴を有し,pTeX を用いる日本のユーザにとって使用頻度の高いフォントであるといってよい. T2D フォントは現代ロシア語のほか,古スラヴ語・教会スラヴ語の字母・アクセント類を含み,スラヴ文献学研究者にとって有用であると考える.

従来の問題点

ロシアの Vladimir Volovich 氏は, LH キリルフォントを含む Type1 フォントコレクション cm-super を公開している.しかし, OT2/T2D エンコーディングフォントはこれに含まれず,標準ではこれまで PK ビットマップフォントとして利用するしかなかった.ビットマップフォントは Type1 アウトラインフォントと比較して PDF の質が低下するだけでなく,出版の現場ではイメージセッターに掛らない場合があるなどの問題がある.

一方, unicode パッケージにおいて T2D フォントを利用するためのフォント定義ファイル t2dcmr.fd が公開されている.しかし,これは cmr (Computer Modern Roman) 用 であり, cmtt 用等その他書体ファミリーの定義ファイルは提供されていない.そのため,これまで,例えばタイプライタ体の書式指定を行っても,代替フォントとして定義されているローマン体が拾われてしまう (ビットマップフォントが存在するにも拘らず) という問題があった.

パッケージ内容

上記不足部分を補うため, LH キリルフォント OT2/T2D 全ファミリーの Type1 フォント及びフォント定義ファイルを作成した.最新版は本サイトのダウンロード・サービスから入手できる.

本キリル Type1 フォントパッケージは T2D フォントサイズのバラエティによって二種類のアーカイブを用意している. `xxxx' の部分はバージョン識別である (2007.1 現在,`xxxx' は 0612 である).

1) lh-misc-type1-all-xxxx.{tar.gz,zip} : 全サイズ
2) lh-misc-type1-xxxx.{tar.gz,zip}     : 10pt のみ (T2D)
	

TeX はサイズに応じたデザインのフォントを用いる.t2dcmr.fd に従えば, 5pt から 35.83pt のサイズ範囲における cmr/m/n 書体出力は, ldrm0500, ldrm0600, ldrm0700, ldrm0800, ldrm0900, ldrm1000, ldrm1095, ldrm1200, ldrm1440, ldrm1728, ldrm2074, ldrm2488, ldrm2986, ldrm3583 からなる多くのフォントを切替えることにより実現される. 5pt のフォントは 5pt で表示されるときもっとも美しく見えるよう工夫されている.これは TeX 本来のフォントの特徴としてよく知られているところである.この特徴に拘りたい方は,全サイズ版を利用することをお勧めする.

しかし定義に含まれるすべてのサイズで T2D フォントを含めるとパッケージ容量があまりに大きくなってしまうので, T2D エンコーディングフォントについて 10pt サイズの ld*1000.pfb のみを収録した 2) アーカイブを用意した. OT2 については 1), 2) いずれもすべてのファミリー,サイズを収録している. 2) を選択した利用者は,そのままでは 10pt 以外のサイズで組版すると, T2D フォントについては PK ビットマップフォントが拾われてしまう.この場合, type1ec.sty (cm-super パッケージ添付スタイル) を TeX のパスの通ったところに導入し, \usepackage​[10pt]​{type1ec} とプリアンブルに書いておくと, *1000.pfb を拡大・縮小することにより各種サイズのフォントを表示するようになるのでお勧めである.

\documentclass[a4paper]{jsarticle}
\usepackage[10pt]{type1ec}% fontenc.sty より前に指定
\usepackage[T2D]{fontenc}
\begin{document}
% すべてのサイズを ld*1000.pfb の拡大・縮小で組版する.
\Huge \cyrot
\Large \cyrot
\normalsize \cyrot
\scriptsize \cyrot
\end{document}
	

ギリシア語 cbfonts パッケージで不足していると思われる grml1000.pfb も添付している.関心のある方はパッケージ greek/README を参照してほしい.

インストール

UNIX ユーザは付属の Makefile (GNU make) を用いて

# make cyrillic-install
	

とすればよい.手動の場合,以下のようにして TeX システムに導入する. UNIX システム tsch 仮想端末操作を想定した手順を示す.

  1. *.pfb, *.map, *.fd のコピー

    添付 cyrillic ディレクトリ下の *.pfb, *.map, *.fd ファイル群を TEXMF ツリー (以下の $TEXDIR ディレクトリ階層下) にコピーする.

    # setenv TEXDIR /usr/local/teTeX/share/texmf-local
    # cd cyrillic
    # mkdir -p $TEXDIR/{fonts/type1,fonts/map/dvips,tex/latex}/\
    cyrillic-misc
    # cp *.pfb $TEXDIR/fonts/type1/cyrillic-misc
    # cp *.map $TEXDIR/fonts/map/dvips/cyrillic-misc
    # cp *.fd $TEXDIR/tex/latex/cyrillic-misc
    	
  2. PK フォントの削除

    OT2, T2D の PK フォントを削除しておく.

    # kpsewhich -expand-path="`kpsewhich -show-path=pk`" | \
      tr ':' '\n' | grep -e '/lh-ot2' -e '/lh-t2d' | sort -u | \
      xargs rm -fr
    		  
  3. ツリーの更新

    TEXMF ツリーを更新する.

    # mktexlsr
    		  
  4. マップの登録

    OT2, T2D のフォントマップを登録する.updmap または updmap-sys (システム共通) コマンドを用いる.

    # alias UPDMAP-SYS updmap-sys --nomkmap --nohash --enable 
    # UPDMAP-SYS Map=cyrillic-t2d.map
    # UPDMAP-SYS Map=cyrillic-ot2.map
    # updmap-sys
    		  

T2D エンコーディングによって古スラヴ語,教会スラヴ語をタイプセットしたいユーザは別途 unicode パッケージをインストールする必要がある. unicode パッケージの取得,インストールについては拙稿「CJK, Unicode パッケージ,ロシア語多書体の利用」を参照.

フォントチャート

OT2/T2D フォントチャートをそれぞれ図1,図2に示す.図をクリックすると PDF が閲覧できる.文字の入力方法は, OT2 については拙稿「TeX ロシア語ハイフネーションと文字入力について」を, T2D については unicode パッケージ添付の t2denc.def をそれぞれ参照いただきたい. Utf82TeX を用いれば Unicode で記述したスラヴ文字を pTeX が処理できる形式に変換することができる.


図1 OT2 fontchart: wnr10 Computer Modern Roman


図2 T2D fontchart: ldrm1000 Computer Modern Roman

組方

ここでは T2D フォントエンコーディングを利用した古スラヴ語を upLaTeX で組版する概略を示す. upLaTeX は ttk 氏が公開している Unicode 内部コード化 pLaTeX である. upLaTeX は Unix 環境での実装であるが,角藤先生の W32TeX においてもその成果を取り込んだアーカイブが配布されているので,Windows ユーザもその恩恵に与ることができる.

T2D を利用するためのパッケージ前提は,LH フォントの tfm ファイル群のほか,本パッケージに添付した t2d*.fd ファイル,ld*.pfb,Dominique Unruh 氏による unicode パッケージ添付の二ファイル utf8x.def 及び t2denc.def である. utf8x.def は,input.sty 入力エンコーディング・マクロ用の定義ファイルであって,教会スラヴ語・古スラヴ語 Unicode 文字を直接 LaTeX 原稿に記述することを支援する.それら Unicode 文字を T2D シンボル命令に読み替えるわけである. t2denc.def はそのシンボル命令の定義になっている.例えば,ロシア語旧正字法で用いられた文字 ѣ (ять ヤッチ) が読み込まれると, utf8x.def の機能によってシンボル命令 \cyryat に変換され,一方 t2denc.def の定義に従って, \cyryat は T2D エンコーディングフォントの X"B3" の位置にあるグリフを出力する,という仕組みになっている.

upLaTeX において Unicode キリル文字を欧文として解釈するために,プリアンブルには \kcatcode`б=15 を指定しておく.

これらパッケージを標準の状態で使用すると,一点問題がある.それはロシア語旧正字法文字 і (и с точкой イ・ス・トーチコイ) が原稿にあると, utf8x.def\cyrii に展開する.ところが \cyrii は,現代ウクライナ語で用いられる T2A のシンボル命令であり, T2D エンコーディングに存在せず, T2D フォントエンコーディングが選択されたコンテクストではエラーとなってしまうのである.一方, T2D での і は t2denc.def において \cyrizhe で定義されている.つまり,展開された \cyrii\cyrizhe として処理する工夫が必要である.

上記を踏まえ,プリアンブルには以下のように指定しておく.

\documentclass[uplatex]{jsarticle}
\usepackage[T2D]{fontenc}% use T2D fontencoding
\usepackage[utf8x]{inputenc}% unicode utf8x.def
\kcatcode`б=15% disable cjk for cyrillic by upLaTeX
\makeatletter%
% \cyrii 互換命令(T2D 選択時 \cyrizhe 機能)
\def\@td{T2D}%
\let\CYRIItmp=\CYRII% upper case
\let\cyriitmp=\cyrii% lower case
\def\cyrii{\ifx\cf@encoding\@td\cyrizhe\else\cyriitmp\fi}%
\def\CYRII{\ifx\cf@encoding\@td\CYRIZHE\else\CYRIItmp\fi}%
\makeatother%
	

\fontencoding{T2D}\selectfont をマークアップして,フォントエンコーディングを T2D に変更したのちに,Unicode キリル文字を記述すると T2D フォントで出力することができる.以下に LaTeX 原稿例を示す.この組版結果を図3 に示す (pdf も図をクリックすると閲覧できる).

% -*- coding: utf-8; -*-
% T2D 試験
% Примѣръ русской дореволюціонной орѳографіи
%   coded by isao yasuda, Nov. 7, 2009. All Rights Reserved.
\documentclass[b5paper,10pt,uplatex]{jsarticle}
\usepackage[T2D]{fontenc}% T2D fontencoding
\usepackage[utf8x]{inputenc}% from the unicode package
\usepackage[russian]{babel}% 
\pagestyle{empty}%
\kcatcode`б=15% disable cjk for cyrillic by upLaTeX
\makeatletter%
% \cyrii 互換命令(T2D 選択時 \cyrizhe 機能)
\def\@td{T2D}%
\let\CYRIItmp=\CYRII%
\let\cyriitmp=\cyrii%
\def\cyrii{\ifx\cf@encoding\@td\cyrizhe\else\cyriitmp\fi}%
\def\CYRII{\ifx\cf@encoding\@td\CYRIZHE\else\CYRIItmp\fi}%
\makeatother%
\begin{document}
\sloppy%
\selectlanguage{russian}\selectruencoding{T2A}%
\fontencoding{T2D}\selectfont%
\parindent=20pt%
 
Вопросъ о разрывѣ Татьяны съ Онѣгинымъ, несмотря на всю
ясность. Пушкинскаго стиха, выросъ у насъ въ своего рода 
\glqq гамлетовскую проблему\grqq,
къ которой постоянно возвращается критическая мысль.
 
Онъ, по выраженію Достоевскаго, имѣетъ въ нашей литературѣ
\glqq своего рода исторію весьма характерную\grqq.
 
Иначе говоря, вокругъ него сталкивались и боролись 
различныя враждующія теченія соціально-политической мысли.
 
И совсѣмъ не случайно выразителями двухъ наиболѣе 
противоположныхъ взглядовъ на этотъ предметъ являются 
представители враждующихъ міросозерцаній
"---соціалистъ-радикалъ Бѣлинскій и 
націоналистъ-славянофилъ Достоевскій.
 
\vspace{1em}%
\small%
\hfill%
\parbox[t]{.7\textwidth}{%
\textit{А. И. Ванновский}~~Зерколо судьбы. (Сон Татьяны.)\\
в кн.: \textit{С. А. Небольсин}~~Пушкин и европейская традиция. 
Историко-теоретические работы. М. 1999.}%
\end{document}
	

図3 T2D 組版結果

Type1 フォント生成スクリプト

本パッケージには Type1 フォントを生成するために用いたシェルスクリプトを添付している. pfbgen-t2d.shpfbgen-ot2.sh はそれぞれ T2D,OT2 用のものであり,いずれも mftrace によって pfa フォントを生成し,t1binary によって pfb 変換を行い, これらが成功する都度エントリーを書き出して, map ファイルを作成する.

mftracet1binary (t1utils) 環境があれば,これを用いて pfb フォントを再生成することができる.実行はかなりの時間 (PowerMac G5 1.8 GHz, 1 GB メモリ Mac OS X Tiger で, T2D: 約 7.5 時間, OT2: 約 2 時間) を要する.

mftrace は --magnification オプションにより Type1 フォント変換時の解像度を指定することができ,この値が大きければトレースの精度が向上するとされている. METAFONT ソースの構造によりこの値を大きくしすぎるとオーバフローエラーが発生し pfa 生成が失敗する.このため,スクリプトはある magnification 値で mftrace が異常終了すると,値を減じてリトライするロジックをもっており,できる限り大きい値でトレースするようになっている.

pfbgen-t2d.sh, pfbgen-ot2.sh を以下に示す.これはすべてのサイズ,すべてのファミリーで T2D/OT2 Type1 フォントを生成するものである.

#!/bin/sh
# $Id: pfbgen-t2d.sh,v 1.3 2006/12/13 13:20:20 isao Exp $
#
# Cyrillic LH Fonts Generation into Type1: T2D all families
# using mftrace 1.2.5 and t1binary.
# 2006(c) isao yasuda, All Rights Reserved.
#

# CAUTION 
# -------
# The processing of this script will cost about 7.5 hours
# in the executing condition: 1.8 GHz PowerMac G5 with 1 GB DDR. 

# Fonts with genb
# font family type 1: 0500-3583
# cmr cmss cmdh cmfib cmfr
GENB1="0500 0600 0700 0800 0900 1000 1095 1200 1440 1728 2074 2488 2986 3583"
FFT1="ldrm ldsl ldti ldcc ldbx ldrb ldbi ldbl ldxc ldui ldss ldsi ldsx ldso \
lddh ldci ldoc ldsc"

# font family type 2: 0500-2074
# cmfib
GENB2="0500 0600 0700 0800 0900 1000 1095 1200 1440 1728 2074"
FFT2="ldfb ldfs"

# font family type 3: 0900-3583
# cmfr
GENB3="0900 1000 1095 1200 1440 1728 2074 2488 2986 3583"
FFT3="ldff ldfi"

# font family type 4: 0800-3583
# cmtt cmvtt
GENB4="0800 0900 1000 1095 1200 1440 1728 2074 2488 2986 3583"
FFT4="ldtt ldst ldit ldtc ldvt ldvi"

# Fonts without genb
# font family type 5: non genb
# cmss cmbr cmtl lcmss lcmtt ccr
FFT5="ldssdc10 ldbmr8 ldbmr9 ldbmr10 ldbmr17 ldbmo8 ldbmo9 ldbmo10 ldbmo17 \
ldbsr8 ldbsr9 ldbsr10 ldbsr17 ldbso8 ldbso9 ldbso10 ldbso17 ldbbx10 ldbtl10 \
ldbto10 ldlq8 ildlq8 ldli8 ildli8 ldlb8 ildlb8 ldlo8 ildlo8 ldltt8 ildltt8 \
ldorm5 ldorm6 ldorm7 ldorm8 ldorm9 ldorm10 \
ldosl5 ldosl6 ldosl7 ldosl8 ldosl9 ldosl10 \
ldoti10 ldocc10"

# Map file
MAPF="cyrillic-t2d.map"

# starting.
echo "* T2D Type1 fonts generation started at `date`."
touch $MAPF

# font list generation
FLIST=""
# type 1 list
for i in $FFT1; do for j in $GENB1; do FLIST="$FLIST $i$j"; done; done
# type 2 list
for i in $FFT2; do for j in $GENB2; do FLIST="$FLIST $i$j"; done; done
# type 3 list
for i in $FFT3; do for j in $GENB3; do FLIST="$FLIST $i$j"; done; done
# type 4 list
for i in $FFT4; do for j in $GENB4; do FLIST="$FLIST $i$j"; done; done
# type 5 list
FLIST="$FLIST $FFT5"

# T2D Computer Modern Type1 Fonts generation
# cmr, cmtt, cmss, cmbr, cmdh, cmfib, cmfr, cmtl, cmvtt, lcmss, lcmtt
for i in $FLIST
do
    # When return code == 0 (mftrace normal end)
    # - break and go to processing of the next fonts
    # When return code != 0 (mftrace abnormal end)
    # - decrease mag by  10 and retry mftrace
    mag=830
    while [ $mag -ne 0 ]
    do
        echo "* $i try magnification=$mag."
        mftrace --magnification=$mag $i
        if [ $? -eq 0 ]
        then
            echo "* mftrace $i pfa gen succeeded at $mag magnification."
            t1binary $i.pfa $i.pfb
            echo "* t1binary $i pfb gen succeeded."
            rm -f $i.pfa
            echo "$i $i <$i.pfb" >> $MAPF
            mag=0
        else
            mag=`expr $mag - 10`
        fi
    done
done
echo "* T2D Type1 fonts generation ended at `date`."
	
#!/bin/sh
# $Id: pfbgen-ot2.sh,v 1.2 2006/12/13 13:20:26 isao Exp $
#
# Cyrillic LH Fonts Generation into Type1: OT2 all families
# using mftrace 1.2.5 and t1binary.
# 2006(c) isao yasuda, All Rights Reserved.
#

# CAUTION 
# -------
# The processing of this script will cost about 2 hours
# in the executing condition: 1.8 GHz PowerMac G5 with 1 GB DDR. 

# Map file
MAPF="cyrillic-ot2.map"

# starting.
echo "* OT2 Type1 fonts generation started at `date`."
touch $MAPF

# OT2 Computer Modern Fonts pfa generation
# cmr, cmtt, cmss, cmbr, cmdh, cmfib, cmfr, cmtl, cmvtt, lcmss, lcmtt
for i in \
    wnr5 wnr6 wnr7 wnr8 wnr9 wnr10 wnr12 wnr17 wnsl8 wnsl9 wnsl10 wnsl12 \
    wnti7 wnti8 wnti9 wnti10 wnti12 wncsc10 wnu10 wnb10 \
    wnbx5 wnbx6 wnbx7 wnbx8 wnbx9 wnbx10 wnbx12 wnbxsl10 wnbxti10 \
    wntt8 wntt9 wntt10 wntt12 wnitt10 wnsltt10 wntcsc10 \
    wnss8 wnss9 wnss10 wnss12 wnss17 \
    wnssi8 wnssi9 wnssi10 wnssi12 wnssi17 wnssdc10 wnssbx10 \
    wnbr8 wnbr9 wnbr10 wnbr17 wnbrsl8 wnbrsl9 wnbrsl10 wnbrsl17 \
    wnbrbx10 wndunh10 wnfib8 wnff10 wnfi10 wntl10 wnsltl10 \
    wnvtt10 wnvtti10 lwnss8 lwnssi8 lwnssb8 iwntt8
do
    # When return code == 0 (mftrace normal end)
    # - break and go to processing of the next fonts
    # When return code != 0 (mftrace abnormal end)
    # - decrease mag by 100 and retry while mag is under 3000 and beyond 1000
    # - decrease mag by  10 and retry while mag is under 1000
    mag=3000
    while [ $mag -ne 0 ]
    do
        echo "* $i try magnification=$mag."
        mftrace --magnification=$mag $i
        if [ $? -eq 0 ]
        then
            echo "* mftrace $i pfa gen succeeded at $mag magnification."
            t1binary $i.pfa $i.pfb 
            echo "* t1binary $i pfb gen succeeded."
            rm -f $i.pfa
            echo "$i $i <$i.pfb" >> $MAPF
            mag=0
        else
            if [ $mag -gt 1000 ]
            then
                mag=`expr $mag - 100`
            else
                mag=`expr $mag - 10`
            fi
        fi
    done
done
echo "* OT2 Type1 fonts generation ended at `date`."
	

ライセンス

本ソフトウェアはフリーソフトウェアで無償にて利用できる.その運用結果に関し作者並びにその関係者はいかなる責任も負わない.利用者責任でご活用いただきたい. lppl (LaTeX Project Public License) version 1.3 を適用する. lppl 最新版のライセンス内容は http://www.latex-project.org/lppl.txt を参照.

更新履歴

 

Dec. 14, 2006 初稿
Jan. 7, 2007 誤記訂正
Jan. 24, 2007 誤記訂正,pfbgen-ot2.sh 追加
Feb. 28, 2007 pfbgen-ot2.sh wnr6 追加
Mar. 31, 2007 pfbgen-t2d.sh ldci, ldoc, ldsc 追加 (Thanks to Mariusz Wodzicki)
Nov. 7, 2009 組版例追加