グラフ描画パッケージの解説 薮 哲郎 yabu(at)cc.nara-edu.ac.jp http://denki.nara-edu.ac.jp/~yabu/ 下記の日付がこのパッケージのバージョンを表しています。 変更点は Changes.txt ファイルに記入しています 公開開始 1999 3/11 変更履歴 1999 3/11 3/12 3/15 3/20 3/31 4/19 4/20 4/23 4/26 5/24 5/30 6/10 6/24 7/24 8/2 8/6 8/17 8/30 9/3 9/9 10/26 10/29 11/4 12/20 2000 1/2 1/13 1/26 2/12 2/17 2/21 3/2 4/5 4/11 5/23 5/29 6/6 6/19 7/1 9/21 11/2 11/15 11/21 11/30 2001 1/9 カルコンプライブラリ改訂 変更内容は Changes.txt 参照 1/18 1/23 1/29 2/8 2/16 3/27 7/7 7/19 8/4 8/7 8/11 8/12 12/14 2002 2/19 10/1 2003 2/7 2/10 2/14 2/18 2/27 3/13 4/14 6/5 6/17 6/18 6/30 7/3 7/14 8/27 9/1 9/11 9/16 12/31 2004 1/13 6/7 9/2 2005 10/12 2006 2/2 2/11 2/24 3/5 3/6 3/8 3/11 3/30 4/11 4/13 6/22 7/19 8/8 8/14 2007 8/13 12/3 12/4 2008 8/25 12/10 2009 6/10 9/24 2011 3/7 2013 5/30 2014 5/19 5/23 7/16 2015 10/30 2016 11/7 2017 3/28 5/17 2021 1/26 1/27 2/14 2/16 2/28 6/17 9/8 9/21 2022 7/24 2023 7/9 7/16 8/1 2026 1/27 (注意!)本ファイルに登場する人名の所属はメンテされてません。 1. はじめに ------------------------------------------------------ 本グラフ描画パッケージは Unix で研究する人がグラフを作成するための パッケージです。以下の 3 つの部分から構成されています。 (1) 奈良教育大学の薮が開発したカルコンプ系コマンドのグラフ描画ライブラリ 薮 : http://denki.nara-edu.ac.jp/~yabu/ (2) 京都大学の佐藤先生と北野先生が開発された 直交座標グラフ作成用サブルーチンパッケージ xygraph (3) 公立はこだて未来大学 (元 京都大学) の高橋信行先生が開発された グラフ作成用インタープリタ nsgraph 最新版は常に http://denki.nara-edu.ac.jp/~yabu/soft/original/ 以下にあります。 (1) は C や fortran から call して使うライブラリです。 「線を書く」「領域を塗りつぶす」「文字を書く」という基本機能 をサポートします。作成した図は X Window に表示する、 PS プリンタから出力する、TeX , Word, PowerPoint に取り込むことが可能です。 (2) は fortran から call して使うライブラリです。 「座標軸を書く」「等高線を書く」「点線を書く」「立体的な図を書く」 など高度な機能を備えています。(2) は下位のサブルーチンとして (1) を使用します。 (3) は gnuplot と同様にデータとコマンドを入れたファイルを 用意し、それを読み込ませることによりグラフを作製するインター プリタです。下位ルーチンとして (2) (1) を使用します。 ソースは fortran で書かれています。 上のプログラムの関係は以下のようになっています。 nsgraph ユーザー作成プログラム | | | | | | | | .a : ライブラリファイル \ libxygr.a / \ | / graph.g : 図形データ中間ファイル libcalcomp.a graph.g の作製と X Window への描画は / \ 同時に行われる | libxwplot.a graph.g | * 印 : フィルタプログラム / | | \ X Window / | | \ / / \ \ | | | \ xy2ps* xy2svg* replot* tekplot* | | | | PostScript svg X Window Tektronics Window (1)〜(3) のソフトウェアは GPL の規約に従います。 これらのソフトは各自の責任において使って下さい。 これらのソフトを使ったことによって生じた損害に対する責任は負いません。 2. インストールと環境設定 -------------------------------------------- 2-1. 対応 OS Linux (ubuntu, Raspbian), wsl, Mac OS での動作を確認しています。 unix 系の OS なら動くでしょう。 初期のバージョンの C は ANSI C 以前の規格で書かれていました。 fortran は fortran77 で書かれていまいた。 エラーが出ないように修正をしていますが、Warning は放置しています。 大量の Warning が出ますが気にしないで下さい。 2-2. インストール先ディレクトリ 本パッケージを展開すると graph というディレクトリを作ります。 パッケージを構築すると、全てのライブラリ、実行型ファイルをこの README が存在するディレクトリに作成します。 本パッケージをコンパイルする際に、実行型ファイル中に絶対パス名 を埋め込むことは行っておりません。ですから構築後にディレクトリ 全体を移動しても大丈夫です。但し、後述するように path 変数と 環境変数 GRAPH_LIB_PATH を本 README ファイルがあるディレクトリ に設定して下さい。 従って、自分以外の人も使う場合は構築後にディレクトリ全体を /usr/local/graph あるいは /home/graph などに移動させて path を 通すと良いでしょう。 2-3. インストールに必要な環境 本パッケージは fortran, C を使って書かれています。 「fortran コンパイラ」「X のライブラリ・インクルードファイル」 などが必要です。 Ubuntu, Raspbian の場合、以下のように必要なツールを インストールしてください。 $ sudo -s # apt update # apt install gfortran # apt install libx11-dev # apt install make (なくても ok かも) # apt install cups-client (cups を使わないのなら不要) Mac OS の場合、まずインストール用コマンド brew (apt に相当) を インストールしてください。 $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 次に必要なツールをインストールして下さい。 $ brew gfortran $ brew libx11-dev インストールにはコマンド f77, cc, cpp, perl が必要です。 フォートランコンパイラのコマンド名として f77 を仮定しています。 インストール用のシェルスクリプトは gfortran あるいは g77 を 見つけたときは、README があるディレクトリに $ ln -s /usr/bin/gfortran f77 のように f77 から fortran コンパイラへのシンボリックリンクを 作成します。 2-4. インストール 本 README が含まれているディレクトリにインストール用の シェルスクリプトがあります。 $ ./doinstall とすると、1回めは「許可がありません」というエラーが出るが、 もう一度実行すると構築できる。 Mac OS の場合、doinstall の中の export LDFLAGS="-Xlinker --allow-multiple-definition" の行をコメントアウトしてください。 doinstall は以下のことを行います。 1. 必要な PATH 変数、環境変数の設定 dir="$(pwd)" export PATH="${dir}:/lib:/usr/lib:/usr/ccs/lib:${PATH}:." export GRAPH_LIB_PATH="${dir}" export LDFLAGS="-Xlinker --allow-multiple-definition" 2. インストールに必要な f77 cc cpp perl が あるかどうかチェック 3. perl スクリプト xy77 idrawconv idrawfix idrawthin xy2sk の一行目の #!/usr/bin/perl を which perl の結果で置き換え 4. 各サブディレクトリ xyp xwplot xygr2 calcomp preview conv nsg3 sample で make 個別のディレクトリで直接 make を実行する時は、 上記の 1. を手動で行って下さい。そのために genv という ファイルを用意しています。 $ . genv で設定できます。 コンパイルの結果、以下のファイルが本 README があるディレクトリに 作成されます。 xypp xygraph 用プリプロセッサ libcalcomp.a libxwplot.a calcomp ライブラリ xy2ps xy2svg calcomp ライブラリのフィルタ replot tekplot カルコンプライブラリのプレビューワ libxygr.a xygraph ライブラリ nsgraph nsgraph コマンド また、sample ディレクトリに動作チェック用バイナリが 作成されます。 2-5. インストール時のエラーに対する対処法 FreeBSD ver.11 は以下のエラーに対処する必要があります。 (X のライブラリの位置が正しくない) メイクファイルは X Window のライブラリは /usr/X11R6/lib 、 インクルードファイルは /usr/X11R6/include に存在することを 仮定しています。異なるディレクトリに存在する場合は、 xy77, 各サブディレクトリ中の makefile の書き換えが必要です。 preview/makefile calcomp/makefile xwplot/makefile .c.o : (tab) cc -c -g -fcommon -I/usr/local/include (cpp が .F .f ファイルをプリプロセスしない) cpp a.c はプリプロセスしますが、cpp a.f はプリプロセス してくれません。やむなく標準入力から入れます。 xy77 の中を 2 箇所以下のように書き換えます。 $command = "cpp $cpp_option < $orgfile > $Xfile"; ただし、これにより、コンパイルエラーが発生したとき emacs の C-x ` コマンドは使えなくなります。 gfortran 以外のコンパイラを使うとき、 以下のトラブルが発生する可能性があります。 (関数名の付け方の規則) 本パッケージではコンパイルしたときに 以下のような規則に従うことを仮定しています。 サブルーチン名 ラベル名 aaa ----> _aaa_ aa_bb ----> _aa_bb__ ところが、次のような規則に従うコンパイラもあります。 関数名 ラベル名 aaa ----> _aaa_ aa_bb ----> _aa_bb_ 本グラフ描画パッケージは fortran から C の関数を呼ぶ部分が あり、前者の規則に従うことを前提としています。 fortran ファイルである .f .F .x をコンパイル する場合、makefile において xy77 を使うよう記述 しています。 そして xy77 の中でオプション -fsecond-underscore を付けています。 上記のオプションを持たないフォートランコンパイラを使うと、 リンク時に undefined symbol エラーが発生すると思われます。 そのような場合は、 $ grep __ `find . -name '*.c' -print` として __ を含むラベル名を持つ C のソースファイルを探し、 __ ---> _ の置換を行って下さい。 2-6. プリンターの設定 グラフを出力する方法として svg ファイルに変換し、 svg ファイルをブラウザで表示して印刷する場合は 以下は読む必要はありません。 (printer-list の書き換え) 本パッケージで図を書くと、描画終了時に Print out (y/n) と 表示されます。y を押した場合、プリンターから印刷します。 その際、環境変数 PRINTER から出力先のプリンター名を取得し、 ファイル printer-list より使用するフィルタとオプションを 取得します。以下の説明では PRINTER 環境変数の値が lps で あることを仮定しています。 xy2ps -p mono graph.g | lpr -Plps ~~~~~~~~~~~~~ ~~~~ y を押すと上記のコマンド行を生成します。 xy2ps はポストスクリプトファイルを作成するので、 プリンタ lps は PS プリンタあるいは PS 互換 プリンタであることが必要です。 プリンターシステムとして CUPS を使っており、ネットワークプリンタに 出力する場合は、 $ sudo lpadmin -p lps -E -v socket://192.168.xx.yy のように、プリンタ名 lps をネットワークプリンタの IP アドレス に設定してください。 $ sudo lpstat -l -p lps で確認できます。印刷は以下のコマンドで行います。 $ lpr -P lps ps-file-name (lpd の設定) CUPS ではうまく出力できない場合、lpd を使います。 私の場合 wsl 環境においては、CUPS では出力できず、 lpd を使っています。 lpd は CUPS 以前に使われていたプリンタデーモンです。 設定ファイル /etc/printcap を以下のように書いてください。 スプールディレクトリ /var/spool/lpd は、 存在することを確認して下さい。 ない場合は作成して下さい。 lps|comment for printer:\ :lp=:rm=192.168.xx.yy:rp=lps:\ :sd=/var/spool/lpd:\ :mx#0:sh: lpd を使う場合、以下のように root の権限でデーモン lpd を 起動します。 $ sudo -s # apt install lpr # lpd 2-7. チェック $ ./doinstall check で sample ディレクトリ中のチェック用バイナリが順次実行され、 次に $ nsgraph sample.ns が実行されます。 2-8. ライブラリの消去 $ ./doinstall clean で各ディレクトリで make clean を行い、オブジェクトファイルと 実行型ファイルを消去します。 3. 本パッケージを使う場合の環境設定 ---------------------------------- 本パッケージを使う場合、4. で説明するカルコンプライブラリ が必ず使用されます。カルコンプライブラリを使用するには以下の設定が 必要です。 以下の例では ~/graph に構築した場合です。その他のディレクトリ に構築した場合は、適宜読み替えて下さい。 3-1. path 変数の設定 (必須) xwplot/printout.c から system 関数で呼ばれるコマンドがあります。 path を本 README ファイルがあるディレクトリに通して下さい。 bash の場合 $ export PATH=$PATH:~/graph csh の場合 % set path=($path ~/graph) % rehash 3-2. 環境変数の設定 (必須) 実行時に calcomp/font2.F, xwplot/printout.c, xwplot/color.c から GRAPH_LIB_PATH を参照し、それぞれ font.bin, printer-list, color-table をオープンします。従って、GRAPH_LIB_PATH を本 README ファイルが あるディレクトリに設定して下さい。 bash の場合 $ export GRAPH_LIB_PATH=~/graph csh の場合 % setenv GRAPH_LIB_PATH ~/graph Print out ? (y/n) のとき y を選択すると 環境変数 PRINTER と printer-list より使用するフィルタを 決定します。従って、環境変数 PRINTER も設定して下さい。 bash $ export PRINTER=your-printer-name csh % setenv PRINTER your-printer-name 3-3. 環境変数の設定 (推奨) 環境変数 XW_SIZE XW_BG XY_STAMP を以下のように設定することを お勧めします。環境変数の詳細は 4-4. で詳しく述べます。 $ export XW_SIZE=f1.8 $ export XY_STAMP=y $ export XW_BG=#f0f0f0 本パッケージは 2001/1/9 のバージョンから、ストロークフォントを 使うことをやめ、PS フォントを使うことにしました。 フォント名の指定に関する命令は全面的に変更されています。 ストロークフォントを使いたい場合は以下のように指定して下さい。 $ export GRAPH_FONT=stroke ストロークフォントを使うモードになります。このモードでは PS フォントを選ぶ命令などは無視されます。 後述しますが、ラズパイの X サーバーを使う場合、 あるいはテクトロニクス端末を使う場合は ストロークフォントを使って下さい。 テクトロニクス端末は 1980 年代に使われたグラフ描画用の 端末です(当時の端末は文字しか表示できませんでした)。 現在、テクトロニクス端末は TeraTerm の「コントロール」 →「TEKウィンドウを開く」でシミュレートされます。 TeraTerm で接続して使う場合に利用します。 (注意!) ストロークフォントを使う場合、calcomp/font2.F で fortran の 装置番号 80 でフォントファイルをオープンします。 ユーザープログラムにおいて装置番号 80 番は使わないで下さい。 あるいは font2.F の措置番号を変更してください。 3-4. ラズベリーパイで使う場合について 本パッケージは X Window System への描画において ビットマップフォントを使っています。 Windows におけるフリーな X Server である VcXsrv はビットマップフォントを含んでいます。 ラズベリーパイの X サーバーは /usr/share/fonts/X11 以下にビットマップフォントを保持していますが、 xlsfonts を実行すると 6 種類のビットマップフォントしか 認識していません。理由は不明です。 その結果、文字を書くところで「フォントが見つからない」という エラーが発生します。ラズパイで使う場合、リモートログインし、 $ export DISPLAY=192.168.xx.yy:0.0 として X Server が動作する Windows マシンに 描画する場合が多いと思いますが、 ラズパイの X Window に文字を書きたい場合は、3-3. で 説明したように $ export GRAPH_FONT=stroke として環境変数をストロークフォントを使う設定にしてください。 3-5. X サーバーが動作する PC の設定 リモートログインしたラズパイなどで本パッケージを実行し、 X server が動作する別の PC にウィンドウを開く場合、 X server が動作する PC において以下の設定をしてください。 (1) その PC のファイアウォール(OS 付属のファイアウォールの場合と   セキュリティソフトのファイアウォール機能の場合があります)の設定を   「外部の IP アドレスからの接続を許可する」に設定にする。 (2) X Server において外部からの接続を許可する。   XcXsrv の場合(ショートカット名は XLaunch)、   起動時に表示される 3 個めのウィンドウで   「Disable access control」にチェックを入れる。   wsl1 の場合、ubuntu のウィンドウで   $ xhost + を実行してもよい。 4. カルコンプライブラリ ------------------------------------------ 4-1. カルコンプ系コマンドとは? 1987 頃年より前は、グラフを書くにはプロッタと呼ばれる機械が唯一 の手段でした。プロッタを制御するには Fortran からプロッタ 駆動用のサブルーチンを呼ぶ必要がありました。 このサブルーチン集としてカルコンプ社が作ったプロッタ制御用の コマンド体系が大変に有名であり、これをカルコンプ系コマンド と呼びます。本ライブラリはカルコンプ系コマンドのサブルーチン をサポートし、X Window などへの描画を行います。 C と Fortran のインターフェースを備えています。 4-2. ライブラリの使用法 カルコンプライブラリは libcalcomp.a libxwplot.a の 2 つです。リンク時に上の 2 つのライブラリと libX11.a libm.a を リンクして下さい。makefile のサンプルが prottype.mak です。 各自コピーしてお使い下さい。prottype.mak 中で上記のライブラリの 場所を探す際に環境変数 GRAPH_LIB_PATH を参照しますので、 GRAPH_LIB_PATH を本 README ファイルがあるディレクトリに設定 して下さい。 カルコンプライブラリの大部分は fortran で書かれています。ゆえに、 main() 関数が C の場合でも、f77 でリンクすることに注意して下さい。 また、f77 の代わりに本パッケージに含まれる xy77 を使うと、 上記のライブラリを自動的にリンクすることが出来ます。xy77 に ついては $ xy77 と打つと簡単な説明が表示されます。詳細は xy77 の冒頭をお読み下さい。 カルコンプライブラリは描画終了時に Print out ? (y/n) と表示し、 プリントアウトするかどうかを聞いてきます。キーボードから y または n を入力します。このため、カルコンプライブラリをリンクするプログラムの 標準入力に対してパイプを使ってデータを流し込まないで下さい。 4-3. カルコンプライブラリがサポートするサブルーチン 座標系の単位は cm です。A4 用紙の左下が (0.0,0.0) で右向きに x 軸、 上向きに y 軸です。 fortran から呼ぶ場合、実数型変数は 4 byte 実数です。 C から呼ぶ場合、実数型変数は double です。 詳細は fortran に関しては calcomp/calcomp.F を御覧ください。 C の場合は calcomp/calcompc.c を御覧下さい。 ここでは、fortran から呼ぶ場合の説明をします。C から呼ぶ場合は calcomp/calcompc.h を御覧ください。関数の名前などは同一です。 plots() 描画の開始 (紙の向きは GRAPH_DIRECTION で指定する。 デフォルトは縦) plots_tate() 縦置きで描画開始 plots_yoko() 横置きで描画開始 plotv() 描画の終了 flushwk() バッファにたまっていた描画データを書き出す set_color_table(tname) カラーテーブルの名前を指定する このサブルーチンを呼ばないときは環境変数 GRAPH_COLOR を参照する。GRAPH_COLOR が定義されていないときは default という名前のカラーテーブルを使用する カラーテーブル名としては default, wg, pm, pm64, tg64 などがある。環境変数 GRAPH_COLOR を上記の値に設定し、 sample/tone を実行すると、各テーブルの色が分かる。 plot(x,y,ip) 座標 (x,y) (単位は cm) へ、ペンアップ (またはペンダウン) でペンを移動させる。 ip=2 のときペンダウン、ip=3 のときペンアップ ip=-2 or ip=-3 のとき abs(ip) の動作を行った後、 (x,y) を新しい原点とします。 moveto(x,y) plot(x,y,3) と同じです。 lineto(x,y) plot(x,y,2) と同じです。 rmoveto(x,y) moveto の相対位置指定 rlineto(x,y) lineto の相対位置指定 newpen(iw) ペンの太さが iw のペンに交換する。 ペンの太さは 1 〜 5 。デフォルトは 1 6 は vline, hline 用の細い線 set_pen_color(ic) ペンの色を色番号 ic にする。色番号は 0 〜 30 各色の rgb 値は color-table 中にあります number(x,y,h,a,ang,keta) 座標 (x,y) の位置から高さ h で小数点以下の 桁数 keta で角度 ang 度で数値 a を描く keta ≦ 0 のとき小数点以下は書かない。 symbol(x,y,h,text,ang) 座標 (x,y) の位置から高さ h の文字を 角度 ang 度で描く。text は文字型変数で 右側の空白は自動的に切り捨てられます。 文字の高さは厳密には文字毎に異なります。 ここでの値は平均的な高さに設定してあります。 文字列 text の中に以下のコマンドを含ませることが出来ます。 $helvetica$ $times$ $courier$ $century$ フォントの指定 $uni$ $pro$ プロポーショナル or 固定幅 $alpha$ $beta$ ... ギリシャ文字 $sup{12} $sub{34} 上つき、下つき 文字 デフォルトは helvetica で プロポーショナル < 注意 > 従来の symbol は (x,y,h,text,ang,ntext) のように 文字数も指定していました。本パッケージの symbol には文字数 を与えないで下さい。文字数も指定したい場合は下位ルーチン である hsymbl を直接呼ぶか、calcomp/num-sym.F を変更 して下さい。 c_symbol(x,y,h,num,ang,ifl) 座標 (x,y) の位置を中心とする記号を 高さ h , 角度 ang で描く ifl ≦ -1 32 <= num <= 126 のとき num を文字の ascii コードとみなす それ以外の時、番号 num のシンボルを描く 定義されているシンボルは sample/calcomp_check で表示 詳しくは calcomp/font.ascii も参照。 -1 のときペンアップで (x,y) へ移動してから描く -2 以下のときペンダウンで (x,y) へ移動してから描く ifl = 0 font.ascii で font no. num で定義されている文字を描く 定義されている文字は sample/calcomp_check で表示 stone(l) 塗りつぶしの際の色番号を指定する 色番号と RGB 値の対応は color-table 内にある 色番号と色の対応は使用するカラーテーブルの名前によって異なる。 使用するカラーテーブルの名前は set_color_table(' ') で指定 するか、環境変数 GRAPH_COLOR で指定する。 tone(x,y,n,i) 配列 x(n),y(n) で表された頂点数 n の 領域を塗りつぶす i>=0 のとき、周囲と内部を stone で指定 した色で塗りつぶす。既に書いた線の上から 塗りつぶしてもプリンター出力時は、 下の線は描画される i<0 のとき、下に書いてあるものを塗りつぶす i=-2 のとき、周囲は set_pen_color で指定 した色で書き、内部は stone で指定した色 で塗りつぶす。 i=-3 のとき、周囲と内部を stone で指定 した色で塗りつぶす vline(x,y1,y2,lmask) ドットパターン lmask で縦線を引く lmask は 0 〜 0xffff でビットパターンが点線 のパターンを表す。 lmask は 257 がお勧め。 hline(x,y1,y2,lmask) ドットパターン lmask で横線を引く factor(fact) グラフを倍率 fact で縮小 (拡大) する where(x,y,fact) 現在のペン位置と倍率を取得する origin(xorg,yorg) 現在の原点位置を取得する get_pen_width(ipen) 現在のペンの太さを取得する get_pen_color(icol) 現在のペンの色の色番号を取得する hsymct(s,height,text,ntext) 文字列の横幅、縦幅などを返す 入力 height 文字の高さ text 文字列 (文字型変数) ntext 入力文字数 出力 s(1) 今は使ってない s(2) 今は使ってない s(3) 今は使ってない s(4) 文字列の右端位置 描画の開始時に必ず plots (あるいは plots_tate , plots_yoko) を呼び、 終了時に plotv を呼んで下さい。 plot は薮による独自の拡張が施されており、塗りつぶしも行えますが、 一般ユーザーには不要な機能です。tone を使って下さい。 この機能は hsymbl による塗りつぶしを含むシンボルの為に使われています。 詳細は calcomp/calcomp.F の subroutine plot をお読み下さい。 京都大学大型計算機センターの広報 vol.12 no.4 にカルコンプのプロッタ ルーチンの解説があります。 X Window への描画を担当する libxwplot.a の関数名は岩波書店が出版 している「Fortran77 図形処理プログラミング」における関数名と互換 性を持たせてあります。上記の本は画面に関してはPC-9801 の画面しか サポートしていませんが、libxwplot.a を使えば上記の本のサブルーチン 類をそのまま使うことが可能です。 X Window へ描画するとき、50 ストローク毎に XFlush しています。 XFlush の間隔は xwplot/xwplot.h で定義されています。plotv のとき にも XFlush します。 描画の途中で一旦停止するときは、xwplot.c 中の関数 flushwk_() を 呼んで下さい。Fortran から呼ぶときは call flushwk() として下さい。 4-4. 描画結果と環境変数 カルコンプライブラリによる描画結果は原則として graph.g という ファイルに書き込まれます。graph.g のフォーマットは本ファイルの 10. をお読み下さい。 カルコンプライブラリは以下の環境変数を参照します。 ・XW_SIZE ……… X に開くウィンドウの倍率と縦横比を指定します。 デフォルトは f1.6r0.7 ウィンドーの縦のピクセル数は「550 × 倍率」となります。横は 縦の 0.7 倍です。このサイズの中に、A4サイズの紙一枚 分の、29.7 cm × 20.8 cm が描画されます。ここで設定するサ イズは、画面上に開くウィンドーのサイズのみに影響し、どのよ うなサイズのウィンドーを開いても、その中に 29.7 cm × 20.8 cm の大きさのグラフが描かれます。グラフのサイズそのものを変 えたい時は、環境変数 GRAPH_FACTOR を設定して下さい。 キーワード f (factor の意)の後にウィンドーの倍率 キーワード r (ratio の意)の後にウィンドー縦横比 を記述します。デフォルトは f1.6r0.7 です。 縦の長さ = 550 ドット × ウィンドーの倍率(actor) 横の長さ = 縦の長さ × ウィンドーの縦横比(ratio) (設定例) export XW_SIZE=f1.7 縦のピクセル数が「550 × 1.7」のウィンドーを開きます。 ・XW_ORG ………… X に開くウィンドーの左上位置をドットで指定します デフォルトは x15y15 (設定例) export XW_ORG=x500y200 (設定例) export XW_ORG=x500 --- y はデフォルト値が入ります (設定例) export XW_ORG=x500y --- y はデフォルト値が入ります ・XW_BG ……… X に開くウィンドーの背景色を指定します。 環境変数を設定しない時は white 環境変数を設定しているが値を設定しない時は black darkslategray , black の場合のみ foreground が white になります。 (設定例) export XW_BG=gray ・XW_WM ……… ウィンドーマネージャーの介入 デフォルトは no (設定例) export XW_WM=yes ・XW_FILL ……… X Window 描画時に塗りつぶしを行うかどうかを指定します n または N のとき X Window において塗りつぶしを行いません。 ただし、プリンターに対しては塗りつぶしを行います。 ・GRAPH_COLOR ……… X Window 描画時と xy2ps 実行時に使用するカラーテーブル の名前を指定します。各カラーテーブルの定義は color-table 内にあります。 デフォルトは default ただし、X Window 描画時は set_color_table をコールしたとき そちらの方が優先します。 xy2ps 実行時は graph.g の中に使用するカラーテーブル名が 書き込まれているとき、そちらの設定が優先されます。 (設定例) export GRAPH_COLOR=wg ・GRAPH_DIRECTION ……… 紙を置く方向を設定します。デフォルトは縦置き。 tate,yoko のいずれかを指定します。 但し、plots_tate, plots_yoko を呼んだ時は、 そちらの方が優先されます。 (設定例) export GRAPH_DIRECTION=yoko ・ GRAPH_OUT ……… 図形データの出力先を指定する。 X Window に描画するかしないか (デフォルト:描画する) Printer から出力するかしないか (デフォルト:出力するか尋ねる) graph.g を作製するか否か (デフォルト:出力する) の 3 つについて設定します。graph.g はカレントディレクトリに作られ ます。graph.g は 5. で述べるように、様々なフィルタによって変換 することが出来ます。 キーワード X , P , F の後に、y , n , q を書くことにより設定します X : X Window に関する設定 y : yes F : 出力ファイルに関する設定 n : no P : プリンターに関する設定 q : question X Window プリンター ファイル +--------------------------------------------------------- y | 描画する 出力する 残す n | 描画しない 出力しない 残さない q | -------- 出力するか尋ねる ------ 環境変数を設定しなかった場合、あるいは指定しなかった出力 先(キーワード)についてはデフォルトの設定が採用されます。 (注意!) プリンターに出力する可能性がある時は、自動的に Fy に設定されます 全てを n に設定した場合は、自動的に XnPnFy に設定されます (設定例1) export GRAPH_OUT=XnPn X Window に描画せず、プリンターにも出力しません。 graph.g についてはデフォルトの設定 (作る) になります。 (設定例2) export GRAPH_OUT=XnPy X Window に描画せずプリンターから出力する。大量のグラフを 画面で一つ一つ確認せずに出力する場合はこのように設定します。 ・GRAPH_FACTOR ……… グラフの縮尺を設定します。デフォルトは1。 但し、factor ルーチンをコールした場合は、その 値の方が優先されます。 (設定例) export GRAPH_FACTOR=0.8 カルコンプ系コマンドでグラフを描く時のファクターを 0.8 に設定します。 ・GRAPH_FONT ……… symbol ルーチンの動作を決定します。 stroke に指定すると、2001/1/9 以前のバージョンで 使われていたストロークフォントを使います。 このとき装置番号 80 番を使用します。 それ以外の時、Helvetica などのアウトラインフォント を使います。 ・XY_STAMP ……… graph.g を PostScript ファイルに変換する xy2ps が 参照します。日付を入れるかどうか デフォルトは n 。日付を入れたい場合は [y|Y] に 設定します。 ・GRAPH_FILTER ……… printer-list ファイルの設定を使いたくない場合に フィルタを直接指定します。通常はこの環境変数は 設定する必要はありません。 (設定例) export GRAPH_FILTER="xy2ps -p mono" ・GRAPH_FONT_PATH ……… 独自のフォントファイルを使いたいときに指定します フォントファイルは font.bin というバイナリ形式です。 font.ascii ファイルより calcomp/makebinfont を使用して作成します。 (設定例) export GRAPH_FONT_PATH=~/lib ・COLOR_TABLE_PATH ……… 独自のカラーテーブルを使いたいときに指定します (設定例) export COLOR_TABLE_PATH=~/graph 4-5. X Window 描画時の注意 カルコンプライブラリ libxwplot.a を export GRAPH_OUT=Xy で使用した 場合および 5-1. で説明する replot コマンドは X Window に描画します。 tone(x,y,n,i) による塗りつぶしを行うと、X Window においては、 i の値にかかわらず、塗りつぶす前に描かれていた線画は 塗りつぶされて見えなくなってしまいます。 例えば、xycont で塗りつぶしを含む等高線図を描いた場合、 座標軸の tics が見えなくなってしまいます。 i>=0 の場合は、X Window に描く図は上記のようになりますが、 プリンターから出力される図などは、仕様通り、塗りつぶし図形の 下に描かれていた線も描きます。 本来は、塗りつぶす場合、ピクセル値が _background と同じ場所 だけを塗りつぶす処理が必要ですが、簡単には実現できないので 放置してあります。 4-6. 記号の追加 c_symbol コール時に描かれる記号を追加したい場合は、 calcomp/font.ascii に symbol を追加して下さい。 フォーマットなどの詳細は font.ascii の冒頭に書いてあります。 font.ascii を変更した後、make して下さい。 makebinfont を実行して font.bin を作製します。 同時に作成される font.debug は不要です。 5. カルコンプライブラリが作成する graph.g の使い方 -------------- 5-1. プレビューワ カルコンプライブラリをコールすると、X Window を開き、描画を 行います。同時に、描画データを graph.g というファイルに記録 します。従って、graph.g ファイルがあれば、再描画することが 出来ます。以下のプレビューワがあります (1) X Window に描画する replot (2) tektronics 端末に描画する tekplot (1) の replot は前章での X Window 関係の環境変数を参照します。 読み込むファイル名のデフォルトは graph.g なので、$ replot ↓ ↓ (↓ は enter key を表す) で再描画します。 (2) の tekplot は graph.g をテクトロニクス端末に描画します。 Teraterm のTEK window に描画するときに使用します。 tekplot は線幅の指定、カラー、PS フォント、塗りつぶし、に 対応していません。 tekplot を使う場合、以下のように設定してください。 $ export GRAPH_OUT=XnPn $ export GRAPH_FONT=stroke ストロークフォントを使う場合、フォントファイルの読み込みに 装置番号 80 を使いますので、重複しないよう注意して下さい。 tekplot を使う場合は、「X Window には描画せず、 graph.g を作った後、tekplot を起動する」という 使い方になります。nsgraph を使う場合のシェルスクリプト tekns を 参考にして下さい。 5-2. コンバータ 5-2-1. コンバータの種類と名称 graph.g を以下の形式に変換することが出来ます。ただし (3) は メンテされていません。 (1) PostScript 形式 xy2ps (2) svg 形式 xy2svg (3) Windows のクリップボード xy2clip グラフに文字や図形を追加して加工するには、以下の方法があります。 Windows で作業することを仮定します。 (1) xy2svg で作成した svg ファイルを Office, Illustrator で読み込む (2) xy2ps で作成した PostScript ファイルを Illustrator で読み込む (3) xy2clip で読み込み、クリップボードへコピーし、 PowerPoint などに貼り付ける xy2ps, xy2svg は引数無しで起動すると ヘルプを表示します。例を示します。 $ xy2ps graph.g | lpr (カラー PS プリンターに出力) $ xy2ps -p mono graph.g | lpr (白黒 PS プリンターに出力) $ xy2ps -t graph.g > graph.ps (TeX に取り込み可能な PS 形式 カラー) $ xy2ps -t -p mono graph.g > graph.ps (TeX に取り込み可能な PS 形式 白黒) $ xy2svg [-i] [-r] graph.g > graph.svg (svg 形式) xy2ps は XY_STAMP という環境変数を参照します。 [y|Y] のとき用紙の右下隅に日付を入れます。ただし BoundingBox には 関係しません。 xy2ps は -t オプションを付けた時のみ正しく BoundingBox の計算を するので、TeX に取り込む時は必ず -t オプションを付けて下さい。 xy2ps はデフォルトでカラー PS プリンタ用のファイルを作成します。 モノクロ PS プリンターに出力したい場合は -p mono オプション を付けて下さい。 カラーテーブルは次の手順で決定します。 1. graph.g の中にテーブル名が埋めこまれている場合はその指定に従う。 set_color_table() をコールするとテーブル名を graph.g の中に 埋めこみます 2. そうでない場合、環境変数 GRAPH_COLOR を参照する。 カラーテーブルの内容はファイル color-table の中に記述します。 color-table のパスはデフォルトで GRAPH_LIB_PATH を参照します。 COLOR_TABLE_PATH が設定されている場合は COLOR_TABLE_PATH で 指定した方を優先します。 nsgraph が作成するファイルを TeX に取り込む場合は、nsgraph 実行時に $ export NS_STAMP=n に設定して画面左下にファイル名を 表示させないようにして下さい。 xy2svg は -r オプションを付けると vline hline を 多数の短い線で点線を表します。 xy2svg は -i オプションを付けると Illustrator CS6 で 取り込んだときに線の太さが適切となる svg ファイルを作成します。 (3) は ms-windows/xy2clip に納められています。 コンパイルするにはBorland C++Builder ver.1 が必要です。 2021.2 現在、C++Builder ver.1 は実質的に入手不能であり、 Windows 10 で動作しないと思われます。 ver.1 のプロジェクトファイルを最新バージョンの C++Builder で 読み込もうとするとエラーがでるので、xy2clip はメンテ不能状態です。 かつてコンパイルした exe ファイルを使うしかありません。 カラーテーブルを変更するには「load」ボタンを押して、テーブルを 記述したファイルを読み込んで下さい。xy2clip 上で直接テーブルを 変更することも出来ます。塗りつぶし用カラーテーブルは ytc 、 線を書くとき用カラーテーブルは ylc という拡張子です。 詳細は ms-windows/xy2clip/README を読んで下さい。 クリップボードへコピーした後、PowerPoint に貼り付けると、サイズが 極めて大きくなってしまいます。そこで、一旦 Word に貼り込み、 次に「コピー → ペースト」で PowerPoint に貼り込んで下さい。 5-2-2. プリンターの互換性 xy2ps はデフォルトでリコーの Ipsio 8100 (600 dpi) 用のファイルを 作るように設定してあります。600 dpi のプリンターから出力 する場合はこれで良いでしょう。しかし、高解像度のイメージセッタ (例えば 2400 dpi) から出力すると、線幅がかなり細くなってしまうようです。 ですから、xy2ps で作った PS ファイルを高解像度の印刷機から 印刷する場合は、テスト印刷をする必要があります。 細すぎる場合は、xy2ps.c のソースファイル中の _lw[0]= をはじめと する部分を書き換えて下さい。 あるいは、プリンタ名として -P book として book というプリンタ名 を指定してください。book は私が書籍 「世界一わかりやすい電気・電子回路」(TeX で組版しました)を 作成したときに使った設定です。 塗りつぶしのグレーレベルはプリンターが異なると異なった 色合いになる可能性があります。ファイル color-table を各自の 環境に合わせて書き換えて下さい。 プリンターの互換性を考えると、中間色は避け、原色だけで図を作る ようにした方が良いでしょう。 5-2-3. PS プリンタ以外のプリンタにおける印刷 本ライブラリはグラフの印刷用に PostScript 互換プリンタを 持っていることを前提としています。PS プリンタがない場合、 ghostscript で個々のプリンタ用のファイルを作成する方法も ありますが、1 枚だけ印刷する場合は、以下の手順を使ってください。 (1) xy2svg graph.g > graph.svg で svg 形式に変換する (2) ブラウザで表示する svg 形式のファイルを Windows でダブルクリックすると、   ブラウザが起動します。あるいは、ブラウザにドラッグする   あるいは url 欄に file:///C: などと打ち込み、   クリックで目的のフォルダにたどり着きます。 (3) ブラウザの印刷機能を使います 5-3. おまけプログラム prout Unix では各々のプリンター用のファイルを作り、それを lpr します。 しかし、Windows では原則としてファイルをそのままプリンターへ送る 事ができません。コマンドプロンプト窓で type filename > PRN と打てば、 ローカルのプリンターへ出すことは出来ますが、 ネットワークプリンターには出せません。 これを解決するために、Windows からファイルをプリンターへ直接送る ためのプログラムが ms-windows/prout です。ネットワークプリンターに 対しても送る事ができます。 Borland C++Builder ver.1.0 で開発しました。 6. カラーに対する考え方 ------------------------------------------------- 6-1. カラーの概念 本パッケージではカラーは次のような概念構造を持っています。 1. 「線や文字を書くときの色」と「塗りつぶしのときの色」 は別々に指定する。線や文字を書くときの色は set_pen_color で 指定し、塗りつぶしの時の色は stone で指定する。 2. 色を指定するときは色番号を指定する。各色番号に対する rgb 値は別途テーブルで記述する。 3. 同じ色番号でも rgb 値は各デバイス(X Window, LBP-730, Ipsio 8100, MS-Windows etc)毎に異なる。すなわち、 各デバイス毎に固有の変換表を使う。 4. 色番号 → rgb 値 の変換テーブルは複数持つことができ、 テーブル名で区別される。 環境変数 GRAPH_COLOR で使用するテーブル名を指定する。 また、set_color_table をコールしたときはその設定が優先する。 テーブル名が見つからない場合は、テーブル名 default を使用する。 色を指定するときに rgb 値を指定するのではなく、2. のように 色番号(パレット番号)を指定するのは、以下の理由からです。 出力先として、X Window, モノクロプリンター, カラープリンター, MS-Windows などが考えられます。例えば、R=0, G=255, B=255 のとき、 ディスプレイとカラープリンターではかなり異なる色になって しまいます。モノクロプリンターではカラーが表現できません。 rgb 値を指定する方式では、出力先のデバイスを変える度に、rgb 値 を設定し直す必要があります。色番号(パレット番号)を 指定する方式なら、各デバイスにふさわしい色に変換することが出来ます。 1. のように「線や文字を書くときの色」と「塗りつぶしのときの色」 を別々に設定するのは次のような用途があると考えられるからです。 塗りつぶしのときは、X Window ではカラフルな色を使い、 モノクロプリンターでは明るさの異なる灰色で表現する。 線や文字を書くときは、X Window ではカラフルな色を使い、 モノクロプリンターでは全て黒で表現する。灰色の線は見にくい。 6-2. カラーテーブル 線や文字を書くときの色番号は 0 〜 30 まで 31 個用意しています。 塗りつぶしの時の色番号は 0 〜 120 まで 121 色用意しています。 ただし、塗りつぶしの 101 〜 121 はカラーテーブル名とは関係 なく固定の値です。 カラーテーブルは color-table というファイルに記述します。 ファイルのパスはデフォルトで GRAPH_LIB_PATH です。ただし、 環境変数 COLOR_TABLE_PATH が設定されている場合はそちらを 優先します。各ユーザーことが独自のカラーテーブルを持てる ようにしています。 カラーテーブルの記述方法は color-table の冒頭を参照して 下さい。自分の好みに書き換えてご使用下さい。 libxwplot.a が X Window に描画するときはデバイス名 X の テーブルを使います。 xy2ps はデフォルトでデバイス名 ipsio(カラープリンター)の テーブルを使います。-p mono オプションをつけると、 デバイス名 730PS(モノクロプリンター)のテーブルを使います。 xy2svg はデフォルトでデバイス名 X のテーブルを使います。 xy2ps の結果と同じ色にしたい場合は、-d オプションを使って、 デバイス名を指定して下さい。 xy2ps <-----> xy2svg -d ipsio xy2ps -p mono <-----> xy2svg -d 730PS のようにすると、作成される PS ファイルは同じ色になります。 xy2clip では 1 つのカラーテーブルが 1 つのファイルになっています。 「load」ボタンでカラーテーブルを読み込んで下さい。 6-3. カラーテーブルの選ぶ手順 X Window への描画時は set_color_table() をコールしたとき、その指定が優先され、 カラーテーブルの名前が graph.g の中に埋めこまれます。 そうでないとき、環境変数 GRAPH_COLOR の値を参照し、 カラーテーブルの名前を決定します。GRAPH_COLOR に値が 設定されていないとき、カラーテーブル名は "default" と なります。graph.g の中にはどのカラーテーブルを使用する かの情報は書き込まれません。 replot, xy2ps, xy2svg においては graph.g の中にカラーテーブルの 名前が埋めこまれているとき、その指定を優先します。 そうでないとき、GRAPH_COLOR の値を参照します。GRAPH_COLOR が 設定されてないとき "default" というテーブルを使います。 7. xygraph について ------------------------------------------------- 7-1. xygraph とは何か? xygraph は 1982 年頃に京都大学の佐藤享先生によって開発された 直交座標グラフ作成用サブルーチンパッケージです。当初は京都大 学大型計算機センターの汎用機用のライブラリとして開発されたよ うです。1991 年頃までは数値計算は汎用機でするものであり、京大 の汎用機を利用していた人は、ほとんどの人が xygraph を利用してい たと思われます。 非常に古い時代に開発されたものですが、xyax ルーチン以下の オートスケーリングの巧妙さや、xyaxis ルーチンが作成する座標軸 につける数字の位置の美しさは、今でも他のグラフ作成ツールの 追従を許しません。 Unix にも移植され、かつて (1990 年代) は SunOS 4.x 版が 佐藤先生の研究室の web サイトで公開されていました。 本パッケージ中の xygraph は 1994 年頃の Unix 版に対して いくつかの修正を行っています。変更箇所は xygr2/README をお読み下さい。 7-2. ライブラリの使用法 xygraph ライブラリは libxygr.a です。xygraph ライブラリは下位のルーチンとしてカルコンプ ライブラリを呼びます。具体的には plot newpen hsymbl の 3 つです。 従って、libcalcomp.a libxwplot.a libX11.a libm.a も同時に リンクする必要があります。 マニュアルが $(GRAPH_LIB_PATH)/man 以下に入っていますので、 環境変数 MANPATH を設定して下さい。 例 : export MANPATH=/usr/share/man:this-directory/man ( 注意! ) ソースファイルの拡張子 xygraph のサブルーチンをコールするソースファイルは拡張子を .x に し、xy77 でコンパイルして下さい。理由は 7-4. で述べます。 メイクファイルのプロトタイプ prottype.mak も参照して下さい。 ( 注意! ) xygraph は内部でカルコンプライブラリを呼びますので、xygraph の サブルーチンをコールする前に plots を呼ぶことと、最後に plotv を 呼ぶことが必要です。 7-3. xygraph ライブラリに含まれるサブルーチン マニュアルが man に入っています。まずは、 $ man xygraph で目次を見て下さい。全てのファイルを一旦、紙に印刷しておく方 が良いでしょう。但し、一部のファイルは他のファイルを参照している だけなので、それらのファイルについては打ち出す必要はありません。 他のファイルを参照しているファイルは $ egrep '^.so' *.l で見分けられます。京大の大型計算機センターの図書室に手書きの マニュアルがあります。この手書きのマニュアルが今でもいちばん 役に立ちます。 FreeBSD では man コマンドの出力を PS 形式に落とすには $ man -t xygraph > psfile で OK です。gs で一旦確認してからプリンターへ送れば良いでしょう。 man コマンドの出力をテキスト形式に落とすには単に $ man xygraph > textfile とすればよろしい。他の OS の場合 man man, man nroff, man groff, man troff などで調べ られるでしょう。 良く使うサブルーチンを列挙します。 xyax 軸を描く (このルーチンの軸の描き方は絶品!) xyaxis 軸を描く (xyax より詳しい指定が可能) xyline 線を描く xycont 等高線図を描く mltgr2 立体的なグラフを描く dplot 線種 (実線、点線 など) の定義 lenz 文字列の右側の空白を除く長さを求める xygrid 補助的な点線を引く mmscal 座標軸のオートスケーリング 例を示します。 call plots call xyax(xorg,yorg,xlen,ylen,2,xmin,xmax,ymin,ymax) call xyline(xdata,ydata,ndata) call plotv 各サブルーチンの詳細は man xyax, man xyline で見て下さい。 例が sample/xygraph_check.x にありますので、御覧下さい。 lenz はほぼ必ず使うルーチンですので使い方をマスターして下さい。 (注意!) 大型計算機時代の xygraph ユーザーへ オリジナルバージョンでは xyline(x,y,n,'+') と xyline(x,y,n,12) の 2 つの表現を許していました。しかし、これはエンディアンに依存した 実装なので、本バージョンではサポートしていません (インテル系の リトルエンディアン CPU では正常に動作しません) 。 前者は xyline(x,y,n,ichar('+')) と書き換えて下さい。 7-4. xypp について xygraph は引数の補完機能という大変ユニークで便利な機能を備えています。 つまり、サブルーチンを呼ぶ際、引数を省略するとデフォルトの値を指定 したものと解釈します。このため、xygraph のサブルーチンを呼ぶプログラムは 拡張子を .x とし、プリプロセッサ cpp と xypp を通す必要があります。 これを行うのが xy77 です。xygraph をコールするプログラムは f77 の 代わりに xy77 でコンパイルします。xy77 は動作する際に、カレント ディレクトリに .debug というディレクトリを作成し、その中に中間 ファイルを作成します。中間ファイルはデバッガを使用する際に 必要なので、-[gG] オプションを付けてコンパイルした場合は残します。 拡張子 .x のファイルを Fortran ファイルとして編集するには .emacs に以下の行を加えて下さい。 (setq auto-mode-alist (cons (cons "\\.x$" 'fortran-mode) auto-mode-alist)) xypp は京都大学の北野正雄先生が開発された xygraph 用のプリプロセッサ です。xygraph の引数補完機能のみならず、Fortran77 の文法を拡張する 機能も持っています。詳しくは、man xypp でお調べ下さい。 なお、本パッケージに含まれている xypp は 1994 年頃に anonymous ftp で 取得できた xypp に対して若干の修正を行っています。 詳しくは xyp/README をお読み下さい。 <xy77 について> xy77 は f77 の代わりに使用して下さい。.f .F .x .c どんなファイルでも 扱えます。cpp を通す必要のあるファイルは .F として xy77 を通して 下さい。使い方は $ xy77 を御覧下さい。ファイルの冒頭に詳細な説明があります。短い perl スクリプト なので、中を見ればだいたいの処理内容は理解できるでしょう。 xy77 には主に 2 つの使い方があります。 1. makefile から呼び出す prottype.mak に .x ファイルの扱いが書かれています。ここでは xy77 -c -G -v $*.x という使い方をしています。 2. グラフライブラリをデフォルトでリンクする f77 として使う 例 $ xy77 -v [-G] a.x b.F c.f d.o -lxygr -lcalcomp -lxwplot -lX11 -lm をリンクして実行型 ファイルを作ります。 < 注意! > 1994 年頃に anonymous ftp で取得できた xy77 は C 言語で書かれています。 一方、本パッケージの xy77 は perl で書かれており C 言語版とは別物です。オプションの扱いが若干 異なるかも知れませんが、実用上は問題ないでしょう。 8. nsgraph について ------------------------------------------------ 8-1. nsgraph とは? nsgraph は公立はこだて未来大学の高橋信行先生(元 京都大学電気工学科) によって開発されたグラフ描画用インタープリタです。グラフのデータ と軸の形式などを指定するコマンドを組み込んだファイルを用意し、 そのインタープリタに与えてやるとグラフを描きます。データとコマンド を同一ファイルに入れるという発想はユニークであり、大変使いやすい ものです。 本バージョンは 1992 年頃のバージョンに対して薮が 若干のコマンド拡張とバグ修正を行ったものを、高橋先生の許可を頂いて GPL 化したものです。本家の京大電気の北野研究室では 本バージョンとは別に進化した本家バージョンがあったようですが、 1999 年以降は使われていないようです。 また、スプライン補間、エルミート補間、最小 2 乗近似のサブルーチン として、パブリックドメインの数値計算ライブラリである SLATEC を使用しています。 SLATEC はアメリカのロスアラモスにある Air Force Weapons Laboratory Technical Exchange Comittee (直訳すると空軍兵器研究所の技術交換委員会) で開発された数値計算ライブラリです。 nsgraph は内部で xygraph のサブルーチンを呼びます。ゆえに、 nsgraph を作成するには libxygr.a libcalcomp.a libxwplot.a libX11.a libm.a が必要です。 8-2. nsgraph 使用時の環境変数 NS_STAMP [N|y] 以外のとき、用紙の左下にファイル名を入れます。 8-3. 使い方のマニュアル nsg3/sgraph.tex に詳しく載っているので、打ち出してお読み下さい。 9. ファイル構成 ---------------------------------------------------- 各ディレクトリの内容は、そのディレクトリに README が存在する 場合はそれを参照して下さい。README が無い場合は、makefile に かなりの情報を書き込んでいます。 README 本ファイル calcomp/ カルコンプライブラリのソースファイルのうち、fortran で 書かれている部分。 xwplot/ カルコンプライブラリのソースファイルのうち、 X Window への描画に関する部分 conv/ カルコンプライブラリが作成するグラフファイル graph.g を 各種形式に変換するためのコンバータ preview/ カルコンプライブラリが作成するグラフファイル graph.g を X Window, MS-Windows の画面に描画するためのプレビューワ xyp/ xygraph や nsgraph をコンパイルするために必要なプリプロセッサ xypp xygr2/ xygraph のソースファイル man/ xygraph のマニュアル nsg3/ nsgraph のソースファイル sample/ サンプルプログラム ms-windows/ MS-Windows 上で動作する補助ツール doinstall インストール用 csh スクリプト xy77 xygraph nsgraph のソースファイルなど .x および .F の拡張子を 持つファイル (cpp を通す必要あり) をコンパイルするための perl スクリプト。 内部で cpp xypp f77 を呼び出す printer-list プリンター名とそれに対応するフィルタ名のリスト color-table カラーテーブル prottype.mak メイクファイルのプロトタイプ tekns テクトロニクス端末に描画するための nsgraph 10. graph.g のフォーマット ----------------------------------------- libcalcomp.a によって生成される graph.g はアスキーファイルであり I IX IY という、数字の列で表されます。このフォーマットは 岩波書店の書籍 「Fortran77 図形処理プログラミング」のフォーマットに 独自の拡張を加えたものとなっています。従って、5. で説明した プレビューワやコンバータは「図形処理プログラミング」に掲載されて いるプログラムによる出力も扱うことが出来ます。 岩波書店のライブラリが作成する graph.g は先頭に I=0 or 1 がありますが、 libcalcomp.a が作成する graph.g にはありません。5. で説明した コンバータは graph.g が岩波書店のライブラリが作るファイルなのか 薮製作の libcalcomp.a が作るファイルなのかの区別を 先頭部の I=0 の有無で判断します。 岩波書店のライブラリは塗りつぶしを 8 色で指定しますが、libcalcomp.a は 塗りつぶしを 121 色で指定するところが異なります。 IX IY の単位は 1/262 cm です。 機能は次の通りです (calcomp/calcomp.h で define されています) I=0,1 岩波「図形処理プログラミング」のフォーマットで以下のデータを 記述する。すなわち、塗りつぶすデータは8色で指定し、 0 黒 1 白 2 --> 7 数が大きくなるにつれて白くなる I=0 : 通常モード I=1 : 圧縮モード(使用せず) I=2 ペンダウンで現在点より IX,IY へ移動 I=3 ペンアップで現在点より IX,IY へ移動 I=4 画面の消去。IX,IY はダミー I=5  線種の指定。IY=0 , IX が線の種類を表す(未サポート)。 I=5  線幅の指定。IX=0 , IY が線の幅を表す。 I=6  線色の指定。IX がパレット番号を表す。IY はダミー。 各パレットの rgb 値は color-table で定義する。 I=7 塗りつぶしデータの先頭。IX が塗りつぶす形式、IY が塗りつぶす多 角形領域の頂点の数を表す。 IX = 1 周囲を黒で書いて内部は塗りつぶさない(未サポート)。 IX = 2 周囲はペンの色で書き、内部を指定色で塗りつぶす。 IX = 3 周囲と内部を指定色で塗りつぶす。 I=8  塗りつぶしデータの2番目。IX が塗りつぶす色、IY がハッチングの パターンを表す。その後に、線分のデータが続く。 IX : 0 〜 120 の 121 個のパレットがある。各パレットの色は color-table で定義する。カラーマップを変更すると 各パレットの色も変化する。 IY : サポートしていない。 I=9  塗りつぶすデータの最後を表す。IX,IY が塗りつぶしを開始する点の 座標を表す 実際の例を示す。 7 2 4 <----- 塗りつぶし形式は2。頂点は4つ(四角形)。 8 3 0 <----- 色は3。0は使用しない。 3 x1 y1 <----- 多角形頂点の先頭 2 x2 y2 2 x3 y3 2 x4 y4 2 x1 y1 <----- 多角形頂点の終り(始点=終点なので、データは5つある) 9 xx yy <----- xx yy はダミー xycont を呼ぶと、上記の塗りつぶし命令の他に、 等高線は別に 3 xxx xxx 2 xxx xxx 2 xxx xxx などと呼ぶ。 -------- ここからは独自の拡張 ------- I=10 キャラクターデータの先頭 IX IY 左下位置を表す I=11 キャラクターデータの2番目 IX 文字の高さを表す IY 文字の角度を表す (degree * 10) I=12 キャラクターデータの3番目以降 文字のアスキーコードまたは euc コード IX アスキーコード IY 0 IX EUC の上位バイト IY EUC の下位バイト この後に、これらのコードに対応する線分データが続く I=12 は現在使われていない I=20 が使われる I=13 キャラクターデータの最後を表す IX IY ダミー 実際の例を示す 10 100 100 <---- 100 100 より文字を書き始める 11 260 0 <---- 高さは 260 角度は 0 度 12 92 0 <---- 1文字目のアスキーコードは 92 12 82 0 <---- 2文字目のアスキーコードは 82 ......... ......... <---- 1文字目の線分データ ......... ......... ......... <---- 2文字目の線分データ ......... 13 0 0 <---- 文字データの終りを表す I=14 用紙の向き IX 0 : 縦置き 1 : 横置き IY ダミー I=15 ページ区切りを表す (未使用) I=16 X Window に grid を描く IX IY ダミー I=17 MS-Windows に描画時、原点位置を指定する IX 原点の X 位置 IY 原点の Y 位置 I=18 MS-Windows に描画時、ウィンドウの向きとサイズを指定する IX XW_SIZE の factor を 100 倍した値 IY 紙の方向 0 : 縦 1 : 横 I=19 MS-Windows に描画時、ウィンドウのクローズを行う。 IX IY ダミー I=20 I=12 と同じだが、アスキーコードではなく hsymbl 独自の コードを使う。 IX hsymbl における文字番号 (1〜) or 制御記号 (9000〜) 負の値は等幅出力を表す。 IY ダミー I=21 vline hline の始まり IX 始点 X 座標 IY 始点 Y 座標 I=22 vline hline の 2 バイト目 IX 終点 X 座標 IY 終点 Y 座標 I=23 vline hline の 3 バイト目 IX lmask IY 0 I=24 vline hline の終わり IX IY 未使用 実際の例を示す 21 100 100 <---- vline or hline 始点の座標 22 100 300 <---- 終点の座標 23 257 0 <---- 点線のドットパターン ......... ......... <---- 点線を lineto moveto で表したデータ ......... 24 0 0 <---- vline or hline の終わり I=25 PS フォントの始まり IX フォント番号 (calcomp.h で定義) IY 未使用 I=26 PS フォントの 2 バイト目 IX 高さ IY 角度 (degree * 10) I=27 PS フォントの 3 バイト目 IX x 位置 IY y 位置 I=28 PS フォントの コード番号 IX 未使用 IY ascii コード I=29 PS フォントデータの最後 IX 文字列の横幅 IY 未使用 I=30 塗りつぶしデータの先頭。I=7 と同じ。但し I=30 以降の 塗りつぶしは下に描かれている図形をオーバーライトする。 IX が塗りつぶす形式、IY が塗りつぶす多角形領域の頂点の数を表す。 IX = 1 周囲を黒で書いて内部は塗りつぶさない(未サポート)。 IX = 2 周囲はペンの色で書き、内部を指定色で塗りつぶす。 IX = 3 周囲と内部を指定色で塗りつぶす。 I=31  塗りつぶしデータの2番目。I=8 と同じ IX が塗りつぶす色、IY がハッチングの パターンを表す。その後に、線分のデータが続く。 IX : 色番号 IY : サポートしていない。 I=32  塗りつぶすデータの最後を表す。I=9 と同じ IX,IY が塗りつぶしを開始する点の 座標を表す I=33 使用するカラーマップの名前の開始のマーク I=34 使用するカラーマップの名前 IX : アスキー IY : 未使用 I=35 使用するカラーマップの名前の終了マーク I=-999 データの終わりを表す。これ以降は無視する。 -------------------------------- graph.g へのデータの出力箇所 calcomp.F ストロークデータ、塗りつぶし ysymbl.F PS フォントデータの出力 hsymbl3.F キャラクターデータの出力 (I=20 で出力) コード番号は 1〜 , 9000〜9004 負の値 (等幅) キャラクタデータは xy2ps, xy2svg xy2clip が使用 vline hline の情報は xy2ps, xy2svg xy2clip が使用 11. おわりに -------------------------------------------- このパッケージは私が個人的に使っているものを、そのまま公開 したものなので、色々と不十分な点が多かろうと思います。 自分が使用しない部分については、十分にテストしていません。 質問は気軽にお寄せ下さい。また、ダウンロードした人が、 自由に改造してお使い下さい。 最後に以下の人々に感謝の気持ちを捧げて本ファイルを終わります。 1989〜1992 にかけて京大電気の安陪研で私と一緒に グラフライブラリの構築に努力された以下の方々に感謝 致します。 ・ 初めて calcomp 互換ライブラリを作り、Sun-View と lips Printer への出力部を作られた奥村智洋氏 (現 松下電器) ・ xy2ps の最初のバージョンを作られた六車和彦氏 (現 東芝) ・ はじめて X Window への出力をサポートし、xy2eps の最初の バージョンを作られた橋本岳先生 (現 静岡大学) 1991 年という非常に早い時期に安陪研に PostScript プリンターを 導入された橋本岳先生の先見の明に深く感謝致します。 また、1992.4 頃に私が木村研 (後の佐藤研) へ xygraph や calcomp 命令についての質問に行った時に、快く教えて頂き、xy77 の perl 版 を分けて頂いた当時木村研の博士課程の大学院生であった若山俊夫氏 (現 三菱電気) に感謝致します。 そして、xygraph xypp nsgraph という私たちの研究になくては ならないツールを開発され、それを GPL に従うソフトとされた 京都大学の佐藤亨先生、北野正雄先生、そして 公立はこだて未来大学の高橋信行先生 (元 京都大学) には 深甚なる謝意を表します。 私が作製した calcomp 互換ライブラリの設計思想などは岩波書店 から出版されていた「Fortran77 図形処理プログラミング」 (中古でしか購入できないようです) から多大な影響を受けています。 有用な書物を書かれた著者の森正武先生に感謝致します。 有用な数値計算ライブラリをフリーで公開されている SLATEC に 感謝します。 インストール用シェルスクリプト doinstall を作成していた だいた友人の藤島琢哉氏 (ヤマハ) に感謝致します。 X Window で回転した文字を表示する部分は、Aran Richardson さん が作られたライブラリである xvertext 5.0 を使用しています。 ソフトウェアを作成された Aran Richardson さんに感謝致します。 また、このライブラリの存在を教えて頂いた北海道大学工学部 (現 室蘭工業大学) の辻寧英先生に感謝致します。 以上