5.1 1ページに複数の図形

同じ様な図形を沢山並べたい時, SLPACK を使うと非常に簡単にできます. 必 要に応じて, 「改ページ」の操作も自動的に行なわれます.

最初のプログラムlay1 では, sgopn のあと, slmgnルー チンを呼び, 第1レベルめ(用紙全体)のフレームでマージン(余白部分)をとる ように指定しています. ここで, 引数は,順に左辺, 右辺, 下辺, 上辺のマー ジンで, それぞれの全幅を1とする比率で与えます. 次に, マージンを除いた 部分を sldiv を用いて横3, 縦2に分割し, 次のレベルのフレームを定 義します. 最初の引数では順に割り付ける方向を指定します. 'Y' なら ば横方向に, 'T' ならば縦方向に割り付けられます. さらに, 14行めで は分割された第2レベルめのフレームでさらに5%ずつのマージンをとっていま す. sldiv は2回まで呼ぶことができて, 分割されたフレームをさらに もう一度分割することが可能です.

# lay1.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::slmgn(0.1, 0.1, 0.05, 0.05)
DCL::sldiv('Y', 3, 2)
DCL::slmgn(0.05, 0.05, 0.05, 0.05)

for i in 1..12
  DCL::sgfrm
  DCL::slpvpr(1)
  ctxt = format("FRAME%2.2d", i)
  DCL::sgtxv(0.5, 0.5, ctxt)
end

DCL::sgcls

program lay1

\resizebox{10cm}{!}{\includegraphics{layout/lay1_001.eps}}
lay1.rb: page1

\resizebox{10cm}{!}{\includegraphics{layout/lay1_002.eps}}
lay1.rb: page2

分割された領域は縦横比が1ではありませんが, sgfrmが1:1のフレーム を設定しています. slrat ルーチンを用いると, 今のレベルのフレーム すべてについて, 縦横比を指定してフレームが最大内接するようにマージンを とることができます.

このように分割されたフレームを GRPH1 ではあたかも1枚の紙のように扱い, sgfrm の実行により, 次のフレームに自動的に移っていきます. プログ ラムの do ループの中では, 普通に改ページをしながら描画するのと同 じように, slpvpr を呼んで各フレームのビューポートの枠を描き, そ の真中にsgtxv'FRAME01', 'FRANE02', などの文字列 を書いています. 第3.1節の出力結果と比較して, 文字の大きさ が分割されたフレームの大きさに応じて小さくなっていることに注意して下さ い.

このように, 同じ図形を規則的に並べることは SLPACK を使うと非常に簡単にできます. しかし, 大きな図形の横に小さな図形を並べるというようなことは, SLPACK を使うより sgsvpt で陽にビューポート の設定をした方がよいでしょう.