my $slightly_forbidden_before
= '\x{000a}\#\-‐−‰′″℃゛゜ゝゞヽヾ"%-゙゚';
-my $asian = '\x{1100}-\x{11FF}\x{2E80}-\x{D7AF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}\x{FF00}-\x{FFFFFF}';
+my $asian = '\x{1100}-\x{11FF}\x{2E80}-\x{D7AF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE4F}\x{FF00}-\x{FFFFFF}'; # need to fix.
my $space = '\x{0020}\x{0009}\x{000A}\x{000C}\x{000D}';
while(<>){
utf8::decode($_);
+
if($in_cs ne 'ucs@mcs'){
s/(.)/&get_char_in_mcs($1,$in_cs)/ge;
}
+ s/([$asian])\s+([$asian])/$1$2/g unless($out_cs eq 'UniKS');
+ s/([$asian])\s*([^$asian])/$1 $2/g;
+ s/([^$asian])\s*([$asian])/$1 $2/g;
+ s/\-\-\-/pack("U",0x2014)/geo;# EM DASH
+ s/\-\-/pack("U",0x2013)/geo;# EN DASH
+ s/\`\`/pack("U",0x201f)/geo;# DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ s/\`/pack("U",0x201b)/geo;# SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ s/\'\'/pack("U",0x201d)/geo;# RIGHT DOUBLE QUOTATION MARK
+ s/\'/pack("U",0x2019)/geo;# RIGHT DOUBLE QUOTATION MARK
s/(amp.+?;)/&de_tex_er($1)/ge;
# s/(&.+?;)/&de_tex_er($1)/ge;
@chars=split(//);
$char_id=unpack("U",$char);
if($char_id<=0x20){
- print $chars[$i];
+ # add quarter space between asian and non-asian.
+ if($i>0 and $i<$#chars){
+ if(($chars[$i-1]=~/[$asian]/
+ and $chars[$i+1]=~/[^$asian]/
+ and $chars[$i+1]=~/[$strictly_forbidden_before$slightly_forbidden_before]/)
+ or($chars[$i-1]=~/[^$asian]/
+ and $chars[$i+1]=~/[$asian]/
+ and $chars[$i-1]=~/[$strictly_forbidden_after$slightly_forbidden_after]/)
+ ){
+ print '';
+ }elsif(($chars[$i-1]=~/[$asian]/
+ and $chars[$i+1]=~/[^$asian]/)
+ or($chars[$i-1]=~/[^$asian]/
+ and $chars[$i+1]=~/[$asian]/)){
+ print '{\selectjisfont\hspace{.25ex}}';
+ }else{
+ print ' ';
+ }
+ }
next CHAR;
}elsif($char=~m/($tex_meta_re)/o){
print $tex_meta{$1};
next CHAR;
- }elsif($char_id>0x20 and $char_id<=0x02af){
- # Basic Latin
- # Latin-1 Supplement
- # Latin Extended-A
- # Latin Extended-B
- # IPA Extensions
+ }elsif(($char_id>0x20 and $char_id<=0x021f)
+ # Basic Latin
+ # Latin-1 Supplement
+ # Latin Extended-A
+ # Latin Extended-B (not all)
+ or($char_id>=0x0250 and $char_id<=0x02af)
+ # IPA Extensions
+ or($char_id>=0x0300 and $char_id<=0x033f)
+ or($char_id>=0x0360 and $char_id<=0x036f)
+ # Combining Diacritical Marks
+ or($char_id>=0x1e00 and $char_id<=0x1eff)
+ # Latin Extended Additional
+ or($char_id>=0x0370 and $char_id<=0x03ff)
+ # Greek and Coptic
+ or($char_id>=0x0400 and $char_id<=0x04ff)
+ # Cyrillic
+ or($char_id>=0x0530 and $char_id<=0x058f)
+ # Armenian
+ or($char_id>=0x2010 and $char_id<=0x2046)
+ # General Punctuation (partial)
+ ){
print &latin_parse();
next CHAR;
}elsif($char_id>=0x2ff0 and $char_id<=0x2fff){
if($i<($#chars-1)){
if(($chars[$i+1]=~m/[$strictly_forbidden_before]/o)
and($chars[$i+2]=~m/[$strictly_forbidden_before]/o)){
- return "\\CJKunbreakablekernone ";
+ return "\\CJKunbreakablekernone{}";
}elsif($opt_protrude){
if(($chars[$i+1]=~m/[$strictly_forbidden_before]/o)
and($chars[$i+2]=~m/[^$strictly_forbidden_before]/o)){
- return "\\CJKunbreakablekernone \\CJKprotrude ";
+ return "\\CJKunbreakablekernone \\CJKprotrude{}";
}
}
}
if(($i<$#chars)
+ and($chars[$i+1]eq" ")){
+ # preserve space.
+ return "";
+ }
+ if(($i<$#chars)
and($chars[$i+1]=~m/[$strictly_forbidden_before]/o)){
- return "\\CJKunbreakablekernone ";
+ return "\\CJKunbreakablekernone{}";
}
if($chars[$i]=~m/[$strictly_forbidden_after]/o){
- return "\\CJKunbreakablekernone ";
+ return "\\CJKunbreakablekernone{}";
}
if(($i<$#chars)
and($chars[$i+1]=~m/[$forbidden_before]/o)){
- return "\\CJKunbreakablekerntwo ";
+ return "\\CJKunbreakablekerntwo{}";
}
if($chars[$i]=~m/[$forbidden_after]/o){
- return "\\CJKunbreakablekerntwo ";
+ return "\\CJKunbreakablekerntwo{}";
}
if(($i<$#chars)
and($chars[$i+1]=~m/[$slightly_forbidden_before]/o)){
- return "\\CJKunbreakablekernthree ";
+ return "\\CJKunbreakablekernthree{}";
}
if($chars[$i]=~m/[$slightly_forbidden_after]/o){
- return "\\CJKunbreakablekernthree ";
+ return "\\CJKunbreakablekernthree{}";
}
if($chars[$i]=~m/[$asian]/o){
- return "\\CJKbreakablekern ";
+ return "\\CJKbreakablekern{}";
}
if(($i<$#chars)and($chars[$i+1]=~m/[$asian]/o)){
- return "\\CJKbreakablekern ";
+ return "\\CJKbreakablekern{}";
}
}
# arguments: none
# return: string for output with TeX macro.
my($char_id);
- my $out_str=$chars[$i];
- $i++;
+ my $out_str="";
while($i<=$#chars){
$char_id=unpack("U",$chars[$i]);
- if($char_id>0x20 and $char_id<=0x02af){
+ if(($char_id>0x20 and $char_id<=0x021f)
+ or($char_id>=0x0250 and $char_id<=0x02af)# IPA Extensions
+ or($char_id>=0x0300 and $char_id<=0x033f)# Combining Diacritical Marks
+ or($char_id>=0x0360 and $char_id<=0x036f)
+ or($char_id>=0x0370 and $char_id<=0x03ff)# Greek and Coptic
+ or($char_id>=0x0400 and $char_id<=0x04ff)# Cyrillic
+ or($char_id>=0x0530 and $char_id<=0x058f)# Armenian
+ ){
$out_str.=$chars[$i];
+ }elsif($char_id>=0x1e00 and $char_id<=0x1eff){
+ # Latin Extended Additional
+ # 0x1e00 -> 0x0600, etc.
+ $out_str.=pack("U",$char_id-0x1800);
+ }elsif($char_id>=0x2010 and $char_id<=0x2046){
+ # General Punctuation (partial)
+ $out_str.=pack("U",$char_id-0x1000);
}else{
$i--;
last;
}
$i++;
}
- return '{\fontencoding{UT1}\fontfamily{omlgc}\selectfont '.$out_str.'}';
+ return '{\fontencoding{OT1}\fontfamily{omlgc}\selectfont '.$out_str.'}';###UT1?
}
sub ids_parse{