『連番自動割り振りマクロ』の改造方法にNo.04196
Majima さん 04/03/22 13:03
 
こんにちは。初めてご意見いたします。私は現在あるジェクトで
コーパス構築の作業をしておりまして、いろいろとコンピューター
をいじる機会 があります。文書を編集する際には秀丸エディタの
マクロ機能を活用しておりますが、まだマクロ製作歴が短くて、
自分のアイディアを上手くマクロで表現できないというのが
実情です。

秀丸サイトのマクロ集を見ると、林周行さんがお作りになった
『連番自動割り振りマクロ』が、これからはじめようとする作業
に大変為になるマクロではないかと感じたため、そのマクロの
改造について皆さんのご意見をお聞きしたいわけです。それなら
作者本人へ聞けばいいじゃないかという話ですが、林周行さんに
メールを送ったところ、返送されてきて連絡が取れない状態です。

本来は林周行さんのマクロを自分で改造して、自分の作業に
あったマクロを作るべきですがが、先ほども申し上げたように
私のマクロはまだ初歩的な段階で、レベル的にはキーボードマクロ
から少し発展したぐらいであります。ですから改造方法について
お聞きするというよりは、私の考えるマクロの基本的な動きが
出来るように基本マクロを作っていただきたいというのが本音で
あります。その基本マクロがあれば、私なりに改造ができると
思います。

以下に私の必要としているマクロの基本動作について簡単に
記しておきます。参考までにご覧ください。

ではご意見お待ちしております。


********** 必要なマクロの動作 **********

1.ある日本語の文章の中で、行頭から改行までの区間の文章を対象に、
  「。」のある部分を基準に文と文を区切り、各文ごとに<s id=1>....</s>で区切
ります。
  その際、行頭の文から順番に連番をつけます。

  【例】
  昨日は晴れだった。今日は曇りだ。明日は雨だろう。
   ↓
  <s id=1>昨日は晴れだった。</s><s id=2>今日は曇りだ。</s><s id=3>明日は雨
だろう。</s>
  
  これは基本的にはhtml方式でその文がどのパラグラフの、どのセンテンスにある
文なのかを
  明示するもので、実際には以下のように複雑に下位分類していきます。でもこれ
は実際に
  作業基準を詳しく説明しないと分からないでしょうね。とにかくこんな感じで作
業をします。

  <body id=1>
  <div id=1.1> →ディビジョンID(div id=)は、文章を大きく分割するという
意味。
  <p id=1.1.p1> →大きく分割した文章の中の一つ目のパラグラフ(段落)とい
う意味。
  <s id=1.1.p1.s1>......</s> →一つ目のパラグラフの中の一つ目のセンテンス
(文)という意味。
  <s id=1.1.p1.s2>......</s>
  <s id=1.1.p1.s3>......</s></p> →ここで改行が入って一つの段落が終わって
いる。
  <p id=1.1.p2> →新しい段落になったので、パラグラフのID(p id=)も‘p1
’から‘p2’へと変わる。
  <s id=1.1.p2.s1>......</s>
  <s id=1.1.p2.s2>......</s>
  <s id=1.1.p2.s3>......</s></p> →ここでも改行が入って一つの段落が終わっ
ている。
  <p id=1.1.p3>
  <s id=1.1.p3.s1>......</s>
  <s id=1.1.p3.s2>......</s></p></div></body> →html表記のように必ず<
>....</>で閉じる。

2.日本語の文章の中には「。」で終わらないものがあったりして、実際に文脈を確
認して<>....</>を
  追加しなければならないものも出てきます。また必要以上に分割されて、逆に<
>....</>を削除
  しなければならないものも出てきます。上記1.の作業を一通り終えた後、<>....
</>の区切りを
  追加&削除したりすると、連番が合わなくなってしまいます。そこで林周行さん
のお作りになった
  『連番自動割り振りマクロ』のにあるような、連番修正機能を応用してその作業
を機械化します。

  【例】
  (マクロ前)
  <body id=1>
  <div id=1.1>
  <p id=1.1.p1>
  <s id=1.1.p1.s1>......</s>
  <s id=1.1.p1.s2>......</s> →追加(追加をしたので、<s id=1.1.p1.s2>が2
回出てきている。)
  <s id=1.1.p1.s2>......</s>
  <s id=1.1.p1.s3>......</s></p>
  <p id=1.1.p2>
  <s id=1.1.p2.s1>......</s>
          →削除(削除をしたので、<s id=1.1.p2.s1>の次が<s id=1.1.
p2.s3>になっている。)
  <s id=1.1.p2.s3>......</s></p>
  <p id=1.1.p3>
  <s id=1.1.p3.s1>......</s>
  <s id=1.1.p3.s2>......</s></p></div></body>

  (マクロ後)
  <body id=1>
  <div id=1.1>
  <p id=1.1.p1>
  <s id=1.1.p1.s1>......</s>
  <s id=1.1.p1.s2>......</s> →追加以降の連番が合っている
  <s id=1.1.p1.s3>......</s>
  <s id=1.1.p1.s4>......</s></p>
  <p id=1.1.p2>
  <s id=1.1.p2.s1>......</s>
  <s id=1.1.p2.s2>......</s></p> →削除したIDに合わせて連番が変わっている
  <p id=1.1.p3>
  <s id=1.1.p3.s1>......</s>
  <s id=1.1.p3.s2>......</s></p></div></body>


****************************************************

ちなみに『連番自動割り振りマクロ Ver 1.82』は秀丸ホームページの
マクロライブラリーの2ページ目にありました。
 
 

[ ]
RE:04196 『連番自動割り振りマクロ』の改No.04197
ENCODINGSHIFTJIS さん 04/03/22 15:31
 
タグ付けが完了しているなら、 XML系統のプログラムで
再編集するのが適当です、が、私の意見です。

プレーンテキストを対象とする、エディタで階層のある
構造(アウトライン)を把握させるのは、XML関連のソフトと
同等物を作ることになりますから、どうでしょう。
(可能ではあるが)
XML専用エディタもあります。

その他の理由
●構造の座標位置を id 属性で埋め込むのは、ダサいでもある。
XML なら、そのような属性を無しにアクセス可能なしくみは多数ある。
XPath,XQuery,XML-DB
 body[1]/div[1]/p[2]/s[3]
という記法で、最初のdivの第二パラグラフの3番目のセンテンスを
抽出できますし、現在位置の Parent軸を参照して、階層上の座標
を取得もできます。  position() 関数などもあります。
●XSLT変換では numberエレメントにより、XML上の位置を数字化して表現
して出力できます。(本来は目次階層を出力意図のもの)、ナンバー
のリセットタイミングも指定できます。

<body><div><p><s>.... に変換出力で 1.1.p2.s3 を埋めるのは、
XSLTの練習問題の定番にあると思います。
多階層のXML文書にナンバリング処理を行う
http://www.atmarkit.co.jp/fxml/tecs/010xslt/10.html

[ ]
RE:04196 『連番自動割り振りマクロ』の改No.04198
山紫水明 さん 04/03/22 22:27
 
 Majimaさん,こんばんは。

 結局1行の中でs1,s2,・・・・の連番を整序すればよいということに帰着すると考
えてよろしいですか?

//------------------------------------------//
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
disabledraw;
gofiletop;//必要なら
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
endmacro;
//------------------------------------------//

 はずしていたらごめんなさい。

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

[ ]
RE:04198 ENCODINGSHIFTJISさんと山紫水明No.04200
Majima さん 04/03/23 00:00
 
こんばんは。ENCODINGSHIFTJISさんと山紫水明さん。
コメント本当に有難うございます。こんな変な質問に誰が答えて
くれるかと思っていましたが、すぐにコメントをしてくださって
感動しております。始めの投稿の内容のように、私のマクロ歴では
すぐに理解できない部分があったり、うまく説明できない部分が
あると思いますが、その辺はご勘弁ください。

私のやろうとしている作業内容をもう少し具体的にお話しすると、
次のようになります。ちょっと長くなるかもしれませんが、去年の
作業内容のサンプルを示しながら説明したいと思います。まず、
基本となるテキストを入力します。これは勿論手作業になりますね。

【サンプル1】***********************************************

「SARS感染者と同乗」韓国人異常なし

先月28日、正体不明の肺炎「SARS」(重症急性呼吸器症候群)の台湾人患者と一
緒の飛行機に乗り、中国北京から仁川(インチョン)空港に到着した韓国人188人に対
する「第2回SARS感染調査」で、182人が正常と確認された。
搭乗していた飛行機の乗務員20人や空港免税店の職員など1800人も、第2回調査で正
常と確認された。
これらの人たちを調査した国立保健院は10日、「潜伏期の14日が過ぎたが、まったく
症状が現われていない。SARSとはまったく関係がないものと結論付けた」と明ら
かにした。
保健院はしかし、まだ連絡の取れていない韓国人入国者6人と外国人入国者25人に対
しては、追跡を続けている。

【03年国民意識調査】「経済成長が最優先課題」

韓国人10人中7人は国家の最優先課題として「経済成長」を挙げ、不況による危機の
克服が最も早急な課題と考えていることが分かった。
また、朝鮮民主主義人民共和国(北朝鮮)に対しては「安全を脅かす敵対的対象」
(7.8%)や「助けてあげなければならない対象」(22.8%)よりは「発展制約の警
戒対象(31.4%)」と考えていることが分かった。
ソウル大学・社会発展研究所は10日、サムスン経済研究所の依頼で全国の20歳以上の
1200人を対象に行ったアンケート調査の結果を盛り込んだ「2003年韓国社会国民意識
と価値観に関する調査研究」を発表した。
回答者の61.1%が「北朝鮮が核兵器を開発しているとしても対北支援は続けるべき」
という見解に否定的に答え、「経済事情が悪化しても早く統一された方がいい」とい
う意見も反対(45.6%)が賛成(32.8%)より多かった。
「北朝鮮との関係改善」と「米国との同盟維持」のうち、前者がより重要だという回
答者は41.8%、後者がより重要だという回答者は27.2%だった。「駐韓米軍が撤退し
ても安保上、大きな問題はない」という見解には反対(54.2%)が賛成(22.9%)に
比べ2倍以上多かった。
「米国に対し拒否感を感じる」という回答者は41.9%と、一昨年の21.7%に比べ大幅
に増えた。そうであるにもかかわらず、最も好きな国は米国(39.0%)、中国(22.9
%)、北朝鮮(17.3%)、日本(12.7%)の順だった。
盧武鉉(ノ・ムヒョン)大統領については、「進取性は優れているが、洗練美が足り
ない」と思っていることが分かった。肯定100点、否定100点満点で調査したところ、
進取性が37.5点と最も高く、これに続き信頼感(28.5%)、親近感(27.6%)、安定
性(27.5%)、和合力(23.8%)の順に続いた。洗練美(マイナス1.8)は唯一マイ
ナスの点数が出た。
韓国の社会構造と関連しては「韓国社会で成功するためには“つて”や家柄が必須」
という答えが63.3%と、「必須ではない」(16.8%)より4倍近く多かった。特に必
須的だという答えは20代(68.8%)が50代(55.9%)に比べ高かった。
また、金銭万能主義に対しては4人に3人が「韓国社会でカネがあればできないことは
ない(74.2%)」と答えた半面、反対は13.2%に過ぎなかった。

*************************************************************

次にこのプレーンテキストに例のタグ付けをします。タグ付けの
結果は以下のようになります。

【サンプル2】***********************************************

<body id=1>
<div id=1.1>
<head id=1.1.h1>「SARS感染者と同乗」韓国人異常なし</head>
<p id=1.1.p1><s id=1.1.p1.s1>先月28日、正体不明の肺炎「SARS」(重症急性
呼吸器症候群)の台湾人患者と一緒の飛行機に乗り、中国北京から仁川(インチョン)
空港に到着した韓国人188人に対する「第2回SARS感染調査」で、182人が正常と
確認された。</s></p>
<p id=1.1.p2><s id=1.1.p2.s1>搭乗していた飛行機の乗務員20人や空港免税店の職
員など1800人も、第2回調査で正常と確認された。</s></p>
<p id=1.1.p3><s id=1.1.p3.s1>これらの人たちを調査した国立保健院は10日、「潜
伏期の14日が過ぎたが、まったく症状が現われていない。SARSとはまったく関係
がないものと結論付けた」と明らかにした。</s></p>
<p id=1.1.p4><s id=1.1.p4.s1>保健院はしかし、まだ連絡の取れていない韓国人入
国者6人と外国人入国者25人に対しては、追跡を続けている。</s></p>
</div>
<div id=1.2>
<head id=1.2.h1>【03年国民意識調査】「経済成長が最優先課題」</head>
<p id=1.2.p1><s id=1.2.p1.s1>韓国人10人中7人は国家の最優先課題として「経済成
長」を挙げ、不況による危機の克服が最も早急な課題と考えていることが分かった。
</s></p>
<p id=1.2.p2><s id=1.2.p2.s1>また、朝鮮民主主義人民共和国(北朝鮮)に対して
は「安全を脅かす敵対的対象」(7.8%)や「助けてあげなければならない対象」(2
2.8%)よりは「発展制約の警戒対象(31.4%)」と考えていることが分かった。</s
></p>
<p id=1.2.p3><s id=1.2.p3.s1>ソウル大学・社会発展研究所は10日、サムスン経済
研究所の依頼で全国の20歳以上の1200人を対象に行ったアンケート調査の結果を盛り
込んだ「2003年韓国社会国民意識と価値観に関する調査研究」を発表した。</s></p>
<p id=1.2.p4><s id=1.2.p4.s1>回答者の61.1%が「北朝鮮が核兵器を開発している
としても対北支援は続けるべき」という見解に否定的に答え、「経済事情が悪化して
も早く統一された方がいい」という意見も反対(45.6%)が賛成(32.8%)より多か
った。</s></p>
<p id=1.2.p5><s id=1.2.p5.s1>「北朝鮮との関係改善」と「米国との同盟維持」の
うち、前者がより重要だという回答者は41.8%、後者がより重要だという回答者は27.
2%だった。</s><s id=1.2.p5.s2>「駐韓米軍が撤退しても安保上、大きな問題はな
い」という見解には反対(54.2%)が賛成(22.9%)に比べ2倍以上多かった。</s></p>
<p id=1.2.p6><s id=1.2.p6.s1>「米国に対し拒否感を感じる」という回答者は41.9
%と、一昨年の21.7%に比べ大幅に増えた。</s><s id=1.2.p6.s2>「そうであるにも
かかわらず、最も好きな国は米国(39.0%)、中国(22.9%)、北朝鮮(17.3%)、
日本(12.7%)の順だった。</s></p>
<p id=1.2.p7><s id=1.2.p7.s1>盧武鉉(ノ・ムヒョン)大統領については、「進取
性は優れているが、洗練美が足りない」と思っていることが分かった。</s><s id=1.
2.p7.s2>肯定100点、否定100点満点で調査したところ、進取性が37.5点と最も高く、
これに続き信頼感(28.5%)、親近感(27.6%)、安定性(27.5%)、和合力(23.8
%)の順に続いた。洗練美(マイナス1.8)は唯一マイナスの点数が出た。</s></p>
<p id=1.2.p8><s id=1.2.p8.s1>韓国の社会構造と関連しては「韓国社会で成功する
ためには“つて”や家柄が必須」という答えが63.3%と、「必須ではない」(16.8
%)より4倍近く多かった。</s><s id=1.2.p8.s2>特に必須的だという答えは20代(6
8.8%)が50代(55.9%)に比べ高かった。</s></p>
<p id=1.2.p9><s id=1.2.p9.s1>また、金銭万能主義に対しては4人に3人が「韓国社
会でカネがあればできないことはない(74.2%)」と答えた半面、反対は13.2%に過
ぎなかった。</s></p>
</div>
</body>

*************************************************************

私がやろうとしている作業はこのサンプル2のようにすることですが、
去年の作業の時は、全て手作業でやっておりました。やりながらも
これをマクロでどうにかならないかなぁと思っていましたが、今年は
出来る作業は全てマクロで処理しようと考えている訳です。

ですから、私の求めるマクロの機能としては、まずサンプル1の
プレーンテキストに自動・半自動的にタグ付けをする作業です。
私の頭では一括して自動で処理できないと思っているので、行の
頭にきたときにポップアップを出して、その行が

<div id=...>
<head id=...>
<p id=...><s id=...>

のどのタグ情報を要求しているのかを作業している人に選択して
もらって、その後、改行のある部分まで自動的に連番をつけるという
マクロです。改行の部分まで自動的に作業が終わると、また次の
行頭を探して、そこでまたポップアップを出すわけですが、その
時はすぐ前の行のタグ情報を参照して、自動的に次の行に来ることが
予想されるタグ情報をポップアップで出して、もしそれでいいので
あれば、OKを押してマクロ作業を続行して、その情報が間違いで
あれば、キーボードで正しいタグ情報を入力した後、マクロを
続行するという形です。

なんだかすごく自分の頭の中で理解しているという感じで、理解に
苦しむと思いますが、とにかく私の中ではこんなマクロがあれば
いいなぁと考えています。勿論タグ付けのマクロをプップアップとか
キーボード入力とか言わずに、一度にファイルの最後まで実行できれば
もっといいですが、それだと後で手作業で確認するときに、正しくない
タグ情報がいっぱい出てきそうで、一行ごとにタグ情報の確認を
しながらマクロ作業を見守るのが作業効率がいいのかなと思っています。

それからもう一つのマクロは、一度タグ付けをマクロで自動処理
した後に、正しくタグ付けされているのか手作業で確認をしながら、
手作業でのタグの追加&削除によって、番号が合わなくなった連番を
正しく合わせてくれるマクロです。これは該当部分だけブロック指定
をして、マクロを実行すると正しい連番に直すというのが、私の
マクロ構想案にあります。

このような作業をして、最終的にサンプル2のようなタグ付けファイル
を完成させるわけです。どれも恐ろしいぐらいに抽象的で、漠然とした
マクロ作成の提案ですが、私の頭ではこれぐらいのことしか分かりません。

まず、私の作業内容で、私の考えていることが、マクロで実行できるの
でしょうか?もし出来るのであれば、どんな方法でもいいですから、
お助けいただけると本当に有難く思います。

ちなみに「どうしてこんな変な作業をしているんだ」とか「このタグ
付けのスタイルよりはこういうタグ付けのスタイルの方がもっといい」
とか作業の内容自体に疑問をお感じになる部分もあるかと思いますが、
この作業はコーパス構築のプロジェクトチームでやっておりまして、
一番上の方で決まった方針に沿って私が作業をしているわけです。
よって、タグ付けのスタイル自体に大幅な変更が起きてしまうマクロ
に関しては、私の質問の本来の趣旨にそぐわなくなってしまう恐れが
ありますので、その点も考慮なさってアドバイスを頂けたらと思います。

[ ]
RE:04197 『連番自動割り振りマクロ』の改No.04201
ENCODINGSHIFTJIS さん 04/03/23 11:07
 
<HTML><HEAD><STYLE>CSS ・・・<BODY><!-- XHTML化して使うこと -->
<OL class=div>
<LI class=head>
<OL class=p>
<LI class=s>
・・・
HTMLをベースにすると、5万とある、HTMLエディタ類をタグ付け
に使えて表示確認もすぐできます。

一括で粗なタグ付け → HTML表示確認 ←→ HTML編集 → XSLT変換
処理のフローはこんな感じ。
最終形への変換はXSLTです。XMLの初心者でも可能です。
XML,HTML の普通レベル知識で解決できるでしょう、たぶん。

[ ]
RE:04201 『連番自動割り振りマクロ』の改No.04202
Majima さん 04/03/23 12:39
 
ENCODINGSHIFTJISさん。またまたご教示有難うございます。
すぐには理解できていない状態なので、まずは「XSLT変換」や
「XML」といった、基本的な概念を勉強しながらタグ付けの方法を
研究したいと思います。勉強しながらENCODINGSHIFTJISさんの
おっしゃろうとしていることが分かってくると思います。

[ ]
RE:04198 『連番自動割り振りマクロ』の改No.04203
Majima さん 04/03/23 13:21
 
山紫水明さん

マクロ動かしてみました。使えそうですね。有難うございます。
ソースも短いのでよく読んで勉強させてもらいます。
タグ自動付けマクロの案に関してはどのようなお考えですか。
秀丸のマクロで可能でしょうか。

[ ]
RE:04203 『連番自動割り振りマクロ』の改No.04204
山紫水明 さん 04/03/23 21:07
 
 Majimaさん,こんばんは。

》マクロ動かしてみました。使えそうですね。有難うございます。

 修正用のマクロがご希望だと思いましたので作ってみましたが,その限りでは
役に立ったようですね。

》タグ自動付けマクロの案に関してはどのようなお考えですか。
》秀丸のマクロで可能でしょうか。

 こちらの方はかなりややこしいです。一応作ってみました。修正用のも合わせ
ています。修正用は範囲選択しても使えます。

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

//------ InsertTag.mac ----------------------------------------//
menu "&1 タグの付加",
     "&2 修    正";
if( result == 0 ) endmacro;
else if( result == 2 ) goto Revision;
call GetID;
while( 1 ) {
    menu "&Body Id",
         "&Division Id",
         "&Header Id",
         "&Paragraph Id",
         "&N 次行",
         "&R 改行挿入",
         "&Quit";
    if( result == 0 || result == 7 ) break;
    else if( result == 1 ) call BodyID;
    else if( result == 2 ) call DivID;
    else if( result == 3 ) call HeadID;
    else if( result == 4 ) call PID;
    else if( result == 5 ) movetolineno 1, lineno + 1;
    else insertfix "\n";
    if( lineno >= linecount2 - 2 ) endmacro;
}
endmacro;

BodyID:
#body = #body + 1;
#body = val(input( "Body Id", str(#body)));
if( #body == 0 ) return;
insert "<body id=" + str(#body) + ">";
gofileend;
insert "<div id>\n</body>\n";
prevpos;
movetolineno 1, lineno + 1;
return;

DivID:
#div = #div + 1;
#div = val(input( "Division Id", str(#div)));
if( #div == 0 ) return;
if( #div > 1 ) insert "</div>\n";
insert "<div id=" + str(#body) + "." + str(#div) + ">";
movetolineno 1, lineno + 1;
#pid = 0;
#head = 0;
return;

HeadID:
#head = #head + 1;
#head = val(input( "Header Id", str(#head)));
if( #head == 0 ) return;
insert "<head id=" + str(#body) + "." + str(#div) + ".h"
        + str(#head) + ">";
golineend2;
insert "</head>";
movetolineno 1, lineno + 1;
#pid = 0;
return;

PID:
#pid = #pid + 1;
#pid = val(input( "Paragraph Id", str(#pid)));
if( #pid == 0 ) return;
insert "<p id=" + str(#body) + "." + str(#div) + "." + str(#head)
        + ".p"  + str(#pid) + ">";
golinetop2;
searchdown ">";
right;
#sid = 1;
call SID;
return;

SID:
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + "." + str(#head)
            + ".p"+ str(#pid) + ".s"  + str(#sid) + ">";
    searchdown "。";
    if ( !result ) endmacro;
    if( lineno > #line ) {
        golinetop2;
        break;
    }
    right;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;

Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
call ChangeSearchMode;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
call RestoreSearchMode;
return;
//-------------------------------------------------//


[ ]
RE:04204 『連番自動割り振りマクロ』の改No.04207
Majima さん 04/03/24 15:42
 
山紫水明さん

山紫水明さんに作っていただいたマクロに少し手を加えながら
どういうマクロがいいのか色々と試しています。タグ付けの
部分で修正部分があり、そこを直した後、メニューを増やして
一度マクロを実行したらファイルの最後まで止めないように、
必要かもしれない動きを追加しました。それから主に使う動きは
アルファベットのダイレクトキーじゃなくて、数字のダイレクトキー
に変えました。手のポジションを出来るだけ変えずに作業を
したかったからです。この案がいいかは分かりませんが、マクロ
ファイルを一緒に作業する者にも配って作業を進めるにはこの
方が分かりやすく、作業もしやすいかなぁと思っています。

それから一つ欲を言うと、マクロを実行すると、カーソルが行の頭に
来たときにタグ情報を選択するメニューが出ますよね。あれって
画面の真ん中とかに移動できないでしょうか。行の頭がメニューで
隠れると、そこにどういったタグ情報が入るのか分かりにくいので。
カーソルの付近にメニューが出るのは、秀丸の仕様で、しょうがない
のでしょうか。

//------ InsertTag.mac 040323 ----------------------------------------//
menu "&1 タグの付加",
     "&2 修    正";
if( result == 0 ) endmacro;
else if( result == 2 ) goto Revision;
call GetID;
while( 1 ) {
    menu "&1 Body <body id=>",
         "&2 Division <div id=>",
         "&3 Header <head id=>",
         "&4 Paragraph <p id=><s id=>",
         "***************************",
         "&N Next (次行)",
         "&R Retern (改行挿入)",
         "&D Delete (改行削除)",
         "***************************",
         "&Z (やり直し)",
         "&Q Quit (作業終了)";
    if( result == 0 || result == 11 ) break;
    else if( result == 1 ) call BodyID;
    else if( result == 2 ) call DivID;
    else if( result == 3 ) call HeadID;
    else if( result == 4 ) call PID;
    else if( result == 6 ) movetolineno 1, lineno + 1;
    else if( result == 7 ) insertfix "\n";
    else if( result == 8 ) deleteline;
    else if( result == 10 ) undo;
    if( lineno >= linecount2 - 2 ) endmacro;
}
endmacro;

BodyID:
#body = #body + 1;
#body = val(input( "Body Id", str(#body)));
if( #body == 0 ) return;
insert "<body id=" + str(#body) + ">";
gofileend;
insert "</div>\n</body>\n";
prevpos;
movetolineno 1, lineno + 1;
return;

DivID:
#div = #div + 1;
#div = val(input( "Division Id", str(#div)));
if( #div == 0 ) return;
if( #div > 1 ) insert "</div>\n";
insert "<div id=" + str(#body) + "." + str(#div) + ">";
movetolineno 1, lineno + 1;
#pid = 0;
#head = 0;
return;

HeadID:
#head = #head + 1;
#head = val(input( "Header Id", str(#head)));
if( #head == 0 ) return;
insert "<head id=" + str(#body) + "." + str(#div) + ".h"
        + str(#head) + ">";
golineend2;
insert "</head>";
movetolineno 1, lineno + 1;
#pid = 0;
return;

PID:
#pid = #pid + 1;
#pid = val(input( "Paragraph Id", str(#pid)));
if( #pid == 0 ) return;
insert "<p id=" + str(#body) + "." + str(#div) + ".p"
        + str(#pid) + ">";
golinetop2;
searchdown ">";
right;
#sid = 1;
call SID;
return;

SID:
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
            + str(#pid) + ".s"  + str(#sid) + ">";
    searchdown "。";
    if ( !result ) endmacro;
    if( lineno > #line ) {
        golinetop2;
        break;
    }
    right;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;

Revision:
call ChangeSearchMode;
disabledraw;
if( selecting ) {
    escape;
    moveto selendx, selendy;
    #endline = lineno;
    moveto seltopx, seltopy;
} else {
    gofiletop;
    #endline = linecount2;
}
while( 1 ) {
    golinetop2;
    #i = 1;
    while( 1 ) {
        #line = lineno;
        searchdown "s[0-9]+", regular;
        if( result == 0 ) goto End;
        if( lineno > #line ) break;
        if( lineno >= #endline ) {
            golinetop2;
            goto End;
        }
        insert "s" + str( #i );
        #i = #i + 1;
    }
}
End:
call RestoreSearchMode;
endmacro;

ChangeSearchMode:
#searchmode = searchmode;
if( !#searchmode ) {  //検索状態を変更
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "SelectFound", 1;
    envchanged;
}
return;

RestoreSearchMode:
if( !#searchmode ) {  //検索状態をもとにもどす
    writeregnum "SelectFound", 0;
    envchanged;
    closereg;
}
return;

GetID:
##x = x; ##y = y;
call ChangeSearchMode;
searchup "p id=[0-9.]+p", regular;
if( !result ) goto GetEnd
moveto selendx, y;
beginsel;
searchdown ">";
#pid = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "head id=[0-9.]+h", regular;
moveto selendx, y;
beginsel;
searchdown ">";
#head = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "div id=[0-9]+", regular;
moveto selendx, y;
right;
beginsel;
searchdown ">";
#div = val( gettext( seltopx, seltopy, selendx, selendy ) );
moveto ##x, ##y;
searchup "body id=";
moveto selendx, y;
beginsel;
searchdown ">";
#body = val( gettext( seltopx, seltopy, selendx, selendy ) );
GetEnd:
moveto ##x, ##y;
call RestoreSearchMode;
return;
//-------------------------------------------------//

[ ]
RE:04207 『連番自動割り振りマクロ』の改No.04209
山紫水明 さん 04/03/24 21:58
 
 Majimaさん,こんばんは。


》一度マクロを実行したらファイルの最後まで止めないように、必要かもしれな
》い動きを追加しました。

 途中で止めても再会できるようには作ったつもりではありますが,必要なこと
は全部できるようにするのもいいでしょう。

》アルファベットのダイレクトキーじゃなくて、数字のダイレクトキーに変えま
》した。

 使いやすさはそれぞれでしょうね。

》それから一つ欲を言うと、マクロを実行すると、カーソルが行の頭に来たとき
》にタグ情報を選択するメニューが出ますよね。あれって画面の真ん中とかに移
》動できないでしょうか。

 始めの部分を次のようにしたらいかがでしょう。
-----------------------------------
menu "&1 タグの付加",
     "&2 修    正";
if( result == 0 ) endmacro;
else if( result == 2 ) goto Revision;
call GetID;
#free = freecursor;
if( !#free ) freecursorswitch;
while( 1 ) {
    #x = x; #y = y;
    setmark;
    moveto 30, #y;
    menu "&1 Body <body id=>",
         "&2 Division <div id=>",
         "&3 Header <head id=>",
         "&4 Paragraph <p id=><s id=>",
         "***************************",
         "&N Next (次行)",
         "&R Retern (改行挿入)",
         "&D Delete (改行削除)",
         "***************************",
         "&Z (やり直し)",
         "&Q Quit (作業終了)";
    #r = result;
    moveto #x, #y;
    setmark;
    if( #r == 0 || #r == 11 ) break;
    else if( #r == 1 ) call BodyID;
    else if( #r == 2 ) call DivID;
    else if( #r == 3 ) call HeadID;
    else if( #r == 4 ) call PID;
    else if( #r == 6 ) movetolineno 1, lineno + 1;
    else if( #r == 7 ) insertfix "\n";
    else if( #r == 8 ) deleteline;
    else if( #r == 10 ) undo;
    if( lineno >= linecount2 - 2 ) endmacro;
}
if( !#free ) freecursorswitch;
endmacro;
-----------------------------------
     では, (^^)/~
                                        山紫水明

[ ]
RE:04209 『連番自動割り振りマクロ』の改No.04211
Majima さん 04/03/24 23:25
 
山紫水明さん

大変お世話になっております。タグ情報選択のメニューの位置を
画面中心部分に出すようにするソースに書き換えたところ、非常に
作業がしやすくなりました。どうも有難うございます。ますます欲が
出て、更に作業効率の高いマクロにしようと思い、また質問しても
よろしいでしょうか(あまり他力本願ではいけないと思い、これでも
一応自分でもソースを読んでいろいろといじっていますが・・・)。
いろいろと勉強させていただきます。

このマクロの最も基本的な目的は、文と文の境界を探し、文ごとに
任意の一連番号をふることですが、これからありとあらゆるジャンル
の日本語テキストへこの作業を加えるためには、それなりの柔軟性が
必要となります。このマクロは“。”を基準に文と文を分ける機能を
持っていますが、文の中には【例1】のように

【例1】田中はこう言った。「はい。」その時、・・・

と、かぎ括弧の中に“。”が入っている場合もあります。その場合、
かぎ括弧の始まりから終わりを一つの文の単位として区切るつもり
ですが、このマクロで動かすとかぎ括弧の終わりの部分が

言った。</s><s id=1.p6.s2>「はい。</s><s id=1.p6.s3>」その時、・・

となってしまい、手作業でタグの位置を括弧の外へ移動させなければ
なりません。こういった例は他にも

【例2】田中はこう言った。「はい?」その時、・・・

とか

【例3】田中はこう言った。「はい!」その時、・・・

のように、一つの文が“。”で終わらないものなども出てくる可能性が
あります。そこで今回の質問は、こういった一つの文とみなす単位の
条件を同時にいくつか与えてマクロを実行するためには、どうすれば
いいのかということです。もしそれが可能であれば、マクロ実行後の
手作業の修正箇所をできるだけ少なくすることができると思います。
2つ以上の条件を同時に充たすようなソースがあれば、後で私の方で、
各テキストに合わせて条件を追加できると思います。
それは可能でしょうか。

[ ]
RE:04202 自動一括タグ付け&修正処理No.04212
pinecone さん 04/03/24 23:34
 
Majimaさん、はじめまして。pineconeといいます。
山紫水明さんのマクロにて、すでに解決済みかもしれませんが、
ブラウザ(IE5.5以上)にて一括処理できるものを作ってみました。

# ENCODINGSHIFTJISさんのいうXML技術は使用していません。
# ゴリゴリと1行ずつ処理を行っています。 (T_T)

秀丸マクロではなくてHTMLファイルであり、かつ、この会議室の趣旨に反しているため
この場に記述するのはやめておきます。

もし、必要であれば下記メール宛にご連絡いただけると幸いです。
xxxxxxxx@mtb.biglobe.ne.jp
よろしくお願いいたします。

[ ]
RE:04212 自動一括タグ付け&修正処理No.04216
ENCODINGSHIFTJIS さん 04/03/25 16:00
 
もう一つ別の考え方。 YAML 的発想では
階層をアウトライン(空白字下げ)で表現して
テキストを構成した後、タグ付け&階層番号付けする、のもあります。

HHHHHHHHHHHHHHHH
-p
--ssssssssssssssssssss
--ssssssssssssss
--ssss
-p
--ssss
-p
--ssssss
--sssssssss

HHHHHHHHHHH
以下同様。まあ、埋め込みタグの読み取りも慣れれば、
どうということはないですが。

[ ]
RE:04211 『連番自動割り振りマクロ』の改No.04218
山紫水明 さん 04/03/25 23:35
 
 Majimaさん,こんばんは。

 あらゆる場合に対応することは多分無理かもしれませんが,例示された課題に
対しては,次のようにすれば対応できるでしょう。

SID:サブルーチンを以下のようにする。
-----------------------------------
#line = lineno;
while( 1 ) {
    insert "<s id=" + str(#body) + "." + str(#div) + ".p"
            + str(#pid) + ".s"  + str(#sid) + ">";
    searchdown "[。!?]」?", regular;
    if ( !result ) endmacro;
    if( lineno > #line ) {
        golinetop2;
        break;
    }
    moveto selendx, selendy;
    if( code == 0x0d ) {
        insert "</s></p>";
        movetolineno 1, lineno + 1;
        break;
    } else insert "</s>";
    #sid = #sid + 1;
}
return;
-----------------------------------
7行目
call GetID;
の直後に
call ChangeSearchMode;
を追加。

40行目
endmacro;
の直前に
RestoreSearchMode:
を追加

GetID:サブルーチンにある
call ChangeSearchMode;

RestoreSearchMode:
を削除する。

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

[ ]
RE:04218 『連番自動割り振りマクロ』の改No.04219
Majima さん 04/03/26 18:22
 
山紫水明さん

またまたありがとうございます。現在パタパタしてまして、自分の
コンピューターの前に座っている時間がないので、とりあえず感謝の
お返事だけしておきます。一応私の希望の動きにできるだけ近づける
ことができそうなので、ほっとしています。でも実際に動かしてみないと
わかりませんよね。動かしてみてまた報告差し上げます。


[ ]
RE:04216 自動一括タグ付け&修正処理No.04220
Majima さん 04/03/26 18:33
 
ENCODINGSHIFTJISさん

ありがとうございます。またまた「YAML的発想」など、私の未知の
世界ですが、いろいろな方法があるということは、いろいろな作業で
応用して使えそうですね。でもこの案では、テキストに事前に手を
加えるということになりますよね。テキストを入力しながらその作業
をするのも大変ですし、入力済みのテキストに改行を加えていく加工
をする段階でも文脈を把握しながら作業をしないと、後で大変なこと
になりそうですね。すみません。分かったようなこと言ってしまって。

今回の私の作業の内容上、予想不可能な文例が出てくる可能性大で
ありますし、いろんなジャンルのテキストを作業することを考えた
上で自動処理システムを組む必要がありますよね。これからも色々と
勉強させていただきます。

[ ]
RE:04220 自動一括タグ付け&修正処理No.04227
encodingshiftjis さん 04/03/27 21:08
 
歴史的には YAML が先で XML(SGML) が後です。

アウトライン・エディタを使い、平たいテキストを
アウトライン付けするのは、昔から多種あります。
MS-Wordなどのワープロにも(昔から)組込みで入っています。(日本人はほとんど
使っていませんが)

XMLは(やっぱり)読みにくく、コンパクト構文などと言う
のを開発していまう例も出てきました。XMLブームのゆり戻し。
XMLSchemaに対してとか、RELAX、VoiceML(ABNFと併記)
(読みにくいと仕事になりませんし)

最終形に近いほど作業が簡単かというと、そうでもないことも
あります。
テキスト処理は歴史が長く、各種の薀蓄もあるのでいろいろな
ものを試してみましょう。

[ ]
RE:04218 山紫水明さん改良マクロ動かしまNo.04230
Majima さん 04/03/28 00:35
 
山紫水明さん

改良型のマクロ動かしてみました。私の希望通りの動きをします。
本当に有難うございました。山紫水明さんのおっしゃるように、
全ての条件に対応させるのは無理というか、あまりにそこの方面へ
こだわり過ぎても結果的にあんまり意味の無いことにもなりかねない
かもしれないので、テキストの内容を見ながらそのテキストに合った
条件に書き変えながら作業をしていきたいと思います。

一回の作業で100パーセント完璧な結果に仕上げるのが目的では
なく、作業の効率を上げる目的にマクロの改良をお願いしたわけで、
これからの作業に十分対応できると思います。実際の条件はもっと
複雑で、文脈を確認しながら文を区切らないといけない部分もあり、
とにかくいろんなアイディアを総動員しないと、うまく機械化が
出来ない作業でもあります。

でもこのマクロ、自分の力でここまで作ろうとすれば、一体いつに
なっていたことやら・・・。1年後?3年後?コンピューターで
何が出来て、何が出来ないということが、なんとなく分かってきた
感じがしてきているので、これからはコンピューターで出来そうな
ことをいかにして実現するかという技術的なことをもっと勉強したい
です。文系の者にはこれからしんどい道のりですね。

でも私の場合はあまり知識が無い分、「とにかくマクロを動かして
みて、ソースを見ながらその動きを観察する」というタイプです。
これからも優秀なマクロ作者の方々の技を、一つ一つ自分のものに
していきたいと思います。夢はこのフォーラムで他の人の質問に
答えられるぐらいにマクロが上手になることです。夢のまた夢。

[ ]
RE:04227 自動一括タグ付け&修正処理No.04231
Majima さん 04/03/28 00:46
 
encodingshiftjisさん

>テキスト処理は歴史が長く、各種の薀蓄もあるのでいろいろな
>ものを試してみましょう。

そうですね。色々試してみないと分かりませんからね。私は
テキスト処理に関してすごく興味があります。あるテキストを
目的の体裁に整える作業をする際に、まずあれをやって、それから
これをやって・・・と考えている時は血が騒ぎます。そして目標の
結果に加工した時の達成感はたまりません。今まではキーボード
マクロで可能な範囲のテキスト処理をしてきましたが、これからは
さらに複雑な処理をするために、勉強することが山のようにありますね。

[ ]