[Top] [Contents] [Index] [ ? ]

The Plotutils Package

この文書は、GNU plotting utility (GNU libplot 2.0 を含む) の解説文書である。 GNU plotting utility はデータプロットとベクター・グラフィクスを扱うための、 複数のプログラムと関数群からなるパッケージである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1. はじめに

GNU plotting utilities には8つのコマンドライン用のプログラムがある。 グラフを描くための graphplotpic2plottek2plotplotfont と、数値処理を行う splineodedouble である。 GNU plotting utilities は、 これらのプログラムと、 これらのプログラムが内部で利用している関数群のライブラリ libplot をあわせたパッケージである。 libplot は特定の描画デバイスに依存しない、 二次元のベクター・グラフィクスを描くための関数のライブラリで、 X Window システム用のアニメーションを行う機能もある。 C と and C++ の両方のバージョンがある。

これらのプログラムと libplot は、以下の10種類の画像形式を扱うことができる。

X

出力形式に X が指定されているときは、画像データは標準出力には出力されない。 プロットは X Window のディスプレイ上のウィンドウに描かれる。

PNM

PNM はベクター、ビットマップ両方を扱える "portable anymap" とも言える形式である。 これには三種類がある。PBM (白黒画像用の portable bitmap)、 PGM (portable graymap)、PPM (カラー画像用の portable pixmap) である。 画像ファイルはこの中のもっとも適した形式となる。 PNM は例えばフリーの画像表示ソフトの application xv など、 多くのソフトウェアで表示、編集できる。

GIF

plotutil が扱うのは、本物の GIF ではなく、疑似 GIF 形式である。 本物の GIF と違って LZW 圧縮を使わないため、Unisys の LZW 特許に触れていない。 にも関わらず、 疑似 GIF 形式は例えばフリーの画像表示ソフトの application xv など、 多くのソフトウェアで表示、編集できる。

AI

Adobe の Illustrator の画像形式。plotutil の AI 形式は Illustrator のバージョン 5 以降、および他のソフトウェアで表示、編集できる。

PS

idraw で編集できる Postscript である。 この形式のファイルは Postscript プリンタで印刷でき、 また他の文書に取り込んだり、フリーの idraw グラフィクス・エディタで編集できる。idraw を使うには 参照。

Fig

フリーのドロー系ソフト xfig で表示、編集できる形式。xfig を使うには 参照。

PCL 5

ヒューレット・パッカードのプリンタの制御言語の機能強化版である。 この形式のファイルは LaserJet およびその互換のプリンタで印刷できる (ただ、多くのインクジェットプリンタは PCL 5 非対応である)。

HP-GL

ヒューレット・パッカードの画像記述言語である。 デフォルトでは新しい HP-GL/2 形式で出力される。 HP-GL および HP-GL/2 形式のファイルは、文書に取り込んだり、 プロッターに出力できたりする。

Tek

Tektronix 4014 端末の画像形式。 Tektronix 4014 端末は xtermkermit の MS-DOS 版などに実装されている。

Metafile

特定の出力装置に依存することのない、GNU の metafile 画像形式。 plotutil の plot コマンドで、この形式のファイルを上記の他の形式に変換できる。

plotutils のプログラムの中で、もっともよく使われるのは graph だろう。 これは科学技術分野で 2D のデータプロットを行うことを想定したプログラムである。 graph は、 プロットするデータセットを一つまたは複数のデータファイルから読み込み、 一つのプロットを生成する。 上記の画像形式のどれでも、 graph -T Xgraph -T pnmgraph -T gifgraph -T aigraph -T psgraph -T figgraph -T pclgraph -T hpglgraph -T tek、または単に graph として指定できる。 `-T' オプションをつけない場合は、GNU metafile 形式で出力する (生の graph 形式、raw graph format とも言う)。

入力データはテキスト (ascii plain text) でもバイナリでもよい。 また gnuplot の `table' 形式の出力も読み込める。 出力されるプロットでの座標軸やラベルの有無を指定できる。 ラベル、各座標軸の範囲、 プロットのサイズとディスプレイ上での場所をそれぞれ指定できる。 ラベルの文字には下付き/上付き、ギリシャ文字などの記号が使え、 さらにキリル文字 (ロシア語などの) や日本語も使える。 プロットにおいては各データセットごとに、プロットに使う記号、 その記号間を結ぶ線の種類や太さを指定 (したければ) できる。 領域の塗りつぶしもでき、エラーバーの描画に使える。 複数のプロットを同時に一つの画像ファイルとして行うことは、 まったく問題なくできる。 graph を一回実行するだけで、複数のプロットを並べた画像や、 重ねた (inset) 画像を得ることができる。 データセット、座標軸の設定は各プロットでそれぞれ別にできる。

graph -T Xgraph -T tek およびオプションなしの graph では、ほかのプロットソフトウェアにはあまりない機能として、 入力を標準入力からパイプで受け取りながら、 リアルタイムで出力をプロットすることができる。 そのためには graph がプロット範囲を決めるためにデータを最後まで読み込まなくてもいいように、 両方の座標軸の範囲を指定しておく。

plot は一種の「プロット・フィルタ」である。 plot は GNU graphics metafile 形式 (たとえば graph のデフォルト出力形式など) を、対応している他の形式に変換して出力する。 各形式への変換はそれぞれ、 plot -T Xplot -T pnmplot -T gifplot -T aiplot -T psplot -T figplot -T pclplot -T hpglplot -T tekplot で行える。 plot は、graph での描画は一回だけにしたいが複数の形式の画像ファイルがほしい、 という場合に役に立つ。 または、いくつかのシステムにある GNU 版でない graph コマンドのような、 従来からある `plot(5)' の形式のファイルを変換したいときにも使える。 GNU graphics metafile 形式は plot(5) の形式と互換性があるからである。

pic2plot プログラムは pic 言語で表現されている画像ファイルを 対応している他の形式に変換して出力する。 pic 言語はベル研で開発された言語で、 技術文書や解説書などによくあるような長方形と矢印からなる図を記述できる。 各形式への変換はそれぞれ、 pic2plot -T Xpic2plot -T pnmpic2plot -T gifpic2plot -T aipic2plot -T pspic2plot -T figpic2plot -T pclpic2plot -T hpglpic2plot -T tekpic2plot で行える。

tek2plot は Tektronix 形式を対応している他の形式に変換して出力する。 各形式への変換はそれぞれ、 tek2plot -T Xtek2plot -T pnmtek2plot -T giftek2plot -T aitek2plot -T pstek2plot -T figtek2plot -T pcltek2plot -T hpgltek2plot で行える。

plotfontgraphplotpic2plottek2plot で使えるフォントのキャラクタ・マップを出力するユーティリティ・プログラムである。 `-T X'`-T ai'`-T ps'`-T fig' オプションが指定されたときは、35 種類の PostScript の標準フォントが使える。 `-T ai'`-T pcl'`-T hpgl' オプションが指定されたときは、45 種類の PCL 5 の標準フォント (たとえば "LaserJet" フォント) が使える。 `-T pcl'`-T hpgl' では同様に 多数の Hewlett-Packard のベクトル・フォントが使える。 一通りの 22 種類の Hershey ベクトル・フォント (キリル文字フォントや日本語のフォントを含む) も、常に使える。 X Window システムでのディスプレイ描画のときは、 どのプログラムもスケーラブル・フォントである X fonts を使える。

描画を行わない (数学的な演算を行う) プログラムのうち、 spline はスカラー値およびベクトル値を取るデータから スプライン関数による補間曲線を求める。 通常は三次 (cubic) スプラインかテンション付き指数スプラインを用いる。 このコマンドも graph のように、 特定の環境のもとではリアルタイム・フィルタとして使える。 このコマンドは与えられるデータから、 d 次元空間内に指定される任意の点を通るスプライン曲線を求める (自然および周期境界のいずれでも)。 ode コマンドは常微分方程式、あるいは常微分方程式系の各方程式が 要関数形式で書かれている時、それを積分する機能がある。 gnuplot は関数は描画できるが微分方程式はあつかえない。 ode コマンドはそれを補うことができる。 double コマンドは、 バイナリおよびテキスト形式のデータの入出力ストリームを加工し、 変換、スケーリング、データの取捨選択を行うプログラムである。 これは開発途中なので、ここでは解説しない。

libplot ライブラリについてはあとで詳しく解説する。 C および C++ のプログラムに線、多角形、円弧 (真円および楕円)、 二次および三次のベジェ曲線、円と楕円、点、 記号および文字列を描画する機能を提供する。 点と記号と文字列以外には、塗りつぶし機能が実装されている (塗りつぶしの色と同様に線の色も設定できる)。 文字列に使えるフォントは非常にたくさんある。 X Window システム、Illustrator、PostScript、xfig の各ドライバがサポートする 35 種類の PostScript フォント、 Illustrator、PCL 5、HP-GL/2 のドライバがサポートする 45 種類の PCL 5 フォントである。 PCL 5、HP-GL/2 のドライバは Hewlett-Packard のベクトル・フォントもサポートする。 PNM、GIF、Tektronix、metafile を含むすべてのドライバで 22 種類の Hershey ベクトル・フォントのセットが使える。

文字列描画の機能も豊富である。 上付き、下付き文字が使え、 一つのタイプフェイスのなかの複数のフォントが同時に使える。 多くの非アルファベット文字も使える。 米 Naval Surface Weapons Center のAllen V. Hershey が電子化した 1700 の `Hershey glyphs' (これには興味深い記号が多数含まれている) が libplot に組み込まれている。 EUC-JP (日本語の場合 Extended Unix Code) と呼ばれるエンコードの文字列もあつかえる。 これらについては表音文字 (平仮名とカタカナ) に加えて漢字も使える。 漢字は、第一水準の 2965 文字のうちよく使われる 596 文字を含む 603 文字が libplot に組み込まれている。

描画ソフトウェアである idrawxfig は GNU plotting utilities のパッケージには含まれていない。 しかしこれらはフリーソフトウェアなので、 どこからでも入手できる (参照: 関連するプログラム)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. graph コマンド

graph は一回の実行につき、 プロットするデータセットを、 コマンドラインで指定する一つまたは複数のデータファイルから、 または標準入力から読み込み、 一つのプロットを生成する。 生成されるプロットに指示をするためのコマンドライン・オプションが、 多数用意されている。

以下の節に、よく使われるオプションとその例を説明する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 graph の簡単な例

デフォルトでは、graph コマンドは指定されるファイルか、 ファイルが指定されないときは標準入力から、 テキスト形式のデータを読み込む。 データは以下のように、二つの数値の組としてあたえられ、それがデータ点のx、 および y として扱われる。

 
0.0  0.0
1.0  0.2
2.0  0.0
3.0  0.4
4.0  0.2
5.0  0.6

データ点は必ずしも各行に一組である必要はなく、またxy が同じ行になければならない、という訳でもない。 しかし空行はデータセットの区切りとして扱われるので、 一つのデータセットの中には空行があってはならない。

上の例のデータを graph でプロットするには、以下のようにする。

 
graph -T ps ascii_data_file > plot.ps

もしくは以下のようにしても、同じ結果が得られる。

 
graph -T ps < ascii_data_file > plot.ps

この実行例では、EPS (encapsulated Postscript) 形式のファイル plot.ps が生成される。 この形式は、生成したプロットを他の文書に取り込んだり、 ディスプレイに表示したり、プリンタに直接送って印刷したりできる (`--page-size' オプション、または環境変数の PAGESIZE で印刷されるサイズを指定できる。サイズのデフォルトは "letter" で、8.5in x 11in である。 他に "a4" などの ISO または ANSI に定める用紙サイズが指定できる)。

また、以下のようにすると、

 
graph -T fig < ascii_data_file > plot.fig

ファイル plot.fig が生成される。このファイルは xfig で編集できる。さらに、

 
graph -T ai < ascii_data_file > plot.ai

とすると、Adobe Illustrator 形式のファイル plot.ai が生成される。

 
graph -T hpgl < ascii_data_file > plot.plt

上のコマンドでは Hewlett-Packard Graphics Language (HP-GL/2) 形式のファイル plot.plt が生成される。 ここで graph -T pcl とすると PCL 5 形式になる。これは LaserJet などのレーザープリンタで印刷できる。

graph -T X オプションを使うと、X Window システム上でウィンドウがポップアップし、そこにプロットが表示される。 これを行うコマンドは以下のようになる。

 
graph -T X < ascii_data_file

この場合、ファイルはなにも生成されない。ウィンドウが表示されるだけである。 ウィンドウ内で type `q' を入力するか、 単にマウスクリックすると、ウィンドウが消える。

graph -T pnm では PNM ("portable anymap") 形式の、 graph -T gif では疑似 GIF 形式のプロット画像が生成される。 フリーの画像表示ソフトウェアである xv が使える環境なら、 以下の二つのコマンド、

 
graph -T pnm < ascii_data_file | xv -
graph -T gif < ascii_data_file | xv -

でプロットが表示される。

他に graph -T tek を使うと Tektronix 4014 端末をエミュレートするデバイスでプロットを表示できる。 X Window システムの端末エミュレータである xterm がその一つである。 xterm のウィンドウ内で以下のようにすると、

 
graph -T tek < ascii_data_file

xterm は普段は VT100 端末をエミュレートしているが、 xterm のウィンドウ内で 上のコマンドを実行すると、 別のウィンドウ (a `Tektronix window') が ポップアップ してその中にプロットが描画される。 日本語端末エミュレータの kterm でも、それが正しくインストールされていれば、これと同じだろう。 他に、MS-DOS 版の kermit が Tektronix 4014 端末のエミュレート機能を持っている。

graph コマンドの挙動は、実行される環境に依存して変わることがある。 上に述べた PAGESIZE 環境変数は、 graph -T aigraph -T psgraph -T figgraph -T pclgraph -T hpgl に対して有効である。 同様に環境変数 BITMAPSIZEgraph -T Xgraph -T pnmgraph -T gif のときに有効である。 また DISPLAY 環境変数は graph -T X に、 TERM環境変数は graph -T tek のとき有効である。 この他に、graph -T pclgraph -T hpgl に有効な環境変数がいくつかある。詳細については 環境変数 を参照のこと。 以下の点は、どの出力形式に共通である。

デフォルトでは、一つのデータセットの中で連続しているデータ点は、 実線の線分で結ばれ、その結果、多角形または折れ線が描かれる。 これをここでは `ライン' と呼ぶ。 ラインの種類 (`ラインモード') は `-m' で指定できる。

 
graph -T ps -m 2 < ascii_data_file > plot.ps

上の例では `-m 2' でラインモード #2 でプロットするよう指示している。 プロットが白黒で描画される場合 (それがデフォルトである) は、 ラインは 5 種類の線種のうちのどれか一つで描かれる。 ラインモード #1 から #5 はそれぞれ、 実線、点線、一点鎖線、細かい破線、長めの鎖線、である。 #5 以上のラインモードを指定すると、この 5 種類で繰り返し指定されることになる。 `-C' オプションを使うと色を指定できる。この場合、線種は 25 種類である。 ラインモード #1 から #5 は赤、緑、青、ピンク (マゼンタ)、水色 (シアン) である。 これは全部実線である。ラインモード #6 から #10 は同じ 5 色の点線である。 ラインモード #11 から #16 は同じ色の一点鎖線である。 #25 よりも大きな数字のラインモードは、 #25 までを繰り返すことになる。 ラインモード #0 は白黒でもカラーでもなく、 そのモードを指定されたデータを描画しないことを指示する。

ラインに囲まれた多角形を塗りつぶしたい (たとえば網掛けや、ある色で塗りつぶすなど) ときは、 `-q' オプションを使えばよい。たとえば、

 
echo .1 .1 .1 .9 .9 .9 .9 .1 .1 .1 | graph -T ps -C -m 1 -q 0.3 > plot.ps

このようにすると4つの頂点 (0.1,0.1)、(0.1,0.9)、(0.9,0.9)、(0.9,0.1) で囲まれた領域が描かれる。指定されている最初と最後の点が同じ (0.1, 0.1) であることに注意してほしい。 こうすることで、四角形が多角形として閉じられて描画される。 オプションでラインモード #1、カラー描画が指定されているので、 4 つの各辺は赤い線で描かれる。 オプション `-q 0.3' は閉じた多角形の内側を濃さ 30% (の赤) で塗りつぶすことを指定している。濃さに 0 を指定すると白で、 1.0 を指定するとラインと同じ色で塗りつぶされる。 濃さに負の値を指定すると塗りつぶしは行われず、透明が設定される (これがデフォルトである)。

線の太さ (`width') は塗りつぶしの有無に関係なく `-W' オプションで指定できる。 たとえば `-W 0.01' とすると、描画する範囲の大きさに対する割合で 0.01 の太さの線が描かれる。 またプロットの線上でデータ点を示す記号を、以下のようにして指定できる。

 
graph -T ps -S 3 0.1 < ascii_data_file > plot.ps

ここでは `-S' の最初の引数 3 が記号の種類を指定している。 その次の引数 0.1 は記号のプロットされる大きさを「描画範囲 (plotting box)」に対する割合で指定しており、これは省略してもよい。 描画範囲は、プロットが描かれる領域の大きさのことである。 記号は、 #1 が点、 #2 がプラス記号、 #3 がアスタリスク、 #4 が円 (丸)、 #5 がバツ印、 で以下これらの繰り返しである (参照: プロット記号)。 1 から 31 番までの記号はどの出力デバイスでも同じである。 また記号の描画される色は、その記号と一緒に描かれる線と同じになる。

場合によっては、 各データ点を結ぶ線は描きたくないが、 各データ点の記号は表示したいことがあるかもしれない。 その場合は「負のラインモード (negative linemode)」が使える。 ラインモードが負のラインは描画されないが、 そのライン上のデータ点の記号は、 ラインモードの符号を正にした場合の色で描かれる。 たとえば

 
graph -T ps -C -m -3 -S 4 < ascii_data_file > plot.ps

とすると青い円でデータ点が描かれる。各データ点を結ぶ線は描かれない。 `-S' の 2 番目の引数に、記号の大きさを指定することもできる。

graph では、`-a' を使って横軸 (たとえば x 軸) の値を自動的に生成することができる。このとき、 データファイル中で横軸の値を与えてはならない。 データは等間隔であると見なされる。`-a' には、最初のデータ点の横軸の値と、 データの間隔を指定する。 指定のない場合は、それぞれ 1.0 と 0.0 を指定したことと同じになる。例えば次のコマンド、

 
echo 0 1 0 | graph -T ps -a > plot.ps

は以下と全く同じプロットを描画する。

 
echo 0 0 1 1 2 0 | graph -T ps > plot.ps

graph`-I e' オプションを指定することで、エラーバーを描画できる。 この場合データセットでは各データ点につき、2つ (xy) ではなく、 3つ (xyerror) の数値が必要になる。 各データ点に、適切な長さの垂直なエラーバーが描かれる。 `-S' で記号を指定すればエラーバーとともにデータ点上に記号が描かれる。 記号の種類は、一つのデータセットの各点で同じになる。 `-a' オプションも `-I e' と組み合わせて使える。 その場合、データセット中には横軸 (たとえば x 軸) の値を含めてはならない。

デフォルトでは、x 軸と y 軸の範囲、 各軸上のラベル (文字列) の付く目盛りの間隔は自動的に計算されるが、 以下のようにすれば `-x' および `-y' オプションで指定できる。

 
echo 0 0 1 1 2 0 | graph -T ps -x -1 3 -y -1 2 > plot.ps

これにより x 軸は -1 から 3 の範囲に、y は -1 から 2 の範囲に広げられる。 デフォルトでは graph では各軸の目盛りは6カ所であるが、 `-x' または `-y' に3つめの引数を指定すれば、 目盛りの間隔を指定できる。 たとえば、`-y -1 2' ではなく `-y -1 2 1' を指定すると、 y 軸上の -1、0、1、2 のところで目盛りのラベルとして数値が描かれる。 デフォルトでは graph が自動的に -1、-0.5、0、0.5、1、1.5、2 に数値を描くように設定する。 一般的に、3つめの引数が指定されたときは、 その値の整数倍のところに数値が描かれる。

対数プロットをしたいときは、`-l' を指定する。たとえば、

 
echo 1 1 2 3 3 1 | graph -T ps -l x > plot.ps

とすると、x 軸は対数でプロットされる。y 軸は通常のままである。 両軸とも対数にしたいときは `-l x -l y' を指定する。 デフォルトでは対数軸の上下限は 10 のべき乗に合わせられ、 軸上の目盛りも 10 のべき乗とその整数倍の点に描かれる。 10 のべき乗の点では目盛りに数値が描かれる。 描画範囲が5桁以上の範囲になるときは、 10 のべき乗の整数倍の点の目盛りは省かれる。

対数プロットの範囲が狭く、目盛りを増やしたい場合は、 目盛りの間隔をオプションで指定する。たとえば `-l x -x 1 9 2' とすると、 x 軸の描画範囲は 1 から 9 になる。 数値は 2 の整数倍のところ、2、4、6、8 の目盛りに描かれる。

x 軸および y 軸にはそれぞれ、`-X' および `-Y' オプションでラベルを付けることができる。たとえば、

 
echo 1 1 2 3 3 1 | graph -T ps -l x -X "A Logarithmic Axis" > plot.ps

とすると、一つ前の例のプロットの対数軸にラベルを付ける。 デフォルトでは y 軸のラベルは 90° 回転して描かれるが、 これは `--toggle-rotate-y-label' で変更できる。 プロットの題名、として `-L' オプションで以下のようにして、プロットそのもののラベルを指定できる。

 
echo 1 1 2 3 3 1 | graph -T ps -l x -L "A Simple Example" > plot.ps

こうすると、図の上部にタイトルのついた図が生成される。

x 軸および y 軸のラベルの大きさが `-f' オプションで、 図のタイトルの大きさは `--title-font-size' オプションで指定できる。 たとえば、

 
echo 1 1 2 3 3 1 | graph -T ps -X "Abscissa" -f 0.1 > plot.ps

とすると、x 軸のラベルと目盛りの数値が非常に大きく (プロットの描かれる範囲に対する割合で 0.1) 描かれる。

`-X'`-Y'`-L' オプションで指定されるラベルに使われるフォントは `-F' オプションで指定できる。 たとえば `-F Times-Roman' とするとラベルのフォントがデフォルト (`-T pnm'`-T gif'`-T pcl'`-T hpgl'`-T tek' でないときは Helvetica) の代わりに Times-Roman が使われる。 フォント名では大文字、小文字を区別しないので、`-F times-roman' でも同じである。 使えるフォントは、 35 種類の PostScript の標準フォント (graph -T pnmgraph -T gifgraph -T pclgraph -T hpgl and graph -T tek 以外の場合)、 45 種類の PCL 5 フォント (graph -T aigraph -T pclgraph -T hpgl の場合のみ)、 多数の Hewlett-Packard ベクトル・フォント (graph -T pclgraph -T hpgl の場合のみ)、 および 22 種類の Hershey ベクトル・フォントである。 Hershey フォントはロシア語のキリル文字 HersheyCyrillic と、 日本語の HersheyEUC である。 利用できるフォントについての詳細は 利用できるフォント を参照のこと。 plotfont コマンドを使えば、 利用できるフォントのキャラクタ・マップが得られる (参照: plotfont ユーティリティ・プログラム)。

`-X'`-Y'`-L' オプションで描かれるラベルのフォントは、 指定の仕方が複雑に感じられるかもしれない。 上付き、下付き、ルート記号、フォントの切り替えが指定できるが、 これまでに出てきた例には示していない。詳細は 文字列とエスケープ・シーケンス を参照のこと。

ここまでの例はグリッドの線 (目盛りとラベルが下および左に付いた正方形) の種類はデフォルト設定のままであったが、 オプションを使っていくつか種類が設定できる。 `-g 0'`-g 1'`-g 2'`-g 3' の順に装飾が増える。それぞれ、 グリッド省略、 目盛りと数値の付いた一組の軸、 目盛りと数値の付いた正方形、 目盛りと数値の付いた正方形とグリッド、 である。見て分かる通り、デフォルトは `-g 2' である。 `-g 4' も指定できるが、これは他のと違って、 原点を通る二本の軸を描画する。 このオプションはデータ点の x または y の値が正および負の両方にわたっているときに便利である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 プロットの回転、および長方形のプロット

プロットを 90°、半時計回りに回転させるには、graph`--rotation 90' オプションを与えればよい。 `--rotation 180' を指定すると上下逆さまになる。 `--rotation 270' も指定できる。

正方形でない描画領域や、プロットの場所を画面上で指定したいときは、 以下のようにすればよい。

 
graph -T ps -h .3 -w .6 -r .1 -u .1 < ascii_data_file > plot.ps

ここで `-h'`-w' オプションは描画領域の高さと幅を指定している。 `-r'`-u' オプションは描画領域の画像ファイルの中での場所 (左下隅からどれだけ上および右か) を指定している。 それぞれの単位は画像の大きさ (正方形) に対する割合である。 デフォルトでは、描画範囲の大きさは 0.6 で上方移動と右方移動はともに 0.2 である。 したがって、上の例では高さが通常の 1/2 のプロットが生成される。 また通常に比べると、画像は少し下かつ左寄りに描画される。

多くのコマンドライン・オプションでは、サイズは描画領域に対する割合で指定し、 要しやウィンドウのサイズに対してではない。 たとえば `-S 3 .01' ではデータ点に描かれる記号に対して、種類は #3 でフォントサイズは 0.01、 つまり描画領域の縦あるいは横のどちらか短い方の 0.01 倍を指定する。 `-h' または `-w' で描画領域の大きさが変更された場合、 他のオプションで指定されているさまざまなサイズも、それにつれて変更される。 おそらくはこれが正しい挙動と言えよう。

`-h'`-w'`-r'-u`--rotation' と組み合わせて使うことができる。その場合、描画領域はまず位置が決められ、 それから回転する。実際、`--rotation' プロットの置き方を指定するオプションであり、 プロットのデザインを指定するわけではない。

「グラフィクス・ディスプレイ (graphics display)」という抽象概念がある。 graph -T X とした場合、これはコンピュータ・ディスプレイ上の X のウィンドウである。 graph -T pnm および graph -T gif の場合は正方形、 あるいは長方形のビットマップ画像である。 この3つのデバイスの場合、グラフィクス・ディスプレイのサイズは --bitmap-size オプションで、または環境変数 BITMAPSIZE で指定できる。 graph -T tek の場合グラフィクス・ディスプレイは、 Tektronix ディスプレイの中央の正方形の領域である (Tektronix ディスプレイは、その幅が高さの 4/3 倍である)。 graph -T aigraph -T ps の場合、デフォルトでは、 8.5in x 11in (US letter サイズ) の中央の正方形の領域であり、 領域のサイズは、両脇に余白を残して、幅は用紙いっぱいのサイズである。 graph -T fig の場合、デフォルトでは同じ大きさの正方形の領域だが、 xfig ディスプレイの左上隅に置かれる。 graph -T pclgraph -T hpgl の場合、デフォルトでは, デフォルトでは同じ大きさの正方形の領域だが、 その場所と向きは環境変数で指定される。 graph -T aigraph -T psgraph -T figgraph -T pclgraph -T hpgl の場合の用紙サイズは --page-size オプション、 または環境変数 PAGESIZE で指定できる。 たとえば PAGESIZE を "a4" に設定するとグラフィクス・ディスプレイのサイズは A4 サイズ (21cm x 29.7cm) に設定される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 複数のデータセットからなるプロット

複数のデータセットを、まとめて一つのプロットにしたいことは多い。 そのために、各データセットごとに違う線種を使って区別を付けたり、 違う種類の記号でプロットすることができる。

以下に、もう少し複雑な例を挙げる。 たとえば、 実験観測データのファイル、 データの理論値を示す、サンプリング・ポイントが密なデータのファイルがあるとする。 後者のファイルは、それ自身で一つのデータセットである。 これの連続するデータ点を線で結んで理論曲線としてプロットしたい、 しかし前者の観測データは線で結ばず、記号でデータ点を示すだけにしたいとする。 実際には各点のデータ点には記号が描かれる。

この例では、他と同様、データセットをプロットする 7 種類の属性を指定する。 属性はコマンドライン・オプションで以下のようにして指定できる。

  1. color/monochrome
  2. linemode
  3. linewidth
  4. symbol type
  5. symbol size
  6. symbol font name
  7. fill fraction

`Color/monochrome' (どちらか一方を指定する) は、見た通りである。 `-C' オプションで指定できる。指定はトグルである。 `linemode' (たとえばライン・スタイル) はデータ点を結ぶ線分の線種である。 これは `-m' オプションで指定できる。たとえばラインモード #0 はまったくモードがないという意味になる。 `linewidth' は `Symbol type' と`symbol size' は `-S' オプションで指定できる。 これは各データセットのデータ点に描かれる記号を指定する。 `Symbol font name' #32 よりも大きな数値で指定される記号のフォントを指定する。 これはなにか図章的な記号ではなく、文字を指定することになる。 これは `--symbol-font-name' オプションと組み合わせて使える。 特殊な記号などは `-S' のみで指定できる。 最後に、多角形として閉じた図形としてプロットされるデータセットでは、 塗りつぶし で、その多角形内を塗りつぶしたり網掛けしたりできる。 「塗りつぶしの濃さ」が `-q' オプションで指定できる。 濃さが負の場合は塗りつぶしを行わない、つまり透明化するという意味になる。 0 のときは白で、1.0 のときは普通の色で塗りつぶされる。

この 7 種類の属性で、データセットのプロットの仕方が指定できる。 データセットは、ファイルからの読み込まれ方によっても区別される。 たとえば一つのファイルの中のデータがエラーバーのデータかそうでないか、 などである。 もしファイル中のデータをエラーバーのデータとして扱う場合、 ファイル名の前に `-I e' オプションを指定して、それを示さなければならない (`-I' オプションはそれに続くファイルの入力の形式を指定する)。

3つの異なるファイルのデータを、どうやって一緒にプロットするかを以下に示す。

 
graph -T ps -m 0 -S 3 file_1 -C -m 3 file_2 -C -W 0.02 file_3 > output.ps

file_1 のデータセットはラインモード #0 で描かれる、 つまり各データ点は結ばれないが、記号 #3 (アスタリスク) が各データ点に描かれる。 file_2 のデータセットはカラーで、ラインモード #3 で描かれる。 カラーの場合、ラインモード #3 は青い実線である。 コマンドラインでの二つ目の `-C' は、file_3 ではカラーモードをオフにする、という指定になる。 3つめのデータセットはグラフィクス・ディスプレイの縦、 横のサイズのいずれか短い方の 0.02 倍の太さの黒い線でデータ点が結ばれる。

たとえば `-q'`-I' オプションを各ファイルの前に付けたりすれば 上の例はもっと複雑になる。 実際、コマンドラインでは `-x'`-y' で座標軸の範囲を指定したりする。 そういう、各データセットに対してではなく、プロット全体に対するオプションは、 最初に指定されるファイルよりも前に置くべきである。 たとえば出力形式の指定は以下のように、

 
graph -T ps -x 0 1 0.5 -m 0 -S 3 file_1 -C -m 3 file_2 > output.ps

とする。コマンドラインでは、標準入力を表す特殊なファイル名 として `-' が使える。これを使うと、一部はファイルから、他の一部を他のプログラムから graph へのパイプで渡されるデータから、プロットを生成することができる。

一つのファイルに複数のデータセットが入っていてもよい。 その場合、コマンドラインでそのファイルの前に指定されるオプションは、 そのファイル中のデータセットすべてに適用されるが、例外が二つある。 デフォルトではデータセットごとにラインモードが一つずつ後のものになる。 通常は、これが便利なはずである。たとえば以下のようにすると、

 
graph -T ps -m 3 file_1 > output.ps

file_1 の最初のデータセットはラインモード #3 で、二つ目のデータセットは #4 で、のようになる。実際以下のようにしてラインモードの指定を省くと、

 
graph -T ps file_1 file_2 … > output.ps

データセットの入力される順にそのラインモードが #1、 #2、 … に設定される。 もし違うようにしたいときは、`-B' オプションでこれをオフにするか、 トグルさせることができる。

データファイルの中で直接、ラインモードと記号の種類を指定することもできる。 その場合コマンドラインではなく、ファイル中に指定子を使って記述する。 例えば以下の行が、テキスト形式の入力ファイル中にあるとき、

 
#m=-5,S=10

これは、これの後のデータセットのラインモードを #-5 に切り替え、記号の種類を #10 にする。 将来的には、7 種の属性をすべてこの方法で指定できるようにする予定である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 複数のプロット: 一つの画像中に複数のプロットを描画する

複数のプロットを一つのページ、 あるいはグラフィクス・ディスプレイの中に描画する、 つまりプロットを合成することをここでは多重プロットと呼ぶ。 一つには小さなプロットを大きなプロットにはめ込む、 また複数のプロットを並べる、といったことである。

graph は、多数の小さなプロットを任意の数だけ、多重プロットできる。 このとき graph は小さな各プロットを、 それぞれの仮想ディスプレイに描画する。通常のプロットのときは、 仮想ディスプレイと物理的な実際のディスプレイは同じである。 多重プロットのときは仮想ディスプレイはより小さな正方形の領域である。 以下の例でその考え方を示す。

 
graph -T ps data_file_1 --reposition .35 .35 .3 data_file_2

この例では data_file_1 は通常通りに描かれる。`--reposition' オプションで data_file_2 を描く仮想ディスプレイを指定している。 `--reposition' オプションの数値は、 物理的なディスプレイは正方形で、左上隅が (0.0,0.0) で右上隅が (1.0,1.0) として相対的に仮想ディスプレイの場所を指定する。 上の例では仮想ディスプレイのサイズは一辺が 0.3 の正方形で、 左上隅が物理的なディスプレイの (0.35,0.35) に置かれる。 したがって二つ目の小さなプロットが最初に物理的なディスプレイ内に置かれる。

物理的なディスプレイ内の描画領域のサイズと場所が `-w'`-h'`-r'`-u' で指定できるように、 これらのオプションは仮想ディスプレイのサイズと場所を指定するのにも使える。 たとえば、

 
graph -T ps data_file_1 --reposition .35 .35 .3 -w .4 -r .3 data_file_2

とすると、二つ目の小さなプロットが大きく変更された多重プロットが行われる。 そのプロットの横幅は仮想ディスプレイに対する割合で 0.4 しかない。 しかし描画領域は仮想ディスプレイの中央に置かれる。 それは描画領域の左端と仮想ディスプレイの左端の距離が、 仮想ディスプレイの横幅に対する割合で 0.3 だからである。

慣例的に、最初の小さなプロット以外は、各プロットの描画の前に、 各プロットの描画領域の周囲にある余白領域を取り除く (これは白で塗りつぶされている)。 これにより、 小さな各プロットが重なったり多重プロットの結果が醜くなったりするのを避ける。 デフォルトでは余白領域の大きさは、 各小さなプロットの描画領域の各辺の長さの 1.3 倍である。 これは、そのプロットが小さくて、かつ最初に組み込まれる者の場合には適切である。 しかし複数の小さなプロットを並べるような多重プロットをしたい場合には、 適切ではない。そういったときは `--blankout' オプションで調整できる。 たとえば `--blankout 1.0' と指定すると余白領域と描画領域が同じになる。 `--blankout 0.0' とすると余白を取らなくなる。 余白は、それぞれの小さなプロットで独立に指定できる。

多重プロットされるそれぞれの小さなプロットは、それぞれ独立している。 通常のオプション (`-m'`-S'`-x'`-y' など) はそれぞれの小さなプロットに、それぞれ指定できる。 それぞれの小さなプロットに対するオプションは、graph のコマンドラインで、 `--reposition' オプションの直後に指定しなければならない。 それぞれの小さなプロットは一つ、あるいは複数のデータセットをプロットできる。 それぞれの小さなプロットへのデータファイルは、 `--reposition' の直前に指定する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 バイナリおよび他の形式のデータの読み込み

graph の読み込むデータは、デフォルトではテキスト形式である。 しかし3種類のバイナリ形式 (単精度浮動小数点、倍精度浮動小数点、整数) も読み込むことができる。 バイナリ形式で読み込むときは、 そのことをそれぞれ `-I d'`-I f'、and `-I i' オプションで指定する。

バイナリ形式には二つの利点がある。ひとつは、graph の実行が速いことである。 これはテキスト形式のデータをバイナリに変換する必要がなくなるからである。 もうひとつは入力ファイルのサイズが小さくなることである。 もし大量のデータを扱うなら、バイナリ形式の方が 保存する記憶容量、実行時間ともに有利である。

たとえば C 言語のプログラムから以下のようにして単精度実数を出力するとする。

 
#include <stdio.h>
void write_point (float x, float y)
{
  fwrite(&x, sizeof (float), 1, stdout);
  fwrite(&y, sizeof (float), 1, stdout);
}

こうして作られたデータファイルからは、以下のようにして読み込める。

 
graph -T ps -I f < binary_data_file > plot.ps

バイナリ形式の一つのファイルに複数のデータセットが入っていてもプロットできる。 その場合、そのバイナリ形式で表現できる最大の数値が、データセットの区切りになる。 単精度実数の場合は FLT_MAX、倍精度実数の場合は DBL_MAX、 整数の場合は INT_MAX で表される数値がそれになる。 多くの計算機環境では FLT_MAX は約 3.4x10^38、 DBL_MAX は 1.8x10^308、 INT_MAX は 2^32-1 である。

複数のファイルからデータを読み込むとき、各ファイルは異なる形式でもよい。 たとえば、

 
graph -T ps -I f binary_data_file -I a ascii_data_file > plot.ps

とすると binary_data_file からは `f' (単精度実数) で、 ascii_data_file からは `a' (テキスト形式) で読み込む。

現在の所、エラーバーのデータはバイナリ形式では読み込めない。 エラーバーのデータは `-I e' オプションを指定してテキスト形式で graph に入力せねばならない。

graph は、gnuplot が出力する「表形式」のテキストデータも読み込める。 データセットは複数含まれていてよい。

まとめると、読み込めるデータ形式は6種類である。 `a' (普通のテキスト形式)、 `e' (エラーバーのデータを含むテキスト形式)、 `g' (gnuplot が出力する「表形式」のテキストデータ)、 `f' (単精度実数のバイナリ形式)、 `d' (倍精度実数のバイナリ形式)、 `i' (整数のバイナリ形式) である。入力ファイルはこの6つのうちのどれかであればよい。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 graph のコマンドライン・オプション

graph プログラムはコマンドラインで指定されたファイルか標準入力から、 一つ又は複数のデータセットを読み込み、プロットを描画する。 プロット画像の形式またはディスプレイの種類は `-T' オプションで指定する。

デフォルトでは graph はコマンドラインで指定されたファイルから、 テキスト形式のデータを読み込む。データは二つの数値の組で、それぞれデータ点の x および y 座標であると解釈される。 ファイルがコマンドラインでは指定されないか、または `-' というファイル名 が指定されたときは、標準入力からデータが読み込まれる。 出力は、`-T X' オプションが指定された時以外は、標準出力に書き出される。 `-T X' オプションが指定されているときは、プロットは X Window のディスプレイに描画され、画像データは標準出力には出力されない。

プロットがどのように描画されるかを指示するためのコマンドライン・オプションが、 多数用意されているが、 コマンドライン上で、入力ファイルの指定される順番が重要である。 ファイル名よりも前に指定されているオプションだけが、 そのファイルのデータのプロットに適用される。

以下の節ですべてのオプションを解説する。 引数を取るオプションでは、 説明の最初にカッコ書きでその引数の型とデフォルト値を示している。 オプションは5種類に分けられる。

graph の動作は環境変数によっても制御できる。後の節で解説する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6.1 プロット・オプション

以下のオプションのは、プロットの描画全体に対する制御を行う。 指定されるときは、多くの場合コマンドライン上で一回だけであり、 プロットされるファイルよりも前に指定される。 もし多重プロットを行うときは、(`-T' オプションを除いて) 複数回指定されうる。そのときは、2回目またはそれ以降のオプションは `--reposition x y' オプションの直後に置かなければならない。

`-T type'
`--display-type type'

(文字列、デフォルトは "meta") 出力形式を type に設定する。これは、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかの文字列を指定する。それぞれ、 X Window System、portable anymap (PBM/PGM/PPM) 形式、pseudo-GIF 形式、 Adobe Illustrator 形式、idraw で編集できる Postscript 形式、xfig 形式、ヒューレット・パッカードの PCL 5 プリンタ言語 (デフォルトでは HP-GL/2)、Tektronix 形式、特定のデバイスに依存しない GNU graphics metafile 形式である。

`-E x|y'
`--toggle-axis-end x|y'

指定した軸を、通常描かれる場所から、描画領域の反対側に移動する。 たとえば `-E y' を指定すると y 軸がプロットの左側 (これがデフォルト) ではなく、右側に描かれる。 同様に `-E x' とすると x 軸が描画領域の下部ではなく、 上部に描かれる。x 軸を上部に描くと、プロットのタイトルラベルが表示されなくなる (ラベルの場所がなくなるため)。

`-f size'
`--font-size size'

(実数、デフォルトは 0.0525) 座標軸と目盛りのラベルに使う文字列のフォントサイズを size と指定する。 数値は、描画領域の縦または横のサイズの小さい方に対する割合として指定する。

`-F font_name'
`--font-name font_name'

(文字列、デフォルトは "Helvetica"、ただし graph -T pnmgraph -T gifgraph -T pclgraph -T hpglgraph -T tek、 生の graph の場合は "HersheySerif") 座標軸と目盛りのラベル、およびプロットのタイトルがあればそれに使うフォントを font_name に指定する。 プロットのタイトルのフォントは `--title-font-name' オプションによる指定 (後述) を上書きする。 もし指定されたフォントが使えない場合、デフォルトのフォントが使われる。 使えるフォントは、`-T' オプションで何を指定するかによって変わる。 すべてのフォントのリストは 利用できるフォント を参照のこと。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`-g grid_style'
`--grid-style grid_style'

(0…4 の範囲の整数、デフォルトは 2) 引数 grid_style でグリッドの描き方を指定する。 0 から 3 までは、だんだんと装飾が増えて行く。4 では違った描き方になる。

  1. グリッド、目盛り、ラベルを描かない。
  2. 両座標軸と、目盛りとラベルを描く。
  3. 描画領域の周囲の四辺と目盛りとラベルを描く。
  4. 描画領域の周囲の四辺と目盛りとラベルを描く。グリッドも描かれる。
  5. 両座標軸を原点を通るように描き、目盛りとラベルも描く。
`-h height'
`--height-of-plot height'

(実数、デフォルトは 0.6) グラフィクス・ディスプレイ (または、多重プロットの場合は仮想ディスプレイ) の縦のサイズの割合として、描画領域の縦のサイズを指定する。 その値が 1.0 のときは、描画できる最大サイズになる。 目盛りとラベルは描画領域の外側なので、普通は 1.0 よりも小さな値にする。

`-k length'
`--tick-size length'

(実数、デフォルトは .02) 座標軸上の目盛りの長さを length で指定する。その値が 1.0 のときは、 描画領域の縦か横の短い方と同じ長さになる。length に 負の値を指定すると、目盛りはプロットの内側向きではなく、 外側に向けて描かれる。

`-K clip_mode'
`--clip-mode clip_mode'

(整数、デフォルトは 1) クリップ・モードを clip_mode に指定する。 クリップ・モードは、データ点が線で結ばれ、その線が閉じてない場合 (多角形を作って塗りつぶせたりしない場合) に指定する (多角形の塗りつぶしは、クリップの方法の一つだからである)。 3種類のクリップ・モードが、0、1、2 で指定できる。 モード 0 では、二つのデータ点を結ぶ線は、 どちらの点も描画領域の中にある時にだけ結ばれる。 モード 1 では、どちらか一つが描画領域内にあれば線が結ばれる。 モード 2 では、どちらも描画領域の外にある場合でも、線が結ばれる。 しかしいずれの場合でも、結ばれた線のうち描画領域の中にある部分だけが描かれる。

`-l x|y'
`--toggle-log-axis x|y'

指定された座標軸を対数軸にするかどうかを切り替える。 デフォルトでは、どちらも対数軸ではない。

`-L top_label'
`--top-label top_label'

(文字列、デフォルトは空) 指定された文字列 top_label (たとえばプロットのタイトル) をプロットの上部に置く。 文字列にはエスケープ・シーケンスが使える (参照: 文字列とエスケープ・シーケンス)。 `--title-font-size' オプションでフォントのサイズを指定できる。 フォントは通常は、`-F' オプションで指定される目盛りや座標軸のラベルのフォントと同じだが、 `--title-font-name' でこの文字列のフォントを別に指定できる。

`-N x|y'
`--toggle-no-ticks x|y'

指定された座標軸での目盛りの有無を切り替える。 `-g grid_style' での指定 1、2、3、4 による 目盛りとそのラベルの有無を制御できる。

`-r right'
`--right-shift right'

(実数、デフォルトは 0.2) 描画領域を右に移動する。指定する移動量 right はグラフィクス・ディスプレイ (多重プロットのときは仮想ディスプレイ) の横幅に対する割合である。 これによって描画領域の左側にあける余白を制御できる。 この値を 0.5 にするとグラフィクス・ディスプレイの左半分が余白になる。 その余白に、目盛りとラベルが描かれることになる。

`-R x|y'
`--toggle-round-to-next-tick x|y'

指定された座標軸での、プロット範囲の上下限を拡大するかどうかを切り替える。 拡大すると、目盛りについているラベル (の表す数値) が整数倍される。

このオプションは、`-x' および `-y' オプションの両方ともを指定するときに特に便利である。 もしどちらも指定されない場合、「整数倍」にしかならないからである。

`-s'
`--save-screen'

画面を消さない。このオプションを指定すると、graph が描画をはじめるときに、前に描いたプロットを消さないようになる。

このオプションは to graph -T tek と生の graph 形式でのみ有効である。Tektronix 端末とそのエミュレータでは、 一度描いた図形はそのままずっと画面上に残っている。 なので、graph -T tek -s を繰り返し指定することで、 多重プロットを組み上げることができる。

`-t'
`--toggle-transpose-axes'

縦軸と横軸を入れ替えるかどうかを切り替える。各軸に対して指定したオプションは、 それぞれ入れ替わった軸に対して適用される。これはデータが (y, x) の形式で読み込まれ、`-x'`-X' オプションが x 軸ではなく y 軸に対して適用されてしまうような場合に使える。もし `-I e' が指定されていれば、データはエラーバーの値を含めて読み込まれ、 エラーバーは垂直ではなく、水平に描かれる。

`-u up'
`--upward-shift up'

(実数、デフォルトは 0.2) 描画領域を上に移動する。指定する移動量 right はグラフィクス・ディスプレイ (多重プロットのときは仮想ディスプレイ) の縦の高さに対する割合である。 これによって描画領域の下側にあける余白を制御できる。 この値を 0.5 にするとグラフィクス・ディスプレイの下半分が余白になる。 その余白に、目盛りとラベルが描かれることになる。

`-w width'
`--width-of-plot width'

(実数、デフォルトは 0.6) 描画領域の横幅を指定する。指定する横幅の長さは right はグラフィクス・ディスプレイ (多重プロットのときは仮想ディスプレイ) の横幅に対する割合である。 その値が 1.0 のときは、 グラフィクス・ディスプレイの横幅と同じになる。 目盛りとラベルは描画領域の外側なので、普通は 1.0 よりも小さな値にする。

`-x [lower_limit [upper_limit [spacing]]]'
`--x-limits [lower_limit [upper_limit [spacing]]]'

(実数) lower_limitupper_limitx 軸の範囲を、 また指定したときは spacing で軸上でラベルの付く目盛りの間隔を指定する。 3つの引数のうちどれか一つでもない場合、または入力が `-' で与えられた場合 (一つのハイフン)、 これはデータから自動的に計算される。 graph をリアルタイムでプロットするフィルタとして使うときは、 lower_limitupper_limit の両方を指定しなければならない。

デフォルトでは、これらの境界値が与えられたときはそれを優先する。 しかし `-R x' が指定されたときは、境界値にもっとも近い整数値の倍数として、 ラベルの付く目盛りの間隔が決められる。 下限は指定された値よりも下の、上限は上の整数値になる。

`-X x_label'
`--x-label x_label'

(文字列、デフォルトは empty) x のラベルとして文字列 x_label を指定する。 文字列にはエスケープ・シーケンスが使える (参照: 文字列とエスケープ・シーケンス)。 `-F'`-f' で使われるフォントとそのサイズを指定できる。

`-y [lower_limit [upper_limit [spacing]]]'
`--y-limits [lower_limit [upper_limit [spacing]]]'

(実数) x axis の場合 (上述) と同様に、 lower_limitupper_limity 軸の範囲を、 また指定したときは spacing で軸上でラベルの付く目盛りの間隔を指定する。 graph をリアルタイムでプロットするフィルタとして使うときは、 lower_limitupper_limit の両方を指定しなければならない。

デフォルトでは、これらの境界値が与えられたときはそれを優先する。 しかし `-R y' が指定されたときは、境界値にもっとも近い整数値の倍数として、 ラベルの付く目盛りの間隔が決められる。 下限は指定された値よりも下の、上限は上の整数値になる。

`-Y y_label'
`--y-label y_label'

(文字列、デフォルトは empty)

x のラベルとして文字列 x_label を指定する。 文字列にはエスケープ・シーケンスが使える (参照: 文字列とエスケープ・シーケンス)。 文字列は 90° 回転して、座標軸と平行に描画されるが、 `--toggle-rotate-y-label' オプションが指定されているときは回転されない。 昔の X Window システムではラベルの回転がサポートされていないことがある。 そのときにこの `--toggle-rotate-y-label' オプションを使うとよい。 `-F'`-f' で使われるフォントとそのサイズを指定できる。

`--bg-color name'

(文字列、デフォルトは "white") プロットの背景色を name に指定する。これは graph -T Xgraph -T pnmgraph -T gif に対してだけ有効である。 無効な名前が色名に指定されたときは、デフォルトの色が使われる。 使える色名に付いては 色名 を参照のこと。 環境変数 BG_COLOR でも同様に背景色を指定できる。

`-T gif' オプションが使われているときは、環境変数 TRANSPARENT_COLOR に背景色を指定することで、疑似透過 GIF 形式の画像を生成できる。 参照: 環境変数

`--bitmap-size bitmap_size'

(文字列、デフォルトは "570x570") プロットの描かれるグラフィクス・ディスプレイのサイズを、ピクセル単位で bitmap_size に設定する。 これは graph -T Xgraph -T pnmgraph -T gif が指定されているときだけ有効である。それはこれらの出力形式では、 グラフィクス・ディスプレイのサイズがピクセルで表されるからである。 環境変数 BITMAPSIZE でも同様に指定できる。

graph -T X のときのグラフィクス・ディスプレイは X window である。 もし描画領域を正方形ではなく長方形にすると、 描画に使われるフォントは縦と横で違う倍率で拡大縮小されるが、 これには X11R6 が必要である。 このように拡大縮小できないフォントが指定されているときは、 Hershey ベクトル・フォントの "HersheySerif" のような、 デフォルトのスケーラブル・フォントが使われる。

かこのバージョンとの互換性を確保するため、`--bitmap-size' オプションや BITMAPSIZE 環境変数の代わりに、 X のリソースの Xplot.geometry でもウィンドウのサイズが指定できるようになっている。

`--frame-color name'

(文字列、デフォルトは "black") プロットの外枠の色に name を、name がないときは白黒プロットを指定する。 無効な名前が色名に指定されたときは、デフォルトの色が使われる。 使える色名に付いては 色名 を参照のこと。

`--frame-line-width frame_line_width'

(実数、デフォルトは -1.0) プロットの外枠の線の太さを frame_line_width、 グラフィクス・ディスプレイの縦か横の短い方に対する割合として指定する。 負の値を指定すると、libplot グラフィクス・ライブラリで設定しているデフォルト値が使われる。 通常、デフォルト値はディスプレイの 1/850 である。そのため、 `-T X'`-T pnm'-T gif のときは 0 になる。 0 になったときは、そのデバイスで描けるもっとも細い線が使われる。 これはどのデバイスでもそうである。しかし idrawxfig では、太さ 0 の線は描かれない。

graph -T tek では、線の太さはデフォルト値以外は使えない。 graph -T hpgl でも環境変数 HPGL_VERSION に 2 より小さな値をセットしているときは、同様である。

`--max-line-length max_line_length'

(整数、デフォルトは 500) 一つのデータセットから描かれる一本の折れ線を一度に描ける、最大の点数を max_line_length に指定する。 データ点の数がこの数に達したときは、一旦折れ線が描画され、 それから続く点の処理が行われる。この時、特に通知やメッセージなどは行われない。 `-q' オプションで塗りつぶしが指定されているときは、これは行われない。

この指定は、いくつかの出力デバイス (昔の PostScript プリンタや HP-GL プロッタ) では出力バッファの大きさに制限があることによる。 この最大点数は、環境変数 MAX_LINE_LENGTH でも指定できる。 graph -T tek や生の graph 形式では、 各データ点ごとにリアルタイムで描画が行われるので、このオプションは無効である。

`--page-size pagesize'

(文字列、デフォルトは "letter") プロットが描かれる用紙の大きさを指定する。このオプションは graph -T aigraph -T psgraph -T figgraph -T pclgraph -T hpgl で有効である。"letter" で指定される大きさは 8.5in x 11in である。"a0"…"a4" の ISO の用紙サイズおよび "a"…"e" の ANSI のサイズも指定できる ("letter" は "a"、"tabloid" は "b" と同じである)。 "legal"、"ledger"、"b5" も指定できる。用紙サイズは、環境変数 ePAGESIZE でも指定できる。

graph -T aigraph -T ps では、 プロットが描かれるグラフィクス・ディスプレイは、 幅が用紙サイズいっぱい (余白があるが) の正方形であり、これが用紙の中央に置かれる。 graph -T fig ではグラフィクス・ディスプレイの大きさは同じで、xfig の画面の左上隅に置かれる。 graph -T pclgraph -T hpgl ではグラフィクス・ディスプレイの大きさは同じだが置かれる場所は異なる。 最終的にプロットが置かれる場所は、いくつかの環境変数で指定される (参照: 環境変数)。

`--pen-colors colors'

(文字列、デフォルトは "1=red:2=green:3=blue:4=magenta:5=cyan") プロットされる線と記号の色を数字 colors で指定する。 指定の仕方は、デフォルトの例で示される通りである。 無効な色名が指定されたときは、その番号はデフォルトの色に設定される。 使える色名については 色名 を参照のこと。

`--rotation angle'

(整数、デフォルトは 0) グラフィクス・ディスプレイ中のプロットを角度 angle だけ回転する。 指定できる値は 0, 90, 180, 270 である。その数字の角度だけ、 半時計回りに回転する。

このオプションを使うと、用紙の向き (縦または横) を切り替えることができる。 ポストモダニズムの芸術家にとっても便利かもしれない。

`--title-font-name font_name'

(文字列、デフォルトは "Helvetica"、ただし graph -T pnmgraph -T gifgraph -T pclgraph -T hpgl and graph -T tek では "HersheySerif" がデフォルト) プロットのタイトルに使われるフォントを font_name に設定する。 通常はタイトルのフォントは、座標軸や目盛りのラベルと同じであり、`-F' オプションで設定されるが、`--title-font-name' が指定されたときは、 これが優先される。フォント名では大文字と小文字は同一視される。 使えるフォントの種類は、`-T' で何が指定されているかによる。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`--title-font-size size'

(実数、デフォルトは 0.07) `-L' オプションで指定されるプロットのタイトルの文字の大きさを size に指定する。文字の大きさは、描画領域の縦または横の短い方に対する割合で指定する。

`--toggle-rotate-y-label'

`-Y' で指定される y 軸のラベルの描画を縦にするか横にするかを切り替える。 デフォルトではラベルは回転して y 軸 と平行に描かれる。 しかし出力デバイスの種類によっては (X Window ディスプレイなど)、 これはできない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6.2 データセット・オプション

この節では、ファイルから読み込まれてプロットの一部として描かれる、 各データセットに対する指定を行うオプションを解説する。この節のオプションは、 読み込まれ方や描画のされ方を指定しようとするデータセットのファイルよりも、 コマンドライン上で前に指定しなければならない。 入力ファイルが複数のときは、一つのオプションが複数回指定されることもある。

以下の3つのオプションは、ファイルからのデータの読み込まれ方を指定する。

`-I data-format'
`--input-format data-format'

このオプションに続くファイル中の、データの形式を指定する。

`a'

テキスト形式。入力ファイル中には、xy 座標の二つの実数値が表すデータ点が並んで、 データセットとして格納されていると解釈される。 データ点の xy 座標は同じ行に書かれている必要はなく、 また各点が違う行になっている必要もない。 しかし空行 (連続する二つの改行文字がファイル中にあったとき) は、そこがデータセットの終わりで、次の行から別のデータセットであると解釈される。

`e'

エラーバーのデータを含むテキスト形式。`a' 形式と同じだが、 (x,y) という二つの数値の組ではなく、xyerror の3つの数値の組で一つのデータ点が表されている、と解釈される。

`g'

gnuplot が出力する、テキスト形式の「表形式」。

`f'

単精度実数のバイナリ形式。 テキスト形式。入力ファイル中には、xy 座標の二つの単精度浮動小数点実数が表すデータ点が並んで、 データセットとして格納されていると解釈される。 データ点の区切りは一つの FLT_MAX (単精度浮動小数点実数の取りうる最大値) の値を持つ単精度実数で表される。 ほとんどのシステムはこの値は 3.4x10^38 である。

`d'

倍精度実数のバイナリ形式。 テキスト形式。入力ファイル中には、xy 座標の二つの単精度浮動小数点実数が表すデータ点が並んで、 データセットとして格納されていると解釈される。 データ点の区切りは一つの DBL_MAX (倍精度浮動小数点実数の取りうる最大値) の値を持つ倍精度実数で表される。 ほとんどのシステムはこの値は 1.8x10^308 である。

`i'

整数のバイナリ形式。 テキスト形式。入力ファイル中には、xy 座標の二つの整数が表すデータ点が並んで、 データセットとして格納されていると解釈される。 データ点の区切りは一つの INT_MAX (整数の取りうる最大値) の値を持つ整数で表される。 ほとんどのシステムはこの値は 2^31-1 である。

`-a [step_size [lower_limit]]'
`--auto-abscissa [step_size [lower_limit]]'

(実数、デフォルトは 1.0 and 0.0) 横軸 (x 軸) の値を自動生成する。 データの入力形式 (`a', `e', `f', `d', or `i') とは関係なく、このオプションを指定すると、入力ファイル中には横軸 (x 軸) の値は入っておらず、数値はすべて縦軸 (y 軸) の値であると解釈される。 x の値の増分が step_size で、x の値の開始値が lower_limit で指定される。 ファイル中に横軸の値も含まれているものとして読み込むように戻すときは、 `-a 0' を指定すれば自動生成が無効になり、step_sizelower_limit がデフォルト値に戻る。

`-B'
`--toggle-auto-bump'

ラインモード (以下の lower_limit オプションを参照のこと) はデフォルトではデータセットの開始点で一つずつ自動的に増えていくが、 このオプションでそれをするかどうかを切り替えられる。

以下のオプションは、プロットの一部をなす各個別のデータセットを、 どのように描くかを指定する。これらのオプションで6種類の「属性」 (symbol type、symbol font、linemode、line thickness、fill fraction、olor/monochrome) を指定できる。

`-m line_mode'
`--line-mode line_mode'

(整数、デフォルトは 1)

line_mode は、このオプションに続くデータットを描くラインのモード (線種など) を指定する。 慣例的に、ラインモード #0 ではラインが全然描かれず、 データ点の記号だけになる。データセットが白黒で描かれるときは、各 line_mode は以下のようになる。

  1. 実線
  2. 点線
  3. 一点鎖線
  4. 細かい破線
  5. 長い破線

これより大きな数字 (5 以上の line_mode など) では、 上の5つが上の順で繰り返される。白黒の場合はしたがって、 ラインモードは #0 を除いて5種類である。 カラーの場合 (`-C' オプションで指定される) は、#1 から #5 の各ラインモードは以下のように解釈される。

  1. 赤、実線
  2. 緑, 実線
  3. 青, 実線
  4. 赤紫, 実線 (マゼンタ)
  5. 青緑, 実線 (シアン)

ラインモード #6 から #10 では色は上と同じだが、線種が点線になる。 #11 から #15 では一点鎖線に、#16 から #20 では細かい破線に、 #21 から #25 では長い破線になる。 したがってカラーモードでは、#0 を除いて 25 種類のラインモードがあることになる。 負のラインモードを指定するとラインは描かれないが、 データ点に置かれる記号は、そのモード (の符号を取ったモード) の色で描かれる。

`-S [symbol_number [symbol_size]]'
`--symbol [symbol_number [symbol_size]]'

(整数と実数、デフォルトは 0 と 0.03) データ点に記号を描く。symbol_number は記号の種類を、 symbol_size は記号の大きさを指定する。 記号の大きさは描画領域の縦あるいは横の短い方の長さに対する割合で指定する。 カラーモードでは、 記号はそのデータセットでデータ点を結ぶラインと同じ色で描かれる。 `-m' オプションに負の数でラインモードを指定することで、 記号の色を指定し、かつデータ点を線で結ばないように指定できる (上述)。 以下の表に、最初のいくつかの記号を示す (慣習的に記号 #0はまったく記号を描かないことを表す)。

  1. プラス記号 (+)
  2. アスタリスク (*)
  3. バツ印

0 から 31 までの記号は libplot ライブラリに組み込まれている。 参照: プロット記号。32 以上の番号の記号は、symbol フォントを指定していると解釈される。これは `--symbol-font-name' で見ることができる (後述)。

`-W line_width'
`--line-width line_width'

(実数、デフォルトは -1.0) そのデータセット中の連続するデータ点を結ぶラインの太さを、 グラフィクス・ディスプレイの縦又は横の短い方に対する割合で指定する。 負の値を指定すると、libplot ライブラリのデフォルト値が使われる。 デフォルト値はグラフィクス・ディスプレイの 1/850 だが、 `-T X'`-T pnm'-T gif では 0 になる。 慣例的に、太さに 0 を指定するとどの出力デバイスでも、 そのデバイスでもっとも細いラインが描かれるが、 idrawxfig は太さ 0 の線は描かないようになっている。

graph -T tek ではデフォルトの太さ以外の線は描けない。 graph -T hpgl でも、環境変数 HPGL_VERSION に 2 よりも小さな値を指定したときは、デフォルトの太さ以外の線は描けない。

`-q fill_fraction'
`--fill-fraction fill_fraction'

(実数、デフォルトは -1.0) 一つのデータセット中の連続するデータ点がラインで結ばれる設定になっているとき、 ラインが作る多角形の塗りつぶしの濃さを fill_fraction で指定する。 fill_fraction=1.0 にするともっとも濃くなる (ラインを描くのと同じ色の濃さになる)。 fill_fraction=0.0 にすると、多角形の内側は白くなる。 fill_fraction の値を負に設定すると、多角形の内側には透明が設定される。

もし多角形が重なっている場合、「偶奇塗りつぶし則 (even-odd fill rule)」で、どちらの点が内側か、あるいは外側かが決められる。 この規則は Postscript Language Reference Manual に説明がある。

`-q' オプションは graph -T tek では無効である。 また graph -T hpgl では環境変数 HPGL_VERSION が "1" にセットされているときは、機能が制限される。

`-C'
`--toggle-use-color'

そのデータセットの描画がカラーか白黒かを切り替える。 ラインモードに指定されている数値の解釈が、描画がカラーか白黒かで変わる。 上述の `-m' オプションを参照のこと。

`--symbol-font-name symbol_font_name'

(文字列、デフォルトは "ZapfDingbats"、ただし `-T pnm'`-T gif'`-T pcl'`-T hpgl'-T tek では "HersheySerif") 記号を描くフォントを、32 またはそれ以上の数字で symbol_font_name に指定する。 フォント名では大文字と小文字は区別されない。 もし無効なフォントが指定された場合は、デフォルトのフォントが使われる。 使えるフォントは `-T' オプションで何が指定されているかによって変わる。 たとえば `-T pcl'`-T hpgl' では、 デフォルト以外の記号フォントとして、通常は Wingdings フォントが有効になる。 すべてのフォントのリストは 利用できるフォント を参照のこと。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6.3 多重プロットのオプション

以下のオプションは、多重プロット (複数のプロットを一つのウィンドウや用紙にまとめる) に関するものである。

`--reposition x y size'

(実数、デフォルトは 0.0、0.0、1.0) 次のプロットを描く「仮想ディスプレイ」を、一辺の長さが size の正方形にし、左下隅が (x, y) になるように配置する。 座標値は、(0, 0)が物理的な描画範囲の左下隅で、(1, 1) が右上隅になるように正規化して与える。 仮想ディスプレイの中に描かれるプロットの大きさは `-h'`-w' オプションで、プロットの場所は `-u'`-w' オプションで指定できる。 `--reposition' オプションのあとでは、 これらの4つのオプションの数値は物理的なディスプレイに対してではなく、 仮想ディスプレイ中の数値であると解釈される。

`--blankout blankout_fraction'

(実数、デフォルトは 1.3) 多重プロットに追加するプロットを描くとき、 そのプロットを置く場所が空けられていなければならない。 blankout_fraction=1.0 を指定すると、 新たにプロットを置こうとする場所にある画像は消去される。 blankout_fraction=1.3 を指定すると、そのプロットよりも 30% だけ大きな領域で画像が消去される。 プロットを横に並べようとするときは、1.0 がちょうどよい。 graph -T tek では画像の消去は行えない。 graph -T hpgl では環境変数 HPGL_VERSIONHPGL_OPAQUE_MODE がデフォルト値 (それぞれ "2" と "yes") でない値にセットされているときには、 画像の消去は行えない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6.4 生の graph 形式データのオプション

以下のオプションは生の graph 形式に関するものである。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。 この場合 graph は graphics metafile 形式で出力を行うが、これを plot プログラムで他の形式に変換することもできる。 以下のオプションは、コマンドラインでどのファイル名よりも先に指定され、 生成されるプロット (あるいは多重プロット) 全体に作用する。

`-O'
`--portable-output'

GNU metafile 出力を、バイナリ形式 (これがデフォルト) ではなく、ポータブル (人間の読める) 形式で行う。これは環境変数 META_PORTABLE を "yes" に設定することでも行える。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6.5 情報を見るオプション

以下のオプションで、必要な情報を表示させることができる。

`--help'

コマンドライン・オプションのリストを表示させ、そのまま実行を終了する。

`--help-fonts'

利用可能なフォントのリストを表示、そのまま終了する。 出力される内容は、`-T' オプションで指定される出力デバイスによって変わる。 graph -T Xgraph -T aigraph -T psgraph -T fig では、PostScript 標準の 35 種類のフォントが使える。 graph -T aigraph -T pclgraph -T hpgl では 45 種類の PCL 5 標準フォントが使える。 graph -T pclgraph -T hpgl ではヒューレット・パッカードのベクトル・フォントが使える。 これらに加えて、 graph -T pnmgraph -T gifgraph -T tek では 22 種類の Hershey ベクトル・フォントが使える。 原理的に、生の graph 形式ではこれらのフォントのすべてを使える。 すべての形式に生の graph 形式から plot で変換できるからである。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`--list-fonts'

`--help-fonts' と同様だが、 他のプログラムにパイプで渡して処理しやすいように、1カラムのリストで出力する。 `-T' オプションでの出力デバイスの指定が何もないときは、 サポートされているすべてのフォントのリストが表示される。

`--version'

graph とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.7 環境変数

graph の動作を制御するための環境変数がいくつか用意されている。 BITMAPSIZEPAGESIZEBG_COLORMAX_LINE_LENGTH については上述である。これらの環境変数は、コマンドライン・オプションの `--bitmap-size'`--page-size'`--bg-color'`--max-line-length' と同じ働きを持つ。 他の環境変数は、それぞれ特定の出力デバイスに対して有効なものである。

graph -T X では X Window のウィンドウが一つ開かれ、 そこにプロットが描画されるが、このとき DISPLAY 環境変数が確認される。 この環境変数で示されるディスプレイに、ウィンドウが開かれる。

graph -T pnm では Portable Anymap (PBM/PGM/PPM) 形式で出力されるが、環境変数 PNM_PORTABLE が "yes" のとき、 出力は PBM、PGM、PPM の (人間が読める) ポータブル形式で行われる。 そうでない場合はバイナリ形式 (これがデフォルト) で行われる。

graph -T gif では疑似 GIF 形式で出力されるが、 これには二つの環境変数による指定が有効である。

INTERLACE が "yes" のとき、生成される疑似 GIF 形式のファイルはインターレース形式になる。 また、TRANSPARENT_COLOR 環境変数に、 出力されるプロット中で使われている色の名前がセットされているときは、 その色は透明に設定され、それは GIF を扱える多くのソフトウェアで正しく扱われる。 使える色名については 色名 を参照のこと。

graph -T pcl ではヒューレット・パッカードのプリンタまたはプロッタの出力形式、 PCL 5 形式で出力されるが、これを制御する環境変数がいくつかある。 PCL_XOFFSETPCL_YOFFSET 環境変数で、 グラフィクス・ディスプレイを用紙のどこに置くかを設定できる。 設定はセンチメートル、ミリメートル、インチのいずれかで行える。 たとえば、"2cm" や "1.2in" のように指定する。 また PCL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 PCL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。

PCL_ASSIGN_COLORS 環境変数に "yes" をセットすると、 カラーのプリンタその他に出力できる PCL 5 形式の出力が行われる。 これをセットすると色の再現性を正確にするために、内部で出力デバイスに、 各色を描画するための「論理ペン」が任意に設定できるようになる。 "no" にセットされるとあらかじめ設定されている色のペンだけが用いられ、 他の色は明るさの変化 (シェイディング) によって擬似的に描画される。 世の中の PCL 5 デバイスは、カラーより白黒が多いため、デフォルトでは "no" であり、色はシェイディングに置き換えられる。

graph -T hpgl では HP-GL (ヒューレット・パッカード・グラフィクス・ランゲージ) 形式の出力が生成されるが、これにもいくつかの環境変数が用意されている。 もっとも重要なのは HPGL_VERSION で、これには "1"、"1.5"、"2" のいずれかが指定できる ("2" がデフォルト)。 "1" は純正の HP-GL、1.5 は HP7550A グラフィクス・プロッターおよび HP758x、HP7595A、HP7596A ドラフティング・プロッターに出力できる形式 (HP-GL にいくつかの HP-GL/2 拡張を加えたもの)、 "2" は新しい HP-GL/2 でそれぞれ描画するよう指示する。 もしバージョンが "1" または "1.5" にセットされていると、 使えるフォントはベクトル・フォントのみで、 ラインはすべてデフォルトの太さで描かれる (`-W' は無効になる)。 さらにバージョンが "1" のときは、任意の多角形をラインの色で塗りつぶす機能が使えなくなる (`-q' オプションは縦軸に置かれた円や長方形を塗りつぶすのに使われる)。

graph -T hpgl のグラフィクス・ディスプレイの用紙上の位置は、 環境変数 HPGL_XOFFSET および HPGL_YOFFSET で、センチメートル、ミリメートル、インチ単位で指定できる。 たとえば、"2cm" や "1.2in" のように指定する。

また HPGL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 HPGL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。 "180" と "270" は HPGL_VERSION が "2" のとき (デフォルトがそうである) にだけ有効である。

不透明化機能による、白い線の描画や塗りつぶしは、HPGL_VERSION が "2" (デフォルトの状態) で環境変数 HPGL_OPAQUE_MODE が "yes" のときに可能になる。 もしこれが "no" にセットされているときは不透明化による塗りつぶしは行われず、 通常は #0 のペンで描かれる白色の線も描かれない。 この機能は昔の HP-GL/2 デバイスに適している。 たとえば HP-GL/2 ペン・プロッターは不透明化や #0 のペンによる、 白色の線には対応していない。また古い HP-GL/2 デバイスの中には不透明化機能が不十分なものもある。

デフォルトでは、graph -T hpgl では使えるペンはあらかじめ決められているものだけである。 描画時点でどのペンを使うかは、HPGL_PENS 環境変数で指定される。 HPGL_VERSION が "1" のときは HPGL_PENS のデフォルトのペンは "1=black" である。HPGL_VERSION が "1.5" または "2"のときは、 HPGL_PENS のデフォルト値は "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" である。 指定の仕方は、見ての通りである。HPGL_PENS を指定することで #1…#31 のどのペンにも色を割り当てることができる。 指定できる色名については 色名 を参照のこと。 ペン #1 はいつでも使える。その色は黒である必要はない。 #1…#31 の他のペンはあってもなくてもよい。

HPGL_VERSION が "2" のときは graph -T hpgl では HPGL_ASSIGN_COLORS も有効である。もしこれが "yes" にセットされていれば、graph -T hpgl で使えるペンの色は HPGL_PENS による制約を受けない。#1…#31 番の「論理ペン」に必要に応じて色が割り当てられる。 これをサポートする HP-GL/2 は LaserJet プリンタや DesignJet だが、 あまり多くはないため、デフォルトでは "no" である。

graph -T tek では Tektronix 端末のための出力が行われるが、 環境変数 TERM が有効である。もし TERM が "xterm"、 "xterms"、"kterm" のいずれかであれば、graph がその時実行されている環境は X Window システム上の VT100 端末エミュレータの xterm であると判断される。 このとき、graph -T tek では描画が行われる前に、xterm に付属していて通常は隠れている Tektronix のウィンドウを、 前面にポップアップさせるエスケープ・シーケンスが送られる。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 その際、Tektronix のウィンドウは画面に残ったままになる。

TERM が "kermit"、"ansi.sys"、ansissys"、"ansi.sysk"、"ansisysk" のいずれかの時は、MS-DOS 版の kermit 上の VT100 エミュレータ上であるとみなされる。 このとき、graph -T tek では描画が行われる前に、VT100 エミュレータから Tektronix のウィンドウに切り替えるエスケープ・シーケンスが送られる。 また出力に使われる Tektronix 制御コードは、kermit 特有のものになる。 このとき、使える色数には制限がある (ansi.sys の 16 色はサポートされる)。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 キーボードで `ALT minus' をタイプすると、 VT100 モードと Tektronix モードの切り替えが手動でできる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. plot コマンド


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 plot コマンドの使い方

GNU プロット・フィルター plot は、GNU graphics metafile 形式のファイルを表示したり、他の形式に変換したりするコマンドである。 入力はコマンドラインでファイル名を指定するか、標準入力から与える。 出力形式は `-T' で指定する。指定できる形式は、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" で、"meta" がデフォルトである。

metafile 形式は、特定の出力デバイスに依存しない、 ベクター形式の画像フォーマットである。 デフォルトではバイナリ形式ではなく、人間に読める形式で出力される (参照: Metafile 形式)。 graphpic2plottek2plotplotfont の各コマンドは `-T' オプションで出力形式が指定されないときは metafile 形式で出力する。libplot ライブラリでも metafile 形式の出力が生成できる。この形式では複数ページの画像が記述できるが、 graph コマンドで生成できるのは単ページの画像だけである。

plot は metafile 形式そのものと同様に、 ベクトル形式の画像ファイルを保存しておいたり、 様々なソフトウェアで表示、編集したりするのに便利である。 以下にその例を示す。

テキストファイル中のデータを、xy を入れ替えてプロットするには、以下のように graph コマンドを使えばよい。

 
graph < ascii_data_file > test.meta

生成されるファイル `test.meta' は単ページの metafile 形式の画像である。 同様に、一つの画像だけからなるプロットを metafile 形式で作るには、 以下のようにする。

 
echo 0 0 1 1 2 0 | spline | graph > test.meta

生成したプロットを X Window 上に表示するには、以下のようにする。

 
plot -T X test.meta

または

 
plot -T X < test.meta

以下のようにすれば、 生成したプロットを PostScript プリンタで印刷できることがある。

 
plot -T ps < test.meta | lpr

フリーのドロー・ソフトウェア idraw でこれを編集するには、以下のようにする。

 
plot -T ps < test.meta > test.ps
idraw test.ps

"portable anymap" 形式 (PBM、PGM、PPM 形式など) を生成するには、 以下のようにする。

 
plot -T pnm < test.meta > test.pnm

疑似 GIF 形式を生成するには、以下のようにする。

 
plot -T gif < test.meta > test.gif

Similarly, to produce a version of the plot that can be edited with Adobe Illustrator, you would do

 
plot -T ai < test.meta > test.ai

ドロー・ソフトウェアの xfig で編集できる形式でプロットを生成するには、以下のようにする。

 
plot -T fig < test.meta > test.fig
xfig test.fig

plot -T pclplot -T hpglplot -T tek で、その他の形式でも生成できる。

plot の動作の一部は、環境変数によって制御できる。 特に plot -T aiplot -T psplot -T figplot -T pclplot -T hpgl では環境変数 PAGESIZE が有効である。また plot -T Xplot -T pnmplot -T gif では BITMAPSIZE が有効である。 plot -T X では DISPLAYplot -T tek では TERM の各環境変数が有効である。 plot -T pclplot -T hpgl で有効ないくつかの環境変数がある。 plot が参照する環境変数のリストと解説は、 環境変数 を参照のこと。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 plot のコマンドライン・オプション

GNU プロット・フィルター plot は、GNU graphics metafile 形式のファイルを表示したり、他の形式に変換したりするコマンドである。 出力形式は `-T' で指定する。GNU metafile 形式はGNU graphpic2plottek2plotplotfont の各コマンドや、GNU libplot ライブラリを使った他のアプリケーションで生成できる。 GNU metafile 形式の技術的な詳細に付いては Metafile 形式 を参照のこと。

入力ファイルの名前をコマンドライン上で指定できる。 その順番やコマンドライン・オプションの順番は、意味を持たない。 ファイル名が何も指定されないか、`-' というファイル名が指定されたときは、標準入力から読み込まれる。 出力は、`-T X' が指定されない限りは標準出力に行われる。 `-T X' が指定されたときは X Windows システムのウィンドウにプロットが描画され、標準出力にはなにも出力されない。

以下に、指定できるコマンドライン・オプションのリストを載せる。 コマンドライン・オプションは4種類に分けられる。

  1. 描画パラメータを指定するオプション。
  2. 生の plot 出力、たとえば `-T' オプションでの出力形式の指定が何もされない場合、にだけ関わるオプション。
  3. 入力される metafile 形式を指定する (後方互換性を維持するためだけに用意されている)。
  4. 情報を表示するためのオプション (たとえば `--help')。

引数を取るオプションを以下に示す。 カッコ内に引数の型とデフォルト値を示す。

以下のオプションは、描画パラメータを指定する。

`-T type'
`--display-type type'

(文字列、デフォルトは "meta") ディスプレイの種類、あるいは出力形式を type で指定する。 指摘できる文字列は X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかである。それぞれ、X Window しすてむ、portable anymap (PBM/PGM/PPM) 形式、疑似 GIF 形式、Adobe Illustrator 形式、idraw で編集できる PostScript 形式、xfig 形式、 ヒューレット・パッカードの印刷言語である PCL 5 形式、 ヒューレット・パッカード・グラフィクス言語 (デフォルトでは HP-GL/2)、 Tektronix 形式、デバイス非依存の GNU graphics metafile 形式である。

`-p n'
`--page-number n'

(正の整数) 変換される metafile、または複数の metafile データの中から、 n ページ目だけを表示する。

metafile 形式では複数のページを保持でき、先頭ページのページ番号は 1 である。 また各ページには複数の「フレーム」を置くことができる。 plot -T X または plot -T tek ではプロットはリアルタイムで行われ、各フレームを描くごとに、 前に描かれたフレームは消去される。 plot -T pnmplot -T gifplot -T aiplot -T psplot -T figplot -T pclplot -T hpgl ではプロットはリアルタイムでは行われず、複数のフレームが置かれたページでは、 そのページの最後のフレームだけが描画される。

`-p' オプションが指定されない場合、 デフォルトではすべてのページが描画される。 たとえば plot -T X では各ページをそれぞれ別のウィンドウに描画する。 もし `-T pnm'`-T gif'`-T ai'`-T fig' オプションのいずれかが指定されているときは、 最初のページだけを出力するのがデフォルトである。PNM 形式、疑似 GIF 形式、AI 形式、Fig 形式は、単ページしかサポートしていないからである。

GNU plotting utilities が生成するほとんどの出力 (たとえば生の graph の出力) は、二つのフレームを持つ単ページのプロットである。 1つ目のフレームはディスプレイないの描画消去するためのもので、 二つ目のフレームに実際の描画内容が含まれている。

`-s'
`--merge-pages'

各ページのフレームを一つにまとめ、またすべてのページを一つにまとめる。

これは、別々に作られた単ページのプロットを一つにまとめるときに便利である。 たとえば、graph で作られた複数のファイルなどである。 多重プロットの別のやり方であるとも言える (参照: 複数のプロット: 一つの画像中に複数のプロットを描画する)。

`--bitmap-size bitmap_size'

(文字列、デフォルトは "570x570") プロットが描かれるグラフィクス・ディスプレイのサイズを、 ピクセル単位で bitmap_size に設定する。 このオプションは plot -T Xplot -T pnmplot -T gif のときに有効である。これらの出力形式では、 グラフィクス・ディスプレイのサイズがピクセル単位で表現されているからである。 環境変数 BITMAPSIZE でも同様に指定できる。

後方互換性のために、X resource の Xplot.geometry を設定することで、`--bitmap-size'BITMAPSIZE の代わりにディスプレイのサイズを設定できる。

`--max-line-length max_line_length'

(整数、デフォルトは 500) 一つのデータセットから描かれる一本の折れ線を一度に描ける、最大の点数を max_line_length に指定する。 データ点の数がこの数に達したときは、一旦折れ線が描画され、 それから続く点の処理が行われる。この時、特に通知やメッセージなどは行われない。 塗りつぶしが指定されているときは、これは行われない。

この指定は、いくつかの出力デバイス (昔の PostScript プリンタや HP-GL プロッタ) では出力バッファの大きさに制限があることによる。 この最大点数は、環境変数 MAX_LINE_LENGTH でも指定できる。 plot -T tek や生の plot 出力では、 各データ点ごとにリアルタイムで描画が行われるので、このオプションは無効である。

`--page-size pagesize'

(文字列、デフォルトは "letter") プロットが描かれる用紙の大きさを指定する。このオプションは plot -T aiplot -T psplot -T figplot -T pclplot -T hpgl で有効である。"letter" で指定される大きさは 8.5in x 11in である。"a0"…"a4" の ISO の用紙サイズおよび "a"…"e" の ANSI のサイズも指定できる ("letter" は "a"、"tabloid" は "b" と同じである)。 "legal"、"ledger"、b5" も指定できる。用紙サイズは、環境変数 ePAGESIZE でも指定できる。

plot -T aiplot -T ps では、 プロットが描かれるグラフィクス・ディスプレイは、 幅が用紙サイズいっぱい (余白があるが) の正方形であり、これが用紙の中央に置かれる。 plot -T fig ではグラフィクス・ディスプレイの大きさは同じで、xfig の画面の左上隅に置かれる。 plot -T pclplot -T hpgl ではグラフィクス・ディスプレイの大きさは同じだが置かれる場所は異なる。 最終的にプロットが置かれる場所は、いくつかの環境変数で指定される (参照: 環境変数)。

以下に示すオプションで、描画パラメータの初期値を設定できる。 これらはすべて metafile 形式のデータに保持されている値を上書きする。 実際にはこれらのオプションは、古い、GNU が実装する前の `plot(5)' 形式の metafile 形式で、 これらのパラメータを持っていないようなファイルをプロットするときに便利である。

`--bg-color name'

(文字列、デフォルトは "white") プロットの背景色を name に設定する。このオプションは plot -T Xplot -T pnmplot -T gif でだけ有効である。無効な色名が指定されたときは、デフォルトの色が使われる。 使える色名については 色名 を参照のこと。環境変数 BG_COLOR でも同様に指定できる。

`-T gif' オプションが指定されているときは、環境変数 TRANSPARENT_COLOR に背景色を設定することで、その色が透明化される。 参照: 環境変数

`-f font_size'
`--font-size font_size'

(実数, initial value device-dependent) 描画される文字列のフォントサイズの初期値を font_size で、 グラフィクス・ディスプレイのサイズに対する割合として指定する。

`-F font_name'
`--font-name font_name'

(文字列、デフォルトは "ZapfDingbats"、ただし `-T pnm'`-T gif'`-T pcl'`-T hpgl'-T tek では "HersheySerif") 文字列 (ラベルなど) で使われるフォントの初期値を font_name に指定する。 フォント名では大文字と小文字は区別されない。 使えないフォントが指定されたときには、デフォルトのフォントが使われる。 どのフォントが使えるかは、`-T' オプションで何が指定されているかによって変わる。 使えるフォントのリストについては 利用できるフォント を参照のこと。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`-W line_width'
`--line-width line_width'

(実数、デフォルトは -1.0) 描画される線の太さを、 グラフィクス・ディスプレイの縦あるいは横のいずれか短い方に対する割合として、 line_width で指定する。負の値を指定すると libplot でのデフォルト値が使われる。 デフォルト値はグラフィクス・ディスプレイの 1/850 だが、 `-T X'`-T pnm'-T gif では 0 になる。 慣例的に、太さに 0 を指定するとどの出力デバイスでも、 そのデバイスでもっとも細いラインが描かれるが、 idrawxfig は太さ 0 の線は描かないようになっている。

plot -T tek ではデフォルトの太さ以外の線は描けない。 plot -T hpgl でも、環境変数 HPGL_VERSION に 2 よりも小さな値を指定したときは、デフォルトの太さ以外の線は描けない。

`--pen-color name'

(文字列、デフォルトは "black") ペンの色を name に設定する。無効な名前が指定されたときは、 デフォルトの色が使われる。使える色名についての詳細は、色名 を参照のこと。

以下のオプションは生の plot 出力にだけ関するものである。 たとえば `-T' でなにも出力形式が指定されなかったときなどである。 この場合 plot は metafile 形式で出力するが、 別途また plot を起動して他の形式に変換することができる。

`-O'
`--portable-output'

GNU metafile 出力を、バイナリ形式 (これがデフォルト) ではなく、ポータブル (人間の読める) 形式で行う。これは環境変数 META_PORTABLE を "yes" に設定することでも行える。

plot は、入力されている metafile 形式の種類を自動的に判定する。 これには2種類あり、一つはバイナリ形式 (これがデフォルト)、もう一つがポータブル (人間の読める) 形式である。 バイナリ形式はプラットフォーム依存である。 参照: Metafile 形式

古いプロットプログラムと互換性を持たせるために、 古い、GNU が実装する前の `plot(5)' 形式の入力もサポートしている。 これは通常バイナリ形式で、matafile 中の整数はそれぞれ、2 バイトで表現されている。そのバイトの順序はプラットフォーム依存である。 入力が GNU metafile 形式ではなく plot(5) 形式であることを、 `-h' オプション ("high byte first") または `-l' オプション ("low byte first") のうちどちらか適切な方を与えることで指定できる。 GNU でないシステムでも、plot(5) 形式を拡張して作られたテキスト形式 (人間が読める形式) をサポートしていることがある。 これは `-A' オプションで、その形式の入力であることを指定できる。 この拡張形式では関係ないが、plot(5) 形式では複数ページはサポートされていない。

`-h'
`--high-byte-first-input'

入力が `plot(5)' の metafile 形式であると見なすことを指定し、 整数の表現では "high byte first" (ビッグエンディアン) であるとする。

`-l'
`--low-byte-first-input'

入力が `plot(5)' の metafile 形式であると見なすことを指定し、 整数の表現では "low byte first" (リトルエンディアン) であるとする。

`-A'
`--ascii-input'

入力が、`plot(5)' metafile 形式拡張であるテキスト形式であることを指定する。

以下のオプションは、各種情報を表示させるために使える。

`--help'

コマンドライン・オプションのリストを表示、そのまま終了する。

`--help-fonts'

利用可能なフォントのリストを表示、そのまま終了する。 出力される内容は、`-T' オプションで指定される出力デバイスによって変わる。 plot -T Xplot -T aiplot -T psplot -T fig では、PostScript 標準の 35 種類のフォントが使える。 plot -T aiplot -T pclplot -T hpgl では 45 種類の PCL 5 標準フォントが使える。 plot -T pclplot -T hpgl ではヒューレット・パッカードのベクトル・フォントが使える。 これらに加えて、 plot -T pnmplot -T gifplot -T tek では 22 種類の Hershey ベクトル・フォントが使える。 原理的に、生の plot 出力ではこれらのフォントのすべてを使える。 すべての形式に生の plot 出力から plot で変換できるからである。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`--list-fonts'

`--help-fonts' と同様だが、 他のプログラムにパイプで渡して処理しやすいように、1カラムのリストで出力する。 `-T' オプションでの出力デバイスの指定が何もないときは、 サポートされているすべてのフォントのリストが表示される。

`--version'

plot とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 環境変数

plot の動作を制御するための環境変数がいくつか用意されている。 BITMAPSIZEPAGESIZEBG_COLORMAX_LINE_LENGTH については上述である。これらの環境変数は、コマンドライン・オプションの `--bitmap-size'`--page-size'`--bg-color'`--max-line-length' と同じ働きを持つ。 他の環境変数は、それぞれ特定の出力デバイスに対して有効なものである。

plot -T X では X Window のウィンドウが一つ開かれ、 そこにプロットが描画されるが、このとき DISPLAY 環境変数が確認される。 この環境変数で示されるディスプレイに、ウィンドウが開かれる。

plot -T pnm では Portable Anymap (PBM/PGM/PPM) 形式で出力されるが、環境変数 PNM_PORTABLE が "yes" のとき、 出力は PBM、PGM、PPM の (人間が読める) ポータブル形式で行われる。 そうでない場合はバイナリ形式 (これがデフォルト) で行われる。

plot -T gif では疑似 GIF 形式で出力されるが、 これには二つの環境変数による指定が有効である。 INTERLACE が "yes" のとき、生成される疑似 GIF 形式のファイルはインターレース形式になる。 また、TRANSPARENT_COLOR 環境変数に、 出力されるプロット中で使われている色の名前がセットされているときは、 その色は透明に設定され、それは GIF を扱える多くのソフトウェアで正しく扱われる。 使える色名については 色名 を参照のこと。

plot -T pcl ではヒューレット・パッカードのプリンタまたはプロッタの出力形式、 PCL 5 形式で出力されるが、これを制御する環境変数がいくつかある。 PCL_XOFFSETPCL_YOFFSET 環境変数で、 グラフィクス・ディスプレイを用紙のどこに置くかを設定できる。 設定はセンチメートル、ミリメートル、インチのいずれかで行える。 たとえば、"2cm" や "1.2in" のように指定する。 また PCL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 PCL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。

PCL_ASSIGN_COLORS 環境変数に "yes" をセットすると、 カラーのプリンタその他に出力できる PCL 5 形式の出力が行われる。 これをセットすると色の再現性を正確にするために、内部で出力デバイスに、 各色を描画するための「論理ペン」が任意に設定できるようになる。 "no" にセットされるとあらかじめ設定されている色のペンだけが用いられ、 他の色は明るさの変化 (シェイディング) によって擬似的に描画される。 世の中の PCL 5 デバイスは、カラーより白黒が多いため、デフォルトでは "no" であり、色はシェイディングに置き換えられる。

plot -T hpgl では HP-GL (ヒューレット・パッカード・グラフィクス・ランゲージ) 形式の出力が生成されるが、これにもいくつかの環境変数が用意されている。 もっとも重要なのは HPGL_VERSION で、これには "1"、"1.5"、"2" のいずれかが指定できる ("2" がデフォルト)。 "1" は純正の HP-GL、1.5 は HP7550A グラフィクス・プロッターおよび HP758x、HP7595A、HP7596A ドラフティング・プロッターに出力できる形式 (HP-GL にいくつかの HP-GL/2 拡張を加えたもの)、 "2" は新しい HP-GL/2 でそれぞれ描画するよう指示する。 もしバージョンが "1" または "1.5" にセットされていると、 使えるフォントはベクトル・フォントのみで、 ラインはすべてデフォルトの太さで描かれる (`-W' は無効になる)。 さらにバージョンが "1" のときは、任意の多角形をラインの色で塗りつぶす機能が使えなくなる (しかしオプションは縦軸に置かれた円や長方形を塗りつぶされる)。

plot -T hpgl のグラフィクス・ディスプレイの用紙上の位置は、 環境変数 HPGL_XOFFSET および HPGL_YOFFSET で、センチメートル、ミリメートル、インチ単位で指定できる。 たとえば、"2cm" や "1.2in" のように指定する。 また HPGL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 HPGL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。 "180" と "270" は HPGL_VERSION が "2" のとき (デフォルトがそうである) にだけ有効である。

不透明化機能による、白い線の描画や塗りつぶしは、HPGL_VERSION が "2" (デフォルトの状態) で環境変数 HPGL_OPAQUE_MODE が "yes" のときに可能になる。 もしこれが "no" にセットされているときは不透明化による塗りつぶしは行われず、 通常は #0 のペンで描かれる白色の線も描かれない。 この機能は昔の HP-GL/2 デバイスに適している。 たとえば HP-GL/2 ペン・プロッターは不透明化や #0 のペンによる、 白色の線には対応していない。また古い HP-GL/2 デバイスの中には不透明化機能が不十分なものもある。

デフォルトでは、plot -T hpgl では使えるペンはあらかじめ決められているものだけである。 描画時点でどのペンを使うかは、HPGL_PENS 環境変数で指定される。 HPGL_VERSION が "1" のときは HPGL_PENS のデフォルトのペンは "1=black" である。HPGL_VERSION が "1.5" または "2"のときは、 HPGL_PENS のデフォルト値は "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" である。 指定の仕方は、見ての通りである。HPGL_PENS を指定することで #1…#31 のどのペンにも色を割り当てることができる。 指定できる色名については 色名 を参照のこと。 ペン #1 はいつでも使える。その色は黒である必要はない。 #1…#31 の他のペンはあってもなくてもよい。

HPGL_VERSION が "2" のときは plot -T hpgl では HPGL_ASSIGN_COLORS も有効である。もしこれが "yes" にセットされていれば、plot -T hpgl で使えるペンの色は HPGL_PENS による制約を受けない。#1…#31 番の「論理ペン」に必要に応じて色が割り当てられる。 これをサポートする HP-GL/2 は LaserJet プリンタや DesignJet だが、 あまり多くはないため、デフォルトでは "no" である。

plot -T tek では Tektronix 端末のための出力が行われるが、 環境変数 TERM が有効である。もし TERM が "xterm"、 "xterms"、"kterm" のいずれかであれば、plot がその時実行されている環境は X Window システム上の VT100 端末エミュレータの xterm であると判断される。 このとき、plot -T tek では描画が行われる前に、xterm に付属していて通常は隠れている Tektronix のウィンドウを、 前面にポップアップさせるエスケープ・シーケンスが送られる。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 その際、Tektronix のウィンドウは画面に残ったままになる。

TERM が "kermit"、"ansi.sys"、ansissys"、"ansi.sysk"、"ansisysk" のいずれかの時は、MS-DOS 版の kermit 上の VT100 エミュレータ上であるとみなされる。 このとき、plot -T tek では描画が行われる前に、VT100 エミュレータから Tektronix のウィンドウに切り替えるエスケープ・シーケンスが送られる。 また出力に使われる Tektronix 制御コードは、kermit 特有のものになる。 このとき、使える色数には制限がある (ansi.sys の 16 色はサポートされる)。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 キーボードで `ALT minus' をタイプすると、 VT100 モードと Tektronix モードの切り替えが手動でできる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. pic2plot コマンド


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 pic2plot とは

pic2plot は、pic 言語で書かれたデータを一つまたは複数のファイルから読み込み、X Window の画面に表示したり、それらの図を取り込んだファイルを出力したりする。 多くの画像フォーマットがサポートされている。

pic は、技術文書や教科書などでよくあるような四角形と矢印からなる図を描くための、 ベル研で開発された小さな仕様の言語である。 pic 言語で記述された図を含むディレクトリを、pic2plot ともに公開、 配布することができる。ほとんどのシステムでは `/usr/share/pic2plot' または `/usr/local/share/pic2plot' としてインストールされている。 ブライアン・カーニハンによる pic 言語の原論文、 エリック・レイモンドによるその GNU 実装の入門書、 W. Richard Stevens による pic マクロのサンプルがそのディレクトリにある。

pic 言語は元々、troff 文書整形プログラムのために作られたものである。 その時想定されていた状況では、pic 言語で書かれた図は pic、あるいはその GNU 版である gpic に読み込まれる。 pic、あるいは gpic については詳細な解説書があるため、 この節では入力ファイルの例と pic2plot に実装された拡張機能について説明するにとどめる。

pic 言語では、一つのファイルに一つまたは複数の、 四角形と矢印からなる図を入れることができる。 各図の記述は .PS という行から .PE という行までである。 .PS.PE の間からはずれているところに記述されている線は無視される。 各図は幾何学図形 (長方形、円、楕円、1/4円 (「円弧」)、折れ線、スプライン) から構成される。円弧、折れ線、スプライン曲線は端点に矢印がつけられる。 各オブジェクトには、ラベルを付けられる。

各オブジェクトの位置は絶対座標ではなく、 そのオブジェクトの前に置かれたオブジェクトに対する相対座標で与えられる。 以下に例を示す。

 
.PS
box "START"; arrow; circle dashed filled; arrow
circle diam 2 thickness 3 "This is a" "big, thick" "circle" dashed; up
arrow from top of last circle; ellipse "loopback" dashed
arrow dotted from left of last ellipse to top of last box
arc cw radius 1/2 from top of last ellipse; arrow
box "END"
.PE

上の例をファイルに保存し `pic2plot -T X' に入力として与えると、 X のディスプレイ上に、図が描画されたウィンドウがポップアップする。 同様に `pic2plot -T ps' にこのデータを入力すると、 同じ図が描画された PostScript データが標準出力から得られる。 その PostScript データはドロー・エディタ idraw で編集できる。 他に PNM 形式、疑似 GIF 形式、Fig 形式 (ドロー・エディタ xfig で編集できる形式) にも同様に出力できる。それぞれ、 `-T pnm'`-T gif'`-T fig' オプションで得られる。

上の例では pic 言語の特徴がよく現れている。 デフォルトでは、繋がっているオブジェクトが連続して描かれる。 そして描画はデフォルトでは左から右の方に向けて進められる。 上の例の中の `up' 命令ではこの向きを下から上の方向に変更する。 すると次のオブジェクト (大きな円の上部から伸びる矢印) は右ではなく、 上を向くことになる。

オブジェクトには大きさなどの属性がある。属性には図全体のものと、 個別のオブジェクトのものとがある。たとえば円には直径、円弧には半径がある。 円弧に `cw' 属性を設定すると、円弧の向きが半時計回りではなく、 時計回りになる。多くのオブジェクトでは、`dashed'`dotted' 属性でそのオブジェクトを描く線種を設定できる。 また各オブジェクトにはラベルが付けられるが、 これは属性として設定される一つまたは複数の文字列である。 文字列にはエスケープ・シーケンスが使え、 フォントの切り替え、上付きや下付き、ASCII 文字ではない数学記号などが使える。 参照: 文字列とエスケープ・シーケンス

ほとんどのサイズや位置は「仮想インチ」単位で指定される。 これは pic2plot 特有の方法である。 pic2plot が描画を行うグラフィクス・ディスプレイ、たとえば描画範囲は、 一辺が 8 仮想インチの正方形が想定されている。 出力のページサイズに "letter" サイズ (PostScript のデフォルト) が設定された時、仮想インチは実際のインチと同じになる。 しかし他のページサイズも、たとえば `--page-size a4' オプションなどで指定できる。 そうした場合、1 仮想インチは単にグラフィクス・ディスプレイの 1/8 になる。

デフォルトでは各図はグラフィクス・ディスプレイの中央に置かれる。 この機能をオフにして、 `-n' オプションで図を置く絶対座標を指定することもできる。 たとえば `arrow from (8,8) to (4,4)' というオブジェクトだけからなる図は、図を中央に置く機能を使わない場合、 矢印の端点がグラフィクス・ディスプレイの中央になる。 もう一方の端は右上隅になる。

線の太さは仮想インチでは指定されない。gpic との互換性を持たせるため、 これは仮想ポイントで指定される。上の例では、`thickness' 属性が指定されているオブジェクトがそれである。1 仮想インチは 72 仮想ポイントである。

複数の図がある場合、X windows システム上では複数のウィンドウが、 他の形式ではそれぞれのページに出力される。しかし一部の出力形式 (PNM、pseudo-GIF、Illustrator、Fig) では単ページの出力しかサポートされない。 このうちのどれかが出力形式に指定されているときは、 最初の図だけが出力される。現在は pic2plot ではアニメーション GIF は生成できない。

pic 言語は、変数、制御ループなど、 実質的にプログラミング言語としての機能を完備しているにも関わらず、 あまり評価されていない。先進的な機能により、 繰り返し部分のある巨大な図を簡単に記述することができる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 pic2plot のコマンドライン・オプション

pic2plot は、pic 言語で書かれた技術文書や教科書などでよくあるような四角形と矢印からなる図を、 他の画像フォーマットに変換するプログラムである。 出力形式は `-T' オプションで指定できる。 指定できる形式は GNU graph および plot プログラムと同じで、 10 種類の形式をサポートしている。

入力ファイルを指定する場所は、コマンドライン上のどこでもよい。 つまりファイル名やコマンドライン・オプションの順序関係には、 意味はないということである。入力ファイルが指定されないか、ファイル名 `-' が指定されたときは、標準入力から読み込まれる。`-T X' オプションが指定されない限り、変換結果は標準出力に書き出される。 その場合、X Window システムの一つ、 あるいは複数のウィンドウに図が描画され、標準出力には何も書き出されない。

以下に指定できるコマンドライン・オプションを列挙する。 コマンドライン・オプションには、3種類ある。

  1. 一般的なオプション。
  2. 生の pic2plot 出力にだけ関するオプション。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。
  3. 情報を表示させるオプション (たとえば `--help')。

引数を取るオプションでは、 説明の最初にカッコ書きでその引数の型とデフォルト値を示している。

以下に、一般的なオプションを挙げる。

`-T type'
`--display-type type'

(文字列、デフォルトは "meta") 出力形式を type に設定する。これは、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかの文字列を指定する。それぞれ、 X Window System、portable anymap (PBM/PGM/PPM) 形式、pseudo-GIF 形式、 Adobe Illustrator 形式、idraw で編集できる Postscript 形式、xfig 形式、ヒューレット・パッカードの PCL 5 プリンタ言語 (デフォルトでは HP-GL/2)、Tektronix 形式、特定のデバイスに依存しない GNU graphics metafile 形式である。

`-d'
`--precision-dashing'

破線および点線を正確に、 つまり破線の各線分や点線の各点をそれぞれオブジェクトとし、 それぞれ独立に配置されるようにする。デフォルトでは内部で利用している libplot が提供する破線と点線が使われる。

このオプションを指定すると、破線および点線の見栄えが良くなることがある。 しかし代償もある。編集可能な出力形式 (たとえば Illustrator、PostScript、Fig 形式など) では、対応するソフトウェアで破線や点線を修正するのが困難になるだろう。

`-f font_size'
`--font-size font_size'

(実数、デフォルトは 0.0175) フォントのサイズを、グラフィクス・ディスプレイの幅に対する割合で font_size に指定する。

`-F font_name'
`--font-name font_name'

(文字列、デフォルトは "Helvetica"、ただし pic2plot -T pnmpic2plot -T gifpic2plot -T pclpic2plot -T hpglpic2plot -T tek、 生の pic2plot 出力の場合は "HersheySerif") 使われるフォントを font_name に指定する。 フォント名では大文字と小文字を区別しない。 もし指定されたフォントが使えない場合、デフォルトのフォントが使われる。 使えるフォントは、`-T' オプションで何を指定するかによって変わる。 すべてのフォントのリストは 利用できるフォント を参照のこと。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`-n'
`--no-centering'

自動的に図をセンタリングする機能をオフにする。このオプションが指定された時は、 各オブジェクトの置かれる場所を絶対座標で指定できる。たとえば "line from (0,0) to (4,4)" はグラフィクス・ディスプレイの左下隅から中央までの線分を描く (グラフィクス・ディスプレイは一辺が 8 仮想インチの正方形だから)。

`-W line_width'
`--line-width line_width'

(実数、デフォルトは -1.0) プロットの外枠の線の太さを frame_line_width、 グラフィクス・ディスプレイの縦か横の短い方に対する割合として指定する。 負の値を指定すると、libplot グラフィクス・ライブラリで設定しているデフォルト値が使われる。 通常、デフォルト値はディスプレイの 1/850 である。そのため、 `-T X'`-T pnm'-T gif のときは 0 になる。 0 になったときは、そのデバイスで描けるもっとも細い線が使われる。 これはどのデバイスでもそうである。しかし idrawxfig では、太さ 0 の線は描かれない。

pic2plot -T hpgl では、線の太さはデフォルト値以外は使えない。 pic2plot -T hpgl でも環境変数 HPGL_VERSION に 2 より小さな値をセットしているときは、同様である (これがデフォルト)。

`--bg-color name'

(文字列、デフォルトは "white") プロットの背景色を name に設定する。このオプションは pic2plot -T Xpic2plot -T pnmpic2plot -T gif でだけ有効である。無効な色名が指定されたときは、デフォルトの色が使われる。 使える色名については 色名 を参照のこと。環境変数 BG_COLOR でも同様に指定できる。

`-T gif' オプションが指定されているときは、環境変数 TRANSPARENT_COLOR に背景色を設定することで、その色が透明化される。 参照: 環境変数

`--bitmap-size bitmap_size'

(文字列、デフォルトは "570x570") プロットが描かれるグラフィクス・ディスプレイのサイズを、 ピクセル単位で bitmap_size に設定する。 このオプションは pic2plot -T Xpic2plot -T pnmpic2plot -T gif のときに有効である。これらの出力形式では、 グラフィクス・ディスプレイのサイズがピクセル単位で表現されているからである。 環境変数 BITMAPSIZE でも同様に指定できる。

pic2plot -T X で利用できるグラフィクス・ディスプレイは X window であり、一つのウィンドウに一つの図が描かれる。 長方形 (正方形でない) 描画領域が指定されたときは、 各図のフォントは縦と横で違う割合で拡大縮小される。 これを行うためには、X11R6 でなければならない。 これで拡大縮小できないフォントは、 Hershey ベクトル形式の "HersheySerif" などのデフォルトのスケーラブル・フォントに置き換えられる。

後方互換性のために、X resource の Xplot.geometry を設定することで、`--bitmap-size'BITMAPSIZE の代わりにディスプレイのサイズを設定できる。

`--max-line-length max_line_length'

(整数、デフォルトは 500) 一つのデータセットから描かれる一本の折れ線を一度に描ける、最大の点数を max_line_length に指定する。 データ点の数がこの数に達したときは、一旦折れ線が描画され、 それから続く点の処理が行われる。この時、特に通知やメッセージなどは行われない。

この指定は、いくつかの出力デバイス (昔の PostScript プリンタや HP-GL プロッタ) では出力バッファの大きさに制限があることによる。 この最大点数は、環境変数 MAX_LINE_LENGTH でも指定できる。 生の pic2plot 出力では、 各データ点ごとにリアルタイムで描画が行われるので、このオプションは無効である。

`--page-size pagesize'

(文字列、デフォルトは "letter") プロットが描かれる用紙の大きさを指定する。このオプションは pic2plot -T aipic2plot -T pspic2plot -T figpic2plot -T pclpic2plot -T hpgl で有効である。"letter" で指定される大きさは 8.5in x 11in である。"a0"…"a4" の ISO の用紙サイズおよび "a"…"e" の ANSI のサイズも指定できる ("letter" は "a"、"tabloid" は "b" と同じである)。 "legal"、"ledger"、b5" も指定できる。用紙サイズは、環境変数 ePAGESIZE でも指定できる。

pic2plot -T aipic2plot -T ps では、 プロットが描かれるグラフィクス・ディスプレイは、 幅が用紙サイズいっぱい (余白があるが) の正方形であり、 これが用紙の中央に置かれる。 pic2plot -T fig ではグラフィクス・ディスプレイの大きさは同じで、xfig の画面の左上隅に置かれる。 pic2plot -T pclpic2plot -T hpgl ではグラフィクス・ディスプレイの大きさは同じだが置かれる場所は異なる。 最終的にプロットが置かれる場所は、いくつかの環境変数で指定される (参照: 環境変数)。

`--pen-color name'

(文字列、デフォルトは "black") ペンの色を name に設定する。無効な名前が指定されたときは、 デフォルトの色が使われる。使える色名についての詳細は、色名 を参照のこと。

`--rotation angle'

(整数、デフォルトは 0) グラフィクス・ディスプレイ中のプロットを角度 angle だけ回転する。 指定できる値は 0, 90, 180, 270 である。その数字の角度だけ、 半時計回りに回転する。

このオプションを使うと、用紙の向き (縦または横) を切り替えることができる。 ポストモダニズムの芸術家にとっても便利かもしれない。

以下のオプションは、生の pic2plot 出力に対してだけ有効である。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。 この場合の pic2plot graphics metafile 形式の出力は、 plot で他の形式に変換できる。

`-O'
`--portable-output'

GNU metafile 出力を、バイナリ形式 (これがデフォルト) ではなく、ポータブル (人間の読める) 形式で行う。これは環境変数 META_PORTABLE を "yes" に設定することでも行える。

以下のオプションは、情報を表示させるためのものである。

`--help'

コマンドライン・オプションのリストを表示させ、そのまま実行を終了する。

`--help-fonts'

利用可能なフォントのリストを表示、そのまま終了する。 出力される内容は、`-T' オプションで指定される出力デバイスによって変わる。 pic2plot -T Xpic2plot -T aipic2plot -T pspic2plot -T fig では、PostScript 標準の 35 種類のフォントが使える。 pic2plot -T aipic2plot -T pclpic2plot -T hpgl では 45 種類の PCL 5 標準フォントが使える。 pic2plot -T pclpic2plot -T hpgl ではヒューレット・パッカードのベクトル・フォントが使える。 これらに加えて、 pic2plot -T pnmpic2plot -T gifpic2plot -T tek では 22 種類の Hershey ベクトル・フォントが使える。 原理的に、生の pic2plot 形式ではこれらのフォントのすべてを使える。 すべての形式に生の pic2plot 形式から plot で変換できるからである。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`--list-fonts'

他のプログラムにパイプで渡して処理しやすいように、1カラムのリストで出力する。 `-T' オプションでの出力デバイスの指定が何もないときは、 サポートされているすべてのフォントのリストが表示される。

`--version'

pic2plot とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 環境変数

pic2plot の動作を制御するための環境変数がいくつか用意されている。 BITMAPSIZEPAGESIZEBG_COLORMAX_LINE_LENGTH については上述である。これらの環境変数は、コマンドライン・オプションの `--bitmap-size'`--page-size'`--bg-color'`--max-line-length' と同じ働きを持つ。 他の環境変数は、それぞれ特定の出力デバイスに対して有効なものである。

pic2plot -T X では X Window のウィンドウが一つ開かれ、 そこにプロットが描画されるが、このとき DISPLAY 環境変数が確認される。 この環境変数で示されるディスプレイに、ウィンドウが開かれる。

pic2plot -T pnm では Portable Anymap (PBM/PGM/PPM) 形式で出力されるが、環境変数 PNM_PORTABLE が "yes" のとき、 出力は PBM、PGM、PPM の (人間が読める) ポータブル形式で行われる。 そうでない場合はバイナリ形式 (これがデフォルト) で行われる。

pic2plot -T gif では疑似 GIF 形式で出力されるが、 これには二つの環境変数による指定が有効である。 INTERLACE が "yes" のとき、生成される疑似 GIF 形式のファイルはインターレース形式になる。 また、TRANSPARENT_COLOR 環境変数に、 出力されるプロット中で使われている色の名前がセットされているときは、 その色は透明に設定され、それは GIF を扱える多くのソフトウェアで正しく扱われる。 使える色名については 色名 を参照のこと。

pic2plot -T pcl ではヒューレット・パッカードのプリンタまたはプロッタの出力形式、 PCL 5 形式で出力されるが、これを制御する環境変数がいくつかある。 PCL_XOFFSETPCL_YOFFSET 環境変数で、 グラフィクス・ディスプレイを用紙のどこに置くかを設定できる。 設定はセンチメートル、ミリメートル、インチのいずれかで行える。 たとえば、"2cm" や "1.2in" のように指定する。 また PCL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 PCL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。

PCL_ASSIGN_COLORS 環境変数に "yes" をセットすると、 カラーのプリンタその他に出力できる PCL 5 形式の出力が行われる。 これをセットすると色の再現性を正確にするために、内部で出力デバイスに、 各色を描画するための「論理ペン」が任意に設定できるようになる。 "no" にセットされるとあらかじめ設定されている色のペンだけが用いられ、 他の色は明るさの変化 (シェイディング) によって擬似的に描画される。 世の中の PCL 5 デバイスは、カラーより白黒が多いため、デフォルトでは "no" であり、色はシェイディングに置き換えられる。

pic2plot -T hpgl では HP-GL (ヒューレット・パッカード・グラフィクス・ランゲージ) 形式の出力が生成されるが、これにもいくつかの環境変数が用意されている。 もっとも重要なのは HPGL_VERSION で、これには "1"、"1.5"、"2" のいずれかが指定できる ("2" がデフォルト)。 "1" は純正の HP-GL、1.5 は HP7550A グラフィクス・プロッターおよび HP758x、HP7595A、HP7596A ドラフティング・プロッターに出力できる形式 (HP-GL にいくつかの HP-GL/2 拡張を加えたもの)、 "2" は新しい HP-GL/2 でそれぞれ描画するよう指示する。 もしバージョンが "1" または "1.5" にセットされていると、 使えるフォントはベクトル・フォントのみで、 ラインはすべてデフォルトの太さで描かれる (`-W' は無効になる)。 さらにバージョンが "1" のときは、任意の多角形をラインの色で塗りつぶす機能が使えなくなる (`-q' オプションは縦軸に置かれた円や長方形を塗りつぶすのに使われる)。

pic2plot -T hpgl のグラフィクス・ディスプレイの用紙上の位置は、 環境変数 HPGL_XOFFSET および HPGL_YOFFSET で、センチメートル、ミリメートル、インチ単位で指定できる。 たとえば、"2cm" や "1.2in" のように指定する。 また HPGL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 HPGL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。 "180" と "270" は HPGL_VERSION が "2" のとき (デフォルトがそうである) にだけ有効である。

不透明化機能による、白い線の描画や塗りつぶしは、HPGL_VERSION が "2" (デフォルトの状態) で環境変数 HPGL_OPAQUE_MODE が "yes" のときに可能になる。 もしこれが "no" にセットされているときは不透明化による塗りつぶしは行われず、 通常は #0 のペンで描かれる白色の線も描かれない。 この機能は昔の HP-GL/2 デバイスに適している。 たとえば HP-GL/2 ペン・プロッターは不透明化や #0 のペンによる、 白色の線には対応していない。また古い HP-GL/2 デバイスの中には不透明化機能が不十分なものもある。

デフォルトでは、pic2plot -T hpgl では使えるペンはあらかじめ決められているものだけである。 描画時点でどのペンを使うかは、HPGL_PENS 環境変数で指定される。 HPGL_VERSION が "1" のときは HPGL_PENS のデフォルトのペンは "1=black" である。HPGL_VERSION が "1.5" または "2"のときは、 HPGL_PENS のデフォルト値は "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" である。 指定の仕方は、見ての通りである。HPGL_PENS を指定することで #1…#31 のどのペンにも色を割り当てることができる。 指定できる色名については 色名 を参照のこと。 ペン #1 はいつでも使える。その色は黒である必要はない。 #1…#31 の他のペンはあってもなくてもよい。

HPGL_VERSION が "2" のときは pic2plot -T hpgl では HPGL_ASSIGN_COLORS も有効である。もしこれが "yes" にセットされていれば、pic2plot -T hpgl で使えるペンの色は HPGL_PENS による制約を受けない。#1…#31 番の「論理ペン」に必要に応じて色が割り当てられる。 これをサポートする HP-GL/2 は LaserJet プリンタや DesignJet だが、 あまり多くはないため、デフォルトでは "no" である

pic2plot -T tek では Tektronix 端末のための出力が行われるが、 環境変数 TERM が有効である。もし TERM が "xterm"、 "xterms"、"kterm" のいずれかであれば、pic2plot がその時実行されている環境は X Window システム上の VT100 端末エミュレータの xterm であると判断される。 このとき、pic2plot -T tek では描画が行われる前に、xterm に付属していて通常は隠れている Tektronix のウィンドウを、 前面にポップアップさせるエスケープ・シーケンスが送られる。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 その際、Tektronix のウィンドウは画面に残ったままになる。

TERM が "kermit"、"ansi.sys"、ansissys"、"ansi.sysk"、"ansisysk" のいずれかの時は、MS-DOS 版の kermit 上の VT100 エミュレータ上であるとみなされる。 このとき、pic2plot -T tek では描画が行われる前に、VT100 エミュレータから Tektronix のウィンドウに切り替えるエスケープ・シーケンスが送られる。 また出力に使われる Tektronix 制御コードは、kermit 特有のものになる。 このとき、使える色数には制限がある (ansi.sys の 16 色はサポートされる)。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 キーボードで `ALT minus' をタイプすると、 VT100 モードと Tektronix モードの切り替えが手動でできる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5. tek2plot コマンド


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1 tek2plot とは

GNU tek2plot は Tektronix 形式のデータを、他の画像フォーマットに変換するプログラムである。 出力形式は `-T' で指定する。指定できる形式は、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" で、"meta" がデフォルトである。これは GNU graphplotpic2plot と同じである。 tek2plot はプロット・フィルター plot と同様に、 入力はコマンドラインでファイル名を指定するか、標準入力から与える。

Tektronix 形式の画像ファイルを生成するソフトウェアは、昔はたくさんあった。 たとえば SKYMAP (強力な天文学画像ソフトウェア) がそうである。 GNU plotting utilities のパッケージには Tektronix 形式の画像ファイルのサンプルが同梱されているで、試してみることができる。 ほとんどのシステムでは、 `/usr/share/tek2plot' または `/usr/local/share/tek2plot' としてインストールされている。

Tektronix 形式は Tektronix 4010/4014 端末で描画するための、 非対話型の画像フォーマットとして定義されている。詳細は Tektronix Inc. による 1974 年の文書 4014 Service Manual (Tektronix Part #070-1648-00) に述べられている。tek2plot では、グラフィクス入力モード ("GIN mode") やステータス表示のような対話モードは用意されていない。 しかし MS-DOS 版 kermit が実装している Tektronix エミュレータのカラー拡張など、 一般的になった Tektronix エミュレータの拡張機能を実装している。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 tek2plot のコマンドライン・オプション

tek2plot は多くの古いソフトウェアで生成された Tektronix 形式のデータを、 他の画像フォーマットに変換する。出力形式やディスプレイの種類は `-T' オプションで指定できる。指定できる形式は GNU graphplotpic2plot と同じである。

入力ファイルを指定する場所は、コマンドライン上のどこでもよい。 つまりファイル名やコマンドライン・オプションの順序関係には、 意味はないということである。 `-' が指定されたときは、標準入力から読み込まれる。`-T X' オプションが指定されない限り、変換結果は標準出力に書き出される。 その場合、X Window システムの一つ、 あるいは複数のウィンドウに図が描画され、標準出力には何も書き出されない。

以下に指定できるコマンドライン・オプションを列挙する。 コマンドライン・オプションには、3種類ある。

  1. 一般的なオプション。
  2. 生の tek2plot 出力にだけ関するオプション。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。
  3. 情報を表示させるオプション (たとえば `--help')。

引数を取るオプションでは、 説明の最初にカッコ書きでその引数の型とデフォルト値を示している。

以下に、一般的なオプションを挙げる。

`-T type'
`--display-type type'

(文字列、デフォルトは "meta") 出力形式を type に設定する。これは、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかの文字列を指定する。それぞれ、 X Window System、portable anymap (PBM/PGM/PPM) 形式、pseudo-GIF 形式、 Adobe Illustrator 形式、idraw で編集できる Postscript 形式、xfig 形式、ヒューレット・パッカードの PCL 5 プリンタ言語 (デフォルトでは HP-GL/2)、Tektronix 形式、特定のデバイスに依存しない GNU graphics metafile 形式である。

`-p n'
`--page-number n'

(正の整数) 変換される Tektronix 形式のファイル、または複数の Tektronix 形式のファイルの中から、n ページ目だけを表示する。 Tektronix 形式のファイルには複数のページを記述することができるが、 ページ番号は 0 から始まる。

`-p' オプションが指定されない場合、 デフォルトではすべてのページが描画される。 たとえば plot -T X では各ページをそれぞれ別のウィンドウに描画する。 もし `-T pnm'`-T gif'`-T ai'`-T fig' オプションのいずれかが指定されているときは、 最初のページだけを出力するのがデフォルトである。PNM 形式、疑似 GIF 形式、AI 形式、Fig 形式は、単ページしかサポートしていないからである。

多くの Tektronix 形式のファイルでは、ページ数は 1 (page #0) か 2 (一つの空のページ #0 とページ #1) である。GNU plotting utilities が出力する Tektronix 形式 (たとえば graph -T tek など) は通常、後者である。

`-F font_name'
`--font-name font_name'

(文字列、デフォルトは "Courier"、ただし tek2plot -T pnmtek2plot -T giftek2plot -T pcltek2plot -T hpgl、 生の tek2plot の場合は "HersheySerif") 文字列で使われるフォントの初期値を font_name に指定する。フォント名では大文字と小文字は区別されない。 もしクーリエ類以外のフォントを使いたいときは、`--position-chars' が使える (後述)。使えるフォントのリストについては 利用できるフォント を参照のこと。 使えないフォントが指定されたときには、デフォルトのフォントが使われる。

`-W line_width'
`--line-width line_width'

(実数、デフォルトは -1.0) 描画される線の太さを、 グラフィクス・ディスプレイの縦あるいは横のいずれか短い方に対する割合として、 line_width で指定する。負の値を指定すると libplot でのデフォルト値が使われる。 デフォルト値はグラフィクス・ディスプレイの 1/850 だが、 `-T X'`-T pnm'-T gif では 0 になる。 慣例的に、太さに 0 を指定するとどの出力デバイスでも、 そのデバイスでもっとも細いラインが描かれるが、 idrawxfig は太さ 0 の線は描かないようになっている。

plot -T hpgl では、環境変数 HPGL_VERSION に 2 よりも小さな値を指定したときは、デフォルトの太さ以外の線は描けない。

`--bg-color name'

(文字列、デフォルトは "white") プロットの背景色を name に設定する。このオプションは pic2plot -T Xpic2plot -T pnmpic2plot -T gif でだけ有効である。無効な色名が指定されたときは、デフォルトの色が使われる。 使える色名については 色名 を参照のこと。環境変数 BG_COLOR でも同様に指定できる。

`-T gif' オプションが指定されているときは、環境変数 TRANSPARENT_COLOR に背景色を設定することで、その色が透明化される。 参照: 環境変数

`--bitmap-size bitmap_size'

(文字列、デフォルトは "570x570") プロットが描かれるグラフィクス・ディスプレイのサイズを、 ピクセル単位で bitmap_size に設定する。 このオプションは tek2plot -T Xtek2plot -T pnmtek2plot -T gif のときに有効である。これらの出力形式では、 グラフィクス・ディスプレイのサイズがピクセル単位で表現されているからである。 環境変数 BITMAPSIZE でも同様に指定できる。

tek2plot -T X で利用できるグラフィクス・ディスプレイは X window であり、一つのウィンドウに一つの図が描かれる。 長方形 (正方形でない) 描画領域が指定されたときは、 各図のフォントは縦と横で違う割合で拡大縮小される。 これを行うためには、X11R6 でなければならない。 これで拡大縮小できないフォントは、 Hershey ベクトル形式の "HersheySerif" などのデフォルトのスケーラブル・フォントに置き換えられる。

後方互換性のために、X resource の Xplot.geometry を設定することで、`--bitmap-size'BITMAPSIZE の代わりにディスプレイのサイズを設定できる。

`--max-line-length max_line_length'

(整数、デフォルトは 500) 一つのデータセットから描かれる一本の折れ線を一度に描ける、最大の点数を max_line_length に指定する。 データ点の数がこの数に達したときは、一旦折れ線が描画され、 それから続く点の処理が行われる。この時、特に通知やメッセージなどは行われない。

この指定は、いくつかの出力デバイス (昔の PostScript プリンタや HP-GL プロッタ) では出力バッファの大きさに制限があることによる。 この最大点数は、環境変数 MAX_LINE_LENGTH でも指定できる。 生の tek2plot 出力では、 各データ点ごとにリアルタイムで描画が行われるので、このオプションは無効である。

`--page-size pagesize'

(文字列、デフォルトは "letter") プロットが描かれる用紙の大きさを指定する。このオプションは tek2plot -T aitek2plot -T pstek2plot -T figtek2plot -T pcltek2plot -T hpgl で有効である。"letter" で指定される大きさは 8.5in x 11in である。"a0"…"a4" の ISO の用紙サイズおよび "a"…"e" の ANSI のサイズも指定できる ("letter" は "a"、"tabloid" は "b" と同じである)。 "legal"、"ledger"、b5" も指定できる。用紙サイズは、環境変数 PAGESIZE でも指定できる。

tek2plot -T aitek2plot -T ps では、 プロットが描かれるグラフィクス・ディスプレイは、 幅が用紙サイズいっぱい (余白があるが) の正方形であり、 これが用紙の中央に置かれる。 tek2plot -T fig ではグラフィクス・ディスプレイの大きさは同じで、xfig の画面の左上隅に置かれる。 tek2plot -T pcltek2plot -T hpgl ではグラフィクス・ディスプレイの大きさは同じだが置かれる場所は異なる。 最終的にプロットが置かれる場所は、いくつかの環境変数で指定される (参照: 環境変数)。

`--pen-color name'

(文字列、デフォルトは "black") ペンの色を name に設定する。無効な名前が指定されたときは、 デフォルトの色が使われる。使える色名についての詳細は、色名 を参照のこと。

`--position-chars'

文字列中の各文字を、一つずつ配置する。これはフォントがクーリエ類でないとき、 特に固定幅でないときには、使った方がよい。これを使うと xfigidraw での編集は難しくなるが、見栄えは良くなる。

`--rotation angle'

(整数、デフォルトは 0) グラフィクス・ディスプレイ中のプロットを角度 angle だけ回転する。 指定できる値は 0, 90, 180, 270 である。その数字の角度だけ、 半時計回りに回転する。

このオプションを使うと、用紙の向き (縦または横) を切り替えることができる。 ポストモダニズムの芸術家にとっても便利かもしれない。

`--use-tek-fonts'

オリジナルの Tektronix 4010/4014 で使われていたビットマップ・フォントを使う。 このオプションは tek2plot -T X のときにだけ有効である。plotting utilities パッケージのほとんどのバージョンでは、 tekfont0tekfont3 という名前の4種類のビットマップ・フォントを同梱している。 これらを最近の X Window システムにインストールするのは難しいことではない。 このオプションが正しく働くためには、ディスプレイのサイズを --bitmap-size 1024x1024 か X Window のリソース Xplot.geometry で 1024x1024 ピクセルに設定しなければならない。これは、plotting utilities が通常使うビットマップ・フォントは、 ベクトル・フォントと違ってスケーラブルではないからである。

このオプションが便利なのは、表示あるいは変換したい Tektronix 形式のファイルにオリジナルの Tektronix フォントを使った文字列がある場合だけである。 GNU plotting utilities が出力した Tektronix 形式 (たとえば graph -T tek など) は、 オリジナルの Tektronix は使わない。

以下のオプションは、生の tek2plot 出力に対してだけ有効である。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。 この場合の tek2plot graphics metafile 形式の出力は、 plot で他の形式に変換できる。

`-O'
`--portable-output'

GNU metafile 出力を、バイナリ形式 (これがデフォルト) ではなく、ポータブル (人間の読める) 形式で行う。これは環境変数 META_PORTABLE を "yes" に設定することでも行える。

以下のオプションは、情報を表示させるためのものである。

`--help'

コマンドライン・オプションのリストを表示させ、そのまま実行を終了する。

`--help-fonts'

利用可能なフォントのリストを表示、そのまま終了する。 出力される内容は、`-T' オプションで指定される出力デバイスによって変わる。 tek2plot -T Xtek2plot -T aitek2plot -T pstek2plot -T fig では、PostScript 標準の 35 種類のフォントが使える。 tek2plot -T aitek2plot -T pcltek2plot -T hpgl では 45 種類の PCL 5 標準フォントが使える。 tek2plot -T pcltek2plot -T hpgl ではヒューレット・パッカードのベクトル・フォントが使える。 これらに加えて、tek2plot -T pnmtek2plot -T giftek2plot -T tek では 22 種類の Hershey ベクトル・フォントが使える。 原理的に、生の tek2plot 形式ではこれらのフォントのすべてを使える。 すべての形式に生の tek2plot 形式から plot で変換できるからである。 plotfont ユーティリティ・プログラムで、 使えるフォントのキャラクタ・マップを表示することができる。参照: plotfont ユーティリティ・プログラム

`--list-fonts'

他のプログラムにパイプで渡して処理しやすいように、1カラムのリストで出力する。 `-T' オプションでの出力デバイスの指定が何もないときは、 サポートされているすべてのフォントのリストが表示される。

`--version'

tek2plot とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.3 環境変数

pic2plot の動作を制御するための、graphplot と同じ環境変数がいくつか用意されている。便宜を図るために、ここにも列挙する。

BITMAPSIZEPAGESIZEBG_COLORMAX_LINE_LENGTH については上述である。これらの環境変数は、コマンドライン・オプションの `--bitmap-size'`--page-size'`--bg-color'`--max-line-length' と同じ働きを持つ。 他の環境変数は、それぞれ特定の出力デバイスに対して有効なものである。

tek2plot -T X では X Window のウィンドウが一つ開かれ、 そこにプロットが描画されるが、このとき DISPLAY 環境変数が確認される。 この環境変数で示されるディスプレイに、ウィンドウが開かれる。

tek2plot -T pnm では Portable Anymap (PBM/PGM/PPM) 形式で出力されるが、環境変数 PNM_PORTABLE が "yes" のとき、 出力は PBM、PGM、PPM の (人間が読める) ポータブル形式で行われる。 そうでない場合はバイナリ形式 (これがデフォルト) で行われる。

tek2plot -T gif では疑似 GIF 形式で出力されるが、 これには二つの環境変数による指定が有効である。 INTERLACE が "yes" のとき、生成される疑似 GIF 形式のファイルはインターレース形式になる。 また、TRANSPARENT_COLOR 環境変数に、 出力されるプロット中で使われている色の名前がセットされているときは、 その色は透明に設定され、それは GIF を扱える多くのソフトウェアで正しく扱われる。 使える色名については 色名 を参照のこと。

tek2plot -T pcl ではヒューレット・パッカードのプリンタまたはプロッタの出力形式、 PCL 5 形式で出力されるが、これを制御する環境変数がいくつかある。 PCL_XOFFSETPCL_YOFFSET 環境変数で、 グラフィクス・ディスプレイを用紙のどこに置くかを設定できる。 設定はセンチメートル、ミリメートル、インチのいずれかで行える。 たとえば、"2cm" や "1.2in" のように指定する。 また PCL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 PCL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。

PCL_ASSIGN_COLORS 環境変数に "yes" をセットすると、 カラーのプリンタその他に出力できる PCL 5 形式の出力が行われる。 これをセットすると色の再現性を正確にするために、内部で出力デバイスに、 各色を描画するための「論理ペン」が任意に設定できるようになる。 "no" にセットされるとあらかじめ設定されている色のペンだけが用いられ、 他の色は明るさの変化 (シェイディング) によって擬似的に描画される。 世の中の PCL 5 デバイスは、カラーより白黒が多いため、デフォルトでは "no" であり、色はシェイディングに置き換えられる。

tek2plot -T hpgl では HP-GL (ヒューレット・パッカード・グラフィクス・ランゲージ) 形式の出力が生成されるが、これにもいくつかの環境変数が用意されている。 もっとも重要なのは HPGL_VERSION で、これには "1"、"1.5"、"2" のいずれかが指定できる ("2" がデフォルト)。 "1" は純正の HP-GL、1.5 は HP7550A グラフィクス・プロッターおよび HP758x、HP7595A、HP7596A ドラフティング・プロッターに出力できる形式 (HP-GL にいくつかの HP-GL/2 拡張を加えたもの)、 "2" は新しい HP-GL/2 でそれぞれ描画するよう指示する。 もしバージョンが "1" または "1.5" にセットされていると、 使えるフォントはベクトル・フォントのみで、 ラインはすべてデフォルトの太さで描かれる (`-W' は無効になる)。 さらにバージョンが "1" のときは、任意の多角形をラインの色で塗りつぶす機能が使えなくなる (`-q' オプションは縦軸に置かれた円や長方形を塗りつぶすのに使われる)。

不透明化機能による、白い線の描画や塗りつぶしは、HPGL_VERSION が "2" (デフォルトの状態) で環境変数 HPGL_OPAQUE_MODE が "yes" のときに可能になる。 もしこれが "no" にセットされているときは不透明化による塗りつぶしは行われず、 通常は #0 のペンで描かれる白色の線も描かれない。 この機能は昔の HP-GL/2 デバイスに適している。 たとえば HP-GL/2 ペン・プロッターは不透明化や #0 のペンによる、 白色の線には対応していない。また古い HP-GL/2 デバイスの中には不透明化機能が不十分なものもある。

デフォルトでは、tek2plot -T hpgl では使えるペンはあらかじめ決められているものだけである。 描画時点でどのペンを使うかは、HPGL_PENS 環境変数で指定される。 HPGL_VERSION が "1" のときは HPGL_PENS のデフォルトのペンは "1=black" である。HPGL_VERSION が "1.5" または "2"のときは、 HPGL_PENS のデフォルト値は "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" である。 指定の仕方は、見ての通りである。HPGL_PENS を指定することで #1…#31 のどのペンにも色を割り当てることができる。 指定できる色名については 色名 を参照のこと。 ペン #1 はいつでも使える。その色は黒である必要はない。 #1…#31 の他のペンはあってもなくてもよい。

HPGL_VERSION が "2" のときは pic2plot -T hpgl では HPGL_ASSIGN_COLORS も有効である。もしこれが "yes" にセットされていれば、tek2plot -T hpgl で使えるペンの色は HPGL_PENS による制約を受けない。#1…#31 番の「論理ペン」に必要に応じて色が割り当てられる。 これをサポートする HP-GL/2 は LaserJet プリンタや DesignJet だが、 あまり多くはないため、デフォルトでは "no" である


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6. plotfont ユーティリティ・プログラム


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 plotfont の使い方

plotfont は GNU plotting utilities の libplot ライブラリを内部で利用している graphplotpic2plottek2plot プログラムで使えるフォントのキャラクタ・マップを表示する、 単純なユーティリティ・プログラムである。 キャラクタ・マップは X Window システムのディスプレイ上に表示、 または他の画像フォーマットに出力できる。`-T' オプションで、出力する画像フォーマットを指定できる。指定できるのは "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" (これがデフォルト) である。

どのフォントが使えるかは、`-T' オプションで何が指定されているかによって変わる。 使えるフォントのリストを表示させるには、 `--help-fonts' オプションを使う。たとえば、

 
plotfont -T ps --help-fonts

とすると出力が PostScript 形式のときに使えるフォントのリストが表示される。 その中には "Times-Roman" があるが、以下のようにすると、

 
plotfont -T ps Times-Roman > map.ps

このフォントの後半、表示に使える (制御文字でない) アスキー文字のキャラクタ・マップが表示される。 キャラクタ・マップは 12x8 の表で、各セルの中央に文字が表示される。 `-2' オプションを付けるとフォントの前半のマップが表示される。

ほとんどの組み込みフォントは ISO-Latin-1 であるため、フォントの前半は ISO-Latin-1 でエンコードされるが、たとえば "HersheyCyrillic" はそうでない。 以下のようにすると、

 
plotfont -T ps -2 HersheyCyrillic > map.ps

この場合のエンコード、KOI8-R エンコードでどうなるかが表示される。 KOI8-R エンコードは昔のソヴィエト連邦の Unix およびネットワーク・アプリケーションで標準だったエンコードである。 "dingbats" フォントとも呼ばれる "ZapfDingbats" や "Wingdings" なども独自のエンコードを使っている。GNU plotting utilities がインストールされているほとんどの場合では、PostScript 形式を出力する際に Wingdings フォントは使えない。しかし PCL 5 か HP-GL/2 形式では、以下のようにして Wingdings フォントが使える。

 
plotfont -T hpgl Wingdings > map.plt

上のコマンドを実行すると HP-GL/2 形式で Wingdings フォントのキャラクタ・マップが得られる。 同様に plot -T pcl Wingdings とすると、LaserJet や他の PCL 5 プリンタで印刷できる PCL 5 形式で Wingdings フォントのキャラクタ・マップが得られる。

いずれにせよ、plotting utilities には 100 種類以上のフォントが組み込まれている。 参照: 利用できるフォント。出力デバイスに X display を使うときは、組み込みフォントによる制約を受けない。以下のようにすると、

 
plotfont -T X --help-fonts

利用できる組み込みフォントのリストが表示される。それには Hershey フォントも PostScript フォントも含まれている。そして表示に使われている X display で利用できるフォントも表示されるだろう。xlsfonts コマンドで利用中の X display で使えるフォントのリストが表示される。そのフォント名は XLFD 形式と呼ばれる形式で表示される。plotting utilities は X の font 名を XLFD 形式の短縮形で表示する。たとえば、"Utopia-Regular" というフォントは多くの X display で使えるが、これの XLDF 名は "-adobe-utopia-medium-r-normal-0-0-0-0-p-0-iso8859-1" で、短縮形は "utopia-medium-r-normal" である。以下のようにすると、

 
plotfont -T X utopia-medium-r-normal

X window 上のウィンドウがポップアップして、 このフォントのキャラクタ・マップが表示される。

`-T X' オプションを指定するとき、`--bitmap-size' を使えばポップアップするウィンドウのサイズを指定できる。 最近の X display では縦、横方向で異なる倍率でフォントがスケーリングできる。 たとえば上の例のコマンドに `--bitmap-size 600x300' を追加すると、 キャラクタ・マップが表示され、その中の Utopia-Regular の文字が X の機能により拡大縮小される。もし使っている X display にこの機能がない場合、代わりにスケーラブル・フォントが使われる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 plotfont のコマンドライン・オプション

plotfont は GNU plotting utilities の libplot ライブラリを内部で利用している graphplotpic2plottek2plot プログラムで使えるフォントのキャラクタ・マップを表示するユーティリティである。 キャラクタ・マップは X Window システムのディスプレイ上に表示、 または他の画像フォーマットに出力できる。`-T' オプションで、出力する画像フォーマットを指定できる。

キャラクタ・マップを出力するフォント名は、plotfont のコマンドライン上のどの位置でもよい。 つまりフォント名やコマンドライン・オプションの順序関係には、 意味はないということである。 `-T X' オプションが指定されない限り、キャラクタ・マップは標準出力に書き出される。 その場合、X Window システムの一つのウィンドウにキャラクタ・マップが描画され、 ファイルには何も書き出されない。

以下に指定できるコマンドライン・オプションを列挙する。 コマンドライン・オプションには、3種類ある。

  1. 一般的なオプション。
  2. 生の plotfont 出力にだけ関するオプション。 たとえば、`-T' による出力デバイスの形式の指定を、 何もしなかった時に有効である。
  3. 情報を表示させるオプション (たとえば `--help')。

引数を取るオプションでは、 説明の最初にカッコ書きでその引数の型とデフォルト値を示している。

以下に、一般的なオプションを挙げる。

`-1'
`--lower-half'

指定されたフォントの後半のキャラクタ・マップを表示する。 これがデフォルトである。

`-2'
`--upper-half'

指定されたフォントの前半のキャラクタ・マップを表示する。

`-o'
`--octal'

十進数ではなく八進数でキャラクタの番号を表示する (十進数がデフォルト)。 Number the characters in octal rather than in decimal (the default).

`-x'
`--hexadecimal'

十進数ではなく十六進数でキャラクタの番号を表示する (十進数がデフォルト)。

`--box'

各キャラクタの左右を横幅を示す点線で囲む。 デフォルトではそうしないようになっている。

`-j row'
`--jis-row row'

JIS [Japanese Industrial Standard] X0208 エンコードの日本語フォントの指定された行 row のキャラクタ・マップを表示する。 これは現在、HersheyEUC [Extended Unix Code] フォントでだけ有効である。 もしこれが指定された場合、`-1' および `-2' は無視され、このオプションが優先される。

有効な行は 1…94 である。JIS X0208 ではローマ字は row 3、 日本語の表音文字 (平仮名とカタカナ) はrows 4 と 5 である。 ギリシャ文字とキリル文字は rows 6 と 7 である。 日本語の表意文字 (漢字) は 16…84 である。 行番号 16…47 には、よく使われる JIS 第一水準の漢字が入っている。 漢字は音読み (古代の中国語読み) の順に並べられている。 行番号 48…84 は JIS 第二水準の (さほど使われない) 漢字が入っている。

HersheyEUC フォントには、JIS 第一水準の 2965 文字のうち 596 文字と、 第二水準から 7 文字が実装されている。これらは 8-bit EUC-JP でエンコードされている。 これは多バイトエンコードで、JIS X0208 と同じくアスキー文字も含まれている。 アスキー文字は普通に、高位ビットが立っていない1バイトで表現されている。 第一バイトが32 以上の行番号のときは、第二バイトが文字の番号である。

`-T type'
`--display-type type'

(文字列、デフォルトは "meta") 出力形式を type に設定する。これは、 "X"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかの文字列を指定する。それぞれ、 X Window System、portable anymap (PBM/PGM/PPM) 形式、pseudo-GIF 形式、 Adobe Illustrator 形式、idraw で編集できる Postscript 形式、xfig 形式、ヒューレット・パッカードの PCL 5 プリンタ言語 (デフォルトでは HP-GL/2)、Tektronix 形式、特定のデバイスに依存しない GNU graphics metafile 形式である。

PNM 形式、疑似 GIF 形式、AI 形式、Fig 形式は、単ページしかサポートしていないため、 もし `-T pnm'`-T gif'`-T ai'`-T fig' オプションのいずれかが指定されているときは、 最初に指定されたフォントのキャラクタ・マップだけが出力される。

`--bg-color name'

(文字列、デフォルトは "white") プロットの背景色を name に設定する。このオプションは plotfont -T Xplotfont -T pnmplotfont -T gif でだけ有効である。無効な色名が指定されたときは、デフォルトの色が使われる。 使える色名については 色名 を参照のこと。環境変数 BG_COLOR でも同様に指定できる。

`-T gif' オプションが指定されているときは、環境変数 TRANSPARENT_COLOR に背景色を設定することで、その色が透明化される。 参照: 環境変数

`--bitmap-size bitmap_size'

(文字列、デフォルトは "570x570") プロットが描かれるグラフィクス・ディスプレイのサイズを、 ピクセル単位で bitmap_size に設定する。 このオプションは plotfont -T Xplotfont -T pnmplotfont -T gif のときに有効である。これらの出力形式では、 グラフィクス・ディスプレイのサイズがピクセル単位で表現されているからである。 環境変数 BITMAPSIZE でも同様に指定できる。

plotfont -T X で利用できるグラフィクス・ディスプレイは X window であり、一つのウィンドウに一つの図が描かれる。 長方形 (正方形でない) 描画領域が指定されたときは、 各図のフォントは縦と横で違う割合で拡大縮小される。 これを行うためには、X11R6 でなければならない。 これで拡大縮小できないフォントは、 Hershey ベクトル形式の "HersheySerif" などのデフォルトのスケーラブル・フォントに置き換えられる。

後方互換性のために、X resource の Xplot.geometry を設定することで、`--bitmap-size'BITMAPSIZE の代わりにディスプレイのサイズを設定できる。

`--numbering-font-name font_name'

(文字列、デフォルトは "Helvetica"、ただし plotfont -T pnmplotfont -T gifplotfont -T pclplotfont -T hpglplotfont -T tek の場合は "HersheySerif") キャラクタ・マップ中でフォントの番号を表示するためのフォントを font_name に指定する。

`--page-size pagesize'

(文字列、デフォルトは "letter") プロットが描かれる用紙の大きさを指定する。このオプションは plotfont -T aiplotfont -T psplotfont -T figplotfont -T pclplotfont -T hpgl で有効である。"letter" で指定される大きさは 8.5in x 11in である。"a0"…"a4" の ISO の用紙サイズおよび "a"…"e" の ANSI のサイズも指定できる ("letter" は "a"、"tabloid" は "b" と同じである)。"legal"、"ledger"、b5" も指定できる。用紙サイズは、環境変数 PAGESIZE でも指定できる。

plotfont -T aiplotfont -T ps では、 プロットが描かれるグラフィクス・ディスプレイは、 幅が用紙サイズいっぱい (余白があるが) の正方形であり、これが用紙の中央に置かれる。 plotfont -T fig ではグラフィクス・ディスプレイの大きさは同じで、xfig の画面の左上隅に置かれる。 plotfont -T pclplotfont -T hpgl ではグラフィクス・ディスプレイの大きさは同じだが置かれる場所は異なる。 最終的にプロットが置かれる場所は、いくつかの環境変数で指定される (参照: 環境変数)。

`--pen-color name'

ペンの色を name に設定する。無効な名前が指定されたときは、 デフォルトの色が使われる。使える色名についての詳細は、色名 を参照のこと。

`--rotation angle'

(整数、デフォルトは 0) グラフィクス・ディスプレイ中のプロットを角度 angle だけ回転する。 指定できる値は 0, 90, 180, 270 である。その数字の角度だけ、 半時計回りに回転する。

このオプションを使うと、用紙の向き (縦または横) を切り替えることができる。 ポストモダニズムの芸術家にとっても便利かもしれない。

`--title-font-name font_name'

(文字列) 各キャラクタ・マップのタイトルに使うフォントを font_name に指定する。 通常タイトルに使われるフォントは、 キャラクタ・マップを表示しているフォントと同じである。 このオプションは、"ZapfDingbats" や "Wingdings" のような普通でないフォントのキャラクタ・マップを表示させるときに便利である。

以下のオプションは生の plotfont 出力にだけ関するものである。 たとえば `-T' でなにも出力形式が指定されなかったときなどである。 この場合 plotfont は metafile 形式で出力するが、 別途また plot を起動して他の形式に変換することができる。

`-O'
`--portable-output'

GNU metafile 出力を、バイナリ形式 (これがデフォルト) ではなく、ポータブル (人間の読める) 形式で行う。これは環境変数 META_PORTABLE を "yes" に設定することでも行える。

以下のオプションは、各種情報を表示させるために使える。

`--help'

コマンドライン・オプションのリストを表示、そのまま終了する。

`--help-fonts'

利用可能なフォントのリストを表示、そのまま終了する。 出力される内容は、`-T' オプションで指定される出力デバイスによって変わる。 plot -T Xplot -T aiplot -T psplot -T fig では、PostScript 標準の 35 種類のフォントが使える。 plot -T aiplot -T pclplot -T hpgl では 45 種類の PCL 5 標準フォントが使える。 plot -T pclplot -T hpgl ではヒューレット・パッカードのベクトル・フォントが使える。 これらに加えて、 plot -T pnmplot -T gifplot -T tek では 22 種類の Hershey ベクトル・フォントが使える。 原理的に、生の plotfont 出力ではこれらのフォントのすべてを使える。 すべての形式に生の plot 出力から plot で変換できるからである。

`--list-fonts'

他のプログラムにパイプで渡して処理しやすいように、1カラムのリストで出力する。 `-T' オプションでの出力デバイスの指定が何もないときは、 サポートされているすべてのフォントのリストが表示される。

`--version'

plot とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 環境変数

pic2plot の動作を制御するための、graphplottek2plot と同じ環境変数がいくつか用意されている。便宜を図るために、ここにも列挙する。

BITMAPSIZEPAGESIZEBG_COLORMAX_LINE_LENGTH については上述である。これらの環境変数は、コマンドライン・オプションの `--bitmap-size'`--page-size'`--bg-color'`--max-line-length' と同じ働きを持つ。 他の環境変数は、それぞれ特定の出力デバイスに対して有効なものである。

plotfont -T X では X Window のウィンドウが一つ開かれ、 そこにプロットが描画されるが、このとき DISPLAY 環境変数が確認される。 この環境変数で示されるディスプレイに、ウィンドウが開かれる。

plotfont -T pnm では Portable Anymap (PBM/PGM/PPM) 形式で出力されるが、環境変数 PNM_PORTABLE が "yes" のとき、 出力は PBM、PGM、PPM の (人間が読める) ポータブル形式で行われる。 そうでない場合はバイナリ形式 (これがデフォルト) で行われる。

plotfont -T gif では疑似 GIF 形式で出力されるが、 これには二つの環境変数による指定が有効である。 INTERLACE が "yes" のとき、生成される疑似 GIF 形式のファイルはインターレース形式になる。 また、TRANSPARENT_COLOR 環境変数に、 出力されるプロット中で使われている色の名前がセットされているときは、 その色は透明に設定され、それは GIF を扱える多くのソフトウェアで正しく扱われる。 使える色名については 色名 を参照のこと。

plotfont -T pcl ではヒューレット・パッカードのプリンタまたはプロッタの出力形式、 PCL 5 形式で出力されるが、これを制御する環境変数がいくつかある。 PCL_XOFFSETPCL_YOFFSET 環境変数で、 グラフィクス・ディスプレイを用紙のどこに置くかを設定できる。 設定はセンチメートル、ミリメートル、インチのいずれかで行える。 たとえば、"2cm" や "1.2in" のように指定する。 また PCL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 PCL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。

PCL_ASSIGN_COLORS 環境変数に "yes" をセットすると、 カラーのプリンタその他に出力できる PCL 5 形式の出力が行われる。 これをセットすると色の再現性を正確にするために、内部で出力デバイスに、 各色を描画するための「論理ペン」が任意に設定できるようになる。 "no" にセットされるとあらかじめ設定されている色のペンだけが用いられ、 他の色は明るさの変化 (シェイディング) によって擬似的に描画される。 世の中の PCL 5 デバイスは、カラーより白黒が多いため、デフォルトでは "no" であり、色はシェイディングに置き換えられる。

plotfont -T hpgl では HP-GL (ヒューレット・パッカード・グラフィクス・ランゲージ) 形式の出力が生成されるが、これにもいくつかの環境変数が用意されている。 もっとも重要なのは HPGL_VERSION で、これには "1"、"1.5"、"2" のいずれかが指定できる ("2" がデフォルト)。 "1" は純正の HP-GL、1.5 は HP7550A グラフィクス・プロッターおよび HP758x、HP7595A、HP7596A ドラフティング・プロッターに出力できる形式 (HP-GL にいくつかの HP-GL/2 拡張を加えたもの)、 "2" は新しい HP-GL/2 でそれぞれ描画するよう指示する。 もしバージョンが "1" または "1.5" にセットされていると、 使えるフォントはベクトル・フォントのみで、 ラインはすべてデフォルトの太さで描かれる (`-W' は無効になる)。 さらにバージョンが "1" のときは、任意の多角形をラインの色で塗りつぶす機能が使えなくなる (`-q' オプションは縦軸に置かれた円や長方形を塗りつぶすのに使われる)。

plotfont -T hpgl のグラフィクス・ディスプレイの用紙上の位置は、 環境変数 HPGL_XOFFSET および HPGL_YOFFSET で、センチメートル、ミリメートル、インチ単位で指定できる。 たとえば、"2cm" や "1.2in" のように指定する。 また HPGL_ROTATE 環境変数を "yes" に設定すると、 ディスプレイを半時計回りに 90° 回転することができる。 これはディスプレイ中でプロットを回転させる --rotation オプションとは異なる。 HPGL_ROTATE 環境変数に設定できる値は、"no" と "yes" に加えて、 "0"、"90"、"180"、および "270" である。"no" と "yes" は "0" と "90" とそれぞれ同じである。 "180" と "270" は HPGL_VERSION が "2" のとき (デフォルトがそうである) にだけ有効である。

デフォルトでは、pic2plot -T hpgl では使えるペンはあらかじめ決められているものだけである。 描画時点でどのペンを使うかは、HPGL_PENS 環境変数で指定される。 HPGL_VERSION が "1" のときは HPGL_PENS のデフォルトのペンは "1=black" である。HPGL_VERSION が "1.5" または "2"のときは、 HPGL_PENS のデフォルト値は "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" である。 指定の仕方は、見ての通りである。HPGL_PENS を指定することで #1…#31 のどのペンにも色を割り当てることができる。 指定できる色名については 色名 を参照のこと。 ペン #1 はいつでも使える。その色は黒である必要はない。 #1…#31 の他のペンはあってもなくてもよい。

HPGL_VERSION が "2" のときは plotfont -T hpgl では HPGL_ASSIGN_COLORS も有効である。もしこれが "yes" にセットされていれば、plotfont -T hpgl で使えるペンの色は HPGL_PENS による制約を受けない。#1…#31 番の「論理ペン」に必要に応じて色が割り当てられる。 これをサポートする HP-GL/2 は LaserJet プリンタや DesignJet だが、 あまり多くはないため、デフォルトでは "no" である

plotfont -T tek では Tektronix 端末のための出力が行われるが、 環境変数 TERM が有効である。もし TERM が "xterm"、 "xterms"、"kterm" のいずれかであれば、plotfont がその時実行されている環境は X Window システム上の VT100 端末エミュレータの xterm であると判断される。 このとき、plotfont -T tek では描画が行われる前に、xterm に付属していて通常は隠れている Tektronix のウィンドウを、 前面にポップアップさせるエスケープ・シーケンスが送られる。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 その際、Tektronix のウィンドウは画面に残ったままになる。

TERM が "kermit"、"ansi.sys"、ansissys"、"ansi.sysk"、"ansisysk" のいずれかの時は、MS-DOS 版の kermit 上の VT100 エミュレータ上であるとみなされる。 このとき、plotfont -T tek では描画が行われる前に、VT100 エミュレータから Tektronix のウィンドウに切り替えるエスケープ・シーケンスが送られる。 また出力に使われる Tektronix 制御コードは、kermit 特有のものになる。 このとき、使える色数には制限がある (ansi.sys の 16 色はサポートされる)。 また描画が行われた後には、元の VT100 端末に制御を戻すためのエスケープ・シーケンスが送られる。 キーボードで `ALT minus' をタイプすると、 VT100 モードと Tektronix モードの切り替えが手動でできる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7. spline コマンド


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 spline コマンドの使い方

spline は一つまたは複数のデータセットで、データ点を補間するプログラムである。 各データセットは独立変数と従属変数からなり、 従属変数は、次元数が固定でそれを指定すれば、ベクトルでもよい。 ここでは独立変数と従属変数はそれぞれ `t' と `y' で表す。 注意: t はスカラー値の変数だが、 y は一般に従属変数ベクトルであってよい。

もっとも簡単な例としては、入力はテキスト形式の一つのファイルで、 従属変数が1次元の場合がある。これがデフォルトである。たとえば、 入力ファイルの内容が以下のようになっている場合、

 
0.0  0.0
1.0  1.0
2.0  0.0

(t,y) 座標中のデータ点が (0,0)、(1,1)、(2,0) であると解釈される。 各データ点は各行に分かれている必要はなく、また ty が同じ行である必要もない。しかしデータセットが一つであるとする場合には、 その中に空行が含まれていてはならない。またデフォルトでは、 独立変数の値は単調増加である必要がある。したがって yt の関数である、と見なすことができる。

データセット中の各点を通るスプライン曲線 (「補間関数」のプロット) は、以下のようにすると得ることができる。

 
spline input_file > output_file

PostScript 形式のプロットを graph で描画するには、以下のようにする。

 
spline input_file | graph -T ps > output.ps

X Window の画面にプロットを表示するには、以下のようにする。

 
echo 0 0 1 1 2 0 | spline | graph -T X

最後の例では、入力ファイルを一つも指定していない。spline コマンドは、入力ファイルが何も指定されないか、または特殊ファイル名 `-' が指定されたときは、標準入力からデータを読み込む。

spline が行っていることは、正確には、まずデータ点に対する曲線 (補間関数のプロット) のフィッティングである。次に独立変数 t の取る範囲を 100 個の小区間に分割し、y の値が各小区間の、合計 101 個の端点で取る値を計算する。そしてその値を (t, y) として出力する。これはつまり、与えられたデータセットの点を通る曲線上の 101 個の点の座標である。入力中に (空行で区切られた) 複数のデータセットがある場合は、 各データセットが別々に補間される。

`-n' オプションを使えば、上述の 100 を別の正の整数に変更できる。また `-t' オプションで補間する範囲をデフォルト値 (独立変数の取っている範囲) とは異なった値に変更できる。たとえば以下のコマンド

 
echo 0 0 1 1 2 0 | spline -n 20 -t 1.0 1.5 > output_file

を実行すると、t の値が (0.0 から 2.0 ではなく) 1.0 から 1.5 までで、等間隔の (101 点ではなく) 21 点のデータを出力する。 出力されるデータ点は (0,0)、(1,1)、(2,0) の3点を通る曲線上の点である。 この例では放物線になる。

ここで用いている補間曲線は3次のスプライン関数である。 この関数では、隣接する節点 (knot、与えられるデータセット中の点) の間で ytの三次関数であり、 y がどの節点の間にあるかで関数の形が変わる。 各節点では、節点の両側の関数の勾配と曲率が一致するようになっている。 数学的に表現すると、補間関数は節点において二階微分可能であるということである。

spline コマンドでは補間曲線に「テンション」を持たせることができる。 `-T' オプションで非零の値のテンションを指定することができる。 たとえばある値のテンションを持つスプライン曲線を表示させるには、 以下のようにする。

 
echo 0 0 1 1 2 0 | spline -T 10 | graph -T X

テンションの値を大きくすると、スプライン曲線はだんだんと折れ線に近づいていく。 外見上、強く張られた線のように見える。テンションの値は、 正の値と同様に負の値も指定できる。 そのときはスプライン曲線は外に膨らむ形になり、 正確には正弦曲線的に振動する。しかし負の無限大に近づけていくと、 振動していたスプライン曲線はまた折れ線に収束していく。

テンションが正の数の時、その逆数は、スプライン曲線が「よく近似している」 と言える独立変数 t の範囲は最大でどこまでか、を表す。 テンションを 0 から増やして行くとスプライン曲線は、 曲がっている部分の少ない部分 (データ点がその中心である) と、 ほとんど直線の部分で構成されることになる。 (It follows that tension is a `dimensionful' quantity.) もしテンションが 0 でない場合、独立変数の値にはある共通の正の値が乗じられ、 テンションの値はその共通の値で除され、 元のスプライン曲線をスケーリングしたスプライン曲線が得られる。 もしテンションが 0 の場合 (これがデフォルト。または3次スプラインの場合) は、データを線形にスケーリングしてもスプライン曲線は変化しない。

数学的に表現すると、テンションのあるスプライン関数は、 連続する二つの節点の間で以下の微分方程式を満たす。

y""=sgn(tension)*(tension^2)y" テンションが 0 のとき (デフォルトの場合) yt に関する四階微分は各点で 0 になる。この場合 t の関数としての y は連続する二つの節点の間で三次の多項式になる。 テンションが 0 でない場合は、yt の多項式では表されない。 指数関数などで表されるだろう。

テンションがあってもなくても、t に関して周期的なスプライン関数を得るには、`-p' オプションを使えばよい。 これはデータセット中の最初と最後の点で y の値が同じのときにだけ使える。 総でない場合は、周期的な補間曲線を計算することはできない。

場合によって、別のプログラムで生成される点を、 生成と同時に補間できると便利なことがある。つまり、spline コマンドをリアルタイム・フィルターとして使えれば便利である、ということである。 spline 通常はフィルタとしては動作しない。 可能な限り滑らかな曲線を得ることが一般的な目的だからである。 はフィルタとして動作させるには `-f' を指定する。この場合、 補間をデータ全体からでなく局所的に行うために、異なるアルゴリズム (3次のベッセル補間) が用いられる。`-f' を指定するときは普通、`-p' は指定しないだろう。または `-f' を指定するときは、補間する範囲 (変数 t の範囲) を `-t' オプションで明示的に指定しなければならない。

3次のベッセル補間は原理的に、 範囲全体から補間を行う三次のスプライン関数ほど滑らかではない。 もし `-f' オプションが指定された場合、 各節点におけるスプライン関数の勾配は、 その節点とその両側の節点の三点から求められた二次曲線の勾配になる。 二つの隣り合う補間曲線の勾配は、その両方に共通する節点において一致するが、 曲率は一般に一致しない。 数学的に表現すると、補間曲線は1階微分可能だが、一般に二階微分可能とは言えない。 リアルタイム・フィルタとしての動作の代償が、この微分可能性の減少である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 一歩進んだ spline の使い方

前節で spline がスカラー変数 t の関数 y をどのように補間するかを解説した。 この節ではもっとスマートな補間方法について解説する。 多次元の補間、一価の関数ではない一般の曲線のスプライン補間などである。

spline コマンドは次元が指定されていれば y がベクトルでも扱える。次元数は `-d' オプションで指定する。 たとえば以下のような多次元のデータセットがあるとする。

 
0.0  0.0  1.0
1.0  1.0  0.0
2.0  0.0  1.0

これは3点のデータ点 (t,y) の座標がそれぞれ (0,0,1)、 (1,1,0)、(2,0,1) であると解釈される。 データセット中の各点を通るスプライン曲線 (補間関数のプロット) は、以下のようにすると得ることができる。

 
spline -d 2 input_file > output_file

この例では従属変数 y が二次元ベクトルなので、オプション `-d 2' を指定している。y ベクトルの各要素はそれぞれ独立に補間され、 その結果得られる補間関数から計算される値が出力される。

多次元補間を行う場合でも、一次元の場合と同じオプションが指定できる。 たとえば `-f' を指定するとリアルタイムで3次のベッセル補間を行う。 一次元の場合と同様、`-f' が指定されたときは `-t' オプションで補間区間(t の値の取りうる範囲) を指定しなければならない。-p オプションではベクトル関数で周期スプラインが得られる。この場合 y の値はデータセットの最初と最後で一致していなければならない。

spline では、平面上に任意に置かれた点を通る曲線を得ることもできる。 またこれは、一般の d 次元空間内についても可能である。 これは少なくとも関数の微分可能性については、 スプライン関数と定義が異なっている。これは、スプライン関数では 関数として描けるとは限らない一般の曲線ではなく、関数を組み合わせるためである。 どんな曲線もすべて関数として描けるとは限らないのである。

以下の例では、一般の曲線をスプライン補間する。

 
echo 0 0 1 0 1 1 0 1 | spline -d 2 -a -s | graph -T X

ここでは二次元平面内の4点 (0,0)、(1,0)、(1,1)、(0,1) を通る曲線が求められ X Window システムのディスプレイに表示される。`-d 2' オプションで従属変数 y の次元数が 2 であることを指定している。`-a' オプションで、入力中には t の値がない、 したがってそれは自動生成することを指示している。デフォルトでは t の値の初期値は 0 で、その次の値は 1、のようになる。`-s' オプションで、t の値は出力しなくてよいことを指示している。

閉曲線も同様にして描くことができる。たとえば以下のようにすると、

 
echo 0 0 1 0 0 1 0 0 | spline -d 2 -a -s -p | graph -T X

3つの点 (0,0)、(1,0)、(0,1) を通る菱形に似た形の曲線が描かれる。 データ点の最初と最後が同じ (0,0) であることと、`-p' (つまり `--periodic') オプションを指定することで、閉曲線を描くことができる。

閉曲線でもそうでなくても、一般の曲線をスプライン補間で描く場合、`-a' オプションの代わりに `-A' オプションを使って、 入力には t の値がなくそれを自動生成するよう指定できる。 しかし t の値の増分は、y の増分と同じにされる。 各データ点を通る曲線を求めるときにこのようにして t の値を決めるのは、 FITPACK という有名なライブラリと同じ方法である。 連続するデータ点間の距離が激しく振動するような場合は、 このようにするのがおそらく最良の方法である。

二次元平面内のデータ点を通る曲線は、閉曲線でもそうでなくても、 自分自身と交差する可能性がある。その場合にテンションを負の値にすると、 興味深い画像が得られる。たとえば以下のコマンドを実行すると、

 
echo 0 0 1 0 1 1 0 0 | spline -d 2 -a -s -p -T -14 -n 500 | graph -T X

3つの点 (0,0)、(1,0)、(0,1) を渦巻き様の曲線上に通る曲線が得られる。 `-n 500' は、この曲線は曲がっているところが多いために指定している。 これは合計で 501 点が生成されるように指示しているが、 これだけあれば十分に滑らかな線が描ける。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 spline のコマンドライン・オプション

spline コマンドはスカラー変数 t に関してベクトル値を取る関数、または d 次元空間内の曲線を補間する。 spline が内部で使っているアルゴリズムは D. Kincaid と [E.] W. Cheney による Numerical Analysis (2nd ed., Brooks/Cole, 1996) の section 6.4、および C. de Boor による A Practical Guide to Splines (Springer-Verlag, 1978) の Chapter 4 のアルゴリズムと同様である。

入力ファイルの名前はコマンドライン上のどこでも指定できる。 その順番やコマンドライン・オプションの順番は、意味を持たない。 ファイル名が何も指定されないか、`-' というファイル名が指定されたときは、標準入力から読み込まれる

一つの入力ファイルに複数のデータセットを記述しておくことができる。 `-a' または `-A' オプション (後述) が指定されない限りは、 各データセットはデータ点の連続するものとして扱われ、ty の値が交互に並べられたものであるとされる。t はスカラー値の独立変数であり、y はベクトルで表される従属変数である。 であり、y の次元数は `-d' オプションで指定される (デフォルトでは 1 である)。

入力ファイルがテキストファイルである時 (これがデフォルト)、 複数のデータセットは空行で区切られる。 また入力ファイル中には任意の行数のコメント行が書ける。 行頭が # という文字の行がコメント行として扱われる。 コメント行は無視され、空行として扱われる訳ではない。 そのためデータセットの途中にあっても構わない。

以下に spline に指定できるコマンドライン・オプションを列挙する。 コマンドライン・オプションには、3種類ある。

  1. 各データセットに適用される補間法を指定するオプション。
  2. 入出力の形式を指定するオプション。
  3. 情報を表示させるオプション (たとえば `--help')。

引数を取るオプションでは、 説明の最初にカッコ書きでその引数の型とデフォルト値を示している。

以下に、各データセットに適用される補間法を指定するオプションを列挙する。

`-f'
`--filter'

局所的補間アルゴリズム (三次のベッセル補間アルゴリズム) を使い、 spline がリアルタイム・フィルタとして動作できるようにする。 補間曲線の傾きはデータセット中の各データ点で、 そのデータ点と両隣の点から決定される二次関数と同じである。 `-t' オプションは通常は省略してもよいが、`-f' オプションが指定されたときは必須である。また `-f' オプションが指定されるときは、`-k'`-p'`-T' の各オプションを使うことはないだろう。

`-f' が指定されないときは、別の (データセット全体を一度に使う) アルゴリズムが使われる。

`-k k'
`--boundary-condition k'

(実数、デフォルトは 1.0) 作り出されたそれぞれのスプライン曲線に対して、境界条件のパラメータを k にする。 各スプライン曲線は、境界条件として y"[0]=ky"[1] および y"[n]=ky"[n-1] を満たすが、ここで y[0] および y[1] は与えられるデータセットの最初の2点での従属変数ベクトル y の特定の要素の値であり、y[n-1]y[n] は最後の2点での、 その要素の値である。 k を 0 にすると与えられるデータセットの両端で曲率が 0 になり、 自然スプラインとなる。`-k' オプションは `-f' または `-p' オプションが指定されたときには使わないだろう。

`-n n'
`--number-of-intervals n'

(正の整数、デフォルトは 100) 補間を行う区間を n個の小区間に分割する。 計算されるデータ点の数と出力される点の数は n+1 になる。

`-p'
`--periodic'

周期的スプライン補間を行う。このオプションを指定するときは、 各データセットにおいて、最初と最後のデータ点は同じでなければならない。 `-p' オプションを指定するときは、 `-f' または `-k' オプションは使わないだろう。

`-T tension'
`--tension tension'

(実数、デフォルトは 0.0) 各補間曲線のテンションの強さを tension に設定する。 データセット中の二つの連続するデータ点の間で、 スプライン関数はベクトルの各要素について、 以下の微分方程式を満たすように計算される。 y""=sgn(tension)*(tension^2)y" tension が 0 のときはスプライン関数は区分的な三次多項式になる。 tension の値を正の方向に大きくすると、スプライン関数は折れ線に収束する。 `-T'`-f' オプションと同時に使うことはないだろう。

`-t tmin tmax [tspacing]'
`--t-limits tmin tmax [tspacing]'

各データセットについて、補間する区間を tmin から tmax にする。 tspacing が指定されていなければ、補間区間全体は `-n' オプションで指定される個数の小区間に分割される。 もし `-t' オプションが指定されないときは、 入力されるデータセット中で独立変数が取っている範囲が補間対象となる。`-f' オプションを使って spline コマンドをフィルターとして使うときには、`-t' オプションを指定する必要がある (上述)。

以下のオプションは、入出力ファイルの形式を指定する。

`-d dimension'
`--y-dimension dimension'

(整数、デフォルトは 1) 入力および出力における従属変数 y の次元を dimension に指定する。

`-I data-format'
`--input-format data-format'

(文字、デフォルトは `a') 入力ファイル中のデータの形式を、以下の中から data-format に指定する文字で指定する。指定できる文字 (と形式) は以下の通りである。

`a'

テキスト形式。ファイル中では浮動小数点実数が並んでおり、連続するデータ点の ty が交互に並んでいるものと解釈される。 yd ベクトルのとき、各データ点は d+1 個の数値で表される。各点の ty は必ずしも同じ行に書かれている必要はなく、 また各点を違う行に書く必要もない。 しかし空行 (2個連続する改行文字) はデータセットの区切りであると見なされ、 次の行から次のデータセットが始まるものと解釈される。

`f'

単精度実数バイナリ形式。 ファイル中では浮動小数点実数が並んでおり、連続するデータ点の ty が交互に並んでいるものと解釈される。 yd 次元ベクトルのとき、各データ点は d+1 個の数値で表される。データセットの区切りは一つの FLT_MAX の値の数値で表される。これは単精度実数で表現できる最大値である。 その値はほとんどのプラットフォームでは 3.4x10^38 である。

`d'

倍精度実数バイナリ形式。 ファイル中では浮動小数点実数が並んでおり、連続するデータ点の ty が交互に並んでいるものと解釈される。 yd 次元ベクトルのとき、各データ点は d+1 個の数値で表される。データセットの区切りは一つの DBL_MAX の値の数値で表される。これは倍精度実数で表現できる最大値である。 その値はほとんどのプラットフォームでは 1.8x10^308 である。

`i'

倍精度実数バイナリ形式。 ファイル中では整数が並んでおり、連続するデータ点の ty が交互に並んでいるものと解釈される。 yd 次元ベクトルのとき、各データ点は d+1 個の数値で表される。データセットの区切りは一つの INT_MAX の値の数値で表される。これは整数で表現できる最大値である。 その値はほとんどのプラットフォームでは 2^31-1 である。

`-a [step_size [lower_limit]]'
`--auto-abscissa [step_size [lower_limit]]'

(実数、デフォルトは 1.0 と 0.0) 独立変数 t) の値を自動で決定する。 データの形式 (`a'`f'`d'、または `i') とは関係なく、このオプションを指定すると、入力ファイル中には独立変数 (t) の値はないものとして扱われ、入力されるデータはすべて従属変数 (y) である、と解釈される。したがって y の次元が d のとき、各データ点には d 個の数値があればよい。t の各点での増分は step_size で指定され、 最初のデータ点の t の値は lower_limit で指定される。

`-A'
`--auto-dist-abscissa'

独立変数 t) の値を自動で決定する。 `-a' と似ているが、最初のデータ点の t の値 を 0.0 にし、それ以降の増分を y の増分と同じにする。 関数とは言えない一般の曲線を補間するときに便利である (参照: 一歩進んだ spline の使い方)。

`-O data-format'
`--output-format data-format'

(文字、デフォルトは `a') 出力するデータの形式を data-format に指定する。 指定できるものとその意味は `-I' オプションと同じである。

`-P significant-digits'
`--precision significant-digits'

(正の整数、デフォルトは 6) ty を出力するときの精度を significant-digits にする。 出力形式が `a'、テキスト形式の場合にのみ有効である。

`-s'
`--suppress-abscissa'

独立変数 t の値を出力せず、各点において従属変数 y の値のみを出力する。yd 次元のとき、各点で d+1 個ではなく、d 個の数値が出力される。 関数とは言えない一般の曲線を補間するときに便利である (参照: 一歩進んだ spline の使い方)。

以下のオプションは、情報を表示させるためのものである。

`--help'

コマンドライン・オプションのリストを表示、そのまま終了する。

`--version'

spline とこの plotting utilitie パッケージのバージョン番号を表示して、 そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8. ode コマンド

GNU ode コマンドは、一階常備分方程式 (ODE) の初期値問題の数値解を計算するプログラムである。 n' 次の微分方程式を n 連立の一階の微分方程式にシンプルな方法で変換して、 ode で高次の微分方程式を解くこともできる。 ode の出力はパイプで graph に渡して、 一つあるいは複数の計算された解曲線をプロットすることができる。

複数の求解アルゴリズムが実装されている。 Runge-Kutta-Fehlberg法 (デフォルト) と Adams-Moulton法 と Euler 法である。 Runge-Kutta-Fehlberg法 (デフォルト) と Adams-Moulton法 では、 ステップ幅の適応制御が行われる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 数学的基礎

まず、標準的な定義から解説する。 微分方程式は、形の不明な関数とその導関数を含む方程式である。 微分方程式は、 未知関数の独立変数が一つだけのとき微分方程式と呼ばれる。 ここでは独立変数を t で表す。 微分方程式の次数とは、方程式に含まれるもっとも高階の導関数の次数である。 複数の方程式が連立しているときは、微分方程式と呼ばれる。 ある方程式の他の方程式が従属している場合は、をなしていると言われる。 とは、方程式を満たす関数のことである。 初期値問題とは、ある値の独立変数について、 すべての未知関数とその導関数の値がわかっている、 という条件が与えられることである。 このような「初期条件」が与えられれば、解が一意に定まる。 解の存在性と一意性についての、専門用語による解説は入門書にもある (Birkhoff と Rota による Ordinary Differential Equations の Chapter 1 など。ode に関係のある他の文件については ode 微分方程式の解法 を参照のこと)。

現実の問題では、微分方程式の解は初等関数によっては表されないことが多い。 したがって、数値解を求めることになる。

初期値問題の数値解法は、関数の評価と算術演算だけを使った近似解法である。 ode は、以下の形式の一階の初期値問題を解くことができる。

 
x' = f(t,x,y,…,z)
y' = g(t,x,y,…,z)
   .
   .
   .
z' = h(t,x,y,…,z)

独立変数 t の初期値における各従属変数の初期値は、 以下のようにして与えられる。

 
x(a) = b
y(a) = c
     .
     .
     .
z(a) = d
t = a

ここで a,b,c,...,d は定数である。

ode で数値解が得られるようにするには、関数 f,g,…,h が一般的な演算子 (+, -, *, /, and ^) と ode が理解できる基礎的な関数を使って表現されている必要がある。 使える関数はプロット・プログラムの gnuplot が理解するものと同じである。 また ode は一階導関数が陰関数として表現されているような系は扱えないので、 関数 f,g,…,h は陽関数として表現されていなければならない。

実装されている数値解法はどれも、独立変数 tの離散的な点上における計算を行う。離散点の間隔はステップ幅 (連続する二つの t の値の距離) と呼ばれ、通常は h で表されるが、その値は固定、あるいは適応的に決定される。 一般的に、ステップ幅を小さくすると解の精度が向上する。 ode ではステップ幅を明示的に与えて計算させることもできる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 ode の使用例

以下の例で ode でどのようにして初期値問題を解くかを示す。 もしもう少し複雑なことがやりたい場合は、ode の記述言語 を参照するとよい。この節に ode 言語の仕様が述べられている。 また GNU plotting utilities の配布パッケージに ode の入力サンプルをあつめたディレクトリがある。 ほとんどのシステムではそれは、`/usr/share/ode'`/usr/local/share/ode' としてインストールされている。

最初の例は、以下の単純なものである。

 
y'(t) = y(t)

初期条件は以下である。

 
y(0) = 1

この微分方程式の解は、以下である。

 
y(t) = e^t.

数値計算の精度が 7 桁の場合は、以下のようになる。

 
y(1) = e^1 = 2.718282

コマンドラインで以下のように入力、実行すると、ode が計算する数値解が得られる。

 
ode
y' = y
y = 1
print t, y
step 0, 1

数値が2列で出力されるはずである。各行には独立変数 t と変数 y の値が表示される。t は 0 から 1 まで、ある幅で刻みながら進んでいるはずである。出力の最後の行は

 
1 2.718282

となるだろう。計算精度は `-p' オプションで変更できる。 たとえばもし、単に `ode' とするのではなく `ode -p 10' とすると、7 桁 (デフォルトの精度) ではなく 10 桁で数値が出力される。

ここまで出力した後、ode は次の入力を待つ。 そこで以下のように入力すると、

 
step 1, 0

また ty の値からなる2列の数値が出力される。 ただし t の値が 1 から 0 に 進んでいるはずである。また、

 
step 1, 2

と入力すると、t が減少するのではなく、増加する。ode の実行を終了するには、`.'、 つまり一つのピリオドとリターンを入力すればよい。 もしくは入力ストリームに EOF (end-of-file) があったときも ode は終了する。これは端末上で control-D を入力すればよい。

上の例では、入力の各行の意味は見て分かる通りである。step 文は独立変数 (ここでは t) の取る範囲の始点と終点を設定し、 ode はその範囲で数値解を計算する。 初期値は最初の step 文 (たとえば 0) と以下のような代入文

 
y = 1

が示すことになる。この場合、y(0) = 1 という初期条件を示したことになる。 `y' = y'`y = 1' という二つの文は、お互いに大きく違っている。 `y' = y'y の導関数の計算法を与え、 `y = 1'y の初期値を与える。 `step' 文が入力に現れたところで、ode は与えられた範囲内で独立変数のステップを進めて求解を行い始める。 ステップごとにどの変数を表示するかは、もっとも後に入力された `print' 文による。たとえば、

 
print t, y, y'

とすると独立変数 t の現在の値と、変数 y とその導関数の値を、ステップごとに表示する。

ode は入力全体あるいは最初の入力をファイルから受け取ることができる。 それを示すために、まず以下の内容のファイルがあるとする。

 
# an ode to Euler
y  = 1
y' = y
print t, y, y'

ファイル名を `euler' とする (`#' の行はコメント行で、入力のどこにあってもよい。`#' のある場所から行末までは、無視される)。 このファイルを ode に読み込ませるには、以下のようにする。

 
ode -f euler
step 0, 1

最初の行で ode はファイル `euler' を読み込み、次の行でステップを開始する。 この例では、0 から 1 までの t の各値について、 3つの数値 (tyy') が表示される。 ステップが最後まで進むと、ode は端末から次の文が入力されるのを待つ。 これは次の例で示す。このコマンド

 
ode -f euler

と、次のコマンド

 
ode < euler

では、ode の動作は異なる。後者では入力はすべてファイル `euler' から行われることになり、前者ではファイルを読み込んだ後、端末からの入力を待つ。 後者の場合は、ファイルの最後に `step' 文がないと結果が出力されないが、 `.' をファイルに書いておく必要はない。 `.' は端末からの入力を終了するときにだけ用いられる。

次に、二階の微分方程式の数値解を求める例を示す。以下の初期値問題を考える。

 
y''(t) = -y(t)
y(0) = 0
y'(0) = 1

この解析解は以下である。

 
y(t) = sin(t)

ode でこの問題を解くには、二階の微分方程式を二つの一階の方程式で書き直す必要がある。 そのためには独立変数t の別の関数、ここでは yp とする、を新たに導入する。以下のようにすると、

 
y' = yp
yp' = -y

この微分方程式系は、一つの微分方程式だった問題と等価である。 このようにして n 次の方程式を一階の問題に書き直すのは、 よく行われるテクニックである。

変数 t の関数として y をプロットするには、 以下のような内容のファイルを作るとよい。

 
# sine : y''(t) = -y(t), y(0) = 0, y'(0) = 1
sine' = cosine
cosine' = -sine
sine = 0
cosine = 1
print t, sine

(yypsine and cosine に書き直している。 解析解がそうなるからである。) このファイルを `sine' とする。生成されたデータを X Window システムのディスプレイで表示するには、以下のようにする。

 
ode -f sine | graph -T X -x 0 10 -y -1 1
step 0, 2*PI
.

上の例の ode のところを入力した後、graph -T X でウィンドウがポップアップし、`step' 文を入力するとそのウィンドウ内にデータが描画される。 `-x 0 10' および `-y -1 1' オプションは両座標軸の範囲を指定する。 リアルタイム・プロットを行うときにはプロットされる点が後から入力されるため、 このオプションが必要になる。 もし座標軸の描画範囲がコマンドラインで指定されなかったときは、 graph -T X はすべてのデータが入力され終わるのを待ってから プロット範囲を決定して、 描画を行う。

上の例を少し変更して、ode にどのようにして複数のデータセットを生成させて graph にプロットさせるかを示す。 端末上で、以下の入力をするとする。

 
ode -f sine | graph -T X -C -x 0 10 -y -1 1
step 0, PI
step PI, 2*PI
step 2*PI, 3*PI
.

すると、正弦曲線が3回に分けて描かれる。`step' 文による出力の最後には空行があるため、graph -T X はそれぞれの `step' 文による出力を別のデータセットであると見なす。 カラーディスプレイ上では、3つの各部分が異なった色で表示されるだろう。これは graph の、 データセットが読み込まれるごとにラインモードを変更していく機能によるものである。 この機能を無効にしたいときは、graph -T X の代わりに graph -T X -B とするとよい。

上の例では graph -T X の代わりに graph の他の出力デバイスを使ってもよい。たとえば以下のように graph -T ps とすると EPS (encapsulated Postscript) 形式の出力が得られる。

 
ode -f sine | graph -T ps > plot.ps
step 0, 2*PI
.

graph の出力デバイスのうち、 graph -T pnmgraph -T gifgraph -T aigraph -T psgraph -T figgraph -T pclgraph -T hpgl では、たとえ `-x' および `-y' オプションを指定しても、 リアルタイム・プロットはできない。 したがってこの 7 種類の出力デバイスのどれかを使うときは、ode コマンドに `.' を入力してすべての入力が終わってからしか、 プロットは生成されない。

上の例では従属変数の導関数は比較的簡単な形であった。しかし任意の、 もっと複雑に従属変数と独立変数が組合わさった形でもよい。それには ode に組み込まれている関数が使える。 abssqrtexploglog10sincostanasinacosatansinhcoshtanhasinhacoshatanh などが組み込まれている。ほかにもあまり多くは使われないが、 besj0besj1besy0besy1erferfcinverflgammagammanorminvnormibetaigamma も組み込まれている。 これらはプロット・プログラムの gnuplot と同じに定義されている (引数を3つ取る ibeta、2つ取る igamma 以外はすべて引数は一つである)。 また ode は上で示したように、 `PI' の値も正しく理解する。 上に列挙した `cos'`sin' などの関数の名前は予約語であり、 したがって変数名としては使えない。

予約名とキーワードによる制限以外は、変数名は任意に付けることができる。 英字で始まる英数字からなる文字列が、名前として使える。最初の 32 文字だけに意味がある。 微分方程式や初期値の代入文の左辺に現れない唯一の変数が独立変数であることから、 ode がどれが独立変数かを特定できる、ということが非常に重要である。 そういう変数が複数あると、ステップを進められず、エラーメッセージが表示される。 またそういった変数がない場合は、ode の内部で代わりに `(indep)' という名前のダミーの独立変数が使われる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 さらに ode の使用例

ここに、ode の他の機能の使用例を示すが、 以下の例だけですべての機能を網羅できるわけではない。 コマンドライン・オプションのリストについては ode のコマンドライン・オプション を参照のこと。

非常に美しいプロットを ode を使って得ることは、 たいして難しいことではない。以下にストレンジ・アトラクタ、 またはローレンツ・アトラクタをプロットする例を示す。ファイル `lorenz' に以下の内容が書き込んであるとする。

 
# The Lorenz model, a system of three coupled ODE's with parameter r.
x' = -3*(x-y)
y' = -x*z+r*x-y
z' = x*y-z

r = 26
x = 0; y = 1; z = 0

print x, y
step 0, 200

そこで以下のコマンドを実行すると、

 
ode < lorenz | graph -T X -C -x -10 10 -y -10 10

ローレンツ・アトラクタのプロットが表示される (厳密に言うと、このプロットはそれを二次元に投影したものである)。 以下のようにすれば、このプロットを PostScript に変換して、プリンタで印刷できる。

 
ode < lorenz | graph -T ps -x -10 10 -y -10 10 -W 0 | lpr

`-W 0' (太さを 0 にする) オプションで graph -T ps にもっとも細い線で描画するように指示している。 プリンタなどの PostScript デバイスでは、こうするときれいに表示できる。

リアルタイムで進むものをプロットするとき、 複数の入力文をどのようにすれば一行で入力できるかが、 ローレンツ・アトラクタの例のセミコロンの部分を見るとわかる。 この例ではまた、定数を記号で表す方法も示されている。 ode の入力としては、パラメータ rxy、および z といった他の変数と同じである。 しかしそれらと違って、ステップが進んでも r の値は一定のままである。 それは導関数 r' の式が与えられていないからである。

次の例では対話的に「位相平面」を描く方法を示す。 それは、異なる初期値から得られる解曲線の集合である。 位相平面は、微分方程式の性質を見る上でもっともよい方法であり、 外見的にも美しい。

ode に与える入力には `step' 文はいくつあってもよいため、 複数の解曲線が ode を一度実行するだけで得られる。 各 `step' 文の前、最後に読み込まれた `print' 文が出力に使われる。 実際に位相平面を描くには、どの解曲線を使って描くか、 慎重に選ぶ必要がある。 そのためにはリアルタイム・プロットを使って重要そうな解をすべてプロットし、 試行錯誤を行って決める必要があるだろう。

例として、 被食者と捕食者の関係のモデルに使われるロトカ=ヴォルテラ・モデルを使う。 湖に、A (被食者)および B (捕食者)という二種類の魚がいるとする。 被食者は豊富に生えている植物を食べて生きていて、捕食者は被食者を食べている。 x(t) を被食者の個体数、y(t) を捕食者の個体数で、ともに時間 t の関数とする。A と B の単純な関係のモデルは、以下の式で与えられる。

 
x' = x(a-by)
y' = y(cx-d)

a, b, c, d は正の定数である。この微分方程式系の位相平面を描くには、 以下のようにすればよい。

 
ode | graph -T X -C -x 0 5 -y 0 5
x' = (a - b*y) * x
y' = (c*x - d) * y
a = 1; b = 1; c = 1; d = 1;
print x, y
x = 1; y = 2
step 0, 10
x = 1; y = 3
step 0, 10
x = 1; y = 4
step 0, 10
x = 1; y = 5
step 0, 10
.

`step' 文ごとに1つの曲線が、合計4本の曲線が連続して描かれる。 これらは周期的である。その周期性は、被食者と捕食者の個体数が、 実際の自然環境下で上下する周期と同様である。 カラーディスプレイ上では各曲線は異なる色で描かれる。これは、graph がデフォルトではデータセットごとに違うラインモードを使うからである。 この機能を無効にしたいときは、graph -T X ではなく graph -T X -B とすればよい。

odegraph で離散点をプロットする時、それらを線で結ばない方がよいような場合もある。 3つ目の例として、そのやり方を示す。ファイル `atwoods' に以下の内容が書き込んであるとする。

 
m = 1
M = 1.0625
a = 0.5; adot = 0
l = 10; ldot = 0

ldot' = ( m * l * adot * adot - M * 9.8 + m * 9.8 * cos(a) ) / (m + M)
l'    = ldot
adot' = (-1/l) * (9.8 * sin(a) +  2 * adot * ldot)
a'    = adot

print l, ldot
step 0, 400

最初の数行は揺れるアトウッドの器械と呼ばれる、 一種の振り子を表現する関数の記述である。 通常のアトウッドの器械は、滑車に掛けられたたるみのない糸の両端に、 重りがそれぞれぶら下がっている、というものである。 重い方の重りの質量が通常 M で、軽い方が m と表され、軽い方が上に引っ張られていく。 揺れるアトウッドの器械は、軽い方の重りが、上下方向だけでなく 前後に揺れることもある、としたものである。

`print l, ldot' 文は、軽い方の重りの上下方向の位置と速度を、 各ステップごとに表示させる。以下のコマンドを実行すると、

 
ode < atwoods | graph -T X -x 9 11 -y -1 1 -m 0 -S 1 -X l -Y ldot

リアルタイム・プロットが得られる。`-m 0' オプションで連続するデータ点が線で結ばれないようにしている。`-S 1' オプションで記号 #1 (点) で各データ点をプロットするように指示している。 このコマンドを実行すると分かるように、 重い方の重りが軽い方に「勝つ」わけではない。この器械の動きは周期的ではない。 周期的ではないため、プロットは線で結ばないほうがよい。

最後に、おかしなことが起こっていて様子を見たいときに便利ないくつかの ode の機能を例示する。その一つは `examine' 文である。 これは微分方程式系のどれかの変数について、直接的に情報を得るのに役に立つだろう。 詳細は ode の記述言語 を参照のこと。

これの他に、`print' を使って、 単なる変数の値だけでなくもっと詳しい情報を表示させることができる。 既に例に出ているが、変数名に `'' を付けるとその変数の導関数値が表示される。同様に変数名に `?'`!'`‾' を付けるとそれぞれ1ステップでの相対誤差、1ステップでの絶対誤差、 累積誤差 (現在まだ実装されていない) が表示される。これらについては 数値誤差 参照のこと。

前出の例で示したように、`print' 文ではもっと複雑な表示もできる。 その一般的な書式は、

 
print <pr-list> [every <const>] [from <const>]

`[…]' のカッコに囲まれた部分は、必ずしも指定しなくてもよい。 ここまでの例では `every' 節と `from' 節のことは出てきていない。 <pr-list> はよく使うが、これはコンマで区切られた変数のリストである。 たとえば以下の文では

 
print t, y, y' every 5 from 1

<pr-list><t, y, y'> である。`every 5'`from 1' いう節は、変数値の表示を5ステップおきに、また独立変数 t の値が 1 になってから 行うことを指示している。`every' 節は `step' 文による出力をすっきりさせたいときに、 `from' 節は解曲線の最後の方だけが必要なときに、それぞれ便利である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 ode のコマンドライン・オプション

以下に ode に指定できるコマンドライン・オプションを列挙する。 コマンドライン・オプションには、3種類ある。

  1. 入力の読み込まれ方を指定するオプション。
  2. 出力形式に関するオプション。
  3. 求解アルゴリズムと、そのアルゴリズムでの許容誤差の指定方法に関するオプション。
  4. 情報を表示させるオプション。

以下のオプションで、入力の読み込まれ方を指定する。

`-f filename'
`--input-file filename'

標準入力から読み込む前に、filename から読み込む。

以下のオプションで、出力形式に関する指定を行う。

`-p significant-digits'
`--precision significant-digits'

(正の整数、デフォルトは 6) 数値解を表示するときの精度を significant-digits で指定する。 もしこのオプションが指定されていれば、結果は指数表記される。

`-t'
`--title'

出力の最初にタイトル行として、各カラムの意味を表示する。 もしこのオプションが指定されていれば、結果は指数表記される。

以下のオプションは、求解アルゴリズムに関するものである。3つの基本オプション `-R'`-A'`-E' のうちの一つだけを指定できる。 デフォルトは `-R' (Runge-Kutta-Fehlberg) である。

`-R [stepsize]'
`--runge-kutta [stepsize]'

5次の Runge-Kutta-Fehlberg 法を使う。固定のステップ幅 stepsize を指定しない限り、ステップ幅は適応的に決定される。固定のステップ幅を指定し、 許容誤差の指定も行わない場合、古典的な4次の Runge-Kutta 法が使われる。

`-A [stepsize]'
`--adams-moulton [stepsize]'

4次のr Adams-Moulton の予測子-修正子法を使う。固定のステップ幅 stepsize を指定しない限り、ステップ幅は適応的に決定される。 通過した点が「悪い」と判定されたとき (があれば)、Runge-Kutta-Fehlberg 法を使う。

`-E [stepsize]'
`--euler [stepsize]'

手っ取り早いが精度の悪いオイラー法を使う。ステップ幅は固定である。stepsize のデフォルト値は 0.1 である。精度を必要とする場合にはお勧めできない。

`-r'`-e' という許容誤差を指定するオプション (後述) があるが、 `-E' が指定されているときには使うことはないだろう。

`-h hmin [hmax]'
`--step-size-bound hmin [hmax]'

ステップ幅の下限を hmin にする。どの求解アルゴリズムを使っていても、 ステップ幅が hmin になることはなくなる。デフォルトでは、 ステップ幅はそのプラットフォームの精度限界まで小さくなれるようになっている。 たとえば倍精度浮動小数点実数の、非零であるようなもっとも小さな値である。 オプションに hmax も指定された場合は、ステップ幅の上限も指定される。 これにより、詳しく見たい領域を、 求解アルゴリズムがおおざっぱに飛ばしていってしまうことを避けられる。

以下のオプションは、許容誤差の指定を行うことを指示するものである。

`-r rmax [rmin]'
`--relative-error-bound rmax [rmin]'
`-e emax [emin]'
`--absolute-error-bound emax [emin]'

`-r' オプションは1ステップでの最大許容相対誤差を指定する。 `-r' オプションが指定されているときは、どの従属変数でもその相対誤差が 1ステップで rmax (デフォルトでは 10^(-9)) を超えることがないようにされる。 誤差がそれより大きくなったときには、その解は捨てられ、 エラーメッセージが表示される。 ステップ幅が固定でないときには、「適応的に」ステップ幅が縮められる。 そうすることで、相対誤差が指定値よりも小さくなる。したがって、 許容誤差を小さく指定すると、それだけステップ幅も小さくなる。 下限値 rmin も指定できる。 これにより、ステップ幅をある程度の大きさにしておくことができる (デフォルトでは rminrmax/1000 である)。 `-e' オプションは `-r' とほとんど同じだが、相対誤差ではなく絶対誤差を指定する。

`-s'
`--suppress-error-bound'

ステップ誤差 (1ステップ生じたと推定される計算誤差) の許容限度の指定をなくす。 これにより、ステップ誤差が許容範囲を超えてしまうような場合でも、ode は求解を続けることができる。これを指定すると、 数値計算の誤差が大きくなることがある。

最後に、情報を表示するためのオプションを挙げる。

`--help'

コマンドライン・オプションのリストを表示、そのまま終了する。

`--version'

ode とこの plotting utilitie パッケージのバージョン番号を表示して、そのまま終了する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.5 診断メッセージ

ode は常に、以下の二種類の状態のどちらかにある。

ode は、`step' 文が入力されたときに最初の状態から二つ目の状態に遷移する。 出力が終わった時点で最初の状態に戻る。「読み込み」および「求解」 のどちらの状態でも、エラーが発生したら計算を中断するか、 ode の実行を終了することがある。以下に生じうるエラーについて説明する。

入力を読み込んでいるとき、ode では構文エラーが発生することがある。 これは入力に文法の間違いがあって、ode が構文解析を行えないことを示す (構文の詳細については ode の記述言語 を参照のこと)。 この場合、以下のエラーメッセージが表示される。

 
ode::nnn: syntax error

`nnn' は文法の街があるとされる行の番号である。`-f filename' で入力ファイルを指定しているときは、エラーメッセージは以下のようになる。

 
ode:filename:nnn: syntax error

ファイルからの読み込みが終わって標準入力からの読み込みに切り替わると、 表示される行番号はまた 1 からはじまる。

入力に文法の間違いがあっても、それから回復するような動作は一切行わない。 しかし同期をとろうとはするので、入力ファイル中に複数の間違いがあっても、 それらをできるだけ一度に表示する。

また数値計算上、致命的な演算例外 (零除算や浮動小数点のオーバーフローなど) が ode での入力中に発生することもある。そういったときは ode は "Floating point exception" エラーメッセージを表示し、終了する。 演算例外はプラットフォーム依存である。いくつかのプラットフォームでは、 以下の行

 
y = 1/0

は演算例外を発生する。またいくつかのプラットフォームでは (上のと同じプラットフォームとは限らない)、以下の行

 
y = 1e100
z = y^4

も演算例外を発生する。多くのプラットフォームでは、ode が内部で使う倍精度実数の大きさが約 1.8x10^308 に制限されているためである。

ode が「求解」状態にあるとき、たとえば数値解を計算しているときも、 同様の演算例外が発生しうる。その場合求解は中断され、 以下のようなメッセージが表示される。

 
ode: arithmetic exception while calculating y'

しかし ode の実行自体は終了しない。例外は「キャッチ」される。 ode 自身はいくつかの例外を認識し、キャッチする。 負の数の平方根、非正数の対数、非正数の負の数乗、である。 ode はこれらの演算が実行されてしまう前にキャッチし、 生じた不正な演算はどれかを示すエラーメッセージを表示する。

 
ode: square root of a negative number while calculating y'

これが、この種のエラーメッセージの典型例である。

ode を実行しているプラットフォームで `matherr' 機能が有効で、 標準の数学関数の計算で生じたエラーを表示できるような場合、これが利用される。 この機能を使うと、`log'`gamma' といった関数の評価時に、 それが実際に評価される前にドメイン・エラーや範囲エラー (オーバーフロー、 アンダーフロー、精度落ち) が報告される。`matherr' 機能が有効なら、 エラーメッセージではもっと多くの情報が表示される。たとえば

 
ode: range error (overflow) in lgamma while calculating y'

というエラーメッセージでは、対数ガンマ関数 `lgamma' が評価されればその引数が大きすぎたであろうことが表示されている。 アンダーフローの警告以外のエラーメッセージが表示されたときは、求解を中断する。

他の種類のエラーも、求解中には発生しうる。 `-r'`-e' オプションが指定されているとき、 切り上げられた誤差が許容範囲を超えてしまうような場合である。 これが発生した数値解は捨てられ、ode のステップはエラーが発生する前の点に戻る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.6 数値誤差

ここでの議論は必然的に結論が出ないものである。議論の各主題 (浮動小数点エラーなど) について、それぞれ参考になる書籍がある。 ここでは中庸を目指すことにする。最初に、ode で実装されている誤差解析の基本的な考え方について、次に、 よくある落とし穴を避ける方法について述べる。以下の議論を読む前に、 数値解析の本 (たとえば Atkinson のIntroduction to Numerical Analysis など) を読んでおくとよい。

最初に靴かの定義を述べておく。もっとも問題になる誤差は、 真の解と近似的な数値解法との差異である。これは累積誤差と呼ばれる。 求解の各ステップで積み重ねられていくからである。 困ったことに、普通は真の解が分からないと累積誤差を見積もることもできない。 しかし、誤差の見当をつける方法もいくつかある。 特に、1ステップ求解を進めたときに生じる真の解と近似数値解の誤差、 つまりステップ誤差は、 最初のステップにおいては正しく求められると仮定できる。

相対ステップ誤差は、ステップ誤差をその点の近似数値解で除した値である。 真の解の値は正確には分からないので、除算には近似解をつかうしかない。 ステップ幅が適応的に決められるアルゴリズムを使う時、ode は相対ステップ誤差に基づいてステップ幅を決定する。 デフォルトでは、各ステップで 8 桁の精度を維持できるようにステップ幅を選ぶ。 これはつまり、相対ステップ誤差が許容誤差 10^(-9) を超えないようにステップ幅を選ぶということである。 このステップ幅の切り上げは、 `-r' オプションで調整することができる。

数値誤差の生じる原因には、2種類ある。 一つ目は、計算機での数値演算では精度が有限である、ということである。 すべての計算機は、本物の実数の代わりに浮動小数点実数を使って計算を行う。 これは実数を近似するものでしかない。ode ではしかし、内部での演算にはすべて倍精度実数を使っているので、 比較的誤差は小さいと言える。それでも、`-p 17' オプションを使って 17 桁で計算結果を出力すれば、本物の実数と浮動小数点実数の違いを見ることができる。 ほとんどの計算機では、倍精度実数の精度は 17 桁だからである。

二つ目は理論打ち切り誤差と呼ばれるものである。 これは真の解と、求解に用いられるアルゴリズムに起因する近似値との差異である。 たとえば平方根の値を求めるアルゴリズムは、ほとんどの場合無限級数展開を使う。 計算機では無限級数をそのままは扱えないので、 数値解法では級数を、または項の計算を途中で打ち切る必要がある。 ステップ誤差はこの打ち切り誤差と浮動小数点誤差の二つをあわせたものである。 しかし現実的には浮動小数点誤差はあまり問題にならないので、ode は打ち切り誤差だけからステップ誤差の値を推定する。

ある種の初期値問題では、ステップ幅を小さくすれば、 求解を行う区間全体にわたる誤差の累積値を小さくすることができる。 少なくともある範囲内のステップ幅でそうであれば、 そのときこの求解アルゴリズムは「安定」であると言われる。この意味で、 Runge-Kutta-Fehlberg (`-R') 法と Adams-Moulton (`-A') 法は多くの場合、(原理的にではなく経験的に) 安定である。

これらの議論をふまえて、 数値的な求解において累積誤差や不安定性の生じる主な原因を以下に挙げる。 累積誤差が大きくなったり不安定になったりする系は普通、 「悪い点」に近いところでステップ誤差が大きくなることに起因する。

  1. 特異点。

    ode での求解は、特異点を含む区間で行うべきではない。 ode は解こうとしている微分方程式系の特異点や、 未定義である点をまたぐようなステップをとろうとするべきではない。

    特異点、正則な特異点、正則でない特異点などの定義は、 微分方程式に関する本に解説されている。いい本が見つからなければ、 Birkhoff と Rota によるOrdinary Differential Equations の Chapter 9 を読むとよい。ode で求解をしようとする前に、どんな系でも、 まず特異点の場所と種類をよく調べるべきである。

  2. 不良設定問題。

    対象とする区間全体において ode で精密な解を得ようとするなら、 その区間において真の解が定義されていてその振る舞いの性質がよいことが求められる。 また真の解は実数でなければならない。これらの条件のどれかが成立しない場合、 その問題は「不良設定」である、と呼ばれる。 区間内での振る舞いがよくても不良設定となる場合もある。 たとえばステップ幅が突然、精度限界近くまで小さくなったり、 近似数値解の値が急上昇したりといったおかしな計算結果が得られる場合も、 不良設定であることを示している。

    以下の、一見問題のなさそうな系が不良設定問題 (解が定義されないところがある) のよい例である。

     
    y' = y^2
    y(1) = -1
    

    この解は t > 0 で定義される、以下の関数である。

     
    y(t) = -1/t.
    

    この問題では数値解は t=0 を含む区間では計算できない。 `step' 文を以下のように入力すると、それがわかる。

     
    step 1, -1
    

    ode はどのように振る舞うだろうか?

    もうひとつ不良設定問題の例を挙げる。以下の系

     
    y'=1/y
    

    y=0 で未定義となる。一般解は

     
    y = +/- (2(t-C))^(1/2),
    

    であり、y(2)=2 という条件を与えると解は (2t)^(1/2) となる。 `step' 文で指定される区間に t が負の領域が含まれていると、 その領域では求解は正しく行われない。

    一般的に、ステップ幅を固定するときは、 悪い点をまたぐことのないようにするべきである。 ステップ幅の適応制御を行うときは、ode が悪い点を見つけることもあるが、 いつも見つけられるとは限らない。

  3. 臨界点。

    微分方程式の右辺に明示的に独立変数を含まないような系を自励系と呼ぶ。 自励系の臨界点とは、右辺がすべて零になる点のことである。たとえば以下の系

     
    y' = 2x
    x' = 2y
    

    では、(x,y) = (0,0) の一点だけが臨界点である。

    臨界点はまた、よどみ点とも呼ばれる。 それは、系がその近くの点にあると、激しい挙動を示すことがあるが、 その点上にある系はずっとそのままだからである。 環境によっては、臨界点近くを通ると累積誤差が大きくなることがある。

    実際に上の系を ode を使って、 x(0) = y(0) = 0 という初期条件の元で解いてみると、時間が進んでも解は一定値のままである。 初期値を臨界点の近くの別の点に動かしてみると、どうなるだろうか。

    ode で求解をしようとする前に、どんな系でも、 まず臨界点の場所をよく調べるべきである。臨界点にはいくつもの種類 (平衡点、渦点、不安定点、安定点、その他) があり、 種類が分かると有益なことがある。臨界点についての詳細は、 微分方程式の性質についての本をみると解説してある (たとえば Birkhoff と Rota の Ordinary Differential Equations, Chapter 6 など)。

  4. 不適切なアルゴリズム

    ode の計算結果が不安定な挙動を示したり、 ステップ誤差をある程度の範囲内に抑えるためにステップ幅が、 極端に小さくなったりしたときは、 単に求解アルゴリズムがその問題に適していないのかもしれない。 たとえば、「硬い」系をうまく解けるような数値解法は現在、ode には実装されていない。

    以下の例で、硬い系とはどのようなものが見ることができる。

     
    y' = -100 + 100t + 1
    y(0) = 1
    

    区間は [0,1] とする。厳密解は

     
    y(t) = e^(-100t) + t.
    

    である。ode で求解アルゴリズム、ステップ幅、許容相対ステップ誤差を様々に変えて、 得られる解曲線と厳密解を比較してみるとよい。

ode の計算した近似数値解の精度を、手軽におおざっぱに確認してみる方法も、 いくつかある。順番に解説する。

  1. 解曲線の安定性を見る: 曲線は収束していってるか?

    これは、ステップ幅の調整が解曲線にどう影響しているかを見るということである。 ステップ幅が小さくなると曲線は収束しているはずである。そうなってない場合は、 ステップ幅が十分に小さくなっていないか、求解アルゴリズムが適切でない、 ということである。実際には、以下のようにするといいだろう。

    これを試してみる例を以下に示す。以下の内容を含む `qcd' というファイルがあるとする。

     
    # an equation arising in QCD (quantum chromodynamics)
    f'   = fp
    fp'  = -f*g^2
    g'   = gp
    gp'  = g*f^2
    f = 0; fp = -1; g = 1; gp = -1
    
    print t, f
    step 0, 5
    

    次に、以下の内容を持つ `stability' というファイルを作る。

     
    : sserr is the bound on the relative single-step error
    for sserr
    do
    ode -r $sserr < qcd
    done | spline -n 500 | graph -T X -C
    

    ファイル `stability' は「シェル・スクリプト」であり、 許容相対ステップ誤差の指定値を変えながら、解曲線を重ねて描いていく。 以下のように実行する。

     
    sh stability 1 .1 .01 .001
    

    指定された許容誤差の場合の解曲線がそれぞれ描かれる。 どう収束していくのか、つまり安定性を見て取ることができる。

  2. 系の中の不変量: それは定数か?

    不変量を含む系は多数ある。 たとえば物理学においてなんらかの「保存則」の数理モデルがあるとすると エネルギー (その系の従属変数の関数) は時間の経過によっては変化しない。 一般に、従属変数の振る舞いがどういった性質なのかが分かっていれば、 解の性質を調べるのに有利である。

  3. 解曲線の「族」: それらは発散していくか?

    問題としている系の初期値を様々に変えることで、解曲線の曲線族が得られるが、 それを見ると誤差がどのように累積していくか、おおざっぱに見ることができる。 それがはっきりと発散する場合、つまり非常に近い初期値から始まっているのに、 区間の終端ではかなり離れた値になる場合、その解曲線はおかしいのかもしれない。 一方で解曲線があまり離れていかない場合、区間全体に渡って誤差は、 あらゆる可能性において、その桁が変わるほどには増えていないということである。 そういった、近い点から出発した解がさほど大きく離れていかないような系は、 良設定であると言われることがある。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.7 実行時間

ode が微分方程式系を数値的に解くのにかかる時間は、 多くの要因に左右される。そのうちのいくつかを挙げると、 含まれる方程式の数、方程式の複雑さ (演算子の個数や性質)、 求解アルゴリズムがとるステップの数 (ステップ幅は、固定でなければ、 決めるのに非常に複雑な計算が必要である) などである。 時間を無駄にせずに求解にかかる時間を見積もるには、短い区間で、 あるいは低い精度で計算時間をはかってみるのがよい。それは、 ステップを2回進めるのにかかる時間は1回の時間の2倍程度であろうこと、 および指定された許容相対誤差とステップ数にはなんからの関係があるだろう、 ということから考えられる。そのなんらかの関係は、 求解アルゴリズムや系の「硬さ」、また許容相対誤差自体によって決まるものだろう。 注意深く考えて数回実行してみれば、その関係の見当をつけることができ、 区間全体で要求精度で計算するとどの程度の時間がかかるかを反映するような、 精度の低い求解をその区間でやってみることができるだろう。 最後に、データが大量に出力されるときは、 解の計算自体よりも画面への出力に時間がかかっている、 というのもありがちなことである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.8 ode の記述言語

以下に ode が入力として受け付ける言語の仕様を、 バッカス・ナウア記法で示す。文法における非終端記号は <カッコ> で示す。 終端記号は大文字のみで示す。カッコのない語や記号は、そのままを表す。

 
<program>    ::=        ... empty ...
               |  <program> <statement>


<statement>  ::=  SEP
               |  IDENTIFIER = <const> SEP
               |  IDENTIFIER ' = <expression> SEP
               |  print <printlist> <optevery> <optfrom> SEP
               |  step <const> , <const> , <const> SEP
               |  step <const> , <const> SEP
               |  examine IDENTIFIER SEP


<printlist>  ::=  <printitem>
               |  <printlist> , <printitem>


<printitem>  ::=  IDENTIFIER
               |  IDENTIFIER '
               |  IDENTIFIER ?
               |  IDENTIFIER !
               |  IDENTIFIER ‾


<optevery>   ::=        ... empty ...
               |  every <const>


<optfrom>    ::=        ... empty ...
               |  from <const>


<const>      ::=  <expression>


<expression> ::=  ( <expression> )
               |  <expression> + <expression>
               |  <expression> - <expression>
               |  <expression> * <expression>
               |  <expression> / <expression>
               |  <expression> ^ <expression>
               |  FUNCTION ( <expression> )
               |  - <expression>
               |  NUMBER
               |  IDENTIFIER

この文法には曖昧さがまだ残っている。 そこで演算子の結合の優先順位を以下の表に示す。 表の上の演算子ほど優先して結合される。

 
Class           Operators    Associativity

Exponential         ^            right
Multiplicative      * /          left
Additive            + -          left

文法中に示されているように、自明でない文が6種類ある。 各種類の「意味付け」を順番に説明する。

  1. IDENTIFIER ' = <expression>

    一階の微分方程式を定義する。IDENTIFIER の導関数が <expression> で指定される。動的変数がこの形式の左辺に現れない場合は、 その導関数は 0 のままであると仮定される。その場合、それは記号定数となる。

  2. IDENTIFIER = <const>

    IDENTIFIER の値を <expression> の現在の値にする。 この文で初期化されていない動的変数は、0 になる。

  3. step <const> , <const>
  4. step <const> , <const> , <const>

    `step' 文で求解アルゴリズムが実行される。最初の <const> は独立変数の初期値である。二つ目は求解を行う区間の終端の独立変数値である。 三つ目はステップ幅である。ステップ幅が与えられたときは、 コマンドラインで指定されていたステップ幅をこの指定で上書きする。 ステップ幅はあまり指定されず、 求解アルゴリズムによって適応的に決定されることが多い。

  5. print <printlist> [ every <const> ] [ from <const> ]

    `print' 文ではどの数値をいつ出力するかを指定する。<printlist> はコンマで区切られた IDENTIFIER のリストで、各 IDENTIFIER の後ろに `'' を付けて導関数であることを、 `?' を付けて相対ステップ誤差であることを、 `!' を付けて絶対ステップ誤差であることを、 `‾' を付けて累積誤差であることを示すことができる (最後のは未実装)。 指定された値は、指定された順序で出力される。`every' 節と `from' 節は指定してもしなくてもよい。`every' 節を指定すると <const> ごとに指定された値が出力される。デフォルトは毎ステップ (つまり `every 1') である。最初と最後のステップでの値は、かならず表示される。もし `from' 節があった場合、独立変数の値が <const> を超えてからはじめて出力が行われる。 デフォルトでは、ステップ開始と同時に出力が始まる。

    `print' 文が現れない場合は、 与えられた微分方程式系の独立変数とすべての従属変数が表示される。 最初に表示されるのは独立変数である。 従属変数は、方程式系で定義されている順に表示される。

  6. examine IDENTIFIER

    `examine' 文は実行されると、名前の与えられた変数に関する詳しい情報が表の形で表示される。 たとえば、どこかで出てきた `ode to Euler' の例を実行したときに `examine y' とすると、以下のような情報を表示する。

     
    "y" is a dynamic variable
    value:2.718282
    prime:2.718282
    sserr:1.121662e-09
    aberr:3.245638e-09
    acerr:0
     code:  push "y"
    

    `dynamic variable' (動的変数) という言葉は、y の挙動を記述する微分方程式が系の中にある、という意味である。 また表示されている数値の意味はそれぞれ、以下の通りである。

    value

    現在のその変数の値。

    prime

    現在のその変数の導関数値。

    sserr

    最後のステップにおける、その変数の相対ステップ誤差。

    aberr

    最後のステップにおける、その変数の絶対ステップ誤差。

    acerr

    最後に実行された `step' 文による求解での累積誤差。 この機能は現在はまだ実装されていない。

    `code' で表示されている部分は y の導関数値を計算するために必要な一連のスタック操作のリストである (往年の逆ポーランド式電卓のようなものである)。 ここをみれば、導関数値の計算が正確にはどのように行われるのか、 その計算にかかるメモリや時間はどの程度か、が分かる。`push "y"'y の値をスタックに積むことを表す。この系の場合は、 導関数値を計算するのに必要な操作はこれですべてである。

ode 入力言語の文法には、4種類の終端記号がある。 FUNCTIONIDENTIFIERNUMBER、および SEP である。 以下にその意味を示す。

  1. FUNCTION

    abssqrtexploglnlog10sincostanasinacosatansinhcoshtanhasinhacoshatanhfloorceilbesj0besj1besy0besy1erferfcinverflgammagammanorminvnormibetaigamma のうちの一つである。 これらはプロット・プログラムの gnuplot の同盟の関数と同じに定義されている。ibeta は3つの、igamma は2つの引数を取るが、他の関数の引数はすべて1つである。 三角関数の引数はラジアン単位で与える。atan 関数は -PI/2 以上 PI/2 以下の値を返すようになっている。

  2. IDENTIFIER

    英字で始まり英数字からなる文字列である。最初の 32 文字だけに意味がある。 大文字と小文字は別のものとして扱われる。この識別子名の中では、下線 (アンダースコア) は英字の一種として扱われる。 関数名やキーワード、および `PI' は識別子名に使わない。

  3. NUMBER

    数字からなる空でない文字列。小数点、指数部を含んでいてもよい。指数部は `e' または `E' に 1 個から 3 個のいずれかの個数の数字を続けたものである。 一つ目の数字の前には符号がついていてもよい。 数字はすべて十進数として扱われる。 数値としては空白を含んでいてはならない。`PI' は数値である。

  4. SEP

    区切り文字。セミコロンか、エスケープされてない改行。

ode 入力言語では大文字と小文字は別の文字である。`#' から行末まではコメントとして無視される。長い行は分割できる。その際、 上になった行の行末にはバックスラッシュ (`\') を置く。これは、 バックスラッシュと改行が連続している時、 その二つを一つの空白文字と等価であると見なすからである。

入力中で識別し、数値、キーワードを他のものと分離するために、 空白文字とタブを使う。区切り文字と同様これらは例外的に扱われ、つまり無視される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.9 ode 微分方程式の解法


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9. libplot ライブラリ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.1 libplot プログラミング

GNU libplot は、ベクター形式の二次元画像を描くための、 フリーのライブラリである。 二重のバッファを使った滑らかなアニメーションを X Windows システム上に表示することができ、 また画像を様々なフォーマットに書き出すことができる。 実装している関数の API (application programming interface) が出力する画像形式やディスプレイの種類によらないという意味で、 このライブラリは特定のデバイスに依存しない、と言える。

C、C++ その他の言語からこのライブラリを利用することができる。 もっともよく使われるのは C バインディングであり、これが libplot と呼ばれる。また C++ バインディングは、libplot と分けて呼ばねばならないときは libplotter と呼ばれる。 この章では libplot という名前はバインディングとは関係なく このライブラリそのものをさす名前として用いる。

libplot が描ける描画オブジェクトには、曲線、円と楕円、点、記号、 サイズを調整したラベル (ちょうどいい大きさの文字列) がある。 曲線とは、線分がつながったもの、円弧、楕円の弧、二次のベジェ曲線、 三次のベジェ曲線の組み合わせである。曲線には、閉曲線とそうでないものが描ける。 閉曲線、円、楕円については、塗りつぶしができる。 塗りつぶしの色はペンの色と同様に、また塗りつぶしのパターンも指定できる。 PostScript 言語風の、描画オブジェクトのスタックを管理する機能もあり、 たとえば描画属性をひとそろい、スタックで管理することができる。 曲線に付けられる属性には、線の太さ、線種、両端の形、つなげ方に加え、 フォント名やフォントサイズ、テキストの回転角などの文字列の属性がある。

libplot が提供する基礎的な属性の一つは、Plotter の属性である。 Plotter は、いわゆる従来のペン・プロッターと同様の使い方で、 ベクトル形式の画像を描画できるオブジェクトである。Plotter にはいろいろな種類の出力形式のものがある。一つのアプリケーション中に、Plotter オブジェクトはどの種類のものがいくつ保持されていてもよい。

どの種類の Plotter オブジェクトでも、できる描画操作は同じであり、 デバイスの種類に依存しないようになっている。 したがって libplot を利用するアプリケーションは、 libplot がサポートするどの画像形式でも簡単に出力できる。

現在、以下の種類の Plotter オブジェクトが実装されている。

これらの Plotter デバイスの違いはまず、X と X Drawable を除くと、 ファイルまたは他の出力先に書き出す形式の違いである。 X Plotter はウィンドウを新しく作り、X Drawable は一つか二つの X drawable の中に画像を描く。

次に、最初の4つの Plotter デバイス (X、X Drawable、PNM、GIF) はビットマップ画像を、他のものはベクトル形式の画像を描くという違いがある。 ビットマップ画像では、描かれているオブジェクトの構造などの情報は失われるが、 ベクトル形式では保存されている。

また、X、X Drawable、Tektronix、Metafile の Plotter デバイスはリアルタイム・デバイスである。 これは、デバイスに対する描画操作が全部終了していなくても、 各操作が行われるたびに出力が逐次行われるということである。 他のデバイスはリアルタイム・デバイスではないので、 必要な関数がすべて呼ばれた後でないと出力は行われない。PNM と GIF の各 Plotter では、そうでないとビットマップ画像を生成できないからである。Illustrator と Postscript の Plotter では出力時、まず最初に画像のサイズ `bounding box' を出力する必要があるからである。Fig Plotter では色の定義をまず最初に出力せねばならない。

どの Plotter デバイスでもサポートされているもっとも重要な機能は、openplclosepl である。これによってそのデバイスをオープン、クローズする。 画像の描画や様々な属性の設定などは、すべて openplclosepl の間に行う必要がある。一対の openplclosepl の間に行われた描画操作から、ひとつのページの画像が構築される。 原則的に、Plotter デバイスは何度もオープン/クローズできる。 X Plotter は各ページをそれぞれのウィンドウで表示し、 Postscript、PCL、HP-GL Plotter は各ページの画像をそれぞれ、 物理的に別の紙に描画する。X Drawable と Tektronix の Plotter ではディスプレイ上に描けるものは一つであり、 複数のページは 1 ページずつ表示される。 リアルタイムでない Plotter (PNM、GIF、Illustrator、Postscript、Fig、PCL、HP-GL Plotters) は、その Plotter オブジェクトが削除されるのを待ち、 それから描画されたすべてのページを出力する。

現在の libplot では Postscript の Plotter ではこの出力に遅れがあり、 PCL と HP-GL の Plotter では、たとえば closepl が呼ばれるなどして各ページが作られるたびに出力する。 PNM、GIF、Illustrator、Fig の Plotter でも同様だが、 最初のページだけしか出力されない。PNM、GIF、Illustrator、Fig では複数ページの画像はサポートされていないからである。

他にも、どの Plotter でも使える基本的な機能がある。 画像が描かれる「グラフィクス・ディスプレイ」は、その Plotter デバイスの出力形式における正方形、あるいは長方形の領域である。 どの Plotter デバイスでも、各デバイスが持っている座標系ではなく、 指定する座標系で、デバイスの種類とは関係なく描画操作を行うことができる。 Plotter デバイスはその指定された座標系からデバイス独自の座標系にアフィン変換を行う。

openpl で Plotter デバイスをオープンしたあと、すぐ space を呼んで、Plotter、つまりこの出力形式変換オブジェクトを初期化する。 初期化の際には、長方形領域 (座標系) の指定を行うことで、 そのデバイスの座標系とのマッピングをつくる。それにより設定されるアフィン変換は、 space または fconcat を呼べばいつでも再設定あるいは設定の変更ができる。fconcat は現在設定されているアフィン変換と、 この関数で指定するアフィン変換の合成を行って設定する。 こういった変換の合成は、たとえば PostScript などでよく使われている機能である。

それぞれの Plotter デバイスは描画状況を Postscript 風のスタックで管理できる。 描画状況には現在設定されている、 指定座標系からデバイス独自の座標系へのアフィン変換が含まれる。 またその時点での描画カーソルの位置、ラインモード、線の太さ、 ペンや塗りつぶしの色、文字列のフォントなども含まれる。 もしまた描き終わっていないパス (つなげられた線) があれば、 それも含まれる。パスは一部分 (線分や円弧) を一つ一つ順番につなげて作られるからである。 その時点での描画状況は、savestate を呼んでスタックに積み、

ベクトル形式の画像でのアニメーションは、 画像の各ページを複数のフレームに分けることで可能になる。 erase を呼ぶことで、現在のフレームの作成を終了し、 次のフレームをはじめることができる。リアルタイム描画を行う Plotter デバイス (X、X Drawable、Tektronix、metafile) では、 これによってグラフィクス・ディスプレイ上の画像が消去され、 次のフレームが描画できる状態になる。 一連のフレームを次々に表示することで、滑らかなアニメーションのように見える。

ほとんどのリアルタイム描画のできない Plotter デバイス (PNM、Illustrator、Postscript、Fig、PCL、HP-GL) では、erase で内部のバッファ上にあるすべての描画オブジェクトを削除される。 そのためリアルタイムでないほとんどの Plotter は、 複数フレームのページがあっても、最後のフレームだけしか表示しない。

GIF Plotter もリアルタイム描画はできないが、他のと違ってアニメージョン疑似 GIF のような複数画像からなる出力を、複数フレームのページから生成できる。 上述したように、GIF Plotter の生成する疑似 GIF では、 画像の最初のページだけのファイルしか生成できない。 しかしそのページに複数のフレームがあるときは、 erase を呼べば、デフォルトではそこが二つのフレームの切れ目になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2 libplot で C プログラミング


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.1 C 言語での API

libplot にはいくつかの言語バインディングがある。 どのバインディングが使われていても、libplot の概念 (Plotter デバイスと、どのデバイスでも使える共通描画操作) は同じである。 しかし Plotter の実際の操作の仕方 (生成、描画対象としての選択、削除) は言語によって異なる。この節では C バインディングについて説明する。

libplot を使うプログラムを C で書くなら、まず C バインディングで Plotter をどう扱うのかを知らねばならない。 そのために4つの関数が用意されている。newplselectpldeletepl、およびパラメータ設定を行う parampl である。実際にはこれらを pl_newplpl_selectplpl_deleteplpl_parampl という名前で呼ぶことになる。plotcompat.h#include しない限りは、C バインディングではすべての関数名の最初に "pl_" が付けられている (参照: C 言語でのコンパイルとリンク)。

Plotter オブジェクトは pl_newpl 関数にその種類を指定して呼び出すことで生成される。 第一引数は "X"、"Xdrawable"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、 "meta" のいずれかである。返り値は、生成された Plotter オブジェクトを表す非負の整数で、 これをハンドルと呼ぶ。 生成した Plotter オブジェクトを使う (それに対して libplot の関数による描画操作を行う) 前に、描画対象とする Plotter を pl_selectpl 関数を呼んで選んでおく必要がある。 同時に複数の Plotter を選んでおくことはできないが、pl_selectpl で Plotter を切り替えていくことはできる。それは、選ばれていた Plotter がオープンされていても構わない。その時点で選ばれていない Plotter は、pl_deletepl で削除してそのメモリ領域を解放することができる。

描画自体は、実は pl_newplpl_selectplpl_deletepl を呼ばなくても可能である。それはプログラムの実行開始時に、metafile の Plotter が自動的に生成、選択され、標準出力に画像データを書き出すように設定さるからである (この Plotter オブジェクトのハンドルは 0 である)。 このデフォルト Plotter があるのは、GNU 実装より前の libplot との互換性を持たせるためである。もちろん metafile 形式、 あるいは標準出力を使わないこともあるだろうが。

Plotter デバイスへの描画が終了したときには、pl_deletepl を呼ぶ習慣を付けておくのがよい。一般に、リアルタイム描画を行わない Plotter (Postscript Plotter など) は、描画が終わって pl_deletepl が呼ばれて初めて画像を出力するようになっている。

Plotter デバイスを操作する、 C バインディングでの上の4つの関数の機能を以下の表に示す。

int pl_newpl (const char *type, FILE *infile, FILE *outfile, FILE *errfile);

出力形式が type の Plotter オブジェクトを生成する。type は "X"、"Xdrawable"、"pnm"、"gif"、"ai"、"ps"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のどれかである。生成される Plotter オブジェクトはに入出力ストリームとして、 標準入力に infile、標準出力に outfile、標準エラー出力に errfile が設定される。X Plotter と X Drawable Plotter では標準出力ではなく X Window の画面に描画が行われるため、type が "X" か"Xdrawable" のときは outfile は無視される。 errfile が NULL でなければ、 エラーメッセージ (が表示されるとき) は errfile に出力される。 newpl の返り値は「ハンドル」と呼ばれる非負の整数で、 これを使って新しく生成された Plotter オブジェクトを指定できる。Plotter オブジェクトが生成できなかったときは、負の値が返される。

int pl_selectpl (int handle);

pl_selectpl は引数で示される Plotter を選択し、操作できる状態にする。 この関数を呼んだ後に呼ばれる libplot の描画操作関数の操作対象は、 この関数で選択されている Plotter になる。同時に複数の Plotter オブジェクトを選択しておくことはできない。 プログラムの実行開始時に、標準出力に metafile 形式の画像を書き出す Plotter オブジェクト (ハンドル '0') が一つだけ生成され、選択された状態になるようになっている。

この関数の返り値は、この関数が呼ばれる時点で選択されていた Plotter のハンドルである。引数で指定された Plotter が存在しないときや、 選択できないときは負の数を返す。

int pl_deletepl (int handle);

pl_deletepl は引数のハンドルで示される Plotter オブジェクトを削除する。 指定される Plotter はその時点で選択されていてはならない。 この関数の返り値が負の数だったときは、 指定された Plotter を削除できなかったことを示す。

int pl_parampl (const char *parameter, void *value);

pl_parampl は、デバイスドライバのパラメータ parameter の値を value にセットする。、デバイスドライバのパラメータは、Plotter のオプションを指定するのに使われる。 どの Plotter でも、その生成時に有効な値を持つパラメータ値があれば、Plotter にコピーされる。ほとんどのパラメータでは、その値 valuechar *、つまり文字列である。無効な値が指定されているときは、 無視される。指定できる値とその意味のリストは、デバイス独自のパラメータ を参照のこと。

ここまで4つめの関数、pl_parampl については説明してこなかった。Plotter の使い方は Plotter の種類にはよらないことになっているが、Plotter オブジェクトが生成されるときにその挙動を制御できると便利なことがある。 それは適当な数のデバイスドライバ・パラメータで指定することができる。 その値は pl_parampl 関数を呼ぶことで指定できる。 この関数は Plotter オブジェクトに何らかの操作を行うものではなく、 完全に C バインディングの関数である。ある Plotter が理解するパラメータ値は、その Plotter が削除されるまで固定であり、 その値は、その Plotter オブジェクトが生成されたときの値である。

実際には、もう少し洗練された方法が使われる。Plotter オブジェクトの生成時にあるパラメータ値がセットされていると、 その値はそれより前の最後の pl_parampl による値であり、それがその Plotter で使われる。Plotter オブジェクトの生成時にあるパラメータ値がセットされてない場合、 さらにパラメータに文字列が設定されておらず、 また同名の環境変数もない場合はデフォルトの値が使われる。 パラメータと同名の環境変数に値がセットされているときは、それが使われる。 これにより、実行時にプログラムを制御することができる。 つまり設定がマズくても致命的エラーになりにくいような環境変数は、 実行時に参照して使えばよい。一度セットされた後でも、 プログラム中で pl_parampl 関数を NULL を引数にして呼べば設定を取り消せる。これにより利便性が高まるであろう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.2 C 言語でのコンパイルとリンク

C 言語で libplot を使ったグラフィクス・アプリケーションを書く場合、 そのソースファイルには以下の行が必要になる。

 
#include <stdio.h>
#include <plot.h>

ヘッダファイル plot.hlibplot の配布パッケージに含まれている。 これを、C コンパイラが見つけられる場所に置いておく。このファイルには libplot の各関数のプロトタイプ宣言やその他の定義などが入っている。

libplot の現在のバージョンでは、関数名はすべて "pl_" がその先頭についている。たとえば Plotter に openpl 操作を行う関数は pl_openpl という名前である。後方互換性に頼る必要がある場合は、 plotcompat.h というヘッダファイルを使えば良い。 このファイル中ではたとえば、openpl という関数呼び出しが libplotpl_openpl になるように再定義されている。

作成したプログラムを libplot とリンクするには、コンパイル時のコマンドラインで `-l' オプションを付ければ良い。たとえば以下のようにする。

 
-lplot -lXaw -lXmu -lXt -lXext -lX11 -lm

最近の X Windows システムでは以下のようになるだろう。

 
-lplot -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lm

(Athena ウィジェットの代わりに Motif ウィジェットを使うシステムでは `-lplot -lXm -lXt -lXext -lX11 -lm'`-lplot -lXm -lXt -lXext -lX11 -lm -lc -lgen'`-lplot -lXm -lXt -lXext -lX11 -lm -lc -lPW' のいずれかになるだろう。また最近の X Window システムではオプションに `-lSM -lICE' を追加する必要があるかもしれない。さらに Motif の最近のバージョンでは `-lXp' も必要かもしれない。)

場合によっては libplot やその他のライブラリのインストールされているディレクトリを、 コマンドラインで指定する必要がある。たとえば X Window のライブラリを指定するオプション `-lXaw -lXmu -lXt -lSM -lICE -lXext -lX11' を使うには `-L/usr/X11/lib' といったオプションを同時に指定せねばならないかもしれない。

多くの場合 libplot は DLL (dynamically linked library、または `shared' ライブラリ) としてインストールされる。この場合、 リンクはコンパイル時には行われず、プログラムの実行時に行われることになる。 その際ライブラリのある場所は環境変数 LD_LIBRARY_PATH によって示される。libplot を使うプログラムが正常に実行されるためには、 そのライブラリのあるディレクトリを LD_LIBRARY_PATH に設定しておかねばならない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.3 C 言語でのサンプル描画

以下に、libplot の機能を使ってベクトル形式の画像を描画する C 言語のプログラムの例を示す。例に使ったのは、美しく入り組んだ Bill Gosper の C 曲線 (Item #135 in HAKMEM, MIT Artificial Intelligence Laboratory Memo #239, 1972) である。 数値定数 MAXORDER の値 (ここでは 12 に固定) を大きくしていくと、 無数の周天円的な八角形状の形状をなす線分からなる C の字 形の曲線を描いていく。

 
#include <stdio.h>
#include <plot.h>
#define MAXORDER 12

void draw_c_curve (double dx, double dy, int order)
{
  if (order >= MAXORDER)
    pl_fcontrel (dx, dy);     /* continue path along (dx, dy) */
  else
    {
      draw_c_curve (0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
      draw_c_curve (0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);      
    }
}

int main ()
{
  int handle;        

  /* set a Plotter parameter */
  pl_parampl ("PAGESIZE", "letter");  

  /* create a Postscript Plotter that writes to standard output */
  if ((handle = pl_newpl ("ps", stdin, stdout, stderr)) < 0)
    {
      fprintf (stderr, "Couldn't create Plotter¥n");
      return 1;
    }
  pl_selectpl (handle);       /* select the Plotter for use */

  if (pl_openpl () < 0)       /* open Plotter */
    {
      fprintf (stderr, "Couldn't open Plotter¥n");
      return 1;
    }
  pl_fspace (0.0, 0.0, 1000.0, 1000.0); /* specify user coor system */
  pl_flinewidth (0.25);       /* line thickness in user coordinates */
  pl_pencolorname ("red");    /* path will be drawn in red */
  pl_erase ();                /* erase Plotter's graphics display */
  pl_fmove (600.0, 300.0);    /* position the graphics cursor */
  draw_c_curve (0.0, 400.0, 0);
  if (pl_closepl () < 0)      /* close Plotter */
    {
      fprintf (stderr, "Couldn't close Plotter¥n");
      return 1;
    }

  pl_selectpl (0);            /* select default Plotter */
  if (pl_deletepl (handle) < 0) /* delete Plotter we used */
    {
      fprintf (stderr, "Couldn't delete Plotter¥n");
      return 1;
    }
  return 0;
}

見て分かる通り、プログラムの動作は PostScript の Plotter を生成するための pl_newpl から始まる。この Plotter オブジェクトではページのサイズは US letter だが、たとえば "a4" などのほかの標準規格のサイズにしてもよい。それは pl_parampl の呼び出しを変えることでできる。PAGESIZE パラメータを含むいくつかのパラメータを、pl_parampl の呼び出しで設定できる。設定できるパラメータのリストは デバイス独自のパラメータ を参照のこと。

Plotter オブジェクトを生成したら、それを選択し、オープンしてから、 再帰呼び出しを行う関数で "C" 曲線を描いている。 曲線の描画は、pl_fmove を呼んでカーソルの位置を調整してから、 draw_c_curve によって行われる。この関数は繰り返し pl_fcontrel を呼び出す。pl_fcontrel はそれまで描かれてきた線に、線分を追加する。線分の両端は、 その直前のカーソル位置に対する相対座標で指定される。 "C" 曲線が描かれたら、Plotter をクローズする。pl_deletepl が呼ばれると、PostScript 形式の画像ファイルを標準出力に書き出し、 この Plotter オブジェクトは破棄される。

"ps" の代わりに "pnm"、"gif"、"ai"、"fig"、"pcl"、"hpgl"、"tek"、"meta" のいずれかを pl_newpl の最初の引数として指定すると、 その指定された形式で Plotter は画像を標準出力に書き出す。PAGESIZE パラメータは "ai"、"fig"、"pcl"、"hpgl" で有効であり、他の形式が指定されているときには無視される。 出力された画像の形式の変換を繰り返したくない場合には、"meta" を指定しておくと良い。この形式のデータは、plot コマンドの標準入力に渡して他の形式に変換したり、X Window のディスプレイに表示できたりする。参照: plot コマンド

pl_newpl の最初の引数に "X" を指定すると、X window のウィンドウが一つポップアップし、そこに曲線が描かれる。X window システムのどのディスプレイにウィンドウが出てくるかは、DISPLAY パラメータで指定される。それが設定されていないときは環境変数 DISPLAY で指定される。表示されるウィンドウのサイズは BITMAPSIZE パラメータで指定される。それが設定されていないときは環境変数 BITMAPSIZE で指定される。デフォルトのサイズは "570x570" である。"pnm"、"gif" のときも BITMAPSIZE は同様に指定できる。

Plotter の出力形式には "Xdrawable"も指定できる。これを理解するには若干の X Window システム・プログラミングの知識が必要である。 まず、newpl を呼ぶ前に pl_parampl を呼んで、少なくとも一つの X drawable (ウィンドウ、またはビットマップ画像) を生成する必要がある。 そしてそれをパラメータ XDRAWABLE_DRAWABLE1 または XDRAWABLE_DRAWABLE2 に設定する必要がある。X Drawable Plotter に指定できるパラメータについては、デバイス独自のパラメータ を参照のこと。

以下の C プログラムも libplot の機能を使ってベクトル形式の画像を生成する。この例では "GNU libplot!" という文字列を楕円で囲んで、それを螺旋状に置いていくものである。 画像は標準出力に PostScript 形式で書き出される。

 
#include <stdio.h>
#include <plot.h>
#include <math.h>
#define SIZE 100.0   /* nominal size of user coordinate frame */
#define EXPAND 2.2   /* expansion factor for elliptical box */

void draw_boxed_string (char *s, double size, double angle)
{
  double true_size, width;

  pl_ftextangle (angle);         /* text inclination angle (degrees) */
  true_size = pl_ffontsize (size);  /* choose font size */
  width = pl_flabelwidth (s);    /* compute width of text string */
  pl_fellipserel (0.0, 0.0,      /* draw surrounding ellipse */
               EXPAND * 0.5 * width, EXPAND * 0.5 * true_size, angle);
  pl_alabel ('c', 'c', s);       /* draw centered text string */
}

int main()
{
  int handle, i;

  /* set a Plotter parameter */
  pl_parampl ("PAGESIZE", "letter");

  /* create a Postscript Plotter that writes to standard output */
  if ((handle = pl_newpl ("ps", stdin, stdout, stderr)) < 0)
    {
      fprintf (stderr, "Couldn't create Plotter¥n");
      return 1;
    }
  pl_selectpl (handle);         /* select the Plotter for use */

  if (pl_openpl () < 0)         /* open Plotter */
    {
      fprintf (stderr, "Couldn't open Plotter¥n");
      return 1;
    }
  pl_fspace (-(SIZE), -(SIZE), SIZE, SIZE); /* spec. user coor system */
  pl_pencolorname ("blue");     /* pen color will be blue */
  pl_fillcolorname ("white");
  pl_filltype (1);              /* ellipses will be filled with white */
  pl_fontname ("NewCenturySchlbk-Roman"); /* choose a Postscript font */
  
  for (i = 80; i > 1; i--)      /* loop through angles */
    {
      double theta, radius;
      
      theta = 0.5 * (double)i;  /* theta is in radians */
      radius = SIZE / pow (theta, 0.35);  /* this yields a spiral */
      pl_fmove (radius * cos (theta), radius * sin (theta));
      draw_boxed_string ("GNU libplot!", 0.04 * radius,
                          (180.0 * theta / M_PI) - 90.0);
    }

  if (pl_closepl () < 0)        /* close Plotter */
    {
      fprintf (stderr, "Couldn't close Plotter¥n");
      return 1;
    }
  pl_selectpl (0);
  if (pl_deletepl (handle) < 0) /* delete Plotter we used */
    {
      fprintf (stderr, "Couldn't delete Plotter¥n");
      return 1;
    }
  return 0;
}

この例では文字列を描画に入れる方法を示した。最初にフォントを指定せねばならない。 フォント は pl_fontnamepl_fontsizepl_textangle の3つを呼んで初めて指定できたことになる。または指定に実数を使いたいときは pl_ffontnamepl_ffontsizepl_ftextangle である。 これらを呼ぶ順序は任意である。呼び出し側の利便を図るため、 これらの関数は設定しようとするフォントのサイズを返すようになっている。 呼び出し側の利便を図るため、 これらの関数の返り値は設定しようとしているフォントのサイズにしてある。 その値はpl_fontsizepl_ffontsize の最後の呼び出しで指定された値と若干異なっていることがある。多くの Plotter では使えるフォントに制約があるためである。上の例では文字列のフォントは "NewCenturySchlbk-Roman" で、これは PostScript Plotter で使えるフォントである。 参照: 利用できるフォント

上の例で、pl_newpl の引数の "ps" を "X" に置き換えると、 PostScript Plotter の代わりに X Plotter が生成され、文字列の渦巻きは X Window にポップアップするウィンドウに描かれる。 描画する X のディスプレイで "NewCenturySchlbk-Roman" フォントが使えないときはほかのスケーラブル・フォントで置き換えられる。 たとえば非常に広く使われている "utopia-medium-r-normal" などになるだろう。 このフォント名の意味するところについては X Window フォント を参照のこと。 X Plotter が指定されたフォントを利用できない場合、 最初にまずデフォルトのスケーラブル・フォント ("Helvetica") を使おうとする。それもダメだったときにはデフォルトの Hershey ベクトルフォント ("HersheySerif") を試す。Hershey フォントは線分の集合からできていて、どの種類の Plotter でも組み込みの Hershey フォントが使えるようになっている。

古い X Window システム (X11R6 より前) のディスプレイでは、 スケーラブル・フォントを利用するときに長い実行時間を要することがある。 そういった環境では、上の例を実行するとき、 描画の前にまずフォントの準備を行うため、それに時間がかかるかもしれない。 この例では各文字列がそれぞれ違う角度で傾いて表示されているからである。 X11R6 では、フォント全体を処理せず、各文字をそれぞれ独立に用意できる。 その機能が使える場合には X Plotter の内部で自動的にそれを利用し、 実行時間の短縮を図っている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.4 C 言語でのアニメーション GIF

libplot を使って疑似アニメーション GIF 形式 (単なる疑似 GIF 形式の画像含む) の出力を得るのに、難しいことは何もない。GIF の Plotter は他の Plotter と変わるところは何もなく、同じ操作で描画が行える。 しかし注意点が2点だけある。1) 単ページの画像しかサポートされない。最初の openplclosepl の間に描画されたものだけが出力される。 これはリアルタイム・プロットを行わない他の Plotter も同じである。2) その openplclosepl の間で erase が呼ばれると、 それまでの描画が終了して、次の画像の描画が新しく始まることになる。 ただそれまでになにも描画が行われていないときには、なにもしない。

libplot を使ったプログラミングを行っているとき、Plotter をオープンしてすぐに erase を呼ぶ人は少なくない。 X Drawable や Tektronix の Plotter では、描画を行うとずっとそれが残っているので、 Plotter のオープン後すぐに erase を呼ぶのは悪いことではない。

以下に幅 150 ピクセル、縦 100 ピクセルの疑似アニメーション GIF を生成するプログラムを示す。

 
#include <stdio.h>
#include <plot.h>

int main()
{
  int i, handle;

  /* set Plotter parameters */
  pl_parampl ("BITMAPSIZE", "150x100");
  pl_parampl ("BG_COLOR", "orange");
  pl_parampl ("TRANSPARENT_COLOR", "orange");
  pl_parampl ("GIF_ITERATIONS", "100");
  pl_parampl ("GIF_DELAY", "5");

  /* create a GIF Plotter with the specified parameters */
  handle = pl_newpl ("gif", stdin, stdout, stderr);
  pl_selectpl (handle);         /* select the Plotter for use */
     
  pl_openpl();			/* begin page of graphics */
  pl_space (0, 0, 149, 99);	/* specify user coordinate system */
  
  pl_pencolorname ("red");      /* objects will be drawn in red */
  pl_linewidth (5);             /* set the line thickness */
  pl_filltype (1);              /* objects will be filled */
  pl_fillcolorname ("black");   /* set the fill color */

  for (i = 0; i < 180 ; i += 15)
    {
      pl_erase ();              /* begin new GIF image */
      pl_ellipse (75, 50, 40, 20, i); /* draw an ellipse */
    }

  pl_closepl ();                /* end page of graphics */
  pl_selectpl (0);              /* select default Plotter */
  pl_deletepl (handle);         /* delete Plotter we used */
  return 0;
}

疑似アニメーション GIF の画像データは標準出力に書き出される。 上のプログラムは 12 枚の静止画からなり、 赤い縁取りの黒い楕円が半時計方向に回転する動画である。 回転角度は 180° だが、疑似 GIF のアニメーションは「ループ」するため (後述)、回転を続けるように見える。

楕円を定義するパラメータを指定する座標系はプログラム側から与える。 したがって画像データ上のピクセル単位の座標ではないが、pl_space を呼ぶことでその両方の座標系を同じである、と設定できる。 プログラム側で設定する座標系は、左下隅が (0,0)、右上隅が (149,99) である。 これは出力される画像データのサイズと同じなので、 プログラム側の座標上で整数で点を指定すれば、その点がピクセルに対応する。 たとえば、pl_point(149,99) とすると、画像の右上隅のピクセルの色を、現在のペンの色にする。

BITMAPSIZEBG_COLOR の他にも重要なパラメータが疑似 GIF Plotter にはあり、pl_parampl 関数で設定することができる。TRANSPARENT_COLOR には色名を設定できる。疑似 GIF 形式の画像上のその色のピクセルは、 多くのソフトウェアで透明として扱われる。普通は画像の背景を透明にするのに使う。 上のサンプル・プログラムでは背景色はオレンジに設定されているが、 透明色もオレンジに設定されている。そのため画像の背景は実際には描かれない。

GIF_ITERATIONS パラメータで、複数のフレームからなる疑似 GIF 画像のループ回数を設定できる。GIF_DELAY パラメータには、1/100 秒単位でループの中の 1 枚の画像を表示する時間の長さを設定できる。

場合によっては INTERLACE が便利である。これを "yes" に設定すると、 生成される疑似 GIF データはインターレース形式になる。 これは静止画のときには非常に役に立つ指定である。 その他パラメータについての詳細は、デバイス独自のパラメータ を参照のこと。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.5 C 言語での X Window システムでのアニメーション

libplot を使えば、リアルタイム・プロットを行う Plotter (X、X Drawable、Tektronix、Metafile) でベクトル形式の画像によるアニメーションを生成することができる。 erase を呼ぶことで、一つのページ中の「フレーム」を区切ることができる。 したがって各フレームごとに、 各デバイスのグラフィクス・ディスプレイに描画が行われることになる。 連続するフレーム間での違いを小さくすれば、滑らかなアニメーションになる。

以下に C 言語でのサンプル・プログラムを示す。このプログラムでは X Window システム上にアニメーションを表示する。 これを実行すると「飛び去っていく目」が表示される。 つまりウィンドウが新しく開き、その中を目玉が、 ゆっくりと回転しながら左から右へと通り過ぎていく。 目玉が2回通過したところで、ウィンドウは閉じられる。

 
#include <stdio.h>
#include <plot.h>

int main ()
{
  int handle, i = 0, j;

  /* set Plotter parameters */        
  pl_parampl ("BITMAPSIZE", "300x150");
  pl_parampl ("VANISH_ON_DELETE", "yes");
  pl_parampl ("USE_DOUBLE_BUFFERING", "yes");

  /* create an X Plotter with the specified parameters */
  if ((handle = pl_newpl ("X", stdin, stdout, stderr)) < 0)
    {
      fprintf (stderr, "Couldn't create Plotter¥n");
      return 1;
    }
  pl_selectpl (handle);       /* select the Plotter for use */

  if (pl_openpl () < 0)       /* open Plotter */
    {
      fprintf (stderr, "Couldn't open Plotter¥n");
      return 1;
    }
  pl_space (0, 0, 299, 149);  /* specify user coordinate system */
  pl_linewidth (8);           /* line thickness in user coordinates */
  pl_filltype (1);            /* objects will be filled */
  pl_bgcolorname ("saddle brown"); /* background color for the window*/
  for (j = 0; j < 300; j++)
    {
      pl_erase ();            /* erase window */
      pl_pencolorname ("red"); /* choose red pen, with cyan filling */
      pl_fillcolorname ("cyan");
      pl_ellipse (i, 75, 35, 50, i);  /* draw an ellipse */
      pl_colorname ("black"); /* choose black pen, with black filling */
      pl_circle (i, 75, 12);  /* draw a circle [the pupil] */
      i = (i + 2) % 300;      /* shift rightwards */
    }
  if (pl_closepl () < 0)         /* close Plotter */
    {
      fprintf (stderr, "Couldn't close Plotter¥n");
      return 1;
    }

  pl_selectpl (0);            /* select default Plotter */
  if (pl_deletepl (handle) < 0) /* delete Plotter we used */
    {
      fprintf (stderr, "Couldn't delete Plotter¥n");
      return 1;
    }
  return 0;
}

見て分かるように、プログラムの最初に pl_parampl が数回呼ばれて出力デバイスのパラメータを設定し、 それから pl_newpl を呼んで X の Plotter を生成している。 X Plotter のウィンドウのサイズは 300 x 150 ピクセルである。Plotter がクローズ/削除されるときに、ウィンドウも閉じられる。VANISH_ON_DELETE パラメータが "yes" に設定されていないときは、ウィンドウは自動的には消えず、 ウィンドウ内で `q' を押すか、ウィンドウをマウスでクリックしたときに消えるようになる。

USE_DOUBLE_BUFFERING パラメータを "yes" にすると、 バッファリングが二重に行われるようになる。 アニメーションがコマ送りみたいにならず、 スムーズに動くようにするためには重要な機能である。 通常は X の Plotter はリアルタイムで画面に描画を行い、pl_erase が呼ばれたときに画面をクリアするが、二重バッファリングが有効になっているときは、 各フレームの内容は一旦バッファに書き出され、 pl_erase が呼ばれたとき、またはその Plotter がクローズされたときに、 ピクセル単位でウィンドウにコピーされることで描画が行われる。 これはあまり直観的ではないかもしれないが、 滑らかなアニメーションを描くためには必須の機能である。

生成された Plotter を使うためには、それを選択し、オープンしなければならない。 pl_openpl を呼ぶとウィンドウが新しく開かれ、 アニメーションの表示が始まる。 for ループの中には pl_erase と、目玉を描く一連の libplot の描画操作がある。ループ内で線を描くときにそれぞれ1回ずつ、 線の色と塗りつぶしの色の指定が行われる。 実際に表示を行う環境で、パラメータ値をどう設定するのが良いのか、 試行錯誤するといいかもしれない。

楕円を定義するパラメータを指定する座標系はプログラム側から与える。 したがってウィンドウ上のピクセル単位の座標ではないが、pl_space を呼ぶことでその両方の座標系を同じである、と設定できる。 プログラム側で設定する座標系は、左下隅が (0,0)、右上隅が (299,149) である。 これは出力されるウィンドウのサイズと同じなので、 プログラム側の座標上で整数で点を指定すれば、その点がピクセルに対応する。 たとえば、pl_point(299,149) とすると、画像の右上隅のピクセルの色を、現在のペンの色にする。

次のプログラムでは、文字 `A' が回転するアニメーションを生成する。

 
#include <stdio.h>
#include <plot.h>

int main()
{
  int handle, angle = 0;

  /* set Plotter parameters */        
  pl_parampl ("BITMAPSIZE", "300x300"); 
  pl_parampl ("BG_COLOR", "blue"); /* background color for window */
  pl_parampl ("USE_DOUBLE_BUFFERING", "yes");

  /* create an X Plotter with the specified parameters */
  handle = pl_newpl ("X", stdin, stdout, stderr);
  pl_selectpl (handle);

  /* open X Plotter, initialize coordinates, pen, and font */
  pl_openpl ();
  pl_fspace (0.0, 0.0, 1.0, 1.0);  /* use normalized coordinates */
  pl_pencolorname ("white");
  pl_ffontsize (1.0);
  pl_fontname ("NewCenturySchlbk-Roman");

  pl_fmove (.50,.50);           /* move to center */
  while (1)                     /* loop endlessly */
    {
      pl_erase ();
      pl_textangle (angle++);      /* set new rotation angle */
      pl_alabel ('c', 'c', "A");   /* draw a centered `A' */
    }
  pl_closepl();                 /* close Plotter */

  pl_selectpl (0);              /* select default Plotter */
  pl_deletepl (handle);         /* delete Plotter we used */
  return 0;
}

この例では X Window システムの機能がよく示されている。最近の X11R6 のディスプレイでは、アニメーションは高速で滑らかである。これは X11R6 では、フォントから使いたい文字を取り出してラスタライズする機能があるからである。 もし表示に使う X ディスプレイで "NewCenturySchlbk-Roman" がサポートされていない場合、これが他のスケーラブル・フォント、 たとえば広く使われている "utopia-medium-r-normal" などに置き換えられる。 もし X の Plotter が指定されたフォントを使えないときは、 最初はデフォルトのスケーラブル・フォント ("Helvetica") を使おうとする。 もしそれも使えない場合は、デフォルトの Hershey ベクトル・フォント ("HersheySerif") が使われる。

Hershey フォントを使うアニメーションは PostScript フォントや他の X Window システムのフォントを使うものに比べると高速である。それは Hershey フォントが線分で構成されているからである。 線分のラスタライズは高速に行われる。スケーラブル・フォントの "NewCenturySchlbk-Roman" や "utopia-medium-r-normal" を使った場合、文字 `A' が一回転したあとにアニメーションが高速になるのが分かるかもしれない。 それは一回転分の回転した文字の画像データが揃ったからである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.6 一歩進んだ X Window システム・プログラミング

X Window システムを利用するプログラムは通常 Xt、W Toolkit ライブラリを使って書かれる。Xt では各アプリケーションは、 たとえばテキスト入力フィールド、ボタン、スライダー、 描画できる領域などの「ウィジェット」と呼ばれる部品を使って構築される。 アプリケーションの実行が開始される時、 各ウィジェットはそれぞれに対応する「イベント」(キー入力やマウスクリックなど) に反応するように設定される。その設定が終わってから Xt のイベントループに制御が渡される。

GNU libplot は Xt のイベントループ内でベクトル形式画像を描画するのに使うことができる。 そのためには一つ、あるいは複数の X Drawable Plotter を生成して使う。 一つの X Drawable Plotter は画面に表示されない一つのビットマップ画像に、 または一つのウィジェットとして管理される画面上の一つのウィンドウに、 描画することができる。

以下に一つの X Drawable Plotter を使うサンプル・プログラムを示す。 前の節でも使った `C' 曲線を、 ウィンドウを一つ生成してそこに描くアプリケーションである。 通常の Xt アプリケーションに使えるコマンドライン・オプションがこれにも使える。 ウィンドウの背景色の `-bg' オプション、ウィンドウの位置の `-geometry' オプションなどである。曲線は最初は赤で、マウスで1回クリックすると緑で描かれる。 もう1回クリックすると赤に戻り、以下同様である。`q' をキー入力すると終了する。

 
#include <stdio.h>
#include <plot.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/StringDefs.h>
#include <X11/Core.h>

int green = 0;                  /* draw in green, not red? */

#define MAXORDER 12
void draw_c_curve (double dx, double dy, int order)
{
  if (order >= MAXORDER)
    pl_fcontrel (dx, dy);       /* continue path along (dx, dy) */
  else
    {
      draw_c_curve (0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
      draw_c_curve (0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);
    }
}

void Redraw (Widget w, XEvent *ev, String *params, Cardinal *n_params)
{
  /* draw C curve */
  pl_erase ();
  pl_pencolorname (green ? "green" : "red");
  pl_fmove (600.0, 300.0);  
  draw_c_curve (0.0, 400.0, 0);
  pl_endpath ();
}

void Toggle (Widget w, XEvent *ev, String *params, Cardinal *n_params)
{
  green = (green ? 0 : 1);
  Redraw (w, ev, params, n_params);
}

void Quit (Widget w, XEvent *ev, String *params, Cardinal *n_params)
{
  exit (0);
}

/* mapping of events to actions */
static const String translations =
"<Expose>:      redraw()¥n¥
<Btn1Down>:     toggle()¥n¥
<Key>q:         quit()";

/* mapping of actions to subroutines */
static XtActionsRec actions[] = 
{
  {"redraw",            Redraw},
  {"toggle",            Toggle},
  {"quit",              Quit},
};

/* default parameters for widgets */
static String default_resources[] = 
{
  "Example*geometry:      250x250",
  (String)NULL
};

int main (int argc, char *argv[])
{
  Arg wargs[10];                /* storage of widget args */
  Display *display;             /* X display */
  Widget shell, canvas;         /* toplevel widget; child */
  Window window;                /* child widget's window */
  XtAppContext app_con;         /* application context */
  int handle, i;
  char *bg_colorname = "white";
  
  /* take background color from command line */
  for (i = 0; i < argc - 1; i++)
    if (strcmp (argv[i], "-bg") == 0)
      bg_colorname = argv[i + 1];

  /* create toplevel shell widget */
  shell = XtAppInitialize (&app_con, 
                           (String)"Example", /* app class */
                           NULL,              /* options */
                           (Cardinal)0,       /* num of options */
                           &argc,             /* command line */
                           argv,              /* command line */
                           default_resources,
                           NULL,              /* ArgList */
                           (Cardinal)0        /* num of Args */
                           );

  /* set default widget parameters (including window size) */
  XtAppSetFallbackResources (app_con, default_resources);

  /* map actions to subroutines */
  XtAppAddActions (app_con, actions, XtNumber (actions));

  /* create canvas widget as child of shell widget; realize both */
  XtSetArg(wargs[0], XtNargc, argc);
  XtSetArg(wargs[1], XtNargv, argv);
  canvas = XtCreateManagedWidget ((String)"", coreWidgetClass,
                                  shell, wargs, (Cardinal)2);
  XtRealizeWidget (shell);

  /* for the canvas widget, map events to actions */
  XtSetArg (wargs[0], XtNtranslations, 
            XtParseTranslationTable (translations));
  XtSetValues (canvas, wargs, (Cardinal)1);

  /* initialize GNU libplot */
  display = XtDisplay (canvas);
  pl_parampl ("XDRAWABLE_DISPLAY", display);
  window = XtWindow (canvas);
  pl_parampl ("XDRAWABLE_DRAWABLE1", &window); 
  pl_parampl ("BG_COLOR", bg_colorname);
  handle = pl_newpl ("Xdrawable", NULL, NULL, stderr);
  pl_selectpl (handle);
  pl_openpl ();
  pl_fspace (0.0, 0.0, 1000.0, 1000.0);
  pl_flinewidth (0.25);     

  /* transfer control to X Toolkit event loop (doesn't return) */
  XtAppMainLoop (app_con);

  return 1;
}

X Window システムのプログラミングに詳しくなくても、 このサンプル・プログラムの構造は把握できるだろう。 このプログラムには3つのコールバック、RedrawToggleQuit が定義されている。それぞれ 1) ウィンドウがアクティブになった、 マウスクリックがあった、2) マウスクリック、3) `q' がキー入力された、というイベントがあったときに呼ばれる。 最初に行われる `C' 曲線 (赤い線) の描画は 生成後最初にアクティブになったときに、 そのイベントが生成されたウィンドウに通知されることにより実行される。

このサンプル・プログラムは、 ウィンドウのリサイズに対応するようにも簡単に書き換えられる。 しかし実際には X Drawable Plotter は画面に直接ではなく、 ビットマップ画像として描画するときに用いるのが普通である。 ビットマップ画像はウィンドウと違って、リサイズされない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3 libplotter を使った C++ プログラミング


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3.1 Plotter クラス

libplot の C++ バインディングは libplotter というクラス・ライブラリとして提供されている。このライブラリでは、Plotter をインスタンスとして実装されている Plotter クラスが利用できる。 実際には各 Plotter は、出力形式で定義される派生クラスのインスタンスとなる。 現在実装されている派生クラスは XPlotterXDrawablePlotterPNMPlotterGIFPlotterAIPlotterPSPlotterFigPlotterPCLPlotterHPGLPlotterTekPlotterMetaPlotter である。 それぞれの出力形式は、名前から分かる通りである。Plotter インスタンスの操作 (たとえば新しいページを作る openpl など) は Plotter クラスの public のメンバー関数として実装されている。

Plotter インスタンスを生成するときには、入力元、出力先、 エラーの出力先をそれぞれ指定しなければならない (現在の実装では、 入力もとは無視される。Plotter クラスはすべて書き出すのみで入力を受け付けないからである)。 出力先、エラーの出力先はそれぞれ、iostreams でも FILE ポインタでも指定でき、それぞれコンストラクタがある。

 
  Plotter(istream& instream, ostream& outstream, ostream& errstream);
  Plotter(FILE *infile, FILE *outfile, FILE *errfile);

これらはそれぞれ Plotter 基本クラス、および各派生クラスにも用意されている。 例えば

 
PSPlotter plotter(cin, cout, cerr);

と次の

 
PSPlotter plotter(stdin, stdout, stderr);

はどちらも、標準出力に画像データを出力する PostScript インスタンスの宣言となる。 iostream を使った場合は、ストリーム・バッファが null の ostream を出力先あるいはエラーの出力先に指定すると、その出力が抑制される。 FILE ポインタを使った場合は、FILE に null を指定すると同じことになる。XPlotter および XDrawablePlotter クラスのインスタンスは X のディスプレイに描画を行うため、 コンストラクタの出力先を指定する引数は単に無視される。

libplot のどの言語バインディングでも、パラメータを設定する関数 parampl は重要な役割をしているが、libplotter では Plotter クラスの static なメンバー関数として実装されている。 正確に説明すると、以下のようになる。

int Plotter::parampl (const char *parameter, void *value);

Plotter::parampl はデバイスドライバのパラメータ parameter の値を value に設定する。Plotter の動作のオプションをデバイスドライバのパラメータで指定できる。Plotter インスタンスが生成されるときに、 パラメータの値が有効であればインスタンス内にコピーされる。 ほとんどのパラメータの値 valuechar *、つまり文字列である。 無効な値を指定した場合は、無視される。デバイス独自のパラメータ に指定できるパラメータ値のリストを挙げてある。

C バインディングと同様、Plotter::parampl でパラメータ値を設定して、その後に生成される Plotter インスタンスを制御することができる。Plotter が参照するパラメータ値は、その Plotter インスタンスが削除されるまで定数として扱われる。Plotter の生成時にパラメータが設定されていない場合はデフォルト値が使われる。 しかしパラメータが文字列を取るもので、同名の環境変数がある場合は、 その環境変数の値がパラメータとして使われる。

設定されたパラメータは Plotter::parampl でそのパラメータ値に NULL を指定して呼ぶことで、 設定されていない状態に戻すことができる。 これによりプログラミングの自由度を高くしている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3.2 C++ でのコンパイルとリンク

C++ で libplotter を使うプログラムを書くとき、そのソースファイルには以下の行が必要である。

 
#include <plotter.h>

ヘッダファイル plotter.hlibplotter の配布パッケージの一部として含まれており、C++ コンパイラが見つけられる場所に置いておかねばならない。 このファイル中では Plotter クラスとその派生クラスが宣言されており、 その他の色々な宣言も行われている。またこの中から <iostream.h><stdio.h> が include されているので、別途それらの include 分を書く必要はない。

作成したプログラムを libplotter とリンクするには、コンパイル時にコマンドライン・オプションに `-l' が必要になる。たとえば以下のようにする。

 
-lplotter -lXaw -lXmu -lXt -lXext -lX11 -lm

最近の X Windows システムでは以下のようになるだろう。

 
-lplotter -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lm

(Athena ウィジェットの代わりに Motif ウィジェットを使うシステムでは `-lplotter -lXm -lXt -lXext -lX11 -lm'`-lplotter -lXm -lXt -lXext -lX11 -lm -lc -lgen'`-lplotter -lXm -lXt -lXext -lX11 -lm -lc -lPW' のいずれかになるだろう。また最近の X Window システムではオプションに `-lSM -lICE' を追加する必要があるかもしれない。さらに Motif の最近のバージョンでは `-lXp' も必要かもしれない。)

場合によっては libplotter やその他のライブラリのインストールされているディレクトリを、 コマンドラインで指定する必要がある。たとえば X Window のライブラリを指定するオプション `-lXaw -lXmu -lXt -lSM -lICE -lXext -lX11' を使うには `-L/usr/X11/lib' といったオプションを同時に指定せねばならないかもしれない。

多くの場合 libplotter は DLL (dynamically linked library、または `shared' ライブラリ) としてインストールされる。この場合、 リンクはコンパイル時には行われず、プログラムの実行時に行われることになる。 その際ライブラリのある場所は環境変数 LD_LIBRARY_PATH によって示される。libplotter を使うプログラムが正常に実行されるためには、 そのライブラリのあるディレクトリを LD_LIBRARY_PATH に設定しておかねばならない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3.3 C++ でのサンプル・プログラム

前章では libplot の C バインディングでベクトル形式の描画を行うサンプルの C プログラムをいくつか示した (参照: C 言語でのサンプル描画) が、 ここではそれらの C プログラムを、libplot の C++ バインディングである libplotter を使うように修正したプログラムを例としてあげる。 実行方法や得られる出力は、C のものと同じである。

以下の C++ プログラムは、美しく絡まる Bill Gosper の "C" 曲線を描く。

 
#include <plotter.h>
#define MAXORDER 12
     
void draw_c_curve (Plotter& plotter, double dx, double dy, int order)
{
  if (order >= MAXORDER)
    plotter.fcontrel (dx, dy);	// continue path along (dx, dy)
  else
    {
      draw_c_curve (plotter, 
                    0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
      draw_c_curve (plotter,
                    0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);
    }
}
     
int main ()
{
  // set a Plotter parameter
  Plotter::parampl ("PAGESIZE", "letter");
     
  PSPlotter plotter(cin, cout, cerr); // declare Plotter
  if (plotter.openpl () < 0)          // open Plotter
    {
      cerr << "Couldn't open Plotter¥n";
      return 1;
    }

  plotter.fspace (0.0, 0.0, 1000.0, 1000.0); // specify user coor system
  plotter.flinewidth (0.25);       // line thickness in user coordinates
  plotter.pencolorname ("red");    // path will be drawn in red
  plotter.erase ();                // erase Plotter's graphics display
  plotter.fmove (600.0, 300.0);    // position the graphics cursor
  draw_c_curve (plotter, 0.0, 400.0, 0);
  if (plotter.closepl () < 0)      // close Plotter
    {
      cerr << "Couldn't close Plotter¥n";
      return 1;
    }
  return 0;
}

上のプログラムは、前章の C プログラムを単純に書き直しただけである。 ここでは PSPlotter クラスのインスタンスとして plotter を宣言している。このインスタンスの出力先は cout に設定されている。 そのメンバー関数を呼び出すことで、描画操作を行う。

オブジェクト指向な方法での描画操作は、C バインディングの場合よりも自然な感じがするだろう。 libplotter を使うと、複数の Plotter を使うのが非常に楽になる。Plotter を切り替える必要はない。そのときに存在する Plotter インスタンスのどれにでもいつでも描画操作を行える。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4 libplot の関数リスト

GNU libplot は現在、92 の Plotter 操作を実装している。 libplot 言語バインディングはその各操作に対応する 92 個の関数を実装している。C バインディングでは、その 92 個の関数は C の API (application programming interface) である。 C++ バインディングでは、それらは Plotter クラスの public なメンバー関数である。

言語バインディングには Plotter オブジェクトの生成、選択、削除のための関数も含まれる。 たとえば C バインディングではそれぞれ pl_newplpl_selectplpl_deletepl である。参照: C 言語での API。また C バインディングでは、ヘッダファイル plotcompat.h が include されない限り、各関数の名前の先頭には "pl_" が付けられている。 参照: C 言語でのコンパイルとリンク

指定されている Plotter に対して様々な操作を行うこの 92 の関数は、以下の4種類に分けられる。

多くの関数は、整数版と倍精度実数版の二種類が用意されている。libplot は内部では倍精度実数を使っている。 整数版は後方互換性を保つために用意されているものである。 この二種類が用意されている関数では、実数版の関数名の先頭に `f' という文字が付けられている。

また多くの関数に、絶対値版と相対値版が用意されている。 後者は相対座標 (カーソルの現在位置からの相対座標値) を使い、 関数名の末尾に `rel' が付けられている。

現在、92 種の関数のうち、返り値に意味のある関数は少ない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4.1 準備関数

以下に挙げるのは libplot の「準備関数」である。 これらは、すでに生成されている Plotter に対してオープン、初期化、削除といった操作を行う。 以下に、おおよそ実際に使われるときの順番で列挙する。

C バインディングでは、ヘッダファイル plotcompat.h が include されない限り、関数名の先頭に "pl_" が付く。参照: C 言語でのコンパイルとリンク。 C++ バインディングでは、これらは Plotter クラスの public なメンバー関数である。

int openpl ();

Plotter をオープンし、画像のページを新しくはじめる。 この時 Plotter の描画属性はデフォルト値に設定される。 Plotter がオープンできなかったときは負の値を返す。

X の Plotter では openpl で新しくページが開始すると X Window のディスプレイ上に新しくウィンドウを開かれる。 将来的には一つのウィンドウ上に次の描画を行うようになる予定である。

int bgcolor (int red, int green, int blue);

Plotter のグラフィクス・ディスプレイの背景色を、48 ビット RGB で指定される色に設定する。引数の redgreenblue にそれぞれ背景色での赤、緑、青の濃さを指定する。濃さの指定は 0x00000xffff、つまり 0…65535 の範囲内の整数で行う。 (0, 0, 0) を指定すると黒に、(65535, 65535, 65535) を指定すると白になる。

bgcolor は出力形式がビットマップ画像の Plotter でしか有効ではない。 X、X Drawable、PNM、GIF の各 Plotter である。 この設定の効果は単純である。この設定の後に呼ばれる erase 操作で、 描画領域全体がこの色で塗りつぶされるだけである。

int bgcolorname (const char *name);

Plotter のグラフィクス・ディスプレイの背景色を、name に設定する。 設定できる色名については 色名 を参照のこと。 無効な色名を指定したときは "white" に置き換えられる。

bgcolorname は出力形式がビットマップ画像の Plotter でしか有効ではない。 X、X Drawable、PNM、GIF の各 Plotter である。 この設定の効果は単純である。この設定の後に呼ばれる erase 操作で、 描画領域全体がこの色で塗りつぶされるだけである。

int erase ();

複数フレームを含むページにおいて、 それまでにグラフィクス・ディスプレイに描かれている図形をすべて消去し、 背景色が設定されていればそれで全体を塗りつぶし、新しいフレームを開始する。

openpl によって新しくページをはじめた直後に erase を呼ぶと便利なことがよくある。Plotter の種類によっては openplclosepl の間に描かれた画像が その後に openpl を呼んで新しくページを始めても残っているからである。 現在、X Drawable と Tektronix がそういった Plotter である。 将来的には、X の Plotter でもこの機能を利用できるようにする予定である。

X と X Drawable の Plotter ではデバイスドライバのパラメータ USE_DOUBLE_BUFFERING が "yes" に設定されていると、 erase の挙動が変わってくる。その場合、 図形はグラフィクス・ディスプレイではなくバッファに描かれるため、 erase は (1) バッファの内容をディスプレイにコピーし、 (2) バッファを背景色で塗りつぶす、という作業を行う。 この「二重バッファリング」によりアニメーションを滑らかにすることができる。 参照: デバイス独自のパラメータ

int space (int x0, int y0, int x1, int y1);
int fspace (double x0, double y0, double x1, double y1);

グラフィクス・ディスプレイの左下隅と右上隅の、 プログラム側で想定する座標系上での座標値を、二組の数値で設定する関数である。 space または fspace を呼び出すことで、 プログラム側の座標系からデバイスドライバの座標系へのアフィン変換が設定される。 openpl を呼ぶなどして新しくページを開始したら、 すぐにこのどちらかの関数を呼ばねばならない。

int space2 (int x0, int y0, int x1, int y1, int x2, int y2);
int fspace2 (double x0, double y0, double x1, double y1, double x2, double y2);

これらは spacefspace の拡張版であり、どちらを使っても構わない。 引数で、「アフィン窓」(平行四辺形を描く) を定義する3つのプログラム側の座標系上の座標を指定する。 3つの座標はそれぞれ、左下隅、右下隅、右上隅である。 ウィンドウはアフィン変換でグラフィクス・ディスプレイにマッピングされる。

int havecap (const char *s);

Plotter が指定された機能を使えるかどうかを調べる。その Plotter は選択されている必要はない。返り値は 0, 1, 2 のいずれかであり、 それぞれ no/yes/maybe を意味する。指摘できない機能が指定されたときには 0 を返す。指定できる機能には "WIDE_LINES" (デフォルト以外の太さの線が描けるか)、 "DASH_ARRAY" (linedash 機能を使って任意の細かさの破線が描けるか)、 "SETTABLE_BACKGROUND" (背景色をカラーで設定できるか)、"SOLID_FILL" などである。 "HERSHEY_FONTS"、"PS_FONTS"、"PCL_FONTS"、"STICK_FONTS" でそれぞれの形式のフォントが使えるかどうかが分かる。参照: 利用できるフォント

Tektronix 以外の Plotter では "SOLID_FILL" 機能により、 単色で塗りつぶしができる。これができる Plotter では少なくとも "EVEN_ODD_FILL" か "NONZERO_WINDING_NUMBER_FILL" のどちらかが使える。 これにより、「曲線の内側」をどう決定するかが選べる。

Metafile の Plotter では、ほとんどの機能について返り値が `maybe' になる。 その Plotter 自身では描画を行わないからである。Metafile の Plotter の出力は plot を使って他の形式に変換するか、画面に表示するかせねばならない。

int flushpl ();

出力デバイスに、すべての描画命令を書き出す。 これはリアルタイムの Plotter でのみ意味のある操作であり、 それまでに描画された図形をすべてディスプレイに描き、 画面上で見えるようにするための操作である。 リアルタイムでない Plotter に対してこの操作を行っても、なにも行われない。

int closepl ();

Plotter をクローズして、ページの描画を終了する。Plotter がクローズできなかったときには、非零の値を返す。

libplot の現在の実装では、closepl が呼ばれたときにリアルタイムでページを描画する Plotter がいくつかある。たとえば PCL と HP-GL の Plotter がそうである。同様に、単ページしか描画できない Plotter では、closepl が呼ばれたときにすぐにページを終了し、描画データを出力する (PNM、GIF、Illustrator、Fig の各 Plotter)。しかし PostScript の Plotter では、その Plotter が削除されるときにすべてのページが出力される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4.2 図形関数

以下に libplot の「描画関数」を説明する。これらを Plotter に対して実行した時、そのグラフィクス・ディスプレイに図形オブジェクト (パス、円、楕円、点、記号、文字列) が描かれる。 パスはここでは線分、円弧 (真円でも楕円でも)、ベジェ曲線 (二次でも三次でも) がいくつかつながったものである。 パスは、その各部が一つずつ順番に描かれ、つなげられていく。

C バインディングでは、ヘッダファイル plotcompat.h が include されない限り、関数名の先頭に "pl_" が付く。参照: C 言語でのコンパイルとリンク。 C++ バインディングでは、これらは Plotter クラスとその派生クラスの public なメンバー関数である。

int alabel (int horiz_justify, int vert_justify, const char *s);

3つの引数 horiz_justifyvert_justifys で 均等割付けや左右揃えが行われる「整形文字列」を指定する。 描画中のパスは (もしあれば) 描き終わらせられ、 文字列 s が指定された方法で整形され、描かれる。 horiz_justify`l'`c'`r' のときそれぞれ、 そのときのカーソルの位置に対して左揃え、センタリング、右揃えが行われる。 vert_justify`b'`x'`c'`t' のときそれぞれ、 そのときのカーソルの位置に文字列の下端、ベースライン、中央、上がそろえられる。 左揃えが行われたときはカーソルは文字列の右端に、 右揃えが行われたときは文字列の左端にカーソルは移動する。

文字列には各種のエスケープ・シーケンスを入れることができる (文字列とエスケープ・シーケンス を参照のこと)。しかし改行 (LF と CR) は入れられない。 実際には文字列には印刷可能な文字だけ、つまりアスキーコードで言うと 0x200x7e0xa00xff の範囲の文字が使える。 textangle を使えば文字列を傾けることができる。

int arc (int xc, int yc, int x0, int y0, int x1, int y1);
int farc (double xc, double yc, double x0, double y0, double x1, double y1);
int arcrel (int xc, int yc, int x0, int y0, int x1, int y1);
int farcrel (double xc, double yc, double x0, double y0, double x1, double y1);

arcfarc の6つの引数はそれぞれ、描く円弧の始点 (x0, y0)、終点 (x1, y1)、中点 (xc, yc) である。もしカーソルが始点にあって、パスがまだ描き終わってないときは、 描く円弧はそのパスの一部になる。そうでなければ描画途中のパスの描画は終了し、 新しいパスとして円弧が描かれる。いずれにしてもグラフィクス・カーソルは終点 (x1, y1) に移動する。

弧の向き (時計回りまたは半時計回りのどちらか) は、(xc, yc) に中心を持つ円弧の角度が 180°以下になるような回転方向になる。 もし指定された3点が1本の直線上に乗っている場合、 円弧の方向は半時計回りになる。またもし、(xc, yc) からの距離が (x0, y0) と (x1, y1) で異なっている場合は、 (x0, y0) と (x1, y1) を結ぶ線分の垂直二等分線上のもっともに近い場所に (xc, yc) が移動される。arcrelfarcrel は、カーソルに対する相対座標を使うこと以外は arcfarc と同じである。

int bezier2 (int x0, int y0, int x1, int y1, int x2, int y2);
int fbezier2 (double x0, double y0, double x1, double y1, double x2, double y2);
int bezier2rel (int x0, int y0, int x1, int y1, int x2, int y2);
int fbezier2rel (double x0, double y0, double x1, double y1, double x2, double y2);

bezier2fbezier2 は6つの引数で指定される3つの点、 つまり始点 p0=(x0, y0) と終点 p2=(x2, y2)、その間にある制御点 p1=(x1, y1) からなる二次のベジェ曲線を描画する。 もしカーソルが始点 p0 にあって、パスがまだ描き終わってないときは、 そのパスの続きとして描かれる。 そうでなければ描画途中のパスの描画は終了し、 新しいパスとしてベジェ曲線が描かれる。 いずれにしてもグラフィクス・カーソルは終点 p2 に移動する。 bezier2relfbezier2rel は、カーソルに対する相対座標を使うこと以外は bezier2fbezier2 と同じである。

二次のベジェ曲線では、 点 p0p1を結ぶ線分が p0 における接線、 点 p1p2を結ぶ線分が p2 における接線である。 したがってこれは p0p1p2 を頂点とする三角形にぴったりとあてはまる。

PCL Plotter で LaserJet III にベジェ曲線を描く場合は、パラメータ PCL_BEZIERS を "no" にせねばならない。LaserJet III はヒューレット・パッカードの最初の PCL 5 プリンタで、 これ以降の PCL 5 と違ってベジェ曲線を描く命令をサポートしていない。 デバイス独自のパラメータ を参照のこと。

int bezier3 (int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
int fbezier3 (double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3);
int bezier3rel (int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
int fbezier3rel (double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3);

bezier3fbezier3 は8つの引数で指定される4つの点、 つまり始点 p0=(x0, y0) と終点 p2=(x3, y3)、その間にある2つの制御点 p1=(x2, y2)、 p1=(x1, y1) からなる三次のベジェ曲線を描画する。 もしカーソルが始点 p0 にあって、パスがまだ描き終わってないときは、 そのパスの続きとして描かれる。 そうでなければ描画途中のパスの描画は終了し、 新しいパスとしてベジェ曲線が描かれる。 いずれにしてもグラフィクス・カーソルは終点 p3 に移動する。 bezier3relfbezier3rel は、カーソルに対する相対座標を使うこと以外は bezier3fbezier3 と同じである。

三次のベジェ曲線では、 点 p0p1を結ぶ線分が p0 における接線、 点 p2p3を結ぶ線分が p3 における接線である。 したがってこれは p0p1p2p3 を頂点とする四角形にぴったりとあてはまる。

PCL Plotter で LaserJet III にベジェ曲線を描く場合は、パラメータ PCL_BEZIERS を "no" にせねばならない。LaserJet III はヒューレット・パッカードの最初の PCL 5 プリンタで、 これ以降の PCL 5 と違ってベジェ曲線を描く命令をサポートしていない。 デバイス独自のパラメータ を参照のこと。

int box (int x1, int y1, int x2, int y2);
int fbox (double x1, double y1, double x2, double y2);
int boxrel (int x1, int y1, int x2, int y2);
int fboxrel (double x1, double y1, double x2, double y2);

boxfbox は4つの引数で指定される2つの点、 つまり左下隅 (x0, y0) と右上隅 p1=(x1, y1) で指定される箱形の長方形を描画する。 パスがまだ描き終わってないときは、 描画途中のパスの描画は終了し、 新しいパスとして長方形が描かれる。 グラフィクス・カーソルは長方形の中心に移動する。 boxreffboxref は、カーソルに対する相対座標を使うこと以外は boxfbox と同じである。

int circle (int xc, int yc, int r);
int fcircle (double xc, double yc, double r);
int circlerel (int xc, int yc, int r);
int fcirclerel (double xc, double yc, double r);

circlefcircle は3つの引数で指定される中心 (xc, yc) と半径 (r) の円を描く。 パスがまだ描き終わってないときは、 描画途中のパスの描画は終了し、 新しいパスとして長方形が描かれる。 グラフィクス・カーソルは中心 (xc, yc) に移動する。 circlerelfcirclerel は、中心の座標にカーソルに対する相対座標を使うこと以外は circlefcircle と同じである。

int cont (int x, int y);
int fcont (double x, double y);
int contrel (int x, int y);
int fcontrel (double x, double y);

contfcont は2つの引数で指定される点 (x, y) までの線分をカーソル位置から描く。 パスが描画途中のときはそのパスに続けられる。そうでないときは新しいパスになる。 どちらの場合もグラフィクス・カーソルは中心 (xc, yc) に移動する。 contrelfcontrel は、中心の座標にカーソルに対する相対座標を使うこと以外は contfcont と同じである。

int ellarc (int xc, int yc, int x0, int y0, int x1, int y1);
int fellarc (double xc, double yc, double x0, double y0, double x1, double y1);
int ellarcrel (int xc, int yc, int x0, int y0, int x1, int y1);
int fellarcrel (double xc, double yc, double x0, double y0, double x1, double y1);

ellarcfellarc は6つの引数で指定される3つの点 pc=(xc,yc)、 p0=(x0,y0)、 p1=(x1,y1) で指定される、四半楕円と呼ばれる図形を描く。 これは中心が pcp0 から p1 につながる楕円弧である。 もしカーソルが始点 p0 にあって、パスがまだ描き終わってないときは、そのパスの続きとして描かれる。 そうでなければ描画途中のパスの描画は終了し、新しいパスとして描かれる。 いずれにしてもグラフィクス・カーソルは終点 p1 に移動する。

四半楕円は四半円をアフィン変換したものである。つまりこれには p0p1p0+p1-pc という制御点があることになる。したがって描かれる曲線は点 p0p0p0+p1-pc を結ぶ線分に接し、 p1p1p0+p1-pc を結ぶ線分に接することになる。 したがって描かれる四半楕円はこれらの制御点を頂点とする三角形に、 ぴったりとあてはまる。3つめの制御点は、pcp0p1 を結ぶ線分で対称な位置に移した点である。 ellarcrelfellarcrel は、カーソルに対する相対座標を使うこと以外は ellarcfellarc と同じである。

int ellipse (int xc, int yc, int rx, int ry, int angle);
int fellipse (double xc, double yc, double rx, double ry, double angle);
int ellipserel (int xc, int yc, int rx, int ry, int angle);
int fellipserel (double xc, double yc, double rx, double ry, double angle);

ellipsefellipse は5つの引数、つまり中心 (xc, yc)、 長径と短径の長さ (rx and ry)、プログラム側の座標系の x 軸からの傾き angle で表される楕円を描く。 描画途中のパスの描画は終了し、新しいパスとして楕円が描かれる。 描画終了時にカーソルは (xc, yc) に移動する。 ellipserelfellipserel は、カーソルに対する相対座標を使うこと以外は ellipsefellipse と同じである。

int endpath ();

描画途中のパスがあれば、それを終了する。パスは1回あるいは複数回の contlinearcellarcbezier2bezier3 やその実数版の操作で作られていく。 パスでない図形の描画や、パスに関連する描画属性がなにか設定されているときは movefmove でカーソル位置を移動することで、パスの描画は完結する。 したがってほとんどの場合、endpath を明示的に行う必要はない。しかし Plotter がリアルタイムで描画を行っているときは、endpath を呼ぶことで明示的に、 そのときにパスをグラフィクス・ディスプレイ上に描画させることができる。

int label (const char *s);

引数で指定された文字列を現在のカーソル位置に描画する。 文字列は左揃えになり、カーソルは文字列の右端に置かれる。 これは後方互換性を確保するために用意されているものであり、 alabel(`l',`x',s) とするのと同じである。

int labelwidth (const char *s);
double flabelwidth (const char *s);

labelwidthflabelwidth 引数で指定された文字列の幅を、 プログラム側座標における現在のフォントの場合で計算して返す。なにも描画しない。

int line (int x1, int y1, int x2, int y2);
int fline (double x1, double y1, double x2, double y2);
int linerel (int x1, int y1, int x2, int y2);
int flinerel (double x1, double y1, double x2, double y2);

linefline は、4つの引数で指定される2つの点、 つまり始点 (x1, y1) と終点 (x2, y2) を結ぶ線分を描く。 もしカーソルが (x1, y1) にあって、パスがまだ描き終わってないときは、 そのパスの続きとして描かれる。 そうでなければ描画途中のパスの描画は終了し、 新しいパスとして線分が描かれる。 いずれにしてもグラフィクス・カーソルは (x2, y2) に移動する。 linerelflinerel は、カーソルに対する相対座標を使うこと以外は linefline と同じである。

int marker (int x, int y, int type, int size);
int fmarker (double x, double y, int type, double size);
int markerrel (int x, int y, int type, int size);
int fmarkerrel (double x, double y, int type, double size);

markerfmarker は4つの引数、つまりプログラム側座標系での位置 (x,y)、種類、サイズの指定にしたがって記号を描画する。 描画途中のパスがあればその描画は終了し、記号が描かれる。 グラフィクス・カーソルの位置は (x,y) になる。 markerrelfmarkerrel は、カーソルに対する相対座標を使うこと以外は markerfmarker と同じである。

描かれる記号の種類番号 0 から 31 までは標準で用意されている記号、 32 以上のものはそのときのフォントのキャラクタ・マップ上の番号とみなされる。 参照: プロット記号

int point (int x, int y);
int fpoint (double x, double y);
int pointrel (int x, int y);
int fpointrel (double x, double y);

pointfpoint は2つの引数で指定される1点に、点を描く。 描画途中のパスがあればその描画は終了し、点が描かれる。 (ビットマップ形式の画像を出力する Plotter では、一つの点は 1 ピクセルとして描かれる。他の Plotter ではほとんどの場合、 描画できる最小の塗りつぶした円として描かれる。) グラフィクス・カーソルは (x, y) に移動する。 pointrelfpointrel は、カーソルに対する相対座標を使うこと以外は pointfpoint と同じである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4.3 属性設定関数

以下に libplot の「属性操作」を行う関数を説明する。Plotter に対してこれらの関数を実行することで その関数が対象とする描画属性を指定する値に設定したり、 保存、再設定を行ったりできる。 たとえばパスに関連する属性には、 カーソル位置、ペンの色、塗りつぶしの色、塗りつぶしのパターン、 線の太さ、線種、線の端点の形、角の尖り具合がある。 文字列に関する属性には、 ペンの色、フォント名、フォントサイズ、傾きがある。

パスの属性を設定すると、endpath を呼んだときと同様、パスの描画が途中であれば、それは完結させられる。

C バインディングでは、ヘッダファイル plotcompat.h が include されない限り、関数名の先頭に "pl_" が付く。参照: C 言語でのコンパイルとリンク。 C++ バインディングでは、これらは Plotter クラスとその派生クラスの public なメンバー関数である。

int capmod (const char *s);

グラフィクス・ディスプレイに連続して描かれるパスの、両端の形を指定する。 指定できる形は、 "butt" (デフォルト)、"round"、"projecting" である。 指定されたそれぞれの形状は、線がある程度太くないと見分けがつきにくい。"butt" を指定した時、パスの長さはそれによって長くなることはない。 他の場合は長くなる。"round" では塗りつぶした半円が付き、 "projecting" では塗りつぶした長方形が線の端に付く。 これにより線の長さがそこで、線の太さの半分だけ長くなる。

PCL とHP-GL の Plotter では "triangular" も指定できる。他の Plotter で これを指定すると、"round" と同じ扱いになる。

この機能は Tektronix の Plotter では無効である。またパラメータ HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも無効である (2 がデフォルト)。参照: デバイス独自のパラメータ

int color (int red, int green, int blue);

この関数を使うと、pencolorfillcolor を呼んでこれ以降に描かれるすべての図形の pencolorfillcolor を同じ色に設定するのと同じことができる。塗りつぶしのときに実際に使われる色は filltype を呼んで指定される「塗りつぶし率」によって変わる。

int colorname (const char *name);

この関数を使うと、pencolornamefillcolorname を呼んでこれ以降に描かれるすべての図形の pencolor と fillcolor を同じ色に設定するのと同じことができる。 塗りつぶしのときに実際に使われる色は filltype を呼んで指定される「塗りつぶし率」によって変わる。

int fillcolor (int red, int green, int blue);

これ以降に描かれるすべての図形の塗りつぶし色 fillcolor を 48-bit RGB で指定する。引数 redgreenblue で塗りつぶし色の赤、緑、青の濃さを指定する。それぞれ 0x00000xffff、つまり 0…65535 の範囲の整数である。 (0, 0, 0) を指定すると黒に、(65535, 65535, 65535) を指定すると白になる。 塗りつぶしのときに実際に使われる色は filltype を呼んで指定される「塗りつぶし率」によって変わる。

int fillcolorname (const char *name);

これ以降に描かれるすべての図形の塗りつぶし色を色名 name で指定される色に設定する。 設定できる色名については 色名 を参照のこと。 無効な色名を指定したときは "black" に置き換えられる。 塗りつぶしのときに実際に使われる色は filltype を呼んで指定される「塗りつぶし率」によって変わる。

int fillmod (const char *s);

これ以降に描かれるすべての図形について、塗りつぶし判定の仕方を指定する。これは、 グラフィクス・ディスプレイ上のある点がパスの内側かどうかを判定する方法である。 "even-odd" (どの Plotter でもこれがデフォルト) または "nonzero-winding" が指定できる。詳しくは Postscript Language Reference Manual を参照のこと。"even-odd" の代わりに "alternate"、 "nonzero-winding" の代わりに "winding" と指定しても良い。

Fig の Plotter では "nonzero-winding" は無効である。これは xfig がその機能をサポートしていないからである。 HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも無効である (2 がデフォルト)。参照: デバイス独自のパラメータ

LaserJet III はヒューレット・パッカードの最初の PCL 5 プリンタで、 これ以降の PCL 5 プリンタと違って nonzero-winding をサポートしていない。

int filltype (int level);

これ以降に描かれる図形の塗りつぶしの濃さを指定する。level の値を 0 にすると、図形は塗りつぶされないか、図形の内側が透明化される。 これがデフォルトである。指定できる値は 0x00010xffff、 つまり 1…65535 の範囲の整数である。 level の値を 1 にすると 100% の濃さ (fillcolorfillcolorname で指定されるままの色) で塗りつぶされる。level=0xffff とすると白色で塗りつぶされる。0x0001 から 0xffff の間の値は彩度 (の逆) またはグレイスケールと見なされる。たとえば 0x8000 は彩度を 50% にして塗りつぶす (実際に塗りつぶされる色は fillcolorfillcolorname で指定された色と白色の中間の色になる)。

Tektronix の Plotter は塗りつぶしができない。また HP-GL の Plotter はパラメータ HPGL_VERSION が "1.5" か "2" (2 がデフォルト) のときにだけ有効である (バージョンが "1" のときは、 座標軸上に置かれた円と長方形だけが塗りつぶし可能である)。 白色を含めた不透明塗りつぶしは、HPGL_VERSION が "2" で パラメータ HPGL_OPAQUE_MODE が "yes" のとき (それがデフォルト) だけ可能である。参照: デバイス独自のパラメータ

int fmiterlimit (double limit);

これ以降に描かれるパスの、角の尖り具合を指定する。パスの連結のモードが "miter" に設定されている時 (それがデフォルト) のときに有効である。 パスの連結点における角の内側から外側までの長さが「角幅」である。 この角幅の線の太さに対する割合の最大限度をこの関数で設定できる。 角幅が指定の値を超える場合、パスの連結モードが "bevel" に変更され、 角が切り落とされる。

limit の値は 10.43 (デフォルト値。 パスの連結する角度が 11°以下になるとこの値を超える)、または 2.0 (同じく 60°)、または 1.414 (同じく 90°) にすることが多い。 この値は、パスの連結する角度の 1/2 の余割 (コセカント) である。 limit の値を 1.0 にすると連結する角度に関係なくすべてベベルモードになる。 1.0 以下にするとデフォルト値に設定しなおされる。

X Drawable または X の Plotter ではこの設定は無効である。X Window システムの設定は 10.43 のまま変更できないからである。 また Tektronix と Fig の Plotter でも無効であり、 HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも無効である (2 がデフォルト)。参照: デバイス独自のパラメータ

int fontname (const char *font_name);
double ffontname (const char *font_name);

これ以降に描かれる文字列のフォントを引数 font_name で示されるフォントに設定する。フォントの指定では大文字、小文字を区別せず、 一つのフォントだけが指定できる。(実際に描画される文字は fontnamefontsizetextangle で決定される。) プログラム側座標でのフォントのサイズが返り値になる。

デフォルトのフォントは Plotter の種類によって異なっている。 PNM、GIF、HP-GL、Tektronix、Metafile の Plotter では "HersheySerif" が、 それ以外の Plotter では "Helvetica" がデフォルトである。font_name が NULL または空文字列のとき、あるいは無効なフォントを指定したときは、 デフォルトのフォントが使われる。使えるフォントの種類も Plotter の種類によって異なっている。そのリストに付いては 利用できるフォント を参照のこと。

int fontsize (int size);
double ffontsize (double size);

これ以降に描かれる文字列のフォントのサイズを引数 size に設定する。 (実際に描画される文字は fontnamefontsizetextangle で決定される。) プログラム側座標でのフォントのサイズが返り値になる。 負の値を size に指定するとデフォルトのサイズに設定されるが、 具体的な値は Plotter の種類によって異なる。 普通はディスプレイ (の縦と横の短い方) のサイズの 1/50 がデフォルトである。

int joinmod (const char *s);

これ以降に描かれるパスのつなぎ方を設定する。"miter" (これがデフォルト)、"round"、"bevel" の3種類がある。 線の太さがある程度あれば、3つの種類をそれぞれ見分けられる。 線のつなぎ目が "miter" モードのときは、つなぎ目は尖った角になる。 "round" モードでは丸く、"bevel" モードでは切り落としたような感じになる。 しかし普通は、つなぎ目では角が鋭く尖るのではなく、切り落とされる。 どの程度尖ったら切り落とされるのかは、fmiterlimit を呼んで設定することができる。

PCL とHP-GL の Plotter では "triangular" も指定できる。他の Plotter で これを指定すると、"round" と同じ扱いになる。

この機能は Tektronix の Plotter では無効である。またパラメータ HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも無効である (2 がデフォルト)。参照: デバイス独自のパラメータ

int linedash (int n, const int *dashes, int offset);
int flinedash (int n, const double *dashes, double offset);

これ以降に描かれるパス、円、楕円の線種を指定する。linemod (後述) よりもこの関数の方が的確に描いた鋳物を描ける。引数 dashes はサイズが length n の配列でなければならない。 各要素は正の値でなければならず、プログラム側の座標系での距離とみなされる。 パス、円、楕円の線は、この各要素の値 dashes[0]…dashes[n-1] で交互に、線の長さと線の間の空白の長さを示される破線として描かれる。 配列の終わりまで破線を描いたら、また配列の先頭から繰り返される。 この配列が空の場合、つまり n が 0 のときは、破線にはならず、実線として描かれる。

offset は、破線の、パスの先端からの「位相」を指定する。 つまり破線パターンのいくらか進んだところをパスの先端に合わせて、 そこから破線を描く。 offset が 0 ならパスの先端から破線になり、プログラム側座標で長さ dashes[0] のあとには破線の切れ目の空白になる。もし offsetdashes[0] と同じ値だったら、パスの先頭は長さ dashes[1] の切れ目から始まり、以下同様である。offset は負の値でも良い。

すべての Plotter で linedash および flinedash が有効な訳ではない。 HP-GL と PCL の Plotter では offset は 0 でなければならない。また X と X Drawable の Plotter では破線パターン中の線と空白はそれぞれ 255 ピクセル以下でなければならない。 Tektronix と Fig の Plotter では linedashflinedash は無効である。 またパラメータ HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも無効である (2 がデフォルト)。参照: デバイス独自のパラメータ

注意: プログラム側からデバイス独自の座標系への変換が一様ではない場合、 パスを描く破線上の線の部分の長さは、デバイス上では線の向きによって変化する。 しかし現在これが可能なのは PostScript の Plotter だけである。現在の他の Plotter では、破線の線と空白の長さはパスの向きがどうであっても変わらない。 そのときに使われる線の部分の長さは、 プログラム側座標系で指定された長さから変換されうる長さのうち、 もっとも短い長さになる。

int linemod (const char *s);

これ以降に描かれるパス、円、楕円の線種を指定する。指定できる線種は "solid"、"dotted"、"dotdashed"、"shortdashed"、"longdashed"、"dotdotdashed"、"dotdotdotdashed"、"disconnected" のいずれかである。最後の一つを除くと、それぞれ以下のような破線を意味する。

 
"solid"             --------------------------------
"dotted"            -   -   -   -   -   -   -   -   
"dotdashed"         ----   -   ----   -   ----   -
"shortdashed"       ----    ----    ----    ----    
"longdashed"        -------    -------    -------    
"dotdotdashed"      ----   -   -   ----   -   -
"dotdotdotdashed"   ----   -   -   -   ----   -   -   -

上の図中で、ハイフン一つが描かれている線の太さと同じ長さを示す。 ただしこれは線がある程度太い場合のことであり、その場合は、 線の太さに比例して線分の間隔も広くなる。

"disconnected" は上記とは違って、直径が線の太さの指示値と同じであるような、 塗りつぶされた円でパスを描くことを指示する。パスの連結点 (パスを構成する線分や円弧のつなぎ目) に中心が来るように円が配置される。 円や楕円の線種に "disconnected" を指定すると、連結点がないので、見えなくなる。 この線種を指定されたパス、円、楕円には塗りつぶしは指示できない。

以下の例外除いて、上述の線種はすべて、どの Plotter にも使える。 パラメータ HPGL_VERSION が "2" でないときは、 HP-GL の Plotter では "dotdotdotdashed" は使えない (2 がデフォルト)。 Tektronix の Plotter では "dotdotdotdashed" は無効である。 また TERM を"kermit" にしなければ "dotdotdashed" も無効である。 参照: デバイス独自のパラメータ

int linewidth (int size);
int flinewidth (double size);

これ以降に描かれるパス、円、楕円の線の太さを、 プログラム側の座標系における値で指定する。 負の値を指定すると、その値は無視され、デフォルト値に設定される。 デフォルトの太さは Plotter の種類によって異なる。ほとんどの Plotter では描画領域の (縦か横の短い方の) 幅の長さの 1/850 である。しかし X、X Drawable、PNM、GIF のビットマップ画像の Plotter では、デフォルト値は 0 である。

慣例的に、太さ 0 の線はその Plotter で描画できるもっとも細い線になる。 しかし idrawxfig では、太さ 0 の線は描かれない。 そのため PostScript や Fig の Plotter の出力画像を編集したいようなときは、太さ 0 の線は避けた方が良い。

Tektronix の Plotter では線の太さはデフォルト以外は使えない。 またそれは、パラメータ HPGL_VERSION が 2 より小さいときは HP-GL の Plotter でも同じである (2 がデフォルト)。 デバイス独自のパラメータ を参照のこと。

注意: プログラム側からデバイス独自の座標系への変換が一様ではない場合、 パスを描く線の太さは、デバイス上では線の向きによって変化する。 しかし現在これが可能なのは PostScript の Plotter だけである。現在の他の Plotter では、線の太さはパスの向きがどうであっても変わらない。 そのときに使われる線の太さは、 プログラム側座標系で指定された太さから変換されうる太さのうち、 もっとも短い太さになる。

int move (int x, int y);
int fmove (double x, double y);
int moverel (int x, int y);
int fmoverel (double x, double y);

二つの引数で指定される一つの点 (x, y) にカーソルを移動する。 描画途中のパスがあった場合には、そのパスはそこで完結させられ、カーソルが (x, y) に移動する。これはプロッターがペンを上げて、 線を描かずに指定された点まで移動するのと同じ操作になる。 moverelfmoverel は、カーソルに対する相対座標を使うこと以外は movefmove と同じである。

int pencolor (int red, int green, int blue);

これ以降の描画に使われるペンの色を、48-bit RGB で指定する。 3つの引数 redgreenblue で赤、緑、青の濃さを指定する。それぞれ 0x00000xffff、つまり 0…65535 の範囲の整数である。 (0, 0, 0) を指定すると黒に、(65535, 65535, 65535) を指定すると白になる。

HP-GL の Plotter はパラメータ HPGL_VERSION が "2" で、 パラメータ HPGL_OPAQUE_MODE が "yes" のとき だけペンの色に白色が使える。 参照: デバイス独自のパラメータ

int pencolorname (const char *name);

これ以降の描画に使われるペンの色を、name で指定される色に設定する。 設定できる色名については 色名 を参照のこと。 無効な色名を指定したときは "black" に置き換えられる。

HP-GL の Plotter はパラメータ HPGL_VERSION が "2" で、 パラメータ HPGL_OPAQUE_MODE が "yes" のとき だけペンの色に白色が使える。 参照: デバイス独自のパラメータ

int restorestate ();

現在の描画設定をスタックから取り出す。描画設定の内容には、 この節で説明されている libplot の機能の多くが含まれている。 スタックからそれらを取り出すことにより、 各種の描画属性の設定が取り出した値 (スタックに積んだときの値) に再設定される。 したがって restorestate を呼ぶと自動的に endpath が呼ばれ、 描画途中のパスがあればその描画はそこで終了する。 closepl は、呼ばれると、 それまでに restorestate を読んだときと同様に、 スタックに積まれている描画設定を取り出す。

int savestate ();

現在の描画設定をスタックに積む。描画設定の内容には、 この節で説明されている libplot の機能の多くが含まれている。 描画途中のパスがあれば、そのことも描画設定の一部として扱われる。 これは、パスは線分や円弧を一つずつつなげて描かれるものだからである。 それを含む描画設定が取り出されたときは、 そのパスは描画途中であるとして、続きを描画することができる。

int textangle (int angle);
double ftextangle (double angle);

これ以降に描画される文字列に対して、それを傾ける角度を、引数 angle で度 (degree) で x (横)軸からの角度して指定される値に設定する。 デフォルト値は 0 である。 (実際に描画される文字は fontnamefontsizetextangle で決定される。) プログラム側座標でのフォントのサイズが返り値になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4.4 座標変換関数

以下に libplot の「マッピング関数」について説明する。 これらの関数をある Plotter に対して実行すると、 プログラム側の座標系からデバイス独自の座標系への変換を行う、 アフィン変換が行われる。この変換がどう行われるのかは、 プログラム側の座標系上で考えるようになっている。 関数名は、PostScript 言語で定義されている同様の機能の関数と同様になっている。 これらの関数をどう使うと便利か、については PostScript プログラミングの本か、 Postscript Language Reference Manual を参照されたい。

C バインディングでは、ヘッダファイル plotcompat.h が include されない限り、関数名の先頭に "pl_" が付く。参照: C 言語でのコンパイルとリンク。 C++ バインディングでは、これらは Plotter クラスとその派生クラスの public なメンバー関数である。

int fconcat (double m0, double m1, double m2, double m3, double tx, double ty);

PostScript 形式の変換関数、 つまりアフィン変換を現在のプログラム側の座標系に適用する。 これは、 プログラム側座標の値に 2 x 2 の行列 [m0 m1 m2 m3] をかけ、x 方向に txy 方向に ty だけ平行移動する線形変換である。 fconcat の変換のうち、特定の変換だけを取り出して行う3つの関数 (frotate, fscale, ftranslate) を以下に挙げる。

int frotate (double theta);

プログラム側座標系の座標軸を theta で指定される角度だけ、 プログラム側座標系の原点を中心に回転させる。 原点の位置と xy の長さは変わらない。

int fscale (double sx, double sy);

プログラム側の座標系での xy の単位長さを、元の座標系における sxsy の長さにする。 原点の位置と座標軸の向きは変わらない。

int ftranslate (double tx, double ty);

プログラム側の座標系の原点を、プログラム側座標における x 方向に txty 方向に ty だけ移動する。 xy の長さと座標軸の向きは変わらない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.5 デバイス独自のパラメータ

libplot ライブラリの設計に当たっては、 各描画デバイスの各機能とは独立して描画が行えるようにしているが、 デバイスの機能を十分に利用するために、 デバイスドライバ・パラメータでそういった機能を利用できるようにしている。

C バインディングでは、 デバイスドライバ・パラメータの値は関数 pl_parampl を呼ぶことで設定される。pl_parampl 関数は、Plotter に対して何らかの操作を行う訳ではない。これはあくまでも C バインディングである。 Plotter が参照するデバイスドライバ・パラメータは、その Plotter が閉じられるまで変更できない。またその Plotter が生成されるときにだけ参照される。 デバイスドライバ・パラメータは特定の型を持たない void 型のポインタ (void *) でその値を示される。 多くのデバイスドライバ・パラメータでは、その値は文字列 (char *) である。pl_parampl は何回呼んでもよい。pl_parampl の引数に NULL を指定すると、そのパラメータの設定が解除される。

文字列をとるパラメータの場合、 Plotter の生成時にそれが設定されておらず、 また同名の環境変数も設定されていないときは、 デフォルト値が使われる。 パラメータと同名の環境変数に値がセットされているときは、それが使われる。 これにより、実行時にプログラムを制御することができる。 さほど重要でないようなパラメータを、 プログラムの実行時に環境変数で指定するようにすることができる。

C++ バインディングでは pl_parampl と同等の関数は Plotter::parampl である。これは Plotter クラスとその派生クラスの静的なメンバー関数である。 pl_parampl と同様、この関数も Plotter に何か操作を行う訳ではない。 これ以降に生成される Plotter が参照するパラメータを設定する。

以下に、現在有効なパラメータを列挙する (認識されないパラメータは省いてある)。 重要なパラメータは X の Plotter の DISPLAY、 X、PNM、GIF の Plotter の BITMAPSIZE、 Illustrator、Postscript、Fig、HP-GL の Plotter の PAGESIZE である。 最初にこの3つのパラメータの説明を挙げ、 他のものはその後にアルファベット順に述べる。 たとえば名前が "HPGL" で始まるようなパラメータは、その Plotter に対してだけ有効である。

DISPLAY

(デフォルト値は NULL) グラフィクス・ディスプレイのウィンドウが開かれる X Window システムのディスプレイを指定する。これは X の Plotter でだけ有効である。

BITMAPSIZE

(デフォルト値は "570x570") ピクセル単位でのグラフィクス・ディスプレイのサイズ。これは X、PNM、GIF の Plotter でだけ有効である。X の Plotter では、これが設定されていなければ X resource の Xplot.geometry から自動的に設定される。これは後方互換性を保つための仕様である。

PAGESIZE

(デフォルト値は "letter") グラフィクス・ディスプレイが置かれる用紙のサイズ。これは Illustrator、Postscript、Fig、PCL、HP-GL の Plotter でだけ有効である。 "letter" サイズは 8.5in x 11in である。ISO の"a0"…"a4" や ANSI の "a"…"e" の各サイズも指定できる ("letter" は "a" を、"tabloid" は "b" を指定するのと同じである)。 "legal"、"ledger"、"b5" のそれぞれも指定できる。

Illustrator と Postscript の Plotter では、 グラフィクス・ディスプレイは用紙の中央に置かれ、 余白を残して用紙の幅いっぱいの大きさの正方形の領域になる。 Fig の Plotter ではグラフィクス・ディスプレイの大きさは Postscript と同じだが、xfig のディスプレイの左上隅に置かれる。 PCL とHP-GL でもグラフィクス・ディスプレイの大きさは Postscript と同じだが、その置かれる位置はそれぞれ異なる。PCL の Plotter ではパラメータ PCL_XOFFSET および PCL_YOFFSET での置かれる位置を設定できる。 HP-GL の Plotter ではパラメータ HPGL_XOFFSET および HPGL_YOFFSET が同様に使える。

BG_COLOR

(デフォルト値は "white") 各ページが開始されるときのグラフィクス・ディスプレイの背景色を設定する。これは X、PNM、GIF、X Drawable の各 Plotter で有効である (X Drawable では背景色は erase が呼ばれたときにだけ見えるようになる)。 背景色は Plotter が生成された後でも bgcolor (または bgcolorname) と erase を行うことでいつでも変更できる。無効な色名を指定したときは、 デフォルトの背景色に設定される。指定できる色名については 色名 を参照のこと。

GIF_ANIMATION

(デフォルト値は "yes") このパラメータは GIF の Plotter でだけ有効である。"yes" に設定すると erase で行われる処理が変わる。erase の実行は、その最初のときを除いて、疑似 GIF ファイルに出力される一連の画像の区切りとして扱われる。"no" に設定すると、 他のリアルタイム描画を行わない Plotter における場合と同様に、 描画途中の図形を背景色で塗りつぶすことで消去する。 "no" に設定されている場合、出力される各疑似 GIF ファイルはそれぞれ単一の画像になる。

GIF_DELAY

(デフォルト値は "0") このパラメータは GIF の Plotter でだけ有効である。アニメーション疑似 GIF における各コマの表示時間を 1/100 秒単位で指定する。指定できる範囲は "0"…"65535" である。

GIF_ITERATIONS

(デフォルト値は "0") このパラメータは GIF の Plotter でだけ有効である。アニメーション疑似 GIF において、画像が最後まで表示された後に冒頭からまた繰り返す回数を指定する。 指定できる範囲は "0"…"65535" である。

HPGL_ASSIGN_COLORS

(デフォルト値は "no") このパラメータは HP-GL の Plotter で HPGL_VERSION が "2"のときにだけ有効である。 "no" を指定するとパラメータ HPGL_PENS であらかじめ設定されている色数のペンだけが使えるようになる。"yes" にすると、使えるペンの色は HPGL_PENS による制約を受けず、 必要に応じて設定される #1…#31 の範囲の番号で指定される「論理ペン」に色を設定できる。 カラーの LaserJet プリンタおよび DesignJet プロッター以外では、HP-GL/2 をサポートするデバイスでもこの「論理ペン」機能が使える機種は多くないため、 この機能の利用には注意を払う必要がある。

HPGL_OPAQUE_MODE

(デフォルト値は "yes") このパラメータは HP-GL の Plotter で HPGL_VERSION が "2"のときにだけ有効である。 "yes" を設定すると HP-GL/2 出力は透明モードから不透明モードに切り替わる。 これにより、白色あるいは他の不透明な色による図形の塗りつぶしができるようになる。 同様に、ペン #0 を使うことで白色の線を描けるようになる。HP-GL/2 をサポートしている機器でも必ずしもこの不透明モードやペン #0 による白線が使える訳ではない。特に HP-GL/2 のペン・プロッタでは無効である。 また古い HP-GL/2 の機器でも不透明モードに切り替えるときに不都合が生じるものがある。 HP-GL の Plotter の出力をそういった機器に使うときは、このパラメータを "no" にしておくとよい。

HPGL_PENS

(デフォルト値は HPGL_VERSION が "1.5" または "2" のとき "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan"、 HPGL_VERSION が "1" のとき "1=black") このパラメータは HP-GL の Plotter でだけ有効である。 利用できるペンを設定する。設定の仕方は、デフォルト値を見て分かる通りである。 #1…#31 の各ペンに色を指定できる。 指定できる色名については 色名 を参照のこと。 ペン #1 の指定は、省略してはならない。しかしかならずしも黒でなくてもよい。 #1…#31 の他のペンの指定は省略してもよい。

HPGL_ROTATE

(デフォルト値は "0") このパラメータは HP-GL の Plotter でだけ有効である。 用紙上のグラフィクス・ディスプレイを、指定された角度だけ回転させて置く。 指定できる角度は "0"、"90"、"180"、"270" であり、"0" と "90" の代わりに"no" と "yes" でも指定できる。 このパラメータを使うことで、 用紙の向き (ポートレート/ランドスケープ) を簡単に指定できることになる。 HP-GL のプロッターには、デフォルトの用紙の向きが縦 (ポートレート) のものと横 (ランドスケープ) のものと両方あるので、 出力機器によってこのパラメータの設定を変えればよい。 "180" と "270" は HPGL_VERSION が "2" のときにだけ有効である。

HPGL_VERSION

(デフォルト値は "2") このパラメータは HP-GL の Plotter でだけ有効である。 "1" は元々の HP-GL 形式、"1.5" は HP7550A グラフィクス・プロッターや HP758x、HP7595A、HP7596A といった製図用プロッター (いくつかの HP-GL/2 拡張機能を備えた HP-GL プロッター)、 "2" はもっと新しい HP-GL/2 機器に対応した形式で出力を行うことを指定する。 この値が "2" よりも小さい場合は、使えるフォントはベクトル・フォントのみ、 描ける線の太さはデフォルトの太さのみになるため、 capmodjoinmodfmiterlimit による操作は無効になる。また塗りつぶし判定の方法である `nonzero winding number rule' がサポートされないため、fillmod も無効である。 さらに HPGL_VERSION が "1" の場合は、任意の曲線の内側の塗りつぶしができなくなる (座標軸上の円と長方形の内部の塗りつぶしだけができる)。

HPGL_XOFFSET, HPGL_YOFFSET

(デフォルト値は "0.0cm" and "0.0cm") このパラメータは HP-GL の Plotter でだけ有効である。 ページ上のグラフィクス・ディスプレイの x および y 方向での位置を指定する。 センチメートル、ミリメートル、インチのいずれかで指定する。 たとえば "2cm" や "1.2in" のように指定する。

INTERLACE

(デフォルト値は "no") このパラメータは GIF の Plotter でだけ有効である。 このパラメータを "yes" に設定すると、以降に生成される疑似 GIF の Plotter が生成するファイルはインターレースになる。そうやって生成されたファイルは、 多くのアプリケーションでインターレース・モード (ノン・リニア nonliner モード) で表示される。

MAX_LINE_LENGTH

(デフォルト値は "500") 描画されるまでに一本のパスを構成できる連結点の数の最大数を設定する。 描画されるときにはパスは自動的に (特に何の通知もなく) 複数のパスに分割される。 パスが作る曲線に塗りつぶしが行われるときには、パスは分割されない。

このパラメータは Tektronix と metafile 以外のどの Plotter でも有効である。 このパラメータは、出力デバイスによっては描画用のバッファのサイズが限られている (たとえば PostScript プリンタや HP-GL のペン・プロッタなど) ために用意されている。Tektronix と metafile の Plotter はリアルタイムで描画を行い、したがってバッファを持たないため、 このパラメータは無効である。

META_PORTABLE

(デフォルト値は "no") このパラメータは metafile の Plotter でだけ有効である。 "yes" に設定しておくと、人間に読める形式で画像データが出力される。 デフォルトではバイナリ形式である。参照: Metafile 形式

PCL_ASSIGN_COLORS

(デフォルト値は "no") このパラメータは PCL の Plotter でだけ有効である。 "no" に設定しておくと、あらかじめ設定されている限られた色数のペンだけが使える。 "yes" にしておくとこの制限はなくなり、 必要なら様々な色を「論理ペン」に設定できる。 カラーの LaserJet プリンタ以外では、PCL 5 をサポートしていてもこの機能が使えるものは多くない。 したがってこの機能を使うときには注意が必要である。

PCL_BEZIERS

(デフォルト値は "yes") このパラメータは PCL の Plotter でだけ有効である。 "yes" にしておくとベジェ曲線を描くときにそれに特化したアルゴリズムを使う。 "no" のときには特殊なことは行われず、ベジェ曲線は多角形で近似して描かれる。 ヒューレット・パッカードの PCL 5 プリンタは、初代の LaserJet III を除いてすべての機種でベジェ描画アルゴリズムが使える。

PCL_ROTATE

(デフォルト値は "0") このパラメータは PCL の Plotter でだけ有効である。 ページ内に置かれているグラフィクス・ディスプレイを、 デフォルトの向きからどれだけ回転させるかを度 (degree) で指定する。 指定できる値は "0"、"90"、"180"、"270" であり、"no" と "yes" をそれぞれ "0" と "90" の代わりに指定できる。 このパラメータを使うことで、 用紙の向き (ポートレート/ランドスケープ) を簡単に指定できることになる。 HP-GL のプロッターには、デフォルトの用紙の向きが縦のもの (ポートレート、プリンタ) と横のもの (ランドスケープ、プロッタ) と両方あるので、 出力機器によってこのパラメータの設定を変えればよい。

PCL_XOFFSET, PCL_YOFFSET

(デフォルト値は "0.0cm" および "0.0cm") このパラメータは PCL の Plotter でだけ有効である。 ページ上のグラフィクス・ディスプレイの x および y 方向での位置を指定する。 センチメートル、ミリメートル、インチのいずれかで指定する。 たとえば "2cm" や "1.2in" のように指定する。

PNM_PORTABLE

(デフォルト値は "no") このパラメータは PNM の Plotter でだけ有効である。 "yes" に設定しておくと、人間に読める形式で画像データが出力される。 デフォルトではバイナリ形式である。PBM/PGM/PPM の画像形式は、 バイナリ形式でも機種依存性がないように設計されていて十分に portable なので、 このパラメータ名はあまり適切ではない。

TERM

(デフォルト値は NULL) このパラメータは Tektronix の Plotter でだけ有効である。 この値を "xterm"、"xterms"、"kterm" にしておくと、 libplot を使っているプログラムが現在、X Window システムの VT100 端末エミュレータの xterm 上で実行されている、と解釈される。 描画をはじめる前に Tektronix の Plotter はエスケープ・シーケンスを送って、 普段は表に出ていない、Tektronix 描画のためのウィンドウを前面にポップアップする。 描画が終了すると、制御を Tektronix のウィンドウから実行中の VT100 に戻すためのエスケープ・シーケンスが送られる。 Tektronix のウィンドウは消去されず、そのまま画面上に残る。

このパラメータを "kermit"、"ansi.sys"、"ansissys"、"ansi.sysk"、"ansisysk" のいずれかにしておくと、 libplot を使っているプログラムが現在、MS-DOS 版 kermit の VT100 端末エミュレータの上で実行されている、と解釈される。 描画をはじめる前に Tektronix の Plotter はエスケープ・シーケンスを送って、 端末エミュレータを Tektronix モードに切り替える。また kermit 特有の Tektronix 制御コードも送られる。普通は色は使えないが、 この Tektronix モードでは制限はあるが色が使える (ansi.sys で 16 色が使える)。同様に、普通は使えない線種 "dotdotdashed" も使える。 描画が終了すると、Tektronix モードから VT100 モードにに戻すためのエスケープ・シーケンスが送られる。 キーボードから `ALT minus' を入力すると、VT100 モードと Tektronix モードを切り替えることができる。

TRANSPARENT_COLOR

(デフォルト値は "none") このパラメータは GIF の Plotter でだけ有効である。 有効な色名を指定しておくと、疑似 GIF ファイル内でその色の部分が透明色として設定され、多くの GIF を扱うソフトウェアでその部分が透明として表示される。 指定できる色名については、色名 を参照のこと。

TRANSPARENT_COLOR を設定してアニメーション疑似 GIF を生成すると、 次の静止画を表示するときに `restore to background' が適用され、前の静止画が背景色で塗りつぶされる。そうでなければ `unspecified' が適用され、前の静止画の上に直接次の静止画が描かれる。

USE_DOUBLE_BUFFERING

(デフォルト値は "no") このパラメータは X と X Drawable の Plotter でだけ有効である。 これを "yes" に設定しておくと、描画の際に二重バッファリングが有効になる。 画像ページ内の各フレームは openplclosepl の間に描かれたものになるが、これがディスプレイに直接ではなく、 一旦バッファ内に描かれる。そして erase 操作でフレームの描画が終了したとき、 または closepl が行われたときにバッファ内の画像の各ピクセルがその Plotter のディスプレイにすべてコピーされる。連続する画像が似たようなものの場合、 これにより滑らかなアニメーションのように表示できる。

X のディスプレイには二重バッファリングのためのハードウェアを備えているものがある。 それが使えるときには X の Plotter はそれを検知して X11 プロトコルの拡張機能 (DBE または MBX) を利用して描画を行う。この場合、 高価なグラフィック・カードなどを使っていると、 アニメーションの再生が非常に速くなることがある。

VANISH_ON_DELETE

(デフォルト値は "no") このパラメータは X の Plotter でだけ有効である。 "yes" にしておくと、Plotter が削除されるときに、画像が描画されていたウィンドウが閉じられる。"yes" でなければ、ウィンドウ内でキーボードから `q' を入力するか、マウスクリックをしない限り、ウィンドウは消えない。

XDRAWABLE_COLORMAP

(デフォルト値は NULL) このパラメータは X Drawable の Plotter でだけ有効である。 このパラメータが NULL でなければ、描画に使われるカラーマップへのポインタ Colormap * であると見なされる。NULL の場合は X のディスプレイのデフォルトのカラーマップが使われる。

XDRAWABLE_DISPLAY

(デフォルト値は NULL) このパラメータは X Drawable の Plotter でだけ有効である。 描画対象となる X のディスプレイ へのポインタ Display * とみなされる。

XDRAWABLE_DRAWABLE1
XDRAWABLE_DRAWABLE2

(デフォルト値は NULL) このパラメータは X Drawable の Plotter でだけ有効である。 設定されていれば、出力先へのポインタ Drawable * と見なされる。出力先 `drawable' は、ウィンドウかまたはビットマップ画像かのどちらかである。X Drawable の Plotter が生成されるときには、この二つのパラメータのうち、 少なくともどちらか一方が設定されていなければならない。

XDrawable の Plotter は二つの出力先に同時に描画できるようになっている。X のウィンドウとビットマップ画像ファイルの両方で同時に同じ画像が生成できると、 便利なこともあるからである。出力先を二つ指定するときは、 その描画領域の大きさ、深度が同じでなければならない。また X のディスプレイは同じディスプレイでなければならない。

GNU plotting utilities に関する様々な情報を付録にまとめている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A. フォント、文字列、記号

ベクトル画像を操作するためのライブラリである libplotgraphplot などのこれを利用するソフトウェアでは、 文字列を描画するのに様々なフォントを利用できる。 一つの文字列中で複数のフォントや、上付き、下付き文字や、 ルート記号などを混在させることができる。また多種の記号も描画できる。 以下にその使い方を述べる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.1 利用できるフォント

ベクトル画像を操作するためのライブラリである libplotgraphplottek2plotpic2plot などのこれを利用するソフトウェアでは、 文字列を描画するのに様々なフォントを利用できる。 利用できるのは、22 種類の Hershey ベクトル・フォント、 35 種類の PostScript フォント、 45 種類の PCL 5 フォント、 18 種類のヒューレット・パッカードのベクトル・フォントである。 この合計 120 種類のフォントをここでは「組み込みフォント」と呼ぶ。 Hershey フォントは、Dahlgren, VA の米 Naval Surface Weapons Center で Dr. Allen V. Hershey が c. 1967 年に電子化した、線分を組み合わせて作られたフォントである。 35 種類の PostScript フォントは現在どの PostScript プリンタにも搭載されているアウトライン・フォントである。 45 種類の PCL 5 フォントは現在どの LaserJet プリンタ、プロッタにも搭載されている、 ヒューレット・パッカードのアウトライン・フォントである (ただし初代の PCL 5 プリンタである LaserJet III では、この 45 種類のうち 8 種類しか使えない)。 18 種類のヒューレット・パッカードのベクトル・フォントは、 より新しいヒューレット・パッカードのプリンタとプロッタに搭載されている。

Hershey フォントは libplot に実装されているすべての Plotter で利用できる。PostScript フォントは X、Illustrator、PostScript、Fig の各 Plotter で利用できる。つまりたとえば graph ではどの出力形式のときにも Hershey フォントが使え、graph -T Xgraph -T aigraph -T psgraph -T fig のときに PostScript フォントが使える。PCL 5 フォントは Illustratos、PCL、HP-GL の各 Plotter で、つまり graph -T aigraph -T pclgraph -T hpgl で使える。X の Plotter と graph -T X では組み込みの Hershey と PostScript の両フォントに限らず、X Window システムのフォントが利用できる。

plotfont コマンドを使えば、`-T' で指定する出力形式において利用できるフォントのキャラクタ・マップが表示できる。 参照: plotfont ユーティリティ・プログラム

文字列を描画する時 (文字列とエスケープ・シーケンス 参照)、 120 種類の組み込みフォントはそれぞれ書体に分けられる。以下の表に示すように、 複数のフォントからなる書体には各フォントに番号をつけてある。 フォント #1 は通常の書体、フォント #2 は斜体 (イタリック)、 フォント #3 は太字 (ボールド)、フォント #4 は太斜体 (ボールド・イタリック) である。他の書体があればそれには #5 以降の番号を付けてある。

22 種類の Hershey ベクトル・フォントには以下の書体がある。

Symbol フォントを除くほとんどの Hershey フォントのエンコーディングは ISO-Latin-1 である (ASCII コードの上位互換のエンコーディング)。 Symbol フォントはギリシャ文字と数学の記号からなり、 エンコーディングや使い方の詳細は Postscript Language Reference Manual にある。慣例的に Hershey の各書体には番号 #0 のフォントとして symbol フォントが含めてある (HersheySerifSymbol および HersheySansSymbol)。

HersheyCyrillic、HersheyCyrillic-Oblique、HersheyEUC (最後のは日本語のフォント) の各フォントではエンコーディングは ISO-Latin-1 encoding ではない。キリル文字と日本語 を参照のこと。

35 種類の PostScript フォントには以下の書体がある。

ZapfDingbats と Symbol フォントを除く PostScript フォントのエンコーディングは ISO-Latin-1 である。 ZapfDingbats と Symbol フォントのエンコーディングは Postscript Language Reference Manual にある。慣例的に PostScript の各書体には番号 #0 のフォントとして symbol フォントが含めてある。

45 種類の PCL 5 フォントには以下の書体がある。

Wingdings と Symbol フォントを除く PCL 5 フォントのエンコーディングは ISO-Latin-1 である。 Symbol フォントのエンコーディングは `symbol font encoding' であり、これは Postscript Language Reference Manual に詳しく説明されている。 慣例的に PCL の各書体には番号 #0 のフォントとして symbol フォントが含めてある。

18 種類のヒューレット・パッカードのベクトル・フォントには以下の書体がある。

名前にアスタリスクが付いているヒューレット・パッカードのベクトル・フォント (ANK と Symbol フォント) は、 HP7550A グラフィクス・プロッタ、または HP758x、HP7595A、HP7596A 製図プロッタのいずれかに HP-GL 出力を行うときにだけ有効である。 ANK フォントは日本語フォントである (参照: キリル文字と日本語)。Symbol フォントには様々な数学記号が含まれている。 これらのフォントを使うためにはデバイス独自のパラメータまたは環境変数 HPGL_VERSION を "1.5" に設定しなければならない。

ANK と Symbol 以外のすべてのヒューレット・パッカードのベクトル・フォント のエンコーディングは ISO-Latin-1 である。 Arc フォントはプロポーショナル・フォント (可変幅)、Stick フォントは固定幅である。 HPGL_VERSION が "1.5" のとき、Arc フォントではカーニングが行われる。 HPGL_VERSION が "2" (デフォルト値) のとき、カーニングは行われない。 ヒューレット・パッカードは HP-GL から HP-GL/2 および PCL 5 に移行するにあたって、デバイス側でのカーニング処理機能を削除している。 ヒューレット・パッカードのベクトル・フォントと、 そのカーニング処理 (少なくともペンプロッタの場合) については、 Hewlett-Packard Journal の Nov. 1981 発行の号に載っているL. W. Hennessee et al. の論文を参照されたい。

Symbol フォントのエンコーディングは `symbol font encoding' であり、これは Postscript Language Reference Manual に詳しく説明されている。 慣例的に PCL の各書体には番号 #0 のフォントとして symbol フォントが含めてある。

libplot がサポートするフォントでは、 少なくとも libplot がサポートする範囲では、PostScript、PCL 5、ヒューレット・パッカードのベクトル・フォントのどれにも、 リガチャーは入っていない。しかし 22 種類の Hershey フォントのうち、 6 種類にはリガチャーがある。フォントが HersheySerif または HersheySerif-Italic のときに "fi"、"ff"、"fl"、"ffi"、"ffl" のどれかが文字列中に出てきたら、 それは自動的にリガチャーに置き換えられる (HersheyCyrillic と HersheyEUC も、 印字可能 ASCII 文字については (ほとんど) HersheySerif と同じと考えられる)。 さらに "tz" と "ch" も HersheyGothicGerman ではリガチャーになる。 ドイツ語のエスツェット character `ß' はどのフォントでもリガチャーにはならない。エスツェットを描画するには、 エスケープ・シーケンスで "\ss" とすればよい (参照: 文字列とエスケープ・シーケンス)。またはドイツ語キーボードがあるなら直接エスツェットを入力してもよい。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.2 キリル文字と日本語

前節の組み込みフォントには、 キリル文字と日本語の文字のベクトル・フォントも含まれている。 それらのエンコード、つまりキャラクタ・マップ上でどの文字がどこにあるのかを、 以下に説明する。 キリル文字と日本語の文字のベクトル・フォントを含むすべてのフォントについて、 そのキャラクタ・マップを plotfont コマンドで表示することができる。 参照: plotfont ユーティリティ・プログラム

HersheyCyrillic と HersheyCyrillic-Oblique フォントのエンコーディングは KOI8-R である。これは ASCII コードの上位互換であり、ソ連時代から Unix 上のアプリケーションのデファクトスタンダードである。ASCII キャラクタに限ってはこれは HersheySerif ベクトル・フォントと同じであるが、 フォントの後半は異なっている。0xc00xdf の範囲の文字はキリル文字の小文字、0xe00xff は大文字である。 その他のキリル文字が 0xa3 および 0xb3 にある。詳細は the official KOI8-R Web page および Information Sciences Institute にある RFC 1489 を参照されたい。

日本語を表示するためのベクトル・フォントは HersheyEUC である。これは 8 ビットの EUC-JP でエンコードされている。EUC とは `extended Unix code' のことで、 他の多バイト文字 (ギリシャ文字やキリル文字) でも使われている。EUC 文字列の詳細に付いては Ken Lunde の Understanding Japanese Information Processing (O'Reilly, 1993) を参照のこと。この本には日本語のテキスト処理に付いての多くの情報が載っている。 彼のウェブページも参照されたい。

HersheyEUC では印刷可能な ASCII 文字は 0x200x7e の範囲であり、 HersheySerif と同様である (HersheyEUC のエンコーディングは `JIS Roman' と呼ばれ、これは日本工業規格 JIS に定められた標準規格である)。また JIS X0208 では 0xa10xfe の範囲内の連続した2バイトで一つの文字を表している。 JIS X0208 には平仮名、カタカナ、漢字、ローマ字、ギリシャ文字、キリル文字、 句読点類、その他の記号が定義されている。例えば 83 個の平仮名 (濁点、半濁点、小文字なども含めて) が 0x24210x2473 にマッピングされている。JIS X0208 に定義されている文字の EUC コードを得るには、各バイトに 0x80 を加えればよい (つまり各バイトの上位ビットを立てればよい)。したがって 83 個の平仮名のうち最初の文字 (0x2421) は 0xa40xa1 の連続する2つのバイトで表される。

HersheyEUC フォントでの JIS X0208 の実装は Dr. Hershey の電子化によるもので、実用上全く問題なく使える。83 個の平仮名と 86 個のカタカナのすべてが使えるが、 あまり使う機会のない「半角カナ」はサポートしていない。 使える漢字は 603 個であり、そのうちの 596 個は JIS 第一水準に定められている (つまりよく使われる) 2965 個から選ばれている。 平仮名、カタカナ、漢字の幅はすべて同じである。`kanji.doc' ファイルにこの 603 個の漢字を列挙してある。このファイルは多くの場合、 `/usr/share/libplot' または `/usr/local/share/libplot' にインストールされている。JIS X0208 のうち利用できない漢字は `undefined character' グリフ (複数の横線) で描画される。

ArcANK 書体と StickANK 書体の 8 個のヒューレット・パッカードのベクトル・フォントでも日本語が使える。 HP7550A グラフィクス・プロッタ、または HP758x、HP7595A、HP7596A 製図プロッタのいずれかに HP-GL 出力を行うときに有効である。 これらのフォントを使うためにはデバイス独自のパラメータまたは環境変数 HPGL_VERSION を "1.5" に設定しなければならない。

ANK とは Alphabet、Numerals、Katakana のことであり、ANK フォントのエンコーディングは `Kana-8' である。各フォントの下半分は JIS Roman エンコーディングで、上半分が半角カナである。 この「半角カナ」には、簡略化された形のカタカナと、いくつかの分音記号 (句読点、濁点、半濁点、カッコなど) が含まれる。 分音記号はそれぞれ独立した文字として含まれている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.3 X Window フォント

libplot を組み込んでいる graph -T Xplot -T Xtek2plot -T Xpic2plot -T Xplotfont -T X の各コマンドは、X Window で用意されている多種多様なフォントを利用することができる。 22 種類の Hershey ベクトル・フォントも使える。 35 種類の PostScript フォントも、X で使えるように設定されていれば使える。 プロットを行うプログラムの多くが、 フリーに配布されている 35 種類の Type 1 形式の PostScript フォントを組み込んでいる。これは X display にインストールするのも容易である。

実際には、利用中の X display で使えるフォントはほとんど使うことができる。 XLFD (X Logical Font Description) 名が付いているスケーラブル・フォントも使える。 たとえば "CharterBT-Roman" フォントは多くの X display で使える。 このフォントの XLFD 名は "-bitstream-charter-medium-r-normal-0-0-0-0-p-0-iso8859-1" である。 libplot を組み込んでいるプログラムではこれを "charter-medium-r-normal" として認識する。以下のコマンド

 
echo 0 0 1 1 2 0 | graph -T X -F charter-medium-r-normal

は X window の画面にウィンドウを開き、 両座標軸と目盛りのラベルをこのフォントで描画する。

X display で使えるフォントは xlsfonts コマンドでも確認できる。 名前の末尾が "-0-0-0-0-p-0-iso8859-1" や "-0-0-0-0-m-0-iso8859-1" といったフォントはスケーラブルで ISO-Latin-1 エンコーディングであり、 libplot の X の Plotter や libplot を組み込んだプログラムで使うことができる。 この二つのフォントの種類はそれぞれ可変幅と固定幅である。 名前の末尾が "iso8859-2" のようなものや "adobe-fontspecific" などのものは 標準的な ISO-Latin-1 ではないが、利用は可能だろう。

ISO-Latin-1 の X Window システムのフォントを使うとき、 エスケープ・シーケンスを使えば組み込み ISO-Latin-1 フォントに含まれる ASCII でない 8 ビット文字を表示させることができる。 使えるエスケープ・シーケンスについては 文字列とエスケープ・シーケンス を参照のこと。 例えば "¥Po" と文字列に入れるとイギリスの通貨のポンド記号 symbol `£' が表示される。以下のコマンド

 
echo 0 0 1 1 | graph -T X -F charter-medium-r-normal -L "A ¥Po1 Plot"

を実行してみると、この記号がプロット内のラベルに使えるのが分かる。 同様にして、使っているフォントが ISO-Latin-1 でもそうでなくても、どの X Window システムのフォントでも、 エスケープ・シーケンスを使えば数学記号やギリシャ文字が表示できる。

graph を含むプロットプログラムでは、--bitmap-size オプションをサポートしている。これは開かれる X Window のウィンドウの大きさを指定するオプションであり、したがって `-T X' オプションを指定したときにだけ意味がある。 プロット・プログラムはどれも正方形の描画領域を想定しているため、 たとえばこのオプションを `--bitmap-size 800x400' のように指定すると、 縦と横で違う倍率で拡大された画像が描画されることになる (この場合横長になる)。 これは新しい X Windows システム (X11R6) で有効な機能である。 もし利用中の X のディスプレイでスケーラブル・フォントが利用できない場合、 デフォルトのスケーラブル・フォント (たとえば "HersheySerif") は他のフォントに置き換えられる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.4 文字列とエスケープ・シーケンス

libplot やこれを組み込んでいる graphplottek2plotpic2plotplotfont が描画する文字列は、印字可能な文字でなければならない。 改行文字 (NL および CR) などの制御コードは文字列に使ってはならない。 印刷可能な文字というのは 0x200x7e および 0xa00xff のいずれかの範囲内にある文字のことである。前者はいわゆる印字可能な ASCII 文字、後者はいわゆる印字可能な 8 ビット文字である。

しかし文字列には「エスケープ・シーケンス」を入れることはできる。 これによりフォント切り替えたり、文字を上付きや下付きにしたり、ASCII 文字でない、数学記号などを描画することができる。ということはつまり、graph の描画における座標軸のラベルにもそういった文字が使えるということである。 pic2plot がラベル・オブジェクト内に置く文字列も同様である。

エスケープ・シーケンスの表し方は、TeX や groff を使ったことのある人なら違和感なく理解できるだろう。 エスケープ・シーケンスはそれぞれ、3文字からなる。 1文字目はバックスラッシュである。以下に、よく使われるものを挙げる。

"¥sp"

以降の文字を上付き文字にする (上付き文字モード開始)。

"¥ep"

上付き文字モード終了。

"¥sb"

以降の文字を下付き文字にする (下付き文字モード開始)。

"¥eb"

下付き文字モード終了。

"¥mk"

その位置を覚えておく。

"¥rt"

覚えておいた位置に戻る。

たとえば "x¥sp2¥ep" 文字列があったとすると、`x の二乗' として描画される。 下付き文字の下付き、なども指定できる。下付き文字と上付き文字は "¥mk" と "¥rt" を使うとうまくそろえることができる。たとえば "a¥mk¥sbi¥eb¥rt¥sp2¥ep" とすると、a に下付きの i と上付きの 2 が付く。ベキ乗数の `2' は下付きの i の真上に描かれる。

同じ書体でフォントを切り替えるエスケープ・シーケンスもある。 何に切り替えられるかについては 利用できるフォント を参照のこと。 たとえば現在のフォントが Times-Roman、つまり `Times' 書体のフォント #1 だとする。"A ¥f2very¥f1 well labeled axis" とすると、この中の `very' は、`Times' 書体のフォント #2 が Times-Italic であるため、斜体 Times-Italic になる。 フォントを切り替えるエスケープ・シーケンスは "¥fn" という形式で、 n でどのフォントに切り替えるかを指定する。groff との互換性を持たせるため、"¥f1"、"¥f2"、"¥f3" の代わりにそれぞれ "¥fR"、"¥fI"、"¥fB" と指定してもいいようになっている。 "¥fP" を使うと、直前の切り替えの前のフォントに戻る (しかしその前のフォントにまでは戻れない)。 異なる書体間の切り替えは現在の所できない。

横方向に移動するためのエスケープ・シーケンスが他にもいくつかあり、 斜体とそうでないフォントの間をきれいにそろえることなどに使うことができる。 "¥r1"、"¥r2"、"¥r4"、"¥r6"、"¥r8"、"¥r^" でそれぞれ右方向に 1 em、1/2 em、1/4 em、1/6 em、1/8 em、1/12 em だけ移動する。 "¥l1"、"¥l2"、"¥l4"、"¥l6"、"¥l8"、"¥l^" も同様だが、これらは左に移動する。"A ¥fIvery¥r^¥fP well labeled axis" とすると、"A ¥fIvery¥fP well labeled axis" よりは見栄えがいいはずである。

平方根の記号は、上述した "¥mk" と "¥rt" を組み合わせることで描画できる。 平方根記号の最初の部分は "¥sr" であり、上線 (`run') を描く"¥rn" で好きなだけ記号を長くできる。たとえば "¥sr¥mk¥rn¥rn¥rtab" とすると `ab の平方根' が描画できる。 上線の長さを調整したいときは、"¥rn" の数をいくつか変えてみて、試行錯誤する必要があるだろう。

下線を引くには、"¥ul" を好きな数だけ並べればよい。上で示した "¥mk"…"¥rt" の技が下線でも使える。したがって "¥mk¥ul¥ul¥ul¥rtabc" とすると、"abc" に下線が引かれる。 下線の長さを調整したいときは、"¥ul" の数をいくつか変えてみて、試行錯誤する必要があるだろう。 横方向の移動量も同様に、試行錯誤して決めねばならないだろう。たとえば "HersheySerif" を使っているときは、"¥mk¥ul¥ul¥l8¥ul¥rtabc" よりも "¥mk¥ul¥ul¥ul¥rtabc" の方が見栄えがいいはずである。

上で説明したものの他に、ISO-Latin-1 フォント (Symbol フォント、HersheyCyrillic、HersheyEUC、ZapfDingbats 以外の組み込みフォント) の印刷可能な非 ASCII 文字を操作するためのエスケープ・シーケンスもある。 アクセント記号付きの文字などは非 ASCII 文字である。それら 0xa00xff の範囲にある 8 ビット文字は、 文字列中に直接指定してよい。しかし利用中の端末で表示できないなどの場合には、 直接入力する代わりにエスケープ・シーケンスで指定することもできる。

エスケープ・シーケンスは数学記号やギリシャ文字も同様に指定できる。 Symbol フォントの文字は通常、エスケープ・シーケンスを使って指定する。 使っているフォントが Hershey フォントかそうでないかによって、 記号を描画するために使われるフォントが異なる。 Hershey フォントを使っているときには HersheySerifSymbol か HersheySansSymbol が、そうでないときには Symbol フォントが使われる。

以下に、ISO-Latin-1 フォントを使っているときの非 ASCII 文字を指定するエスケープ・シーケンスを列挙する。 各エスケープ・シーケンスについて ISO-Latin-1 エンコーディングでの対応する文字の番号 (十進数で) と正式な PostScript 名を示している。ほとんどはその名前を見れば何の記号か分かる。 たとえば `eacute' は小文字の `e' に鋭アクセント符号がついたものである。

"¥r!"

[161] exclamdown

"¥ct"

[162] cent

"¥Po"

[163] sterling

"¥Cs"

[164] currency

"¥Ye"

[165] yen

"¥bb"

[166] brokenbar

"¥sc"

[167] section

"¥ad"

[168] dieresis

"¥co"

[169] copyright

"¥Of"

[170] ordfeminine

"¥Fo"

[171] guillemotleft

"¥no"

[172] logicalnot

"¥hy"

[173] hyphen

"¥rg"

[174] registered

"¥a-"

[175] macron

"¥de"

[176] degree

"¥+-"

[177] plusminus

"¥S2"

[178] twosuperior

"¥S3"

[179] threesuperior

"¥aa"

[180] acute

"¥*m"

[181] mu

"¥ps"

[182] paragraph

"¥md"

[183] periodcentered

"¥ac"

[184] cedilla

"¥S1"

[185] onesuperior

"¥Om"

[186] ordmasculine

"¥Fc"

[187] guillemotright

"¥14"

[188] onequarter

"¥12"

[189] onehalf

"¥34"

[190] threequarters

"¥r?"

[191] questiondown

"¥`A"

[192] Agrave

"¥'A"

[193] Aacute

"¥^A"

[194] Acircumflex

"¥‾A"

[195] Atilde

"¥:A"

[196] Adieresis

"¥oA"

[197] Aring

"¥AE"

[198] AE

"¥,C"

[199] Ccedilla

"¥`E"

[200] Egrave

"¥'E"

[201] Eacute

"¥^E"

[202] Ecircumflex

"¥:E"

[203] Edieresis

"¥`I"

[204] Igrave

"¥'I"

[205] Iacute

"¥^I"

[206] Icircumflex

"¥:I"

[207] Idieresis

"¥-D"

[208] Eth

"¥‾N"

[209] Ntilde

"¥'O"

[210] Ograve

"¥'O"

[211] Oacute

"¥^O"

[212] Ocircumflex

"¥‾O"

[213] Otilde

"¥:O"

[214] Odieresis

"¥mu"

[215] multiply

"¥/O"

[216] Oslash

"¥`U"

[217] Ugrave

"¥'U"

[218] Uacute

"¥^U"

[219] Ucircumflex

"¥:U"

[220] Udieresis

"¥'Y"

[221] Yacute

"¥TP"

[222] Thorn

"¥ss"

[223] germandbls

"¥`a"

[224] agrave

"¥'a"

[225] aacute

"¥^a"

[226] acircumflex

"¥‾a"

[227] atilde

"¥:a"

[228] adieresis

"¥oa"

[229] aring

"¥ae"

[230] ae

"¥,c"

[231] ccedilla

"¥`e"

[232] egrave

"¥'e"

[233] eacute

"¥^e"

[234] ecircumflex

"¥:e"

[235] edieresis

"¥`i"

[236] igrave

"¥'i"

[237] iacute

"¥^i"

[238] icircumflex

"¥:i"

[239] idieresis

"¥Sd"

[240] eth

"¥‾n"

[241] ntilde

"¥`o"

[242] ograve

"¥'o"

[243] oacute

"¥^o"

[244] ocircumflex

"¥‾o"

[245] otilde

"¥:o"

[246] odieresis

"¥di"

[247] divide

"¥/o"

[248] oslash

"¥`u"

[249] ugrave

"¥'u"

[250] uacute

"¥^u"

[251] ucircumflex

"¥:u"

[252] udieresis

"¥'y"

[253] yacute

"¥Tp"

[254] thorn

"¥:y"

[255] ydieresis

フォントが HersheySerifSymbol か HersheySansSymbol (Hershey フォントの場合)、 または Symbol (PostScript フォントの場合) のときの数学記号とギリシャ文字のエスケープ・シーケンスを以下に列挙する。 各エスケープ・シーケンスについて symbol エンコーディングでの対応する文字の番号 (八進数で) と正式な PostScript 名を示している。ほとんどはその名前を見れば何の記号か分かる。たとえば "¥*a" は小文字のギリシャ文字のアルファである。Postscript Language Reference Manual に以下に挙げている文字の表がある。

"¥fa"

[0042] universal

"¥te"

[0044] existential

"¥st"

[0047] suchthat

"¥**"

[0052] asteriskmath

"¥=‾"

[0100] congruent

"¥*A"

[0101] Alpha

"¥*B"

[0102] Beta

"¥*X"

[0103] Chi

"¥*D"

[0104] Delta

"¥*E"

[0105] Epsilon

"¥*F"

[0106] Phi

"¥*G"

[0107] Gamma

"¥*Y"

[0110] Eta

"¥*I"

[0111] Iota

"¥+h"

[0112] theta1

"¥*K"

[0113] Kappa

"¥*L"

[0114] Lambda

"¥*M"

[0115] Mu

"¥*N"

[0116] Nu

"¥*O"

[0117] Omicron

"¥*P"

[0120] Pi

"¥*H"

[0121] Theta

"¥*R"

[0122] Rho

"¥*S"

[0123] Sigma

"¥*T"

[0124] Tau

"¥*U"

[0125] Upsilon

"¥ts"

[0126] sigma1

"¥*W"

[0127] Omega

"¥*C"

[0130] Xi

"¥*Q"

[0131] Psi

"¥*Z"

[0132] Zeta

"¥tf"

[0134] therefore

"¥pp"

[0136] perpendicular

"¥ul"

[0137] underline

"¥rx"

[0140] radicalex

"¥*a"

[0141] alpha

"¥*b"

[0142] beta

"¥*x"

[0143] chi

"¥*d"

[0144] delta

"¥*e"

[0145] epsilon

"¥*f"

[0146] phi

"¥*g"

[0147] gamma

"¥*y"

[0150] eta

"¥*i"

[0151] iota

"¥+f"

[0152] phi1

"¥*k"

[0153] kappa

"¥*l"

[0154] lambda

"¥*m"

[0155] mu

"¥*n"

[0156] nu

"¥*o"

[0157] omicron

"¥*p"

[0160] pi

"¥*h"

[0161] theta

"¥*r"

[0162] rho

"¥*s"

[0163] sigma

"¥*t"

[0164] tau

"¥*u"

[0165] upsilon

"¥+p"

[0166] omega1

"¥*w"

[0167] omega

"¥*c"

[0170] xi

"¥*q"

[0171] psi

"¥*z"

[0172] zeta

"¥ap"

[0176] similar

"¥+U"

[0241] Upsilon1

"¥fm"

[0242] minute

"¥<="

[0243] lessequal

"¥f/"

[0244] fraction

"¥if"

[0245] infinity

"¥Fn"

[0246] florin

"¥CL"

[0247] club

"¥DI"

[0250] diamond

"¥HE"

[0251] heart

"¥SP"

[0252] spade

"¥<>"

[0253] arrowboth

"¥<-"

[0254] arrowleft

"¥ua"

[0255] arrowup

"¥->"

[0256] arrowright

"¥da"

[0257] arrowdown

"¥de"

[0260] degree

"¥+-"

[0261] plusminus

"¥sd"

[0262] second

"¥>="

[0263] greaterequal

"¥mu"

[0264] multiply

"¥pt"

[0265] proportional

"¥pd"

[0266] partialdiff

"¥bu"

[0267] bullet

"¥di"

[0270] divide

"¥!="

[0271] notequal

"¥=="

[0272] equivalence

"¥‾‾"

[0273] approxequal

"¥.."

[0274] ellipsis

NONE

[0275] arrowvertex

"¥an"

[0276] arrowhorizex

"¥CR"

[0277] carriagereturn

"¥Ah"

[0300] aleph

"¥Im"

[0301] Ifraktur

"¥Re"

[0302] Rfraktur

"¥wp"

[0303] weierstrass

"¥c*"

[0304] circlemultiply

"¥c+"

[0305] circleplus

"¥es"

[0306] emptyset

"¥ca"

[0307] cap

"¥cu"

[0310] cup

"¥SS"

[0311] superset

"¥ip"

[0312] reflexsuperset

"¥n<"

[0313] notsubset

"¥SB"

[0314] subset

"¥ib"

[0315] reflexsubset

"¥mo"

[0316] element

"¥nm"

[0317] notelement

"¥/_"

[0320] angle

"¥gr"

[0321] nabla

"¥rg"

[0322] registerserif

"¥co"

[0323] copyrightserif

"¥tm"

[0324] trademarkserif

"¥PR"

[0325] product

"¥sr"

[0326] radical

"¥md"

[0327] dotmath

"¥no"

[0330] logicalnot

"¥AN"

[0331] logicaland

"¥OR"

[0332] logicalor

"¥hA"

[0333] arrowdblboth

"¥lA"

[0334] arrowdblleft

"¥uA"

[0335] arrowdblup

"¥rA"

[0336] arrowdblright

"¥dA"

[0337] arrowdbldown

"¥lz"

[0340] lozenge

"¥la"

[0341] angleleft

"¥RG"

[0342] registersans

"¥CO"

[0343] copyrightsans

"¥TM"

[0344] trademarksans

"¥SU"

[0345] summation

NONE

[0346] parenlefttp

NONE

[0347] parenleftex

NONE

[0350] parenleftbt

"¥lc"

[0351] bracketlefttp

NONE

[0352] bracketleftex

"¥lf"

[0353] bracketleftbt

"¥lt"

[0354] bracelefttp

"¥lk"

[0355] braceleftmid

"¥lb"

[0356] braceleftbt

"¥bv"

[0357] braceex

"¥eu"

[0360] euro

"¥ra"

[0361] angleright

"¥is"

[0362] integral

NONE

[0363] integraltp

NONE

[0364] integralex

NONE

[0365] integralbt

NONE

[0366] parenrighttp

NONE

[0367] parenrightex

NONE

[0370] parenrightbt

"¥rc"

[0371] bracketrighttp

NONE

[0372] bracketrightex

"¥rf"

[0373] bracketrightbt

"¥RT"

[0374] bracerighttp

"¥rk"

[0375] bracerightmid

"¥rb"

[0376] bracerightbt

最後に Hershey フォントを使っているときにだけ有効なエスケープ・シーケンスを挙げる。 これを使うと、どのフォントにも入っていない特殊な記号や、 他に指定方法がない記号を使うことができる。これには大きく分けて2種類ある。 一つは雑多な記号類、もう一つは天文学や十二星座の記号である 雑多な記号類を指定するためのエスケープ・シーケンスには、以下のものがある。

"¥dd"

daggerdbl

"¥dg"

dagger

"¥hb"

hbar

"¥li"

lineintegral

"¥IB"

interbang

"¥Lb"

lambdabar

"¥‾-"

modifiedcongruent

"¥-+"

minusplus

"¥||"

parallel

"¥s-"

[variant form of s]

上で最後に挙げているエスケープ・シーケンス "¥s-" は、記号ではなく文字を指定する。HersheyGothicGerman フォントでは、 単語の末尾の小文字の `s' の形が若干変わってしまうために用意されている。 たとえばドイツ語の "besonders" を正しく描画するためには、"besonder¥s-" と指定せねばならない。Hershey の2種類の symbol フォントでギリシャ文字を使うときも同様である (ギリシャ語では、小文字の末尾の `s' は末尾でない `s' と形が違う)。 末尾と末尾でない `s' の形が変わらない Hershey フォントでは、 "s" と "¥s-" は同じである。

中に星座の記号を含む天文学記号を表すためのエスケープ・シーケンスを以下に示す。 これらも上の雑多な記号類と同様、使っているフォントが Hershey フォントのときにだけ有効である。

"¥SO"

sun

"¥ME"

mercury

"¥VE"

venus

"¥EA"

earth

"¥MA"

mars

"¥JU"

jupiter

"¥SA"

saturn

"¥UR"

uranus

"¥NE"

neptune

"¥PL"

pluto

"¥LU"

moon

"¥CT"

comet

"¥ST"

star

"¥AS"

ascendingnode

"¥DE"

descendingnode

"¥AR"

aries

"¥TA"

taurus

"¥GE"

gemini

"¥CA"

cancer

"¥LE"

leo

"¥VI"

virgo

"¥LI"

libra

"¥SC"

scorpio

"¥SG"

sagittarius

"¥CP"

capricornus

"¥AQ"

aquarius

"¥PI"

pisces

上に上げた雑多な記号類および天文学記号は、からなずしも、Hershey フォントを使っているときにだけ指定できる特殊なフォント外記号である、 というわけではない。Allen Hershey が電子化したすべてのグリフのライブラリを GNU libplot は搭載している。したがって文字列にはそれらを指定できる。 指定できる Hershey グリフはそれぞれ、4桁の番号で示される。Hershey グリフ #1 は "¥#H0001" と表される。標準の Hershey グリフを表す数値は "¥#H0001" から "¥#H3999" だが、その中には欠番もたくさんある。他の人による他のグリフが "¥#H4000"…"¥#H4194" の範囲で指定できる。日本語の仮名は "¥#H4195"…"¥#H4399" の範囲である。

米 National Technical Information Service (電話番号 +1 703 487 4650) に連絡すれば、ほとんどすべての Hershey グリフを記載した表を注文することができる。商品番号は PB251845 で、現在の価格は US$40 である。例を挙げると、以下の文字列

 
"¥#H0744¥#H0745¥#H0001¥#H0002¥#H0003¥#H0869¥#H0907¥#H2330¥#H2331"

を描画すると、三つ葉のクローバー、フラ・ダ・リ紋章、地図マークの A, B, C、ベル、大きな円、ト音記号、ヘ音記号が描かれる。 繰り返すが、これは Hershey フォントを使っている場合である。

また Hershey フォントならどれを使っていても日本語の平仮名、カタカナ、漢字が使える。603 個の漢字はどれも使える。使えるのは HersheyEUC フォントと同じものである。 日本語の文字は JIS X0208 に定めるタイポグラフィにしたがって番号が付いており、 2バイトで1文字を表す。GNU plotting utilities に付属している `kanji.doc' ファイルに利用できるすべての漢字を列挙してある。このファイルは多くの場合、 `/usr/share/libplot' または `/usr/local/share/libplot' にインストールされている。

JIS X0208 の文字はどれも、たとえば "¥#J357e" のような具合に、 エスケープ・シーケンスで2バイトを4つの十六進数で表すことで指定できる。 IS X0208 の文字を表すためには、2バイトとも 0x210x7e の範囲内でなければならない。漢字は "¥#J3021" より上である。JIS X0208 に定められている文字はどれも同様に指定できる。たとえば平仮名とカタカナは "¥#J2421"…"¥#J257e" の範囲内であり、ローマ字は "¥#J2321"…"¥#J237e" である。`kanji.doc' ファイルと同じディレクトリにインストールされる `kana.doc' に平仮名とカタカナのエンコーディングを述べている。 JIS X0208 の詳細に付いては Ken Lunde の Understanding Japanese Information Processing (O'Reilly, 1993) と彼のウェブページを参照のこと。

昔から参照されている A. N. Nelson の Modern Reader's Japanese-English Character Dictionary による漢字の番号も利用できる (この辞典は C. E. Tuttle and Co. が出版しており、ISBN 0-8048-0408-7 である。 1997年に改訂版 (ISBN 0-8048-2036-8) が出ているが、番号付けが変わってしまっている)。 この「ネルソン・エスケープ・シーケンス」は JIS X0208 と同様だが、 4桁の十六進数ではなく、4桁の十進数である。`kanji.doc' に JIS X0208 とネルソン番号の対応を述べている。たとえばネルソン番号 "¥#N0001" の文字は JIS X0208 の "¥#J306c" である。これは Unicode で利用できる漢字の番号でもある。

利用できる漢字の幅はすべて同じであり、平仮名、カタカナも同じ幅である。 利用できない漢字は `undefined character' グリフ (複数の横線) で描画される。JIS X0208 の漢字以外の利用できない文字でも同様である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.5 プロット記号

GNU libplot ライブラリではプロットに使う記号に 1 から 31 まで番号を付け、標準で利用できるようにしている。graph プログラムに `-S' オプションを指定したときに、データの各点を描画するのに使われる。 そのリストを以下に示す (慣例的に、記号 #0 はどの記号も表さないものと解釈される)。

  1. dot
  2. plus (+)
  3. asterisk (*)
  4. circle
  5. cross
  6. square
  7. triangle
  8. diamond
  9. star
  10. inverted triangle
  11. starburst
  12. fancy plus
  13. fancy cross
  14. fancy square
  15. fancy diamond
  16. filled circle
  17. filled square
  18. filled triangle
  19. filled diamond
  20. filled inverted triangle
  21. filled fancy square
  22. filled fancy diamond
  23. half filled circle
  24. half filled square
  25. half filled triangle
  26. half filled diamond
  27. half filled inverted triangle
  28. half filled fancy square
  29. half filled fancy diamond
  30. octagon
  31. filled octagon

1 番から 5 番までの記号はよく知られた GKS (Graphical Kernel System) と同じである。

32 番以降の記号は、フォントでその番号が示す文字であると解釈される。 libplot ではそれはそのときに使っているフォントである。 graph ではそれは `--symbol-font-name' オプションで指定されるフォントである。デフォルトでは ZapfDingbats フォントだが、graph -T pnmgraph -T gifgraph -T pclgraph -T hpglgraph -T tek では PostScript フォントが使えないため、代わりに HersheySerif フォントが使われる。

ZapfDingbats フォントの文字にはプロット用の記号に適したものが多い。 たとえば #74 はテキサス・スター (Texas Star) である。以下のようにすると、

 
echo 0 0 1 2 2 1 3 2 4 0 | graph -T ps -m 0 -S 74 0.1 > plot.ps

5点からなるデータが、線では結ばれずにプロットされ、PostScript 形式で出力される。各データ点は大きな (描画領域の 1/10 の大きさの) テキサス・スターで示される。

graph -T pcl または graph -T hpgl でそれらの記号を使いたいときは、 PCL 5 や HP-GL/2 で使える Wingdings を試すとよい。以下のようにすると、

 
echo 0 0 1 2 2 1 3 2 4 0 | 
    graph -T pcl -m 0 --symbol-font Wingdings -S 181 0.1 > plot.pcl

上の PostScript の例と同様の描画が PCL 5 形式で行われる。 Wingdings フォントではテキサス・スターは #181 である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

B. 色名

GNU plotting utilities の多くのアプリケーションでは、色を名前で指定できる。 たとえば graph では `--frame-color' オプションで色名が使える。 他のプログラムとでは `--pen-color' オプションが使えるものがあり (graph でも使える)、それが使えるものでは `--bg-color' オプションが使える。これらのプログラムが使っている libplot ライブラリには pencolornamefillcolornamebgcolorname の各機能がある。

色を名前で指定できる場合、使える色名は 665 種類である。それには "dark magenta"、"forest green"、"olive drab" といったものがある。 色名では大文字と小文字は区別されず、空白は無視される。したがってたとえば、 "RosyBrown" と "rosy brown"、"DarkGoldenrod3" と "dark goldenrod 3" はそれぞれ同じ名前と見なされる。

GNU plotting utilities に付属している `colors.txt' ファイルに利用できるすべての色名を列挙してある。 このファイルは多くの場合、 `/usr/share/libplot' または `/usr/local/share/libplot' にインストールされている。 この色名はほとんど X Window システムでも有効である。X Window システムで有効な色名は `/usr/lib/X11/rgb.txt' に列挙されている。しかし、 色名に "gray" が入っているものについては、X では "grey" である。 たとえば "dark slate gray 4" と "dark slate grey 4" はどちらも色名として有効である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

C. Metafile 形式

GNU graphics metafile 形式の画像は、 graphplotpic2plottek2plotplotfont の生データ出力や GNU libplot の Plotter を使うソフトウェアで生成できる。 Metafile 形式のファイルは、一種の「監査証跡」とも言える。つまり、 プロット命令とプロットされるデータの連続したものである。 各プロット命令は1文字の ASCII 文字である `op code' であり、Plotter に対する操作を表す。 その操作に必要なデータがあれば、プロット命令の引数として指定される。

Metafile にはバイナリ形式 (デフォルト) とテキスト形式 (人が読める形式) の二種類がある。バイナリ形式では画像データは "#PLOT 1¥n" で始まり、 テキスト形式では "#PLOT 2¥n" で始まる。Metafile 形式のデータを、 生成した計算機とは違う環境に移動する場合などは、 バイナリ形式よりもテキスト形式のほうがいいだろう。テキスト形式のデータは GNU graph や他の plotting utilities のプログラムで `-O' を指定するか、Metafile の Plotter のパラメータ META_PORTABLE に "yes" を指定すればよい。GNU plot を使えば、バイナリ形式でもテキスト形式でも、metafile 形式のデータを他の形式に変換できる。

テキスト形式では、各操作の引数 (整数、浮動小数点実数、文字列) は、それぞれ空白で区切られ、改行が引数列の終端を示す。バイナリ形式では、 引数は整数、単精度浮動小数点実数、改行で終端が示される文字列である。 libplot で実装している描画操作では、文字列引数は多くても1つで、 その中には改行文字は含められないので、改行文字が引数列の終端として扱われる。 したがって、文字列は引数列中の最後の引数でなければならない。

openpl および closepl 操作によって Plotter がオープン、クローズされ、それによって画像のページが開始、終了する。 openpl および closepl 操作を表す op code はそれぞれ `o'`x' である。erase 操作は、もし行われれば、ページ中のフレームの区切りになる。 リアルタイム描画を行うデバイスでは、 それによりスクリーン上に描画された画像が消える。 この操作の op code は `e' である。

他に 89 種の Plotter 操作が実装され、12 の例外を除いて op code が割り当てられている。その 12 の例外は、 (1) flushpl による準備操作、 (2) havecaplabelwidthflabelwidth の情報を返すだけの操作、 (3) colornamepencolornamefillcolornamebgcolorname の内部で pencolorfillcolorbgcolor に割り当てられている操作、 (4) frotatefscaleftranslate の内部で fconcat に割り当てられている操作、 (5) ffontname (metafile では fontname と違うところのない操作) である。 したがって `o' and `x' の間では 78 種の op code が利用でき、つまり合計で op code は 80 種類である。以下に `o' and `x' 以外の 10 個の op code を挙げる。各 op code には libplot での操作の名称を付けてある。

Op Code

Operation

`a'

arc

`c'

circle

`e'

erase

`f'

linemod

`l'

line

`m'

move

`n'

cont

`p'

point

`s'

space

`t'

label

80 種類のすべての op code のリストはヘッダファイル `plot.h' にある。 このファイルは多くの場合、 `/usr/include' または `/usr/local/include' にインストールされている。

op code は 80 種類あるが、テキスト形式のmetafile ではそのうちの 50 種類だけが使われる。これはテキスト形式は、 引数が浮動小数点実数のものと、同じ機能の整数版を区別する必要がないからである。

上に挙げた 10 種類の op code は GNU 版より前の graphlibplot で使われていた `plot(5)' 形式のものと同じで、 その使い方も `plot(5)' と同じである。`o' および `x' の op code で出力される画像データに metafile 特有の文字列がないので、GNU 版と区別することができる。GNU plot を使えば、plot(5) 形式の metafile を GNU metafile 形式に変換できる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D. 関連するプログラム


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.1 idraw を使うには

idraw についてはこの文書内でも何回か触れられているが、これはフリーの X Window アプリケーションで、画像を編集するソフトウェアである。 これを使って graph -T ps で生成された画像や、libplot を使ったソフトウェアで PostScript の Plotter で生成された画像を編集することができる。

idraw は現在 Vectaport 社がメンテナンスしており、彼らのウェブサイトからダウンロードできる。idraw はドローソフトを作るためのフレームワーク ivtools の一部である。 idraw は元々、 スタンフォード大学とシリコン・グラフィクス社で開発されていた InterViews パッケージの一部であった。 その開発は現在すでに行われていないが、 ここで公開されている。 ダウンロードするなら InterViews よりも ivtools にしたほうがいいだろう。

Vectaport 社のウェブページには、idraw の高機能版である drawtool もある。idraw が X11 のビットマップ形式画像を取り込めるのと同様に、drawtool は TIFF および PBM/PGM/PPM 形式のビットマップ画像を取り込むことができる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.2 xfig を使うには

idraw についてはこの文書内でも何回か触れられているが、これはフリーの X Window アプリケーションで、画像を編集するソフトウェアである。 これを使って graph -T fig で生成された画像や、libplot を使ったソフトウェアで Fig の Plotter で生成された画像を編集することができる。

最新版はFTPサイトでダウンロードできる。GIF、X11 ビットマップ、PostScript の各形式の画像を取り込むことができる。transfig というパッケージが付属していて、これを使うと xfig の画像を他の様々な形式の画像に変換することができる。現在 GIF、X11 ビットマップ、LaTeX、PostScript の各形式がサポートされている。

Fig 形式についてのウェブページxfig を使うときにあると便利なアプリケーションなどが紹介されている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

備考

GNU plotting utilities の一部は Unix plotting utilities を元にしている。 graph コマンドを含むさまざまなプロット・フィルタは、 Unix が最初にベル研からリリースされたときにすでに含まれていて、 少なくとも Version 4 (1973年) まではあった。 最初は Tektronix 611 storage scope が出力端末であった。 様々なプロット・フィルタをまとめて、libplot の機種依存性をなくしたのは Lorinda Cherry である。 Unix の Version 7 (1979年) とそれに続くバークレー版から、 graphplotspline をまとめたパッケージと 機種依存性の残っている libplot が標準で搭載されるようになった。 1980 年代前半では、各種の Tektronix storage scope、初期のグラフィック端末、 Versatec と Varian の 200dpi 静電プリンタ/プロッタ、 ヒューレット・パッカードのペン・プロッタなどがサポートされていた。

最初の GNU 版のgraphplotspline と付属文書は Rich Murphey が 1989 年に書いた。 Richard Stallman は開発続行を指示し、付属文書の編集をサポートした。 スタンフォード大学で InterViews の開発チームの John Interranteidraw で使っていた PostScript prologue ファイルを惜しげもなく提供し、様々な助言も行ってくれた。それは最新の libplot でも使われている。 1991 年には、パッケージは GNU graphics' という名前で公開されていた。

1995 年には Robert Maier が開発を引き受け、現在の機種依存性がほとんどなくなったスタンドアロンの libplot の設計、実装を行った。彼は graph をスクラッチから書き直し、新しくなった libplot を使ってリアルタイム・フィルタとして使えるようにした。彼は spline も書き直して、 テンション、周期スプライン、 三次のベッセル関数による補間の各機能を使えるようにした。

libplot には現在、多角形の塗りつぶしや多角形や円弧の描く X Window のコードを取り入れている。ビットマップ画像 (PNM と疑似 GIF) を生成するときにこのコードが使われている。このコードは Brian Kelleher、Joel McCormack、Todd Newman、Keith Packard、Robert Scheifler、Ken Whaley (以上 Digital Equipment Corp.) と MIT、X Consortium によるものである (© 1985-89 by the X Consortium)。

現在の libplot の 疑似 GIF 機能は、 der Mausivo によるランレングス圧縮を採用した `miGIF' を使っている (© 1998 by Hutchison Avenue Software Corporation)。miGIF の著作権や利用許諾条件は GNU plotting utilities パッケージに同梱されている。

ode はほとんど Nick Tufillaro が 1978-1994 年にかけて、PDP-11 上の Unix Version 4 用に作ったものである。 Nick の 1994 年版を元に Robert が 1997 年に GNU 用にコーディングとコマンドライン・オプションを修正し、また gnuplot の特殊関数をすべてサポートし、例外処理を改良した。

Plotting utilities の開発に貢献した人は他にもたくさんいる。現在 libplot に組み込まれている Hershey ベクトル・フォントはもちろん、主に 1960 年代後半に Allen V. Hershey が電子化したものが元になっている。 彼には感謝を捧げる。他にも Robert C. Beach が 1970 年代中頃に開発した SLAC Unified Graphics System や Thomas Wolff が Ghostscript 用に作ったものから文字や記号が採用されている。 spline コマンドの補間アルゴリズムは Alan K. Cline のものに基づいており、 それは Apr. 1974 issue of Communications of the ACM に採録されている彼の論文によるものである。tek2plot の表指向の構文解析ルーチンは 1980 年中頃に Edward Moy がバークレーで書いたものである。libplot で円弧や楕円弧を描くときに使われる `sagitta' アルゴリズムは、URW の Peter Karnow と Apple の Ken Turkowski によるものである。 Raymond Toygraph でも目盛りの配置を行うコードに貢献し、また GNU getopt を最初に導入した。 以前 Cornell 大学 LASSP にいた Arthur Smith は、彼が書いた xplot プログラムのコードを寄贈してくれた。Nelson Beebe はパッケージのインストール法を徹底的にテストしてくれた。

Robert Maier がこの文書を書いた。この文書には現在 Nick Tufillaro の ode のマニュアルも含まれている。Julie Sussmann が文書全体の校正を行った。

以上のすべての部分の英語から日本語への翻訳は、 とみながだいすけ (Daisuke TOMINAGA) が行った。


[Top] [Contents] [Index] [ ? ]

Table of Contents


[Top] [Contents] [Index] [ ? ]

About This Document

This document was generated by とみながだいすけ on July, 3 2009 using texi2html 1.76.

The buttons in the navigation panels have the following meaning:

Button Name Go to From 1.2.3 go to
[ < ] Back previous section in reading order 1.2.2
[ > ] Forward next section in reading order 1.2.4
[ << ] FastBack beginning of this chapter or previous chapter 1
[ Up ] Up up section 1.2
[ >> ] FastForward next chapter 2
[Top] Top cover (top) of document  
[Contents] Contents table of contents  
[Index] Index index  
[ ? ] About about (help)  

where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:


This document was generated by とみながだいすけ on July, 3 2009 using texi2html 1.76.