Edited at

自由度の高いネスト環境を newenvironment で作る

More than 5 years have passed since last update.

Beamer で、block 環境 + itemize 環境のネストとかが激しいことになってやってられなくなったので、block 環境 + (他の環境) という新しい環境を作りたくなった。やりたいことのイメージはこんな感じ:


expected-custom-environment.tex

\begin{bblock}{itemize}

\item block 環境の下に itemize 環境をネストしたのと同じ
\end{bblock}

ただでさえ frame 環境やら column 環境やら入り乱れてるので、ネストは一段でも浅くしたいところ。書いてるものがスライドなだけに、途中で気が変わって itemize だった所を enumerate にしたくなったりするし、こう書ければかなりの労力削減が見込める(ホンマか)。

# ちなみに block 環境のタイトルをいつも設定し忘れちゃうんだけど、困ったことに \begin{block} hoge \end{block} みたいなのを渡すと platex 先生はスタックが足りないヨ!って怒ってくる。意味が分からない。オプションにして省略時は空ってしてくれればいいのに。

しかし、普通に \newenvironment しようとしてもこれは上手く行かない。


bad-newenvironment.tex

\newenvironment{bblock}[2][]%

{ \pause \begin{block}{#1} \begin{#2} }
{ \end{#2} \end{block} }

実は、引数を使えるのは BEGIN 側のみで END 側では引数を使えないらしい。ということで、どうしても END 側で引数を使いたい場合、無理やり変数に突っ込んで退避させとくという割と無理やりな回避策が。


custom-nested-environment.tex

\makeatletter

\newenvironment{bblock}[2][]%
{\def\@bblocktmp{#2}%
\pause \begin{block}{#1} \begin{\@bblocktmp} }
{ \end{\@bblocktmp} \end{block} }
\makeatother


use-custom-nested-environment.tex

\begin{frame}

\begin{bblock}[タイトルでっせ]{itemize}
\item どうでもいいですが pause コマンドも入れてるのはタダの好みなので
\item いらなきゃ消してください
\item 0は自然数
\end{bblock}

\begin{bblock}{enumerate}
\item タイトルの部分を書き忘れても怒られない!大勝利!
\end{bblock}
\end{frame}


あまり綺麗じゃないけどとりあえずこれで妥協…… あとこれで文書が論理的に綺麗になるかというとそれも微妙なので、bblock は補助にしてそれを使って更に \newenvironment{theorem} みたいなことしてくといいかも?

精進精進〜