TeX Live svn 由来の (e-)pTeX を使っています
(コンパイル日は 1/8 です)が,
以下の ソース ptest-120308.tex を処理させると
segmentation fault が発生します.
% ptest-120308.tex ここから
\documentclass{beamer}
\begin{document}
\begin{frame}
\verb+\catcode+命令
\end{frame}
\end{document}
% ここまで
以下が端末への出力結果です:
This is e-pTeX, Version 3.1415926-p3.2-110825-2.3 (utf8.euc) (TeX Live 2012/dev)
restricted \write18 enabled.
entering extended mode
(./ptest-120308.tex
... 省略 ...
No file ptest-120308.nav.
! Missing number, treated as zero.
Segmentation fault
エンジンを ptex にして platex.fmt を作った場合も,
同じ症状になります.
「! Missing number」エラーは \catcode による自然な
ものだと思いますが,この segfault の原因は何なのでしょうか?
なるほど,「\BAD.」の表示は Lo で上位バイトを消していたからだったんですね.
> 実験によると,Lo なしで info(loc) のほうがわかりやすい
> 表示になると思うのですが,Lo は何のためにあるのでしょうか?
pTeX-3.1.11 でも上位バイトを消していたので,単純にこれが「正しい」挙動だと思っていました.
調べてみると,Lo を安直に消すのも微妙な気がしてきました.どうするのが良い解決策なのでしょうか.
% ptest2-120308.tex
\catcode あ0
\end
% ここまで
これをコンパイルすると \catcode のところでエラーがでますが,
Lo なしだと,環境変数 MALLOC_PERTURB_ (以下mp)の
値によって「あ」の直後の文字の表示が異なります.
私の環境だと,以下のようになりました:
(右端の8桁の16進数は info(loc) の値です)
mp=15 : あ韶 f0f0f0f0
mp=16: あ闖 efefefef
mp=97: あ\BAD. 9e9e9e9e
mp=154: あ\IMPOSSIBLE. 65656565
Lo ありだと,上の4通りでは全部表示は「あ\BAD.」になりました.
よくわかりませんが,Lo を入れることで
端末に変なバイト列が出力されないようにしたかったのではないのでしょうか?
> 実験によると,Lo なしで info(loc) のほうがわかりやすい
> 表示になると思うのですが,Lo は何のためにあるのでしょうか?
pTeX-3.1.11 でも上位バイトを消していたので,単純にこれが「正しい」挙動だと思っていました.
調べてみると,Lo を安直に消すのも微妙な気がしてきました.どうするのが良い解決策なのでしょうか.
% ptest2-120308.tex
\catcode あ0
\end
% ここまで
これをコンパイルすると \catcode のところでエラーがでますが,
Lo なしだと,環境変数 MALLOC_PERTURB_ (以下mp)の
値によって「あ」の直後の文字の表示が異なります.
私の環境だと,以下のようになりました:
(右端の8桁の16進数は info(loc) の値です)
mp=15 : あ韶 f0f0f0f0
mp=16: あ闖 efefefef
mp=97: あ\BAD. 9e9e9e9e
mp=154: あ\IMPOSSIBLE. 65656565
Lo ありだと,上の4通りでは全部表示は「あ\BAD.」になりました.
よくわかりませんが,Lo を入れることで
端末に変なバイト列が出力されないようにしたかったのではないのでしょうか?
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}
の場合,latex では
! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}
となるので,
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}
の場合,platex で
! Missing number, treated as zero.
<to be read again>
命
l.3 \frame{\verb+\catcode+命令}
でよいとすれば,link(start)=null のままでよい
ような気がするのですが,他のところで困るのでしょうか?
つまり,何もせずに
show_token_list(start,loc,100000);
だけにする。あるいはこの部分の change を無しにする。
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}
の場合,latex では
! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}
となるので,
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}
の場合,platex で
! Missing number, treated as zero.
<to be read again>
命
l.3 \frame{\verb+\catcode+命令}
でよいとすれば,link(start)=null のままでよい
ような気がするのですが,他のところで困るのでしょうか?
つまり,何もせずに
show_token_list(start,loc,100000);
だけにする。あるいはこの部分の change を無しにする。
どうなんでしょう,私にはまだよくわかりません.
なお,teTeX3 + pTeX-3.1.10 (ptexenc なし) をコンパイルして確かめてみたら,
「\BAD.」は出力されませんでした:
% a.tex ここから(実際は EUC)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
% ここまで
--- TeX Live svn での結果:\BAD. が残っている
This is pTeX, Version 3.1415926-p3.2 (utf8.euc) (TeX Live 2012/dev) (format=ptex 2012.3.8) 9 MAR 2012 21:24
restricted \write18 enabled.
%&-line parsing enabled.
**a.tex
(./a.tex
! Missing number, treated as zero.
あ\BAD.
l.2 ...r\expandafter\catcode\expandafter\the\toks0
? x
No pages of output.
--- teTeX3 下の pTeX-3.1.10 (ptexenc なし)
This is pTeX, Version 3.141592-p3.1.10 (euc) (Web2C 7.5.4) (format=ptex-euc 2012.3.9) 9 MAR 2012 21:24
**a.tex
(./a.tex
! Missing number, treated as zero.
あ
l.2 ...r\expandafter\catcode\expandafter\the\toks0
? x
No pages of output.
「\catcode あ0」の場合だと,3.1.10 でも「あ0」の表示になりました.
なお,teTeX3 + pTeX-3.1.10 (ptexenc なし) をコンパイルして確かめてみたら,
「\BAD.」は出力されませんでした:
% a.tex ここから(実際は EUC)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
% ここまで
--- TeX Live svn での結果:\BAD. が残っている
This is pTeX, Version 3.1415926-p3.2 (utf8.euc) (TeX Live 2012/dev) (format=ptex 2012.3.8) 9 MAR 2012 21:24
restricted \write18 enabled.
%&-line parsing enabled.
**a.tex
(./a.tex
! Missing number, treated as zero.
あ\BAD.
l.2 ...r\expandafter\catcode\expandafter\the\toks0
? x
No pages of output.
--- teTeX3 下の pTeX-3.1.10 (ptexenc なし)
This is pTeX, Version 3.141592-p3.1.10 (euc) (Web2C 7.5.4) (format=ptex-euc 2012.3.9) 9 MAR 2012 21:24
**a.tex
(./a.tex
! Missing number, treated as zero.
あ
l.2 ...r\expandafter\catcode\expandafter\the\toks0
? x
No pages of output.
「\catcode あ0」の場合だと,3.1.10 でも「あ0」の表示になりました.
--- ptex-base.ch.orig Thu Mar 08 23:08:24 2012
+++ ptex-base.ch Sat Mar 10 07:41:53 2012
@@ -1483,17 +1483,6 @@
{|state| code at start of line}
@z
-@x [22.311] l.6986 - pTeX: label
-@p procedure show_context; {prints where the scanner is}
-label done;
-var old_setting:0..max_selector; {saved |selector| setting}
-@y
-@p procedure show_context; {prints where the scanner is}
-label done, done1;
-var old_setting:0..max_selector; {saved |selector| setting}
-@!s: pointer; {temporary pointer}
-@z
-
@x [22.316] l.7110 - pTeX: init kcode_pos
@d begin_pseudoprint==
begin l:=tally; tally:=0; selector:=pseudo;
@@ -1535,32 +1524,6 @@
for q:=1 to n do print_char(" "); {print |n| spaces to begin line~2}
if m+n<=error_line then p:=first_count+m else p:=first_count+(error_line-n-3);
if trick_buf2[(p-1) mod error_line]=1 then p:=p-1;
-@z
-
-@x [22.319] l.7157 - pTeX: adjust kanji code token
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then show_token_list(start,loc,100000)
-else show_token_list(link(start),loc,100000) {avoid reference count}
-@y
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then
- begin if (token_type=backed_up)and(loc<>null) then
- begin if (link(start)=null)and(check_kanji(info(start))) then {|wchar_token|}
- begin cur_input:=input_stack[base_ptr-1];
- s:=get_avail; info(s):=Lo(info(loc));
- cur_input:=input_stack[base_ptr];
- link(start):=s;
- show_token_list(start,loc,100000);
- free_avail(s);link(start):=null;
- goto done1;
- end;
- end;
- show_token_list(start,loc,100000);
- end
-else show_token_list(link(start),loc,100000); {avoid reference count}
-done1:
@z
@x [24.341] l.7479 - pTeX: set last_chr
のように,この部分に関する changes を全て無くすると,
(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}
! Missing number, treated as zero.
<to be read again>
命
l.3 \frame{\verb+\catcode+命令}
(2)
\catcode あ0
\end
! Missing number, treated as zero.
<to be read again>
あ
l.1 \catcode あ
0
(3)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
! Missing number, treated as zero.
<to be read again>
あ
l.2 ...r\expandafter\catcode\expandafter\the\toks0
のように,これらの例については全てもっともらしく
なるのですけど,ちょっとこわいです。
なお,latex, tex では
(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}
! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}
(2)
\catcode a0
\end
! Missing number, treated as zero.
<to be read again>
a
l.1 \catcode a
0
(3)
\toks0={a}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
! Missing number, treated as zero.
<to be read again>
a
l.2 ...r\expandafter\catcode\expandafter\the\toks0
+++ ptex-base.ch Sat Mar 10 07:41:53 2012
@@ -1483,17 +1483,6 @@
{|state| code at start of line}
@z
-@x [22.311] l.6986 - pTeX: label
-@p procedure show_context; {prints where the scanner is}
-label done;
-var old_setting:0..max_selector; {saved |selector| setting}
-@y
-@p procedure show_context; {prints where the scanner is}
-label done, done1;
-var old_setting:0..max_selector; {saved |selector| setting}
-@!s: pointer; {temporary pointer}
-@z
-
@x [22.316] l.7110 - pTeX: init kcode_pos
@d begin_pseudoprint==
begin l:=tally; tally:=0; selector:=pseudo;
@@ -1535,32 +1524,6 @@
for q:=1 to n do print_char(" "); {print |n| spaces to begin line~2}
if m+n<=error_line then p:=first_count+m else p:=first_count+(error_line-n-3);
if trick_buf2[(p-1) mod error_line]=1 then p:=p-1;
-@z
-
-@x [22.319] l.7157 - pTeX: adjust kanji code token
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then show_token_list(start,loc,100000)
-else show_token_list(link(start),loc,100000) {avoid reference count}
-@y
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then
- begin if (token_type=backed_up)and(loc<>null) then
- begin if (link(start)=null)and(check_kanji(info(start))) then {|wchar_token|}
- begin cur_input:=input_stack[base_ptr-1];
- s:=get_avail; info(s):=Lo(info(loc));
- cur_input:=input_stack[base_ptr];
- link(start):=s;
- show_token_list(start,loc,100000);
- free_avail(s);link(start):=null;
- goto done1;
- end;
- end;
- show_token_list(start,loc,100000);
- end
-else show_token_list(link(start),loc,100000); {avoid reference count}
-done1:
@z
@x [24.341] l.7479 - pTeX: set last_chr
のように,この部分に関する changes を全て無くすると,
(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}
! Missing number, treated as zero.
<to be read again>
命
l.3 \frame{\verb+\catcode+命令}
(2)
\catcode あ0
\end
! Missing number, treated as zero.
<to be read again>
あ
l.1 \catcode あ
0
(3)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
! Missing number, treated as zero.
<to be read again>
あ
l.2 ...r\expandafter\catcode\expandafter\the\toks0
のように,これらの例については全てもっともらしく
なるのですけど,ちょっとこわいです。
なお,latex, tex では
(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}
! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}
(2)
\catcode a0
\end
! Missing number, treated as zero.
<to be read again>
a
l.1 \catcode a
0
(3)
\toks0={a}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
! Missing number, treated as zero.
<to be read again>
a
l.2 ...r\expandafter\catcode\expandafter\the\toks0