HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0429
真夏のストーブHSP3で上下付き文字を表示させたい5解決


真夏のストーブ

リンク

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

ご回答ありがとうございます。
実装できたので、これで解決とします。



kanamaru

リンク

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
サンプルは残してあるので、
どちらがいいのか実行結果を見比べてみてください。



kanamaru

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.