5.3 紙を一杯に使う

用紙の形は長方形なのに, そこに内接する正方形の領域をとって, その中だけ に図を描くのではもったいない, 紙一杯に図を描きたい, という時にも 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::sgcls

program lay3

\resizebox{10cm}{!}{\includegraphics{layout/lay3.eps}}
lay3.rb: frame1

物理的な描画範囲一杯に作画したい時は, 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

不定の概念

FORTRAN 規格の基本的な概念に「不定」という概念があります.これは最も重要な概念の一つでありながら,最もわかりにくい概念でもあります.岩波 FORTRAN 辞典には,

プログラム実行中に,変数,配列要素または部分列が想定できるような値 を持たない定義状態.
とありますが,なかなかイメージが湧きません.簡単にいえば,「○○の時, 変数××は不定となる.」という文章は,コンパイラをつくる人に対しては,「○○の時, 変数××が占めていた記憶領域をどのように使ってもよい.」ということになり,我々プログラマに対しては,「コンパイラをつくる人に,上のように言ってしまったので,××がどうなるかわからない.」ということになります.

「不定」とは逆に,規格によって値が保証されている状態を「確定」といいます.規格上,プログラムの中で引用できる変数は「確定」された変数だけです.変数が「不定」となる例に次のようなものがあります.

  • 変数が未定義のとき
  • メソッド(元サブルーチン)の中の RETURN 文または END 文を実行したとき
  • 異なる型の変数が結合しているとき

2番めの状況を回避するには SAVE 文を使います.SAVE 文は,メソッド(元サブルーチン)の実行が終ってもメソッド(元サブルーチン)内の変数の値を保持するように指示する宣言文です.コンパイラによっては(というより多くのコンパイラでは)メソッド(元サブルーチン)の中で使われる局所変数を保存しますが,これは「方言」です. ただし, DATA 文で指定された変数は,.そ.の.値.が.書.き.換.え.ら.れ. な.い.限.り,RETURN 文または END 文を実行しても「不定」にはなりません.

因みに,DCL の xxpget/xxpset ルーチンが,掲示板の役目を果たせるのは,この DATA 文と SAVE 文のおかげです.