4.3 もっとテキスト

プログラム kihonb で, ちょっと進んだ文字出力をしてみましょう.

SGPACK においては '|', '_', '"'の3文字が添字の制御 に使われるのですが, 何も指定しなければ, これらの文字も他の文字と同様に 文字として出力されます(最初の例). sglset ルーチンでテキストプリ ミティブに関する内部変数 'LCNTL'.true. にすると, 2番め の例のように, 上付や下付の添字を出力することができます. '|'と '_'は, それぞれ, 上付添え字と下付添え字のモードの始まりをしめす 制御文字で, '"'は上付および下付添え字のモードの終わりをしめす制 御文字です. ここで注意すべきことは, 文字列が添字で終る場合でも, 添字の 後に必ず '"'を入れて通常の文字モードに戻すことです. こうしないと 文字列の長さが正確に求まらないので, センタリングや右よせ等の処理がうま くいきません. また, 添字の大きさや上下の移動量は, それぞれ sgrset ルーチンで内部変数 'SMALL', 'SHIFT' を指定すること により変更できます(3番め).

巻末付録に示したように SGPACK は2種類のフォントを持っています. sgiset ルーチンで内部変数 'IFONT' を2とすると, フォント番号2の 高品位フォントを出力することができます. 高品位フォントは複数の線を引い て線の太さを調節していますから, sgstxi ルーチンで文字を描く線の 太さを太くすると空白が潰れてそれらしい文字になります. また, 当然のこ とながら高品位フォントを使うと出力量が増えますから,出力に時間がかかる ようになります.

フォントテーブルを見ればわかるように, SGPACK は普通のアルファベットだ けでなく, ギリシャ文字や特殊記号のフォントも持っています. プログラムの 50行め以降に示したように, これらのフォント番号をDCL文字メソッド(元関数)(SGPACK に あるメソッド(元関数))の1つ csgi で文字コードに変換して, それをテキストとして sgtxv ルーチン等に渡せば, 出力できます. 5行めのCHARACTER文で csgi*1 を忘れないで下さい.

# kihonb.rb


require "narray"
require "numru/dcl"
include NumRu
include Math


nmax = 9
y = NArray.sfloat(nmax)

#-- graph ---
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::sgopn iws

DCL::sgfrm

x1 = 0.1
x2 = 0.9
xc = 0.5

#-- 罫線 ----
for n in 1..nmax
  y[n-1] = 0.1*(10-n)
  DCL::sglnv(x1, y[n-1], x2, y[n-1])
end

DCL::sglnv(xc, 0.05, xc, 0.95)

#-- デフォルト ----
DCL::sgtxv(xc, y[0], 'SGTXV|SUP"RST_SUB"')

#-- 添字 ----
DCL::sglset('LCNTL', true)
DCL::sgtxv(xc, y[1], 'SGTXV|SUP"RST_SUB"')

DCL::sgrset('SMALL', 0.5)
DCL::sgrset('SHIFT', 0.5)
DCL::sgtxv(xc, y[2], 'SGTXV|SUP"RST_SUB"')

#-- フォント ----
DCL::sgtxv(xc, y[3], 'ABCDEFG abcdefg')

DCL::sgiset('IFONT', 2)
DCL::sgtxv(xc, y[4], 'ABCDEFG abcdefg')

DCL::sgstxi(3)
DCL::sgtxv(xc, y[5], 'ABCDEFG abcdefg')

DCL::sgiset('IFONT', 1)
DCL::sgstxi(1)

#-- ギリシャ文字 ----
greek1 = DCL::csgi(128) + DCL::csgi(129) + DCL::csgi(130) + DCL::csgi(131) + DCL::csgi(132) +
         DCL::csgi(133) + DCL::csgi(134) + DCL::csgi(135) + DCL::csgi(136) + DCL::csgi(137)
greek2 = DCL::csgi(152) + DCL::csgi(153) + DCL::csgi(154) + DCL::csgi(155) + DCL::csgi(156) +
         DCL::csgi(157) + DCL::csgi(158) + DCL::csgi(159) + DCL::csgi(160) + DCL::csgi(161)

DCL::sgtxv(xc, y[6], greek1)
DCL::sgtxv(xc, y[7], greek2)

#-- 特殊記号 ----
symbol = DCL::csgi(189) + DCL::csgi(190) + DCL::csgi(191) + DCL::csgi(192) + DCL::csgi(193) +
         DCL::csgi(210) + DCL::csgi(211) + DCL::csgi(212) + DCL::csgi(217) + DCL::csgi(218)

DCL::sgtxv(xc, y[8], symbol)

DCL::sgcls

program kihonb

\resizebox{10cm}{!}{\includegraphics{kihon2/kihonb.eps}}
kihonb.rb: frame1