名前: misc 日時: 2004-05-07 17:52:14 IPアドレス: 211.4.121.*
>>28775 # ``The TeXbook'' の Appendix D には, # トークンリスト・レジスタに収められている“空白”を # 判別するコードが載っていますが,単純なものを考えてみます. \documentclass{jarticle} \begin{document} \makeatletter \def\test#1{\@test@#1\@nnil} \def\@test@{\futurelet\let@token\@test@check} \def\@test@check{% \ifx\let@token\@nnil \def\@tempa{\@gobble}% \else \ifx\let@token\@sptoken \def\@tempa{\@test@checkspace}% \else \def\@tempa{\@test@normalcase}% \fi \fi \@tempa} \def\@test@normalcase#1{#1\@test@} \def\@test@checkspace{% \expandafter\futurelet\expandafter\let@token\expandafter\@test@checkspace@ \string} \def\@test@checkspace@{% \ifx\let@token\@sptoken%%% normal space \expandafter\@test@normalspace \else%%% otherwise (e.g. \@sptoken) \expandafter\@test@sptoken \fi} \begingroup \def\:{\def\@test@normalspace} \expandafter\endgroup\: {% [space]% \@test@} \edef\@tempa{\def\noexpand\@test@sptoken\string\@sptoken} \@tempa{% [sptoken]% \@test@} % テストコード \edef\@tempa{\noexpand\test{a b\@sptoken\space c}} \@tempa \makeatother \end{document} 要は,\@sptoken と空白文字を区別したいところでは いったん \string で文字列化してから,文字列化したものの 先頭の文字を再び読んでみる,ということです. (通常の空白なら空白文字で,\@sptoken からは エスケープ文字が出てくる(*)ので,区別できます.) # (*) \escapechar の値を 32 あるいは文字コードとして # 適さない値にすると困ったことになりますが. “変な空白”などとの判別や空白文字に \let されているものが \@sptoken 以外にもある場合も考え出すときりがありませんが, 上記の例や The TeXbook の例と同様に落ち着いて考えれば どうにかなるのではないでしょうか.
この書き込みへの返事: