4.1 1ページに複数の図形

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

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

#
# lay1.rb

require "narray"
require "numru/advanceddcl"
include NumRu::AdvancedDCL
include NMath


#-- graph ---
Dev.open

Frame.mgn(0.1, 0.1, 0.05, 0.05)
Frame.div('Y', 3, 2)
Frame.mgn(0.05, 0.05, 0.05, 0.05)

for i in 1..12
   Frame.new
   ctxt = format("FRAME%2.2d", i)
   Text.vdraw(0.5, 0.5, ctxt)
   Frame.pvpr(1)
end

Dev.close
PROGRAM LAY1

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

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

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

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

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