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)スクリプトを実行(X)... でスクリプトを起動した場合、現在編集中のフォントがカレントフォントとなり、そうでなければ初期状態ではカレントフォントは存在しません。 カレントフォントを変更するには Open() と New(), Close() の各コマンドを使います。 FontForge は、現在開かれたフォントのリストも保持しています。 このリストの並び順にはとくに意味はありません。 リスト内の最初のフォントは $firstfont です。

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

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

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

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

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

組込み手続きのアルファベット順一覧

- A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z -

フォントを読み込む必要がない組込み手続き

ファイル(F)メニューと同じようにふるまう組込み手続き

ファイル操作

編集(E)メニューのようにふるまう組込み手続き

選択(S)サブメニューのようにふるまう組込み手続き

エレメント(L)メニューのようにふるまう組込み手続き

フォント情報

グリフ情報

高度組版機能を操作する組込み手続き

エンコーディング(N)メニューのようにふるまう組込み手続き

ヒント(H)メニューのようにふるまう組込み手続き

メトリック(M)メニューのようにふるまう組込み手続き

マルチプルマスター操作ルーチン

  • MMAxisBounds(axis)
  • MMAxisNames()
  • MMBlendToNewFont(weights)
  • MMChangeInstance(instance)
  • MMChangeWeight(weights)
  • MMInstanceNames()
  • MMWeightedName()

    CID フォント操作ルーチン

  • CIDChangeSubFont(new-sub-font-name)
  • CIDFlatten()
  • CIDFlattenByCMap(cmap-filename)
  • CIDSetFontNames(fontname[,family[,fullname[,weight[,copyright-notice]]]])
  • ConvertToCID(registry, ordering, supplement)
  • ConvertByCMap(cmapfilename)

    ユーザとのやりとり

    環境設定

    数学関数

    Unicode

    文字列操作

    配列操作

    その他