フォント METAFONT 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(簡単なMETAFONTの流れ)
(METAFONTプログラミング)
 
2行: 2行:
  
 
== '''概要''' ==
 
== '''概要''' ==
TeXでも有名なドナルド・クヌースさんが作ったタイポグラフ用のプログラミング言語です。2次元空間座標で関数を使ってアウトラインを指定したり、点と点を座標で指定したりして、どういう設定でつなぎ合わせるか?そういう感じのプログラムをして、*.mf(ファイル拡張子 mf)というファイルを作成できるものです。METAFONTのフォントファイルはtype1と呼ばれる形式に変換できるのも有名ですが、これができるということは、他の形式のファイルにも変換はできるということでして、TeXから始めるOpenTypeフォントもありえるわけです。
+
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フォントともなると各国の文化を調べたり、美しいと感じる書体とはどんなものかを国ごとに切り分けたりしないとだめですし、作業が無駄になってしまいます。そして、それを無償で提供することなんてできるでしょうか?よく考えて、どういう規模でどうやって広めて、どうやって展開するかとか、そういうことまで考えておく必要も…ってこれ以上の無駄話は必要ないですね。
 
とはいいつつも、1990年代というインターネットがまだ日本で広まる前からの技術ですので、この上なく面倒くさいフォント作成手法になると思います。私は、このMETAFONTという技術から現在あるフォントエディタのありがたみを感じてみてもいいかなと基礎的なことをやっていようかと思っている次第です。このような回り道をしないで、ある程度お金を出して、もうちょっと便利なツールを使うのは効率的で大事なことでもあります。ヒラギノフォントみたいな凄いの作りたいという方は、大きい会社の保持しているような、すんごいシステムを使ってチームワークで、決め事を試案し、それを守って作るという、そういう流れがあるということも知っておいた方がいいかもしれません。6万グリフの書体だと2年くらいかかる場合もあるそうです。計画的にやらないと終わりません。1年は365日しかありません。1日1文字とかそんなペースでやったらどえらい時間がかかるなぁとすぐに分かっていただけるかと思います。ましてやUnicodeフォントともなると各国の文化を調べたり、美しいと感じる書体とはどんなものかを国ごとに切り分けたりしないとだめですし、作業が無駄になってしまいます。そして、それを無償で提供することなんてできるでしょうか?よく考えて、どういう規模でどうやって広めて、どうやって展開するかとか、そういうことまで考えておく必要も…ってこれ以上の無駄話は必要ないですね。
 
  
 
== '''導入''' ==
 
== '''導入''' ==
77行: 76行:
  
  
これで、先ほど表示されたウィンドウが閉じられて、shipitという命令も実行された結果、[0]という番号1つだけのグリフ情報をもったgf(グリフファイル、注意:作者のクヌースさんはジェネリックフォントと呼んでいます。)であるmfput.2602gfファイルが生成されます。生成するべきグリフファイル名を指定していないので、このような名前のファイルが生成されます。2602gfとなっていますが、これは1インチ2602ピクセルのグリフという意味の数値で、これも規定値として扱われる拡張子です。ただし、これでは表示するためのビュワーがないのでdviというファイルに変換をします。そのまえにgfファイルをdviファイルにするために必要なtfm(フォントメトリック 注意:覚え方はTeX Font Metric テフ フォント メトリック)ファイルを生成します。
+
これで、先ほど表示されたウィンドウが閉じられて、shipitという命令も実行された結果、[0]という番号1つだけのグリフ情報をもったgf(グリフファイル、注意:作者のクヌースさんはジェネリックフォントと呼んでいます。)であるmfput.2602gfファイルが生成されます。生成するべきグリフファイル名を指定していないので、このような名前のファイルが生成されます。2602gfとなっていますが、これは1インチ2602ピクセルのグリフという意味の数値で、これも規定値として扱われる拡張子です。ただし、これでは表示するためのビュワーがないのでdviというファイルに変換をします。そのまえにgfファイルをdviファイルにするために必要なtfm(フォントメトリック 注意:覚え方はTeX Font Metric テフ フォント メトリック)ファイルを生成します。tfmファイルの情報はバイナリー(1と0の情報でテキストではない)になっていますが、tftopl('''tf'''m→'''P'''roperty '''L'''ists情報という変換)コマンドでフォントメトリック情報がテキストで閲覧できます。tftopl xxx.tfm > xxx.txtという具合にコマンドを使うことでテキストとして保存できます。
  
 
  >'''mktextfm gray'''
 
  >'''mktextfm gray'''
106行: 105行:
 
*c:/texlive/2017/texmf-dist/fonts/source/public/knuth-lib/grayf.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ファイルを準備したりもします。グリフファイルからpkファイルを生成するにはgftopkコマンドを使います。いろいろ説明しましたが、これでdviファイルを生成するのに必要なファイルがそろったので、以下のコマンドを実行します。
+
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'''
 
  >'''GFtoDVI mfput.2602gf'''
116行: 115行:
 
そんなところです。これでMETAFONTプログラムへの道が開けたかと思います。習得を急いでいる方は、他の文献をあさればMETAFONTプログラムのすべてを理解できると思います。急いでいない方は、管理人と少しづつ、METAFONTプログラムからOpenTypeフォントやTrueTypeフォントなどいろいろなものをつくる勉強をしましょう。なんど、このページにやってきても全然更新されていない!とかっていう展開もあるかもしれません。
 
そんなところです。これで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を活用したプロポーショナルフォントや、連続文字によって置き換わる文字とかのような特殊なフォントを作ってみたいですね。
 +
 +
 +
*[[METAFONT 単位]] METAFONTなどのフォント制作に必要となる単位の知識について
 +
*[[METAFONT 設定変数]] font_identifier
 +
*[[METAFONT 設定関数]] define_pixels、define_blacker_pixels、define_corrected_pixels
 +
*[[METAFONT beginchar … endchar]] フォント定義関数
  
  
 
[[フォント]]に戻る
 
[[フォント]]に戻る

2017年6月28日 (水) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス