How to rescale a pstricks object inside a pspicture?

This is a minimal workable code of my code

\documentclass{article}
\usepackage[paperheight=16cm,paperwidth=21cm,margin=0pt]{geometry}

\pagestyle{empty}

\def\prism{\pspolygon[](0.62,0.62)(4.62,0.62)(4,0)(0,0)} % prism

\begin{document}

\psset{algebraic,xunit=1cm,yunit=1cm}
\noindent
\begin{pspicture}(0,0)(21,16)
\uput[r](0.85,1.2){
\rput(8,10){\psrotate(0,0){0}{\prism}}
}
\end{pspicture}

\end{document}


As you can see, I'm defining a pspolygon before the \begin{document} and then I'm calling it inside the pspicture with a rput command. This allows me to draw the polygon only once and then use it as many times as I want in the picture. I will have to place several of them in my code, some rotated, some translated and the way my code is now I can do it without problem.

The problem is that I want some of the polygons to be larger than others. How can I rescale an object like this \prism inside the pspicture? If, for example, I would like the polygon to be half its size, I'd like a command like

\rput[scale=0.5](8,10){\psrotate(0,0){0}{\prism}}


Can you help me with this?

Thank you.

You can use \psscalebox{<scale>}{<stuff>} to scale <stuff> to the <scale> of your choice:

\documentclass{article}

\def\prism{\pspolygon(0.62,0.62)(4.62,0.62)(4,0)(0,0)} % prism

\begin{document}

\psset{algebraic,unit=1cm}

\begin{pspicture}(0,0)(5,5)
\rput(2,2){\psrotate(0,0){0}{\prism}}
\rput(2,4){\psscalebox{0.5}{\psrotate(0,0){30}{\prism}}}
\rput(4,4){\psset{unit=5mm}\psrotate(0,0){30}{\prism}}
\end{pspicture}

\end{document}


Note the difference between scaling something (which also scales the line width) and adjusting the unit to be 50% of the original unit (maintaining the same line width).

You could define your own macro for adjusting the content. Below I've used xkeyval to define a number of keys for a single macro called \psaction[<options>]{<object>}:

\usepackage{xkeyval}

\makeatletter
\define@cmdkey{psaction}[psaction@]{orotate}{}
\define@cmdkey{psaction}[psaction@]{rotangle}{}
\define@cmdkey{psaction}[psaction@]{scale}{}
\define@cmdkey{psaction}[psaction@]{put}{}
\newcommand{\psaction}[2][]{%
\setkeys{psaction}{%
orotate={(0,0)}, % Default origin of rotation
rotangle=0, % Default angle of rotation
scale=1, % Default scale factor
put={(0,0)}, % Default location for \rput
#1 % Local modifications
}%
\begingroup
\gdef\psaction@object{#2}%
\edef\x{\endgroup
\noexpand\rput\psaction@put{%
\noexpand\psscalebox{\psaction@scale}{%
\noexpand\psrotate\psaction@orotate{\psaction@rotangle}{%
\noexpand\psaction@object}}}}\x
}
\makeatother


For example, you could use

\begin{pspicture}(0,0)(5,5)
% Similar to \rput(2,2){\psrotate(0,0){0}{\prism}}:
\psaction[put={(2,2)}]{\prism}
% Similar to \rput(2,4){\psscalebox{0.5}{\psrotate(0,0){30}{\prism}}}:
\psaction[put={(2,4)},scale=0.5,rotangle=30]{\prism}
\end{pspicture}


Use the optional argument unit=...

\documentclass{article}