File: uspack.tex

package info (click to toggle)
dcl 7.5.2-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 21,008 kB
  • sloc: fortran: 48,433; f90: 12,803; ansic: 6,513; makefile: 4,738; ruby: 184; sh: 153
file content (622 lines) | stat: -rw-r--r-- 27,421 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
%表題   GRPH2 図形処理上位パッケージ
%
%履歴
%\Drireki{
%         90/04/02 酒井敏
%         91/09/05 林祥介
%         91/12/10 林祥介
%         92/02/01 酒井敏
%         92/04/13 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%         94/04/20 塩谷雅人 (5.z版)
%         94/05/10 酒井敏
%         95/04/19 塩谷雅人
%        }
%
%  \Dchapter{使用例 : 1次元量の表示(USPACK)}
\Dchapterhead
\label{uspack}

\section{概要}

USPACKの主な機能を使ったプログラム例を以下に示す.
これらのデモプログラムは dcl-x.x/demo/grph2/uspack の中にあるので,
参考にしていただきたい.
いくつかのプログラムに関しては, その実行結果として描かれるグラフの顔つ
きが例示したものと異なる場合があることを注意しておこう. 例題として用
いた関数形のカオス的な振舞いのために,丸め誤差が大きな結果の差を生むから
である. このことは, 関数値の計算精度を単精度・倍精度と変えてみることに
よって容易に確かめられる.

\vspace{1em}

\section{とりあえずグラフを描く}

一刻も早く計算結果のグラフが見たい!!
そんな時{\tt USGRPH}は, たったの1行({\tt GROPN}等を含めて4行)
でデータをグラフ化してくれる.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk01_0001.eps}\\
{\bf uspk01.f:page1}\\
\end{center}
\vspace{1em}

しかも, uspk01.f の様に意地の悪いデータが与えられても,
Y軸に1.00005等という不細工なラベルを付けて,
ラベルが描画範囲を越えてしまう様なことはない.
{\tt USGRPH}は与えられたデータから適当な目盛間隔や
ラベルの間隔を求めて座標軸を描くが,
この時のラベルの文字数が大きすぎる場合には,
この例のようにファクター値やオフセット値を適当に選んで軸の端に表示し,
ラベルが適当な文字数におさまるようにする.
この最大文字数は{\tt US}{\it p}{\tt GET/}{\tt US}{\it p}{\tt SET}が
管理する内部変数 {\tt 'MXDGTX'/'MXDGTY'} により
設定できる.
%{\tt USPSET}はこのパッケージ全体の内部変数を設定するための
%サブルーチンである.
\vspace{1em}

この例では, GRPH1/GRPH2 を使う時のお作法である変換関数の設定に
関するルーチン群が見あたらない.
というのは, {\tt USGRPH} がその内部で, 与えられたデータから適当な
変換関数を設定しているからである.
(具体的に, 内部でおこなわれている動作に関しては, 次節以降でおりにふれ
説明する. )
\vspace{1em}

なお, 添字には少し小さな字を使うので,
分解能の低いワークステーションではこの添字が識別できないことがあるが,
そのような時には{\tt GROPN}の後に
\begin{verbatim}
    CALL SGLSET('LCNTL', .FALSE.)
\end{verbatim}
を入れると, 添字を使わない表現になる.
この内部変数 {\tt 'LCNTL'} は, {\tt SGTXU}などで上つき下つきなどの
制御コードを有効にするかどうかを指定するものであるが,
{\tt USGRPH}はこの内部変数 {\tt 'LCNTL'} を調べて適切な表現をする.
なお, {\tt 'LCNTL'}の標準値は{\tt .FALSE.}であるが,
{\tt GROPN}の内部で{\tt .TRUE.}に設定されている.
\vspace{1em}

また, データの変化がデータ自身の大きさに比べて小さすぎて,
計算誤差程度しかない時は, これを定数と見なし,
この定数と0を含む様にスケーリングする.
(この計算誤差は, {\tt GL}{\it p}{\tt GET/}{\tt GL}{\it p}{\tt SET}
が管理する内部変数{\tt 'REPSL'}をもとに判断する.)
さらに, データが全て0の場合には最大値・最小値をそれぞれ$-1$, $1$ とする.
\vspace{1em}

\Dproginput{uspack/uspk01.f}

%-----------------------------------------------------------------------
\newpage
\section{対数座標のグラフを描く}

すぐにグラフ化してくれるのはよいけれど,
私のデータは対数座標で見ないとよくわからない.
というスペクトル解析屋さんの要望にも{\tt USGRPH}は対応する.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk02_0001.eps}\\
{\bf uspk02.f:page1}\\
\end{center}
\vspace{1em}

対数座標のグラフを描くためには,
{\tt USGRPH}を呼ぶ前に{\tt GRSTRN}を1行追加して
変換関数番号を指定すればよい
(変換関数番号については「GRPH1」のマニュアルを参照されたい).
ここでは, 変換関数番号として4を指定し, 両対数のグラフを
作画している.
もちろん, この番号を適当に選べば一様座標(線形座標)
との組み合わせも可能である.
\vspace{1em}

この例のように, {\tt GRSTRN}によって変換関数番号だけを指定して,
変換関数を確定するルーチン
{\tt GRSTRF} (あるいは{\tt SGSTRF})を呼ばないのは
奇異な感じがするかも知れない.
{\tt USGRPH} のようなお任せルーチンでは, 変換関数を確定
させるために必要なパラメータの設定を{\tt USPFIT}がおこない,
そのうえで変換関数の確定を{\tt GRSTRF}がおこなっている.
{\tt USPFIT} は, ユーザーが指定しなかった変換関数に関する情報
を適当に決めてくれるという機能を持っている.
具体的には, {\tt GRFRM} (あるいは{\tt GRFIG}) が呼ばれたタイミングで,
変換関数に関する内部変数はすべて「不定」に設定される.
このあと, ユーザーが意識的に指定した変換関数に関する情報は
それが有効となり, {\tt USPFIT}は「不定」のままになっている
内部変数を適当に決める.
({\tt USPFIT}は座標変換に関するパラメータばかりでなく, 目盛の間隔など
に関するパラメータをも決めている. )
\vspace{1em}

\newpage
\Dproginput{uspack/uspk02.f}

%-----------------------------------------------------------------------
\newpage
\section{1変数のグラフを描く}

2次元のグラフと言っても片側の座標値は等間隔なので,
そのためにわざわざ配列を宣言して
座標値を代入するのはするのはめんどくさい, ということがある.
そんなときには, 等間隔な座標軸に関するウインドウ情報を指定した上で,
{\tt USGRPH}に与える引数のうちその座標軸方向ものを「不定」にしてやれば
よい.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk03_0001.eps}\\
{\bf uspk03.f:page1}\\
\end{center}
\vspace{1em}

この例では{\tt USPFIT}のパラメータ補完機能を使う.
まず, {\tt GRSWND}で等間隔とみなすX軸方向のウインドウ情報を指定する
(このとき, Y軸方向は実際のデータにもとづいてスケーリングしたいので
「不定」としておく).
そのうえで{\tt USGRPH}のX軸方向の引数を不定としてやることによって,
たとえばこの例では, X方向には [0.0, 1.0] の範囲で等間隔に,
Y方向には配列{\tt Y}で与えられた座標値を折れ線で描く.

\newpage

\Dproginput{uspack/uspk03.f}
%-----------------------------------------------------------------------
\newpage

\section{複数のデータを1つのグラフに描く}

とにかく計算はできるようになったのでデータはどんどん出てくるが,
一つのグラフに一つのデータでは紙がいくらあっても足りない.
かといって, {\tt USGRPH}の後で{\tt SGPLU}あるいは{\tt UULIN}
(これは片方の座標軸の点列情報を等間隔とみなして折れ線を描く
機能を持った, 基本的には{\tt SGPLU}と同じような動作をする
作画ルーチンである)等を使って折れ線だけ追加すると,
座標軸からはみ出してしまう可能性もある.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk04_0001.eps}\\
{\bf uspk04.f/uspk05.f:page1}\\
\end{center}
\vspace{1em}

uspk04.f はこのような場合のプログラム例である.
{\tt USSPNT}は, X, Y軸のスケーリング範囲に
含めるべきデータを指定して作画範囲を決める.
このルーチンは{\tt USGRPH}を呼ぶ前に何度でも呼ぶことができる.
({\tt USSPNT}はXあるいはY軸方向のどちらかを「不定」として片側のみのス
ケーリングもできる.)
{\tt USGRPH}はこのルーチンで指定したデータを含むように
スケーリングを行うので,
{\tt USGRPH}の後で{\tt SGPLU}あるいは{\tt UULIN}を使って折れ線を
追加しても, 座標軸からはみ出すことはない.
\vspace{1em}

また, {\tt USGRPH}では折れ線のラインインデックスや
ラインタイプを直接指定することはできないが,
{\tt USGRPH}は単に{\tt UULIN}を呼んでいるだけなので,
あらかじめ{\tt UUSLNT/UUSLNI}でこれらを指定しておけば,
{\tt USGRPH}で描かれる折れ線の属性を変えることができる.
\vspace{1em}

ところで, uspk04.f で描かれる3本の線はどれも同じ様な折れ線でありながら,
1本は{\tt USGRPH}で, あとの2本は{\tt UULINZ}で描く,というのは何となく
不平等な感じで気持ちが悪い.
そんな時, {\tt USGRPH}をばらして使ってやれば
気持ちのよいプログラムが書ける.
uspk05.fはuspk04.fと全く同じ結果を得るプログラムである.
\vspace{1em}

{\tt USDAXS}は, 現在設定されている正規化変換に対して,
とにかく適当な座標軸 (デフォルト座標軸) を描くものである.
ここで描かれる座標軸の位置は{\tt USCSET}の
内部変数{\tt 'CXSIDE'}, {\tt 'CYSIDE'}
で指定され, 初期値はそれぞれ{\tt 'BT'}, {\tt 'LR'}である.
したがって, {\tt USDAXS}一行で4本の座標軸が描かれることになる.
\vspace{1em}

{\tt USDAXS}を使うと,
データを与える部分と折れ線を描く部分が完全に独立して書けるので,
よりきれいなプログラムとなり,
DO ループで複数の折れ線を書くときなどは便利である.
また, この書き方では折れ線を描かずに,
{\tt SGPMU}あるいは{\tt UUMRK}等でマーカー列を描くことも自由にできる.
ただし, {\tt USDAXS} は単に座標軸を描くだけの
ルーチンなので, その前に {\tt USPFIT}によって変換関数に
必要なパラメータの設定, および{\tt GRSTRF}によって
変換関数の確定をしておく必要がある.
\vspace{1em}

以降の例題ではもっぱら{\tt USGRPH}を用いているが,
uspk05.fの様にこれを{\tt USSPNT},
{\tt USPFIT}, {\tt GRSTRF}, {\tt USDAXS} および {\tt UULIN}に
分解しても全く同じ結果が得られる.
(事実, {\tt USGRPH}もこれらの4行で構成されている.)
\vspace{1em}

なお, {\tt USSPNT}で設定された値は,
{\tt USGRPH}または{\tt USDAXS}を実行した際にリセットされる.
\vspace{1em}

\Dproginput{uspack/uspk04.f}
\newpage
\Dproginput{uspack/uspk05.f}

%-----------------------------------------------------------------------
\newpage
\section{タイトルを描く}

とにかくグラフは描けるようになった.
しかし,
座標軸にタイトルがないと何のグラフだったかわからなくなってしまう.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk06_0001.eps}\\
{\bf uspk06.f:page1}\\
\end{center}
\vspace{1em}

{\tt USSTTL}を使えば, X軸とY軸のタイトルや単位を
描くことができる.
これらは, 以下に述べるように {\tt USCGET/}{\tt USCSET} が管理する
内部変数を設定してやることによっても指定できる.
また, {\tt USSTTL} や {\tt USCSET}を使わずに,
{\tt USGRPH}を呼んだ後でUXPACK/UYPACKのタイトル作画ルーチンを
使って適当なタイトルを付けてもよい.
\vspace{1em}

{\tt USGRPH}で座標軸にタイトルを付けるには,
{\tt USGRPH}の前に{\tt USCSET}を使って,
内部変数{\tt 'CXTTL'}, {\tt 'CYTTL'}を設定しておけばよい
(タイトルは80文字まで設定できる).
%ここで, {\tt USCSET}はこのパッケージで使う文字型の
%内部変数を設定するもので,
%変数の型以外は{\tt USPSET}と同様である.
\vspace{1em}

また, {\tt USGRPH}ではファクター値やオフセット値を描くために
{\tt USXSUB/USYSUB}というサブラベル(座標軸の端に付け足すラベル)を
描くためのルーチンを用意したので,
ついでに座標軸の単位などもこのサブラベルに含めることができるようにしてある.
これも, タイトルと同様に{\tt USCSET}で{\tt 'CXUNIT'},
{\tt 'CYUNIT'}を設定すればよい.
ここで指定した文字列は, ファクター値やオフセット値がある場合
これらの後に書かれる.
\vspace{1em}

なお, タイトル等は{\tt GRFRM}, {\tt GRFIG}により初期化される.
同じタイトルで沢山の図を描きたい時には{\tt USISET}で
{\tt 'IRESET'}を0にすれば,
タイトルの設定は1度で済む.
\vspace{1em}

\newpage
\Dproginput{uspack/uspk06.f}

%-----------------------------------------------------------------------
\newpage
\section{座標軸のスタイルを変える}

とにかくデータは描けるようになったが,
いつも真四角な箱型の座標軸ではつまらない.
と, 人間だんだん欲が出てくることをUSPACKはちゃんと見通している.
というより, USPACKは座標軸の細かな設定に関しては,
かなりの部分でUXPACK/UYPACKに「よきに計らえ」と任せているので,
細かなことはこれらをコントロールするUZPACKにお願いすれば,
いろいろと面倒を見てくれる.
裏を返せば, 細かいことまで思い通りにしたければUSPACKを呼ぶ前に,
UZPACKにちゃんと根回しをしておかなければならない.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk07_0001.eps}\\
{\bf uspk07.f:page1}\\
\end{center}
\vspace{1em}

まず, 座標軸を描く位置は USPACK が管理しているので,
{\tt USCGET/}{\tt USCSET}の内部変数{\tt 'CXSIDE'}(X軸)と
{\tt 'CYSIDE'}(Y軸)を指定する.
{\tt 'CXSIDE'}, {\tt 'CYSIDE'} は長さ2の文字型変数で,
{\tt 'CXSIDE'}は{\tt 'T'}(Top), {\tt 'B'}(Bottom),
{\tt 'U'}(User)のうち2文字まで,
{\tt 'CYSIDE'}は{\tt 'R'}(Right), {\tt 'L'}(Left),
{\tt 'U'}(User)のうち2文字まで指定でき,
初期値はそれぞれ{\tt 'BT'}, {\tt 'LR'} である.
これらの文字は1文字づつ座標軸ルーチン
({\tt UXAXDV/UYAXDV})に渡される.
後はこれらのルーチンの仕事である.
\vspace{1em}

uspk07.fの様に{\tt 'CXSIDE'}に{\tt 'U'}を指定した場合には,
UXPACKに「ユーザー定義の位置」を通知しておかなければUXPACKが困ってしまう.
そこで{\tt UZRSET}で内部変数{\tt 'UYUSER'}を0.にして,
X軸をY=0の位置に描くように指定する.
この時, {\tt USGRPH}は Y軸のスケーリングに関して,
X軸を描く位置 (Y=0) を含めてスケーリングするので,
仮にデータが0を含まなくても
座標軸がとんでもないところに描かれることはない.
\vspace{1em}

その他, uspk07.fの中では
{\tt UZISET}で {\tt 'IROTLYL'}と{\tt 'ICENTL'}を変更して,
Y軸のラベルを軸に平行にし,
{\tt 'INNER'}を$-1$にして目盛を外向きにしている.
\vspace{1em}

なお, 座標軸のタイトルとサブラベルに関してはUSPACKが管理しており,
{\tt 'CXSIDE'}, {\tt 'CYSIDE'}に指定された最初の文字の
位置にこれらを描くことになっている.
(サブラベルの向きは{\tt UZISET}の{\tt 'IROTL}{\it zs}{\tt '}に従う)
また, サブラベルの文字を囲む括弧が気に入らない場合には,
{\tt USCSET}で内部変数{\tt 'CBLKT'}を指定することによって
変更することができる.
この変数に空白を指定すると括弧は描かない.
\vspace{1em}

これら {\tt US}{\it p}{\tt SET/}{\tt USCSET}及び
{\tt UZ}{\it p}{\tt SET}で設定された
座標軸のスタイルに関するパラメタは, 再設定されるまで有効である.
タイトルとスケーリングに関するパラメタは {\tt GRFRM} または
{\tt GRFIG} によって初期化される.
詳しい内部変数名およびリセットされるタイミングは,
「GRPH2」マニュアルの USPACK の章を参照のこと.
\vspace{1em}

\Dproginput{uspack/uspk07.f}

%-----------------------------------------------------------------------
\newpage
\section{座標軸を逆さまにする}

これまでのX軸は右向き, Y軸は上向きを正としてきたが,
{\tt USLSET}で内部変数{\tt 'LXINV'}, {\tt 'LYINV'}を{\tt .TRUE.}にすると
それぞれの軸の方向を逆にすることができる.
これは, 常に世の中を逆さまに見ている人々のための機能である.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk08_0001.eps}\\
{\bf uspk08.f:page1}\\
\end{center}
\vspace{1em}

しかし, この機能を使うにはちょっと注意が必要である.
問題は, この例のように Y軸を下向きにした場合,
X軸をグラフの上側に描くことから生じる.
X軸をグラフの上側に描くにはuspk07.fで説明したように
\begin{verbatim}
    CALL USCSET('CXSIDE', 'T')
\end{verbatim}
とすればよいように思えるが,
これだけではX軸そのもの(線分と目盛)は描いても,
ラベルやタイトルなどが一切出力されない.
これは, 座標軸とラベルを描くルーチン{\tt UXAXDV/}{\tt UYAXDV}が
UZPACKの内部変数{\tt 'LABEL}{\it zs}{\tt '}を参照して,
場所に応じてラベルを描くかどうか判断しており,
初期状態ではグラフの上側と右側に
ラベルを描かないようになっているためである.
(これまで箱型の座標軸を描いたときに,
上側や右側の軸にはラベルやタイトルがついていなかったことを
思い出して欲しい. )
ラベルに関してはほとんどUZPACKの管理下にあるので,
当然USPACKが描くラベルもこの内部変数に自動的に従うことになる.
これに対して, サブラベルとタイトルはUSPACKの管理下にあり,
{\tt USCSET}の内部変数{\tt 'CXSIDE'}, {\tt 'CYSIDE'}で指定される
1文字目の場所にサブラベル(単位等)とタイトルを描くことになっている.
しかしながら,
ラベルがないところにサブラベルやタイトルを描いてもしかたがないので,
USPACKはUZPACKの管理情報を盗み見して,
内部変数{\tt 'LABEL}{\it zs}{\tt '} が{\tt .FALSE.}のところには
これらを描かないことにしている.
要するに, ラベルやタイトルなど座標軸に付属する文字はすべて
{\tt 'LABEL}{\it zs}{\tt '}によって制御されているので,
グラフの上側や右側に座標軸とタイトルを出力するためには,
あらかじめ{\tt UZLSET}で{\tt 'LABEL}{\it zs}{\tt '}を{\tt .TRUE.}
にしておけばよい.
\vspace{1em}

\newpage
\Dproginput{uspack/uspk08.f}

%-----------------------------------------------------------------------
\newpage
\section{グラフの大きさ, 位置を変える}

{\tt USGRPH}は特に指定しなければ画面の縁から適当なマージンをとって
ビューポートを設定するが,
1ページに複数のグラフを並べて描きたいときにはこれを変更する必要がある.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk09_0001.eps}\\
{\bf uspk09.f:page1}\\
\end{center}
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk09_0002.eps}\\
{\bf uspk09.f:page2}\\
\end{center}
\vspace{1em}

まず, ビューポートを変更するには{\tt USGRPH}の前に,
{\tt GRSVPT}でビューポートの座標を指定する.
この例では1ページの下側に1枚目のグラフを描く.
2枚目のグラフを描く手順も同様であるが,
2枚目のグラフを描く前に{\tt GRFIG}で
UZPACK等の初期化をしなければならない.
また, この例では X 軸のラベルは1枚目のグラフと同じなので,
{\tt UZLSET}で{\tt 'LABELXB'}を{\tt .FALSE.}にして
X軸のラベルを抑制している.
この例では, 上下のグラフは同じ大きさであるが,
異なる大きさのグラフを描いてもラベルの文字の大きさが変わることはない.
\vspace{1em}

改ページをして次のページにグラフを描くには,
{\tt GRFRM}を呼ぶ.
{\tt GRFRM}は{\tt GRFIG}で行われる処理を全て行うので
{\tt GRFIG}をあらためて呼ぶ必要はない.
複数のグラフを1ページに収めるとラベルの文字が大きすぎることがあるが,
そのような時には, {\tt UZFACT}で文字の大きさを変えることができる.
その場合, 文字の大きさに応じて目盛やラベルの間隔も変わる.
({\tt USGRPH}では, 文字の大きさを基準にしてスケーリングを行っている)
\vspace{1em}

なお, {\tt GRSVPT} でビューポートを設定しないときには,
文字幅に内部変数{\tt 'RMRGN'}をかけた幅のマージンをとるので,
文字幅によってビューポートの大きさも変わる.
初期状態では, 上下左右に0.2のマージンをとる.
\vspace{1em}

\newpage
\Dproginput{uspack/uspk09.f}

%-----------------------------------------------------------------------
\newpage
\section{スケーリングを制限する}

{\tt USGRPH}によるスケーリングが気に入らないとき,
特定のパラメータを強制的に固定することも可能である.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk10_0001.eps}\\
{\bf uspk10.f:page1}\\
\end{center}
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk10_0002.eps}\\
{\bf uspk10.f:page2}\\
\end{center}
\vspace{1em}

例えばデータのX座標の範囲が中途半端な時に,
何も指定しなければ{\tt USGRPH}は1ページ目のように
座標軸の両端に「きりのよい値」が来るようにスケーリングしてしまい,
折れ線が「しりきれとんぼ」になってしまう.
\vspace{1em}

このようなスケーリングで具合が悪いときには,
まず {\tt GRSWND} でウインドウを指定し
(この例では, X座標のみ陽に指定し, Y座標「不定」を示す値を指定して
USPACKがデータから判断するようにしている),
さらには{\tt USRSET}で目盛/ラベルの間隔だけでなく,
ラベルのファクターまで制御することができる.
この例の2ページ目ではX軸に関するパラメータ全てを陽に指定して
自動スケーリング機能を完全に抑制している.
\vspace{1em}

\newpage
\Dproginput{uspack/uspk10.f}

%-----------------------------------------------------------------------
\newpage
\section{Y軸だけUSPACKを使う}

Y軸のデータ範囲などは自動的に決めて欲しいけど,
X軸に関しては自分の好みの座標軸を描きたい.
そのようなときには, {\tt 'CXSIDE'}をブランクにし
{\tt USGRPH}が軸そのものを描かないように指定しておいて,
後でユーザーが好みの座標軸をUXPACK等を使って描くこともできるが,
それよりも USPACK の基本レベルのサブルーチンを使う方がわかりやすい.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk11_0001.eps}\\
{\bf uspk11.f:page1}\\
\end{center}
\vspace{1em}

この例はY軸はUSPACKを使い,
X軸に関してはUXPACKを使って座標軸を描いた例である.
\vspace{1em}

Y軸に関しては, どのような値になるかわからないので,
{\tt GRSWND}でX軸方向のウインドウ情報のみを指定し,
Y軸方向は「不定」とする.
次に, X座標に関する引数を「不定」とし
{\tt USSPNT}によってスケーリングをおこなう.
そのうえで, {\tt USPFIT}で変換関数に関するパラメータを設定し,
{\tt GRSTRF}によって変換関数を確定したのちに
Y軸を {\tt USYAXS} で描いている.
これは{\tt USGRPH}等,
上位のおまかせルーチンで行っている作業と同じである.
\newpage
\Dproginput{uspack/uspk11.f}
%-----------------------------------------------------------------------
\newpage
\section{座標軸ユーティリティーとして使う}

USPACKの仕事のうち,
最も大切なのは目盛間隔とラベル間隔を決めることである.
これまでも述べてきたように, これは{\tt USPFIT}が受け持っている.
適当なスケーリングを自分でおこなうのは結構面倒なことなので,
等高線図のまわりに座標軸を描く時のように,
たとえ最大値・最小値が始めからわかっているときでも,
USPACKを使う価値は充分にある.
\vspace{1em}

\begin{center}
\Depsf[10cm]{uspack/uspk12_0001.eps}\\
{\bf uspk12.f:page1}\\
\end{center}
\vspace{1em}

この例では,{\tt GRSWND} などによって変換関数に関する情報を指定し,
{\tt GRSTRF} で変換関数を確定させた上で
{\tt USDAXS} によって座標軸を描いている.
\vspace{1em}

タイトルに関しては, {\tt USCSET}または{\tt USSTTL}で指定されていれば
{\tt USDAXS}が描くが,
{\tt UXSTTL}等を使って描いてもよい.
\newpage
\Dproginput{uspack/uspk12.f}
%-----------------------------------------------------------------------
\newpage
\section{こんなことも}

\begin{itemize}
\item {\bf X軸とY軸のラベル間隔をあわせる. }

      {\tt USGRPH}では原則としてX軸とY軸を独立に
      スケーリングしており,
      しかも, 座標軸とラベルのなす角 (直角か平行か)によって,
      スケーリングの方法が若干異なる.
      そのため, 同じ様な値をもつデータを与えても,
      X軸とY軸ではラベル間隔が異なることがある.
      そのような場合に, 内部変数 {\tt 'LMATCH'} を{\tt .TRUE.}にすると,
      ラベルの向きに関わらず, 同じスケーリング方法を取るので,
      ラベル間隔が一致する確率が高くなる.
      \vspace{1em}

\item {\bf サブラベルとタイトルの衝突を防ぐ. }

      Y軸の単位やファクター等を描くサブラベルが長くなると,
      X軸のラベルやタイトルを描く領域に侵入するようになり,
      この後に{\tt UXSTTL}等によりX軸の上にタイトルを描こうとすると,
      X軸のタイトルとY軸のサブラベルが衝突することもある.
      これを避ける手段が2つ用意されている.
      \vspace{1em}

      1つは内部変数{\tt 'LPRTCT'}を{\tt .TRUE.}にして,
      サブラベルが他方の軸の領域に侵入するのを防ぐ.
      この場合, Y軸のサブラベルは{\tt 'MXDGTSX'}を無視して
      左に伸びていくので
      ワークステーションウインドウを飛び出してしまう可能性もある.
      \vspace{1em}

      もう1つは
      X軸のタイトルを描く前に{\tt USXOFF}を呼んでタイトルの
      {\tt OFFSET}をずらす.
      こちらの方が安全かつ確実な方法である.

\end{itemize}