括弧の深さを見分ける方法No.23801
IKKI さん 07/10/13 17:21
 
IKKI です。こんにちは。

> >Aの場合においても、『ああああ』の部分を甲種、『いいいい』の部分を乙種にす
> >ることはできませんでしょうか?
>
>  entakaさん、こんにちは。おっしゃる通りですね。私もentakaさんと同じ希望で
>す。

そう来ると思いました。(^^;

現在の秀丸の正規表現+強調表示の仕組みではこれ以上のことは難しいです。
場当たり的な工夫はできてもスマートには行かないでしょう。

3つの解決策があります。

(1) 強調表示にコンテキスト指定みたいな機能を付けてもらう

強調文字列ごとに「普通の文字の上でのみ有効」「強調表示1の上でのみ有効」
という具合に適用個所を限定できれば、希望の動作が実現できます。
秀丸担当さんにお願いしてみましょう。

(2) カラーマーカーを使う

強調表示ではなくカラーマーカーを使えば任意の色づけが可能です。
例えばこんなマクロで。

// Marker_nest.mac
#backcolor[1] = 0xC080FF;  #textcolor[1] = 0x000000;
#backcolor[2] = 0x00A0FF;  #textcolor[2] = 0x000000;
#backcolor[3] = 0x00FFFF;  #textcolor[3] = 0x000000;
#backcolor[4] = 0x00FFA0;  #textcolor[4] = 0x000000;
#backcolor[5] = 0xFFD070;  #textcolor[5] = 0x000000;
searchdown2 "[()]", regular;
while (result) {
 if (code == '(') {
  ##nest = ##nest + 1;
  beginsel;  gokakko;  right;
  colormarker #textcolor[##nest], #backcolor[##nest], 11, 0;
  moveto seltopx, seltopy;  escape;  right;
 } else {
  ##nest = ##nest - 1;
 }
 finddown;
}

(3) インデントで表現する

お二人の目的は法律文のようなものを間違いなく読むことかと思います。
要は括弧の深さが視覚的にわかればいいのなら、色分けにこだわらず
字下げで表現してもいいのではないでしょうか。例えばこんなマクロで。

$indent = "     ";
searchdown2 "[()]", regular;
while (result) {
 if (code == '(') {
  ##nest = ##nest + 1;
  escape;  right;
 } else {
  ##nest = ##nest - 1;
  escape;
 }
 insert "\n" + leftstr($indent, ##nest * 2);
 finddown;
}

▼使用前
第三十七条の二十七  この節の規定は、〜中略〜無線設備及び関連情報送出装置
(関連情報(高精細度テレビジョン放送(デジタル放送を除く。)に関する送信の標
準方式(平成三年郵政省令第十六号。以下「高精細度テレビジョン放送(デジタル放
送を除く。)の標準方式」という。)第十八条第一項第三号に規定する関連情報をい
う。)を送出する装置をいう。)から送信空中線までの範囲(中継線及び連絡線を除
く。)の無線設備に適用があるものとする。

▼使用後
第三十七条の二十七  この節の規定は、〜中略〜無線設備及び関連情報送出装置(
 関連情報(
  高精細度テレビジョン放送(
   デジタル放送を除く。
  )に関する送信の標準方式(
   平成三年郵政省令第十六号。以下「高精細度テレビジョン放送(
    デジタル放送を除く。
   )の標準方式」という。
  )第十八条第一項第三号に規定する関連情報をいう。
 )を送出する装置をいう。
)から送信空中線までの範囲(
 中継線及び連絡線を除く。
)の無線設備に適用があるものとする。


[ ]
RE:23801 括弧の深さを見分ける方法No.23804
hiro41 さん 07/10/14 11:18
 
 IKKIさん、こんにちは。

>そう来ると思いました。(^^;

 はは、予想通りでしたか。

>(1) 強調表示にコンテキスト指定みたいな機能を付けてもらう

 なるほど、やはりそういう機能がないと難しいのですね。

>(2) カラーマーカーを使う

 スマートなマクロですね。感動しました。ただ、私が利用したい790Kくらいのテキ
ストファイルでは、毎回のマクロ実行時間がもどかしいですね。更にマクロ実行中、
20K分くらいの内容をマーカー処理後、以降のマーカーが真っ黒になってしまいまし
た。私のPCの能力の問題かもしれませんが。

>(3) インデントで表現する
>お二人の目的は法律文のようなものを間違いなく読むことかと思います。

 ご賢察のとおりです。特に税法なのですが、法人税法などはテキストファイルが79
0Kにもなります。

>要は括弧の深さが視覚的にわかればいいのなら、色分けにこだわらず
>字下げで表現してもいいのではないでしょうか。

 そうですね。私は法律条文の読み方として、まづカッコを飛ばして読み基本ライン
を理解した上で、カッコ内の「除く文」「限る文」などをネスト層の浅い順に理解し
ていくという方法をしています。
 そのような方法の場合、カッコを飛ばして読むのに、色付けでカッコ以外が視覚的
に浮き出て見える、ネスト第1層が浮き出て見える、またスクロールが少なくてすむ
強調表示のような方法が好ましいです。私の個人的な嗜好かもしれませんが。

 とすると、私としては(1)がベストということになります。秀丸担当さんなにと
ぞよろしくお願いいたします。

 ただ、前のスレッドで書いたことですが、強調表示で大きなファイルをスクロール
すると途中で停まってしまう問題があるので、その解決もしなくては。

> スクロールを続けていると、停まってしまいます。その時CPU負荷は>50〜70%で
>す。強調表示は20種類くらいで、テキストファイルの大き
>さは790Kくらいです。CPUはP4の2.8G、メモリーは512Mなのですが。


 誤解のないよう申し上げておきますが、いろいろアドバイスを下さったIKKIさんに
は大変感謝しております。率直な感想がお気にさわれば申し訳ありません。今後とも
よろしくお願いします。




[ ]
RE:23804 括弧の深さを見分ける方法No.23805
IKKI さん 07/10/14 13:09
 
IKKI です。こんにちは。

> >(2) カラーマーカーを使う
>
>  スマートなマクロですね。感動しました。ただ、私が利用したい790Kくらいのテキ
> ストファイルでは、毎回のマクロ実行時間がもどかしいですね。更にマクロ実行中、
> 20K分くらいの内容をマーカー処理後、以降のマーカーが真っ黒になってしまいまし
> た。私のPCの能力の問題かもしれませんが。

http://www.houko.com/00/01/S40/034.HTM で試してみました。
原文に多数の間違いが含まれていて、括弧が一対一に対応していないようです。
例:
> 第48条 《前略》前日(災害その他やむを得ない事由により同日までに前条第1
>項」に指定した日)までの期間」を「指定した日(第6項及び第8項において「指
>定日」という。)とする。)までの期間に規定する代替資産を取得することが困難
>である場合には、政令で定めるところにより納税他の所轄税務署長が指定した日)
>までの期間内に《後略》

原文の間違いにマクロがどこまで責任を持つべきかという問題はありますが、
とりあえず次のようにしてみてはどうでしょう。
うちのマシンでは 523KB を 6.3 秒で処理しました。

 ・画面描画を止めて高速化
 ・行頭は常にレベル0であると仮定
  (原文が間違っていても、その影響を次行以降に持ち越さない)
 ・範囲選択時は選択範囲内のみ、無選択時はカーソル位置から文書末まで処理

// Marker_nest_in_line.mac
#backcolor[1] = 0xC080FF;  #textcolor[1] = 0x000000;
#backcolor[2] = 0x00A0FF;  #textcolor[2] = 0x000000;
#backcolor[3] = 0x00FFFF;  #textcolor[3] = 0x000000;
#backcolor[4] = 0x00FFA0;  #textcolor[4] = 0x000000;
#backcolor[5] = 0xFFD070;  #textcolor[5] = 0x000000;
##starttime = tickcount;
disabledraw;
if (selecting) {
 ##endl = selendlineno;
 moveto seltopx, seltopy;
 escape;
} else {
 #endl = linecount2;
}
searchdown2 "[()]|$", regular;
while (result && lineno <= ##endl) {
 if (code == '\n') {
  ##diff = -##nest;
 } else if (code == '(') {
  ##diff = 1;
 } else {
  ##diff = -1;
 }
 if (##diff < 0) right;
 if (##nest > 0) {
  colormarker #textcolor[##nest], #backcolor[##nest], 11, 0;
 }
 ##nest = ##nest + ##diff;
 if (##nest < 0) ##nest = 0;
 if (##nest > 5) ##nest = 5;
 beginsel;
 if (##diff > 0) right;
 finddown2;
}
escape;
enabledraw;
message str(tickcount - ##starttime) + " ミリ秒";


> >(3) インデントで表現する
>
>  そうですね。私は法律条文の読み方として、まづカッコを飛ばして読み基本ライン
> を理解した上で、カッコ内の「除く文」「限る文」などをネスト層の浅い順に理解し
> ていくという方法をしています。

インデントで表現すると、秀丸エディタの折りたたみ機能が使えます。
もしご存じでなかったら試してみては。

▼第0層まで表示
第三十七条の二十七  この節の規定は、〜中略〜無線設備及び関連情報送出装置(
)から送信空中線までの範囲(
)の無線設備に適用があるものとする。

▼第1層まで表示
第三十七条の二十七  この節の規定は、〜中略〜無線設備及び関連情報送出装置(
 関連情報(
 )を送出する装置をいう。
)から送信空中線までの範囲(
 中継線及び連絡線を除く。
)の無線設備に適用があるものとする。

▼第2層まで表示
第三十七条の二十七  この節の規定は、〜中略〜無線設備及び関連情報送出装置(
 関連情報(
  高精細度テレビジョン放送(
  )に関する送信の標準方式(
  )第十八条第一項第三号に規定する関連情報をいう。
 )を送出する装置をいう。
)から送信空中線までの範囲(
 中継線及び連絡線を除く。
)の無線設備に適用があるものとする。


>  誤解のないよう申し上げておきますが、いろいろアドバイスを下さったIKKIさんに
> は大変感謝しております。率直な感想がお気にさわれば申し訳ありません。今後とも
> よろしくお願いします。

とんでもない。こちらこそ一ユーザの立場で差し出がましいかと思いますが、
お役に立っていれば幸いです。

[ ]
RE:23805 括弧の深さを見分ける方法No.23808
秀丸担当 さん 07/10/15 11:39
 

>(1) 強調表示にコンテキスト指定みたいな機能を付けてもらう

これはあったら用途が広がると思います。
できるかどうかはわからないですが、ネタとして参考にさせていただきます。

>(2) カラーマーカーを使う

IKKIさんのマクロはいいですね。
描画を抑えたことで十分実用的なのではないでしょうか。

[ ]
RE:23805 括弧の深さを見分ける方法No.23812
entaka さん 07/10/15 18:26
 
IKKI さん。こんにちは。

いろいろありがとうございました。
カラーマーカーのマクロは今後も重宝させていただきます。
秀丸で「強調表示にコンテキスト指定機能」対応する(?)までの間は、このマクロ
で十分にやっていけそうです。

[ ]
RE:23805 括弧の深さを見分ける方法No.23815
hiro41 さん 07/10/16 10:06
 
 IKKIさん、こんにちは。

 カラーマーカーのマクロはすばらしいですね。選択範囲に指定できるので使いやす
いです。

>インデントで表現すると、秀丸エディタの折りたたみ機能が使えます。
>もしご存じでなかったら試してみては。

 全く知りませんでした。こういう便利機能もあるんですね。ありがとうございまし
た。

[ ]
RE:23805 括弧の深さを見分ける方法No.23822
IKKI さん 07/10/17 12:06
 
IKKI です。こんにちは。

お2人の問題はすでに解決されたようですが、頭の体操がてらに
こんなマクロを作ってみましたので宣伝しておきます。

Popnote ◆ 括弧書きを脚注に変換&多段ポップアップ表示
http://www18.big.or.jp/~fujiwara/ikki/hidemaru/popnote/

汎用の脚注作成マクロとして作ったので、法律文に適用するには
もう少し工夫が必要かもしれません。
何かのお役に立てれば幸いです。

[ ]