名前: 本田 日時: 2007-05-27 11:05:31 IPアドレス: 220.147.90.*
>>48118 >なく動作しています。ただ、行ごとに処理されているので、途中で改行が入ると 引数には改行を入れないほうが いろいろな意味で無難だとは思います. もっとも,すぐ変更できますし, コーディング上の規約は設けない方が絶対にいいので 変更しておきました. 行単位ではなく, 「TeXでの段落」単位,つまり空白行で区切られた範囲での 読み込みにしています. これにともなって,引数の取得の正規表現を変えて また,サブルーチンの外に追い出しました. ついでに,どれくらい影響があるかは計測してないですけど 一応,キャッシュをつけて 「一番速い」はずのfind_encodingを使ってます. #ほとんど個人的な実験と趣味が入ってますが(^^;,そこはご寛容を. 制限としては,マクロやアクセントつき文字.いわゆる「機種依存文字」は 一切考慮していません. TeX式の \"u のような記述は不適切な結果となると思いますが, wikipediaの仕様にしたがって適宜置換してください. use strict; use warnings; use utf8; use Encode; my $reg_for_letter=qr<([^\w ])>; my $reg_for_term=qr<\\wikipedia\{( (?:[^}]|\n)+ )\}>x; my $enc=find_encoding('utf8'); { my %cache; sub hyperTeXWikipediahref{ my $word = shift; $word =~ s/\n//g; unless ($cache{$word}){ my $URLencoded = $enc->encode($word); $URLencoded =~s<$reg_for_letter><"%" . unpack('H2', $1)>egx; $URLencoded=uc $URLencoded; $cache{$word} = '\href{http://ja.wikipedia.org/wiki/' . $URLencoded .'}{' . "$word" . '}'; } return $cache{$word}; } } open my $in, "<:encoding(cp932)", $ARGV[0] ; ## cp932は適当に変える open my $out, ">:encoding(cp932)", $ARGV[1] ; ## cp932は適当に変える { local $/="\n\n"; while (my $line = <$in>){ $line =~ s<$reg_for_term><hyperTeXWikipediahref($1)>eg ; print $out $line; } } >すべてをTeXに実装するというのではなく、iconvなど外部ライブラリを呼び出し オンデマンドで処理する(shell escapeを使う)と・・・ TeXからshell escapeで何を呼び出した場合, TeXはたぶん待ってるんですよね。 けど,個数が多くなるとオーバヘッドがすごくなりそうです. やるなら,対象語句を索引や相互参照のように外部に吐き出して, それを処理して,次のコンパイルで読み込ませるのが現実的かと思います. 相互参照と索引を合体させたような処理をさせればよいのでしょうね.
この書き込みへの返事: