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[<式>] の形で、コマンドの引数を配列としてアクセスすることができます。
項は以下のいずれかを取ることができます。
[1, 2, 3, 5, 8]
のように。配列の作成に使用されます。
以下の 3 種類のコメント形式がサポートされています:
式は C とほぼ同じですが、二、三の演算子は省かれ、二、三がシェルスクリプトから追加されています。演算子の優先順位はわずかに単純化されています。 その結果、演算子 (とそれらの優先順位) は以下のようになっています:
カンマ演算子、"?:" 演算子が存在しないことに注意してください。 “AND”,“OR”と、代入演算子の優先順位は単純化されています。
手続き呼び出しは名前トークンまたは文字列に対して適用することができます。 名前または文字列が FontForge の内部手続きのどれかと認識された場合、それが実行されます。それ以外の場合は実行するファイルの名前であると見なされ、そのファイルが呼び出されます (ファイル名には、トークンとして使用できない文字を含むことができるため、ファイル名を指定するために文字列一般を指定できるのは肝要です)。 手続き名がディレクトリを含まない場合、現在のスクリプトファイルと同じディレクトリにある物と見なされます。手続きに渡すことのできる引数は最大で 25 個です。
配列は参照渡しされます。文字列と整数は値渡しされます。
変数は、値を代入することによって (“=”のみで) 作成することができます。
ですから
i=3
によって、“i”の変数定義を行うことができます。変数のスコープは現在のファイルのみに限定されているので、呼び出された手続きには引き継がれません。
文は以下のいずれかをとることができます。
if ( 式 )
文の並び
{elseif ( 式 )
文の並び}
[else
文の並び]
endif
while ( 式 )
文の並び
endloop
foreach
文の並び
endloop
return [ 式 ]
shift
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() を使うことができます。
全ての組込み変数 は“$”で始まるので、自分で新しく“$”で始まる変数を作ることはできません (既存の変数 (の一部) に値を代入することはできますが)。
$0
現在実行中のスクリプトファイルの名前
$1
スクリプトファイルに渡された最初の引数
$2
スクリプトファイルに渡された 2 番目の引数
$argc
スクリプトファイルに渡された引数の個数 ($0 は常に存在するので、
最小値は 1 となります)
$argv
により、全ての引数を配列としてアクセスすることができます
$curfont
カレントフォントが含まれているファイルの名前
$firstfont
フォントリスト (Open() により作成可能です) の最初に位置するフォントのファイル名。
フォントを読み込んでいなければ、この値は空文字列となります。
この値によって、FontForge がフォントを読み込み済みかどうかを判別できます。
$nextfont
リスト内でカレントフォントの次に位置するファイルの名前。
(カレントフォントがリストの最後である場合は、空文字列)
$fontchanged
カレントフォントが変更されていれば 1,
フォントを読み込んでから (または保存してから) 変更が無ければ 0。
$fontname
postscript の FontName フィールドに含まれる名前
$familyname
postscript の FamilyName フィールドに含まれる名前
$fullname
postscript の FullName フィールドに含まれる名前
$fondname
これがセットされている場合、カレントフォントを Macファミリーを出力(F)
で出力したときの FOND の名前
$weight
postscript の Weight フィールドに含まれる名前
$copyright
postscript の Notice フィールドに含まれる名前
$filename
フォントが含まれるファイルの名前
$fontversion
フォントのバージョンを示す文字列
$cidfontname
はトップレベルの CID-Keyed フォントの名前
(存在しない場合は空文字列) を返します。$cidfamilyname, $cidfullname, $cidweight, $cidcopyright
上記の各項目と同様です。
$mmcount
マルチプルマスターフォントに含まれるインスタンスの個数 (マルチプルマスターフォントでない場合は 0)
$italicangle
PostScript の italic angle フィールドの値
$curcid
カレントフォントのフォント名を返します。
$firstcid
現在の CID フォントに含まれる最初のフォントの名前を返します。
$nextcid
現在の CID フォントに含まれる次のフォントの名前 (現在のサブフォントが最後の 1 個である場合は空文字列) を返します
$macstyle
MacStyle フィールド (フォントがボールド・イタリック・コンデンスト等であるかどうかを示すビットの集まり) を返します。
$bitmaps
このフォントにおいて作成されたビットマップのピクセルサイズを全て含む配列を返します
(フォントデータベースにグレイマップが含まれる場合、その値は
(<BitmapDepth><<16)|<PixelSize>
という配列で表されます)。
$em
はフォントが使用する em ユニットの大きさを返します。
$ascent
はフォントの高さを返します。
$descent
はフォントの深さを返します。
$selection
カレントフォントの各グリフが 1 項目に対応し、そのグリフが選択されているか否か (0=>非選択, 1=>選択)を示す配列を返します。
$panose
カレントフォントの 10 要素の panose 値を含む配列を返します。
$trace
この値が (訳註: 非 0 に) セットされていると、FontForge
は、手続きを呼び出すごとにトレース表示を行います。
$version
現在実行中の FontForge のバージョンを含む文字列を返します。
この値は“20050817”のような書式です。
$
<環境設定項目> (例えば
$AutoHint
) により、その環境設定項目に対応する値を調べることができます (値の設定には
SetPref
を使用してください)
以下の例では、読み込み済みの全フォントに対して同じ操作を実行します。
file = $firstfont while ( file != "" ) Open(file) /* 操作を実行 */ file = $nextfont endloop
組込み 手続き の動作は、同じ名前のメニュー項目とほとんど同じです。ここでの説明はしばしば概要しか示されていませんので、より詳しい情報は当該のメニュー項目を調べてください。
ファイル(F)
メニュー
編集(E)
メニュー
選択(S)
サブメニュー
エレメント(L)
メニュー
エンコーディング(N)
メニュー
ヒント(H)
メニュー
メトリック(M)
メニュー
- 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)
メニューのようにふるまう組込み手続き
# 選択中のすべてのグリフの色を黄色に設定する。 # FontForge の対話的なセッション中で動かすように作られている。 foreach SetCharColor(0xffff00) endloop
#!/usr/local/bin/fontforge # 2つのフォントを比較する sfddiff スクリプト if ( Strtol($version)<20060330 ) Error( "FontForge を新しいバージョンに更新してください" ) endif flags=0x789 outfile="" while ( $argc > 1 && Strsub($1,0,1)=="-" ) temp = $1 if ( Strsub(temp,1,2)=='-' ) temp = Strsub(temp,1) endif if ( temp=="-ignorehints" ) flags = flags & ~0x8 elseif ( temp=="-ignorenames" ) flags = flags & ~0x100 elseif ( temp=="-ignoregpos" ) flags = flags & ~0x200 elseif ( temp=="-ignoregsub" ) flags = flags & ~0x400 elseif ( temp=="-ignorebitmaps" ) flags = flags & ~0x80 elseif ( temp=="-exact" ) flags = flags | 0x2 elseif ( temp=="-warn" ) flags = flags | 0x44 elseif ( temp=="-merge" ) flags = flags | 0x1800 shift outfile = $1 elseif ( temp=="-help" ) Print( "sfddiff: [--version] [--help] [--usage] [--ignorehints] [--ignorenames] [--ignoregpos] [--ignoregsup] [--ignorebitmaps] [--warn] [--exact] fontfile1 fontfile2" ) Print( " 2つのフォントファイルを比較する." ) Print( " --ignorehints: PostScript ヒントや TrueType 命令を比較しない" ) Print( " --ignorenames: フォント名を比較しない" ) Print( " --ignoregpos: カーニング等の指定を比較しない" ) Print( " --ignoregsub: 合字等の指定を比較しない" ) Print( " --ignorebitmaps: ビットマップを比較しない" ) Print( " --exact: 通常は sfddiff は厳密に同一ではないもの両者の違いが微細な" ) Print( " 文字列を一致した物と見なします (そのおかげで、TrueType と" ) Print( " PostScirpt フォントを比較してまともな答えが得られます)." ) Print( " また, sfddiff は比較を行う前に参照を展開します (それに" ) Print( " より, (参照を含まない) PostScript フォントと (参照を含む)" ) Print( " 元データを比較することができます). このフラグを設定した") Print( " 場合, グリフが一致するかどうかの判定を厳密に行います.") Print( " --warn: 正確に一致しない物が無いときに, 詳しい情報を出力する" ) Print( " --merge outfile: アウトラインの相異点があるとき, 適切なグリフの背景に" ) Print( " 差分を書き出す" ) return(0) elseif ( temp=="-version" ) Print( "Version 1.0" ) return(0) else break endif shift endloop if ( $argc!=3 || $1=="--usage" || $1=="-usage" ) Print( "sfddiff: [--version] [--help] [--usage] [--ignorehints] [--ignorenames] [--ignoregpos] [--ignoregsup] [--ignorebitmaps] [--warn] [--exact] [--merge outfile] fontfile1 fontfile2" ) return(0) endif Open($2) Open($1) CompareFonts($2,"-",flags) if ( outfile!="" ) Save(outfile) endif
#!/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 となります。
スクリプト内でのカレントフォントは、常に、それを呼び出したフォントにセットされます。