You have greater control with keys:
\krdmakekeys[
prefix=KV,
family=collectbody,
hp=mp,
initialize,
endlinechar=-1
]{%
cmd/title//,
zcmd/title scale/1,
zcmd/body scale/1,
cmd/width/\textwidth,
zcmd/title text style//,
zcmd/body text style//,
cmd/action//
}
\newsavebox{\boxbody}
\newenvironment{collectbody}[1][]{%
\krdusekeys[prefix=KV,family=collectbody]{#1}%
\ifx\mptitle\@empty\else\krdafterfi
\begin{center}%
\scalebox{\mptitlescale}{\mptitletextstyle\mptitle}%
\end{center}%
\fi
\begin{lrbox}{\boxbody}%
\begin{minipage}{\mpwidth}%
\mpbodytextstyle\mpaction
}{%
\end{minipage}%
\end{lrbox}%
\scalebox{\mpbodyscale}{\usebox{\boxbody}}%
}
This may be used as:
\documentclass{article}
\usepackage[dvipsname]{xcolor}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{collectbody}[
title=Example of collect body,
title scale=.8,
title text style=\ttfamily\color{red}
]
\lipsum[1]
\end{collectbody}
\end{document}
EDIT (2012/08/23)
The above code is based on a version of keyreader package that isn't on CTAN. Here is a solution based on pgfkeys.
\documentclass{standalone}
\usepackage[dvipsname]{xcolor}
\usepackage{graphicx}
\usepackage{pgfkeys}
\usepackage{lipsum}
\makeatletter
\def\pgfkeysafterfi#1\fi{\fi#1}
\def\pgfkeysafterelse@i#1\else#2\fi{\fi#1}
\def\pgfkeysifkeydefined#1#2#3{%
\ifcsname pgfk@#1/.@cmd\endcsname
\pgfkeysafterelse@i{#2}\else\pgfkeysafterfi{#3}\fi
}
\pgfkeys{
/handlers/.protected estore in/.code=
\pgfkeys{
\pgfkeyscurrentpath/.code=\protected@edef#1{##1}
},
/handlers/.default and initial/.code=
\pgfkeys{
\pgfkeyscurrentpath/.initial=#1,
\pgfkeyscurrentpath/.default=#1,
\pgfkeyscurrentpath=#1%
},
/handlers/.new key/.code 2 args=
\pgfkeysifkeydefined{\pgfkeyscurrentpath}{%
\@latexerr{Key '\pgfkeyscurrentpath' already exists}\@ehd
}{%
\pgfkeys{
\pgfkeyscurrentpath/.store in=#1,
\pgfkeyscurrentpath/.default and initial=#2%
}%
}%
}
\pgfkeys{%
/collectbody/.is family,/collectbody/.cd,
title/.new key=\mptitle\@empty,
title scale/.new key=\mptitlescale{1},
body scale/.new key=\mpbodyscale{1},
width/.new key=\mpwidth\textwidth,
title text style/.new key=\mptitletextstyle\@empty,
body text style/.new key=\mpbodytextstyle\@empty,
action/.new key=\mpaction\@empty
}
\def\@@empty{\@empty}
\newsavebox{\boxbody}
\newenvironment{collectbody}[1][]{%
\pgfkeys{/collectbody/.cd,#1}%
\ifx\mptitle\@@empty\else\pgfkeysafterfi
\begin{center}%
\scalebox{\mptitlescale}{\mptitletextstyle\mptitle}%
\end{center}%
\fi
\begin{lrbox}{\boxbody}%
\begin{minipage}{\mpwidth}%
\mpbodytextstyle\mpaction
}{%
\end{minipage}%
\end{lrbox}%
\scalebox{\mpbodyscale}{\usebox{\boxbody}}%
}
\makeatother
% Example:
\begin{document}
\begin{collectbody}[
title=Example of \texttt{collect body} environment,
title scale=.8,
title text style=\scshape\color{red}
]
\lipsum[1]
\end{collectbody}
\end{document}
\newenvironment
. Look here for previous answer. tex.stackexchange.com/questions/60079/…\newenvironment
is yourt friend.\newenvironment
can suffice. I believe that\NewEnviron
fromenviron
package is needed, as suggested in cannaerus'es answer.lrbox
. Other than that, I agree that egreg's solution is elegant and efficient!