|
|
2015/4/29(Wed) 12:48:36|NO.68877
単純に上下付き文字だけ書きたいというのならば、posで微調整すればなんとかなりますが、
そうではなく、HTMLでいうところのsup、subタグ、TeXでいうところの^{}、_{}みたいな書き方で
勝手に上下付き文字にしてくれるような方法を考えています。
例えばx<sup>3</sup>+2x+1(<>は半角にします。掲示板なので全角で書いてますが)と書いて
「xの3乗+2x+1」という意味にさせたい時
H<sub>2</sub>Oで水の分子式であるH2Oを意味させたい時
・<sup></sup>の間にある文字列をどう取得するか
・その間の文字を右上下に表示させる必要があるが、その位置をどう取得するか
・その後の文字の表示位置をどう取得するのか
という問題があります。
randomize
#module
#deffunc smes str msg //必要があれば要素等を追加してもいいです
//ここを埋める
return
#global
cls
font msmincho,12+rnd(10)*4
pos rnd(150)+100,rnd(150)+100
smes "x<sup>3</sup>+2x+1 H<sub>2</sub>O"
stop
座標やフォントは適当に設定していますが、どんな位置でも表示出来るようにという意味です。
自分で作るとしたらこうなるだろうと思ってこういうコードを挙げましたが、
(supとsubが両方来ても対応出来る必要がある)
任意の座標とフォントで、かつHTMLやTeX等のような書き方で
上下付き文字が実装できるなら方法は問いません
(一応自分でも探しましたが、拡張モジュール等があればそれでも全く問題ないです)。
よろしくお願いします。
|
|
2015/4/29(Wed) 22:22:18|NO.68893
mod_regexp使って正規表現使検索する方法もあるが・・・
#module "mod_smes"
#deffunc smes str msg
if vartype(tag)=4 {tag="<sup>","<sub>","</sup>","</sub>"}
mref bmscr,67 //bmscr(32)にフォントYサイズが入ってる
cx=ginfo_cx
cy=ginfo_cy
i=0
str_msg=msg
stag@mod_smes
return
#deffunc local stag
repeat 2
index_pb(cnt) = instr(str_msg,i,tag(cnt))
loop
if (index_pb(0) < 0) and (index_pb(1) < 0) {//両方マイナスなら終わり
mes strmid(str_msg,i,strlen(str_msg)-i)
return
}
//近い方のフラグをセット
if ((index_pb(0) < index_pb(1)) and (index_pb(0)>=0)) or (index_pb(1)<0) {pb_f=0:addy=-bmscr(32)/3}else{pb_f=1:addy=bmscr(32)/3}
mes strmid(str_msg,i,index_pb(pb_f))
i+index_pb(pb_f)+5 //"<sup>"の文字数分加算
index_end=instr(str_msg,i,tag(pb_f+2))
cx+ginfo_mesx
pos cx,cy+addy
mes strmid(str_msg,i,index_end)
i+index_end+6
cx+ginfo_mesx
pos cx,cy
stag@mod_smes
return
#global
randomize
cls
font msmincho,12+rnd(10)*4
pos rnd(150)+100,rnd(150)+100
smes "x<sup>3</sup>+2x+1 H<sub>2</sub>O"
stop
|
|
2015/4/29(Wed) 23:15:21|NO.68896
ご回答ありがとうございます。
実装できたので、これで解決とします。
|
|
2015/4/30(Thu) 17:29:15|NO.68906
暇人さんのプログラムは僕が考えたプログラムより簡潔で、
すごいと思います。
しかし、僕が理系だからでしょうか?実行結果に不思議な感覚を覚えます。
理由は、H2Oの2の大きさが変わらないからです。
僕は暇人さんのプログラムを完全に理解することができなかったので、
少し適当ですが、僕なりに修正しました。
#module "mod_smes"
#deffunc smes str msg
if vartype(tag)=4 {tag="<sup>","<sub>","</sup>","</sub>"}
mref bmscr,67 //bmscr(32)にフォントYサイズが入ってる
cx=ginfo_cx
cy=ginfo_cy
i=0
str_msg=msg
stag@mod_smes
return
#deffunc local stag
repeat 2
index_pb(cnt) = instr(str_msg,i,tag(cnt))
loop
if (index_pb(0) < 0) and (index_pb(1) < 0) {//両方マイナスなら終わり
mes strmid(str_msg,i,strlen(str_msg)-i)
return
}
//近い方のフラグをセット
if ((index_pb(0) < index_pb(1)) and (index_pb(0)>=0)) or (index_pb(1)<0) {pb_f=0:addy=-bmscr(32)/3:yy=bmscr(32)/2}else{pb_f=1:addy=bmscr(32)/3:yy=bmscr(32)/4}
mes strmid(str_msg,i,index_pb(pb_f))
i+index_pb(pb_f)+5 //"<sup>"の文字数分加算
index_end=instr(str_msg,i,tag(pb_f+2))
cx+ginfo_mesx
pos cx,cy+addy
if addy!0 {
sdim fname
getstr fname, BMSCR, $E0
fsize = bmscr(32)
font_deco = 0
if bmscr.53 = 700 : font_deco + 1
if peek(BMSCR.54, 0) = 1 : font_deco + 2
if peek(BMSCR.54, 1) = 1 : font_deco + 4
if peek(BMSCR.54, 2) = 1 : font_deco + 8
if peek(BMSCR.55, 2) = 4 : font_deco + 16
font fname,fsize/3,font_deco+(font_deco \ 10 ! 1)
pos ginfo(22),ginfo(23)+yy
}
mes strmid(str_msg,i,index_end)
if addy!0 {
font fname,fsize,font_deco
}
i+index_end+6
cx+ginfo_mesx
pos cx,cy
stag@mod_smes
return
#global
randomize
cls
font msmincho,40
pos rnd(150)+100,rnd(150)+100
smes "a<sup>3</sup>+2x+1 H<sub>2</sub>O"
stop
サンプルは残してあるので、
どちらがいいのか実行結果を見比べてみてください。
| |
|
2015/4/30(Thu) 17:38:18|NO.68907
言い忘れてましたが暇人さんに頼みがあるんですが。
僕の修正版を添削してくれませんか?
|
|
2015/5/2(Sat) 16:55:19|NO.68942
どうせなので改行にも対応して
上下付き文字のサイズも指定出来るようにしてみた
#module "mod_smes"
//上下付き文字の大きさの倍率を設定(0.1〜1.0)
//設定がなければ0.5が設定される
#deffunc smesscale double s
scale=limitf(s,0.1,1.0)
return
//smes msg, p2
// msg=文字列
// p2=改行時に下付き文字描画時の底辺を使用
//<sup><sub></sup></sub>を解釈し上下付き文字を描画する
//改行に対応し実行後のカレントポジション等も標準命令のmesと同等
//statに下付き文字の底辺の座標が返る
#deffunc smes str msg,int p2
if vartype(tag)=4 {
tag="<sup>","<sub>","</sup>","</sub>"
if scale=0 {scale=0.5}
}
mref bmscr,67 //bmscr(32)にフォントYサイズが入ってるが、文字セルまたは文字の高さのbmscr(49)を使う
sdim fname
getstr fname, BMSCR, $E0
fsize= abs(bmscr(49)) | ((bmscr(49)=0)*bmscr(32)) //bmscr(32)だと読込まれたフォントによっては指定サイズと違って来るのでbmscr(49)を使用(再設定時に不都合なので)
font_deco=( (bmscr(53)=700) | (bmscr(54)*2) | (bmscr(54)/$40) | (bmscr(54)/$2000) | (bmscr(55)/$4000) )&%11111
sfsize=limit(scale*fsize,10,fsize) //上下付き文字用の文字サイズ(見辛いので最小は10にした)
_scale=(1.0*sfsize)/fsize //実際の倍率を算出
addy(0)=limit(fsize/3/2,0,fsize)*(fsize>20)-limit(sfsize/3/2,0,fsize)*(sfsize>20) //"MS 明朝"を基準に位置を計算してるのでフォントによってはずれる(上付き文字用)
addy(1)=fsize-sfsize
addy(1)-=addy(1)/6 //(下付き文字用)
if sfsize>(fsize/2) {addy(0)-=(_scale*sfsize/2):addy(1)+=(_scale*sfsize/2):wf=0}else{wf=1}//上下付き文字の大きさが元の大きさの半分より大きいときには再度位置調整して通常の太さフラグを指定
str_msg=msg
split str_msg,"\n",str_msg
max=stat
sub_y=0
repeat max
cx=ginfo_cx
cy=ginfo_cy
cx_bak=cx
i=0
stag@mod_smes cnt
if sub_y<ginfo_cy {sub_y=ginfo_cy}
if p2=0 {pos cx_bak}else{pos cx_bak,sub_y}
loop
bmscr(68)=(cx-cx_bak) //最後の行の描画幅
return sub_y
#deffunc local stag int c
repeat 2
index_pb(cnt) = instr(str_msg(c),i,tag(cnt))
loop
if (index_pb(0) < 0) and (index_pb(1) < 0) {//両方マイナスなら終わり
str_len=strlen(str_msg(c))-i
if str_len=0 {mes:return} //残りの文字が無かった
mes strmid(str_msg(c),i,str_len)
cx+ginfo_mesx
return
}
//ここに来た時点で上下付き文字なのは確定
//近い方のフラグをセット
if ((index_pb(0) < index_pb(1)) and (index_pb(0)>=0)) or (index_pb(1)<0) {pb_f=0/*上付き文字*/}else{pb_f=1/*下付き文字*/}
mes strmid(str_msg(c),i,index_pb(pb_f))
i+index_pb(pb_f)+5 //"<sup>"の文字数分加算
index_end=instr(str_msg(c),i,tag(pb_f+2))
cx+ginfo_mesx
pos cx,cy+addy(pb_f)
font fname,sfsize,(font_deco&%11110) | wf
mes strmid(str_msg(c),i,index_end)
if sub_y<ginfo_cy {sub_y=ginfo_cy} //下付き文字を描画したときの底の位置を記憶
font fname,fsize,font_deco
i+index_end+6
cx+ginfo_mesx
pos cx,cy
stag@mod_smes c
return
#global
randomize
*start
cls
button "更新",*start
font msmincho,32
pos 100,10
smesscale 0.1
smes "smesテスト<sup>上付き文字</sup>+<sub>下付き文字</sub>"
font msmincho,12+rnd(10)*4
pos 50,50
smesscale 0.4
smes "x<sup>3</sup>+2x+1 H<sub>2</sub>O"
color 255
line 50,stat,50+ginfo_mesx,stat
color
font msgothic,12+rnd(10)*4
pos 320,50
smesscale 0.6
smes "x<sup>3</sup>+2x+1 \nH<sub>2</sub>O"
color 255
line 320,stat,320+ginfo_mesx,stat
font msmincho,32+rnd(5)*8,1
color
pos 200,200
smesscale 0.3+0.01*rnd(70)
smes "x<sup>3</sup>+2x+1 H<sub>2</sub>O\nx<sup>3</sup>+2x+1 \nH<sub>2</sub>O",1
stop
| |
|