From bbaaccee05e7f1de7db31d4d2b56b8fff1f28d85 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 21 Dec 2010 23:56:23 +0000 Subject: productbox 1.0 (21dec10) git-svn-id: svn://tug.org/texlive/trunk@20820 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/latex/productbox/productbox.dtx | 1423 ++++++++++++++++++++ 1 file changed, 1423 insertions(+) create mode 100644 Master/texmf-dist/source/latex/productbox/productbox.dtx (limited to 'Master/texmf-dist/source/latex/productbox/productbox.dtx') diff --git a/Master/texmf-dist/source/latex/productbox/productbox.dtx b/Master/texmf-dist/source/latex/productbox/productbox.dtx new file mode 100644 index 00000000000..78add9542f5 --- /dev/null +++ b/Master/texmf-dist/source/latex/productbox/productbox.dtx @@ -0,0 +1,1423 @@ +%%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%^^A $Id: productbox.dtx 8332 2010-12-20 22:22:36Z gene $ +%%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\iffalse +%% Purpose: +%% productbox.dtx provides a style file for typesetting a +%% three-diemnsional product box. This product box can be rendered +%% as it is standing on a surface and some light is shed onto it. +%% Alternatively it can be typeset as a wireframe to be cut out +%% and glued together. This will lead to a physical product box. +%% +%% Documentation: +%% The documentation can be generated from the original file +%% productbox.dtx with the doc style/package. LaTeX the file +%% productbox.tex to get the full documentation in pdf format. +%% +%% Prerequisite: +%% This package needs PGF and TikZ to be present at least in +%% version 2.0. +%% +%% Author: Gerd Neugebauer +%% Im Lerchelsb\"ohl 5 +%% 64521 Gro\ss-Gerau +%% Mail: gene@gerd-neugebauer.de +%% +%% Copyright (C) 2010 Gerd Neugebauer +%% +%% productbox.dtx is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY. No author or distributor accepts +%% responsibility to anyone for the consequences of using it or for +%% whether it serves any particular purpose or works at all, unless +%% he says so in writing. +%% +%% Everyone is granted permission to copy, modify and redistribute +%% productbox.dtx, provided this copyright notice is preserved and +%% any modifications are indicated. +%% +%\fi +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \title{A \LaTeX\ Style for +% Typesetting a Three-Dimensional Product Box\thanks{This file% +% documents \filename\ version \fileversion\ as of \filedate.}} +% \author{Gerd Neugebauer\\\small +% Im Lerchelsb\"ohl 5\\\small +% 64521 Gro\ss-Gerau (Germany)\\\small +% Email: \texttt{gene@gerd-neugebauer.de}} +% +% \date{{\footnotesize Documentation date: \docdate}} +% +% \maketitle +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \changes{1.0}{2010/12/20}{First public release.} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \DoNotIndex{\ ,\",\',\.,\[,\\,\],\^,\`,\~,\@,\@dottedtocline} +% \DoNotIndex{\@gobble,\@gobbletwo,\@highpenalty,\@ifnextchar,\@ifstar} +% \DoNotIndex{\@ifundefined,\@namedef,\@nameuse,\@pnumwidth,\@startsection} +% \DoNotIndex{\@starttoc,\@tempdima,\@thefnmark,\@undefined} +% \DoNotIndex{\@ixpt,\@vpt,\@vipt,\@viipt,\@viiipt} +% \DoNotIndex{\@xpt,\@xipt,\@xiipt,\@xivpt,\@xvii,\@xxpt,\@xxvpt} +% \DoNotIndex{\AA,\AE} +% \DoNotIndex{\CurrentOption,\DeclareOption,\H,\L,\LARGE,\LaTeX,\Large} +% \DoNotIndex{\LoadClass,\O,\OE,\OptionNotUsed,\PassOptionsToClass} +% \DoNotIndex{\ProcessOptions,\ProvidesClass,\RequirePackage,\TeX} +% \DoNotIndex{\aa,\addcontentsline,\addpenalty,\advance,\addvspace,\ae} +% \DoNotIndex{\ast,\arabic} +% \DoNotIndex{\b,\baselineskip,\begin,\begingroup,\bf,\bgroup,\egroup} +% \DoNotIndex{\bigskip,\box,\bullet} +% \DoNotIndex{\c,\cal,\catcode,\chardef,\circ,\clearpage,\closein,\closeout} +% \DoNotIndex{\clubpenalty,\csname} +% \DoNotIndex{\d,\def,\dimen,\diamond,\divide,\documentclass,\dp} +% \DoNotIndex{\else,\em,\empty,\end,\endcsname,\endgroup,\endinput,\endlist} +% \DoNotIndex{\expandafter,\fbox,\fi,\footskip,\framebox,\frenchspacing} +% \DoNotIndex{\futurelet,\gdef,\global,\gobble} +% \DoNotIndex{\hangafter,\hangindent,\hbox,\headheight,\headsep,\hfil} +% \DoNotIndex{\hfill,\hrule,\hskip,\hspace,\hss,\ht,\huge,\ifcat,\ifeof} +% \DoNotIndex{\ifdim,\ifx,\ignorespaces,\immediate,\index,\input,\it} +% \DoNotIndex{\itemindent,\itemsep,\jobname,\kern,\l,\labelsep,\labelwidth} +% \DoNotIndex{\large,\leavevmode,\leftmark,\leftskip,\let,\list} +% \DoNotIndex{\llap,\long,\lower} +% \DoNotIndex{\m@th,\makebox,\magstep,\makeindex,\markboth,\mbox,\medskip} +% \DoNotIndex{\newblock,\newcommand,\newcount,\newenvironment,\newfont} +% \DoNotIndex{\newif,\newpage,\newread,\newwrite} +% \DoNotIndex{\nobreak,\noindent,\normalsize,\null,\o,\oe} +% \DoNotIndex{\openin,\openout,\or,\pagestyle,\par,\paragraph,\parbox} +% \DoNotIndex{\parfillskip,\parindent,\parsep,\parskip,\partopsep} +% \DoNotIndex{\penalty,\quad} +% \DoNotIndex{\raggedbottom,\raise,\relax,\renewcommand,\renewenvironment} +% \DoNotIndex{\rightskip,\rm,\rule} +% \DoNotIndex{\sbox,\sc,\setcounter,\settowidth,\sf,\sfcode,\sl} +% \DoNotIndex{\sloppy,\small,\space,\ss,\string,\symbol} +% \DoNotIndex{\t,\tenex,\textstyle,\the,\thepage,\thispagestyle} +% \DoNotIndex{\topmargin,\topsep,\tt,\typeout} +% \DoNotIndex{\u,\unitlength,\usecounter,\v,\varepsilon,\vbox} +% \DoNotIndex{\vfill,\vsize,\vskip,\vspace,\vss} +% \DoNotIndex{\wd,\widowpenalty,\write,\xdef,\z@} +% \DoNotIndex{\usetikzlibrary,\usepackage,\tikzfading,\setkeys} +% \DoNotIndex{\setbox,\scalebox,\pgftransformyslant,\pgftransformyshift} +% \DoNotIndex{\pgftransformyscale,\pgftransformxslant,\pgftransformxshift} +% \DoNotIndex{\pgftransformxscale,\pgfsetcornersarced,\pgfpoint} +% \DoNotIndex{\newbox,\ignorespacesafterend,\foreach,\filldraw} +% \DoNotIndex{\fill,\errmessage,\draw,\define@key,\copy,\clip} +% \DoNotIndex{\RecordChanges,\ProvidesPackage,\NeedsTeXFormat} +% \DoNotIndex{\InputIfFileExists,\EnableCrossrefs,\DocInput} +% \DoNotIndex{\DeleteShortVerb,\CodelineIndex} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \CheckSum{791} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \begin{abstract} +% \textsf{productbox.dtx} provides a style file for typesetting a +% three-diemnsional product box. This product box can be rendered +% as it is standing on a surface and some light is shed onto it. +% Alternatively it can be typeset as a wireframe to be cut out and +% glued together. This will lead to a physical product box. +% \end{abstract} +% +% \begin{center}% +% \def\PB(#1,#2)#3{ +% \draw[xshift=-.2mm,yshift=.2mm] (#1,#2) node[white,opacity=.9]{#3}; +% \draw[xshift=.2mm,yshift=-.2mm] (#1,#2) node[black,opacity=.9]{#3}; +% \draw (#1,#2) node[blue]{#3}; +% }% +% \begin{ProductBox}[mirror=true,flare=true,scale=.6] +% \begin{Front} +% \shade [top color=yellow!20!red,bottom color=yellow!80!red] +% rectangle (88mm,100mm); +% \PB(44mm,85mm){\Huge\bf Product Box} +% \draw (77mm,90mm) node[circle,fill=white,rotate=330]{\small\bf\fileversion}; +% \draw (44mm,75mm) node{A \LaTeX\ package for just another kind of boxes}; +% +% \foreach \x in {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} { +% \count0=\x \multiply\count0 4 +% \draw [red,line width=.2mm] +% (0mm,0 mm) .. controls (88mm,\the\count0 mm) and (\x mm,66mm) .. +% (88mm,\the\count0 mm); +% \draw [xshift=.4mm,white,line width=.2mm,opacity=.5] +% (0mm,0 mm) .. controls (88mm,\the\count0 mm) and (\x mm,66mm) .. +% (88mm,\the\count0 mm); +% } +% +% \clip (0mm,0mm) .. controls (88mm,64mm) and (16mm,66mm) .. +% (88mm,64mm) -- (88mm,100mm) -- (0mm,100mm) -- cycle; +% \draw (4mm,66mm) node [white!30!black,anchor=north west] { +% \begin{minipage}{160mm}\tt\tiny\raggedright +% +% |\usepackage{productbox}|\\ +% | |\\ +% | |\\ +% |\begin{ProductBox}[scale=.8]|\\ +% | \begin{Front}|\\ +% | \shade [top color=yellow!20!red,bottom color=yellow!80!red]|\\ +% | rectangle (88mm,100mm);|\\ +% | \PB(44mm,85mm){\Huge\bf Product Box}|\\ +% | \draw (77mm,90mm) node[circle,fill=white]{\small\bf\fileversion};|\\ +% | \draw (44mm,75mm) node{A \LaTeX\ package for just another kind of boxes};|\\ +% ||\\ +% | \foreach \x in {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} {|\\ +% | \count0=\x \multiply\count0 4|\\ +% | \draw [red,line width=.2mm]|\\ +% | (0mm,0 mm) .. controls (88mm,\the\count0 mm) and (\x mm,66mm) ..|\\ +% | (88mm,\the\count0 mm);|\\ +% | \draw [xshift=.4mm,white,line width=.2mm,opacity=.5]|\\ +% | (0mm,0 mm) .. controls (88mm,\the\count0 mm) and (\x mm,66mm) ..|\\ +% | (88mm,\the\count0 mm);|\\ +% | }|\\ +% | \clip (0mm,0mm) .. controls (88mm,64mm) and (16mm,66mm) ..|\\ +% | (88mm,64mm) -- (88mm,100mm) -- (0mm,100mm) -- cycle;|\\ +% | \end{Front}|\\ +% | \begin{Top}|\\ +% | \shade [outer color=yellow!20!red,inner color=yellow!80!red]|\\ +% | rectangle (88mm,30mm);|\\ +% | \PB(44mm,15mm){\huge\bf Product Box}|\\ +% | \end{Top}|\\ +% | \begin{Left}|\\ +% | \fill [top color=yellow!20!red,bottom color=yellow!80!red]|\\ +% | rectangle (30mm,100mm);| +% \end{minipage}}; +% \end{Front} +% \begin{Top} +% \shade [outer color=yellow!20!red,inner color=yellow!80!red] +% rectangle (88mm,30mm); +% \PB(44mm,15mm){\huge\bf Product Box} +% \end{Top} +% \begin{Left} +% \fill [top color=yellow!20!red,bottom color=yellow!80!red] +% rectangle (30mm,100mm); +% \PB(15mm,90mm){ +% \begin{minipage}{25mm}\centering +% \Large\bf Product Box +% \end{minipage}} +% \draw (15mm,25mm) node { +% \begin{minipage}{25mm}\sf\tiny\raggedright\parskip=.75ex +% Copyright (C) 2010 Gerd Neugebauer +% +% productbox.dtx is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY. No author or distributor accepts +% responsibility to anyone for the consequences of using it or for +% whether it serves any particular purpose or works at all, unless +% he says so in writing. +% +% Everyone is granted permission to copy, modify and redistribute +% productbox.dtx, provided this copyright notice is preserved and +% any modifications are indicated. +% \end{minipage}}; +% \end{Left} +% \end{ProductBox} +% \end{center} +% +% \newpage +% \tableofcontents +% \newpage +% +% \section{The User Interface} +% +% This style is based on Ti\emph{k}Z and \textsc{pgf} at least in +% version 2.0. It is best used with a \LaTeX\ variant which is able +% to produce PDF. If no proper tool chain is used then some of the +% effects should not be used. +% +% +% \DescribeEnv{ProductBox} +% The envrionment |ProductBox| provides the central means for +% producing a product box. The contents is used to define the +% appearance of the faces. Finally the selected type of output is +% produced. +% +% {\footnotesize\tt +% |\begin{ProductBox}|\\ +% | \begin{Front}|\\ +% | \shade [bottom color=white!30!blue,top color=white]|\\ +% | (0mm,0mm) rectangle (88mm,100mm);|\\ +% | \draw (44mm,50mm) node{{\Huge Product Box}};|\\ +% | \end{Front}|\\ +% | \begin{Back}|\\ +% | \shade [top color=yellow!30!red,bottom color=white]|\\ +% | (0mm,0mm) rectangle (88mm,100mm);|\\ +% | \draw (44mm,50mm) node{{\large Back}};|\\ +% | \end{Back}|\\ +% | \begin{Top}|\\ +% | \shade [outer color=white!30!red,inner color=white]|\\ +% | (0mm,0mm) rectangle (88mm,30mm);|\\ +% | \draw (44mm,15mm) node{{\large Top}};|\\ +% | \end{Top}|\\ +% | \begin{Bottom}|\\ +% | \fill [outer color=red,inner color=black]|\\ +% | (0mm,0mm) rectangle (88mm,30mm);|\\ +% | \draw (44mm,15mm) node{{\large Bottom}};|\\ +% | \end{Bottom}|\\ +% | \begin{Left}|\\ +% | \fill [left color=green,right color=yellow]|\\ +% | (0mm,0mm) rectangle (30mm,100mm);|\\ +% | \draw (15mm,50mm) node{{\large Left}};|\\ +% | \end{Left}|\\ +% | \begin{Right}|\\ +% | \fill [left color=white,right color=black]|\\ +% | (0mm,0mm) rectangle (30mm,100mm);|\\ +% | \draw (15mm,50mm) node{{\large Right}};|\\ +% | \end{Right}|\\ +% |\end{ProductBox}| +% } +% +% \def\sample[#1]{% +% \begin{ProductBox}[scale=.25,#1] +% \begin{Front} +% \shade [bottom color=white!30!blue,top color=white] (0mm,0mm) rectangle (88mm,100mm); +% \draw (44mm,50mm) node{{\Huge Product Box}}; +% \end{Front} +% \begin{Back} +% \shade [top color=yellow!30!red,bottom color=white] (0mm,0mm) rectangle (88mm,100mm); +% \draw (44mm,50mm) node{{\large Back}}; +% \end{Back} +% \begin{Top} +% \shade [outer color=white!30!red,inner color=white] (0mm,0mm) rectangle (88mm,30mm); +% \draw (44mm,15mm) node{{\large Top}}; +% \end{Top} +% \begin{Bottom} +% \fill [outer color=red,inner color=black] (0mm,0mm) rectangle (88mm,30mm); +% \draw (44mm,15mm) node{{\large Bottom}}; +% \end{Bottom} +% \begin{Left} +% \fill [left color=green,right color=yellow] (0mm,0mm) rectangle (30mm,100mm); +% \draw (15mm,50mm) node{{\large Left}}; +% \end{Left} +% \begin{Right} +% \fill [left color=white,right color=black] (0mm,0mm) rectangle (30mm,100mm); +% \draw (15mm,50mm) node{{\large Right}}; +% \end{Right} +% \end{ProductBox}% +% } +% +% \newcommand\SampleEnv[1]{\noindent\par +% \fcolorbox{red!30!black}{yellow!30!white}{\begin{minipage}[b]{.98\textwidth}\footnotesize\tt +% \textcolor{blue}{\char92begin}\char123#1\char125\\ +% \hspace*{2em}...\\ +% \textcolor{blue}{\char92end}\char123#1\char125 +% \end{minipage}}\par} +% +% \subsection{Content of the Environment} +% +% The content of the environment is simply evaluated. It can +% contain any code you like. Useful for the production of a product +% box are some inner environments. They are called \texttt{Front}, +% \texttt{Back}, \texttt{Left}, \texttt{Right}, \texttt{Top}, and +% \texttt{Bottom}. They are defined inside the main +% environment only. Those environments can be used to specify the +% contenzs of the respective faces of the box. +% +% Note that in the three-dimensional rendering will show at most +% three of the faces. It doies not hurt to define all of them, even +% if they are not shown at all. +% +% \DescribeEnv{Front} +% The environment \texttt{Front} is used to define the content of +% the font face. The environment prosesses its contents inside a +% \texttt{tikzpikture} of the default size 88mm$\times$100mm. +% Usually anything outside of this range is clipped. +% +% \SampleEnv{Front} +% +% \DescribeEnv{Back} +% The environment \texttt{Back} is used to define the content of +% the back face. The environment prosesses its contents inside a +% \texttt{tikzpikture} of the default size 88mm$\times$100mm. +% Usually anything outside of this range is clipped. +% +% \SampleEnv{Back} +% +% \DescribeEnv{Left} +% The environment \texttt{Left} is used to define the content of +% the left face, i.e. the face left to the front page. The +% environment prosesses its contents inside a \texttt{tikzpikture} +% of the default size 30mm$\times$100mm. Usually anything outside +% of this range is clipped. +% +% \SampleEnv{Left} +% +% \DescribeEnv{Right} +% The environment \texttt{Right} is used to define the content of +% the right face, i.e. the face right to the front page. The +% environment prosesses its contents inside a \texttt{tikzpikture} +% of the default size 30mm$\times$100mm. Usually anything outside of this +% range is clipped. +% +% \SampleEnv{Right} +% +% \DescribeEnv{Top} +% The environment \texttt{Top} is used to define the content of the +% top face. The environment prosesses its contents inside a +% \texttt{tikzpikture} of the default size 88mm$\times$30mm. Usually +% anything outside of this range is clipped. +% +% \SampleEnv{Top} +% +% \DescribeEnv{Bottom} +% The environment \texttt{Bottom} is used to define the content of the +% top face. The environment prosesses its contents inside a +% \texttt{tikzpikture} of the default size 88mm$\times$30mm. Usually +% anything outside of this range is clipped. +% +% \SampleEnv{Bottom} +% +% +% \subsection{Settings and Options of the Environment} +% +% The environment \texttt{ProductBox} can take some options to +% influence the appearance of the product box. Those options are +% comma separated. +% +% \def\CODE#1{ +% \noindent +% \fcolorbox{red!30!black}{yellow!30!white}{\begin{minipage}[b]{.98\textwidth}\footnotesize\tt +% #1 +% \end{minipage}\medskip\par +% }}% +% \CODE{\textcolor{blue}{\char92begin}\char123ProductBox\char125[shape=3d]} +% +% The settings are local to the environment. If an option is not +% set then the fallback from the global settings are used. +% +% \DescribeMacro{\ProductBoxSet} +% The macro |\ProductBoxSet| modify the global setting of the +% product box style. The arguments are the same like the optional +% arguments of the environment \texttt{ProductBox} -- but enclosed +% in braces instead of brackets. +% +% \CODE{\char92ProductBoxSet\char123shape=3d\char125 } +% +% The following options can be used to influence the result of the product +% box. +% +% \def\SAMPLE[#1]{ +% \noindent +% \fcolorbox{red!30!black}{yellow!30!white}{\begin{minipage}[b]{.44\textwidth}\footnotesize\tt +% \def\x{#1}% +% \def\e{}% +% \textcolor{blue}{\char92begin}\char123ProductBox\char125 \ifx\x\e\else\textcolor{red}{[#1]}\fi\\ +% \hspace*{2em}\textcolor{blue}{\char92begin}\char123Front\char125\\ +% \hspace*{4em}...\\ +% \hspace*{2em}\textcolor{blue}{\char92end}\char123Front\char125\\ +% \hspace*{2em}\textcolor{blue}{\char92begin}\char123Left\char125\\ +% \hspace*{4em}...\\ +% \hspace*{2em}\textcolor{blue}{\char92end}\char123Left\char125\\ +% \hspace*{2em}...\\ +% \textcolor{blue}{\char92end}\char123ProductBox\char125 +% \end{minipage}}\hfill +% \begin{minipage}[b]{.54\textwidth}\hfill +% \sample[#1] +% \end{minipage}\medskip\par +% }% +% +% +% \DescribeMacro{style} +% The box style determines, how the box is drawn. Several rendering +% functions are provided to produce different effects. Any value is +% accepted. Nevertheless unknown box styles will lead to an error message. +% +% \SAMPLE[style=3D] +% +% \DescribeMacro{3D} +% The box style \texttt{3D} is the default. It produces a +% three-dimensional box rendering with a drop shadow. The option +% \texttt{3D} is an abbreviation for \texttt{style=3D}. It can also be +% written as \texttt{3d} or \texttt{3D}. +% +% \SAMPLE[] +% +% \DescribeMacro{shadow} +% The option \texttt{shadow} controls the drawing of the drop shadow in the +% 3D rendering. It is a boolean value taking the values |true| and +% |false|. The default value is |true|. +% +% The option \texttt{shadow} is the abbreviation for |shadow=true|. +% +% \SAMPLE[shadow=false] +% +% \DescribeMacro{mirror} +% The option \texttt{mirror} controls the rendering of the mirror effect in +% the 3D rendering. It is a boolean value taking the values |true| and +% |false|. The default value is |false|. +% +% The option \texttt{mirror} is the abbreviation for |mirror=true|. +% +% \SAMPLE[mirror=true] +% +% \DescribeMacro{flare} +% The option \texttt{flare} controls the rendering of the flare effect in +% the 3D rendering. It is a boolean value taking the values |true| and +% |false|. The default value is |false|. +% +% The option \texttt{flare} is the abbreviation for |flare=true|. +% +% \SAMPLE[flare=true] +% +% \DescribeMacro{fold} +% The option \texttt{fold} switches to the box style for rendering a +% complete wire frame with all faces in place. The option +% \texttt{fold} is an abbreviation for \texttt{style=fold}. +% +% \SAMPLE[fold] +% +% \DescribeMacro{front} +% The option \texttt{front} switches to the box style for rendering the +% front face only. The option \texttt{front} is an abbreviation for +% \texttt{style=front}. +% +% \SAMPLE[front] +% +% \DescribeMacro{back} +% The option \texttt{back} switches to the box style for rendering the +% back face only. The option \texttt{back} is an abbreviation for +% \texttt{style=back}. +% +% \SAMPLE[back] +% +% \DescribeMacro{left} +% The option \texttt{left} switches to the box style for rendering the +% back face only. The option \texttt{left} is an abbreviation for +% \texttt{style=left}. +% +% \SAMPLE[left] +% +% \DescribeMacro{right} +% The option \texttt{right} switches to the box style for rendering the +% back face only. The option \texttt{right} is an abbreviation for +% \texttt{style=right}. +% +% \SAMPLE[right] +% +% \DescribeMacro{top} +% The option \texttt{top} switches to the box style for rendering the +% back face only. The option \texttt{top} is an abbreviation for +% \texttt{style=top}. +% +% \SAMPLE[top] +% +% \DescribeMacro{bottom} +% The option \texttt{bottom} switches to the box style for rendering the +% back face only. The option \texttt{bottom} is an abbreviation for +% \texttt{style=bottom}. +% +% \SAMPLE[bottom] +% +% \DescribeMacro{scale} +% The option \texttt{scale} controlls the scaling of the whole rendering. +% It is a number where 1. represents the original size.\footnote{The +% examples on the right side are normally rendered with a scale of 0.25.} +% +% \SAMPLE[scale=.1] +% +% \DescribeMacro{view} +% The option |view| takes a name of a view definition and activates +% the appropriate settings. A few views are predefined. The default +% value is |1|. +% +% \SAMPLE[view=1] +% +% \SAMPLE[view=2] +% +% \SAMPLE[view=3] +% +% \DescribeMacro{width} +% The option |width| takes a dimension denoting the width of the box. The +% default value is 88mm. +% +% \DescribeMacro{height} +% The option |height| takes a dimension denoting the height of the box. The +% default value is 100mm. +% +% \DescribeMacro{depth} +% The option |depth| takes a dimension denoting the depth of the box. The +% default value is 30mm. +% +% \DescribeMacro{clip} +% The option \texttt{clip} controls the clipping of the faces to their +% defined size. If it is turned off then the faces can be oversized +% leading to strange effects. It is a boolean value taking the +% values |true| and |false|. The default value is |true|. +% +% +% \StopEventually +% +% \newpage +% \section{The Documentation Driver} +% +% The documentation driver changes \textsf{productbox.dtx} into a +% self-extracting documentation. Thus it is possible to run +% \LaTeX{} on \textsf{productbox.dtx} to produce the documentation. +% +% The documentation can be adapted in a file named productbox.dcf +% (documentation configuration). This file can contain instructions +% for |docstrip|. Especially useful might be the instruction +% +% |\OnlyDescription| +% +% which supresses the generation of the implementation description. +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\InputIfFileExists{productbox.dcf}{}{} +\usepackage{productbox} +\usepackage{moreverb} +\RecordChanges +\EnableCrossrefs +\CodelineIndex +\setcounter{IndexColumns}2 +\parindent=0pt +\parskip=1ex plus .5ex minus .25ex +\begin{document} +\DocInput{productbox.dtx} +\end{document} +% +% \end{macrocode} +% +% \section{The Implementation} +% +% The implementation contains the code of the style. +% +% \subsection{The Version Information} +% +% The following lines define the version information for the class +% file. +% +% \begin{macrocode} +%<*class> +\begingroup + \def\ProductBox@VC$#1: #2 #3${#2} + \def\ProductBox@VCdate$#1: #2-#3-#4 #5${#2/#3/#4} + \xdef\fileversion{1.0} + \xdef\filerevision{\ProductBox@VC$Revision: 8332 $} + \xdef\filedate{\ProductBox@VCdate$Date: 2010-12-20 23:22:36 +0100 (Mo, 20 Dez 2010) $} + \xdef\filename{productbox.dtx} +\endgroup +\let\docversion=\fileversion +\let\docdate=\filedate +% +% \end{macrocode} +% +% +% \subsection{Getting Started} +% +% First we have to determine that the right kind of \LaTeX{} is +% running and identify style file. +% +% \begin{macrocode} +%<*class> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{productbox}[\filedate Another type of boxes...] +% \end{macrocode} +% +% A bunch of packages is loaded to form the base of the work herein. +% \begin{macrocode} +\RequirePackage{keyval} +\RequirePackage{pgf} +\RequirePackage{tikz} +\usetikzlibrary{calc} +\usetikzlibrary{fadings} +% \end{macrocode} +% +% \subsection{Parameters} +% +% The parameters are stored to be used later. Here the built-in defaults +% are defined. +% +% The boolean \texttt{ProductBox@shadow} determines whether or not the +% shadow in the 3d rendering is shown. +% \begin{macrocode} +\newif\ifProductBox@shadow\ProductBox@shadowtrue +% \end{macrocode} +% +% The boolean \texttt{ProductBox@mirror} determines whether or not the +% mirror effect in the 3d rendering is shown. +% \begin{macrocode} +\newif\ifProductBox@mirror +% \end{macrocode} +% +% The boolean \texttt{ProductBox@flare} determines whether or not the +% flare effect in the 3d rendering is shown. +% \begin{macrocode} +\newif\ifProductBox@flare +% \end{macrocode} +% +% The boolean \texttt{ProductBox@clip} determines whether or not the +% additional clipping of the boxes should be enabled. +% \begin{macrocode} +\newif\ifProductBox@clip\ProductBox@cliptrue +% \end{macrocode} +% +% The edge color in the 3D rendering. +% \begin{macrocode} +\newcommand\ProductBox@edgeColor{white} +% \end{macrocode} +% +% The background color for the mirror effect. +% \begin{macrocode} +\newcommand\ProductBox@bgColor{white} +% \end{macrocode} +% +% The default style is the 3D rendering. +% \begin{macrocode} +\newcommand\ProductBox@style{threeD} +% \end{macrocode} +% +% A hook to add some code at the beginning. +% \begin{macrocode} +\newcommand\ProductBox@startOptions{} +% \end{macrocode} +% +% A hook to add some code at the end. +% \begin{macrocode} +\newcommand\ProductBox@endOptions{} +% \end{macrocode} +% +% The color of the additional lines in the fol rendering. +% \begin{macrocode} +\newcommand\ProductBox@foldLine{white!80!black} +% \end{macrocode} +% +% The diameter of the flare. +% \begin{macrocode} +\newcommand\ProductBox@flareDiameter{24mm} +% \end{macrocode} +% +% The width of the box. +% \begin{macrocode} +\newcommand\ProductBox@x{88mm} +% \end{macrocode} +% +% The height of the box. +% \begin{macrocode} +\newcommand\ProductBox@y{100mm} +% \end{macrocode} +% +% The depth of the box. +% \begin{macrocode} +\newcommand\ProductBox@z{30mm} +% \end{macrocode} +% +% Define the parameters for the keyval package. +% \begin{macrocode} +\define@key{ProductBox}{flat}[true]{\def\ProductBox@style{flat}} +\define@key{ProductBox}{fold}[true]{\def\ProductBox@style{fold}} +\define@key{ProductBox}{3d}[true]{\def\ProductBox@style{threeD}} +\define@key{ProductBox}{3D}[true]{\def\ProductBox@style{threeD}} +\define@key{ProductBox}{threeD}[true]{\def\ProductBox@style{threeD}} +\define@key{ProductBox}{top}[true]{\def\ProductBox@style{top}} +\define@key{ProductBox}{bottom}[true]{\def\ProductBox@style{bottom}} +\define@key{ProductBox}{front}[true]{\def\ProductBox@style{front}} +\define@key{ProductBox}{back}[true]{\def\ProductBox@style{back}} +\define@key{ProductBox}{left}[true]{\def\ProductBox@style{left}} +\define@key{ProductBox}{right}[true]{\def\ProductBox@style{right}} +\define@key{ProductBox}{style}{\def\ProductBox@style{#1}} +\define@key{ProductBox}{shadow}[true]{% + \csname ProductBox@shadow#1\endcsname} +\define@key{ProductBox}{mirror}[true]{% + \csname ProductBox@mirror#1\endcsname} +\define@key{ProductBox}{flare}[true]{% + \csname ProductBox@flare#1\endcsname} +\define@key{ProductBox}{edgeColor}{\def\productBox@edgeColor{#1}} +\define@key{ProductBox}{backgroundColor}{\def\ProductBox@bgColor{#1}} +\define@key{ProductBox}{scale}{\def\ProductBox@scale{#1}} +\define@key{ProductBox}{width}{\def\ProductBox@x{#1}} +\define@key{ProductBox}{height}{\def\ProductBox@y{#1}} +\define@key{ProductBox}{depth}{\def\ProductBox@z{#1}} +\define@key{ProductBox}{flareDiameter}{% + \def\ProductBox@flareDiameter{#1}} +\define@key{ProductBox}{view}{\@nameuse{ProductBox@View@#1}} +% \end{macrocode} +% +% \subsection{Internal Storage} +% +% The box |\ProductBox@Front| contains the front material. +% \begin{macrocode} +\newbox\ProductBox@Front +% \end{macrocode} +% +% The box |\ProductBox@Left| contains the left material. +% \begin{macrocode} +\newbox\ProductBox@Left +% \end{macrocode} +% +% The box |\ProductBox@Top| contains the top material. +% \begin{macrocode} +\newbox\ProductBox@Top +% \end{macrocode} +% +% The box |\ProductBox@Right| contains the right material. +% \begin{macrocode} +\newbox\ProductBox@Right +% \end{macrocode} +% +% The box |\ProductBox@Bottom| contains the bottom material. +% \begin{macrocode} +\newbox\ProductBox@Bottom +% \end{macrocode} +% +% The box |\ProductBox@Back| contains the back material. +% \begin{macrocode} +\newbox\ProductBox@Back +% \end{macrocode} +% +% \subsection{Settings} +% +% \begin{macro}{\ProductBoxSet} +% The macro |\ProductBoxSet| defines the global parameters used by +% the environment |ProductBox|. They can be overwritten either +% within a group or in the optional parameter of the environment. +% \begin{macrocode} +\newcommand\ProductBoxSet[1]{\setkeys{ProductBox}{#1}} +% \end{macrocode} +% \end{macro} +% +% \subsection{The Main Environment} +% +% \begin{environment}{ProductBox} +% This is the central environment provided by this style. In the begin code +% only the local environments are initialized and the optional parameters +% are evaluated with the help of the package keyval. +% \begin{macrocode} +\newenvironment{ProductBox}[1][]{% + \setkeys{ProductBox}{#1}% + % + \def\Left{\ProductBox@Start\ProductBox@Left + (\ProductBox@z,\ProductBox@y)}% + \let\endLeft\ProductBox@end + \def\Front{\ProductBox@Start\ProductBox@Front + (\ProductBox@x,\ProductBox@y)}% + \let\endFront\ProductBox@end + \def\Top{\ProductBox@Start\ProductBox@Top + (\ProductBox@x,\ProductBox@z)}% + \let\endTop\ProductBox@end + \def\Bottom{\ProductBox@Start\ProductBox@Bottom( + \ProductBox@x,\ProductBox@z)}% + \let\endBottom\ProductBox@end + \def\Back{\ProductBox@Start\ProductBox@Back + (\ProductBox@x,\ProductBox@y)}% + \let\endBack\ProductBox@end + \def\Right{\ProductBox@Start\ProductBox@Right + (\ProductBox@z,\ProductBox@y)}% + \let\endRight\ProductBox@end + \ignorespacesafterend +}{%--- +% \end{macrocode} +% The main activity is performed in the end code. Since the flexibility of +% the environment is one of its design goals, the expansion of the macro +% |\ProductBo@style| is used to invoke the macro storen in it. +% \begin{macrocode} + \@ifundefined{ProductBox@style@\ProductBox@style}{% + \errmessage{Style '\ProductBox@style' for ProductBox is unknown}% + }{% + \@ifundefined{ProductBox@scale}{% + \@nameuse{ProductBox@style@\ProductBox@style}}{% + \scalebox{\ProductBox@scale}% + {\@nameuse{ProductBox@style@\ProductBox@style}} + }}% + \ignorespacesafterend +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\ProductBox@Start} +% The macro |\ProductBox@Start| starts the environment storing a face. +% \begin{macrocode} +\def\ProductBox@Start#1(#2){% + \global\setbox#1\hbox\bgroup\begin{tikzpicture}% + \ifProductBox@clip \clip (0,0) rectangle (#2); \fi + \ignorespaces + }% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ProductBox@end} +% The macro |\ProductBox@end| ends the environment storing a face. +% \begin{macrocode} +\def\ProductBox@end{\end{tikzpicture}\egroup \ignorespacesafterend} +% \end{macrocode} +% \end{macro} +% +% \subsection{Box Styles} +% +% \begin{macro}{\ProductBox@style@flat} +% This macro defines the sytle \emph{flat} for a product box. +% \begin{macrocode} +\newcommand\ProductBox@style@flat{% + \par\noindent + \hspace*{\ProductBox@z}\kern1mm \copy\ProductBox@Top\\[1ex] + \copy\ProductBox@Left\kern1mm \copy\ProductBox@Front\kern1mm + \copy\ProductBox@Right\kern1mm \copy\ProductBox@Back\\[1ex] + \hspace*{\ProductBox@z}\kern1mm \copy\ProductBox@Bottom\par +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{front}} +% +% \begin{macro}{\ProductBox@style@front} +% This macro defines the sytle \emph{front} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@front{% + \copy\ProductBox@Front +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{back}} +% +% \begin{macro}{\ProductBox@style@back} +% This macro defines the sytle \emph{back} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@back{% + \copy\ProductBox@Back +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{left}} +% +% \begin{macro}{\ProductBox@style@left} +% This macro defines the sytle \emph{left} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@left{% + \copy\ProductBox@Left +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{right}} +% +% \begin{macro}{\ProductBox@style@right} +% This macro defines the sytle \emph{right} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@right{% + \copy\ProductBox@Right +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{top}} +% +% \begin{macro}{\ProductBox@style@top} +% This macro defines the sytle \emph{top} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@top{% + \copy\ProductBox@Top +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{bottom}} +% +% \begin{macro}{\ProductBox@style@bottom} +% This macro defines the sytle \emph{bottom} for a product box. Only this +% one face of the box is shown. +% \begin{macrocode} +\newcommand\ProductBox@style@bottom{% + \copy\ProductBox@Bottom +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{fold}} +% +% \begin{macro}{\ProductBox@style@fold} +% This macro defines the sytle \emph{fold} for a product box. +% \begin{macrocode} +\newcommand\ProductBox@style@fold{% + \begin{tikzpicture} +% \end{macrocode} +% front +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z] + \clip (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@y); + \draw + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Front}; + \draw[\ProductBox@foldLine] + (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@y); + \end{scope} +% \end{macrocode} +% back +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@x, + xshift=\ProductBox@z, + xshift=\ProductBox@z] + \clip (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@y); + \draw + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Back}; + \draw[\ProductBox@foldLine] + (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@y); + \end{scope} +% \end{macrocode} +% top +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z,yshift=\ProductBox@y] + \clip (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@z); + \draw + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Top}; + \draw[\ProductBox@foldLine] + (0mm,0mm) rectangle (\ProductBox@x,\ProductBox@z); + \end{scope} +% \end{macrocode} +% left +% \begin{macrocode} + \begin{scope} + \clip (0mm,0mm) rectangle (\ProductBox@z,\ProductBox@y); + \draw + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Left}; + \draw[\ProductBox@foldLine] + (0mm,0mm) rectangle (\ProductBox@z,\ProductBox@y); + \end{scope} +% \end{macrocode} +% right +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z,xshift=\ProductBox@x] + \clip (0mm,0mm) rectangle (\ProductBox@z,\ProductBox@y); + \draw + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Right}; + \draw[\ProductBox@foldLine] + (0mm,0mm) rectangle (\ProductBox@z,\ProductBox@y); + \end{scope} +% \end{macrocode} +% bottom ear 3 front +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z,yshift=-\ProductBox@z] + \clip (0mm,\ProductBox@z) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- + ($.5*(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm)+.5*(-\ProductBox@z,\ProductBox@z)$) -- + (\ProductBox@x,\ProductBox@z) -- cycle; + \draw (\ProductBox@x,0mm) + node[anchor=south east, + inner sep=0pt]{\copy\ProductBox@Bottom}; + \draw [\ProductBox@foldLine] + (0mm,\ProductBox@z) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- + ($.5*(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm)+.5*(-\ProductBox@z,\ProductBox@z)$) -- + (\ProductBox@x,\ProductBox@z) -- cycle; + \draw ($.5*(\ProductBox@x,\ProductBox@z)-.25*(0mm,\ProductBox@z)$) + node[circle,fill=white!90!black]{\small\sf1}; + \end{scope} +% \end{macrocode} +% bottom ear 1 back +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@x, + xshift=\ProductBox@z, + xshift=\ProductBox@z, + yshift=-\ProductBox@z] + \clip (0mm,0mm) -- + ($.5*(\ProductBox@z,0mm)$) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,-\ProductBox@z)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,0mm)$) -- + (\ProductBox@x,0mm) -- (\ProductBox@x,\ProductBox@z) -- + (0mm,\ProductBox@z) -- cycle; + \draw (0mm,\ProductBox@z) + node[rotate=180,anchor=south east, + inner sep=0pt]{\copy\ProductBox@Bottom}; + \draw[\ProductBox@foldLine] + (0mm,0mm) -- + ($.5*(\ProductBox@z,0mm)$) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,-\ProductBox@z)$) -- + ($(\ProductBox@x,0mm)-.5*(\ProductBox@z,0mm)$) -- + (\ProductBox@x,0mm) -- (\ProductBox@x,\ProductBox@z) -- + (0mm,\ProductBox@z) -- cycle; + \draw ($.25*(\ProductBox@z,\ProductBox@z)$) + node[circle,fill=white!90!black]{\small\sf1}; + \draw ($(\ProductBox@x,0mm)+.25*(-\ProductBox@z,\ProductBox@z)$) + node[circle,fill=white!90!black]{\small\sf1}; + \end{scope} +% \end{macrocode} +% bottom ear 2 right +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z,yshift=-\ProductBox@z] + \clip + (\ProductBox@x,\ProductBox@z) -- + ($(\ProductBox@x,\ProductBox@z)+(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm) + .5*(\ProductBox@z,\ProductBox@z)$) -- + ($(\ProductBox@x,0mm) + .5*(\ProductBox@z,0mm)$) -- + (\ProductBox@x,0mm) -- cycle; + \begin{scope}[xshift=1mm,yshift=1mm] + \draw[xshift=\ProductBox@z,yshift=\ProductBox@z] + (\ProductBox@x,0mm) + node[rotate=90,anchor=south east]{\copy\ProductBox@Bottom}; + \end{scope} + \draw[\ProductBox@foldLine] + (\ProductBox@x,\ProductBox@z) -- + ($(\ProductBox@x,\ProductBox@z)+(\ProductBox@z,0mm)$) -- + ($(\ProductBox@x,0mm) + .5*(\ProductBox@z,\ProductBox@z)$) -- + ($(\ProductBox@x,0mm) + .5*(\ProductBox@z,0mm)$) -- + (\ProductBox@x,0mm) -- cycle; + \draw[xshift=\ProductBox@x] + ($.25*(\ProductBox@z,\ProductBox@z)$) + node[circle,fill=white!90!black]{\small\sf2}; + \end{scope} +% \end{macrocode} +% bottom ear 2 left +% \begin{macrocode} + \begin{scope}[yshift=-\ProductBox@z] + \clip + (0mm,\ProductBox@z) -- (\ProductBox@z,\ProductBox@z) -- + (\ProductBox@z,0mm) -- ($.5*(\ProductBox@z,0mm)$) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- cycle; + \draw (0mm,\ProductBox@z) + node[rotate=270,anchor=south west, + inner sep=0pt]{\copy\ProductBox@Bottom}; + \draw [\ProductBox@foldLine] + (0mm,\ProductBox@z) -- (\ProductBox@z,\ProductBox@z) -- + (\ProductBox@z,0mm) -- ($.5*(\ProductBox@z,0mm)$) -- + ($.5*(\ProductBox@z,\ProductBox@z)$) -- cycle; + \draw ($(\ProductBox@z,0mm)+.25*(-\ProductBox@z,\ProductBox@z)$) + node[circle,fill=white!90!black]{\small\sf2}; + \end{scope} +% \end{macrocode} +% glue ear +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@x, + xshift=\ProductBox@x, + xshift=\ProductBox@z, + xshift=\ProductBox@z,\ProductBox@foldLine] + \clip + (0mm,0mm) -- (6mm,3mm) -- + ($(6mm,\ProductBox@y)-(0mm,3mm)$) -- + (0mm,\ProductBox@y) -- cycle; + \draw node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Left}; + \draw[\ProductBox@foldLine] + (0mm,0mm) -- (6mm,3mm) -- + ($(6mm,\ProductBox@y)-(0mm,3mm)$) -- + (0mm,\ProductBox@y) -- cycle; + \end{scope} +% \end{macrocode} +% top ear left +% \begin{macrocode} + \begin{scope}[yshift=\ProductBox@y] + \clip + (0mm,0mm) -- (6mm,12mm) -- + ($(\ProductBox@z,12mm)-(6mm,0mm)$) + -- (\ProductBox@z,0mm) -- cycle; + \draw + node[rotate=90,anchor=north west, + inner sep=0pt]{\copy\ProductBox@Top}; + \draw[\ProductBox@foldLine] + (0mm,0mm) -- (6mm,12mm) -- + ($(\ProductBox@z,12mm)-(6mm,0mm)$) + -- (\ProductBox@z,0mm) -- cycle; + \end{scope} +% \end{macrocode} +% top ear right +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@x, + xshift=\ProductBox@z, + yshift=\ProductBox@y] + \clip + (0mm,0mm) -- (6mm,12mm) -- + ($(\ProductBox@z,12mm)-(6mm,0mm)$) + -- (\ProductBox@z,0mm) -- cycle; + \draw + node[rotate=270,anchor=south east, + inner sep=0pt]{\copy\ProductBox@Top}; + \draw[\ProductBox@foldLine] + (0mm,0mm) -- (6mm,12mm) -- ($(\ProductBox@z,12mm)-(6mm,0mm)$) + -- (\ProductBox@z,0mm) -- cycle; + \end{scope} +% \end{macrocode} +% top ear back +% \begin{macrocode} + \begin{scope}[xshift=\ProductBox@z, + yshift=\ProductBox@y, + yshift=\ProductBox@z] + \clip + (0mm,0mm) -- (6mm,12mm) -- + ($(\ProductBox@x,12mm)-(6mm,0mm)$) -- + (\ProductBox@x,0mm) -- cycle; + \draw (0mm,\ProductBox@y) + node[rotate=180,anchor=south east, + inner sep=0pt]{\copy\ProductBox@Back}; + \draw[\ProductBox@foldLine] + (0mm,0mm) -- (6mm,12mm) -- + ($(\ProductBox@x,12mm)-(6mm,0mm)$) -- + (\ProductBox@x,0mm) -- cycle; + \end{scope} + \end{tikzpicture}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Box Style \texttt{threeD}} +% +% \begin{macro}{\ProductBox@style@threeD} +% This macro defines the sytle \emph{threeD} for a product box. The +% faces are placed such the illusion of a three-dimensional box +% appears. In addition a shadow is shown if not disabled. +% \begin{macrocode} +\newcommand\ProductBox@style@threeD{ + \begin{tikzpicture}\ProductBox@startOptions + \ifProductBox@mirror \ProductBox@threeD@mirror \fi + \ifProductBox@shadow \ProductBox@threeD@shadow \fi + + \begin{scope} + \fill[white, + yslant=\ProductBox@p@front@yslant, + xscale=\ProductBox@p@front@xscale, + anchor=south west] + rectangle (\ProductBox@x,\ProductBox@y); + \draw + node[yslant=\ProductBox@p@front@yslant, + xscale=\ProductBox@p@front@xscale, + anchor=south west, + inner sep=0pt] {\copy\ProductBox@Front}; + \fill[black, + fill opacity=.025, + yslant=\ProductBox@p@front@yslant, + xscale=\ProductBox@p@front@xscale, + anchor=south west] + rectangle (\ProductBox@x,\ProductBox@y); + \ifProductBox@flare \ProductBox@threeD@flare \fi + \end{scope} + \begin{scope}[shift={($\ProductBox@p@left@yslant + *\ProductBox@p@left@xscale + *(0mm,\ProductBox@z) + -\ProductBox@p@left@xscale + *(\ProductBox@z,0mm)$)}] + \fill[white, + yslant=-\ProductBox@p@left@yslant, + xscale=\ProductBox@p@left@xscale, + anchor=south west] + rectangle (\ProductBox@z,\ProductBox@y); + \draw + node[yslant=-\ProductBox@p@left@yslant, + xscale=\ProductBox@p@left@xscale, + anchor=south west, + inner sep=0pt] {\copy\ProductBox@Left}; + \fill[black, + fill opacity=.25, + yslant=-\ProductBox@p@left@yslant, + xscale=\ProductBox@p@left@xscale, + anchor=south west] rectangle (\ProductBox@z,\ProductBox@y); + \end{scope} + \begin{scope}[yshift=\ProductBox@y] + \fill [white, + xslant=-\ProductBox@p@top@xslant, + yslant=\ProductBox@p@top@yslant, + xscale=\ProductBox@p@top@xscale, + yscale=\ProductBox@p@top@yscale, + anchor=south west] rectangle (\ProductBox@x,\ProductBox@z); + \draw + node[xslant=-\ProductBox@p@top@xslant, + yslant=\ProductBox@p@top@yslant, + xscale=\ProductBox@p@top@xscale, + yscale=\ProductBox@p@top@yscale, + anchor=south west, + inner sep=0pt] {\copy\ProductBox@Top}; + \fill [black, + fill opacity=.0025, + xslant=-\ProductBox@p@top@xslant, + yslant=\ProductBox@p@top@yslant, + xscale=\ProductBox@p@top@xscale, + yscale=\ProductBox@p@top@yscale, + anchor=south west] rectangle (\ProductBox@x,\ProductBox@z); + \end{scope} + \begin{scope}[shift={($\ProductBox@p@left@yslant + *\ProductBox@p@left@xscale + *(0mm,\ProductBox@z) + -\ProductBox@p@left@xscale + *(\ProductBox@z,0mm)$)}] + \draw [\ProductBox@edgeColor, + line width=.5mm, + draw opacity=.25, + yslant=-\ProductBox@p@left@yslant, + xscale=\ProductBox@p@left@xscale] + (\ProductBox@z,0mm) -- + (\ProductBox@z,\ProductBox@y) -- + (0mm,\ProductBox@y); + \end{scope} + \draw [\ProductBox@edgeColor, + line width=.5mm, + draw opacity=.25, + yslant=\ProductBox@p@front@yslant, + xscale=\ProductBox@p@front@xscale, + anchor=south west] + (0mm,\ProductBox@y) -- + (\ProductBox@x,\ProductBox@y); + \ProductBox@endOptions + \end{tikzpicture}} +% \end{macrocode} +% \end{macro} +% +% Parameters +% +% \begin{macrocode} +\newcommand\ProductBox@Set@params[9]{% + \def\ProductBox@p@front@yslant{#1} + \def\ProductBox@p@front@xscale{#2} + \def\ProductBox@p@left@yslant{#3} + \def\ProductBox@p@left@xscale{#4} + \def\ProductBox@p@top@xslant{#5} + \def\ProductBox@p@top@yslant{#6} + \def\ProductBox@p@top@xscale{#7} + \def\ProductBox@p@top@yscale{#8} + \def\ProductBox@p@mirror@yscale{#9} +} +\@namedef{ProductBox@View@1}{ + \ProductBox@Set@params + {.25}{.9090909}% + {.5}{.6666666}% + {2}{.1666666}{1.36363636}{.3333333}% + {.2}} +\@namedef{ProductBox@View@2}{ + \ProductBox@Set@params + {.15}{.9090909}% + {.6666666}{.5}% + {1.5}{.12}{1.11}{.333333}% + {.2}} +\@namedef{ProductBox@View@3}{ + \ProductBox@Set@params + {.05}{.95}% + {.25}{.4}% + {4}{.04}{1.133333}{.1}% + {.2}} +\@nameuse{ProductBox@View@1} +% \end{macrocode} +% +% \begin{macro}{\ProductBox@threeD@shadow} +% This macro defines the code to produce the shadow effect for the 3D rendering. +% \begin{macrocode} +\newcommand\ProductBox@threeD@shadow{ + \begin{scope} + \pgfsetcornersarced{\pgfpoint{2mm}{2mm}} + \foreach \x in {.5,1,1.5,2,2.5,3,4,5,6,8,10} { + \filldraw [black, + line width=\x mm, + opacity=.01, + shift={(-1mm,1mm)}] + (0mm,0mm) -- + (-\ProductBox@p@top@xslant + *\ProductBox@p@left@xscale + *\ProductBox@z, + \ProductBox@p@top@yscale + *\ProductBox@z) -- + (0mm, + \ProductBox@p@top@yscale*\ProductBox@z + + \ProductBox@p@top@xslant + *\ProductBox@p@left@xscale + *\ProductBox@p@top@yslant + *\ProductBox@z) -- + cycle; + } + \end{scope} +} +% \end{macrocode} +% \end{macro} +% +% The following fading is used for the mirror effect in the 3D rendering. +% \begin{macrocode} +\tikzfading[name=ProductBoxFade, + top color=transparent!0, + bottom color=transparent!60] +% \end{macrocode} +% +% The following fading is used for the flare effect in the 3D rendering. +% \begin{macrocode} +\tikzfading[name=ProductBoxFlare, + inner color=transparent!60, + outer color=transparent!100] +% \end{macrocode} +% +% \begin{macro}{\ProductBox@threeD@mirror} +% This macro defines the code to produce the mirror effect. +% \begin{macrocode} +\newcommand\ProductBox@threeD@mirror{% + \begin{pgflowlevelscope}{ + \pgftransformyslant{\ProductBox@p@front@yslant} + \pgftransformyscale{-\ProductBox@p@mirror@yscale} + \pgftransformxscale{\ProductBox@p@front@xscale}} + \begin{scope} + \clip rectangle (\ProductBox@x,50mm); + \fill + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Front}; + \end{scope} + \fill [white,path fading=ProductBoxFade] + rectangle (\ProductBox@x,50.5mm); + \end{pgflowlevelscope} + + \begin{pgflowlevelscope}{ + \pgftransformxshift{-\ProductBox@p@left@xscale*\ProductBox@z} + \pgftransformyshift{\ProductBox@p@top@yscale*\ProductBox@z} + \pgftransformyslant{-\ProductBox@p@left@yslant} + \pgftransformxscale{\ProductBox@p@left@xscale} + \pgftransformyscale{-\ProductBox@p@mirror@yscale}} + \begin{scope} + \clip rectangle (\ProductBox@z,50mm); + \fill + node[anchor=south west, + inner sep=0pt]{\copy\ProductBox@Left}; + \fill[opacity=.25] rectangle (\ProductBox@z,\ProductBox@y); + \end{scope} + \fill [white,path fading=ProductBoxFade] + rectangle (\ProductBox@z,50.5mm); + \end{pgflowlevelscope} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ProductBox@threeD@flare} +% This macro defines the code to produce the flare effect. +% \begin{macrocode} +\newcommand\ProductBox@threeD@flare{ + \fill [white,path fading=ProductBoxFlare] + (.8*\ProductBox@x,.9*\ProductBox@y) + circle(\ProductBox@flareDiameter); +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\@namedef{ProductBox@style@3D}{\ProductBox@style@threeD} +% +% \end{macrocode} +% That's all. +% +% \newpage +% \PrintChanges +% \newpage +% \PrintIndex +% \Finale +\endinput +% +% Local Variables: +% End: -- cgit v1.2.3