
Ich möchte ein Makro schreiben scaleblock
, das 2 Argumente title
und annimmt content
. Es kann wie folgt aufgerufen werden:
\begin{scaleblock}{a_title}
a_content
\end{scaleblock}
Und es ist gleichbedeutend mit Folgendem:
\begin{block}{\scalebox{0.8}{a_title}}
\scalebox{0.8}{\vbox{a_content}}
\end{block}
Weiß jemand, wie man diese Art von Makro (mit \begin
und \end
) schreibt?
Antwort1
Sie können eine Umgebung genauso definieren, wie Sie ein Makro definieren würden. Nur dass \newcommand\mycmd[1]{...#1...}
Sie nicht schreiben müssen:
\newenvironment{myenv}[1]{Begin...#1...}{End}
Hier geben die letzten beiden Parameter an, was vor und nach dem Inhalt stehen soll.
Das bedeutet, dass der erste Versuch darin bestehen würde, zu schreiben
\newenvironment{scaleblock}[1]{\begin{block}{\scalebox{0.4}{#1}}
\scalebox{0.4}{\vbox{}%
{}}
\end{block}}
Dies spiegelt jedoch nicht die beabsichtigte Verschachtelung von Parametern wider und Sie geben tatsächlich nur den Anfangsteil Ihrer Umgebung an, während der Endteil das Zeilenumbruchzeichen in der vierten Zeile ist.
In Ihrem Fall ist es also wahrscheinlich besser, zuerst alles im Körper der Umgebung zu sammeln und es dann zu verwenden. Dies kann mit dem Paket erfolgen environ
. Es stellt den Befehl bereit , mit dem Sie auf diese Inhalte zugreifen \NewEnviron
können . Angenommen , es handelt sich um den von , können Sie Folgendes tun:\BODY
block
beamer
\usepackage{environ}
\NewEnviron{scaleblock}[1]{\begin{block}{\scalebox{0.8}{#1}}
\scalebox{0.8}{\vbox{\BODY}}
\end{block}}
Antwort2
Hier ist eine „reine LaTeX“-Version:
\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}}
Antwort3
Mit den Tasten haben Sie mehr Kontrolle:
\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}}%
}
Dies kann verwendet werden als:
\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}
BEARBEITEN (23.08.2012)
Der obige Code basiert auf einer Version vonSchlüsselleserPaket, das nicht auf CTAN ist. Hier ist eine Lösung basierend aufpgf-Schlüssel.
\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}