-
Notifications
You must be signed in to change notification settings - Fork 0
/
README-j
767 lines (630 loc) · 35.8 KB
/
README-j
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
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
T O P D R A W E R
Version 5. 12
on
L I N U X
Release 1.4c
岡村 弘之
東京大学理学部
okamura@timshel.riken.go.jp
※ 最近のアップデート情報は、この文書の末尾を御覧ください。
0. Introduction
この Topdrawer は、FNAL で各社 UNIX 用に移植された版を Linux 上で
動くように修正し、幾つかの機能拡張(復活?)を施したものです。
本プログラムの移植・保守は私の個人的趣味で行っているものであり、
東京大学および理化学研究所等の公的機関とは何の関係もありません。
また、Topdrawer は所謂フリーソフトではありませんのでご注意ください。
移植の元にした版は FNAL で管理されておりますので、fnsg01.fnal.gov 宛に
登録申請をして (mail を送るだけです) ftp してください。
改訂や再配布に関する文書は見当たらないので、本版の使用条件がどうなるか
は分かりませんが、業界の内輪のソフトという事で良識にまかせる事にします。
本版で拡張された機能の一部は、gnuplot のソースを使用して実現しています。
この場を借りて gnuplot の作者に感謝します。
1. Topdrawer の歴史 --- SLAC 版、TDRVAX.EXE、Bonner Lab.版、FNAL 版
Topdrawer とは、元々は SLAC で R.B. Chaffee 氏によって開発された、
主に二次元データのための汎用グラフィックス表示プログラムです。
グラフィックスのプリミティブな部分は、同じく SLAC の R.C. Beach 氏
によって開発された UGS2 (Unified Graphics System) を使っており、
当初は色々な機種と OS で動いていたようです。しかし X Window System
(以下 X11 と略) の利用に限ると、VMS 上でしか使えませんでした。X11
と言えば C によるインターフェースしか用意されていないのが普通ですが、
VMS/DECwindow の Xlib は、様々な言語から利用できるように独自の仕様に
なっています。そして UGS2 はメイン部分が FORTRAN で書かれていた、と
いうのが VMS にしかインプリメントされなかった主な理由と思われます。
ところで、東大近辺で我々が通常 "Topdrawer" と呼んでいるのは、KEK の
藤井さん、片山さんによって機能が拡張された版です。INCLUDE 文や、
三次元データの isometric 表示、UBCFONT による文字種の増強、HandyPak
ファイルが読み込める、等の変更が加えられています。以下ではこの版を
実行ファイル名に従って TDRVAX.EXE と指す事にします。
オリジナルの SLAC 版に対して、Rice University の Bonner Lab. で
J. Clement 氏によって大幅に機能拡張された版が存在します。我々が
"NTOP" と呼んで区別しているものです。拡張されたのは、三次元データの
様々な表示、関数フィット機能、HBOOK, HandyPak 等のファイル読み込み、
オンラインヘルプやポインティングデバイスによる座標読み採り等の会話型
利用の強化、プログラミング機能等々、枚挙に暇がありません (マニュアルは
66 行 × 256 ページあります)。しかし、拡張機能には VMS のライブラリを
使っているものも多く、VMS でしか動かない版になってしまいました。また、
SLAC 版の完全上位互換でないという問題もあります。文字修飾の CASE 文は
UGS2 本来の仕様となっており、SLAC 版のような変換はしていません。
このような歴史(?)から、Topdrawer は VMS でしか主に使われていません
でしたが、最近の UNIX workstation の流行を鑑みて、UNIX への移植が
FNAL の A.E. Kreymer 氏によって行われました。Bonner Lab. 版を元にして
AIX, IRIX, SunOS, OSF1, Ultrix (何故か HP-UX は無い) の各社 OS へ
移植されましたが、残念ながら会話型処理等、幾つかの重要な機能が省略
されています。X 部分に関してはほとんど書き直されたわけですが、会話型
利用を考えていない機能縮小版で、いささか不満な出来であるというのが
私の素直な感想です。1995 年 8 月現在でも、公式版の日付は 1994 年 8 月
のまま変わっていませんので、今後改訂される期待はあまり高くないかも
知れません。
Bonner Lab. 版の拡張機能を別にしても、TDRVAX.EXE に慣れ親しんだ人に
とっては、やはり少々不満を感じる部分があると思われます。今回 Linux に
移植するにあたっては、私の理解して対処できる範囲で修正を試みる事に
しました。修正版は OSF1 および SunOS への逆移植も行なわれ、移植に
関する汎用性も高まったと思っています。これ以外の OS に関しては、私が
利用できる環境を持っていないので御容赦願います。
UNIX 上で動く汎用グラフィックスソフトと言えば gnuplot が有名で、
実際広く使われているのだと思いますが、私の個人的な好みを言えば、
Topdrawer も捨てたものではないと思います (あくまで比較としてですが)。
Topdrawer は、歴史を遡れば '70 年代にまで達する古色蒼然としたプロ
グラムで、近年のグラフィックスプログラムに見られる華やかさはありま
せんが、元々が素粒子・原子核実験データの表示を目的として開発された
ソフトであり、最終的に論文に掲載可能な品質の出力が得られるという点
では、数少ない選択枝の一つと言えると思います。
3. Linux への移植に際して
要はシステム依存性を減らして出来るだけ上位互換にするという事ですが、
o f2c + gcc でプリプロセッサを使わずに通るように書き換えました (ただし
一部で g77 を使用)。修正されたソースは他社の UNIX fortran に対しても
上位互換となるように留意しました。
o X に関しては、Xlib + Xtoolkit(Intrinsics) だけを使うように変更しま
した。FNAL 版では Motif Widget を使っていましたが、Motif を使う必然
性は極めて希薄で、逆に Motif のライセンスを持たないシステムへの移植
を困難にするからです。
4. FNAL 版で省略された Bonner Lab. 版機能の中、復活されたもの
o 対話型入力。
ファイルからだけでなく、キー入力による実行も可能にしました。入力には、
常識的なカーソル及びコントロールキーによる編集と、ヒストリー保存機能
を追加しました (この部分は gnuplot のソースを使用しています)。
# FNAL 版で対話処理を諦めたのは、主に X 関係の処理に起因すると私は想像
# します。X では、ウィンドウの前後関係が入れ替わった時(Exposure イベント
# が発生した時)ウィンドウの隠れていた部分の再描画をユーザープログラムで
# 行わなければなりません。VMS の Xlib では非同期イベントというのが定義
# できて、リアルタイムにイベントを処理する事が可能だったのですが、一般に
# UNIX の Xlib ではイベント処理のためのポーリングが必要です。完全に X で
# クローズしている、所謂マウスグリグリのソフトならこれでも不便ではないの
# ですが、Topdrawer のようにメインが標準入力待ちの状態でイベント処理を
# 混ぜるというのは素直には実現しません。しようが無いので一秒毎のタイマー
# 割り込みでイベントを処理する事にしました。従って、描画が一呼吸止まる
# ような感覚を覚える時があるかと思いますが、我慢してください。ちなみに
# gnuplot では、X 関係の処理のためにサブプロセスを起こしており、その中
# ではポーリングによってイベントをチェックしています。これを真似るのは
# 相当の書き換えが必要なので、御勘弁を...
コマンドラインからのファイル指定も便利なので、以下の三種の起動方法を
サポートするようにしました。
1. td # コマンド名のみで起動
TD: のプロンプトを出して対話型入力モードに入ります。
cut & paste の際にプロンプトが邪魔だと思ったら、
set prompt main ""
を実行すればプロンプトを出さないようにする事もできます。
プロンプトには制御コードも指定できるので、Tek4010 エミュレータ
の Tek -> VT100 切替えに使うと便利かも知れません。
2. td filename # ファイルを指定して起動
ファイルの内容を解釈して実行します。X11 や Tek4010 の対話型
デバイスの場合、new_frame や exit 等に出会うと、"tty" に PAUSE:
のプロンプトを出して一時停止します。リターン或は CONTINUE コマ
ンドで表示を継続し、EXIT, HALT 等で実行を中断できます。
3. td < filename # stdin をリダイレクトして起動
stdin 入力を解釈して実行します。2 と違って new や exit に
出会っても PAUSE しません(※)。従って、上記のようにファイルを
リダイレクトして実行しても、X の場合等はウィンドウが開いて
描画した一瞬後にはウィンドウが閉じてしまう事になりますので、
全く役に立ちません。これは Topdrawer の単独利用でなく、他の
スクリプト言語等からパイプを通して制御する事を目的として付けた
機能です。例えば Tcl/Tk の場合、
set f [open |td w]
等とやれば、puts $f ... で topdrawer のコマンドを送る事により
Tcl/Tk から描画を制御できます (これが実用的かは別問題ですが)。
※ ただし、-w オプションを付けて起動する事により、new コマンドや
入力の終り (EOF) に対して“シグナルを待つ”ように指示できます
(非対話型デバイス (PostScript) に出力する時は -w も無効です)。
シグナルは、SIGUSR1 を CONTINUE、SIGUSR2 を STOP と解釈し、
それ以外は無視します。このオプションは Emacs-Lisp (td.el) の
中で使われています。詳しくは contrib/elisp/README.elisp(-j) を
御覧ください。
この変更に伴い、デバイスの指定もオプション -d による指定に変えました。
なお、Topdrawer は元々ファイル名の大・小文字を区別しない VMS 上で開発
されたソフトである事もあり、ファイル名を小文字に変換するのがデフォルト
の動作になっています。これを抑制する為に
set mode filecase=mixed
というコマンドが用意されているのですが、ファイル名に '-' (マイナス) が
含まれていたりすると演算子と解釈されてしまうので、引用符 '' または二重
引用符 "" で囲むようにする方が賢明でしょう。
o オンラインヘルプ機能。
ヘルプファイル "topdrawer.gih" のパスは環境変数 TD_HELP で指定して
ください。起動されるページャは環境変数 PAGER で指定されます。
オンラインヘルプ機能も gnuplot のソースを拝借して実現しました。
ヘルプファイル本体は VMS 版の HLB 形式から HLP 形式を抽出し、gnuplot
形式に変換しただけですので、内容と実際の不一致、表示の不完全な部分が
ありますが御容赦ください。なお、VMS のヘルプファイルから gnuplot 用へ
の変換は簡単ですので、他にも移植すると役に立つものがあるかも知れません。
※ ページャとして less をお使いの方で、トピックスの終りで一々 q を押さ
ないといけないとか、画面がクリアされてしまうのを不満に思う方は、
ページャの定義を 'less -EX' に変更して見る事をお薦めします。
o シェル機能 (spawn)。
spawn コマンドに続く一行のシェルコマンドが実行されます。引数は引用符で
囲まない事に注意してください。引数が与えられなかった場合、環境変数 SHELL
に定義されているシェルが起動されます (多くの場合、後述する PSEUDO PIPE
機能を用いる方が、実用性は高いと思います)。
spawn コマンドで複数のシェルコマンドを一度に実行させたい場合、通常の
シェルならば区切り子 ";" を使ってコマンドを書き連ねる事ができるわけですが、
";" は topdrawer にとっても区切り子 (terminator と呼んでいますが) なので、
spawn コマンドは ";" 以降を次の topdrawer コマンドと解釈してしまいます。
幸い、Bonner Lab. 版では特殊文字の解釈は再定義可能ですので、
set character terminator "&" ("&" を区切り子として登録)
set character special ";" (";" を意味の無い特殊文字とする)
等と宣言しておけば、spawn コマンドで複数のシェルコマンドが使用可能に
なります。
ついでながら、コメントもデフォルトでは "("、")" で囲んで指定する事に
なっていますが、
set character comment "!" (VMS 風コメント行)
set character comment "#" (UNIX 風コメント行)
set character comment "*" (FORTRAN 風コメント行)
set character comment "{" (pascal 風コメント)
set character endcomment "}" ( 〃 )
等のように、好みに合わせて定義可能です。
ただし、上の例で言う所の "!"、"#"、"*" がコメントとして作用するのは
「文」であって「行」ではない事に注意してください。例えば
# state-1 ; state-2 ; state-3
という入力の場合、state-1 はコメントアウトされますが、state-2 および
state-3 は実行されてしまいます。
適当な領域をコメントアウトするには
if 0 .ne. 0 then
....
endif
等の無意味な if 文で囲む方が実用性が高いと言えるでしょう。
o コマンド定義機能。
例えば、環境変数
TD_C_INCLUDE = "set file input="
を予め定義しておくか、または Topdrawer の中で
define command include "set file input="
等と宣言しておけば、include をファイル読み込みのコマンドとして使用
できるようになります (しつこいようですが、TDRVAX.EXE に存在する include
コマンドは藤井さんによる拡張機能であり、SLAC 版や Bonner Lab. 版では
本来使えません)。ただし残念ながら、
TD_C_INC*LUDE = "set file input="
とやって、INC でも INCL でも INCLUDE でも受け付けるようにする、という
事は、VMS のような便利なシステムライブラリが無いので、できません。
また Bonner Lab. 版に元々ある制限ですが、定義しようとしているコマンドが
右辺に現れると再帰定義になってしまい、無限ループに陥りますので御注意を。
Bonner Lab. 版に対する拡張として、シェルの alias と同様にコマンド定義
文字列中の !:1,... !:9, !^, !$, !* を引数で置き換える機能を加えました。
o 変数(lexical)定義機能。
lexical が使えないと Bonner Lab. 版の魅力は半減ですから。
# しかし動かない原因を探る中に、VMS では SYMBOL に制御文字まで定義する
# 事ができていたのだと知りました。深い....
折角ですから lexical を使った例を挙げますと、先ず
define value theta=0
のように値を定義すると、変数 v_theta が宣言されます。以降は
set limit x from v_theta to 360
のように、定数が現れて良い所は全て lexical で置き換える事ができます。
これとは別に、Bonner Lab. 版では < > で挟まれた部分は式と見倣して
評価してからコマンドを実行するという機能が備わっています。例えば
repeat "v_theta <sin(theta)>; -
define value theta=<theta+1>" 361
を実行すれば、正弦関数のデータセットが出来上がります。この例で判る
ように、< > の中では 'v_' を付けずに変数を参照できます。また、行末の
'-' が次の行への継続を表すというのは、VMS/DCL を知る人には馴染み深い
と思いますが、本版では UNIX 風にバックスラッシュ '\' による継続もサポ
ートしています。尚、継続して入力可能な文字列の最大長は 512 文字です。
これを超える長いコマンド文字列を与えたい時は define command を利用する
等してください。しかし define command で定義できる文字列の長さも (引数
の置き換えを行った結果として !) 512 文字を越える事はできません (^^;。
lexical は、コマンド定義と同様に環境変数に定義され、例えば v_theta は
TD_V_THETA=.0
のように割り当てられますので、良く使う定数(?)を予め定義しておく事も
可能です。
ちなみに、define value は数値の定義ですが、文字列は
define string name="Yumiko"
等のコマンドで定義されます。参照するには
title top 'My name is ' s_name
のように 's_' を付けます (この例では、最初の '' で囲まれた文字と勝手に
連結するのが違和感を与えるかも知れませんが.... これで動くのです)。
文字列は TD_S_NAME 等という形で環境変数に割り当てられます。
また、define value で定義された変数も、's_' を付けて文字列として参照
できますので、例えば
define value tmp=<sin(30)>
type s_tmp
等のように演算結果の確認ができたりします。
定義されたコマンドや lexical を見るための show command、show values と
いったコマンドも、取り敢えず復活しました。しかし (これは仕様ですが)
show values では Topdrawer がシステムとして使用する lexical 変数
(help lexical_values list_of_names で表示されるもの) は表示されません。
困った事に、これらのシステム変数に値を代入する事は可能で、エラーも
警告も出ないのですが、期待と異なる動作をするので悩むハメに陥ります。
取り合えず、ユーザーが定義する lexical 変数は“有りそうに無い名前”を
使うか、予め type コマンドで定義されていない事を確認した方が無難です。
define 関係では、もう一つ key というのが有りますが、こちらはまず需要が
無いと思いますので、使えないまま放ってあります。
o 起動時の初期化機能。
ユーザーのホームディレクトリに ".topdrawrc" というファイルが存在する
時には、その内容を先ず実行するようにしました。
o 二次元ヒストグラムの scatter plot (乱数によるセルの点描画)
これは幾つか問題がありまして、一つは X 用ドライバの点描画の部分がバグ
ってました。カラー設定の引数が間違っていたんですが、8 ビットカラーで
白黒しか使わないと偶然 (?) にもうまく描画されてしまうので、FNAL の作者
も気付かなかったのでしょう (関係無いですけど、X のアプリケーションには
8 ビットカラーでないと動かないものって多いですよね)。もう一つは
Topdrawer 自身のソースに X-Y が入れ替わって表示されるというバグがあった
のですが、VMS で動いている Bonner Lab. 版で調べた所、Ver.3.? ('89) 辺り
では正しく動いていたのに、Ver.4.4 ('92) で同様の症状を示すようになって
いました (配列の代入箇所を EQUIVALENCE を使って省略しようとしてハマった
ようです。気持はわかりますが...)。
scatter plot の表示は、read mesh で読み込まれた二次元データに対して
set three off
を宣言した後、plot コマンドで行われます。描く点の数は plot random=10
等によって調整できますし、plot コマンドを繰り返し実行する事によって
「段々」濃く描く事もできます。これに対し、シンボルによるセルの表示
(二次元ヒストグラムのレゴ表示) を行うには
plot norandom variable symbol=CP size=4
等と入力します (塗潰しシンボル CP については後述します)。
o マウスカーソルによる座標の読み採り
これは X でしか動作を確認していません。対話型モードで適当な図を出力した
後に
show cursor
と入力すると十字カーソルが現れますので、マウスボタンをクリックすると、
カーソル位置の論理座標およびデバイス座標 (title コマンドで指定するのに
便利)、さらにどのボタンが押されたかが返ってきます (1, 2, 3 に対応して
'X', ' ', 'Q' となります。何故こうなのかは、例えば fit の領域をカーソル
で指定する方法を調べて見ると推測できるでしょう)。三次元プロットでも
機能しますが.... 返って来る値の意味はマニュアルを見てください。
カーソルは、X-server の能力に応じてできるだけ大きなビットマップを割り
当てるようにしています。ビットマップカーソルが機能しない場合には、
フォントカーソルを使います。
o X ドライバでビットマップフォントを使えるようにしました。
綺麗な出力を得るためには duplex フォントだけで十分とは思いますが、
大量のヒストグラムデータをパラパラ眺めたいという時などは、ハード(?)の
フォントを使う方が速いし、縮小した時の可読性が高いと言えます。
フォントは、後で述べる font pattern にマッチするものの中から、
要求される大きさに最も近いものを自動的に選択します。従って、
font pattern のサイズ指定部分は asterisk (*) にしておくのが無難です。
本来 X11 のフォントは横向きにしか描けない (回転できない) のが仕様です
が、X11R5/contrib の xvertext-5.0 (と xfig-3.x で用いられている実装)
を用いて、任意角度の回転を実現しています。これらのフリーソフトの作者に
この場を借りて感謝します。
ところで、Bonner Lab. 版でハードフォントを使うためには set font basic
の他に set mode vector=off を実行する必要のある点が SLAC 版と異なるので
注意が必要です。
5. TDRVAX.EXE との互換性のために施した変更
o CASE 文による修飾および SYMBOL 指定を SLAC 版と互換のものにしました。
Bonner Lab. 版との互換モード (即ち UGS 本来の修飾方法) には、
コマンドラインオプション -b で切替える事ができます。
o DUPLEX フォントとして UBCFONT を使用し、若干の拡張を加えました。
UBCFONT では CASE 文に "I"、"J"、"1"、"2" を指定すると、各々
Italic, Script, Sans-Serif, Gothic で出力されます
(ただし set font duplex を実行した場合のみ)。
これも TDRVAX.EXE の拡張機能ですが、UGS2 が字体として使用している
Hershey database (*) には元来含まれていたフォントの一部です。
今回は更に、CASE 文 "3"、"4" の指定で Bold-Roman, Bold-Italic が出力
されるように拡張を加えました。
また、負号 "-" はハイフンとして使うと間延びしてしまうので、CASE "1" で
修飾される "-" は、長さを少し短目にしました。
さて、折角色々なフォントを選べても軸線の数値 (LABEL) に CASE 修飾が
できなくては有難み半減です。そこで、ちょっと強引ですが
set font duplex I
のように、set font コマンドのパラメータを増やして、CASE " " で指定される
べきデフォルトの字体を与えてやるようにしました。このパラメータには
I, J, 1, 2, 3, 4 のみが有効です。
(*) Hershey database (NBS Special Publication No. 424) とは、Alan V.
Hershey 氏が National Bureau of Standards 在職中にまとめたプロッター
用ベクトルフォントデータ集で、2000 以上のグリフから成っています。
GhostScript でも Hershey database をフォントに使っており、詳しい
説明が ghostscript/doc/hershey.doc にあります。
o sideways、rotate、portrait の回転方向を逆にしました。
些細な事ですが、縦長の図を描きたい時に set device または set size で
これらのパラメータを指定した場合、何故か Bonner Lab. 版では SLAC 版
(或は常識的な方向と言い替えても良いですが) とは逆方向、即ち時計回りに
回転します。これは、例えば PostScript 出力を GhostScript で見たり、
TeX に読み込む際に逆様になってしまうわけで、ちょっと困ります。
Bonner Lab. 版には orient=... によって 90°単位の任意方向に回転する
機能があるので本質的ではありませんが、互換性のために変更を加えました。
ところで、SLAC 版では set device sideways しか許されませんが、Bonner
Lab. 版では set size sideways (或は rotate|portrait|orient=... ) も
使えます。この事はユーザーの便利と言うよりは、(真の意味での) デバイスの
指定以外で set device コマンドを使って欲しくないという事情に起因している
と思われます。Bonner Lab. 版で set device コマンドを使う時には、必ず
デバイス名を添えないと、例えば PostScript の場合には正しいファイル名に
出力されない等の不都合が生じるので、注意が必要です。
o 出力デバイスとして EPSF を追加しました。
と言っても、このデバイス名は慣習的なものです。実は FNAL 版の PostScript
用 UGS ドライバでは既に BoundingBox を描画域ピッタリに設定する機能が付加
されており、紙面の端に小さく描かれた図を TeX に取り込む場合でも自動的に
位置決めされるようになっています。追加した EPSF ドライバの PostScript
ドライバと異なる点は、単に用紙を縦置きにして使用する (上側半分を使用し
ない) 事だけです。本質的には下で説明する -d postscr,sideways で実現でき
る事なのですが、こんなコマンド憶えちゃいられない人も居るでしょうし ^^;)、
TeX の EPSF マクロでは“回転”ができないという点から、意外に重宝すると
期待します。
ちなみに、適切に BoundingBox の指定された (Topdrawer 出力ではそうなって
いると期待するわけですが) PostScript ファイルを TeX に取り込むには、
\documentstyle[...,eclepsf]{....}
.......
\begin{figure}[h]
\centering
\epsfile{file=figure.eps, scale=0.5}
\caption{hogehoge}
\end{figure}
......
等とやるだけです。後は xdvi を起動して PSfile ボタンをクリックすれば、
自動的に最適の位置に貼り込まれているのが確認されるはずです。
o Xterm (Kterm) 上での利用を考慮して、TEK4010 のデバイス依存コードに
VT100 <=> TEK4010 のモード切替えのエスケープシークエンスを加えました。
# 残念ながら、kterm-6.2 では Tektronics エミュレータをデフォルトでは
# 組み込まない仕様に変更されてしまいましたが…。
6. 本版独自の拡張
o 出力デバイスの選択は、コマンドラインオプション -d device-name
で指定するようにしました (この方が UNIX としては自然)。もちろん
device-name には SET DEVICE で使えるオプションも指定可能です。
例えば
% td -d postscr,sideways
等とやれば、eclepsf.sty に適したファイルが出力されます。ただし、
コンマ (,) の前後にスペースを入れないように注意してください。
o ファイル名指定の際に、環境変数 ($ で始まる文字列) および ~ (tilde:
$HOME で指定される home directory) の置換を行なうようにしました。
o PSEUDO PIPE 機能
set file input='...' で指定されるファイル名が '|' で始まる場合には、
それ以降をシェルコマンドと解釈し、その実行結果を topdrawer コマンド
として入力します。最も有り勝ちな応用例は gzip を使った場合だと思い
ます。topdrawer の入力データは文字列である為、サイズが大きくなって
しまいますが、これを gzip で圧縮しておき、それを読み込む際には
set file input='| gunzip -c hogehoge.dat.gz'
等と展開すれば、ディスク領域の節約になります。もう少しトリッキーな
例を示しますと、図は残っているんだけど実行ファイルの所在を忘れてしま
った、という事態を避けるために、タイトルにフルパスを付ける方法です。
set file input='| echo define string dir=\"`pwd`\"'
title top s_dir "/hogehoge.tdr"
この例では二重引用符をバックスラッシュでエスケープする点に注意して
ください。
ところで "PSEUDO PIPE" と呼んでいるのは、これが真面目な pipe の実装に
なっていないからです。C ならば popen で簡単に実現できる事なのですが、
Fortran ではコレを (一般的に) 実現する方法は有りませんし、UNIT 番号の
受渡しが有るので Fortran-callable な C ルーチンを書くという訳にも行き
ません。仕方無いので、STATUS='SCRATCH' で OPEN される一時ファイルに
強引にリダイレクトで書き込んでいます。従って、一時ファイルを作らない、
或いはアクセス不能な場所に作成するプラットホームが、もし有るとすれば、
そこでは本機能は使えません。
o 変数(数値、文字列)をコマンドラインから定義できるようにしました。
それぞれ -V および -S というオプションを使って
% td -V value=0. -S name="Yumiko"
という形式で指定可能です。基本的に環境変数の定義でできる事なのです
が、こちらの方が手軽です(変数名を大文字にする必要も無いし^^;)。
o これまでの 7 色に加えて BLACK を指定可能にしました。
BLACK とは背景色の事です。fill と組み合わせて、所謂「中抜き」を実現
する事ができます。しかし、残念な事に join、plot 等の描画コマンドの
色指定修飾子、および set コマンドでは、色指定を 3-bit encoding して
いるため、BLACK は NONE (無指定) と解釈されてしまいます。BLACK が
有効なのは、set color コマンドによる指定と (例外として) title の色
修飾のみです。
o X の出力の際に、default-file から属性を見るようにしました。
アプリケーション名は“Ugs”で、リソース名と省略値は
Ugs*width: 768 # ウィンドウの大きさ
Ugs*height: 585
Ugs*white: White # UGS の色指定に対応して
Ugs*red: Red # 実際に使われるの色の名前
Ugs*green: Green # または‘#RRGGBB’の文字列
Ugs*blue: Blue
Ugs*yellow: Yellow
Ugs*magenta: Magenta
Ugs*cyan: Cyan
Ugs*background: Black
Ugs*fontPattern: -adobe-helvetica-medium-r-normal--*-*-75-75-*
# 前述のビットマップフォントを参照
Ugs*title: UGS on X Window System # タイトルバー
Ugs*iconName: UGS
Ugs*geometry: (指定無し)
# +0+0 等とすれば画面の左上端にウィンドウを開く
等となっています。変更したい場合は ~/.Xdefaults にこれらの行を書き
加えてください (font[P]attern や icon[N]ame の大文字に注意してください。
これは意地悪では無く、X の通常の慣習に従っただけです)。少し X に慣れて
いる人は、いきなり toplevel のクラスの値を指定して、ウィジェット名
(実は“pad”となっています) を付けないのは不自然に思うかも知れませんが、
間違いではありません。何しろウィジェットが一つしか無いので、リソースを
そのまま引き継いでいるのです。
X のアプリケーションでは、常識的に -geometry とか -display という
コマンドラインオプションでデフォルトを変更する事ができますが、残念ながら
Topdrawer ではこれらのオプションは使えません。前述のように Topdrawer は
X“だけ”のために書かれているわけではないので、これらのオプションを受け
付けるようにするには、あまり気の進まない書き換えが必要だからです。
o 塗潰しシンボルの追加
通常のプロットシンボル (SLAC 版では 'P'、Bonner Lab. 版では 'O' で修飾
される) 0, 1,... 9 の他に、以下のシンボルを加えました。
A B C D E F G H I J K L X Y
● ○ ■ □ ◆ ◇ ▲ △ ▼ ▽ ★ ☆ \\ \\
ただし塗潰しをサポートするデバイス、即ち X11 と PostScript でしか実際には
塗潰せません。オープンシンボルは背景色で塗潰してから描画しているので、
他のシンボルや曲線と重なっても (それが後から描かれたものならば) オープン
シンボルのままです。
'X' および 'Y' で指定される '\\' は、各々 X 軸および Y 軸の“不連続”を
表す記号です (微分断面積を縦に並べて描く場合、スケールの切れ目を表す時に
使う、と言えばわかる人にはわかる)。二本の線の間は背景色で塗潰されるので、
“ちゃんと”切れ目ができます。
o 線幅指定範囲の拡張
INTENSITY または WIDTH で指定される線の太さは 1 ~ 5 の制限が有りました
が、これを以下のように変更しました。
set intensity コマンドで指定する場合 … 1 ~ 9
join, histogram 等の描画コマンドに
intensity 修飾指定する場合 … 1 ~ 7
無限の範囲が指定不可能な理由は、UGS にコマンドを渡す際にキーワード
(DIM とか BRIGHT 等) を用いているため、指定可能範囲分のキーワードを
用意しないといけないからです。描画コマンドの修飾の場合に 7 までしか
使えないのは、修飾情報を octal (3 ビット) にパックしているためです T_T)。
その為も有って、intensity 8 および 9 は危険な動作をする (texture 情報を
破壊する) 場合も有るので、注意してください。
o PostScript のデバイス依存コマンドの追加
postscr (epsf) のデバイス依存モジュールに以下のコマンドを追加しました。
FONT=<font>
WHITE=<rgb>
(RED, GREEN, BLUE, YELLOW, MAGENTA, CYAN, BLACK も同様)
ここで <rgb> とは赤緑青の色比を表す 16 進数 6 桁または 12 桁の文字列で、
<font> とは
Times-Roman
Times-Italic
Times-Bold
Times-BoldItalic
Helvetica
Helvetica-Oblique
Helvetica-Bold
Helvetica-BoldOblique
Courier
Courier-Oblique
Courier-Bold
Courier-BoldOblique
Symbol
のいずれかの文字列です (大/小文字は区別しません)。指定が無い場合の
デフォルトは、FONT=Helvetia、WHITE=FFFFFF、RED=FF0000、GREEN=00FF00、
BLUE=0000FF、YELLOW=FFFF00、MAGENTA=FF00FF、CYAN=00FFFF、BLACK=000000
です。これらはデバイス指定と共に指定されます。td コマンドの中からは、
set device postscr "font=helvetia-oblique,red=ff2211"
のように指定してください。通常の device パラメータと異なり、引用符 (")
で囲む必要がある点に注意してください。シェルのコマンドラインから指定
する場合は、シェルが引用符を解釈してしまいますから、
% td -d postscr,\"font=times-roman,cyan=11eeee\"
の様にエスケープしてください。コマンドラインの指定では、コンマや等号の
前後に空白を入れてはならない点も注意してください。また、フォントは
PostScript プリンターのハードウェアフォントですから、
set font basic
set mode vector=off
を宣言しないと、使用されません。
o PostScript ドライバのデフォルトの解像度を 600dpi にしました。
FNAL 版のデフォルトは 300dpi だったのですが、まぁこの御時勢ですから…。
UGS は解像度で truncate された値をドライバに渡すので、文字や○●等の
シンボルの表現力がかなり変わります。実は、解像度はデバイス依存コマンド
で変更する事ができたのですが、線幅を調整する部分がバグって (解像度を
上げると線がより細くなるようになって) いたので、これも修正しました。
線幅の最小単位 (set intensity 1 で与えられる幅) は、互換性のために
1/300″にしています。因みに、解像度 (と描画域) に関するデバイス依存
パラメータの名前と初期値は以下の通りです。
RUCMX = 600/2.54 RUCMY = 600/2.54 ; Rusters/cm
XMIN = 300 YMIN = 300 ; Minimum in ruster unit
XMAX = 6300 YMAX = 4800 ; Maximum in ruster unit
この変更により、シンボルを除く図形の塗潰しは二倍のデータが生成される事に
なりますが、これが問題になる事は少ないと期待します。
7. FNAL 版から引き継がれている制限
o サポートされているデバイスは X11, PostScript, Tek4010 のみ。
o HBOOK ヒストグラムファイルは読み込めません。
(FNAL 版では一応リンクはしていますが、無駄なので外しました)。
o Shared memory が使えない (VMS 版でも使った事が無いのでノーコメント)。
o データ領域のダイナミックなアロケーションができない。
これに関しては本質的な困難があるわけでは無いのですが... 御存知のように
UNIX システムのダイナミック (或いは共有) メモリ割り当ての機構は FORTRAN
と非常に相性が悪いので、かなりの書き換えを要します。仕方ないので、
取り敢えずデータ領域のデフォルトを 1 MB に広げておきました (FORTRAN は
スタティックに領域を割り当ててしまうので、executable のサイズも大きく
なってしまいますが。或る理由によって volatile にはできないのです)。
o サブルーチンライブラリ (tdhist, tdjoin 等) はサポートしない。
これは、VMS/DEC-Fortran のサブルーチン引数に関する扱いが独自仕様なので
移植が難しいという点と、Fortran callable なライブラリとしては PGPLOT の
方が表現力が有り、広く普及していて薦められる点を考慮すると、Topdrawer
に拘るメリットを感じないからです。
o 既知のバグの幾つか(?)
8. バージョン情報
o Release 0.1 1995 年 9 月 10 日
取り合えず Linux 上で動く版の完成。OSF/1 上での動作も確認。
o Release 0.2--0.4
何時どんな変更が加えられたか記録は残っていません。
o Release 0.5 1996 年 1 月 20 日
X のリソース指定部分を改良し、本来 Core ウィジェットに無い色
(white, red, ...) および Font Pattern を設定できるようにしました。
o Release 0.6 1996 年 2 月 3 日
機能拡張は有りませんが、ソースの危うい箇所 (FORTRAN77 の本来の
文法では許されておらず、unix-fortran では不安定動作の元になると
思われる部分) を徹底的に修正しました。これまで known problem で
あったデバイスの切替え時の fault も起こらなくなり、堅牢さが
増したと思っています。
o Release 0.7 1996 年 2 月 25 日
OSF/1、SunOS 上でも簡単に make できるように、ソースおよび Imakefile
を整備しました。これに伴い INSTALL ドキュメントを付けました。また、
reference マニュアルである TOPDRAWER.DOC の HTML 版を用意しました。
o Release 0.8 1996 年 5 月 19 日
Linux の ELF バイナリをストレートに make できるようにしました (と
言っても g77-0.5.18 の性能向上に頼っただけですが)。その他にも多数の
マイナーバグを修正したり、CASE の使い方をまとめた html ファイルを
作ったりしていたので、ここで一区切りとしました。
o Release 0.9 1996 年 7 月 31 日
変数定義のコマンドラインオプション (-V, -S) を加えました。
英語のドキュメント整備を少し進めました。
o Release 1.0 1996 年 8 月 16 日
線幅 (INTENSITY) のレベルを 5 段階から 9 (7) 段階に変更しました。
PostScript のデバイス依存コマンド (FONT, WHITE,...) を追加しました。
o Release 1.1 1996 年 8 月 23 日
td の中のファイル指定の無意味なデフォルト指定を排し、環境変数や
~ (tilde) の解釈を加えるようにしました。
o Release 1.1a 1996 年 9 月 13 日
拡張シンボル (●○■□等) が texture に依存しないようにしました。
o Release 1.2 1996 年 11 月 20 日
OSF/1 で変数定義機能が働かない (Bonner Lab. 版オリジナル部分の)
バグを修正しました。DDNAME の指定でファイル名が大文字に変換されて
しまうのを禁止するように変更しました。stdin をリダイレクトして
起動した際に、ページの切れ目で SIGNAL を待つためのオプション -w
を追加しました。この機能を利用して Emacs (Mule) から topdrawer を
起動するための e-lisp "td.el" (東大理・物理 大西氏による作) を
contrib/elisp/ 以下に加えました。
o Release 1.2a 1996 年 11 月 23 日
td.el の PostScript 出力(絶対パス指定時)の不具合を修正。
epsf ドライバのデバイス依存パラメータ解釈不全を修正。
o Release 1.2b 1996 年 11 月 30 日
ファイル名の長さの制限(topdrawer で 80 文字、UGS の PostScript
ドライバで 64 文字)を 256 文字に拡張しました。
topdrawer マニュアルの HTML 版を FRAME 対応に変更しました。
td.el の機能拡張(\C-t \C-d を連続実行した時に古いサブプロセスを
kill、Bonner Lab. CASE 方式や絶対パス指定のサポート)。
o Release 1.2c 1996 年 12 月 11 日
stdin を用いた時に、行末の '-' による継続が働かないバグを修正。
set fill angle の指定が radian で解釈されるのを degree に修正。
arrow、box コマンド等の fill が log scale で働かないバグを修正
(これらはいずれも Bonner Lab. 版オリジナルのバグです)。
o Release 1.3 1996 年 12 月 14 日
UGS の X Window System ドライバを整理しました。その結果
・SunOS でカーソルが表示されないバグが解決。
・Exposure Event の処理が「軽く」なりました。
・誤差棒付きのオープンシンボルが、トリックを弄さずに「中抜き」表示
されるようになりました。
o Release 1.3a 1996 年 12 月 28 日
PostScript ドライバのデフォルトの解像度を 600dpi に変更しました。
線幅が解像度に依存する(解像度を上げるとより細くなる^^;)バグを修正。
拡張子が ".top"、".tdr" 以外の時に ".ps"、".eps" が正しく付与され
ない(ファイル名長を 256 文字に拡張して以来の)バグを修正。
o Release 1.3b 1997 年 1 月 7 日
PostScript ドライバの解像度を変えると BoundingBox が正しく生成され
ないバグを修正。td.el の PostScript 出力で、hyphen 等の区切り子を
含むファイル名に対してエラーになるバグを修正。
o Release 1.3c 1997 年 5 月 19 日
show data, show cursor の (Bonner Lab. 版オリジナルの) バグを修正。
Solaris のサポート (と言ってもソースに変更は有りませんが…)。
o Release 1.3d 1997 年 5 月 24 日
td.el のバグ (名前無しバッファで PostScript 出力するとエラーになる)
を修正。doc/topdrawer.tex が何時の間にか壊れていたのを復活。help で
underline や bold が表示されるように doc/topdrawer4.0.hlp および
doc/doc2gih.f を変更 (これが本来の姿)。
o Release 1.3e 1997 年 5 月 27 日
box, circle, ellipse, diamond コマンドで from|to に論理座標を用いた
時に size が物理座標になってしまう (Bonner Lab. 版オリジナルの) バグ
を修正。
o Release 1.3f 1997 年 8 月 17 日
define command で定義されたコマンドに渡す引数のバグを修正。
逆三角関数のラジアン変換のバグを修正。
o Release 1.3g 1997 年 8 月 22 日
define command の引数周りを整理。定義したコマンドのマルチステート
メント使用が可能になった。
o Release 1.3h 1997 年 9 月 18 日
PostScript 出力先を指定しなかった場合に 'ugdevice.xx' にならない
バグ (1.3g で導入された) を修正。html 文書の文法間違いを修正。
o Release 1.4 1997 年 9 月 20 日
X ドライバでビットマップフォントの回転をサポート。塗潰し拡張シンボル
の回転もサポート。
o Release 1.4a 1997 年 9 月 26 日
PSEUDO PIPE 機能のサポート。
o Release 1.4b 1998 年 1 月 23 日
set shield が sideways/rotated/orientation=1,2,3 で正常動作しない
(Bonner Lab. 版オリジナルの) バグを修正。
o Release 1.4c 1998 年 3 月 20 日
標準入力待ちでの signal をうまく扱えない処理系 (OSF1, Solaris,
libc-5.4.38 以降の Linux) に対応しました。但し、libc-5.4.38 自身は
バグが有ってうまく機能しないので、5.4.44 以降を使ってください。