名前: しっぽ愛好家 日時: 2001-10-18 18:59:13 IPアドレス: 202.224.196.*
>>2933 \ifcat による比較がどういうつもりなのかよくわからないのですが, \ifcat の挙動は概ね, \ifcat はその直後に続くトークンを展開し, 展開されない(あるいは \noexpand によって展開を抑制した) トークンが 2 個現れたらそれらのカテゴリーコードを比較する のようになることを確認するとよいでしょう. したがって,オリジナルの定義では,\ifcat の直後の \@p が 不用意に展開されることがあります(実際,\perm の第 1 引数が \mathrm{X} である場合はそのような場合です). ここでは,次のように \perm を再定義してみます. \newif\if@indexc@@de \def\perm#1#2{% \let\@p\@empty \@tfor\@p:=#1\do{% \expandafter\ifcat\expandafter\noexpand\@p1\@indexc@@detrue \else \@indexc@@defalse \fi}% \ensuremath{% {}_{#1} \if@indexc@@de \kern.05em\fi \mathrm{P}_{#2}}} この定義でも,\perm{{XX}}{1} のように余分な括弧を持った第 1 引数を 与えると不都合があります. %%% \perm の第 1 引数の *開き括弧以外の* 最初のトークンを取ってくるのは, %%% 今考えた限りでは面倒です. なお,\ifcat の処理が,``第 1 引数が具体的な数字ならば, あとで空白を調整する'' つもりのものならば, 次のように定義するのもよいでしょう. \def\perm#1#2{% \ensuremath{% {}_{#1}% \def\@tempa{#1}% \@onelevel@sanitize\@tempa \afterassignment\remove@to@nnil \count@1\@tempa\relax\@nnil \ifnum9<\count@ \kern.05em \fi \mathrm{P}_{#2}}} %%% ここで用いた,\@onelevel@sanitize, \afterassignment, %%% \remove@to@nnil の意味については,ご自分で調べてください.
この書き込みへの返事: