[目次へもどる] [前へ] [次へ]

文字を描く

すでに,一番始めに示した"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"の出力結果を 見てください.

moji.jpg
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 

この出力結果は下の図のとおりです.

moji_ichi.jpg
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"とを交換する.
      {width, 0, (Msaka)}
0 から を"sub"で引き算する(負の値になる)
      {-width, (Msaka)}
0(ゼロ)をスタックに積む
      {0, -width, (Msaka)}
"rmoveto"で文字列の幅だけ負の方向(左)へ相対移動する.
      {(Msaka)}
"show"で作画する.
      {}
分かりましたか? ちょっとした演習問題ですね.簡単に言えば, まず指定位置に"moveto"し,文字の幅を計り,"-width 0 rmoveto"で 文字の幅だけ左に移動して作画しているだけです. これを応用して19行目のように,文字幅を2で割ると簡単に真中に 合わせることができます.

フォントパスをカレントパスに追加する

フォントパスをカレントパスに追加することもできます. あまり使う機会はないでしょうから,例を示すだけで特に説明しません.

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 
font.jpg
30dpiでA4用紙に出力

[目次へもどる] [前へ] [次へ]