plane TeX のcatcodeについて

plane TeX のcatcodeについて

- 西村 一輝 の投稿
返信数: 10
皆様明けましておめでとうございます。

現在、TeXブックとTeXbyTopicを読み勉強しています。
そこで出てくるコードが理解出来ず、質問させて頂きます。

a\catcode`\^^M=12
b

このコードをTeX(Version 3.14159265)で実行するとabflが出力されます。

これはaで水平モードに入り、
\catcode`\^^M=12が処理された時点でTeXはS状態となって、
行端文字が、N状態へ状態を変えるだけで捨てられ、
bの後の行端文字がflと出力されるということだと思います。

しかしこれを以下のようにすると、aflbflが出力されます。

a\catcode`\^^M=12\relax
b

何もしない\relaxを入れてもS状態だと思うのですが、aの後にflが出力される理由が分かりません。

また次のコードもよく分かりません。

a\catcode`\^^M=13 %
b

TeX by Topic P.34下部に出現しますが、%の意味はあるんでしょうか?

S状態における[5]と[14](行の終了文字とコメント文字)は等価なもので、
行を終了させ、(文字自体は捨てて)N状態に移行させるものだと思います。
そうすると、%を使う必要性が全くないように思うのですが、TeX by Topicでは
意味があるように書かれています。(この説明自体よく分からないです。)

ご教授お願いします。



西村 一輝 への返信

Re: plane TeX のcatcodeについて

- 西村 一輝 の投稿
すみません勘違いしていました。
catcodeはその時点で処理されるみたいですね。

そうすると
a\catcode`\^^M=12\relax
b
がaflbflと出力することは理解出来ます。
\relaxの後の行端文字はもはやカテゴリーコード12なので、文字として出力されるということですね。

これで3番目の
a\catcode`\^^M=13 %
b
の意味も分かりました。

しかし
a\catcode`\^^M=12
b
がaflbflとならず、abflとなる理由が分かりません。
西村 一輝 への返信

Re: plane TeX のcatcodeについて

- 前田 一貴 の投稿
> しかし
> a\catcode`\^^M=12
> b
> がaflbflとならず、abflとなる理由が分かりません。

2.12.2節に答えが書かれているようです.
「\catcode`\^^M=12」まで読んだ時点ではまだ数値が続いているかも
しれないので,\catcode の代入処理前のM状態のままで行の終了文字を
読み,空白トークンに変わるということでしょうか.
前田 一貴 への返信

Re: plane TeX のcatcodeについて

- 西村 一輝 の投稿
前田さん いつも回答して頂きありがとうございます。

該当箇所をフォローしました。
ただ、TeXブック24章で、<数値>の定義は<何とか><one optional space>となっているので、a\catcode`\^^M=12 ε ^^M  と読めば、a\catcode`\^^M=12 εで完結して、^^Mがエスケープからの復帰に"食われる"のが、おかしな挙動のように思います。また、
a\catcode`\^^M=12<空白>
b
とすれば、12で数値が終わることは明白であり、^^Mは出力されそうに
思いますが、やはりこれでもabflのままです。

まぁ所詮、ソースを読んでいるわけではないので、とりあえずこのままで勉強を進めようと思います。

ありがとうございました。

西村




西村 一輝 への返信

Re: plane TeX のcatcodeについて

- 前田 一貴 の投稿
> a\catcode`\^^M=12<空白>
> b
> やはりこれでもabflのままです。

確かにそれは妙です.試しに

\catcode`Q=10QQabc

a\catcode`\^^M=12Q
b

とすると,

Q abc
aflbfl

となります.文字コード32だけ内部での扱いが特別なのでしょうか.
前田 一貴 への返信

Re: plane TeX のcatcodeについて

- 前田 一貴 の投稿
\catcode32=13\def {b}\catcode`\^^M=12


(最後のaのあとに空白が3つある)
だと出力は afl になります.
一方

\catcode32=13\def {b}\catcode`\^^M=12
a  a

だと出力は abbbafl になります.
このことから,「文字コード32の連続+行端文字」は取り除いて
\endlinechar を追加するという処理が行われているのではないかと思います.
(本のどこかに書いてあるのだろうか?)
前田 一貴 への返信

Re: plane TeX のcatcodeについて

- 北川 弘典 の投稿
> \catcode32=13\def {b}\catcode`\^^M=12
> a
>
> (最後のaのあとに空白が3つある)
> だと出力は afl になります.

不思議だ,と思って探してみたところ,
TeX Live のソース texk/web2c/lib/openclose.c に,
次のようなコードがありました.

#ifndef XeTeX /* for XeTeX, we have a replacement function in XeTeX_ext.c */
boolean
input_line (FILE *f)
{
(中略)
  /* Trim trailing whitespace.  */
  while (last > first && ISBLANK (buffer[last - 1]))
    --last;
(中略)
  return true;
}

そのため,1行分の入力が catcode に従って TeX で解釈される前に,
行末にある文字コード32の連続は無視されるのだと思います.
(ソースをいじって確かめたわけではありませんが)
北川 弘典 への返信

Re: plane TeX のcatcodeについて

- 前田 一貴 の投稿
北川さん,ありがとうございます.

> texk/web2c/lib/openclose.c
見当たらないなあ,と思っていたら,texmfmp.c の方でした.
ISBLANK マクロの定義は texk/kpathsea/c-ctype.h にありますね.
基本的に C99 の ctype.h の isblank() を呼び出すもので
(無い場合はその場で定義する)
スペースかタブが除去される対象になるようです.
前田 一貴 への返信

Re: plane TeX のcatcodeについて

- 北川 弘典 の投稿
>> texk/web2c/lib/openclose.c
> 見当たらないなあ,と思っていたら,texmfmp.c の方でした.
おっと,そうでした,ごめんなさい.

Web2C の独自仕様かと思っていたのですが,以下の Stack Exchange 中の
質問によると,TeX 本来の仕様のようです.
http://tex.stackexchange.com/questions/70622/read-trailing-spaces-are-removed

実際,TeX のソースコード tex.web に


@ The |input_ln| function brings the next line of input from the specified
file into available positions of the buffer array and returns the value
|true|, unless the file has already been entirely read, in which case it
returns |false| and sets |last:=first|.  In general, the |ASCII_code|
numbers that represent the next line of the file are input into
|buffer[first]|, |buffer[first+1]|, \dots, |buffer[last-1]|; and the
global variable |last| is set equal to |first| plus the length of the
line. Trailing blanks are removed from the line; thus, either |last=first|
(in which case the line was entirely blank) or |buffer[last-1]<>" "|.

とあり,そのしばらく後に Pascal コードが書かれていました.
現在使われている TeX の実装のWeb2C では,

We define |input_ln| in C, for efficiency. Nevertheless we quote the module
`Report overflow of the input buffer, and abort' here in order to make
\.{WEAVE} happy, since part of that module is needed by e-TeX.

として,該当コードを C で(これが texmfmp.c 中の該当部分?)
書きなおしているそうです.
北川 弘典 への返信

Re: plane TeX のcatcodeについて

- 前田 一貴 の投稿
なるほど.確かに TeXbook にも載っていました.
ありがとうございました.
前田 一貴 への返信

Re: plane TeX のcatcodeについて

- 西村 一輝 の投稿

完全に理解出来ました。

S状態云々ではなく、行末の<空白>はオートマトンにすら届かない"テープ"以前の話ということですね。

よくよく読めば、TeX by Topic(翻訳)の34ページにもそのように書いてました。(入力プロセッサ以前の話と書いてくれれば、混同しなかったのですが、、、あと2.12.2の分割されたプロセス云々の話はおかしいですよね。
コントロールシーケンスは特別な処理であるが、分割されたプロセスには変わらないですよね。)

お二人ともありがとうございました。

西村