Re: 2ページにまたがる文字のカラー出力

名前: nide
日時: 2003-01-20 01:45:04
IPアドレス: 160.11.72.*

>>15373 有用な機能をありがとうございます。 > 5. dvidvi などのようなことも、容易にできると思いますが、他の用途は? 他の用途といっても、具体的にこれこれができるようになるという ことよりも、うれしいのはやはり、前にも書いたように、dviをいじる必要が 出た場合(例えばdvispcのcolor special調整の必要に迫られたような場合)に、 それが気軽に書ける点でしょうか。 せっかくなので、dvidviに相当するものをawk+dvispcを使って書いて みました。下記のスクリプトがdvidvi.awkだとして、 dvispc -a sample.dvi | awk -f dvidvi.awk で、1ページずつout1.dvi out2.dvi …に分解してくれます。 サンプル実装なので、まだ1ページずつに分解することしかできません。 実のところ、本物のdvidviで分解に失敗するけれど、 これだとうまくいく具体的なケースを見つけてしまいました。 どういう場合にそうなるのかまではまだ検証してません(大変そう)。 (ちょっと長いです。スクリプト65行) ------------------------------------------------------------------------ NR == 1{ # pre命令は変数preへ pre = $0 # pre = $1 " " $2 " " $3 " " $4 " " $5 " 13 'dvidvi output'" } /^post\y/, /^post_post\y/{ # post, post_post命令は同名の変数へ if(/^post\y/){ post = $0 } else if(/^post_post\y/){ post_post = $0 } else { # postamble部のfnt_defは配列fntdefへ fntdef[$2] = $0 } } /^ \[[0-9]+\]/{ # ページ先頭の「 [ページ数]」 pagecnt++ } /^bop\y/, /^eop\y/{ # bopからeopまで if(/^bop\y/) $2 = 1 # adjust pageno page[pagecnt, ++pagel[pagecnt]] = $0 } END{ for(i = 1; i <= pagecnt; i++){ # 各ページを個別に出力 cmd = "dvispc -x out" i ".dvi" # 出力先はdvispc -xへのパイプ # cmd = "cat > out" i ".dt" print pre | cmd # 共通のpreを出力 print " [1]" | cmd print page[i, 1] | cmd # bop print "push" | cmd # なぜかpush… maxdepth = depth = 0 # stack depthを計るため for(j in page_fntdef) delete page_fntdef[j] # そのページに使われているfnt_defの定義を記録する配列を空に for(j = 2; j <= pagel[i] - 1; j++){ # bopとeopの間の各命令 l = s = page[i, j] if(sub(/^(fntnum|fnt[1-4])/, "", s)){ $0 = s if(!($1 in page_fntdef)) # 先行fnt_defが要る場合 print fntdef[$1] | cmd page_fntdef[$1] } else if(l ~ /^fntdef/){ $0 = l; page_fntdef[$2] } else if(l ~ /^push\y/){ if(maxdepth < ++depth) maxdepth = depth } else if(l ~ /^pop\y/){ --depth } print l | cmd } print "pop" | cmd # bopの次位に加えたpushと対 print page[i, pagel[i]] | cmd # eop $0 = post; $8 = maxdepth; $9 = 1 print $0 | cmd # stack depthとpage countを調整したpost for(j in page_fntdef) print fntdef[j] | cmd # 実際にあったfnt_defをpostambleにも出力 print post_post | cmd # post_post close(cmd) } }

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)