.***************************** inutil.xtr ****************************** .* inutil.xtr -- 非実用的、整形マクロ集 .* .* 浮動小数点バージョンのXTRである XTRF.EXE を使用してください。 .* .* これらの例自体は非実用的なものですが、この応用によっていろいろなことが .* できるでしょう。試してみてください。 .* .* .* ■サインカーブで整形するマクロ .* .* ◎使い方 .* .* .SinBegin ;サインカーブ開始マクロ“SinBegin” .* むにゃむにゃ・・・・・・ .* この部分がサインカーブで整形 .* .SinEnd ;サインカーブ終了マクロ“SinEnd” .* .* .* ◎次のようにして試すこともできます。 .* .* A>xtrf @inutil -px -#SinBegin() hajimeni.xx .* ↑ .* 適当なテキスト .* .* .* もし、非浮動小数点バージョンの xtr.exe なら ferror で強制終了させる。 .if (1/2==0) ferror("“xtrf.exe”を使用してください") .* .# π = 4 * atan(1) ; 定数の定義(グローバル変数“π”) . .* ※グローバル変数の名前は、漢字(2バイト文字)、カナ、“_”または .* 英大文字で始まります。(従って、“π”や“_r”はグローバル) .* .##SinBegin { ;サインカーブ整形開始 . (_r = (.width - .indent) / 4) ;半径“_r” . (_center = .indent + 2 * _r) ;中心の位置“_center” . (_t = -π/2) ;最初の角度“_t” . (_dt = π/15) ;角度の刻み幅“_dt” . (_q_Save = cmd{q??}) ;あとでもとに戻すために保存 . [ - w f aj as ii1 il1 q/%Sin_sub .} ;↑これにより、毎行 Sin_sub 関数が呼び出される . .##SinEnd { ;サインカーブ整形終了 . ] . _{q=%quo(_q_Save)} ;もとに戻しておく .} . .##Sin_sub { ;補助関数“Sin_sub()” . (s = _r * (1+sin(_t))) ;サインの計算 . i(_center - s) ;左マージンを与える . w(_center + s + 4) ;右マージンを与える . (_t += _dt) ;角度“_t”を更新する . () ;返り値クリア .} .* ※この関数定義内を修正すると、いろいろなバリエーションが作れます。 .* 左マージン(i コマンド)と右マージン(w コマンド)を数学的な計算で .* 与えるということがポイントです。 .* .* ※このような q コマンドの使い方は、トリッキーなものですが、いろいろ応 .* 用はできます。例えば、呼び出される関数内で、ページ内行カウンタ (シ .* ステム変数 .lineno)をチェックしてそれによって何らかの処理をすると .* いうことが可能です。 .* .* ※これ以外にも、〈%-変換〉が使用可能であるあらゆるところで、 この手の .* テクニック(副作用のある関数呼出し)が使えます。例えば、 制御コード .* 定義で、モード“E”を指定して、制御コード出力とともに何らかの処理を .* 実行させるというようなことが可能です。 制御コード定義のモード “L” .* (改行 CR/LF の代わりの制御コード)を利用すると、改行出力と同時に何 .* か処理を行うということができるので、SinBegin と SinEnd の定義をこれ .* を使って書き直すことも可能です。(次のように) .* .* r/@NL/%Sin_sub\r\n/SLE ;改行時に Sin_sub を呼ぶよう定義(SinBeginで) .* r/@NL ;定義削除し、もとに戻す(SinEnd で) .* .* .* ■丸く整形するマクロ .* .* ◎使い方 .* .* .MaruBegin ;丸く整形開始マクロ“MaruBegin” .* むにゃむにゃ・・・・・・ .* この部分が丸く整形される .* .MaruEnd ;丸く整形終了マクロ“MaruEnd” .* .* .* ◎次のようにして試すこともできます。 .* .* A>xtrf @inutil -px -#MaruBegin() hajimeni.xx .* ↑ .* 適当なテキスト .* .##MaruBegin { . (_o = 4) ;左マージンのオフセット . (_r = 24) ;円の半径 . (_dx = 2 / _r) ;_x の刻み幅 . (_x = -1) ;_x の初期値 . (_q_Save = cmd{q??}) ;あとで、もとに戻すため . [ - w f aj as ii1 il1 q/%Maru_sub .} .##MaruEnd { . ] . _{q=%quo(_q_Save)} ;もとに戻しておく .} .##Maru_sub { . if (_x >= 1) (_x = -1) ;_x が 1 に達したら、また -1 に戻す . (y = sqrt(1 - _x**2)) ;_x に対する _y を計算 . i(_o + _r * (1-y)) ;左マージンを与える . w(_o + 2 + _r * (1+y)) ;右マージンを与える . (_x += _dx) ;_x を進める . () ;返り値クリア .} .*************************** end of inutil.xtr *************************