%表題   GRPH1 基本グラフィックルーチンライブラリ (LAYOUT)
%
%履歴
%\Drireki{
%         89/08/22 酒井  敏
%         91/09/05 林  祥介
%         91/11/21 酒井  敏
%         92/04/10 塩谷雅人 (PSファイルの再作成とDepsfの書き換え)
%         92/04/22 林祥介   (4.1版)
%         95/04/19 塩谷雅人
%        }
%
\Dchapterhead
\label{slpack}

\section{概要}

SLPACK (LAYOUT) は, 図形の外側にマージンをとったり,
複数の図を1つのページにまとめたりする機能を持つパッケージである.
SLPACK のルーチンは, 原則として全て {\tt SGOPN} と
最初に現れる {\tt SGFRM} の間で呼ばれなければならない.
\vspace{1em}

ここで説明するデモプログラムは dcl-x.x/demo/grph1/slpack の中にあるので,
参考にしていただきたい.

%-----------------------------------------------------------------------
\section{1ページに複数の図形}
%\label{slpack.sldiv}

同じ様な図形を沢山並べたい時, SLPACK を使うと非常に簡単にできる.
\vspace{1em}

\begin{center}
\Depsf[10cm]{slpack/slpk01_0001.eps}\\
{\bf slpk01.f:page1}\\
\end{center}
\vspace{1em}

このプログラムでは横長の用紙を想定して,
{\tt SGOPN}で縦位置を選択し,
{\tt SLMGN (Sgpack/Layout MarGiN)}
でその用紙全体のフレームでマージンをとるように指定している.
さらにマージンを除いた部分を{\tt SLDIV (SL DIVide)}を用いて横3, 縦5に分割し,
その分割された領域のなかでさらにマージンをとる.
分割された領域は縦横比が1ではないので,
{\tt SLRAT (SL RATio)}を呼んでマージンをとったあとの領域に最大内接するように
1:1のフレームを設定する.
(このプログラムでは{\tt SLRAT}を呼ばなくても
{\tt SGFRM}が1:1のフレームをとってくれるが,
いつもそのような好運に恵まれるわけではない.
思わぬ結果になることを避けるために,
{\tt SLPACK} のルーチンを使う時には常に {\tt SLRAT} で縦横比を
指定するようにしていただきたい. )
\vspace{1em}

このように分割されたフレームを GRPH1 ではあたかも1枚の紙のように扱い,
{\tt SGFRM} の実行により, 次のフレームに自動的に移っていく.
プログラムの DO ループの中は,
普通に改ページをしながら描画するのと全く同じである.
{\tt SLPWWR (SL Plot Workstation Window Rectangular)}
はワークステーションウインドを描くユーティリティーであるが,
これが分割されたフレームの中に描かれていることを見れば,
GRPH1 がこの小さなフレームをワークステーションウインドと
見なしていることがわかる.
\vspace{1em}

また {\tt SGSVPT} でビューポートを設定しなおした時と違って,
文字の大きさも分割されたフレームの大きさに応じて小さくなっている
ことに注意されたい.
\vspace{1em}

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

なお, {\tt SLDIV} は2回まで呼ぶことができて,
分割されたフレームをさらにもう一度分割することが可能である.
SLPACK では 最初の {\tt SLDIV} で分割される前の大きなフレームを第1レベル,
{\tt SLDIV} で1度分割された小さなフレームを第2レベル,
さらに {\tt SLDIV} で細かく分割されたフレームを第3レベル のフレームと呼ぶ.
\vspace{1em}

\Dproginput{slpack/slpk01.f}

%-----------------------------------------------------------------------
\newpage
\section{マージンにタイトル等を書く}
%\label{slpack.slsttl}

沢山の図を出力すると, 何の図だったかわからなくなってしまう.
そんな時, SLPACK の機能を使って,
タイトル, その図を出力したプログラム名,
使用したデータ名等をマージンに書き込んでおくと,
あとの整理が楽になる.
\vspace{1em}

\begin{center}
\Depsf[10cm]{slpack/slpk02_0001.eps}\\
{\bf slpk02.f:page1}\\
\end{center}
\vspace{1em}

タイトルなどを書くには {\tt SLSTTL (SL Set TiTLe)}  で
{\tt SGFRM} の前に書きたい文字列を指定しておく.
文字列は, 5つまで番号をつけて指定でき,
それぞれに書くべき位置が設定できる.
この番号を指定することで, 例えば右下の文字列だけをページごとに変える,
ということが可能になる.
({\tt SLSTTL} は, SLPACK のルーチンの中で唯一例外的に {\tt SGFRM}
を呼んだあとでも呼ぶことができる. )
\vspace{1em}

タイトルなどの文字が書かれるのは
第1レベルのマージンに対してだけである.
フレームを分割してもタイトルなどは, 1ページに1つしか書かれない.
したがって, タイトル等を書くときにはあらかじめ第1レベルのマージンを
とっておかなければならない.
\vspace{1em}

ここで注意すべきことは,
マージンは各レベルごとの最大作画領域に対する比率で指定されるのに対して,
文字の大きさの単位は第1レベルにおける最大作画領域の長辺を1とするような
単位となることである．
たとえば，ここで描いたタイトルと次の作画例におけるタイトルの大きさが
違うことに注意していただきたい．
すなわち，slpk02.f の例では
陽に{\tt SLRAT}を用いて正方形の最大作画領域を長方形に内接す
るように指定しているため，タイトル文字の大きさは正方形の一辺が
1となるような単位で描かれている．
いっぽう，sgpk03.f では長方形の画面をいっぱいに使うように指定してい
るため，長方形領域の長辺を1とするような単位でタイトル文字が描かれてい
る．
\vspace{1em}

なお, {\tt SLSTTL} で指定できる文字列には,
{\tt \#PAGE, \#TIME, \#DATE} という予約語があって,
それらの予約語はそれぞれ, ページ数, 時刻, 日付に変換される.

\newpage

\Dproginput{slpack/slpk02.f}

%-----------------------------------------------------------------------
\newpage
\section{紙を一杯に使う}
%\label{slpack.slrat}

用紙の形は普通長方形なので, そこに正方形の領域をとって,
その中だけに図を書くのはもったいない.
紙一杯に図を描きたい, という時もSLPACKを活用して欲しい.
\vspace{1em}

\begin{center}
\Depsf[10cm]{slpack/slpk03_0001.eps}\\
{\bf slpk03.f:page1}\\
\end{center}
\vspace{1em}

紙を一杯に使う機能そのものは SGPACK の基本的な機能で,
{\tt SGLSET} を用い内部変数 {\tt 'LFULL'} を {\tt .TRUE.} にすれば,
物理的な描画範囲一杯に描画することができる.
しかしその場合, 物理的な描画範囲はデバイスによって違うので，
異なるデバイスに出力する際にエラーを起こして出力できなくなる
可能性がある.
そこで,
{\tt SGLSET} で{\tt 'LFULL'}を{\tt .TRUE.}にしたときは,
{\tt SLRAT} を使って「私は$1 \times 0.6 $ の領域に図を描きたいのだ」
と宣言しておくことをお勧めする.
{\tt SLRAT}で縦横比が指定されると,
以後, この領域が最大内接するように描画領域を設定するので,
$1 \times 0.6 $ の比率を持つデバイスには一杯の図が描けるし,
そうでないデバイスに出力してもエラーは起こさない.
\vspace{1em}

この例では,
作画領域の上下に0.08のマージンをとってタイトル等のスペースを確保した後
$1 \times 0.6 $ の領域を宣言しているので,
実際には $0.6 + マージン幅$ の長さが縦方向に確保されることになる.
\vspace{1em}

%マージンの幅は最大作画領域に対する比率で指定されるので,
%マージンの幅をNDCの単位に換算するのは, ちょっとめんどくさい.
%ここでは, 上下に8\% づつマージンをとった残り84\% の長さを NDC の0.6に
%対応させているので,
%マージンの単位とNDC の比率は 0.84:0.6 である.
%この比率で 0.08 のマージン幅を NDC に換算すれば,
%NDC で0.057 のマージン幅になる.
%\vspace{1em}
%
%この計算で得られるマージン幅は最低値で,
%最大作画領域が縦長の場合などには,
%この値より大きなマージンがとられることがある.
%しかし,
%第一フレーム目のマージンに書かれるタイトル等の大きさはNDCで指定されるので,
%この計算に基づいて文字の大きさを決めておけば,
%縦横比が異なるデバイスに出力しても文字が書けなくなるようなことはない.

\newpage
\Dproginput{slpack/slpk03.f}

%-----------------------------------------------------------------------
\newpage
\section{cm 単位で長さを指定する}
%\label{slpack.slform}

SLPACK では基本的に最大描画領域に対する比率で,
マージンなどをとるようになっているが,
目的によっては絶対的な長さ(例えば10cm)を指定したい場合もある.
\vspace{1em}

\begin{center}
\Depsf[10cm]{slpack/slpk04_0001.eps}\\
{\bf slpk04.f:page1}\\
\end{center}
\vspace{1em}

{\tt SLFORM (SL FORM)} または {\tt SLSIZE (SL SIZE)}で,
自分が描きたい描画範囲の大きさを具体的に指定しておけば,
その描画範囲が物理的に描画できる限り,
異なったデバイスでも同じ大きさの図が出力できる.
{\tt SLFORM} は描画範囲を cm 単位で, また, {\tt SLSIZE} は
A4, B5 等の大きさを指定するものである.
(通常A4の用紙の最大描画範囲は, 用紙そのものの大きさよりも小さいので,
A4の紙に {\tt SLSIZE}で A4 を指定するとエラーとなる. )
\vspace{1em}

同じA4サイズに出力するデバイスでも,
その最大描画領域は微妙に異なっている.
自分が使う可能性のあるデバイスの最大描画範囲をあらかじめ調べておいて,
その最小値を{\tt SLFORM}で常に指定するようにすれば,
異なったデバイスで出力した図をもとにOHPを作成しても,
同じスケールで重ねることができる.
\vspace{1em}

ただし, 絶対的な大きさを指定するということは,
汎用性を損ねるリスクと背中合わせであることを認識しておいて頂きたい.
また, コンソールディスプレイなど,
物理的な大きさがはっきりしないデバイスに対しては,
適当な大きさが仮定されている.
%詳しくは, 「機種別手引」マニュアルで確認されたい.
\vspace{1em}

\newpage
\Dproginput{slpack/slpk04.f}
