%表題   らくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%  \Dchapter{レイアウト} 
\Dchapterhead

GRPH1 の SLPACK は, 図形の外側にマージン(余白部分)をとったり, 複数の図
を１つのページにまとめたりする機能を持つパッケージです. マージン部分に
文字列(タイトル)を描くこともできます. SLPACK のルーチンは, 原則として 
{\tt SGOPN} と最初に現れる {\tt SGFRM} の間で呼ばれなければなりません.
\vspace{1em}

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

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

\Dproginput{layout/lay1.f}
\vspace{1em}

\begin{center}
\Depsf[10cm]{layout/lay1_001.eps}\\
{\bf lay1.f: page1}\\
\end{center}

\begin{center}
\Depsf[10cm]{layout/lay1_002.eps}\\
{\bf lay1.f: page2}\\
\end{center}

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

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

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


%-----------------------------------------------------------------------
\section{マージンに文字列を書く}
沢山の図を出力すると, いつ, どのプログラムで描いた, 何の図だったのかわ
からなくなってしまいます.  そんな時, SLPACK の機能を使って, タイトル, 
その図を出力したプログラム名, 使用したデータ名等々をマージンに書き込ん
でおくと, あとの整理が楽になります.

\Dproginput{layout/lay2.f}

\begin{center}
\Depsf[10cm]{layout/lay2.eps}\\
{\bf lay2.f: frame1}\\
\end{center}

{\tt LAY2} の例にあるように, タイトルなどを書くには {\tt SLSTTL} ルー
チンで書きたい文字列を指定しておきます. 文字列は, 最大5つまでの番号を
つけて指定し(最後の引数), それぞれの書くべき位置を設定します. この番号
を指定することで, 例えば右下の文字列だけをページごとに変える, というこ
とが可能になります.  その場合には, {\tt SLSTTL} を{\tt SGFRM}を呼んだ
あとにも呼ぶことになります. 位置の設定ですが, 第2番めの引数で {\tt
'T'} (トップマージン)または {\tt 'B'}(ボトムマージン)を指定し, 第3番め
と第4番めの引数で, マージン内における文字列の位置を $-$1.0(左寄せまた
は下寄せ)から+1.0(右寄せまたは上寄せ)までの実数値で指定します. 0.0とす
ると中央合わせになります. 第5番めの引数は文字の高さです. 
\vspace{1em}

{\tt SLSTTL}ルーチンでタイトル等を書くときには, そのためにあらかじめ第
1レベルのマージンをとっておく必要があります. この時, 文字列が書かれる
のは, フレームの分割の有無に関わらず, 第1レベルのマージンに対してだけ
です.  ここで注意すべきことは, マージンは各レベルごとの最大作画領域に
対する比率で指定されるのに対して,文字の大きさの単位は第1レベルにおける
最大作画領域の長辺を1とするような単位となることです．たとえば，ここで
描いたタイトルと次の作画例におけるタイトルでは文字の高さの単位が違うこ
とに注意しましょう.
\vspace{1em}

なお, 12・13行めで用いたように, {\tt \#DATE}, {\tt \#TIME}, {\tt
\#PAGE}という予約変数があって, それぞれ, 日付, 時刻, ページ数にあたる
文字列に置き換えられます.

%-----------------------------------------------------------------------
\section{紙を一杯に使う}

用紙の形は長方形なのに, そこに内接する正方形の領域をとって, その中だけ
に図を描くのではもったいない, 紙一杯に図を描きたい, という時にも 
SLPACK を活用しましょう.

\Dproginput{layout/lay3.f}

\begin{center}
\Depsf[10cm]{layout/lay3.eps}\\
{\bf lay3.f: frame1}\\
\end{center}

物理的な描画範囲一杯に作画したい時は, SGPACK の {\tt SGLSET} を用いて
論理型内部変数 {\tt 'LFULL'} を {\tt .TRUE.} にします. これが, {\tt
.FALSE.}(初期値)の時には, 最大内接する正方形が作画可能な範囲となります. 
物理的な描画範囲はデバイスによって違いますから，{\tt 'LFULL'}を{\tt
.TRUE.}にしたときは, 異なるデバイスに出力する際にエラーを起こして出力
できなくなる可能性があります.  そこで, 11行めのように {\tt SLRAT} を使っ
て「私は$1 \times 0.6 $ の領域に図を描きたいのだ」と宣言しておくことを
お勧めします. {\tt SLRAT}で縦横比が指定されると, このフレームが最大内
接するように描画領域を設定するので, どんなデバイスに出力してもエラーは
起こりません.
\vspace{1em}

この例では, 作画領域の上下に8\%ずつのマージンをとってタイトル等のスペー
スを確保した後に, $1 \times 0.6$ の領域を宣言しています. まだ, 上下に
余裕がありますので, 左右にはいっぱいにフレームが確保できました. 上下の
マージンを大きくとると, この縦横比を保つために, 左右にもマージンが自動
的にできるようになります.
\vspace{1em}
\vspace{1em}

SLPACK では基本的に最大描画領域に対する比率でマージンなどをとるように
なっていますが, 目的によっては絶対的な長さ(例えば10cm)を指定したい場合
もあるでしょう. {\tt SLSIZE} または {\tt SLFORM} で第1レベルめのフレー
ムを再設定しておけば, その範囲が物理的に描画できる範囲内である限り, 異
なったデバイスでも同じ大きさの図が出力できます. {\tt SLFORM} は描画範
囲を A4, B5 等の規格の大きさで, また, {\tt SLSIZE} は cm 単位で指定し
ます. 通常 A4 の用紙の最大描画範囲は用紙そのものの大きさよりも小さいの
で, A4 の紙に {\tt SLSIZE}で A4 を指定するとエラーとなりますから, ご注
意下さい.  また, コンソールディスプレイなど, 物理的な大きさがはっきり
しないデバイスに対しては, 適当な大きさが仮定されています.
