fontforge をつかって Adobe Reader 付属の小塚明朝の異体字情報をみる。 ○実験室1、2につかう cid をしらべるために、つぎのようにするのも、ひとつのてだてとなる。 1.fontforge で sfd ファイルをつくる - z.pe -------------------------------------------------- #!/usr/bin/fontforge Open("KozMinProVI-Regular.otf"); Save("KozMinProVI-Regular.sfd"); Quit(0); - z.pe -------------------------------------------------- fontforge -script z.pe 2.できた sfd ファイルのなかから、いるものだけをぬきだして、うまくまとめる。 - z.pl -------------------------------------------------- #!/usr/bin/perl use strict; my ($ucd, $cid, $kanji, %dtb, %ctb, $alt, %alts, $key, $val); while(<>) { if (m/^StartChar:/) { ($ucd) = m/un?i?([\dA-Z]+)/; } elsif (m/^Encoding:/) { ($cid) = m/:\s+(\d+)/; $ctb{"0x$ucd"} = $cid; $kanji = (&kanji($cid) and !defined $dtb{"c$cid"} and !defined $dtb{"u$ucd"}) ? 1 : 0; } elsif (m/^EndChar/) { $alts{"$cid 0x$ucd"} = $alt if ($kanji and $alt); undef $alt; } elsif ($kanji) { if (m/^Substitution2:/ or m/^AlternateSubs2:/) { my @w = m/(\S+)/g; my $it; foreach my $w (@w) { if (($it) = $w =~ m/un?i?([\dA-F]+)/) { $dtb{"u$it"} = 1; $alt .= "0x$it " if ($alt !~ m/\b0x$it\b/); } elsif (($it) = $w =~ m/Japan1\.([\d]+)/) { $dtb{"c$it"} = 1; $alt .= "$it " if ($alt !~ m/\b$it\b/); } } } } } while (($key, $val) = each %alts) { my @alts = split(/\s/, $val); foreach my $alt (@alts) { if ($alt =~ m/^0x/) { $alt = (&kanji($ctb{$alt})) ? "$ctb{$alt}-$alt" : ''; } else { $alt = '' unless (&kanji($alt)); } } @alts = grep (m/\S/, sort {($a + 0) <=> ($b + 0)} @alts); if (@alts) { print "$key : "; foreach my $alt (@alts) { print "$alt "; } print "\n"; } } sub kanji { my ($cid) = @_; return 1 if ($cid >= 1125 and $cid <= 7477); return 1 if ($cid >= 7633 and $cid <= 7886); return 1 if ($cid >= 7961 and $cid <= 8004); return 1 if ($cid >= 8266 and $cid <= 8267); return 1 if ($cid >= 8284 and $cid <= 8285); return 1 if ($cid >= 8359 and $cid <= 8717); return 1 if ($cid >= 13320 and $cid <= 15443); return 1 if ($cid >= 16779 and $cid <= 20316); return 1 if ($cid >= 21071 and $cid <= 23057); return 0; } - z.pl -------------------------------------------------- z.pl < KozMinProVI-Regular.sfd | sort -g > z.dat 3.platex と dvipdfmx で、きれい?なPDF文書にする(要開発版 otf パッケージ) - z.pl -------------------------------------------------- #!/usr/local/bin/perl use strict; my ($cid, $ucd, $data, $no); print '\documentclass[a4j]{jbook}' . "\n"; print '\usepackage{otf}' . "\n"; print '\def\BT#1{\\kern-1zw\\hbox to 1zw{{\hfill\tiny\texttt{#1}}}}' . "\n"; print '\def\LA#1{\\raisebox{-0.25zw}{#1}}' . "\n"; print '\def\LB#1{\\raisebox{-0.40zw}{#1}}' . "\n"; print '\begin{document}' . "\n"; print '\\Huge' . "\n"; while (<>) { if (($cid, $ucd, $data) = m/^(\d+)\s+(\S+)\s+:\s+(.+)\s*$/) { $no++; print "\\leavevmode\\hbox to 1zw{\\hfill\\tiny $no~} "; print "\\CID{$cid}\\LA{\\BT{$cid}}\\LB{\\BT{$ucd}} "; my @it = split(/\s+/, $data); foreach my $it (@it) { ($cid) = $it =~ m/(\d+)/; ($ucd) = $it =~ m/(0x\S+)/; print "\\CID{$cid}\\LA{\\BT{$cid}}\\LB{\\BT{$ucd}} "; } print "\n\n"; } } print '\end{document}' . "\n"; - z.pl -------------------------------------------------- z.pl < z.dat > z.tex platex z.tex dvipdfmx -f z.map z.dvi      (z.map はKozMinProVI-Regular.otf 用につくる。たとえばつぎのように。) - z.map -------------------------------------------------- otf-ujmr-h UniJIS-UTF16-H KozMinProVI-Regular.otf otf-ujmr-v Identity-V KozMinProVI-Regular.otf otf-cjmr-h Identity-H KozMinProVI-Regular.otf otf-cjmr-v Identity-V KozMinProVI-Regular.otf - z.map -------------------------------------------------- ○参考 vine linux でつくった z.pdf をつぎのところにおいておく。  http://tosyokan.my.coocan.jp/z.pdf ・バグがあったら、なおしてつかってほしい。 ・ほかに opentype font をもっているなら、それもしらべてみるがよい。 ・sfd ファイルには 'trad' 'expt' 'jp78' 'jp83' などの文字もみえる。  これらもとりこんで、よりくわしくすることもできそう? ・'0x' ばかりとなって unicode がでないときは、fontforge に cidmap (Adobe-*.cidmap) がみえていない。  (1文字めがそうなるのは、ただのてぬきである) ・fontforge は 2008/12/15 版をつかった。 ・つぎのようにすれば 'nlck'(または 'jp04')タグの異体字情報だけぬきだせる。 --- 2009/01/31 ---  2.の z.pl について   A.   >>my ($ucd, $cid, $kanji, %dtb, %ctb, $alt, %alts, $key, $val, $lup);        と $lup をつけくわえる。   B.   >> } elsif (m/^Lookup:.+'nlck'/) { ### または 'nlck' ==> 'jp04'   >> ($lup) = m/(lookup\s+\d+\s+subtable)/;        この二行を   >> } elsif ($kanji) {        の行のすぐまえにつけくわえる。   C.   >> if (m/^Substitution2:/ or m/^AlternateSubs2:/) {        この行のかわりに   >> if ((m/^Substitution2:/ or m/^AlternateSubs2:/) and $lup and m/$lup/o) {        とする。   いろいろ無駄になる処理がでてくるが気にしない。   $lup を 無理やり 'expt'、'trad'、'jp83'、'jp78' などにかきかえてやれば、それだけぬきだせる? ・各タグ情報を表示できるようにしてみた。 --- 2010/09/15 ---  手順  http://www.mediafire.com/?m355duzb73w9o33 から z.zip をとる。  z.zip を一時ディレクリに展開、KozMinProVI-Regular.otf を同ディレクリにもってきて、 fontforge -script z.pe z.pl < KozMinProVI-Regular.sfd | sort -g > z.dat z2.pl < z.dat > z.tex platex z.tex dvipdfmx -f z.map z.dvi  unicode がうまくでないときは Adobe-Japan1-6.cidmap を /usr/local/share/fontforge にいれてみよ。  添付の koz.pdf は FreeBSD6.4, fontforge(20080824) でつくったもの。 2009/01/11作成 2009/01/31加筆 2010/09/15加筆 2024/05/27 Z.pdfの ありかを かえる