Re: upTeX-0.09 (Re: 欧文ギリシア語の扱い)

名前: ZR
日時: 2007-06-18 18:08:34
IPアドレス: 59.140.98.*

>>48327 upTeX に関してこの問題がずっと気になっています。 (<href="48210.html">>>48210</a>) >現状の upTeX では > \kcatcode`§=15 >で § を欧文扱いにした後、 > \kcatcode`§=18 >として「元に戻す」ことはできませんよね。 \kcatcode`あ=15 の後、\kcatcode`あ=17 で元に戻せない問題で、最初 \kcatcode`\あ=17 (和文 1 文字の control sequence を指定) (*) の書式を有効にすれば、たとえ 'あ' のトークンが無効(^^e3^^81^^82 という 3 文字と扱われる)の状態でも、 \expandafter\kcatcode\expandafter`\csname ^^e3^^81^^82\endcsname=17 (**) と書けば、これは (*) と同じになって、問題が軽減できると考えていました。 # この実装には、和文 1 文字の control sequence を特別扱いする処理 # を結局入れなければならず、簡単ではないのですが、少なくとも欧文の # 場合と同じなので仕様上の不自然さはないはず。 ## ちなみに、現在の pTeX では勿論このお書式は使えません。さらに ## 数値入力時に `\あ や `\hoge や `\relax 等を入力すると、不可解 ## な値が返ってきます。 ## *\count255=`\hoge \showthe\count255 (ptex プロンプトで) ## > 1840. でも、よく考えてみると、(**) は "80 以上の欧文文字の catcode が 13 の場合は失敗します。結局、 \expandafter\kcatcode\expandafter`\csname \string^^e3\string^^81\string^^82\endcsname=17 (***) のように各文字に \string を付さなければなりません。ここで、ある程度 の量のマクロを書いて \setkcatcode{^^e3^^81^^82}{17} で処理できるようにするというアプローチをとるのなら、現状でもこれは 実装可能なので、(**) の書式を許す価値はないでしょう。 しかしそれでも、(**) の書式は何か利用価値があるのではないかと憶測 しているのですが。 ---- <参考> 現状での \setkcatcode の実装 \setkcatcode{あ}{18} で 'あ' の kcatcode を 18 に変更。 \getkcatcode{あ} で 'あ' の kcatcode を \thekcatcode に取得。 あまりテストしていないのでバグがあるかも。 % kcctool.tex (for both plain upTeX & upLaTeX) \edef\skrestoreat{\catcode64=\the\catcode64}\catcode64=11 \newcount\sk@cp \newif\ifsk@ok \def\getkcatcode#1{\sk@getcp{#1}% \edef\thekcatcode{\the\kcatcode\sk@cp}} \def\setkcatcode#1#2{\sk@getcp{#1}\kcatcode\sk@cp#2} \def\sk@getcp#1{\sk@getcp@a#1\relax\relax} \def\sk@nxt#1#2#3#4#5{\sk@cp#1\loop {\lccode`\?\sk@cp \advance\sk@cp-#3% \lowercase{\expandafter\xdef\csname sk@#4?\endcsname}{#5}}% \advance\sk@cp\@ne \ifnum\sk@cp<#2\repeat} \sk@nxt{240}{248}{240}l{\sk@cp\the\sk@cp\noexpand\sk@da} \sk@nxt{224}{240}{224}l{\sk@cp\the\sk@cp\noexpand\sk@ca} \sk@nxt{194}{224}{192}l{\sk@cp\the\sk@cp\noexpand\sk@ba} \sk@nxt{128}{192}{128}t{\advance\sk@cp\the\sk@cp\noexpand\sk@oktrue} \def\sk@getcp@a#1{\sk@cp`#1\relax\sk@chkk#1% \ifsk@ok \let\sk@nxt\sk@end \else \expandafter\let\expandafter\sk@nxt\csname sk@l\string#1\endcsname \ifx\sk@nxt\relax \let\sk@nxt\sk@err \fi \fi \sk@nxt} \def\sk@stp#1#2{\multiply\sk@cp64\sk@okfalse \csname sk@t\string#2\endcsname \ifsk@ok \expandafter#1\else \expandafter\sk@err \fi} \def\sk@end#1\relax{} \def\sk@ba{\sk@stp\sk@end}\def\sk@ca{\sk@stp\sk@cb} \def\sk@cb{\sk@stp\sk@end}\def\sk@da{\sk@stp\sk@db} \def\sk@db{\sk@stp\sk@dc}\def\sk@dc{\sk@stp\sk@end} \begingroup\lccode`8=`k\lccode`9=`a \lowercase{\endgroup \def\sk@chkk#1{\sk@okfalse\expandafter\sk@chkk@a\meaning#189\@nil} \def\sk@chkk@a#189#2\@nil{\ifcat @#1@\sk@oktrue\fi}} \def\sk@err#1\relax{\errhelp{I regard it as U+FFFF}% \errmessage{Corrupted UTF-8 bytes}\sk@cp65535\relax} %\def\sk@end#1\relax{\showthe\sk@cp} \skrestoreat % EOF

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)