;;I:(ichimark) 市マーク<=>階層連番化  khori 00/02/17 IsTomFile JumpIfFalse(TomFileERR) string head,kugiri,usiro integer f0,findfor setstr(head,''); ; setstr(head,'3.') ;head を入れる。 ; 3章の3. を前に入れる場合は,'3.'と入れる setstr(kugiri,'.'); '3.3' の'.' のように区切りの文字または階層のマーク setstr(usiro,' ') ; '3.3 ' の' 'のように後ろに付ける文字列 ;一行目の左端へカーソル移動 CurTop ; CurLeftEnd ; string s,ls,cr,x,y,z,z1 integer l,i,n1,n2,n3,n4,nn1,nn2,nn3,n,j,lkugiri string first,second,third,num,mark,num2 strlen(lkugiri,kugiri) SetStr(CR, ' ') SetStrAt(cr,0,13) setstr(mark,'●◎○◆◇') ;市マーク setstr(num,'0123456789') ;全角用使っていない setstr(num2,'0123456789') setint(n1,0) setint(n2,0) setint(n3,0) setint(n4,0) ; jump(renban2tom) ;;;++++++ setint(f0,0) UserGetInt(FindFor, '0:番号化 1:市マーク化 2:終了') jumpifFalse(end) call(checkok) setint(f0,findfor); Switch(FindFor, start, renban2tom, END,end) :start ;CurLeftEnd ;左端へ移動 GetCurLineStr(s); StrLen(l,s); cmpint(l,'<',3) jumpiftrue(next2); StrLeft(x,S,2); ;知子マークがあるか? strfind(l,mark,x) cmpint(l,'<',0) jumpiftrue(tugi) switchcall(l,level1,tugi,level2,tugi,level3,tugi,level4,tugi) :tugi ;次の行に進めるか:段落の最後か? StrFind(i,s,cr); cmpint(i,'>',-1) jumpiffalse(next); curdown jump(start) :next curdown GetCurLineStr(s); StrFind(i,s,cr); cmpint(i,'>',-1) jumpiffalse(next); :next2 curdown IsLastLine; jumpiffalse(start) :end exit; ;サブルーティン :level1 ;● inc(n1) setint(n2,0) setint(n3,0) setint(n4,0) CurLeftEnd ; DeleteChar ; ; setint(n,n1) ;call(han2zen) ; itoa(z,n) setstr(x,head) addstr(x,z) ;showmessage(x,0) addstr(x,usiro) PasteStr(x) ; return :level2 ;◎ inc(n2) setint(n3,0) setint(n4,0) CurLeftEnd ; DeleteChar ; itoa(z,n1) setstr(x,head) addstr(x,z) addstr(x,kugiri) itoa(z,n2) addstr(x,z) addstr(x,usiro) PasteStr(x) ; return :level3 ;○ inc(n3) setint(n4,0) CurLeftEnd ; DeleteChar ; itoa(z,n1) setstr(x,head) addstr(x,z) addstr(x,kugiri) itoa(z,n2) addstr(x,z) addstr(x,kugiri) itoA(z,n3) addstr(x,z) addstr(x,usiro) PasteStr(x) return :level4 ;◆ inc(n4) CurLeftEnd ; DeleteChar ; itoa(z,n1) setstr(x,head) addstr(x,z) addstr(x,kugiri) itoa(z,n2) addstr(x,z) addstr(x,kugiri) itoA(z,n3) addstr(x,z) addstr(x,kugiri) itoA(z,n4) addstr(x,z) addstr(x,usiro) PasteStr(x) return ;半角数字→全角数字;ここでは使っていない :han2zen itoa(z,n) strlen(l,z) setstr(x,'') ;showmessage(z,0) for (i,0, l) setint(j,i) strmid(z1,z,j,1) ;showmessage(z1,0) strfind(j,num2,z1) setint(n,j) multint(nn1,n,2) strmid(y,num,nn1,2) addstr(x,y) endfor return ;章立て連番をマークに戻す :renban2tom integer lhead,lhead1,lusiro,depth,k,l1,l2,ct string s0,s1,s2,ikigo strlen(lhead,head) addint(lhead1,lhead1,1) strlen(lusiro,usiro) cmpint(lusiro,'>',0) jumpiftrue(go0) showmessage('連番の後ろについている文字がないので処理できません',0) exit :go0 cmpstr(usiro,'<>',kugiri) jumpiftrue(go) showmessage('区切り文字と後ろ文字が同じなので処理できません',0) exit :go addint(lhead1,lhead1,lusiro) setint(depth,0) ; :starthead GetCurLineStr(s); StrLen(l,s); cmpint(l,'<',lhead1) jumpiftrue(nextnext2); cmpint(lhead,'>',0) JumpIfTrue(header) ;header ='' のとき GetCharType(l, S, 0) cmpint(l,'=',1) jumpiffalse(tugitugi) strleft(s1,s,1) strfind(l,num2,s1) cmpint(l,'=',-1) jumpiftrue(tugitugi) jump(checkusiro) :header strfind(l,s,head) cmpint(l,'=',0) ;headが1つめにあれば 0 jumpiffalse(tugitugi) :checkusiro strfind(l,s,usiro) cmpint(l,'>',lhead) ;headが1つめにあれば 0 jumpiffalse(tugitugi) ;後ろにつける文字がない ; strleft(s0,s,l) ;後ろ文字の前までの文字列にする subint(l,l,lhead) strright(s1,s0,l) ;head をとった文字列にする jump(kaiso); :tugitugi ;次の行に進めるか:段落の最後か? StrFind(i,s,cr); cmpint(i,'>',-1) jumpiffalse(nextnext); curdown jump(starthead) :nextnext curdown GetCurLineStr(s); StrFind(i,s,cr); cmpint(i,'>',-1) jumpiffalse(nextnext); :nextnext2 curdown IsLastLine; jumpiffalse(starthead) exit; :kaiso ;数字チェック GetCharType(l, S1, 0) cmpint(l,'=',1) jumpiffalse(kugirika) StrLeft(s2,s1,1) strfind(l,num2,s2) cmpint(l,'=',-1) jumpiftrue(kugirika) strlen(l,s1) dec(l) strright(s1,s1,l) strlen(l,s1) cmpint(l,'=',0) ;??長さは0から始まるか? 始まったらちょんぼ jumpiffalse(kaiso) ;番号→市マークの実際の処理 CurLeftEnd ;左端へ移動 addstr(s0,usiro) strlen(l,s0) For(i,0, l) setint(k,1) DeleteChar ; GetCharType(ct, S0, 0) cmpint(ct, '=', 2) ;2バイト文字の1バイト目 jumpiffalse(xnext) inc(k) :xnext strlen(l1,s0) decby(l1,k) strright(s0,s0,l1) strlen(l1,s0) BreakForInt(l1, '<', 1) EndFor ;(depth)*2 depth=0 が階層1 MultInt(depth, depth,2 ); strmid(ikigo,mark,depth,2) PasteStr(ikigo) ; setint(depth,0); jump(tugitugi) :kugirika ;区切りかチェック strfind(l,s1,kugiri) cmpint(l,'=',0) jumpiffalse(tugitugi) inc(depth) strlen(l,s1) decby(l,lkugiri) strright(s1,s1,l) jump(kaiso) ; :checkok RetIfTrue setint(findfor,f0) return :TomFileERR showmessage('知子さんではありません',0) :end exit // 知子市マーク<=>階層連番化 両方可能 《どんなマクロか》 知子の市マーク(●◎○)を章節等の階層化した連番に変える 階層化した連番を市マークに変えることができる。 市マークは4階層までサポートしていますが,4階層をフルに使う より3階層までで使用するほうがいいであろう(これはheader がらみのチョンボに備えて)。 ● 1  ◎ 1.1  ○ 1.1.1  となる。 キーは I:になってます。 いくつかのオプションがある。 《自分仕様にするためのオプション》 章ごとに知子データにしていて,章番号を前にいれたい場合 マクロの最初のほうの setstr(head,''); を setstr(head,'3.') のように区切り記号 '.' とともに指定する。 間違って番号だけにしないように。 区切り記号(階層化記号)も setstr(kugiri,'.'); '3.3' の'.' のように区切りの文字または階層のマーク の部分の'.' の. を変えればよい。 後ろにつける文字列も setstr(usiro,' ') ; '3.3 ' の' 'のように後ろに付ける文字列 の ' 'の全角空白を変えればよい。 ただし,区切り記号と後ろにつける文字列を同じにすると,階層連番から市マー ク(●◎○)に戻すことができない。 また,後ろにつける文字列を '' の場合も市マークに復元できない。 なお,header をきいてくるようにするのは簡単なのでそうしたい人はそうし てください。 おそらく,header を直接マクロに書き込んであるほうが 知子マーク<->階層 化連番 の行き来するのに便利でしょう。 《アウトライン的な使い方を拡張する》 このマクロは一度,階層番号をつけたが入れ替えたいときに威力を発揮する。 つまり,階層連番をつけたあと,市マークまたは任意の階層番号をつけて書い た あと,全てを市マークにし,再度,階層番号化すればきちんと連番になる。 《注意》 なお,このマクロは段落始めの記号のみに反応するようになっている。表示の しかたでたまたま先頭になった記号は無視する。そのため,段落の最初に市マー クや階層化連番と同じもの(先頭から区切り記号まで)がこないように文章を つくってください。 《お願い》 このマクロを応用すれば全角数字にするとか,もっとほかの階層のつくりかた のものに対応することも可能です。つくったら是非公開してください。そして どこに公開したか教えてください。 《免責》 走らせる前にデータを保存するなどの配慮をしてください。 なお,作者はこのマクロによっていかなる災いが降りかかっても責任を負いま せん。 《連絡先》 堀 啓造 hori@ec.kagawa-u.ac.jp