FontForge でフォントを変更するためのスクリプトの書き方

FontForge はインタプリタを内蔵しているので、フォントを変更するためのスクリプトを書くことができます。

スクリプトの起動

スクリプトを指定して FontForge をコマンドラインから起動したときはウィンドウは表示されず、スクリプトが終了した時にプログラムの終了となります。

$ fontforge -script scriptfile.pe {fontnames}

FontForge は、シェルが自動的にスクリプトを渡すようなインタプリタとして使うこともできます。 スクリプトファイルが実行可能になるように
    $ chmod +x scriptfile.pe
として、それらのファイルの先頭の行に
    #!/usr/local/bin/fontforge
(または、システム上で FontForge が置かれているどこか別の場所) を書き加えることにより、     $ scriptfile.pe {fontnames}
と打つだけでスクリプトを起動できるようになります。

FontForge に標準入力からスクリプトを読み込ませたい場合は、"-" を標準入力を表すファイル名として使用することができます。 (もし FontForge を X11 無しで作成した場合、コマンドラインに何も指定しなければ、FontForge はスクリプトを標準入力から読もうと試みます。)

また、FontForge を使用中に、ファイル(F)→スクリプトを実行(X)メニューを用いてスクリプトを起動することもできますし、頻繁に用いるスクリプトをプリファレンスダイアログで登録してメニューから直接起動可能なように設定することもできます。

スクリプト言語により、フォント表示画面のメニューに見られる機能の多くを使用することができます。 現在のところ (将来もそうでしょうが) 全ての対象にアクセスできるわけではありません。 (もし何か欠けている機能があったら作者に知らせてください。それを追加しましょう)。 スクリプト言語は曲線からグリフを組み立てるコマンドを提供する物ではなく、グリフに対する高レベルな修正を可能にするための物です。

環境変数 PFAEDIT_VERBOSE が定義されている場合 (値を設定する必要はなく、定義するだけで十分です) FontForge は、スクリプトを実行するごとにその内容を標準出力に書き出します。

一般的に言って、作者はこの機能を例えばラテン文字フォントを入力としてキリル文字のグリフを含むように拡張するような作業に役立つことを思い描いています。この場合、スクリプトはこのような物になるでしょう:

スクリプト言語

スクリプトの構文は、C とシェルコマンドを混ぜ合わせた物にかなり似ています。 各ファイルは手続きに対応します。 シェルスクリプトと同様に、スクリプトファイルに渡された引数は $1, $2, …, $n いう識別子で用いることができます。 $0 はスクリプトそれ自身です。 $argc は引数の個数を表します。 $argv[<式>] の形で、コマンドの引数を配列としてアクセスすることができます。

項は以下のいずれかを取ることができます。

以下の 3 種類のコメント形式がサポートされています:

式は C とほぼ同じですが、二、三の演算子は省かれ、二、三がシェルスクリプトから追加されています。演算子の優先順位はわずかに単純化されています。 その結果、演算子 (とそれらの優先順位) は以下のようになっています:

カンマ演算子、"?:" 演算子が存在しないことに注意してください。 "AND", "OR" と、代入演算子の優先順位は、単純化されています。

手続き呼び出しは名前トークンまたは文字列に対して適用することができます。 名前または文字列が FontForge の内部手続きのどれかと認識された場合、それが実行されます。それ以外の場合は実行するファイルの名前であると見なされ、そのファイルが呼び出されます (ファイル名には、トークンとして使用できない文字を含むことができるため、ファイル名を指定するために文字列一般を指定できるのは肝要です)。 手続き名がディレクトリを含まない場合、現在のスクリプトファイルと同じディレクトリにある物と見なされます。手続きに渡すことのできる引数は最大で 25 個です。

配列は参照渡しされます。文字列と整数は値渡しされます。

変数は、値を代入することによって ("=" のみで) 作成することができます。 ですから
    i=3
によって、"i" の変数定義を行うことができます。変数のスコープは現在のファイルのみに限定されているので、呼び出された手続きには引き継がれません。

文は以下のいずれかをとることができます。

C と同様に、非ゼロとなる式は真であると定義されています。
return 文は、その後ろに返り値 (式) を指定するか、または手続きは何も値を返さずに return で終了することも可能です。
shift 文はシェルスクリプトから拝借した構文で、全ての引数を 1 個ずつシフトします。 (引数 0 のスクリプトファイル名は変更されません。)
foreach 文は、カレントフォントが存在する時のみ使用できます。 foreach 文は、選択したグリフ群に含まれる各グリフに対して 1 回ずつ実行されます。 文の内部では、一度に 1 個のグリフのみが選択されます。 実行が完了すると、最初に選択されていたグリフ群が元通りに戻されます。 (警告: foreach 文の内部でフォントのコード変換を行ってはいけません)。
文は改行 (改行の前にバックスラッシュを置くことによって、長い行を分割することができます) またはセミコロンで完結します。

つまらない例:

i=0;	# このセミコロンは不要ですが、あっても構いません
while ( i<3 )
   if ( i==1 /* 無意味なコメント */ )
	Print( "Got to one" )	// もう一つコメント
   endif
   ++i
endloop

FontForge には「カレントフォント」という概念があります――ほぼ全てのコマンドはカレントフォントのみを参照します (ですから、カレントフォントが定義されている必要があります)。 「ファイル(F)→スクリプトの実行(M)」でスクリプトを起動した場合、現在編集中のフォントがカレントフォントとなり、そうでなければ初期状態ではカレントフォントは存在しません。 カレントフォントを変更するには Open() と New(), Close() の各コマンドを使います。 FontForge は、現在開かれたフォントのリストも保持しています。 このリストの並び順にはとくに意味はありません。 リスト内の最初のフォントは $firstfont です。

同様に、CID-Keyed フォントを操作する時には、FontForge の操作対象は「現在のサブフォント」であり、ほとんどのコマンドはそのフォントを参照します。それを変更するのには CIDChageSubFont() を使うことができます。

全ての組み込み変数 は "$" で始まるので、自分で新しく "$" で始まる変数を作ることはできません (既存の変数 (の一部) に値を代入することはできますが)。

以下の例では、読込み済みの全フォントに対して同じ操作を実行します。

file = $firstfont
while ( file != "" )
   Open(file)
   /* 操作を実行 */
   file = $nextfont
endloop

組み込み 手続き の動作は、同じ名前のメニュー項目とほとんど同じです。ここでの説明はしばしば概要しか示されていませんので、より詳しい情報は当該のメニュー項目を調べてください。

Print(arg1,arg2,arg3,...)
メニュー項目には対応する項目はありません。与えられた全ての引数を標準出力へ印字します。 カレントフォントが定義されていない時にも実行することができます。
PostNotice(str)
UI から実行した時は、文字列を表示するウィンドウを開きます (ウィンドウはプログラムを停止せず、1 分ほど経過すると消滅します)。 コマンドラインから起動した時は、文字列を標準エラー出力に書き出します。
Error(str)
str をエラーメッセージとして出力し、現在のスクリプトを中断します。
AskUser(question[,default-answer])
ユーザに question を質問し、答え (文字列) を返します。デフォルトの答えを指定することもできます。
Array(size)
指定したサイズの配列を割り付けます。
a = Array(10)
i = 0;
while ( i<10 )
   a[i] = i++
endloop
a[3] = "string"
a[4] = Array(10)
a[4][0] = "Nested array";
SizeOf(arr)
配列に含まれる要素数を返します。
Strsub(str,start[,end])
文字列引数の部分文字列を返します。部分文字列は start で指定された位置から始まり、end で指定された位置が終端となります (end が省略された場合、文字列の終りが使用されます。文字列の先頭は位置 0 です)。ですから Strsub("abcdef",2,3) == "c" かつ Strsub("abcdef",2) == "cdef" となります。
Strlen(str)
文字列の長さを返します。
Strstr(haystack,needle)
文字列 needle が、文字列 haystack の中で最初に出現する位置を返します (ない場合は -1 を返します)
Strrstr(haystack,needle)
文字列 needle が、文字列 haystack の中で最後に出現する位置を返します (ない場合は -1 を返します)
Strcasestr(haystack,needle)
大文字と小文字の区別を無視して検索を行い、文字列 needle が文字列 haystack の中で最初に出現する位置を返します (ない場合は -1 を返します)
Strcasecmp(str1,str2)
大文字と小文字の区別を無視して 2 つの文字列を比較し、等しければ 0 を、str1<str2 ならば負の数を、str1>str2 ならば 正の数を返します。
Strtol(str[,base])
文字列 str をできるだけ長く字句解析して、str が表す整数値を返します。 変換の基数を表す 2 番目の引数を与えることができます (デフォルトでは 10 進数です)。この手続きの振舞いは strtol(3) に従います。
Strskipint(str[,base])
文字列 str をできるだけ長く字句解析して、解析不可能な最初の文字のオフセットを返します。 Strtod(str)
文字列を実数に変換します。
LoadPrefs()
ユーザのプリファレンスを読み込みます。これはかつてはスクリプトの開始時に自動的に行われていましたが、現在では UI から起動されたときのみに自動的に実行されます。スクリプトからは、この手続きを実行しなければなりません。
SavePrefs()
現在のプリファレンスを保存します。以前は SetPref を呼び出したときに自動的に行われていましたが、現在はスクリプトは明示的に実行する必要があります。
GetPref(str)
名前 str を持つプリファレンスの項目値を取り出します。返すことができる項目の型は、ブール型、整数、実数、文字列およびファイル型のみです。 ブール型と実数型の項目は整数型に変換され、ファイル項目は文字列型に変換されます。 エンコーディング (NewCharset) がマジックナンバーとして返されます。これは get/set Pref の文脈の外では無意味な数値です。
SetPrefs(str,val[,val2])
名前 str をもつプリファレンスの項目値を設定します。プリファレンスの項目が実数型ならば、2 番目の引数を指定することができ、設定される値は val/val2 となります。
DefaultOtherSubrs()
Adobe 版の OtherSubrs サブルーチンを使うように設定を戻します。
ReadOtherSubrsFile(filename)
Type 1 フォントのOtherSubrs 配列で使用するための新しい PostScript サブルーチンを読み込みます。ファイルフォーマットは必要以上に複雑になっているところが少々あります (なぜなら、OtherSubrs 配列を個々のサブルーチン毎に解析する方法が思いつかないからです)。
% Copyright (c) 1987-1990 Adobe Systems Incorporated.
% All Rights Reserved
% This code to be used for Flex and Hint Replacement
% Version 1.1
%%%%%%
{systemdict /internaldict known
1183615869 systemdict /internaldict get exec
...
%%%%%%
{gsave currentpoint newpath moveto} executeonly
%%%%%%
{currentpoint grestore gsave currentpoint newpath moveto} executeonly
%%%%%%
{systemdict /internaldict known not
{pop 3}
...
GetEnv(str)
名前 str をもつ環境変数の値を返します。
FileAccess(filename[,prot])
Unix の access システムコールと同様にふるまいます。ファイルが存在する場合 0 を返し、存在しない場合 -1 を返します。prot が省略された時は、読み込みアクセスをチェックします。
UnicodeFromName(name)
文字列 "name" を、一般に使用されるグリフ名を格納した FontForge のデータベースから検索して、その名前がもつ Unicode 値を (見つからなければ -1 を) 返します。 これは、カレントフォント (があれば) を検査しません
Chr(int)
Chr(array)
文字列内に含まれる各文字のエンコーディングを表す整数の配列を返します。 pos を指定する場合は、string の長さより小さい整数でなくてはならず、 関数は文字列 string 内の位置 pos にある文字の文字コードを整数で返します。
Real(int)
整数を実数に変換します。
Round(real)
実数を最も近い整数値に丸めて、整数に変換します。
Floor(real)
real を、それを超えない最大の整数に変換します。
Ceil(real)
real を、それを下回らない最小の整数に変換します。
IsNan(real)
値が NaN であるかどうかを返します。
IsFinite(real)
値が有限値である (無限大/小でも NaN でもない) かどうかを返します。
Sqrt(val)
平方根を返します。
Exp(val)
e の val 乗を返します。
Log(val)
val の自然対数を返します。
Pow(val1,val2)
val1 の val2 乗を返します。
Sin(val)
val の正弦を返します。
Cos(val)
val の余弦を返します。
Tan(val)
val の正接を返します。
ATan2(val1,val2)
逆正接を返します。より詳しい情報は atan2(3) を参照してください。
Utf8(int)
整数 [0,0x10ffff] をとり、その Unicode コードポイントが指す文字を UTF-8 文字列で返します。 整数の配列を渡した場合、それら全ての Unicode コードポイントを含む UTF-8 文字列を生成します。 (サロゲートの値を渡されることは想定していません)。
Rand()
ランダムな整数を返します。

FontsInFile(filename)
ファイル内に含まれる全てのフォント名を含む文字列の配列を返します。 ほとんどのファイルはフォント 1 個のみを含みますが、物によっては (Mac のフォントスーツケース、dfont, TTC ファイル、SVG ファイルなど) は複数のフォントを含むことができます。ファイルにフォントが含まれていない場合 (またはファイルが存在しないか、フォントに名前がついていない場合) 長さ 0 の配列が返されます。 これはフォントを開きません。カレントフォントが無くても実行可能です。
Open(filename[,flags])
この手続きは、名前 filename をもつフォントをカレントフォントにします。 filename がまだメモリに読み込まれていないならば、この時読み込まれます。 カレントフォントが無い場合でもこれは実行可能です。
TTC ファイル (Mac のフォントスーツケース、.dfont, SVG など) から読み込む時は、フォント名を括弧で囲んで、ファイル名の後ろに付け加えて Open("gulim.ttc(Dotum)") のように指定すれば、 特定のフォントを選択することができます。
現時点で存在する省略可能なフラグ引数は、以下の 1 個のフラグのみを含みます:
New()
新しいフォントを作成します。これはカレントフォント無しでも実行できます。
Close()
カレントフォントが占有しているメモリを全て開放し、 読み込み済みのフォントのリストからカレントフォントを除外します。 これを実行した後、カレントフォントは存在しない状態となります。
Save([filename])
filename に何も指定しない場合、カレントフォントを元の SFD ファイルに書き戻します (フォントに対応する SFD ファイルが存在しない場合、エラーとなります)。 引数 1 個をつけて実行した場合、「名前をつけて保存」コマンドを実行し、 カレントフォントを filename で指定したファイルに保存します。
Generate(filename[,bitmaptype[,fmflags[,res[,mult-sfd-file]]]])
フォントを出力します。フォントの形式は filaname で指定した拡張子で決まります。 利用可能な拡張子は以下のとおりです:

bitmaptype を指定した場合、それは以下のどれかでなければなりません。

アウトラインフォントを出力したくない場合、拡張子 ".bdf" を filename に指定してください。
AFM や PFM ファイルを出力するかどうかは、fmflags で制御できます。

res により、生成された BDF フォントの解像度が決まります。 -1 を指定すると、FontForge が各サイズに対して自動的に値を推測します。

filename に ".mult" 拡張子を指定した場合、 "mult-sfd-file" が既に存在することでしょう。 これは、現在のエンコーディングからサブフォントへのマッピングを含むファイルの名前です。 一例をここに示します。 このファイルが存在しない場合、FontForge はフォントのエンコーディングに対応するファイルを探す標準の探索プロセスを行い、それが失敗した時はフォントは保存されません。

GenerateFamily(filename,bitmaptype,fmflags,array-of-font-filenames)
配列 array-of-font-filenames で名前を指定した各フォント (読み込み済みで無ければなりません) から構成される Mac のフォントファミリー (FOND) を生成します。filename, bitmaptype, fmflag は上と同じです。
#!/usr/local/bin/fontforge
a = Array($argc-1)
i = 1
j = 0
while ( i < $argc )
# 各フォントを開く
  Open($argv[i], 1)
# 全てのスタイルに対応するファイル名を配列に格納する
  a[j] = $filename
  j++
  i++
endloop

GenerateFamily("All.otf.dfont","dfont",16,a)
ControlAfmLigatureOutput(script,lang,ligature-tag-list)
3 つの引数は全て文字列でなければなりません。 最初の 2 個はそれぞれ最大 4 文字を含む文字列、3 個目はカンマで区切られた 4 個以内の文字からなるリストでなければなりません。 以下の条件を満たす場合のみ、AFM ファイル内に合字が作成されます。

標準の設定は以下の通りです:

ControlAfmLigatureOutput("*","dflt","liga,rlig")
Import(filename[,toback[,flags]])
ビットマップフォントをデータベースに取り込むか、背面の画像をさまざまなグリフに取り込みます。 1 個か 2 個の引数を指定することができます。 最初は、ファイル名を指定する文字列 filename でなければなりません。 ファイルの拡張子によって、取り込みがどのように進行するかが定まります。

2 番目の引数が存在する時は、整数でなければならず、最初の引数がビットマップならば 2 番目の引数によって、ビットマップリストに追加するか (0) グリフの背面を埋めるか (1) が定まります。EPS および SVG ファイルでは、スプラインが前面に追加されるか、グリフの背面レイヤに追加するかがこの引数によって決まります。

3 番目の引数が存在する場合、これも整数でならなければならず、EPS 取り込みのふるまいを制御するフラグの集まりとして扱われます。

Export(format[,bitmap-size])
このコマンドは、カレントフォント内の選択中の各グリフに対し、カレントディレクトリ内のファイルへそのグリフを書き出します。 format は文字列で、以下のどれかでなければなりません。

フォーマットは (上記の) ファイルタイプのみからなるか、または、ファイルタイプを拡張子で指定した (いくつかのフォーマット制御文字列を埋め込み可能な) 完全なファイル名のいずれかとすることが可能です。

"Glyph %n from font %f.svg"
"U+%U.bmp"

フォーマット文字列中の文字は % 以外はそのままコピーされます。% が含まれている場合、次の文字がふるまいを制御します:

MergeKern(filename)
カーニング情報を AFM ファイルまたは TFM ファイルから読み出し、カレントフォントにマージします。
PrintSetup(type,[printer[,width,height]])
印刷コマンドの環境設定ができます。 type は 0〜4 の範囲の値で、以下のように解釈されます。

type が 4 (その他) で 2 番目の引数が指定されている場合、2 番目の引数は 「その他の」印刷コマンドを含む文字列でなければなりません。
type が 0 (lp) または 1 (lpr) で 2 番目の引数が指定されている場合、 2 番目の引数はレーザプリンタの名前を含むものと解釈されます (2 番目の引数が空文字列ならば、何もセットされません)

3 番目と 4 番目の引数はそれぞれページ幅と高さを指定します。 単位は 1/72 インチ (1 ポイントにほとんど等しい) なので、8.5×11 インチの用紙は 612, 792 となり、A4 の用紙は (約) 595, 842 となります。

PrintFont(type[,pointsize[,sample-text/filename[,output-file]]])
カレントフォントを PrintSetup の設定に従って印刷します。 type の値は以下のとおりです (意味は印刷に関するセクションの記述のとおりです)

pointsize は 1 個の整数か、整数からなる配列 1 個のいずれかです。 この値の指定は type が 0, 3 または 4 の時のみに意味を持ちます。 省略時または 0 を指定した時はデフォルト値が使用されます。 フォント表示の時は、値を 1 個しか参照しません。

type に 3 を指定した時は、サンプルテキストを含むファイルの名前を指定することができます。 このファイルは UCS2 フォーマット (頭に 0xfeff がつきます) か、現在のデフォルトエンコーディングが使用できます。 空の文字列を指定するか、引数を省略した場合には、 FontForge はデフォルト値を使用します。

環境設定の PrintSetup がファイル (PostScript または PDF) に出力するように指定されている場合、4 番目の引数で出力ファイルのファイル名を指定します。

Quit(status)
status を終了ステータスとして FontForge を終了します。(保存していないフォントを保存するように促すことはしません)。カレントフォントが無い状態でも実行可能です。
Cut
選択中の全てのグリフのコピーを作成し、クリップボードに保存してから選択していたグリフを削除します。
Copy
選択中のすべてのグリフのコピーを作成します。
CopyReference
選択中のすべてのグリフへの参照を作成し、それらをクリップボードに格納します。
CopyWidth
選択中のすべてのグリフの幅をクリップボードに格納します。
CopyVWidth
選択中のすべてのグリフの縦方向の送り幅をクリップボードに格納します。
CopyLBearing
選択中のすべてのグリフの左サイドベアリングをクリップボードに格納します。
CopyRBearing
選択中のすべてのグリフの右サイドベアリングをクリップボードに格納します。
CopyGlyphFeatures(arg,...)
この手続きは現在選択中の文字 (1 文字だけ) の機能をコピーし、クリップボードに格納します。

arg には文字列か整数値を使用することができ、文字列の場合は 4 文字の OpenType タグ ("kern" など) または Mac の機能設定 ("<1,1>" など) のどちらかを使用することができます。整数の場合、上のいずれかの整数表現でなければなりません。または、arg には文字列か整数からなる配列を指定することもできます。 (この場合、引数はちょうど 1 個でなければなりません)

機能 'kern' は現在選択中のグリフを 2 文字のうち最初の文字として含む全てのカーニングペアにマッチします。(架空の) 機能 '_krn' は、現在選択中の文字を 2 文字のうち最後の文字として含む全てのカーニングペアにマッチします。'vkrn' と '_vkn' も同様です。

Paste
クリップボードの内容を、カレントフォントの選択中のグリフにコピーします (そこに今まであった内容は削除されます)
Paste Into
クリップボードの内容を、カレントフォントの選択中のグリフにコピーします (今まであった内容に追加されます)
PasteWithOffset(xoff,yoff)
PasteInto() を行う前に、クリップボードを (xoff, yoff) だけ平行移動します。アクセントつきグリフを構築するのに使用できます。
SameGlyphAs
クリップボードに 1 個のグリフへの参照が含まれているときにこのコマンドを実行すると、選択中のすべてのグリフがそのグリフを参照するようになります。
Clear
選択中のすべてのグリフを消去します。
ClearBackground
選択中のすべてのグリフの背面を消去します。
CopyFgToBd
選択中のすべてのグリフに対し、前面のスプラインを背面にコピーします。
Join([fudge])
選択中のグリフ内の開いたパスを (重なり合った点の所で) 結合します。 fudge が指定されている場合は、結合する点同士の距離が fudge ユニットより近ければ、一致しなくても重なっていると見なします。
UnlinkReference
選択中のすべてのグリフに含まれる参照を解除します。
SelectAll
すべてのグリフを選択します。
SelectNone
すべてのグリフを選択解除します。
Select(arg1, arg2, ...)
このコマンドは、まず現在の参照を解除し、それから引数を 2 個ずつ対にして得られる範囲内 (両端を含む) のどれかに含まれるグリフをすべて選択します。 最後に 1 個だけ余った引数がある場合、その 1 個のグリフも選択します。 引数は以下のいずれかの方法によって指定できます:
SelectMore(arg1, arg2, ...)
上のコマンドと同じですが、このコマンドは選択中の文字を消去せずに、現在選択中の文字に上書きします。
SelectIf(arg1,arg2, ...)
Select() と同じですが、フォントにグリフが存在しなかった時にエラー表示を出さず、その代りにエラーコードを返すところが異なります。
SelectByATT(type,tags,contents,search-type)
処理に関してはATT メニューコマンドによる選択を参照してください。 type に指定可能な値は以下のとおりです:
"Position" 単純な位置指定
"Pair" ペア単位の位置指定 (ただしカーニングは無し)
"Substitution" 単純な置換
"AltSubs" 代替文字群からの置換
"MultSubs" 複数文字への置換
"Ligature" 合字
"LCaret" 合字のキャレット位置指定
"Kern" カーニング
"VKern" 縦書き用カーニング
"Anchor" アンカークラス

search_type の値は以下のとおりです。

  1. 結果を選択する
  2. 現在の選択内容に追加する
  3. 現在の選択内容を絞り込む

Reencode(encoding-name[,force])
カレントフォントを、指定された以下のどれかのエンコーディングに並べ替えます。
compacted,original,
iso8859-1, isolatin1, latin1, iso8859-2, latin2, iso8859-3, latin3, iso8859-4, latin4, iso8859-5, iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-10, isothai, iso8859-13, iso8859-14, iso8859-15, latin0, koi8-r, jis201, jisx0201, AdobeStandardEncoding, win, mac, symbol, wansung, big5, johab, jis208, jisx0208, jis212, jisx0212, sjis, gh2312, gb2312packed, unicode, iso10646-1, TeX-Base-Encoding, ユーザ定義の符号化方式のどれか一つ。 現在の文字の並びを、強制的に与えられたエンコーディングとして解釈するように指定することもできます。
SetCharCnt(cnt)
フォントに含まれるグリフの個数を設定します。
LoadEncodingFile(filename)
LoadTableFromFile(tag,filename)
どちらの引数も文字列でなければならず、最初の引数は 4 文字のテーブルタグでなければなりません。ファイルを読み込み、フォント内に tag で指定された名前のテーブルとして保存されます。ff が知っているテーブル名を tag に指定しないでください!
SaveTableToFile(tag,filename)
どちらの引数も文字列でなければならず、最初の引数は 4 文字のテーブルタグでなければなりません。ファイルを読み込み、保存されたテーブルのリストから与えられたタグをもつテーブルを検索して、指定したファイルに保存します。
RemovePreservedTable(tag)
tag で指定された保存されたテーブルを検索し、フォントから削除します。
HasPreservedTable(tag)
保存されたテーブルに名前が tag であるテーブルがあれば真を返します。
SetFontOrder(order)
フォントのアウトラインの次数を指定します。 order に指定できる値は 2 か 3 だけです。フォントの以前の次数を返します。
SetFontHasVerticalMetrics(flag)
フォントが縦書き用メトリックを含んでいるかどうかを設定します。値が 0 であればメトリックを含まず、 それ以外の値であれば含んでいることを意味します。以前の設定値を返します。
SetFontNames(fontname[,family[,fullname[,weight[,copyright-notice[,fontversion]]]]])
フォントにつけられた各種の PostScript 名を指定します。name が存在しない (または空文字列である) 場合、変更されません。
SetFondName(fondname)
フォントの FOND 名を設定します。
SetItalicAngle(angle[,denom])
イタリック体の傾き角を表す PostScript のフィールドを正しくセットします。 denom が指定されている場合、angle の値はまず denom で割ってから、イタリック角のフィールドに格納されます (実数値を表すための小細工です)。 angle の大きさは度数で表されます。
SetMacStyle(val)
SetMacStyle(str)
引数は整数でも文字列でも構いません。 整数の場合、Mac で定義されているスタイルを表す以下のビットの組合せとなります:
0x01 Bold (ボールド)
0x02 Italic (イタリック)
0x04 Underline (下線)
0x08 Outline (縁どり文字)
0x10 Shadow (影つき文字)
0x20 Condensed (長体)
0x40 Extended (平体)
-1 FontForge はフォント名から推測を行います。

ビット 0x20 と 0x40 (長体と平体) は両方同時に指定できません。

引数が文字列である場合、複数のスタイル名を繋げたものを、例えば "Bold Italic Condensed" のように指定します。

SetTTFName(lang,nameid,utf8-string)
MS プラットフォームで使用される、指定された言語・IDの TrueType 名を指定します。 Lang は MS のサポートする 言語/ロケール に含まれていなければならず、名前 ID は 標準の名前指定で用いる小さな整数 のどれかでなければなりません。 空文字列 ("") はエントリを削除するのに使用できます。
例: アメリカ英語の言語/ロケールで、SubFamily 文字列を指定するには以下のようにします:
   SetTTFName(0x409,2,"Bold Oblique")
GetTTFName(lang,nameid)
引数 lang および nameid は上と同じ意味です。 現在の値を UTF-8 で符号化された文字列として返します。 値が存在しない引数の組合せに対しては、"" を返します。
SetPanose(array)
SetPanose(index,value)
フォントの panose 値を設定します。 10 個の整数からなる配列 1 個を引数としてすべての panose 値を設定するか、 2 個の整数を引数として font.panose[index] = value とする設定を行うかのどちらかが可能です。
SetUniqueID(value)
PostScript の UniqueID フィールドに指定した値を設定します。 値 0 を与えた場合、FontForge は適正な範囲に含まれる乱数値を自動的に選びます。
SetTeXParams(type,design-size,slant,space,stretch,shrink,xheight,quad,extraspace[...])
TeX の (テキスト) フォントパラメータを設定します。
type は 1, 2, 3 のいずれかで、フォントがテキスト用、数学用または数学用拡張フォントのどれであるかによって変わります。
design-size は、フォントデザイン時に意図したポイントサイズです。
残りのパラメータは Knuth の METAFONT ブックの (原書) 98-100 ページに書かれています。
slant は百分率で表されています。その他のすべての値は em ユニットで表されています。
type が 1 のときは、上に示した 9 個の引数が必要です。 type が 2 のときは、24 個の引数が必要です (残りの 15 個は METAFONT ブックに説明があります)。 type が 3 のときは、15 個の引数が必要です。
SetCharName(name[,set-from-name-flag])
現在選択中の 1 個のグリフに、name で指定した名前を設定します。 set-from-name-flag がないか、true と指定されている場合は、その名前に一致する Unicode 値と合字文字列を指定します。
SetUnicodeValue(uni[,set-from-value-flag])
現在選択されている文字に、name で指定した名前を設定します。 set-from-name-flag がないか、true と指定されている場合は、その名前に一致する Unicode 値と合字文字列を指定します。
SetCharColor(color)
現在選択されているグリフをすべて、color で指定した色 (24 ビット RGB (0xff0000 が赤) で表す) に設定します。 特別な値として、-2 はデフォルトの色を示します。
SetCharComment(comment)
現在選択されているグリフに comment で指定したコメントを設定します。 コメントは現在のエンコーディングから Unicode に変換されます。
BitmapsAvail(sizes)
フォントデータベース内に格納されたビットマップフォントのサイズ一覧を制御します。 値は各サイズからなる配列で指定します。 サイズがフォントデータベース内に存在しない場合、ビットマップが生成されます。 フォントデータベースに存在するサイズが指定されなかった場合、削除されます。 指定されたサイズが既にフォントデータベース内に存在する場合、そのまま変更されません。
グレイマップフォントを指定したい場合、下位 16 ビットをピクセルサイズとして、上位 16 ビットをピクセルごとのビット数として扱います。 例えば 0x8000c は、各ピクセル 8 ビットを持つ 12 ピクセルフォントとなります。 ただし、12 ピクセルのビットマップフォントを指定するのには、0xc と 0x1000c の両方の値を用いることができます。
BitmapsRegen(sizes)
既に生成されているビットマップフォント内の特定のビットマップを更新することができます。 選択中のすべてのグリフに対し、指定された各ピクセルサイズを再生成します。
ApplySubstitution(script,lang,tag)
3 個の引数はすべて、4 文字を越えない文字列でなくてはなりません (4 文字より短い文字列は、後ろに空白が追加されます)。 このコマンドは、選択中の各グリフに対して、そのグリフの置換リストを検索し、 tag で指定されたタグを持つ (それに加え、スクリプトと言語の組合せがその置換に一致する) 置換が見つかった場合に置換を実行します ― すなわち、置換によって指定された異体字グリフを探して現在のグリフをそれで置き換え、異体字グリフをフォントから削除します。

FontForge は文字列 "*" をスクリプトや言語の両方で使用できる (ただしタグには使用できません) ワイルドカードとして認識します。 すべての文字を縦書き用の字形に置き換えたい場合はこのようにします:

SelectAll()
ApplySubstitution("*","*","vrt2")
Transform(t1,t2,t3,t4,t5,t6)
各引数は 100 で割られます。その後、選択中のすべてのグリフをこの行列で変換します。
HFlip([about-x])
選択中のすべてのグリフを、垂直線 x=about-x を中心にして、水平方向に反転します。 引数を指定しない場合、選択中の各グリフを、その中心軸の周りで反転します。
VFlip([about-y])
選択中のすべてのグリフを、水平線 y=about-y を中心にして、垂直方向に反転します。 引数を指定しない場合、選択中の各グリフを、その上下中心線の周りで反転されます。
Rotate(angle[,ox,oy])
選択中のすべてのグリフを指定された度数だけ回転します。 最後の 2 個の引数が指定されている場合、その点が回転の中心となります。 指定しない場合、グリフの上下・左右の中心を使用します。
Scale(factor[,yfactor][,ox,oy])
選択中のすべてのグリフを拡大・縮小します (拡大率は百分率で指定します)
Skew(angle[,ox,oy])
Skew(angle-num,angle-denom[,ox,oy])
選択中のすべてのグリフを指定した角度だけ傾けます。
Move(delta-x,delta-y)
選択中のすべてのグリフに含まれる点を、指定した量だけ移動します。
ScaleToEm(em-size)
ScaleToEm(ascent,descent)
フォントの高さと深さを変更し、フォント内のすべての座標値を新しい em 値 (高さと深さの和) と古い値の比に合わせて拡大・縮小します。
NonLinearTransform(x-expression,y-expression)
x と y に対する正しい式を含む 2 個の文字列引数をとり、それらの式を用いて選択中のすべてのグリフを変換します。
<e0> := "x" | "y" | "-" <e0> | "!" <e0> | "(" <expr> ")" |
	"sin" "(" <expr> ")" | "cos" "(" <expr> ")" | "tan" "(" <expr> ")" | 
	"log" "(" <expr> ")" | "exp" "(" <expr> ")" | "sqrt" "(" <expr> ")" |
	"abs" "(" <expr> ")" | 
	"rint" "(" <expr> ")" | "float" "(" <expr> ")" | "ceil" "(" <expr> ")"
<e1> := <e0> "^" <e1>
<e2> := <e1> "*" <e2> | <e1> "/" <e2> | <e1> "%" <e2> 
<e3> := <e2> "+" <e3> | <e2> "-" <e3>
<e4> := <e3> "==" <e4> | <e3> "!=" <e4> |
	<e3> ">=" <e4> | <e3> ">" <e4> |
	<e3> "<=" <e4> | <e3> "<" <e4> 
<e5> := <e4> "&&" <e5> | <e4> "||" <e5>
<expr> := <e5> "?" <expr> ":"

NonLinearTrans("200+(x-200)*abs(y-300)/300","y")

このコマンドはデフォルトのビルドでは使用できません。 configure-fontforge.h を変更して、FontForge を再構築してください。

ExpandStroke(width)
ExpandStroke(width,line cap, line join)
ExpandStroke(width,line cap, line join,0,removeinternal /external flag)
ExpandStroke(width,calligraphic-angle,height-numerator,height-denom)
ExpandStroke(width,calligraphic-angle,height-numerator,height-denom, 0, remove internal/external flag)
最初のフォーマットでは、線端は "butt", 線の結びは "round" と見なされます。
"remove internal/external" フラグの値が 1 であれば内側の輪郭を除去し、 2 であれば外側の輪郭を除去します。 最初の 3 つの呼び出しは PostScript の "stroke" コマンドをシミュレートし、後ろ 2 つはカリグラフィ的なペンをシミュレートします。
Width
PostScript の "stroke" コマンドでは、width は作成される 2 本の線の間の距離です。 より正確に言うと、オリジナルの曲線のすべての点に対して、その点における曲線の向きに垂直なベクトルに沿って width/2 ユニットだけ離れた点が追加されます。 カリグラフィ的なペンでは、width は、曲線を描くのに使われるペンの太さです。
Line-cap
以下の 3 つのうちいずれかの値です: 0=> butt, 1=>round, 2=>square
Line-join
以下の 3 つのうちいずれかの値です: 0=>miter, 1=>round, 2=>bevel
caligraphic-angle
ペンを保持する (固定の) 角度です。
height-numerator/denominator
These two values specify a ratio between the height and the width
height = numerator * width / denominator
(the scripting language only deals in integers, so when fractions are needed this kludge is used) これらの 2 つの値は高さと幅のあいだの比率を指定します。 高さ = numerator * width / denominator
(スクリプト言語で扱えるのは整数のみなので、分数が必要なときにはこのような彌縫策を使っています)
remove internal/external contour flags
1 => 内側の輪郭を削除する
2 => 外側の輪郭を削除する
(両方の輪郭を削除することができます)
4 => 結果に重複除去を施す (不安定)
Outline(width)
選択中のすべてのグリフを指定された幅で (グリフの内側で) 縁どりします。 グリフのバウンディングボックスは変更されません。 言い替えれば、Mac でいう "Outline Style" を生成します。
Inline(width,gap)
上の方法でアウトラインを生成してから、 アウトラインの内側に一致するようにアウトラインを縮小します。 言い替えれば、インライン化したグリフを生成します。
Shadow(angle,outline-width,shadow-width)
選択中のすべてのグリフを影つきグリフに変換します。
Wireframe(angle,outline-width,shadow-width)
選択中のグリフをワイヤフレーム化したものに変換します。
RemoveOverlap()
その名のとおりです。
OverlapIntersect()
交差部以外のすべてを除去します。
FindIntersections()
曲線が交差するすべての箇所を検出し、そこに点を追加します。
Simplify()
Simplify(flags,error[,tan_bounds[,bump_size[,error_denom,line_len_max]]])
引数が指定されていない時の処理は自明です。 flags が -1 の時には、冗長なデータの整理を行います。 それ以外の場合、flags の各ビットは以下のように扱われます。

The error argument is the number of pixels by which the modified path is allowed to stray from the true path.
引数 error は、変更されたパスが本来のパスから何ピクセルまでかけ離れてよいかを指定します。
引数 tan_bounds は滑らかにする処理を行わない最大の角度を表します。
bunp_size は除去して滑らかに変換するコブが、元の線から最大何ピクセル離れて良いかを指定します。
5 番目の引数が与えられた場合、それは error 項の分母として扱われます (これにより、ユーザは分数ピクセルの距離を指定することができます)。
一般に、端点の両側で方向が異なる線同士を併合しようとしてもうまくいきません。曲線のセグメントが長くなるほど、不愉快な結果を生み出す可能性は高まります。6 番目の引数を指定すると、併合される線の最大長を指定することができます (それより長い線はすべて併合されずに残ります)。

NearlyHvCps([error[,err-denom]])
水平か垂直に非常に近いものの、完全には一致しない位置に制御点があるかどうかをチェックします (これは、(例えば) abs( (control point).x - point.x ) < error であることとほとんど同義です。) ここで error は以下のいずれかです;
引数を指定していない場合
最初の引数 引数を 1 個だけ指定した場合
(最初の引数) / (2 番目の引数) 引数を 2 個指定している場合
NearlyHvLines([error[,err-denom]])
Checks for lines which are almost, but not quite horzontal or vertical (where almost means (say) that abs( (end point).x - (start point).x ) < error, where error is either: 水平線か垂直線に非常に近いものの、完全には一致しない線があるかどうかをチェックします (これは、(例えば) abs( (end point).x - (start point).x ) < error であることとほとんど同義です。) ここで error は以下のいずれかです;
引数を指定していない場合
最初の引数 引数を 1 個だけ指定した場合
(最初の引数) / (2 番目の引数) 引数を 2 個指定している場合
AddExtrema()
RoundToInt([factor])
すべての点/ヒント/参照オフセットの座標値を整数に丸めます。引数 "factor" を指定した場合、rint(factor * x) / factor の式に従って丸めを行います。要するに、factor を 100 に設定すると 100 分の 1 単位で座標値を丸めます。
RoundToCluster([within[,max]])
最初の 2 個の引数は、近い座標を互いにまとめる値を示します。max は前の点から距離 "within" 以内に含まれる点の連鎖があるときに、中心点からのどれだけ多くの "within" を認めるかを指示します。
 RoundToCluster(.1,5)

は、相互に 0.1 em ユニット以内の距離にある座標値をまとめます。-0.1,-0.05,0,0.05,0.1,0.15 のような並びはすべてまとめられます。これは、各々が次の 0.1 以内にあり、どれも中心から 0.5 以上離れていないからです。

AutoTrace()
CorrectDirection([unlinkrefs])
引数がある場合、1 個の整数でなくてはなりません。 その値は、CorrectDirection のコードを実行する前に裏返しの参照をリンク解除するかどうかを制御するフラグとして扱われます。 引数が存在しないか、非ゼロの値が指定された時、裏返しの参照はリンク解除されます。
DefaultATT(tag)
選択中のすべてのグリフについて、与えられたタグに対して適切だと思われる値を推測します。 タグが "*" である場合、FontForge は可能なすべての機能に対して推測を行います。
AddATT(type,script-lang,tag,flags,variant)
AddATT("Position",script-lang,tag,flags,xoff,yoff,h_adv_off,v_adv_off)
AddATT("Pair",script-lang,tag,flags,name,xoff,yoff,h_adv_off,v_adv_off,xoff2,yoff2,h_adv_off2,v_adv_off2)
選択中の 1 個のグリフに対して 1 個のAdvanced Typography 機能を追加します。 最初の引数は Position, Pair, Substitution, AltSubs, MultSubs, Ligature のいずれかです。 2 番目の引数 script-lang は用字系・言語リストで、 4 文字のスクリプト名の後ろに、言語名をカンマ区切りで並べたリスト――または特別な値 "Nested" ――が続きます (言語リストは波括弧 { } で 囲みます)。例:
    grek{dflt} latn{dflt,VIT ,ROM }
3 番目の引数 tag は 4 文字の OpenType 機能タグです。

4 番目の引数 flags は OTF のフラグです (-1 の時は、FontForge が適切なフラグを推測します)。

残りの引数は、最初の引数 (type) によって全く異なります。 type に Position を用いる機能タグを指定した場合、その機能がどのようにこのグリフのメトリックを変形するかを指定する 4 個の整数値を指定します。 type が Pair の場合、次の引数はペア中のもう一つのグリフの名前で、8 個の整数引数が後ろに続きます。最初の 4 個は最初のグリフの位置を指定し、次の 4 個は 2 番目のグリフの位置を変更します。 Substitution 型のタグの場合、5 番目の引数は、現在のグリフを置換する別のグリフの名前です。 AltSubs タグの場合、次の引数は現在のグリフを置き換える候補グリフすべてをスペース区切りで並べたリストです。 MultSubs の場合、次の引数は現在のグリフを置き換える一連のグリフをスペース区切りで並べたリストです。 Ligature の場合、引数は、現在のグリフによって置き換えられる一連のグリフ名をスペース区切りで並べたリストです。

RemoveATT(type,script-lang,tag)
引数に一致する任意の機能タグを削除します (引数は基本的に上と同じですが、何にでもマッチする "*" を使用できる点が異なります)
CheckForAnchorClass(name)
現在のフォントが name で指定した名前 (UTF-8 でなければなりません) と同名のアンカークラスを含む場合、1 を返します。
AddAnchorClass(name,type,script-lang,tag,flags,merge-with)
これらは、「エレメント(L)」→「フォント情報(I)」メニューの 「アンカークラス」ダイアログを反映しています。 最初の引数は UTF-8 でエンコードされたアンカークラスの名前です。 2 番目は "default", "mk-mk", または "cursive" のいずれかです。 3 番目はスクリプト-言語の文字列です:
    grek{dflt} latn{dflt,VIT ,ROM }
4 番目の引数は 4 文字の OpenType 機能タグです。 5 番目の引数は OTF フラグ (-1 のときは、FontForge が適切なフラグを推測します) です。 6 番目と最後の引数は、同じ lookup に統合されるもう一つのアンカークラス (このクラスがまだ他のクラスを統合していない場合、空文字列となります) です。
RemoveAnchorClass(name)
アンカークラス (および、それに伴うすべての点) をフォントから削除します。
AddAnchorPoint(name,type,x,y[,lig-index])
現在選択中のグリフにアンカーポイントを追加します。 最初の引数はアンカークラスの名前です。 2 番目は文字列 "mark", "basechar", "baselig", "basemark", "curseentry" または "cursexit" のどれか 1 つを指定します。 その後ろの 2 つの引数は点の位置を指定します。 最後の引数は、type が "baselig" のときにのみ使用します。
BuildComposite()
BuildAccented()
BuildDuplicate()
AddAccent(accent[,pos])
ちょうど 1 個のグリフを選択していなければなりません。最初の引数はアクセントのグリフ名、またはそのアクセントの Unicode の符号位置です (そのグリフがフォントに存在しなければなりません)。2 番目の引数が存在する場合は、アクセントをどこに置くかを示します……もし省略した場合、アクセントの Unicode 値が使用されます。この引数は以下のフラグの OR を取ったものです。
0x100
0x200
0x400 重ね打ち
0x800
0x1000
0x4000 左中央
0x8000 右中央
0x10000 外側の中心
0x20000 外側
0x40000 左端
0x80000 右端
0x100000 接触する
ReplaceWithReference([fudge])
選択中のグリフのインラインコピーを含むすべてのグリフを検出し、それらを適切なグリフへの参照に変換します。 実行後、選択中の文字の一覧はコマンドによって変更された文字の一覧に切替えられます。

引数 fudge を指定すると、座標値の誤差として許される距離を指定することができます。

MergeFonts(other-font-name[,flags])
other-font-name で指定したフォントをロードし、そのフォントに含まれているグリフでカレントフォントに含まれていないグリフをすべて取り出してカレントフォントに移動します。 flags 引数の解釈は Open 関数と同じです。 現在意味のあるフラグは、フォントを開くライセンスを持っていることを示す fstype=2 のみです。
InterpolateFonts(percentage,other-font-name[,flags])
現在のフォントと、other-font-name で指定された名前のフォントとの間で比率 percentage でフォントを補間します (注意: percentage は負の値や 100 を超える値を使用することができ、その場合はフォントを補外します)。 このコマンドはカレントフォントを新しく作られたフォントに変更します。 注意: この新しいフォントのフォント名を設定する必要があるでしょう。 flag 引数の意味は Open と同じです。

AutoHint()
SubstitutionPoints()
AutoCounter()
DontAutoHint()
AutoInstr()
ClearHints()
AddHHint(start,width)
水平ステムヒントを選択中の任意のグリフに追加します。 ヒントは start で指定した位置から始まり、 wide で指定した幅をもちます。 このヒントは選択中のすべてのグリフに追加されます。
AddVHint(start,width)
垂直ステムヒントを選択中の任意のグリフに追加します。 ヒントは start で指定した位置から始まり、 wide で指定した幅をもちます。 このヒントは選択中のすべてのグリフに追加されます。
ClearCharCounterMasks()
選択中の (1 個の) グリフから、すべてのカウンターマスクを取り除きます。
SetCharCounterMask(cg,hint-index,hint-index,...)
列挙したヒントが第 cg 番目のカウンターマスクに含まれるように、 作成または設定を行います。 ヒント番号 0 は最初の水平ステムヒントに対応し、 1 番は 2 番目に…という要領で対応します。 垂直ステムヒントは水平ステムヒントの後に来ます。
ReplaceCharCounterMasks(array)
これを呼び出すには、ちょうど 1 個のグリフを選択している必要があります。 そのグリフに対し、一連のカウンターマスクを作成します。 1 個だけ指定できる引数は整数 12 個の配列からなる配列です (C で書けば、int array[][12] となるでしょう)。 これは type2 カウンターマスクのフォーマットです。 トップレベルの配列要素の個数は、設定するカウンターグループの個数です。 ここで内側の配列は、カウンターマスクに対応し、1 個のバイト配列として扱われます。 バイト内の各ビットは、対応するヒントがこのカウンター内でアクティブかどうかを指定します。 (ヒントは最大で 96 個なので、最大 12 バイトとなります)。 Array[i][0]&0x80 は最初の水平ステムヒントに対応し、Array[i][0]&0x40 が 2 番目、Array[i][1]&0x80 が 8 番目という要領で対応します。
ClearPrivateEntry(key)
フォントのプライベート辞書から、key をキーにもつ項目を削除します。
ChangePrivateEntry(key,val)
プライベート辞書内の key をキーにもつ項目の値を val に変更します (key がまだ存在しない場合、追加されます)。(たとえ、値が PostScript の数値を表す場合であっても、すべての値は文字列でなければなりません。)
GetPrivateEntry(key)
プライベート辞書から key をキーにもつ値を返します。 すべての返り値は文字列です。 該当する項目が辞書に存在しない場合、空文字列を返します。
SelectBitmap(size)
ビットマップのみのフォントでは、その後で呼び出すメトリックコマンドにおける単位に、どのビットマップの実体を用いるかを選択します。どのビットマップも選択していないときは、単位は em ユニットになり、それ以外の場合、指定したビットマップ実体のピクセル数になります。size はフォントのピクセルサイズでなければなりません。アンチエイリアスフォントを使用しているときは、size は (depth<<16)|pixel_size にセットしなければなりません。value として -1 を選択すると、すべてのビットマップを選択解除します (単位は em ユニットになります)。
SetWidth(width[,relative])
2 番目の引数が存在しないか 0 の場合、文字幅を最初の引数にセットします。 2 番目の引数が 1 の場合、文字幅を最初の引数で指定した量だけ増やします。 第 2 引数が 2 の場合、文字幅は比率〈最初の引数〉/100.0 だけ拡大されます。 ビットマップのみのフォントの場合については、SelectBitmap の単位に関するコメントを参照してください。
SetVWidth(vertical-width[,relative])
2 番目の引数が存在しないか 0 の場合、文字の全高 (縦書き時の送り幅) を最初の引数にセットします。 2 番目の引数が 1 の場合、文字の高さを最初の引数で指定した量だけ増やします。 2 の場合は、文字の高さは比率〈最初の引数〉/100.0 だけ拡大されます。 ビットマップのみのフォントの場合については、SelectBitmap の単位に関するコメントを参照してください。
SetLBearing(lbearing[,relative])
2 番目の引数が存在しないか 0 の場合、左サイドベアリングを最初の引数にセットします。 2 番目の引数が 1 の場合、左サイドベアリングを最初の引数で指定した量だけ増やします。 2 の場合は、左サイドベアリングは比率〈最初の引数〉/100.0 だけ拡大されます。 ビットマップのみのフォントの場合については、SelectBitmap の単位に関するコメントを参照してください。
SetRBearing(rbearing[,relative])
2 番目の引数が存在しないか 0 の場合、右サイドベアリングを最初の引数にセットします。 2 番目の引数が 1 の場合、右サイドベアリングを最初の引数で指定した量だけ増やします。 2 の場合は、右サイドベアリングは比率〈最初の引数〉/100.0 だけ拡大されます。 ビットマップのみのフォントの場合については、SelectBitmap の単位に関するコメントを参照してください。
CenterInWidth()
AutoWidth(spacing)
選択中のすべてのグリフの幅を推測します。 これにより、2 個の隣り合う "I" の字が spacing ユニットだけ離れて配置されます。 (spacing が em サイズ (アセント("高さ")とディセント("深さ")の和) の反数の場合、デフォルト値を使用します)
AutoKern(spacing,threshold[,kernfile])
(AutoKern は一般的にはあまりよく動作しません)
選択中のすべてのグリフを調べてカーニングペアを推測します。 kernfile を指定した場合、FontForge はファイル kernfile からカーニングペアを読み込みます。
SetKern(ch2,offset)
選択中の各グリフと、グリフ ch との間のカーニング量を offset に設定します。 最初の引数は Select() での指定と同じです。 2 番目の引数は、カーニングのオフセットを表す整数です。
RemoveAllKerns()
カレントフォントからすべてのカーニングペアとカーニングクラスを削除します。
SetVKern(ch2,offset)
選択中の各グリフと、グリフ ch との間の縦書きカーニング量を offset に設定します。 最初の引数は Select() での指定と同じです。 2 番目の引数は、カーニングのオフセットを表す整数です。
VKernFromHKern()
カレントフォントからすべての縦書き用カーニングペアとカーニングクラスを削除し、 次に、それらのグリフの縦書き用に横転したグリフ同士の文字のペアに設定された横書き用カーニングデータをコピーすることによって、新しい縦書きカーニングペアを生成します。
RemoveAllVKerns()
カレントフォントからすべての縦書き用のカーニングペアとカーニングクラスを削除します。

MMInstanceNames()
マルチプルマスターセットに含まれるすべてのインスタンスフォントの名前を含む 配列を返します。
MMAxisNames()
マルチプルマスターセットに含まれるすべての軸の名前を含む配列を返します。
MMAxisBounds(axis)
axis は、マルチプルマスターフォントに含まれる軸の数よりも少ない整数です。下限値、デフォルト値と上限値を含む配列を返します。それぞれの値は 65536 倍されていることにご注意ください (それらは Mac では整数値でなくてはならず、FontForge は実数値をサポートしていないからです)。

デフォルト値は、GX の Var という概念に相当します。FontForge は本物のマルチプルマスターフォントに対しては妥当な値をシミュレートします。

MMWeightedName()
マルチプルマスターセットに含まれる重みづけされたフォントの名前を返します。
MMChangeInstance(instance)
ここで instance はフォント名か小さな整数のどちらかです。 文字列を渡した場合、FontForge はマルチプルマスターフォントセットから すべてのフォント (インスタンスフォントと重みづけされたフォント) を検索し、 カレントフォントの名前を指定された物に変更します。 小さな整数を渡したときは、-1 が重みづけされたフォントを表し、 [0,$mmcount) の範囲の値はフォントセット内の特定のインスタンスを表します。
MMChangeWeight(weights)
weights は整数からなる配列で、1 軸に対し整数 1 個が対応します。それぞれの値は必要な値の 65536 倍でなければなりません (一般に小さな実数となる Mac のブレンドを扱うためです)。このコマンドは現在のマルチプルマスターフォントのデフォルトウェイトを異なる値に変更し、それを現在のインスタンスに設定します。
MMBlendToNewFont(weights)
weights は整数からなる配列で、1 軸に対し整数 1 個が対応します。それぞれの値は必要な値の 65536 倍でなければなりません (一般に小さな実数となる Mac のブレンドを扱うためです)。このコマンドはマルチプルマスターフォントをブレンドすることによって全く新規にフォントを作成し、新しいフォントを現在のフォントに設定します。

CIDChangeSubFont(new-sub-font-name)
カレントフォントが CID フォントである場合、 このコマンドはアクティブなサブフォントを指定した物に変更します (引数は、サブフォントの PostScript フォント名を表す文字列です)。
CIDSetFontNames(fontname[,family[,fullname[,weight[,copyright-notice]]]])
CID フォント本体に付随する各種の PostScript 名を設定します。 名前が欠けている場合 (または空文字列の場合) 変更されません。 (これは SetFontName と同じ働きをしますが、カレントフォントではなく、 それを含むトップレベルの CID フォントに作用することが異なります)。
CIDFlatten()
CID フォントを平坦化 (すべてのサブフォントを 1 個に統合) します
CIDFlattenByCMap(cmap-filename)
CID フォントを平坦化し、指定した CMap ファイルによってエンコードした結果を返します。
ConvertToCID(registry, ordering, supplement)
引数 registry, ordering および supplement で指定するグリフ集合を用いて カレントフォントを CID フォントに変換します。 registry と ordering は文字列で、supplement は整数でなければなりません。
ConvertByCMap(cmapfilename)
カレントフォントを指定された CMap ファイルを用いて CID フォントに変換します。 cmapfilename は、Adobe CMap File Format に適合するファイルのパス名で なければなりません。
CharCnt()
カレントフォントに含まれるグリフの個数を返します。
InFont(arg)
フォント内にグリフ arg が存在するかどうかを返します。 引数が整数の場合、値が >= 0 かつ < フォント内のグリフの総数である場合に真を返します。 それ以外の場合、引数は Unicode のコードポイントか PostScript 文字名であると解釈され、そのグリフがフォント内に存在する時に真を返します。
WorthOutputting(arg)
引数 arg の意味は InFont と同様です。 この関数は、グリフにアウトラインまたは参照が含まれているか、または幅が設定されているときに真を返します。
DrawsSomething(arg)
引数 arg の意味は InFont と同様です。 この関数は、グリフにアウトラインまたは参照が含まれているときに真を返します。
CharInfo(str)
CharInfo("Kern",glyph-spec)
CharInfo("VKern",glyph-spec)
CharInfo(str,script,lang,tag)
フォント内の 1 個のグリフだけが選択されていなければなりません。 その時、この関数はそのグリフに関する情報を返します。 返される情報は、文字列 str に依存します (意味は見てのとおりです):

Examples:

Select("A")
lbearing = CharInfo("LBearing")
kern = CharInfo("Kern","O")
Select(0u410)
SetLBearing(lbearing)
SetKern(0u41e,kern)
Select("a")
verta = CharInfo("Substitution","*","dflt","vrt2")


Example 1:

# 選択中のすべてのグリフの色を黄色に設定する。
# FontForge の対話的なセッション中で動かすように作られている。
foreach
  SetCharColor(0xffff00)
endloop

Example 2:

#!/usr/local/bin/fontforge
# ラテン文字のフォントをとり、キリル文字の追加に先だって、
# いくつかの単純な変形を適用する。
# 非対話的な FontForge のセッションからも実行可能。
Open($1);
Reencode("KOI8-R");
Select(0xa0,0xff);
// ラテン文字と同じと思われるこれらの文字をコピーする
BuildComposit();
BuildAccented();

// "R" を裏返しにしたように見える "Я"(Ya) を処理する
Select("R");
Copy();
Select("afii10049");
Paste();
HFlip();
CorrectDirection();
Copy();
Select(0u044f);
Paste();
CopyFgToBg();
Clear();

// "Г"(Gamma) は "L" を上下逆さまにしたように見える
Select("L");
Copy();
Select(0u0413);
Paste();
VFlip();
CorrectDirection();
Copy();
Select(0u0433);
Paste();
CopyFgToBg();
Clear();

// 小型大文字の "K" などの編集の準備をする
Select("K");
Copy();
Select(0u043a);
Paste();
CopyFgToBg();
Clear();

Select("H");
Copy();
Select(0u043d);
Paste();
CopyFgToBg();
Clear();

Select("T");
Copy();
Select(0u0442);
Paste();
CopyFgToBg();
Clear();

Select("B");
Copy();
Select(0u0432);
Paste();
CopyFgToBg();
Clear();

Select("M");
Copy();
Select(0u043C);
Paste();
CopyFgToBg();
Clear();

Save($1:r+"-koi8-r.sfd");
Quit(0);

スクリプトを実行」ダイアログ

このダイアログにより、FontForge の中でスクリプトを直接打ち込んで実行することができます。 もちろん、一番多いケースは、実行したいスクリプトが既にどこかに存在する場合でしょう。そのために [呼び出す(A)] ボタンがダイアログの下についています。 [呼び出す(A)] ボタンを押すと、*.pe の拡張子を持つファイルを探すためのファイル選択ダイアログが現れます (ワイルドカードシーケンスを入力して [フィルタ] ボタンを押すことにより、これを変更することができます)。 スクリプトを選択すると、そのスクリプトを起動するためのコマンドがダイアログのテキストエリアに挿入されます。

スクリプトのカレントフォントは、つねにスクリプトの呼び出し元のフォントに設定されます。

スクリプトメニュー

頻繁に使うスクリプトのリストを、プリファレンスダイアログを用いて作成することができます。 ファイル(F)→環境設定(E) を起動し、[スクリプトメニュー] タブを選択してください。 このダイアログには、10 個の入力可能な項目があり、それぞれに名前 (これがメニュー内に表示されます) と、それを指定した時に実行されるスクリプトファイル名の入力欄が含まれています。

プリファレンスを設定した後、フォントビューからスクリプトを起動することができます。起動には、メニューから直接 (ファイル(F)→スクリプトメニュー→(設定した名前)) 起動するか、ホットキーを使用することができます。 最初に追加したスクリプトは Ctl-Alt-1, 2 番目は Ctl-Alt-2 で起動でき、10 番目は Ctl-Alt-0 となります。

スクリプト内でのカレントフォントは、常に、それを呼び出したフォントにセットされます。

-- -- 目次 -- --