日本語テキストに隣接しているASCIIの括弧を探すRubyスクリプト

数学ガール・ミルカさんとテトラちゃん』という本を書いています。数式がたくさん出てくる読み物なのでLaTeXで書いているのですが、数式部分の括弧はASCIIで書き、テキスト本文中の括弧はいわゆる全角で書きました。書き上がってからテキスト部分にASCIIの括弧が混在していないかどうかを調べようと思い、Rubyスクリプトを作りました。

# find_paren.rb - Shift_JISの日本語テキストファイル中で、
# 日本語に接しているASCIIの括弧を探すスクリプト。
# EUC-jpに変換した後、括弧の前後に、
# 最上位ビットが立っている一バイトが存在するかを調べている。

require 'iconv'

if ARGV.length == 0
  puts "Usage: find_paren.rb filename..."
  exit
end

ARGV.each do |filename|
  open(filename, "r") do |f|
    line_number = 0
    while line = f.gets
      line.chomp!
      line_number += 1
      eucline = Iconv.new('EUC-jp', 'Shift_JIS').iconv(line)
      if /(.)\)/.match(eucline) or /\((.)/.match(eucline)
        c = $1
        if (0x80 & c[0]) != 0
          puts "#{filename}(#{line_number}):#{line}\n"
        end
      end
    end
  end
end
__END__

たとえば以下のようなファイルsample.texがあったとします。

\par
「はい、すっきりしました。話の途中ですみません。
あたし、いつも、使っている文字が気になって……でも、
$(a - b)^2 \geq 0$
については納得しました」

\par
テトラちゃんは、にこっと笑ってから目を輝かせ、(それで、次は?)という顔をする。
なかなか表情が豊かな女の子だ。

find_paren.rbの実行結果は以下の通り。

> ruby find_paren.rb sample.tex
sample.tex(8):テトラちゃんは、にこっと笑ってから目を輝かせ、(それで、次は?)という顔をする。

以下、ポイント。

  • 数式のほうの括弧はスルーして、本文中の括弧だけをタグジャンプ形式でピックアップしている。
  • Ruby文字コードを得る方法が分からなくて苦労した(ordを探していた)。
  • Rubyで0が偽でないことを忘れていて悩んだ(!= 0を書かずに括弧がある行すべてが表示された)。
  • テトラちゃんは可愛い。
  • 『数学ガール・ミルカさんとテトラちゃん』

追記:
なかださんからコメント。感謝。[あとで試す]

if /(?![^\0-\x7e]).\)|\((?![^\0-\x7e])./s =~ lineならiconvは不要ですが、せめてIconv.convを使うかIconv.newをループの外に出したほうがいいです。