名前: 北見 けん 日時: 2003-01-16 10:42:36 IPアドレス: 211.128.71.*
>>15176 そのものずばりを作ってあったので、どうぞ。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ex@for.sty % author KITAMI Ken % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % LaTeX の内部マクロ \@for を拡張しました。 % \@for で認識される区切り文字は“,”ですが、 % 他のものも区切りに使えると便利です。 % そこで、任意の区切り文字を使えるようにしました。 % 互換性を保つため、オプション引数で指定します。 % たとえば、要素の区切り文字に“;”を用いる場合の使用例は、 % \@for[;]\member:=aaa;bbb;ccc\do{\show\member} % です。“[;]”を省略すると、普通の \@for になります。 % ちなみに、\@for[] で \@tfor と同じ動作をします。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % パッケージ名を“ex@for”にしたわけです(extended \@for のつもり)。 % 従って ex@for.sty の中で \ProvidesPackage{ex@for}[2002/1/21] としてあります。 % % これを読みこむときに、\usepackage{ex@for} とするのですが、 % “@”のカテゴリーコードの違いが原因で警告が出ます。 % % そこで、 % \makeatother % \ProvidesPackage{ex@for}[2002/1/21] % \makeatletter % などとしたのですが、ソースファイルから呼ばれるときと、 % 他のパッケージやクラスから呼び出されるときとで挙動が違います。 % % 結局、以下のようにしてうまくいっているのですが、 % もっとスマートな方法はないでしょうか。 \begingroup \def\getprev@code#1#2#3#4\@nil{#3} \catcode`\@=\expandafter\getprev@code\@currnamestack\@nil\relax \def\reserved@a#1#2{\endgroup#1{#2}}% \reserved@a%パッケージネームに"@"が使われているので(^_^) \ProvidesPackage{ex@for}[2002/1/21] %\makeatletter \long\def\@for{\begingroup\@testopt\ex@for,}% %\@testoptが、\reserved@a〜d を変えてしまうのを隠蔽します。 %\@for は、\@for\reserved@b:=\list{\job}の形で使われたりするので。 %:=\@empty\doで呼ばれたときの不具合を直しました。 \long\def\ex@for[#1]#2:=#3\do#4{% \endgroup \long\def\@ex@for##1##2##3#1##4\end@ex@for{% \def##1{##3}\def\@fortmp{##4}% \ifx##1\@empty\ifx\@fortmp\@nnil\break@ex@for\fi\fi \ifx##1\@nnil\ifx\@fortmp\@empty\break@ex@for\fi\fi ##2% \@ex@for##1{##2}##4\end@ex@for}% % 例えば、区切りが[,]で与えられた場合 % \long\def\@ex@for#1#2#3,#4\end@ex@for{% % % #1が項目を入れるマクロで、#2 がジョブ、#3,#4がリストです。 % \def#1{#3}\def\@fortmp{#4}% % \ifx#1\@empty\ifx\@fortmp\@nnil\break@ex@for\fi\fi % \ifx#1\@nnil\ifx\@fortmp\@empty\break@ex@for\fi\fi % #2% % \@ex@for#1{#2}#4\end@ex@for}% % と定義されます。 \expandafter\def\expandafter\@fortmp\expandafter{#3}% \ifx\@fortmp\@empty\iftrue\break@ex@for\fi\fi \def\@fortmp{\@ex@for#2{#4}}% \expandafter\@fortmp#3#1#1\@nil\end@ex@for} \long\def\break@ex@for#1\end@ex@for{\fi\fi} \endinput
この書き込みへの返事: