
Я хотел бы написать макрос scaleblock
, который принимает 2 аргумента title
и content
. Его можно вызвать так:
\begin{scaleblock}{a_title}
a_content
\end{scaleblock}
И это эквивалентно следующему:
\begin{block}{\scalebox{0.8}{a_title}}
\scalebox{0.8}{\vbox{a_content}}
\end{block}
Кто-нибудь знает, как написать такой макрос (с \begin
и \end
)?
решение1
Вы можете определить среду так же, как вы бы определили макрос. Только вместо того, чтобы говорить, \newcommand\mycmd[1]{...#1...}
вы должны написать
\newenvironment{myenv}[1]{Begin...#1...}{End}
Здесь последние два параметра говорят о том, что следует поместить до и после содержимого.
Это означает, что первой попыткой будет написать
\newenvironment{scaleblock}[1]{\begin{block}{\scalebox{0.4}{#1}}
\scalebox{0.4}{\vbox{}%
{}}
\end{block}}
Но это не отражает предполагаемую вложенность параметров, и на самом деле вы указываете только начальную часть вашего окружения, тогда как конечная часть — это символ новой строки в четвертой строке.
Так что в вашем случае, вероятно, лучше сначала собрать все внутри тела окружения, а затем использовать его. Это можно сделать с помощью пакета environ
. Он предоставляет команду \NewEnviron
, которую вы можете использовать \BODY
для доступа к этому содержимому. Предполагая, block
что это тот из beamer
, вы можете сделать следующее:
\usepackage{environ}
\NewEnviron{scaleblock}[1]{\begin{block}{\scalebox{0.8}{#1}}
\scalebox{0.8}{\vbox{\BODY}}
\end{block}}
решение2
Вот версия «чистого LaTeX»:
\newsavebox{\scaleblockbox}
\newenvironment{scaleblock}[1]
{\begin{block}{\scalebox{0.8}{#1}
\begin{lrbox}{\scaleblockbox}
\begin{minipage}{\textwidth}}
{\end{minipage}
\end{lrbox}
\scalebox{0.8}{\usebox{\scaleblockbox}}
\end{block}}
решение3
У вас больше контроля с помощью клавиш:
\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}}%
}
Это может быть использовано как:
\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}
РЕДАКТИРОВАТЬ (2012/08/23)
Приведенный выше код основан на версиисчитыватель ключейпакет, которого нет на CTAN. Вот решение, основанное на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}