すでに,一番始めに示した"helloworld.ps"で文字を描いてしまっておいて, いまさらという気もしなくはないですが,文字の作画について説明します. 前にちらっと説明したとおり,文字も基本的にパスを作成して塗りつぶすこと によって作画します.また,このパスは文字の作画以外にも,普通のパス と同じように輪郭をかいたりクリップする(後で説明します)ことが可能です.
フォントはあなたのお使いのシステムに大きく依存します.まず, あなたの使用しているシステムではどのようなフォントが使えるかを 確認してください.といっても面倒なので,どのシステムにも標準に備わっている (と思われる)フォントをここでは作画してみましょう.次の"moji.ps"を 見てください.
moji.ps |
001 %!PS-Adobe-3.0 002 003 /Times-Roman findfont 50 scalefont setfont 004 10 700 moveto (Times-Roman) show 005 006 /Times-Bold findfont 50 scalefont setfont 007 10 650 moveto (Times-Bold) show 008 009 /Times-Italic findfont 50 scalefont setfont 010 10 600 moveto (Times-Italic) show 011 012 /Times-BoldItalic findfont 50 scalefont setfont 013 10 550 moveto (Times-BoldItalic) show 014 015 /Helvetica findfont 50 scalefont setfont 016 40 500 moveto (Helvetica) show 017 018 /Helvetica-Bold findfont 50 scalefont setfont 019 40 450 moveto (Helvetica-Bold) show 020 021 /Helvetica-Oblique findfont 50 scalefont setfont 022 40 400 moveto (Helvetica-Oblique) show 023 024 /Helvetica-BoldOblique findfont 50 scalefont setfont 025 40 350 moveto (Helvetica-BoldOblique) show 026 027 /Courier findfont 50 scalefont setfont 028 10 300 moveto (Courier) show 029 030 /Courier-Bold findfont 50 scalefont setfont 031 10 250 moveto (Courier-Bold) show 032 033 /Courier-Oblique findfont 50 scalefont setfont 034 10 200 moveto (Courier-Oblique) show 035 036 /Courier-BoldOblique findfont 50 scalefont setfont 037 10 150 moveto (Courier-BoldOblique) show 038 039 /Symbol findfont 50 scalefont setfont 040 40 100 moveto (Symbol) show 041 042 showpage 043 |
なんだか,無駄に長いファイルになってしまいましたが,いずれもっとすっきりと Postscriptを記述する方法を紹介しますので,それまで我慢して下さい.たいての システムには少なくとも"moji.ps"であげた以下のフォントはあると思います.
Times-Roman -Bold -Italic -BoldItalic Helvetica -Bold -Oblique -BoldOblique Courier -Bold -Oblique -BoldOblique Symbolこれらがどんなフォントであるかは,フォントマニアの方ならば名前から 一発で分かると思いますが,分からない方は次の"moji.ps"の出力結果を 見てください.
30dpiでA4用紙に出力 |
"moji.ps"の3行目"/Times-Roman"の"/(スラッシュ)"は リテラルオブジェクト(実行可能ではないオブジェクト)であることを 表しており,リテラルオブジェクトはそのままオペランドスタックに 格納されます.ここでは"Times-Roman"という名前を持つリテラルオブジェクト がオペランドスタックに積まれます.次の"findfont"は指定された名前の フォントを検索するオペレータで,見つけたフォント(フォント辞書という 非常に複雑なオブジェクト)をオペランドスタックに格納します. ここで格納されるフォント辞書は常に高さ1の大きさなので,使用したい フォントの大きさに拡大する必要があります."scalefont"はフォント辞書を 指定した大きさに拡大するオペレータで,ここでは"50"の大きさに 拡大しています.そして最後に"setfont"オペレータでこのフォント辞書を カレントフォントに設定しています.4行目の"show"は今更説明は いらないでしょう.
文字列は指定した位置が文字列の左下となるような位置に出力されます. (つまり左揃えですね)しかし,場合によっては文字列を右に揃えたかったり, または中心に揃えたかったりする時もあります.文字列の幅が分かっていれば, 位置は自分で調節できますが,文字列の幅は文字によってことなる場合がある ので一筋縄ではいきません.(文字列の高さは自分で指定しているので 分かりますが)でも大丈夫!,Postscriptには文字列の幅を計ってくれる オペレータ"stringwidth"があります.次の"moji_ichi.ps"はその利用例です.
moji_ichi.ps |
001 %!PS-Adobe-3.0 002 003 300 300 translate 004 005 3 setlinewidth 006 newpath -200 0 moveto 200 0 lineto stroke 007 newpath 0 -100 moveto 0 100 lineto stroke 008 009 /Times-Roman findfont 60 scalefont setfont 010 011 0 0 moveto (Takeshi) 012 show 013 014 0 0 moveto (Msaka) 015 dup stringwidth pop 0 exch sub 0 rmoveto 016 show 017 018 0 100 moveto (Center) 019 dup stringwidth pop 2 div 0 exch sub 0 rmoveto 020 show 021 022 showpage 023 |
この出力結果は下の図のとおりです.
30dpiでA4用紙に出力 |
3行目で座標の原点を紙の中心付近に移動させ5〜6行目で位置の基準となる 十字架を描いています.11・12行目は今までの方法で位置(0,0)に文字列を 描かせた例です.指定した位置が文字列の左下になります. 14・15・16行目は位置(0,0)へ移動し,その位置が文字列の右下になるように 作画しています.この15行目の説明はちょっと複雑なので,オペランドスタックの 中身を追いながら説明します.なお,オペランドスタックの中身は{}で示し, スタックの上から順に左から並べてあります.
14行目の始めでのスタックの中身 {(Msaka)} "dup"で(Msaka)の複製を作る. {(Msaka), (Msaka)} "stringwidth"で(Msaka)の幅を計る.スタックにの幅が積まれる. {height, width, (Msaka)} heightはいらないので"pop"で捨てる. {width, (Msaka)} 0(ゼロ)をスタックに積む {0, width, (Msaka)} "exch"で"0"と分かりましたか? ちょっとした演習問題ですね.簡単に言えば, まず指定位置に"moveto"し,文字の幅を計り,"-width 0 rmoveto"で 文字の幅だけ左に移動して作画しているだけです. これを応用して19行目のように,文字幅を2で割ると簡単に真中に 合わせることができます.を交換する. {width, 0, (Msaka)} 0 から を"sub"で引き算する(負の値になる) {-width, (Msaka)} 0(ゼロ)をスタックに積む {0, -width, (Msaka)} "rmoveto"で文字列の幅だけ負の方向(左)へ相対移動する. {(Msaka)} "show"で作画する. {}
フォントパスをカレントパスに追加することもできます. あまり使う機会はないでしょうから,例を示すだけで特に説明しません.
font.ps |
001 %!PS-Adobe-3.0 002 003 5 setlinewidth 004 /Times-BoldItalic findfont 400 scalefont setfont 005 006 newpath 007 50 50 moveto 008 (We) false charpath 009 stroke 010 011 showpage 012 |
30dpiでA4用紙に出力 |