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

概要

LH フォントはロシアの А. Ходулев, О. Лапко, А. Бердников, В. Волович によって開発された LaTeX キリルフォントである. EC ラテンフォントとマッチするようデザインされており,LaTeX の標準的コンピュータ・モダン・フォントといってよい. ロシア本国において標準的に使用される T2A のほか,T2B, T2C, OT2, T2D, X2 など,キリル文字言語の組版に必要な文字を有するフォントエンコーディングをサポートしている. そのなかで, OT2 エンコーディングは,現代スラヴ語と革命前のロシア旧正書法文字を含む 7 ビットフォントエンコーディングである. ASCII 翻字入力 (ローマン・トランスリテレーション) を用いてキリル文字を出力できる特徴を有し,pTeX を用いる日本のユーザにとって使用頻度の高いフォントエンコーディングであるといってよい. T2D エンコーディングは,現代ロシア語のほか,古スラヴ語・教会スラヴ語の字母・アクセント類を含み,スラヴ文献学研究者にとって有用であると考える.

本稿は LH キリル T2D/OT2 Type1 フォント集 lh-misc-type1 について示す. LaTeX においてロシア語等のスラヴ言語を組版したい方を対象としている. LaTeX のフォントエンコーディングに関する基礎知識が必要である. Microsoft Word やテキストエディタのフォントについて述べるものではないことを,あらかじめ理解いただきたい.

従来の問題点

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

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

パッケージ内容

上記不足部分を補うため, LH キリルフォント OT2/T2D 全ファミリーの Type1 フォント及びフォント定義ファイルを作成した.最新版は本サイトのダウンロード・サービスから, lh-misc-type1-xxxx.{tar.gz,zip} を取得できる. `xxxx' の部分はバージョン識別である (2010.7 現在,`xxxx' は 1007 である).

インストール

アーカイブを解凍し,lh-misc-type1-xxxx ディレクトリ直下にある fonts, tex, doc ディレクトリ一式をそのまま TEXMF ツリーにコピーし,フォントマップ cyrillic-t2d.map 及び cyrillic-ot2.map を登録すればよい.

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

# make
	

とすればよい. フォントマップの登録まで自動的に実行される.

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

  1. fonts, tex, doc ディレクトリのコピー

    lh-misc-type1-xxxx ディレクトリ下の fonts, tex, doc ディレクトリを TEXMF ツリー (以下 $TEXDIR ディレクトリ階層下) にコピーする.

    # setenv TEXDIR /usr/local/texlive/texmf-local
    # cd lh-misc-type1-xxxx
    # mkdir -p $TEXDIR/{fonts/type1,fonts/map/dvips,tex/latex}/\
    lh-misc
    # tar cf - ./fonts ./tex ./doc | ( cd  $TEXDIR; tar xvf - )
    	
  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
    		  

    Windows の場合は以下のとおり.

    C:\> updmap --add cyrillic-t2d.map
    C:\> updmap --add cyrillic-ot2.map
    		  

フォントチャート

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 で組版する概略を示す. OT2 についてはすでに多くの解説があるので割愛する (奥村晴彦『改訂第4版 LaTeX2e 美文書作成入門』J章等を参照). upLaTeX は ttk 氏が公開している Unicode 内部コード化 pLaTeX である. upLaTeX は UNIX 環境での実装であるが,角藤先生の W32TeX においてもその成果を取り込んだアーカイブが配布されているので,Windows ユーザもその恩恵に与ることができる.

T2D を利用するために必要な LaTeX 前提ファイルは,LH フォントの tfm ファイル群のほか,本パッケージに添付した t2d*.fd ファイル,ld*.pfb,Dominique Unruh 氏による unicode パッケージ添付の 2 ファイル utf8x.def 及び t2denc.def である. ptexlive には LH フォント, unicode パッケージは初期状態で組み込まれている.それ以外の LaTeX システム (upLaTeX などの teTeX 系, W32TeX) では,以下の説明を試す前に,LH フォントと unicode パッケージを組み込んでおく. LH フォントのインストールについては,奥村先生の前掲書,「新 pTeX と Babel」等を参照のこと.unicode パッケージについては拙稿「CJK, Unicode パッケージ,ロシア語多書体の利用」にインストール手順を記してある.

utf8x.def は,input.sty 入力エンコーディング・マクロ用の定義ファイルであって,教会スラヴ語・古スラヴ語 Unicode 文字を直接 LaTeX 原稿に記述することを支援する.それら Unicode 文字を T2D シンボル命令に読み替えるわけである. t2denc.def はそのシンボル命令の定義になっている.例えば,ロシア語旧正字法で用いられた文字 ѣ (ять ヤッチ) が読み込まれると, utf8x.def の機能によってシンボル命令 \cyryat に置換され,一方 t2denc.def の定義に従って, \cyryat は T2D エンコーディングフォントの X"B3" ((B3)16) の位置にあるグリフを出力する,という仕組みになっている.

upLaTeX において Unicode キリル文字を欧文として解釈するために,プリアンブルには \kcatcode`б=15 を指定しておく. б の部分は, Unicode U+0400--04FF エリアに配置されたキリル文字ならどれを指定してもよい. ptexlive の場合,この指定は不要であるが,キリル文字が JIS X 0208 として処理されてしまうため,PTEX_IN_FILTER を通してキリル文字をあらかじめ ^^十六進数形式に変換しておく必要がある (これについては拙稿「ドキュメント訂正・PTEX_IN_FILTER」を参照).

これらパッケージを標準の状態で使用すると,一点問題がある.それはロシア語旧正字法文字 і (и с точкой イ・ス・トーチコイ) が原稿にあると, 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
\def\cyrillicencoding{T2D}% russianb.ldf 未定義
\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%
	

プリアンブルに \def\cyrillicencoding{T2D} を書いておくか,もしくは本文に \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
\def\cyrillicencoding{T2D}%
\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 が異常終了すると,値を減じてリトライするロジックをもっており,できる限り大きい値でトレースするようになっている.

--encoding によって Type1 フォントのエンコーディングを指定する.t2d.enc, cm-lgc-ot2.enc は,それぞれ T2D, OT2 のエンコーディング・ファイルであり,OldFonts パッケージ, Cm-lgc パッケージに添付されているものを用いた.この指定により,Type1 埋込み PDF でキリル文字テキストのコピー&ペーストが可能となる.

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.16 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"
 
# Encoding file
ENCF="t2d.enc"
 
# 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 --encoding=$ENCF"
        mftrace --magnification=$mag --encoding=$ENCF $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.16 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"
 
# Encoding file
ENCF="cm-lgc-ot2.enc"
 
# 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 --encoding=$ENCF"
        mftrace --magnification=$mag --encoding=$ENCF $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 を参照.

LH 以外の
T2D フォント

ロシア語旧正字法の文字を有する T2D エンコーディングをサポートした LaTeX キリルフォントは LH 以外にも OldFonts パッケージがある.こちらは Академическая などロシアの出版物でおなじみの 13 のファミリーをサポートしている.関心のある方は拙稿「OldFonts 古ロシア語フォント集成」及び「OldFonts 古ロシア語フォント〜Minion, Palatino 利用」を参照いただきたい.

また,古くから LaTeX 用キリル Type1 フォント集として親しまれている PSCyr フォント・パッケージも,0.4d-beta でいくつかのファミリにおいて T2D をサポートし,旧正書法によるタイプセットを可能とした.拙稿「PSCyr-0.4d-beta」を参照いただきたい.

謝辞

LH フォントの開発者のひとり,Ольга Лапко 氏は本キリル Type1 フォントパッケージの公開について快諾してくださった.この場を借りてお礼申し上げます.

更新履歴

 

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 組版例追加
Jan. 30, 2010 LaTeX 前提追記ほか
June 19, 2010 1006: 10pt版, greek 廃止
July 19, 2010 1007: encoding 変更