名前: しっぽ愛好家 日時: 2003-12-03 17:55:44 IPアドレス: 211.4.121.*
>>24097 補足(蛇足(?))です. >ある環境の処理にその環境の名称自身が >ハードコーディングされている環境の別名は,… と書きましたが,それ以外にも ``ある環境に付随して用いられるもの'' (例えば,番号づけに用いる LaTeX のカウンタ)の名称が環境名を用いて 定められているような環境の別名は,単純には作れないことがあります. 例えば,次のような記述により ``定理型の環境'' を作成してみます. %%% これは,故意にエラーが生じるように記述した例です. \documentclass{article} \makeatletter \def\NewTheorem#1#2{% #1: environment name, #2: heading \newcounter{#1}% \@namedef{#1}{\@THM{#2}}% \@namedef{end#1}{\@ENDTHM}} \def\@THM#1{% \refstepcounter\@currenvir%%% (*) \trivlist \item[\textbf{#1~\@nameuse{the\@currenvir}}]%%% (**) \slshape} \def\@ENDTHM{\endtrivlist} \makeatother \NewTheorem{Theorem}{Theorem} \let\theorem\Theorem \let\endtheorem\endTheorem \begin{document} \begin{Theorem} patapata \end{Theorem} \begin{theorem} oyoyo \end{theorem} \begin{Theorem} arere \end{Theorem} \end{document} この例の \NewTheorem によって定義された Theorem 環境の定義においては, (\@THM の定義からわかるように)環境名そのものは書き込まれていません. しかし,(*) あるいは (**) というコメントをつけた行のように, 環境名と同名の LaTeX カウンタが存在することを前提としている ために,単に \let\theorem\Theorem \let\endtheorem\endTheorem のようにコピーした theorem 環境の処理の際には(LaTeX カウンタ theorem が 用意されていないため)\refstepcounter のところでエラーが生じます. %%% この場合には,さらに %%% \let\c@theorem\c@Theorem %%% \let\cl@theorem\cl@Theorem %%% \let\thetheorem\theTheorem %%% \let\p@theorem\p@Theorem %%% という記述を追加して,カウンタ theorem をカウンタ Theorem の別名に %%% することになります. このような例も考えられるので,環境の開始処理・終了処理をコピーする, というのは基本的な考え方としてはそれでいいのですが, それだけではうまくいくとは限らない点にも注意が要ります. %%% まあ,あたりまえと言えば,そうなのですが… %%% なお,この例で LaTeX が用意している \newtheorem そのものを %%% 用いなかったのは,\newtheorem を用いて定義した環境のコピーは %%% 単純に作っても構わないからです.
この書き込みへの返事: