METAFONT資料[増補改訂] Rev 2.0

METAFONT 資料 [増補改訂]
Rev 2.0
天地有情
2016
年 6 月 19 日
METAFONT(メタフォント)は,フォント作成用のコンピュータプログラムです.組版
Abstract.
システム
TeX
とともにドナルド・クヌースにより開発されました.
METAFONT は文字の形を描くプログラムソースファイルを読み込んで,組版用の情報(文字の大き
さや合字などの情報)をもつフォントメトリックファイルと,文字の形の情報(グリフデータ)を持
つビットマップフォントファイルを生成するシステムです.
目次
1
1.1
METAFONT プログラム
3
基本文型
3
座標指定の方法
4
2.1
「ペア」による指定
4
2.2
Z
変数による指定
4
2.3
x,y,z
2
変数による指定
5
直線と曲線
6
3.1
直線とパス指定
6
3.2
曲線とパス指定
6
3.3
線の描画
6
4
例題演習
7
3
文法要約
8
5.1
主要コマンド
8
5.2
幾何学的変換
9
5.3
その他
9
5
METAFONT オンラインディスプレイによるテスト機能
10
6.1
テスト用ファイルのひな型
10
6.2
バッチ処理
10
6.3
簡単なサンプル
11
6
1
2016 年 06 月(二版)METAFONT − T − 201
2016 年 06 月(初版)METAFONT − T − 101
本テキストの一部あるいは全部を複写したり複製を作成したりすることを許可します.自由にお使いください.
本テキストの内容は,改善のため予告なく変更することがあります.
MFmain.tex; 2016 年 6 月 19 日; [myjsarticle.cls]
2
1 METAFONT プログラム
基本文型
1.1
METAFONT プログラミング記述の最小限を以下に示します.
1
mode_setup;
2
u#:=1pt#;
3
define_pixels(u);
4
beginchar("A",10u#,10u#,2u#); "title"
5
...<drawing commands> ...
6
endchar;
7
bye
【説明】
[1
[2
行目]:mode_setup
行目]:u#
METAFONT プログラムの先頭で宣言する"決まり文句"です.
METAFONT プログラムでは,座標点を指定し,描画を行います.通常,単位変
数や基準となる変数を準備して利用します.ある特定の x 座標は,「単位変数
と記述します.そのような単位変数として,ここでは
u#
u
の 2 倍」を「2u」
というものを用意し,この変数を
1pt#
の長さとしています.長さに関する変数には,このようにシャープ付きの変数とします.u# とい
う単位変数は,慣例として,unit(単位) の頭文字を用いています.
[3
行目]:dene_pixels(u)
めの宣言です.ここでは,
dene_pixels(u,v,w)
u#
「シャープ付き変数」から「シャープなし変数」を作り出すた
からシャープなしの
u
を引数としています.引数が複数の場合は
のように,カンマで区切って並べます.このように,dene_pixels(u) を
宣言した後は 「u」という変数が利用できるようになります.これ以降は
u
を利用していくこと
になります.
[4
行目,6 行目]:beginchar,
endchar 文字の描画を行うには,beginchar と endchar の 2
つを宣言し,この間に描画コマンドを記述します.beginchar の一般的な構文は次のようになり
ます.
beginchar(<code>, <width>#, <height>#, <depth>#)
ˆ
<code>
は定義しようとする文字のコードを指定します.記述例では"A"という文字列を
指定していますが,数値の指定もできます.
ˆ
<width>, <height>, <depth>
は各文字の幅,高さ,深さを指定します.シャープ付き変
数の記述が必要です.
ˆ
"title"
は慣習として,ダブルクオーテーションで括ったコメント文字列を記述します.記
述しなくても構いません.
[7
行目]:bye
METAFONT ソースファイルの最後は,
3
bye
または
end
で締めくくります.
2 座標指定の方法
METAFONT の座標系は 2 次元座標系です.左下が原点で右に向けて
x
座標,上に向けて
y
座標
となります.x 座標と y 座標を定めれば,座標点が決まり,このような各座標点を結んで描画を
行っていきます.座標指定の方法を以下に示します.
「ペア」による指定
2.1
「ペア」とは,(x,y) のように,ペアで扱われるものです.
(例)
1
mode_setup;
2
u#:=1pt#;
3
define_pixels(u);
4
beginchar(0,10u#,10u#,0);
5
fill (0,0)(10u,0)(10u,10u)(0,10u)cycle;
6
endchar;
7
bye
ˆ「ペア」間にある -- (ハイフォン 2 つ) は,ペア間を直線で描画します.
ˆ ペア間の結びを「パス」と呼びます.
ˆ
ˆ
2.2
cycle はパスが巡回していることを表します.
ll は結ばれたパスの内部を塗り潰します.
Z
変数による指定
METAFONT には「ペア」の値を保持する Z 変数があり,Z 変数には添字を付けることができます.
(例)
1
mode_setup;
2
u#:=1pt#;
3
define_pixels(u);
4
beginchar(1,10u#,10u#,0);
5
z1=(0,0); z2=(10u,0); z3=(10u,10u); z4=(0,10u);
6
fill z1z2z3z4cycle;
7
endchar;
8
bye
4
2.3
z
x,y,z
変数による指定
変数と x,y 変数は密接な関係にあり,常に
文字が加わっても同様です.例えば,
したが,METAFONT は x2=10u,
z=(x,y)
という関係が成り立ちます.それは,添字
z31=(x31,y31).先ほど,z2=(10u,0)
y2=0
という記述を行いま
という記述も同時に行ったものとして,取り扱われます.
(例 1)z 変数を定め,x,y 変数による描画の記述.
1
z1=(0,0); z2(10u,0); z3=(10u,10u), z4=(0,10u);
2
fill (x1,y1) (x2,y2)(x3,y3)(x4,y4)cycle;
(例 2)x,y 変数を定め,z 変数による描画の記述.
1
x1=0; y1=0; x2=10u; y=0; x3=10u; x4=0; y4=10u;
2
fill z1z2z3z4cycle;
(例 3)x,y 座標それぞれで,同一の値となるものをまとめて指定.
1
x1=x4=0; x2=x3=10u; y1=y2=0; y3=y4=10u;
2
fill z1z2z3z4cycle;
クヌース氏は(例 3)の方法を推奨されています.完全なソース記述を以下に示します.
1
mode_setup;
2
u#:=1pt#;
3
define_pixels(u);
4
beginchar(2,10u#,10u#,0);
5
x1=x4=0; x2=x3=10u; y1=y2=0; y3=y4=10u;
6
fill z1z2z3z4cycle;
7
endchar;
8
bye
5
3 直線と曲線
座標点を結び合わせて形成される線は METAFONT では「パス」と呼びます.パスはその経路を
描画したり,囲い込んで中身を塗り潰したりするめに指定するものです.
3.1
直線とパス指定
ˆ 直線開放図形
(x1,y1)--(x2,y2)--(x3,y3);
--(ハイフン 2 つ) は座標点を直線で結ぶ.
ˆ 直線閉包図形
(x1,y1)--(x2,y2)--(x3,y3)--cycle;
3.2
--cycle は座標点を直線で結び閉包とする.
曲線とパス指定
ˆ 曲線開放図形
(x1,y1)..(x2,y2)..(x3,y3);
.. は座標点を曲線で結ぶ.
ˆ 曲線閉包図形
(x1,y1)..(x2,y2)..(x3,y3)..cycle;
3.3
..cycle は座標点を曲線で結び閉包とする.
線の描画
線の描画するには
draw
ン」を持ち上げて (pick
コマンドを使うのが最も簡単です.draw を用いるためには,予め「ペ
up)
おかなければなりません.これを行うが
pickup
コマンドです.丸い
ペン先をピックアップするには以下のようにします.
pickup pencircle
ペン先を太くするには
scaled <長さ>
とします.<長さ> はデフォルトで
0.4pt
ですが, 1pt と
するには,pickup pencircle scaled 1pt
今までの例は
ll
コマンドでしたので
pickup
は不要でしたが,draw コマンドにすると次のよう
になります.
1
mode_setup;
2
u#:=1pt#;
3
define_pixels(u);
4
beginchar(2,10u#,10u#,0);
5
pickup pencircle scaled 1pt; %<- これが必要です.
6
x1=x4=0; x2=x3=10u; y1=y2=0; y3=y4=10u;
7
draw z1z2z3z4cycle;
8
endchar;
9
bye
6
四角のペン先を指定するには,pensquare を使います.
例えば pickup pensquare scaled 1.5u; などのように記述します.
4 例題演習
円を描く
circle.mf
のファイルを
と これを表示する
Desktop
ファイルの作成と結果
(2)
コンパイル方法: ptex2pdf
(4)
-l circle.tex (または.platex + dvipdfmx)
circle.pdf, circle.600pk, circle.tfm
が生成されていることを確認してください.
今回の操作で Desktop 上に生成されたファイルは不要ですので削除してください.
(5) circle.mf
(6)
上に
ファイルを作成します.練習ですので,この 2 つ
上に置いて実行します.
(1)
(3) Desktop
LaTeX
など
.mf
ファイルは,正式には
texmf-dist(texmf-local)/fonts/source
に置きます.
拙著 blog "METAFONT で文字を作る" も合わせてご一読ください.
謝辞
METAFONT に関する資料を捜そうとネットで調べたのですが,皆無でした.古くはネット上に
"METAFONT
情報ページ" 松山道夫氏
がありましたが,今は存在しないようです.これを要
約したノートを保管しておりました.今般の"METAFONT 資料"は,これをベースに編集したも
のです.松山道夫氏に感謝申し上げます.
7
5 文法要約
METAFONT の文字生成コマンドは METAPOST の図形生成コマンドと共通性もあるが,その用
途から自ずと使えないコマンドもあります.本章では METAFONT で良く使われるコマンドつい
て説明します.
5.1
主要コマンド
■
描画コマンド
描画方法
01
draw
座標指定点を直線で結ぶ
e.g. draw z1- -z2- -z3
02
ll
座標指定間を塗り潰すで結ぶ
fill z1--z2--z3--cycle
e.g.
03
閉路生成
cycle
draw z1--z2--cycle
e.g.
04
直線記号
--"で表す
05
曲線記号
.."で表す
06
要素修飾
withpen pencircle scaled ?pt
fullcircle scaled ?pt
■
修飾コマンド
線を修飾する
07
{up},{down}
垂直方向
08
{right},{left}
水平方向
09
{dir n}
任意方向
n=度数
10
{curl n}
滑らかさ
n=1,2,3..
11
tension n
張り強さ
n=1,2,3..
12
rotated n
回転
13
shifted (x,y)
座標転移
14
whatever [z1,z2]
z1,z2
間の任意点
15
1/n[z1,z2]
z1,z2
間の 1/n 点
8
n=角度 (度数)
■
宣言コマンド
標準外の処置
16
pair
システム変数 (x,y,z) 以外のときに宣言
pair A,B; A:=(x,y); B:=(x2,x3);
e.g.
17
経路を指定する宣言
path
path p; p:=A--B--C;
e.g.
■
構文コマンド
反復処理
18
for∼endfor
規定回数の繰り返し処理
for i=nn step mm keyword ss :∼endfor
[numeric] i,nn,mm,ss
[keyword] until,upto,dpwnto
5.2
幾何学的変換
METAFONT で出来た字のイメージは currentpicture という picture 型の変数に収められ 0,1 から
成る二次元配列となっています.任意の角度回転や拡大縮小は苦手であり基本的な幾何学的変換
が準備されています.
(x,y)
shifted
(a,b)
(x+a,y+b)
(x,y)
scaled
r
(rx,ry)
(x,y)
xscaled
r
(rx,y)
(x,y)
yscaled
r
(x,ry)
(x,y)
slanted
r
(x+ry,y)
(x,y)
rotated
θ
原点を中心として θ 度回転
(x,y)
rotatedround
(z0,θ )
z0
(x,y)
reectedabout
(z1,z2)
z1,z2
• r
比率を表すスカラー (numeric)
• θ
回転角を表すスカラー (度)
• z0,z1,z2
ベクトル (pair)
•
(注) pair
5.3
だけでなく
path
を中心として θ 度回転
を結ぶ直線を軸とした鏡像
についても同様の変換が行われる.
その他
ˆ 記号「=」は方程式の
=
であり,
「:=」は代入である.
ˆ コメント記号は「%」である.
9
6 METAFONT オンラインディスプレイによるテスト機能
テスト用ファイルのひな型
6.1
METAFONT プログラム演習のため次のような「ひな型」を準備し複写して利用すると便利です.
List 6.1
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
● xxx.mf
%%%%%%%%%%%%%%%%%%%%%
def TestDraw =
.
.
● def ***= ∼ enddef; は定義書式です.
● *** は名称で,例では
(名称は sample
ここにプログラムを記述する
(中核となる部分を定義する)
や
test
TestDraw
です.
などでもよい)
● オンラインディスプレイへの表示は showit
.
.
enddef;
%%%%%%%%%%%%%%%%%%%%%
u:=1pt;
pickup pencircle scaled .1u;
TestDraw;
showit;
で行われる.
● 表示の都合上,線の長さや太さはスケール
縮小してあります.
バッチ処理
6.2
次のコンソール操作を行い,METAFONT ファイルを処理すします.
prompt > mf
** xxx.mf
Enter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mf コマンド入力
Enter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ファイル名入力
<<< オンラインディスプレイへの表示 >>>
*
Ctl Z Enter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 終了操作
注意
mf コマンド入力でファイル名を指定してもよい.
mf xxx.mf
10
Enter 簡単なサンプル
6.3
図 6.1
List 6.2
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Online Display
● exp01.mf
%%%%%%%%%%%%%%%%%%%%%
def TestDraw =
pair A,B,C;
A:=(0,0);
B:=(4u,0);
C:=(0,4u);
draw ABC;
enddef;
%%%%%%%%%%%%%%%%%%%%%
u:=1pt;
pickup pencircle scaled .1u;
TestDraw;
showit;
このテストプログラムを本番用に移行するには下図を参照ください.合わせて「八卦」も参考にし
てください.
11
この他,テストプログラムを多数準備しました.以下をご参照ください.
METAFONT テスト表示
Example
集 http://hayato1224.web.fc2.com/MF-Example.pdf
12