ある記号をキーとして任意の箇所で連番付No.03214
kendo さん 02/06/27 20:07
 
お世話になります。kendoです。

 予備校講師の知り合いからこんな操作ができないかという要望を受けての相談です。
いつものようにイメージだけで失礼します。


 それは「ある記号をキーとして任意の箇所で連番付きカッコを埋め込む」マクロと
いうものです。
 知り合いの人は「穴埋めテスト」に使いたいということのようです。

 たとえば次のような文章があったとします。

 むかしむかしある所におじいさんとおばさんが住んでいました。おじいさんは山に
しばかりに、おばあさんは川にせんたくに行きました。......

 ここで、簡単な漢字用のドリルをつくりたいとして、

 所 住 山 側 行をカッコにしたいので、たとえばあまり普通のテキストには出
てこない # をそれぞの漢字の前に埋め込みます。
(#はシフトキーを押すので実はちょっと不便です。@がいいのですが、最近はアド
レスでも使うので「あまり出てこない」と言えなくなりました。)

 むかしむかしある#所におじいさんとおばさんが#住んでいました。おじいさんは
#山にしばかりに、おばあさんは#川にせんたくに行きました。......

 ここで、そうしたマクロがあるとしてそれを実行して、

 むかしむかしある( 1 )所におじいさんとおばさんが( 2 )住んでいました。おじい
さんは( 3 )山にしばかりに、おばあさんは( 4 )川にせんたくに行きました。......

とカッコ付きの連番になるとうれしいです。

このあと、所 住 山 側 行をdeleteすれば穴埋め練習問題ができるわけです。

 さらに可能であれば、
 1.埋め込む文字は自分で設定できること(ここではとりあえず#でご説明しまし
た。)
 2.カッコの大きさと数字の位置が操作できること(埋め込んだものがすべて同じ
大きさ、位置でよい。ここに大きさを変える必要はない。)

です。
 とくに後者の場合、たとえば( 1    )などとできますと、( 1  所  )などと
書き込めて、練習問題を受ける子どもたちもそこに答えを書き込めます。


 もっとすごい要望としては、ある文字列をある種のカッコなどで括ると、その部分
が連番のカッコとなり、しかも括った部分が別の場所に拾い出されるようなマクロで
す。

たとえばさっきの文章で、てきとうな文字列を【 】で括ります。


 むかし【むかし】ある所におじいさんと【おばさん】が住んでいました。おじいさ
んは山にしばかりに、おばあさんは川に【せんたく】に行きました。......

 これにそうしたマクロがあるとして、それを実行すると


 むかし( 1 )ある所におじいさんと( 2 )が住んでいました。おじいさんは山にしば
かりに、おばあさんは川に( 3 ) に行きました。......


むかし
おばさん
せんたく
 

となり、カッコが埋め込まれ(そのときもカッコの幅とか、数字の位置が操作できる
ととても便利です。)、さらに、テキストの外に拾い出されました

むかし
おばさん
せんたく

は、まずはじめに適当にソートしまして、別途すでにライブラリにあります連番振り
のマクロで、


(ア)おばさん
(イ)せんたく
(ウ)むかし

とかすれば、選択肢となります。こうして選択式のテストができます。
長い説明で失礼します。

 「こうしたものはできない」というご指摘でも結構です。なにかアドバイスお願い
いたします。


[ ]
RE:03214 ある記号をキーとして任意の箇所No.03215
山紫水明 さん 02/06/27 23:50
 
 kendoさん,こんばんは。

 次のようなマクロでうまくいきますか?

//----------------------------------------------//
//Macro1
$k = input("記号は?");
$ps = input("数字の前のスペース");
$rs = input("数字の後ろのスペース");
gofiletop;
#i = 1;
while( 1 ) {
searchdown $k;
    if(!result) break;
    delete;
    insert "(" + $ps + str(#i) + $rs + ")";
    #i = #i + 1;
}
endmacro;
//----------------------------------------------//

//----------------------------------------------//
//Macro2
call Change_search;
$k1= "【";
$k2= "】";
$ps = input("数字の前のスペース");
$rs = input("数字の後ろのスペース");
gofiletop;
#i = 1;
while( 1 ) {
    searchdown $k1 + "[^" + $k2 + "]+" + $k2, regular;
    if( !result ) break;
    cut;
    insert "(" + $ps + str(#i) + $rs + ")";
    #i = #i + 1;
}
gofileend;
insert "\n";
while( #i > 1 ) {
    insert "\n";
    up;
    poppaste;
    golinetop;
    delete;
    golineend;
    backspace;
    golinetop;
    #i = #i - 1;
}
call Reset_search;
endmacro;

Change_search:    //検索状態を変更
if ( !searchmode ) {     // 検索状態を範囲選択に変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    #modechanged = 1;
    envchanged;
}
#searchoption = searchoption;
$searchbuffer = searchbuffer;
return;

Reset_search:   //検索状態を元に戻す
if ( #modechanged ) {
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
setsearch $searchbuffer, #searchoption;
return;
//----------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:03215 ある記号をキーとして任意の箇所No.03217
kendo さん 02/06/28 00:13
 
山紫水明様、kendoです。
 
 いつものことですが、さっそくのマクロありがとうございます。

 ためさせていただきました。イメージ通りで、しかも洗練されていてとてもすてき
です。
 知人に簡単に教えるのがもったいないくらいです。
 山紫水明さんがぜひライブラリーにアップして広めてください。(マクロとしては
たぶんとても単純なのでしょうが、利用価値は相当たかいのではないでしょうか。)

 一点だけ気づいたことですが、処理対象のテキストが改行なしで始まる場合、その
テキストの最初に、キーの記号(たとえば#)を付けたとき、また、改行なしで始ま
るテキスト最初の文字列を【 】で括ったとき、その最初の部分が残って処理できま
せん。
 そうした部分を( 1 )などとしたいこともあるかもしれませんので、その部分を改
良していただければほんとうに最高です。
 
(先週末から休日も出勤でしたので、今日はやすませていただきます。いろいろお願
いをしておいてさきに寝てすみません。)

失礼します。

> kendoさん,こんばんは。
>
> 次のようなマクロでうまくいきますか?

[ ]
RE:03217 ある記号をキーとして任意の箇所No.03218
山紫水明 さん 02/06/28 08:19
 
 kendoさん,こんにちは。

》 知人に簡単に教えるのがもったいないくらいです。

 まあ,そうもったいぶらないで。(^^;

》 山紫水明さんがぜひライブラリーにアップして広めてください。(マクロとし
》てはたぶんとても単純なのでしょうが、利用価値は相当たかいのではないでしょ
》うか。)

 さあ,どうでしょう。特殊な用途にしか使われないのでは。
 アップするとなると,説明を書くのが面倒で。(*_*)

》 一点だけ気づいたことですが、処理対象のテキストが改行なしで始まる場合、
》そのテキストの最初に、キーの記号(たとえば#)を付けたとき、また、改行な
》しで始まるテキスト最初の文字列を【 】で括ったとき、その最初の部分が残っ
》て処理できません。

 これはうっかりしていました。両マクロとも,
searchdown を
searchdown2
に入れ替えてください。

 それから,マクロ冒頭に,
disabledraw;
を置くと,画面のちらつきが少なくなるでしょう。

     では, (^^)/~
                                        山紫水明

[ ]
RE:03218 ある記号をキーとして任意の箇所No.03219
kendo さん 02/06/28 19:31
 
山紫水明様、kendoです。お世話になります。

>
> さあ,どうでしょう。特殊な用途にしか使われないのでは。
> アップするとなると,説明を書くのが面倒で。(*_*)
 そうですね。
>
>》 一点だけ気づいたことですが、処理対象のテキストが改行なしで始まる場合、
>》そのテキストの最初に、キーの記号(たとえば#)を付けたとき、また、改行な
>》しで始まるテキスト最初の文字列を【 】で括ったとき、その最初の部分が残っ
>》て処理できません。
>
> これはうっかりしていました。両マクロとも,
>searchdown を
>searchdown2
>に入れ替えてください。
>
> それから,マクロ冒頭に,
>disabledraw;
>を置くと,画面のちらつきが少なくなるでしょう。
 ありがとうございました。ばっちりです。
 

[ ]
RE:03218 ある記号をキーとして任意の箇所No.03224
kendo さん 02/06/30 21:50
 
山紫水明さん、kendoです。お世話になります。

 知り合いもとても喜んでいました。ありがとうございます。

 さて、ひとつお教えねがいたいのです。

 教えていただいた2番目のマクロを、知人はとくに活用しそうだということですが、
彼によると、ある範囲を指定してその部分だけを連番にして、その指定範囲のすぐ下
に抜き出した文字列群を挿入したい、ということですが、こうしたことは可能なので
しょうか。

 そう言われてみて、私も実際にあるテキストの10カ所くらいを【 】のカッコで
くくって、そのカッコの5番目くらいまでのところまでを先頭から範囲指定してから
マクロを実行すると、1〜5相当だけでなく、すべての部分が連番付きになってしま
いました。

 また抜き出した文字列群は、指定範囲のすぐ後ではなくて、やはりテキスト末尾で
出力されています。

 お忙しいところ申しわけありません。アドバイスをぜひお願いいたします。


[ ]
RE:03224 ある記号をキーとして任意の箇所No.03227
山紫水明 さん 02/07/01 21:05
 
 kendoさん,こんばんは。

》彼によると、ある範囲を指定してその部分だけを連番にして、その指定範囲のす
》ぐ下に抜き出した文字列群を挿入したい、ということですが、こうしたことは可
》能なのでしょうか。

 次のマクロでお試しください。

//----------------------------------------------//
//Macro2
call Change_search;
$k1= "【";
$k2= "】";
$ps = input("数字の前のスペース");
$rs = input("数字の後ろのスペース");
disabledraw;
if( selecting ) {
    #sel = 1;
    #handle1 = hidemaruhandle(0);
    cut;
    openfile "/h";
    #handle2 = hidemaruhandle(0);
    paste;
}
gofiletop;
#i = 1;
while( 1 ) {
    searchdown2 $k1 + "[^" + $k2 + "]+" + $k2, regular;
    if( !result ) break;
    cut;
    insert "(" + $ps + str(#i) + $rs + ")";
    #i = #i + 1;
}
gofileend;
insert "\n";
while( #i > 1 ) {
    insert "\n";
    up;
    poppaste;
    golinetop;
    delete;
    golineend;
    backspace;
    golinetop;
    #i = #i - 1;
}
if( #sel ) {
    gofileend;
    insert "\n";
    selectall;
    copy;
    setactivehidemaru #handle1;
    paste;
    closehidemaruforced #handle2;
}
call Reset_search;
endmacro;

Change_search:    //検索状態を変更
if ( !searchmode ) {     // 検索状態を範囲選択に変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    #modechanged = 1;
    envchanged;
}
#searchoption = searchoption;
$searchbuffer = searchbuffer;
return;

Reset_search:   //検索状態を元に戻す
if ( #modechanged ) {
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
setsearch $searchbuffer, #searchoption;
return;
//----------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:03227 ある記号をキーとして任意の箇所No.03229
kendo さん 02/07/01 22:27
 
山紫水明さん、kendoです。お手数おかけします。ばっちりです。
知人にメールに添付して送ります。
 ありがとうございました。
 ご家庭でも、お父さん、お母さんが、小さいお子さんに漢字の小テストを作ったり
するのに便利だと思います。
 

> kendoさん,こんばんは。
>
>》彼によると、ある範囲を指定してその部分だけを連番にして、その指定範囲のす
>》ぐ下に抜き出した文字列群を挿入したい、ということですが、こうしたことは可
>》能なのでしょうか。
>
> 次のマクロでお試しください。

[ ]