用紙の形は長方形なのに, そこに内接する正方形の領域をとって, その中だけ に図を描くのではもったいない, 紙一杯に図を描きたい, という時にも SLPACK を活用しましょう.
# lay3.rb require "narray" require "numru/dcl" include NumRu include Math #-- graph --- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::sgopn iws DCL::sglset('LFULL', true) DCL::slmgn(0.0, 0.0, 0.08, 0.08) DCL::slrat(1.0, 0.6) DCL::slsttl('FIGURE TITLE', 'T', 0.0, 0.0, 0.03, 1) DCL::slsttl('PROGRAM.NAME', 'B', -1.0, -1.0, 0.02, 2) DCL::slsttl('page:#PAGE', 'B', 1.0, -1.0, 0.02, 3) DCL::sgfrm DCL::slpvpr(1) DCL::sgtxv(0.5, 0.5, 'FIGURE') DCL::sgclsprogram lay3
物理的な描画範囲一杯に作画したい時は, SGPACK の sglset を用いて
論理型内部変数 'LFULL' を .true. にします. これが, .false.(初期値)の時には, 最大内接する正方形が作画可能な範囲となります.
物理的な描画範囲はデバイスによって違いますから,'LFULL'を.true.にしたときは, 異なるデバイスに出力する際にエラーを起こして出力
できなくなる可能性があります. そこで, 11行めのように slrat を使っ
て「私は1×0.6 の領域に図を描きたいのだ」と宣言しておくことを
お勧めします. slratで縦横比が指定されると, このフレームが最大内
接するように描画領域を設定するので, どんなデバイスに出力してもエラーは
起こりません.
この例では, 作画領域の上下に8%ずつのマージンをとってタイトル等のスペー
スを確保した後に,
1×0.6 の領域を宣言しています. まだ, 上下に
余裕がありますので, 左右にはいっぱいにフレームが確保できました. 上下の
マージンを大きくとると, この縦横比を保つために, 左右にもマージンが自動
的にできるようになります.
SLPACK では基本的に最大描画領域に対する比率でマージンなどをとるように なっていますが, 目的によっては絶対的な長さ(例えば10cm)を指定したい場合 もあるでしょう. slsize または slform で第1レベルめのフレー ムを再設定しておけば, その範囲が物理的に描画できる範囲内である限り, 異 なったデバイスでも同じ大きさの図が出力できます. slform は描画範 囲を A4, B5 等の規格の大きさで, また, slsize は cm 単位で指定し ます. 通常 A4 の用紙の最大描画範囲は用紙そのものの大きさよりも小さいの で, A4 の紙に slsizeで A4 を指定するとエラーとなりますから, ご注 意下さい. また, コンソールディスプレイなど, 物理的な大きさがはっきり しないデバイスに対しては, 適当な大きさが仮定されています.
FORTRANのひけつ 1
|