Re: マクロの中で align 環境は使えないのか?

名前: しっぽ愛好家
日時: 2002-02-06 11:43:21
IPアドレス: 202.224.196.*

>>6290 トノさんのお話にあるように,align 環境をまるごと含む 単一のマクロは正しく処理されますが, \def\someenv{% %%% ((適当な前処理)) \begin{align}} \def\endsomeenv{% \end{align}% %%% ((適当な後処理))} のように,align 環境を含むような環境を定義しようとすると, うまくいきません. %%% <environment> 環境は,\<environment> と %%% \end<environment> によって定義されます. これは,amsmath パッケージが提供する環境独特(?)の挙動です. 実際,align 環境の場合,\begin{align} の処理の最後に この \begin{align} に対応する \end{align} までの部分 (環境の中身) を (環境の処理を行う前に) まるごと取得する という処理(*)を行っていて,そのため ``\end{align}'' そのものが 見えている(**)必要があるのです. %%% 簡単に言えば,環境の ``\end'' の用い方が他の環境とは %%% 異なっているということです. %%% 確か,tabularx パッケージによる tabularx 環境も %%% 同様のことを行っているようです. (*) 興味があれば,ファイル amsmath.sty で定義されている マクロ \collect@body の定義を調べてみてください) (**) マクロの展開結果として与えられるのではなく,ソースファイル中に 直接記述されている,ということです. align 環境を含むような環境を定義するのでしたら, とりあえず, \def\someenv{% %%% ((適当な前処理)) \align} \def\endsomeenv{% \endalign %%% ((適当な後処理))} のように定義してみてください. %%% \collect@body は ``環境の中身'' の取得の際に, %%% ``現在の環境名'' \@currenvir を用いて環境の終端の判定を %%% 行います.したがって,上記のように (\begin{align} ではなく) %%% \align を直接用いると,\align が与える \collect@body は %%% someenv 環境の中身を取得するために ``\end{someenv}'' を %%% 探します.(一方,\begin{align} として \@currenvir を %%% 書き換えてしまうと,\collect@body は ``\end{align}'' を %%% 探そうとするわけです.) おそらく,この問題ではないかと思うのですが. とりあえず,気付いたことをお話しました.

この書き込みへの返事:

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