フォント METAFONT

提供:yonewiki
2022年9月26日 (月) 11:58時点におけるYo-net (トーク | 投稿記録)による版 (ページの作成:「フォントに戻る == '''概要''' == TeXでも有名なドナルド・クヌースさんが作ったタイポグラフ用のプログラミング言語です。2次元空間座標で関数を使ってアウトラインを指定したり、点と点を座標で指定したりして、どういう設定でつなぎ合わせるか?そういう感じのプログラムをして、*.mf(ファイル拡張子 mf)というファイルを作成できるものです…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

フォントに戻る

概要

TeXでも有名なドナルド・クヌースさんが作ったタイポグラフ用のプログラミング言語です。2次元空間座標で関数を使ってアウトラインを指定したり、点と点を座標で指定したりして、どういう設定でつなぎ合わせるか?そういう感じのプログラムをして、*.mf(ファイル拡張子 mf)というファイルを作成できるものです。METAFONTのフォントファイルはtype1と呼ばれる形式に変換できるのも有名ですが、これができるということは、他の形式のファイルにも変換はできるということでして、TeXから始めるOpenTypeフォントもありえるわけです。但し、METAFONTでは1セットで256個づつしか字体を収録できません。マクロでものすごい数のフォントを読み込ませるという手法でMETAFONTを使うこともできますが、マクロを使っても、読み込みできるフォントセットの上限もあるため、それほどたくさんの字体をMETAFONTで認識させることはできません。どちらかというと1セットをtype1フォントに変換して、Unicode対応フォント制作アプリでTrueTypeフォントやOpenTypeフォントに変換して、つなぎ合わせる作業によって日本語フォントおよびUnicodeフォントを作ることになるんでしょう。日本人なら漢字の対応は第二水準くらいまで頑張らないとだめなんすかね。スッゴイ数のグリフになるんですけど…METAFONTはプログラムによって制作するフォントなので、いくらかは自動化できますが他のアプリの方が使いやすいって人もいるかもしれません。METAFONTと違うフォントアプリを組み合わせるというのもおもしろいやり方かもですね。Unicodeフォントで名を馳せるタイプグラファがこの記事を発端として、誕生したなら素晴らしいことなのですが…タイプデザインをやってみようと思って辿り着いた人の熱意の方が凄いんでしょう。タイプデザインの巨匠になってAdobeやMicrosoftやAppleのタイプデザインディレクターとかになるもよし!METAFONTを使いこなせ!


とはいいつつも、1990年代というインターネットがまだ日本で広まる前からの技術ですので、この上なく面倒くさいフォント作成手法になると思います。私は、このMETAFONTという技術から現在あるフォントエディタのありがたみを感じてみてもいいかなと基礎的なことをやっていようかと思っている次第です。このような回り道をしないで、ある程度お金を出して、もうちょっと便利なツールを使うのは効率的で大事なことでもあります。ヒラギノフォントみたいな凄いの作りたいという方は、大きい会社の保持しているような、すんごいシステムを使ってチームワークで、決め事を試案し、それを守って作るという、そういう流れがあるということも知っておいた方がいいかもしれません。6万グリフの書体だと2年くらいかかる場合もあるそうです。計画的にやらないと終わりません。1年は365日しかありません。1日1文字とかそんなペースでやったらどえらい時間がかかるなぁとすぐに分かっていただけるかと思います。ましてやUnicodeフォントともなると各国の文化を調べたり、美しいと感じる書体とはどんなものかを国ごとに切り分けたりしないとだめですし、作業が無駄になってしまいます。そして、それを無償で提供することなんてできるでしょうか?よく考えて、どういう規模でどうやって広めて、どうやって展開するかとか、そういうことまで考えておく必要も…ってこれ以上の無駄話は必要ないですね。

導入

METAFONTを使ってみたいと思った場合、TeXのシステムインストールするのが近道です。METAFONTはTeXシステムの一部ですので、組み込まれています。METAFONTだけ使うというのは難しいでしょう。また、試しに作ったMETAFONTの出力ファイルもなにかしらに表示させようとするとさらなる変換によって、PDFに出力したりしてプログラムの動作確認が必要です。それもTeXのシステムが補ってくれます。


Windows10にTeXlive2017をインストールします。*.isoファイルというDVDとかCDのイメージファイルで提供されています。


http://www.tug.org/texlive/acquire-iso.html download from a nearby CTAN mirror というリンクからダウンロードして下さい。デッドリンクになってた場合は「TeXLive」で検索してみて下さい。


本来であれば、これをもとにCDやDVDを作るソフトウェアでDVDにして、これをDVDドライブに入れて、その中に構成されたインストールファイルを起動するという感じになるのですが、DVDとかDVDドライブとかを使わないで*.isoファイルをWindows内に作った仮のDVDドライブにisoファイルを読み込ませるソフトウェアがありまして、DEAMON Tool Liteを入手してインストールしましょう。無料の奴でいいです。とはいいつつも、いろいろ他に不要のファイルをインストールしてこようとするので、インストーラーでDEAMON Tool以外をインストールしようとしてくるダイアログでことごとく同意しないとか、閉じるとかキャンセルを押さないとダメです。ものすごい数の罠がありますので、拒否します。


この時点で素人は手を出せない感ハンパない。


そして、インストールしたら、仮想ドライブを作成→作った仮想ドライブにisoを読み込みます→で、ドライブの自動起動とか、設定した仮想ドライブの中身の起動ファイル開くなどします。


インストールダイアログでは、ほぼデフォルト設定で次へボタンを押していく感じです。


  • インストールディレクトリ
C:\texlive\2017
  • 規定用紙寸法
A4
  • 設定
スタートメニューを追加/CheckON TeXWorksフロントエンドを導入/CheckON


これで、おおよそ5GByteほどの容量をもった膨大なプログラム群が配置されます。

フォント METAFONT TeXLive2017インストールプログラム


METAFONTとはかけ離れた作業ですが、ダウンロードだけで30分くらい、インストールでは軽く2時間くらいはかかる作業になります。TeXのメンドクサイ版の全部入りみたいな感じですかね。TeXの方法でインストールしたのは違うPCでして、こちらのやり方でも使えるとは思います。管理人はこの機会にDynaPad N72というタブレット端末にTeXLive2017を導入しました。Intel Atom-x5 Z8300 1.44GHzプロセッサのしょっぱい奴なので時間がかかったのかもしれません。

簡単なMETAFONTの流れ

一番最初にHelloWorldプログラムを作るような基本的なことをやってみます。


上記の手順に従ってTeXLiveをインストールしたら、TeXLive Command Lineというプログラムが追加されていますので、スタートメニューから選択して起動します。WindowsのCommandプロンプトとなんら変わりのないウィンドウが表示・描画され、コマンドを実行できる状態になります。C:\texlive\2017\tlpkg\installer\tl-cmd.batが実行されて、TeXLiveのコマンドが実行できる状態になります。


次にMETAFONTのコマンドを使うために以下のコマンドを実行します。できればカレントディレクトリをmfプログラムを実行するための作業用ディレクトリに変更した方がよいと思います。今から行う作業によって、いくつかファイルが生成されます。関係のないファイルがあるディレクトリで作業をすると何が生成されたか、わからなくなります。

>mf 
This is METAFONT, Version 2.7182818 (TeX Live 2017/W32TeX) (preloaded base=mf)
**

**という状態で新たなコマンドを受け付ける状態になって停止します。通常はこの状態でMETAFONTプログラムが記述された*.mf(メタフォント)ファイルを選択するようなコマンドで*.gf(グリフファイル)ファイルを生成する操作をしますが、まずは簡単な一行の一筆書きのグリフを作るだけなので、コマンドだけでmfプログラムを記述するため以下のコマンドでメタフォントプログラムを記述できるモードにします。

**\relax
*

とすると次は*という状態で新たなコマンドを受け付ける状態になります。この状態で、メタフォントプログラムを記述できるので、試しに何も考えないで以下のコマンドを実行します。

*draw (20,40)..(20,20)..(80,20)..(80,40); showit; shipit;
[0]

これで、何やら描画されたウィンドウが表示がされると思います。これがdrawからはじまる構文によって、生成されたMETAFONTの図形です。またコマンドプロンプトにもどって、さらに

*end;
Output written on mfput.2602gf (1 character, 192 bytes).
Transcript written on mfput.log.


これで、先ほど表示されたウィンドウが閉じられて、shipitという命令も実行された結果、[0]という番号1つだけのグリフ情報をもったgf(グリフファイル、注意:作者のクヌースさんはジェネリックフォントと呼んでいます。)であるmfput.2602gfファイルが生成されます。生成するべきグリフファイル名を指定していないので、このような名前のファイルが生成されます。2602gfとなっていますが、これは1インチ2602ピクセルのグリフという意味の数値で、これも規定値として扱われる拡張子です。ただし、これでは表示するためのビュワーがないのでdviというファイルに変換をします。そのまえにgfファイルをdviファイルにするために必要なtfm(フォントメトリック 注意:覚え方はTeX Font Metric テフ フォント メトリック)ファイルを生成します。tfmファイルの情報はバイナリー(1と0の情報でテキストではない)になっていますが、tftopl(tfm→Property Lists情報という変換)コマンドでフォントメトリック情報がテキストで閲覧できます。tftopl xxx.tfm > xxx.txtという具合にコマンドを使うことでテキストとして保存できます。

>mktextfm gray
mf-nowin.exe --progname=mf --base=mf \mode:=ljfour; \mag:=1; nonstopmode; input gray;
This is METAFONT, Version 2.7182818 (TeX Live 2017/W32TeX) (preloaded base=mf)

(c:/texlive/2017/texmf-dist/fonts/source/public/knuth-local/gray.mf
(c:/texlive/2017/texmf-dist/fonts/source/public/knuth-local/graylj.mf
(c:/texlive/2017/texmf-dist/fonts/source/public/knuth-lib/grayf.mf
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17]
[18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32]
[33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47]
[48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62]
[63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77]
[78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92]
[93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106]
[107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118]
[119] [120] [121] [122] ) ) )
Font metrics written on gray.tfm.
Output written on gray.600gf (123 characters, 13144 bytes).
Transcript written on gray.log.
mktexupd failed
C:/Users/speci/.texlive2017/texmf-var/fonts/tfm/public/knuth-local/gray.tfm

上記コマンドによって

  • c:/texlive/2017/texmf-dist/fonts/source/public/knuth-local/gray.mf
  • c:/texlive/2017/texmf-dist/fonts/source/public/knuth-local/graylj.mf
  • c:/texlive/2017/texmf-dist/fonts/source/public/knuth-lib/grayf.mf

を参照し gray.tfm/gray.logおよび123文字のグリフを持つgray.600gfやその他にcmr8.600pk/gray.600pk/logo8.600pkが生成されます。(*.pk=PacKed bitmap fonts パックされたビットマップフォント) mktextfmコマンドはmetafontプログラムで適切なプログラムが記述されていなければ、tfmファイルを生成することはできません。texliveでインストールした場合、grayやblackなどのmfコマンドのmodeによって必要となるtfmが不足しています。mfファイルはあるので、mktextfmコマンドでtexliveのインストールディレクトリを再帰的に検索してmfファイルを検索します。イメージとしては、tfmは文字コードごとのグリフを収める器みたいなもので、これに文字の解像度とか、文字の幅、文字間、高さといった情報を持っていて、pkファイルには解像度ごと、グリフ情報をもっていて、文字の太さごとにもpkファイルを準備したりもします。gfグリフファイルからpkファイルを生成するにはgftopkコマンドを使います。texのフォントセットとしてはtfmと解像度や倍率に適合するxxx.(nnn)pkファイルが対で必要になります。(nnn)にはdpiという単位の数字が入ります。いろいろと説明しましたが、これでdviファイルを生成するのに必要なファイルがそろったので、以下のコマンドを実行します。dviファイルを作るにはgfファイルとgray.tfmなどのmodeごとに必要となるtfmファイルがあればよいということになります。Windows10の場合は各コマンドで生成したファイルでカレントディレクトリに置くだけでは動作しないようなpkファイルはコマンドによっては、C:\User\ユーザ名\.texlive2017\texmf-var\fontsというフォルダ以下に適切に分類されて保管される仕組みになっています。あれ?どこにいった?と思ったときはこのあたりを覗くとよいでしょう。

>GFtoDVI mfput.2602gf

これでmfput.dvi(DeVice Independent デバイス独立ファイル)が生成されました。このdviファイルにはビューワがありますので、以下のコマンドを実行することで、実行結果をゆっくりとみることができます。dviをpdfに変換(dvipdfmxコマンド)することもできるので、一般的にも普及しているAcrobatReader系のビューワで閲覧ができるようになります。

>dviout mfput.dvi

そんなところです。これでMETAFONTプログラムへの道が開けたかと思います。習得を急いでいる方は、他の文献をあさればMETAFONTプログラムのすべてを理解できると思います。急いでいない方は、管理人と少しづつ、METAFONTプログラムからOpenTypeフォントやTrueTypeフォントなどいろいろなものをつくる勉強をしましょう。なんど、このページにやってきても全然更新されていない!とかっていう展開もあるかもしれません。


METAFONTファイルからPostScript Adobe Standard Type1(pfb)フォントを生成する

上記では、drawコマンド一行で直接メタフォントプログラムを書きましたが、通常は*.mfファイルのような拡張子のMETAFONTファイルを作ります。本来であれば、様々な設定が必要ですが、フォントファイルに1文字分だけのグリフ(アウトラインを持たせた)最小限のメタフォントプログラムを作り、これをpfbファイルにし、さらにttfやotfファイルを生成します。

以下は「O」の文字だけをそれなりのカタチのアウトラインを作ってフォントファイルに埋め込むためのメタフォントプログラム o.mfファイルのサンプルです。

mode_setup;

font_identifier:="O";
font_size 10pt#;%この指定が無いとDesign Sizeが指定されていないというエラーになります。

 em#:=10pt#; cap#:=7pt#;
 thin#:=1/3pt#; thick#:=5/6pt#;
 o#:=1/5pt#;

define_pixels(em,cap);
define_blacker_pixels(thin,thick);
define_corrected_pixels(o);
 curve_sidebar=round 1/18em;

beginchar("O",0.8em#,cap#,0); "The letter O";
 penpos1(thick,10); penpos2(.1[thin,thick],90-10);
 penpos3(thick,180+10); penpos4(thin,270-10);
 x1l=w-x3l=curve_sidebar; x2=x4=.5w;
 y1=.49h; y2l=-o; y3=.51h; y4l=h+o;
 penstroke z1e{down}..z2e{right}
            ..z3e{up}..z4e{left}..cycle;
 penlabels(1,2,3,4); 
endchar;
end.

という感じで、クヌース先生が教えてくれた「O」のアウトラインを描くプログラムです。


このプログラムの中身を説明しませんが、試しに現在よく使われているフォントファイルを作成する作業を知るために、わけがわからないまま変換作業をしてみます。プログラムの細かい説明はまた時間があったらどこかでやりたいと思います。

そしたら、フォント#Windowsフォントファイル作成アプリにある手順でFonfForgeをインストールした上で、以下のコマンドを実行します。

>mf
**\mode=localfont; input o.mf

それで次に

>mf2pt1 o.mf

ちなみに4行目のfont_size 10pt#;という指定が無い場合は

a design size must be specified in o.mf or on the command line

というようなエラーになります。


mf2pt1コマンドの実行結果は以下のようになると思います。

>mf2pt1 o.mf
Invoking "mpost -mem=mf2pt1 -progname=mpost '\mode:=localfont; mag:=100; bpppix 0.02; nonstopmode; input o.mf'"...
This is MetaPost, version 2.000 (TeX Live 2017/W32TeX) (kpathsea version 6.2.3)
(c:/texlive/2017/texmf-dist/metapost/mf2pt1/mf2pt1.mp
(c:/texlive/2017/texmf-dist/metapost/base/mfplain.mp
Preloading the plain base, version 0.99: preliminaries,
 basic constants and mathematical macros,
 macros for converting units,
 macros and tables for various modes of operation,
 macros for drawing and filling,
 macros for proof labels and rules,
 macros for character and font administration,
and a few last-minute items.))
(./o.mf [79]  )
Font metrics written on io2.tfm.
1 output files written: io2.79
Transcript written on o.log.

mf2pt1 is using the following font parameters:
    font_version:              001.000
    font_comment:              Font converted to Type 1 by mf2pt1, written by Scott Pakin.
    font_family:               O
    font_weight:               Medium
    font_identifier:           O
    font_fixed_pitch:          false
    font_slant:                0
    font_underline_position:   -100
    font_underline_thickness:  50
    font_name:                 O-Medium
    font_unique_id:            4501927
    font_size:                 9.9626400996264 (bp)
    font_coding_scheme:        standard

Invoking "mpost -mem=mf2pt1 -progname=mpost '\mode:=localfont; mag:=100.375; bpppix 0.02; nonstopmode; input o.mf'"...
This is MetaPost, version 2.000 (TeX Live 2017/W32TeX) (kpathsea version 6.2.3)
(c:/texlive/2017/texmf-dist/metapost/mf2pt1/mf2pt1.mp
(c:/texlive/2017/texmf-dist/metapost/base/mfplain.mp
Preloading the plain base, version 0.99: preliminaries,
 basic constants and mathematical macros,
 macros for converting units,
 macros and tables for various modes of operation,
 macros for drawing and filling,
 macros for proof labels and rules,
 macros for character and font administration,
and a few last-minute items.))
(./o.mf [79] )
Font metrics written on o.tfm.
1 output files written: io2.79
Transcript written on o.log.

Converting PostScript graphics to Type 1 font programs...

Invoking "t1asm o.pt1 o.pfb"...

Invoking "fontforge -script o.pe o.pfb"...
Copyright (c) 2000-2014 by George Williams. See AUTHORS for Contributors.
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 with many parts BSD <http://fontforge.org/license.html>. Please read LICENSE.
 Based on sources from XX:XX AWST  XX-MMM-YYYY-ML-TtfDb-D.
 Based on source from git with hash: f72e17e105afb8d934cadac0e738443f00ef6553

*** Successfully generated o.pfb! ***

上記によって生成されたpfbファイルをFontForgeで開いてフォントファイルの出力からttfやotfのファイルを保存できます。(FontForgeでttfファイルを出力するときとかには、ちょいちょい警告エラーがでたりしますが、無視してもなんとかなります。警告に対処していく作業ができるようになった方がいいですけどね。この生成したO-Midium.ttfをウィンドウズにインストールしたりするとOだけが指定したフォントで表示されるようになります。他の文字コードも対応したい場合はメタフォントプログラムをガッチリ勉強して、ASCIIコードの範囲を網羅すること->IS漢字第一水準->第二水準->最終的にはUnicodeフォントと幅を広げる必要があります。)

TEXにフォントを認識させる

tex testfontコマンドを実行する場合には


1倍表示:*.600pk
2倍表示:*.1200pk
4倍表示:*.2400pk


ファイルが必要になります。C:\User\ユーザ名\.texlive2017\texmf-var\fonts以下に移動させる必要があるでしょう。dpiを特に指定しない場合のデフォルト値2602になるようです。但しmfコマンドで\mode=localfontを指定したりして、使った場合は600dpiがデフォルト値となります。tex testfontでName of the font to test = xx.mf scaled 4000と4倍指定した場合はxx.mfに対応するxx.2400pkが必要になりますので、mfコマンドで\mode=localfont; mag=4;input xx.mfとして生成されるxx.2400gfが必要になります。場合によっては、そうして、gfフォントから圧縮されたpk形式に変換するgftopkコマンドでgftopk xx.2400gfとしてxx.2400pkを生成する必要があります。これをC:\User\ユーザ名\.texlive2017\texmf-var\fonts以下に移動させるとtestfontで必要なgfファイルもしくはpkファイルが見つかり、mfでプログラムしたフォントがtestfontで表示されます。管理人のPCではgfファイルは認識しなかったので、現在、入手できるMETAFONTに関する説明とは異なる動作だと感じています。管理人はpkファイルに変換しなければならないと思い込んでいます。


例えばmixtureというtestfontを実行するには以下のように指定します。

>tex testfont
This is TeX, Version 3.14159265 (TeX Live 2017/W32TeX) (preloaded format=tex)
(c:/texlive/2017/texmf-dist/tex/plain/knuth-lib/testfont.tex

Name of the font to test = xx.mf scaled 4000
Now type a test command (\help for help):)
*\mixture
background character = 1
starting character = a
ending character = h

*\end
[1]
Output written on testfont.dvi (1 page, xxx bytes).
Transcript written on testfont.log.


きちんとxx.2400pkファイルが先に説明したようにしかるべきところにあれば、上記のような方法でtestfont.dviの中には1に対応するASCIIコード番号のフォントを中心に1行づつaからhまでのコード番号に格納されたフォントをランダムに混ぜてくれるテストができます。例えば文字コードと文字のフォント指定した形状が同じ場合は


1a111aa11aa
1b11111bbb1b
...
1h1111hh111h

という感じです。aからhのコードとカタチを無視すれば、コード1は固定ですが、いろいろなバランスにした同じ文字を比較したりもできます。


METAFONTプログラミング

ここからは、実際にMETAFONTプログラミングをやってみるための解説記事になります。 あまり見たことのないような英字の等幅フォントを作るサンプルとともにMETAFONTプログラムの解説をするつもりです。全部出来上がったら、自分を自分で褒めてあげたい。そう思います。そのあとにtfmを活用したプロポーショナルフォントや、連続文字によって置き換わる文字とかのような特殊なフォントを作ってみたいですね。



フォントに戻る