Topdrawerおぼえがき。主にを参考にした。
(incorrectなおぼえがき。)
Topdrawerが出来ることは、以下の通り。他にもいろいろできるかも。Topdrawerコードサンプル集に、サンプルをいろいろ書いた。
Topdrawerのインストール方法を以下におぼえがく。Topdrawerはフリーソフトではないので注意。岡村さんのページからTopdrawerのバイナリデータをダウンロードし、適当なディレクトリに置き、名前をtdに変更する。Topdrawerを置くべきディレクトリは、特に決まっていないらしいので、${HOME}/binというディレクトリに置く。さらに、いかなるディレクトリにいても、tdと打つだけでTopdrawerを起動できるように、${HOME}/binにパスを通しておく。Topdrawerの置き場所は、${HOME}/binではなく、/usr/binあたりでもよいかも?
Topdrawerのhelpを使うには、Topdrawer本体とは別に、topdrawer.tar.gzの中に入っているtopdrawer4.0.gihが必要である。helpを使えるようにするには、以下の手順を踏めば良い。topdrawer.tar.gzをダウンロード&解凍し、そこからtopdrawer4.0.gihを抜き出して、${HOME}/binに置く。.bashrcを編集し、環境変数:TD_HELPに${HOME}/bin/topdrawer4.0.gihを指定する。ついでに、PAGERも設定しておくと良い。これでhelpが使えるようになる。
上記の手順を実際に実行するには、端末にて以下のコマンドを打つ。Debian etchでうまくいくかも。
$ cd ~/ # ホームディレクトリに移動 $ mkdir bin # binディレクトリを作る $ gedit .bashrc # .bashrcを編集(シェルがbashの場合) 以下の5行を最後あたりに追加して保存。 if [ -d ${HOME}/bin ]; then PATH=${PATH}:${HOME}/bin; export PATH fi export PAGER='less -EX' export TD_HELP=${HOME}/bin/topdrawer4.0.gih $ . .bashrc # .bashrcの変更をシェルに反映 $ cd bin # binディレクトリに移動 $ ls -l /lib/libc-* # glibcのバージョン確認。たぶんlibc-2.3.6.soとかでる。 $ wget http://www.rcnp.osaka-u.ac.jp/~okamura/ftp/pub/index.php?\ > dir=topdrawer/binaries/\&file=td-Linux.glibc2.3.gz # glibcのバージョンにあわせる。 $ gunzip td-Linux.glibc2.3.gz # 解凍 $ mv td-Linux.glibc2.3 td # ファイル名変更 $ chmod +x td # 実行権限を付加 $ wget http://www.rcnp.osaka-u.ac.jp/~okamura/ftp/pub/index.php?\ > dir=topdrawer/\&file=topdrawer.tar.gz # topdrawerのソース等をダウンロード $ tar xzf topdrawer.tar.gz topdrawer/doc/topdrawer4.0.gih # topdrawer4.0.gihを抜き出し $ mv topdrawer/doc/topdrawer4.0.gih ./ # 場所移動 $ rm -r topdrawer topdrawer.tar.gz # 不要ファイル削除 $ td # Topdrawer起動 TD: 1 1 TD: 2 2 TD: join TD: help TD: exit $ |
Topdrawerの起動方法は、3種類ある。
もっとも単純で基本的な起動方法。TopdrawerのプロンプトTD:に対して一行づつコマンドを入力していく。
$ td # Topdrawer起動 TD: 1 1 TD: 2 2 TD: join TD: exit $ |
もっとも良く使いそうな起動方法。Topdrawerのコマンドが書かれたファイルを、起動時に引数として指定する。ファイル中のnewやexitといったコマンドに出会うと、一旦停止し、enterが押されるまでグラフを表示しつづける。
$ td test.top # Topdrawer起動 PAUSE: $ |
ファイル名: test.top |
---|
1 1 2 2 join |
もっとも使いどころがよくわからない起動方法。標準入力stdinをリダイレクトし、Topdrawerの入力とする。Topdrawerの単独利用ではなく、他のプログラム(ここでは、Perlを例にとる。)から外部プログラムとしてTopdrawerを利用する事を想定しているらしい。以下にPerlからTopdrawerを起動する例を示す。
$ chmod +x top.pl # 実行権限を付加。 $ ./top.pl # enterで終了。 |
ファイル名: top.pl |
---|
#!/usr/bin/perl open(PP, "|td") or die "Can't Open\n"; # Topdrawerへのパイプをオープン。 $oldfh = select(PP); # 標準出力先をPPに変更、及びSTDOUTを$oldfhに退避。 $| = 1; # PPへの出力はバッファリングしない。 select($oldfh); # 標準出力先をSTDOUTに戻す。 print(PP "1 1\n"); # Topdrawerにコマンドを出力。 print(PP "2 2\n"); # Topdrawerにコマンドを出力。 print(PP "join\n"); # Topdrawerにコマンドを出力。 <STDIN>; # 入力待ち。この行がないと一瞬で終了。 print(PP "exit\n"); # Topdrawerにコマンドを出力。 close(PP); # パイプをクローズ。 |
もしファイルをリダイレクトさせて描画した場合、newやexitといったコマンドに出会ってもPAUSEしない仕様であるため、ウィンドウは一瞬表示された後すぐに閉じてしまう。ただし、-wオプションを付けて起動すると、newやEOFでシグナル待ちの状態になり、一旦停止する。シグナルは、SIGUSR1でCONTINUE、SIGUSR2でSTOPと解釈し、それ以外は無視する。以下にPerlからTopdrawerを-wオプションつきで起動する例を示す。
$ chmod +x top2.pl # 実行権限を付加。 $ ./top2.pl # enterで終了。 |
ファイル名: top2.pl |
---|
#!/usr/bin/perl # -wオプションをつけてTopdrawerを起動。 # TopdrawerをSTOPするときは、kill文でシグナルSIGUSR2を送る。 $pid = open(PP, "|td -w") or die "Can't Open\n"; # Topdrawerへのパイプをオープン。 $oldfh = select(PP); # 標準出力先をPPに変更、及びSTDOUTを$oldfhに退避。 $| = 1; # PPへの出力はバッファリングしない。 select($oldfh); # 標準出力先をSTDOUTに戻す。 print(PP "1 1\n"); # Topdrawerにコマンドを出力。 print(PP "2 2\n"); # Topdrawerにコマンドを出力。 print(PP "join\n"); # Topdrawerにコマンドを出力。 <STDIN>; # 入力待ち。この行がないと一瞬で終了。 kill(SIGUSR2,$pid); # TopdrawerにシグナルSIGUSR2を送ってSTOPさせる。 close(PP); # パイプをクローズ。 |
以下にPerlのSTDOUTをTopdrawerにリダイレクトする例を示す。
$ chmod +x top3.pl # 実行権限を付加。 $ ./top3.pl # enterで終了。 |
ファイル名: top3.pl |
---|
#!/usr/bin/perl open(SAVEOUT, ">&STDOUT"); # 標準出力をSAVEOUTに退避。 open(STDOUT, "|td") or die "Can't Open\n"; # Topdrawerへのパイプをオープン。 select(STDOUT); # この行はなくてもいいかも。 $| = 1; # STDOUTへの出力はバッファリングしない。 print("1 1\n"); # STDOUTにTopdrawerのコマンドを出力。 print("2 2\n"); # STDOUTにTopdrawerのコマンドを出力。 print("join\n"); # STDOUTにTopdrawerのコマンドを出力。 <STDIN>; # 入力待ち。この行がないと一瞬で終了。 open(STDOUT, ">&SAVEOUT"); # 標準出力を戻す。 |
Topdrawerで描いたグラフをPostScriptで出力する。
対話型入力モードで起動した場合、set deviceコマンドで出力をPostscriptにすることができる。deviceの後に、postscriptと描けばよい。orientationを3にすると、グラフの方向が正しく出力される。fileの後に出力するPostScriptのファイル名を指定する。これを省略すると、ugdevice.psという出力ファイルができる。
$ td TD: set device postscript orientation=3 file='aa.ps' TD: 1 1 TD: 2 2 TD: join TD: exit Plot 1 Done. $ ls aa.ps |
ファイルを読み込んで起動した場合も、対話型入力モードで起動した場合と同様にPostScriptを出力することが出来る。ただし、set deviceコマンドのfileを省略すると、出力ファイルの名前は、読み込むファイルの名前に.psをつけたものとなる。
$ td test3.top Plot 1 Done. $ ls bb.ps |
ファイル名: test3.top |
---|
set device postscript orientation=3 file='bb.ps' 1 1 2 2 join |
もう一つの方法は、-dオプションにpostscriptを指定しTopdrawerを起動すると、PostScriptが出力される。さらにsidewaysを指定すると、方向が正しくなる。出力ファイルの名前は、読み込むファイルの名前に.psをつけたものとなる。
$ td -d postscr,sideways test.top Plot 1 Done. $ ls test.top.ps |
ファイル名: test.top |
---|
1 1 2 2 join |
プロットしたいデータが書かれたテキストファイルを読み込むには、SET FILE INPUT=filenameとする。
$ td TD: set file input='dat' TD: join TD: exit $ |
ファイル名: dat |
---|
1 1 2 2 |
define command include "set file input="というコマンドを先に打っておけば、include filenameでファイルを読み込める。ファイル中にデータが何列かに渡って書かれている場合、set order文を用いてx又はyに対応する列を選択する。余計な列は、dummyという引数を用いて無視する。
$ td TD: define command include "set file input=" TD: set order dummy x dummy y TD: include "dat2" TD: join TD: exit $ |
ファイル名: dat2 |
---|
aa 1 bb 100 aa 2 bb 400 aa 3 bb 900 aa 4 bb 1600 aa 5 bb 2500 aa 6 bb 3600 aa 7 bb 4900 |
コマンドは、大文字/小文字のどちらで書いても良い。ファイルを読み込む場合、ファイル名の大文字と小文字を区別するには、ファイル名を' 'や" "で囲めばよいかも?
コメントは行の最初に ( を書く。ただし ( の有効範囲は行ではなく ; まで。
( ここはコメント ( ここはコメント; ここはコメントと見なされない; よってエラーとなる? |
コマンドの一行が長くなる場合は、- を用いて継続行を表すことができる。また、複数のコマンドを一行でまとめて実行するには、; を用いる。
type "aaaaaaaa- aaaaaaa" type "bb"; type "cc"; type "dd" |
Topdrawerでは、実数型(?)と文字列型(?)の変数が扱える。
実数型/文字列型の変数の定義は以下のようにする。
書式 |
---|
( 実数型の定義 DEFINE VALUE name=value ( 文字列型の定義 DEFINE STRING name 'string' |
実数型変数に代入された値を参照するには、変数の頭にv_を付ける。文字列型変数の場合は、変数の頭にs_を付ける。また、実数型変数の頭にs_をつけて参照する と、端末やグラフのタイトルに変数の値を表示することが出来る。
この他、実数型変数を< >で囲んで参照する方法がある。使いどころがよくわからない。変数を計算するときに使うかも?あと、入れ子にすることが出来るかも?
set font duplex set symbol 0P define value val1=1.0 define value val2=2.0 define string str 'plot' title top s_str ' x=' s_val1 v_val1 v_val2 v_val1 <val1+val2> plot |
代入のときもDEFINE 文を使う。むしろ代入ではないかも?
define value val1=1.0 define value val1=<val1+1> type s_val1 |
変数の計算は< >のなかで行う。sinなどの関数も使える。
define value val1=90 define value val2=<sin(val1)> type s_val1 ', ' s_val2 |
Topdrawerでは、if文やreapeat文が使える。
条件分岐をするには、if文を用いる。書式は以下のとおり。ELSEは書かなくても良い。
書式 |
---|
IF|IFNOT [conditions] THEN . . . [ELSE] . . . ENDIF |
if文などで条件を指定するときに用いる関係演算子は以下のとおり。
関係演算子 | |
---|---|
演算子 | 意味 |
.gt. | greater than |
.ge. | greater than / equal |
.lt. | less than |
.le. | less than / equal |
.eq. | equal |
.ne. | not equal |
if文などで複数の条件を指定するときに用いる論理演算子は以下のとおり。
論理演算子 | |
---|---|
演算子 | 意味 |
.and. | かつ |
.or. | または |
.not. | 否定 |
使用法は以下の様。
TD: define value i=10 TD: define value j=11 TD: if v_i .eq. 10 .and. v_j .ne. 10 then TD: type 'aa' aa TD: endif |
繰り返し処理を行うにはrepeat文を用いる。
書式 |
---|
REPEAT "commands" [n] |
例) 1から10の値を表示する。
td: define value i=0 td: repeat "type s_i; define value i=<v_i+1>" 11 0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 td: |
CASE 文とは、グラフのタイトルなどにギリシャ文字や、上付き文字を挿入したい場合に用いるコマンド(?)であり、TITLE文とセットで書く。また、CASE文の変換規則は、データ点のSYMBOLを定義する際にも用いることが出来る。SYMBOLの定義は、2文字で行い、2文字目にcase characterを指定する。
CASE文についての解説は、岡村氏の"Topdrawer CASE 文 クイックリファレンスが詳しい。ここでは、このページに書いてあることが再現できるか試した。その結果、ほぼすべての機能が使えることが確認できた。ただし、text_of_titleに"ABCDEFGH"、case modifier stringに"P"を指定すると記号列の表示方向が縦になった。理由は不明。
Case characterになにも指定しないと、字体はローマンとなる。下図の上が"set font duplex"を書いた場合で、下が書かなかった場合。
Case characterに"I"を指定すると、イタリックを表示する。
コマンド例 |
---|
set font duplex title 1,2 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" case "IIIIIIIIIIIIIIIIIIIIIIIIII" title 1,1.5 "abcdefghijklmnopqrstuvwxyz" case "IIIIIIIIIIIIIIIIIIIIIIIIII" title 1,1 "0123456789 !""#$%&'()*+,-./:;<=>?@[\]^_`{|~}" case "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" |
Case characterに"J"を指定すると、筆記体を表示する。
Case characterに"1"を指定すると、サンスセリフを表示する。
Case characterに"2"を指定すると、ゴシックを表示する。
Case characterに"3"を指定すると、ボールドローマンを表示する。
Case characterに"4"を指定すると、ボールドイタリックを表示する。
Case characterの"G, H, S, X, M, P, A"は各種記号を表示するときに用いる。
コマンド例 |
---|
set font duplex set limit x 0 27 y 0 8 set window y 1 of 1.5 set labels off set ticks size=0.05 set scale y ticks=2 set titles size=3 title -1,1 "A" data center; title -1,2 "P" data center; title -1,3 "X" data center; title -1,4 "M" data center; title -1,5 "S" data center; title -1,6 "H" data center; title -1,7 "G" data center; title 1,-0.5 "A" data center; title 2,-0.5 "B" data center; title 3,-0.5 "C" data center; title 4,-0.5 "D" data center; title 5,-0.5 "E" data center; title 6,-0.5 "F" data center; title 7,-0.5 "G" data center; title 8,-0.5 "H" data center; title 9,-0.5 "I" data center; title 10,-0.5 "J" data center; title 11,-0.5 "K" data center; title 12,-0.5 "L" data center; title 13,-0.5 "M" data center; title 14,-0.5 "N" data center; title 15,-0.5 "O" data center; title 16,-0.5 "P" data center; title 17,-0.5 "Q" data center; title 18,-0.5 "R" data center; title 19,-0.5 "S" data center; title 20,-0.5 "T" data center; title 21,-0.5 "U" data center; title 22,-0.5 "V" data center; title 23,-0.5 "W" data center; title 24,-0.5 "X" data center; title 25,-0.5 "Y" data center; title 26,-0.5 "Z" data center; set order x y symbol 1 1 ""; 2 1 BA; 3 1 ""; 4 1 ""; 5 1 ""; 6 1 ""; 7 1 ""; 8 1 ""; 9 1 ""; 10 1 ""; 11 1 ""; 12 1 LA; 13 1 ""; 14 1 ""; 15 1 ""; 16 1 ""; 17 1 ""; 18 1 RA; 19 1 ""; 20 1 ""; 21 1 UA; 22 1 ""; 23 1 ""; 24 1 ""; 25 1 ""; 26 1 ""; 1 2 AP; 2 2 BP; 3 2 CP; 4 2 DP; 5 2 EP; 6 2 FP; 7 2 GP; 8 2 HP; 9 2 IP; 10 2 JP; 11 2 KP; 12 2 LP; 13 2 ""; 14 2 ""; 15 2 ""; 16 2 ""; 17 2 ""; 18 2 ""; 19 2 ""; 20 2 ""; 21 2 ""; 22 2 ""; 23 2 ""; 24 2 XP; 25 2 YP; 26 2 ""; 1 3 AX; 2 3 ""; 3 3 ""; 4 3 ""; 5 3 EX; 6 3 FX; 7 3 GX; 8 3 ""; 9 3 IX; 10 3 ""; 11 3 KX; 12 3 LX; 13 3 MX; 14 3 NX; 15 3 ""; 16 3 ""; 17 3 ""; 18 3 RX; 19 3 ""; 20 3 ""; 21 3 UX; 22 3 ""; 23 3 ""; 24 3 ""; 25 3 ""; 26 3 ""; 1 4 AM; 2 4 BM; 3 4 CM; 4 4 DM; 5 4 EM; 6 4 ""; 7 4 GM; 8 4 HM; 9 4 IM; 10 4 JM; 11 4 ""; 12 4 LM; 13 4 MM; 14 4 NM; 15 4 ""; 16 4 PM; 17 4 QM; 18 4 RM; 19 4 SM; 20 4 TM; 21 4 ""; 22 4 VM; 23 4 ""; 24 4 XM; 25 4 YM; 26 4 ZM; 1 5 AS; 2 5 BS; 3 5 CS; 4 5 DS; 5 5 ES; 6 5 FS; 7 5 GS; 8 5 HS; 9 5 IS; 10 5 JS; 11 5 ""; 12 5 LS; 13 5 ""; 14 5 NS; 15 5 OS; 16 5 PS; 17 5 QS; 18 5 RS; 19 5 SS; 20 5 TS; 21 5 US; 22 5 VS; 23 5 WS; 24 5 XS; 25 5 ""; 26 5 ZS; 1 6 AH; 2 6 BH; 3 6 CH; 4 6 DH; 5 6 EH; 6 6 FH; 7 6 GH; 8 6 HH; 9 6 IH; 10 6 ""; 11 6 KH; 12 6 LH; 13 6 MH; 14 6 NH; 15 6 OH; 16 6 PH; 17 6 QH; 18 6 RH; 19 6 SH; 20 6 TH; 21 6 UH; 22 6 ""; 23 6 WH; 24 6 XH; 25 6 YH; 26 6 ZH; 1 7 AG; 2 7 BG; 3 7 CG; 4 7 DG; 5 7 EG; 6 7 FG; 7 7 GG; 8 7 HG; 9 7 IG; 10 7 ""; 11 7 KG; 12 7 LG; 13 7 MG; 14 7 NG; 15 7 OG; 16 7 PG; 17 7 QG; 18 7 RG; 19 7 SG; 20 7 TG; 21 7 UG; 22 7 ""; 23 7 WG; 24 7 XG; 25 7 YG; 26 7 ZG; plot size=3 |
コマンド例 |
---|
set font duplex set limit x -1 22 y 0 5 set labels off set window y 1 of 2 set ticks size=0.05 set scale y ticks=1 set titles size=3 title -1.7,1 "P" data center; title -1.7,2 "X" data center title -1.7,3 "M" data center; title -1.7,4 "S" data center title 0,-0.5 "0" data center; title 1,-0.5 "1" data center; title 2,-0.5 "2" data center; title 3,-0.5 "3" data center; title 4,-0.5 "4" data center; title 5,-0.5 "5" data center; title 6,-0.5 "6" data center; title 7,-0.5 "7" data center; title 8,-0.5 "8" data center; title 9,-0.5 "9" data center; title 10,-0.5 "(" data center; title 11,-0.5 ")" data center; title 12,-0.5 "*" data center; title 13,-0.5 "+" data center; title 14,-0.5 "-" data center; title 15,-0.5 "." data center; title 16,-0.5 "/" data center; title 17,-0.5 ":" data center; title 18,-0.5 "<" data center; title 19,-0.5 "=" data center; title 20,-0.5 ">" data center; title 21,-0.5 "?" data center; set order x y symbol 0 1 "0P"; 1 1 "1P"; 2 1 "2P"; 3 1 "3P"; 4 1 "4P"; 5 1 "5P"; 6 1 "6P"; 7 1 "7P"; 8 1 "8P"; 9 1 "9P"; 18 2 "<X"; 20 2 ">X"; 0 3 "0M"; 2 3 "2M"; 10 3 "(M"; 11 3 ")M"; 12 3 "*M"; 13 3 "+M"; 14 3 "-M"; 15 3 ".M"; 16 3 "/M"; 19 3 "=M"; 0 4 "0S"; 2 4 "2S"; 10 4 "(S"; 11 4 ")S"; 12 4 "*S"; 13 4 "+S"; 16 4 "/S"; 17 4 ":S"; 18 4 "<S"; 20 4 ">S"; 21 4 "?S"; plot size=3 |
Case characterの"C"は、上付き/下付き文字を書いたり、文字の位置を制御したり、文字のサイズを変更するときに指定する。
上付き/下付き文字モードの切替えは、以下の数字を用いる。
文字位置の制御は、以下の数字を用いる。この制御方法では、文字列中のある文字の位置を記憶し、後からそこに戻って再び文字を書く。よって、文字を重ねて書きたい場合などに用いる。例として、文字の上にベクトルを表す矢印を書いたり、根号の上の伸ばし棒部分を書くような場合が考えられる。
文字サイズの変更は、以下の文字を用いる。文字列中のある場所から一旦拡大モードに入ったら、その場所以降ずっと拡大しっぱなしとなる。元に戻したい場合は、1回縮小モードに入ればよい。
コマンド例 |
---|
set font duplex title 1,2 "I4001520-03e0-x0211dx5=524V5P" case "SCCSCCCU SCIC IC CCIIU USCSCG" title 1,1 "aEaEaEaEaFFFFaFaFaFaFa" case " C C C C CCCC C C C C " |
Case characterの"V"はベースラインを変更する。文字列中のある場所から一旦ベースラインを下げたら、その場所以降ずっと下がりっぱなしとなる。元に戻したい場合は、1回ベースラインを上げればよい。
コマンド例 |
---|
set font duplex title 1,1 "R +1+2+3+4+5+6+ L" case "A V V V V V V A" |
Case characterの"U"はスペース文字を表示するときに用いる。スペースは、文字の横方向の位置を調節するのに用いる。バックスペースを用いれば、文字を重ねることも可能。
コマンド例 |
---|
set font duplex title 1,5 "33 L no space" case "PP A" title 1,4.5 "3 30 L 1 space" case "P PU A" title 1,4 "303 L 1 back space" case "PUP A" title 1,3.5 "3132 L 1/2 space" case "PUPU A" title 1,3 "3231 L 1/2 back space" case "PUPU A" title 1,2.5 "3334 L 1/3 space" case "PUPU A" title 1,2 "3433 L 1/3 back space" case "PUPU A" title 1,1.5 "3536 L 1/6 space" case "PUPU A" title 1,1 "3635 L 1/6 back space" case "PUPU A" |