Re: \@forの区切りを変えたい

名前: 北見 けん
日時: 2003-01-16 22:37:48
IPアドレス: 211.128.71.*

>>15185 >>15183のやつをあらためて見直したら、あまりうまくないですね。 作り直しましたので、前のは捨ててください。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ex@for.sty % author KITAMI Ken % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % LaTeX の内部マクロ \@for を拡張するパッケージです。 % % \@for で認識される区切り文字は“,”ですが、 % 他のものも区切りに使えると便利です。 % そこで、任意の区切り文字を使えるようにしました。 % 互換性を保つため、オプション引数で指定します。 % たとえば、要素の区切り文字に“;”を用いる場合の使用例は、 % \@for[;]\member:=aaa;bbb;ccc\do{\show\member} % です。“[;]”を省略すると、普通の \@for になります。 % (正確には、区切り文字として使えるのは \catcode が % 3,4,7,8,10,11,12,13 の文字トークンです。 % それ以外のものを使いたい場合は \catcode を % 変えておけばよいでしょう。) % % なお、\@for[] とした場合に \@tfor と同じ動作をする % ことが期待されますが、これには未対応です。 % (リスト中の空白文字が無視されます。) % % パッケージ名は“ex@for”にしました(extended \@for のつもり)。 % 従って ex@for.sty の中で \ProvidesPackage{ex@for} としてあって、 % パッケージを読みこむときには \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}[2003/01/16] \def\@for{\begingroup\@testopt\ex@for@ini,} %\@testoptが、\reserved@a〜d を変えてしまうのを隠蔽します。 %\@for は、\@for\reserved@b:=\list{\job}の形で使われたりするので。 \long\def\ex@for@ini[#1]#2:=#3\do{% \endgroup \long\def\ex@forloop##1#1##2\@@##3##4{% \def##3{##1}% \ifx##3\@nnil\ex@for@break\fi ##4% \ex@forloop##2\@@##3{##4}}% % この部分は、例えば区切り文字が[,]で与えられたとすると % \long\def\ex@forloop#1,#2\@@#3#4{% % \def#3{#1}% % \ifx#3\@nnil\ex@for@break\fi % #4% % \ex@forloop#2\@@#3{#4}}% % という定義をすることになります。 % #3 が項目を入れるマクロで、#4 がジョブ、#1,#2 がリストです。 \expandafter\def\expandafter\@fortmp\expandafter{#3}% \ifx\@fortmp\@empty\ex@for@break\fi \expandafter\ex@forloop#3#1\@nil#1\@@#2} \long\def\ex@for@break#1\@@#2#3{\fi} % このマクロは、下の例のように、 % ジョブの中で \if と \fi の間に置けば、 % ループを抜けるのに使えます。 \endinput % 以下はテスト用です。 \documentclass{article} \usepackage{ex@for} \begin{document} \makeatletter \@for\member:=abc,de f::g hi,jkl\do{[\member]}\par \@for[,]\member:=abc,de f::g hi,jkl\do{[\member]}\par \@for[:]\member:=abc,de f::g hi,jkl\do{[\member]}\par \@for[ ]\member:=abc,de f::g hi,jkl\do{[\member]}\par \def\list{abc,de f::g hi,jkl} \@for\member:=\list\do{[\member]}\par \@for[a]\member:=\list\do{[\member]}\par \@for[]\member:=\list\do{[\member]}\par \@for[]\member:=\list\do{% \if h\member\ex@for@break\fi[\member]}\par \@for\member:=\@empty\do{[\member]\error}\par \@for\member:=\@empty\do{[\member]\error}\par \makeatother \end{document}

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)