http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/53287.htmlから始まる話題ですが、Q&Aでは見通しが悪いので、こちらに引越しさせていただきます。(最後のhttp://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/53294.htmlあたりからたどると読みやすいでしょうか。)
Vine 4.2 (i386, 32bit) の環境で確認しています。
OK ptetex3-20051003 (ptex-src-3.1.8.1)
OK ptetex3-20060506 (ptex-src-3.1.9)
OK ptetex3-20060615 (ptex-src-3.1.10-Beta2 + utf8.patch)
NG ptetex3-20061213 (ptex-src-3.1.10-Beta3 + libkanji-0.84)
NG ptetex3-20090610 (ptex-src-3.1.10 + ptexenc-0.999)
依然として私のチョンボである可能性が...2006年6月と12月の間に何をしたのか、引き続き調査中です。m(_|_)m
私も理解できている訳ではありませんが、
ptex-base.chを眺めていると、7630行目から
"@<Look ahead for glue or kerning@>" というところがあって、
問題の箇所"procedure make_ord"付近と似た処理が出てきます。
そこを見ると、
(インデントが削除されてしまって見にくくてすみません)
begin if op_byte(main_j)<kern_flag then
begin gp:=font_glue[main_f]; cur_r:=rem_byte(main_j);
if gp<>null then
begin while((type(gp)<>cur_r)and(link(gp)<>null)) do gp:=link(gp);
gq:=glue_ptr(gp);
end
else
begin gp:=get_node(small_node_size); font_glue[main_f]:=gp;
gq:=null;
end;
if gq=null then
begin type(gp):=cur_r; gq:=new_spec(zero_glue);
glue_ptr(gp):=gq;
main_k:=exten_base[main_f]+qi((qo(cur_r))*3);
となっています。
cur_rの型はptex.webを見ると、halfwordのようです。
それと同様であるとすると、3844行以下のmake_ordの方も以下のようになるべきのように思います。
procedure make_ord内では、rrはhalfwordと宣言されている(上記cur_rと同様)一方、rはpointerと宣言されいて合いません。
if op_byte(cur_i)<kern_flag then
begin gp:=font_glue[cur_f]; rr:=rem_byte(cur_i);
if gp<>null then begin
while((type(gp)<>rrr)and(link(gp)<>null)) do begin gp:=link(gp);
end;
gq:=glue_ptr(gp);
end
else begin gp:=get_node(small_node_size);
font_glue[cur_f]:=gp; gq:=null;
end;
if gq=null then
begin type(gp):=rrr; gq:=new_spec(zero_glue); glue_ptr(gp):=gq;
a:=exten_base[cur_f]+qi((qo(rr))*3);
試しに、ptex-3.1.10 + tetex3 (ptetex3なし) に上記の編集を施して、
rの初期化も消して試したところ、
本田さんのptexのサンプルはOKになりました。
ptex-base.chを眺めていると、7630行目から
"@<Look ahead for glue or kerning@>" というところがあって、
問題の箇所"procedure make_ord"付近と似た処理が出てきます。
そこを見ると、
(インデントが削除されてしまって見にくくてすみません)
begin if op_byte(main_j)<kern_flag then
begin gp:=font_glue[main_f]; cur_r:=rem_byte(main_j);
if gp<>null then
begin while((type(gp)<>cur_r)and(link(gp)<>null)) do gp:=link(gp);
gq:=glue_ptr(gp);
end
else
begin gp:=get_node(small_node_size); font_glue[main_f]:=gp;
gq:=null;
end;
if gq=null then
begin type(gp):=cur_r; gq:=new_spec(zero_glue);
glue_ptr(gp):=gq;
main_k:=exten_base[main_f]+qi((qo(cur_r))*3);
となっています。
cur_rの型はptex.webを見ると、halfwordのようです。
それと同様であるとすると、3844行以下のmake_ordの方も以下のようになるべきのように思います。
procedure make_ord内では、rrはhalfwordと宣言されている(上記cur_rと同様)一方、rはpointerと宣言されいて合いません。
if op_byte(cur_i)<kern_flag then
begin gp:=font_glue[cur_f]; rr:=rem_byte(cur_i);
if gp<>null then begin
while((type(gp)<>rrr)and(link(gp)<>null)) do begin gp:=link(gp);
end;
gq:=glue_ptr(gp);
end
else begin gp:=get_node(small_node_size);
font_glue[cur_f]:=gp; gq:=null;
end;
if gq=null then
begin type(gp):=rrr; gq:=new_spec(zero_glue); glue_ptr(gp):=gq;
a:=exten_base[cur_f]+qi((qo(rr))*3);
試しに、ptex-3.1.10 + tetex3 (ptetex3なし) に上記の編集を施して、
rの初期化も消して試したところ、
本田さんのptexのサンプルはOKになりました。
> 調べてみます
uptex-base.ch をオリジナルから再作成した
ものと、W32TeX で使用しているものを比べました
が、相違点がありませんでした。
そこで
updvipdfmx で pdf に変換してみると、正しく、
同じ幅になりました。
結論: dviout で見ていたので、間違った結論を
得ていました。おそらく、dviout の設定を
ちゃんとしていないのが原因です。
お騒がせしました。
ptexlive も変更されたようなので、W32TeX も
できるだけ早く変更します。
奥村さん指摘の、math baseline shift も変更
します。
ptexlive との振る舞いは一致すると思います。
--kakuto
uptex-base.ch をオリジナルから再作成した
ものと、W32TeX で使用しているものを比べました
が、相違点がありませんでした。
そこで
updvipdfmx で pdf に変換してみると、正しく、
同じ幅になりました。
結論: dviout で見ていたので、間違った結論を
得ていました。おそらく、dviout の設定を
ちゃんとしていないのが原因です。
お騒がせしました。
ptexlive も変更されたようなので、W32TeX も
できるだけ早く変更します。
奥村さん指摘の、math baseline shift も変更
します。
ptexlive との振る舞いは一致すると思います。
--kakuto