Re: 環境内の内容をコマンドとして定義したい

名前: しっぽ愛好家
日時: 2004-07-10 18:26:34
IPアドレス: 211.4.121.*

>>30252 マクロ定義時の置換テキストを囲む括弧には,\bgroup,\egroup を 用いることはできません(カテゴリーコード 1,2 の文字そのものを 用いなければなりません).実際, \def\somecs\bgroup ...\egroup のような定義は,\bgroup ... の部分(最初に現れる開き括弧の 直前までの部分)が \somecs の“書式指定文字列”として扱われます. 環境の中身を取得する必要がある場合には,環境の終端に対応する \end までの部分を(\end を書式指定文字列として用いたマクロを 使って)取得することになります. \documentclass{article} \makeatletter \newcounter{Itemize} \def\Itemize{\@get@env@contents\@Itemize} \def\@Itemize{% \stepcounter{Itemize}% \expandafter\xdef\csname ItemContents\the\c@Itemize\endcsname{% \the\@env@contents}% \itemize}%%% ←↓このあたりは適宜変更してください. \def\endItemize{\enditemize} % %%% 環境の中身を取得するマクロ \newtoks\@env@contents \long\def\@get@env@contents#1{%%% #1: 環境の中身を取得した後に実行する処理 \def\@get@env@contents@proc{#1}% \@env@contents{}% \@get@env@contents@} \long\def\@get@env@contents@#1\end#2{% #1: 次の \end までの記述, #2: 環境名 \def\@tempa{#2}% \ifx\@tempa\@currenvir%%% 現在取得中の環境の終端に到達した場合 %%% \@currenvir は“現在の環境の名称”に展開されるマクロ \@env@contents\expandafter{\the\@env@contents#1}% \expandafter\@get@env@contents@@ \else \@env@contents\expandafter{\the\@env@contents#1\end{#2}}% \expandafter\@get@env@contents@ \fi} \def\@get@env@contents@@{% \@get@env@contents@proc%%% 環境の中身を取得した後に行う処理 \the\@env@contents%%% 環境の中身 \expandafter\end\expandafter{\@currenvir}}%%% 環境の終了処理 % %%% 動作確認用マクロ \def\EnvContents#1{\@nameuse{ItemContents#1}} \makeatother \begin{document} \begin{Itemize} \item サンプル(その1) \begin{minipage}[t]{10zw} このように,別の環境を挟み込むことも可能です. \end{minipage} \end{Itemize} \begin{Itemize} \item サンプル(その2) \end{Itemize} \begin{itemize} \EnvContents{2} \end{itemize} \begin{itemize} \EnvContents{1} \end{itemize} \end{document} [補足] このような方法で環境の中身を取得する場合には, 同じ名称の環境をネストさせる場合に“内側の環境を {, } で囲む”必要がある, という点に注意してください. %%% tabularx パッケージによる tabularx 環境をネストさせる場合と同様です. なお,今用いた \@get@env@contents と同様の処理は,amsmath パッケージが (各種のディスプレイ数式環境の中身を取得するために)用いているマクロ \collect@body や,tabularx パッケージが(tabularx 環境の中身を 取得するために)用いているマクロ \TX@get@body で用いられています. %%% \collect@body はいくぶん凝ったことをしています. %%% 一方,\TX@get@body は \@get@env@contents と本質的には同じです.

この書き込みへの返事:

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