diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/pst-poly/pst-poly.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/pst-poly/pst-poly.dtx | 1679 |
1 files changed, 1679 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/pst-poly/pst-poly.dtx b/Master/texmf-dist/source/latex/pst-poly/pst-poly.dtx new file mode 100644 index 00000000000..5b3d427240b --- /dev/null +++ b/Master/texmf-dist/source/latex/pst-poly/pst-poly.dtx @@ -0,0 +1,1679 @@ +% \iffalse meta-comment, etc. +%% +%% Package `pst-poly.dtx' +%% +%% Denis Girou (CNRS/IDRIS - France) <Denis.Girou@idris.fr> +%% Herbert Voss <voss _at_ pstricks.de> +%% +%% Novermber 20, 2004 +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +%% +%% DESCRIPTION: +%% `pst-poly' is a PSTricks package to draw easily various kinds of regular +%% or non regular polygons, with various customizations. +%% +% \fi +% +% \changes{v1.60}{2004/11/20}{new macro pspolygonbox, +% using pst-xkey} +% \changes{v1.50}{2001/02/08}{Standard packaging (.ins + .dtx files).} +% \changes{v1.40}{1998/07/09}{Define `PolyRotation' parameter as a real number +% and not as an angle, to allow to use the macro +% `degrees' before to draw a polygon.} +% \changes{v1.30}{1998/02/06}{Rename `PsPicture' parameter to `PstPicture' for +% consistancy.} +% \changes{v1.20}{1997/06/27}{First public release.} +% +% \DoNotIndex{\\,\%,\@} +% \DoNotIndex{\@eha,\@empty,\@ifnextchar,\@nameuse,\@nil,\@pstrickserr} +% \DoNotIndex{\@tempdimb,\@undefined} +% \DoNotIndex{\advance,\Alph,\begin,\begingroup,\Below@Example,\BS} +% \DoNotIndex{\catcode,\CenterExample,\changes,\clearpage,\CodelineIndex} +% \DoNotIndex{\colorbox,\csname} +% \DoNotIndex{\def,\define@key,\degrees,\divide,\DocInput,\documentclass} +% \DoNotIndex{\edef,\else,\EnableCrossrefs,\end,\endCenterExample} +% \DoNotIndex{\endcsname,\endExample,\endgroup,\endinput,\endpspicture} +% \DoNotIndex{\endSideBySideExample,\Example} +% \DoNotIndex{\fboxsep,\fi,\filedate,\fileversion,\FV@Environment} +% \DoNotIndex{\FV@UseKeyValues,\FV@XRightMargin,\FVB@Example,\fvset} +% \DoNotIndex{\GetFileInfo} +% \DoNotIndex{\hbadness,\hfuzz,\HLEmphasize,\HLMacro,\HLMacro@i} +% \DoNotIndex{\HLReverse,\HLReverse@i,\hspace} +% \DoNotIndex{\i,\if@star,\ifnum,\ifodd,\ifx,\input,\jobname} +% \DoNotIndex{\let,\lineto,\makeatletter,\makeatother,\message,\moveto} +% \DoNotIndex{\multido,\multidocount,\MultidoLoaded,\multiply} +% \DoNotIndex{\n,\newbox,\newcommand,\newcounter,\newdimen,\newif} +% \DoNotIndex{\OnlyDescription} +% \DoNotIndex{\par,\parindent,\pnode,\providecommand,\ProvidesPackage} +% \DoNotIndex{\pscurve,\pscustom,\psdots,\psline,\pspicture,\pspolygon} +% \DoNotIndex{\psset,\pssetlength,\pst@cnta,\pst@getint,\pst@ifstar} +% \DoNotIndex{\PstAtCode,\PSTricksLoaded,\psxunit,\psyunit} +% \DoNotIndex{\RecordChanges,\relax,\rput} +% \DoNotIndex{\savebox,\setcounter,\setlength,\shortstack} +% \DoNotIndex{\SideBySide@Example,\SideBySideExample,\small,\solid@star} +% \DoNotIndex{\space,\SpecialCoor,\Star,\symbol} +% \DoNotIndex{\textbf,\textcolor,\textit,\texttt,\textwidth,\the,\topsep,\tw@} +% \DoNotIndex{\usebox,\usepackage} +% \DoNotIndex{\VerbatimEnvironment,\VerbatimInput,\vskip,\Z} +% +% \setcounter{IndexColumns}{2} +% +% \newcommand{\KeyValPackage}{`\textsf{keyval}'} +% \newcommand{\PstPolygonPackage}{`\textsf{pst-poly}'} +% \newcommand{\PstPolygonMacro}{\cs{PstPolygon}} +% \newcommand{\PstPolygonNodeMacro}{\cs{PstPolygonNode}} +% \newcommand{\XYpic}{% +% \leavevmode\hbox{\kern-.1em X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}-pic}} +% +% ^^A From ltugboat.cls +% +% ^^A Typeset the name of an environment +% \providecommand\env[1]{\textsf{#1}} +% \providecommand\clsname[1]{\textsf{#1}} +% \providecommand\pkgname[1]{\textsf{#1}} +% \providecommand\optname[1]{\textsf{#1}} +% \providecommand\progname[1]{\textsf{#1}} +% +% ^^A A list of options for a package/class +% \newenvironment{optlist}{\begin{description}% +% \renewcommand\makelabel[1]{% +% \descriptionlabel{\mdseries\optname{##1}}}% +% \itemsep0.25\itemsep}% +% {\end{description}} +% +% \makeatletter +% +% ^^A For the references +% \newcommand\acro[1]{\textsc{#1}\@} +% \def\CTAN{\acro{CTAN}} +% \let\texttub\textsl +% \def\TUB{\texttub{TUGboat}} +% +% ^^A From the `ctandir' package from the `ltugboat' package +% ^^A (`ltubguid' on 1997/06/12) +% ^^A Experimental CTAN location information macros for use with Donald +% ^^A Arseneau's |url.sty| +% +% \newcommand\CTANdirectory[1]{\expandafter\urldef +% \csname CTAN@#1\endcsname\path} +% +% ^^A Use the standard label-referencing mechanism to get the warning for +% ^^A an undefined label +% \newcommand\CTANref[1]{\expandafter\@setref\csname CTAN@#1\endcsname +% \relax{#1}} +% +% ^^A Utility macros +% +% ^^A Example macros - adapted from the `fvrb-ex' package +% ^^A --------------------------------------------------- +% +% ^^A Take care that we use here the four /?_Z characters as escape +% ^^A characters, so we can't use these characters in the examples! +% +% ^^A To highlight some verbatim sequences (comments, macro names, etc.) +% \def\HLEmphasize#1{\textit{#1}} +% \newcommand{\BS}{\texttt{\symbol{`\\}}} +% \def\HLMacro#1{\BS{}def\HLMacro@i#1\@nil} +% \def\HLMacro@i#1def#2\@nil{\HLReverse{#2}} +% \def\HLReverse#1{{\setlength{\fboxsep}{1pt}\HLReverse@i{#1}}} +% \def\HLReverse@i#1{\colorbox{black}{\textcolor{white}{\textbf{#1}}}} +% +% \def\Example{\FV@Environment{}{Example}} +% \def\endExample{% +% \end{VerbatimOut} +% \Below@Example{\input{\jobname.tmp}} +% \endgroup} +% +% \def\CenterExample{\FV@Environment{}{Example}} +% \def\endCenterExample{% +% \end{VerbatimOut} +% \begin{center} +% \Below@Example{\input{\jobname.tmp}} +% \end{center} +% \endgroup} +% +% \def\SideBySideExample{\FV@Environment{}{Example}} +% \def\endSideBySideExample{% +% \end{VerbatimOut} +% \SideBySide@Example{\input{\jobname.tmp}} +% \endgroup} +% +% \def\FVB@Example{% +% \begingroup +% \FV@UseKeyValues +% \parindent=0pt +% \multiply\topsep by 2 +% \VerbatimEnvironment +% \begin{VerbatimOut}[gobble=4,codes={\catcode`\Z=12}]{\jobname.tmp}} +% +% \def\Below@Example#1{% +% \VerbatimInput[gobble=0,commentchar=Z,commandchars=/?_,frame=single, +% numbers=left,numbersep=3pt]{\jobname.tmp} +% \catcode`\%=14\relax +% \catcode`\Z=9\relax +% ^^A We suppress the effect of the highlighting macros +% \catcode`/=0\relax +% \catcode`?=1\relax +% \catcode`_=2\relax +% \def\HLEmphasize##1{##1}% +% \def\HLMacro##1{##1}% +% \def\HLReverse##1{##1}% +% #1 +% \par} +% +% \def\SideBySide@Example#1{% +% \vskip 1mm +% \@tempdimb=\FV@XRightMargin +% \advance\@tempdimb -5mm +% \begin{minipage}[c]{\@tempdimb} +% \fvset{xrightmargin=0pt} +% \catcode`\%=14\relax +% \catcode`\Z=9\relax +% ^^A We suppress the effect of the highlighting macros +% \catcode`/=0\relax +% \catcode`?=1\relax +% \catcode`_=2\relax +% \def\HLEmphasize##1{##1}% +% \def\HLMacro##1{##1}% +% \def\HLReverse##1{##1}% +% #1 +% \end{minipage}% +% \@tempdimb=\textwidth +% \advance\@tempdimb -\FV@XRightMargin +% \advance\@tempdimb 5mm +% \begin{minipage}[c]{\@tempdimb} +% \VerbatimInput[gobble=0,commentchar=Z,commandchars=/?_, +% frame=single,numbers=left,numbersep=3pt, +% xleftmargin=5mm,xrightmargin=0pt]{\jobname.tmp} +% \end{minipage} +% \vskip 1mm} +% +% \makeatother +% +% ^^A End of example macros from `fvrb-ex' +% +% ^^A Define CTAN addresses using the commands of the |ctandir| package +% \CTANdirectory{pstricks}{graphics/pstricks} +% \CTANdirectory{xypic}{macros/generic/diagrams/xypic} +% +% ^^A For the possible index and changes log +% \setlength{\columnseprule}{0.6pt} +% +% ^^A Beginning of the documentation itself +% +% \title{The \PstPolygonPackage{} package\\A PSTricks package for polygons} +% \author{Denis \textsc{Girou}\thanks{CNRS/IDRIS --- +% Centre National de la Recherche Scientifique / +% Institut du D\'eveloppement et des Ressources en Informatique +% Scientifique --- Orsay --- France --- +% \mbox{\texttt{<Denis.Girou@idris.fr>}}.}} +% \date{\today\\ +% {\small Documentation revised November 20, 2004\\ +% by Herbert Voss}} +% +% \maketitle +% +% \begin{abstract} +% This package allow to draw easily various kinds of regular or non +% regular polygons, using the unique macro \PstPolygonMacro, with various +% customization parameters. +% +% It is also a good example of the great power and flexibility of +% PSTricks, as in fact it is a very short program (it body is only 100~lines +% long) but nevertheless really powerful. +% +% And last, it is also a good pedagogical example of how to design and +% program \emph{high level graphic objects} above PSTricks own ones. +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% \PstPolygonPackage{} offer a unique macro (plus some aliases to define +% some often used polygons) with few parameters to interact on it. But we can +% also use all the relevant PSTricks parameters to change the size, the +% characteristics of lines, to add filling, etc. +% +% The polygons are always drawn counter clockwise. +% +% \vspace{1mm} +% The syntax is simply: +% \fbox{\PstPolygonMacro\texttt{*[optional\_parameters]}} +% +% \vspace{1mm} +% As for PSTricks closed objects, the \texttt{*} version use a solid style +% to fill the polygon, use the line color for fill color and set the linewidth +% to 0. +% +% A preliminary version, limited to \emph{regular} polygons, was shown at +% TUG'95 conference, St Petersburg, Florida, as part of my talk +% \emph{Building high level objects in PSTricks} \cite{Girou95}. +% +% \emph{Note}: You can take advantage to look also at the polygon feature of +% the \XYpic{} package \cite{XYpic}, \cite{LGC97}. +% +% \section{Usage} +% +% \subsection{Parameters} +% +% There are \textbf{eight} specific parameters defined to change the way the +% polygons are defined: +% +% \begin{optlist} +% \item [PstPicture (boolean)]: to define or not a \texttt{pspicture} +% environment for the polygon. We have to define this parameter to +% \emph{false} if we want to mix the polygon with other PSTricks objects +% --- see examples later +% (\emph{Default:~true} --- which is not the case for basic PSTricks +% objects). +% \end{optlist} +% +% \begin{optlist} +% \item [PolyRotation (real)]: rotation angle applied to the polygon +% (\emph{Default:~0} --- no rotation). +% \end{optlist} +% +% \begin{CenterExample} +% \PstPolygon\hfill +% \PstPolygon[/HLEmphasize?PolyRotation_=/HLReverse?18_]\hfill +% \PstPolygon[/HLEmphasize?PolyRotation_=/HLReverse?36_]\hfill +% \PstPolygon[/HLEmphasize?PolyRotation_=/HLReverse?45_] +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyNbSides (integer)]: number of sides of the polygon +% (\emph{Default:~5}). +% \end{optlist} +% +% \begin{CenterExample} +% \PstPolygon +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?3_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?4_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?5_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?8_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?50_] +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyOffset (integer)]: number of nodes to bypass to obtain each +% time the next one +% (\emph{Default:~1} --- no node bypassed). +% \end{optlist} +% +% \begin{CenterExample} +% \PstPolygon +% \PstPolygon[/HLEmphasize?PolyOffset_=/HLReverse?2_] +% \PstPolygon[/HLEmphasize?PolyOffset_=/HLReverse?3_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?7_,/HLEmphasize?PolyOffset_=/HLReverse?2_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?9_,/HLEmphasize?PolyOffset_=/HLReverse?4_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?17_,/HLEmphasize?PolyOffset_=/HLReverse?6_] +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyIntermediatePoint (real)]: position of the intermediate point +% used to join each time the next node +% (\emph{Default:~empty} --- not used). +% \end{optlist} +% +% \begin{CenterExample} +% \PstPolygon +% \PstPolygon[/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.38_] +% \PstPolygon[/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.2_] +% \PstPolygon[/HLEmphasize?PolyIntermediatePoint_=/HLReverse?1.2_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?7_,/HLEmphasize?PolyOffset_=/HLReverse?2_, +% /HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.38_] +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?21_,/HLEmphasize?PolyOffset_=/HLReverse?2_, +% /HLEmphasize?PolyIntermediatePoint_=/HLReverse?-1.25_] +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyCurves (boolean)]: boolean value to choose between straight +% line and curve to join each time the next node +% (\emph{Default:~false} --- straight lines). +% \end{optlist} +% +% \begin{CenterExample} +% \psset{/HLEmphasize?PolyCurves_=/HLReverse?true_} +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?7_,/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.38_]\hfill +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?11_,/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.6_]\hfill +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?7_,/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.2_, +% /HLEmphasize?PolyOffset_=/HLReverse?2_]\hfill +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?9_,/HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.1_]\hfill +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?15_,/HLEmphasize?PolyIntermediatePoint_=/HLReverse?1.2_] +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyEpicycloid (boolean)]: boolean value to choose between +% polygon and epicycloid +% (\emph{Default:~false} --- polygon). +% \end{optlist} +% +% \begin{CenterExample} +% \psset{linewidth=0.001,/HLEmphasize?PolyNbSides_=/HLReverse?72_,/HLEmphasize?PolyEpicycloid_=/HLReverse?true_} +% % /HLEmphasize?Epicycloid of factor 1 is cardioid and of factor 2 nephroid_ +% \multido{\i=2+1}{4}{\PstPolygon[/HLEmphasize?PolyOffset_=/HLReverse?\i_]\hfill} +% \PstPolygon[/HLEmphasize?PolyOffset_=/HLReverse?72_]\hfill % /HLEmphasize?Epicycloid of factor 71_ +% \PstPolygon[/HLEmphasize?PolyOffset_=/HLReverse?73_] % /HLEmphasize?Epicycloid of factor 72_ +% \end{CenterExample} +% +% \begin{optlist} +% \item [PolyName (string)]: name of the polygon, useful to have different +% names for the nodes of different polygons +% (\emph{Default:~empty} --- no name). +% \end{optlist} +% +% The center of the polygon has name \texttt{PolyName0} and the nodes +% (vertices) have names \texttt{PolyName1} to \texttt{PolyNameN}. +% +% With this parameter, we can connect as we want nodes of different polygons: +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \psset{PstPicture=false} +% \begin{pspicture}(-1,-1)(1,1) +% \PstPolygon[unit=0.8,/HLEmphasize?PolyName_=/HLReverse?A_,/HLEmphasize?PolyNbSides_=/HLReverse?6_] +% \PstPolygon[unit=1.2,/HLEmphasize?PolyName_=/HLReverse?B_,/HLEmphasize?PolyNbSides_=/HLReverse?12_] +% \end{pspicture} +% \multido{\i=1+2}{6}{% +% \ncline{A\the\multidocount}{B\i}} +% \end{SideBySideExample} +% +% It is also a way (limited in fact...) to define three dimensional objects +% in perspective (this was used first in \cite{XYpic}): +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \psset{unit=0.8} +% \begin{pspicture}(3,2.5) +% % /HLEmphasize?\PstSquare is described later_ +% \rput[lb](0,0){\PstSquare[/HLEmphasize?PolyName_=/HLReverse?A_]} +% \rput[lb](2.5,2){\PstSquare[unit=0.5, +% /HLEmphasize?PolyName_=/HLReverse?B_]} +% \multido{\i=1+1}{4}{\ncline{A\i}{B\i}} +% \end{pspicture} +% \end{SideBySideExample} +% +% Of course, we can mix specific \PstPolygonPackage{} parameters with +% relevant PSTricks ones and combine it with other generic macros +% (for repetitions, projection in the 3d space, etc.) +% +% \begin{CenterExample} +% \PstPolygon[unit=/HLReverse?1.5_,linestyle=/HLReverse?dashed_] +% \PstPolygon[linewidth=/HLReverse?1mm_] +% \PstPolygon[fillstyle=/HLReverse?crosshatch_,/HLEmphasize?PolyNbSides_=/HLReverse?6_] +% \PstPolygon[linecolor=/HLReverse?red_,fillstyle=/HLReverse?solid_,fillcolor=/HLReverse?yellow_, +% /HLEmphasize?PolyRotation_=/HLReverse?18_,/HLEmphasize?PolyOffset_=/HLReverse?2_] +% \PstPolygon*[linecolor=/HLReverse?cyan_,/HLEmphasize?PolyNbSides_=/HLReverse?7_,/HLEmphasize?PolyOffset_=/HLReverse?2_] +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\i=5+2}{6}{% +% \PstPolygon[/HLEmphasize?PolyNbSides_=/HLReverse?\i_,/HLEmphasize?PolyCurves_=/HLReverse?true_, +% /HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.1_,/HLEmphasize?PolyOffset_=/HLReverse?3_]} +% \end{CenterExample} +% +% \subsection{Pre-defined polygons} +% +% Some often used polygons and other related geometric objects are +% pre-defined, for immediate usage : +% +% \begin{CenterExample} +% \PstTriangle +% \PstSquare +% \PstPentagon[unit=0.5,linestyle=dotted] +% \PstHexagon[fillstyle=hlines,hatchangle=90] +% \PstHeptagon[fillstyle=vlines] +% \PstOctogon*[unit=0.8,linecolor=red] +% \PstNonagon[unit=0.5] +% \PstDecagon +% \PstDodecagon[linecolor=green] +% \PstStarFiveLines +% \PstStarFive +% \end{CenterExample} +% +% \subsection{Non regular polygons} +% +% Until now, we have described only the so-called \emph{regular} polygons, +% which are from far the most useful ones (all of them have equal edges and +% angles). Nevertheless, it is not so difficult to extend these polygon to +% \emph{non regular} ones, using a different value for horizontal and vertical +% units (nevertheless, the code is more tricky, as we must do all the +% trigonometry explicitely...) +% +% \begin{CenterExample} +% \PstPentagon[xunit=/HLReverse?0.5_]\hfill +% \PstHexagon[yunit=/HLReverse?0.5_]\hfill +% \PstStarFive[xunit=/HLReverse?0.5_,yunit=/HLReverse?1.5_]\hfill +% \PstPolygon[xunit=/HLReverse?0.8_,yunit=/HLReverse?1.5_,/HLEmphasize?PolyNbSides_=/HLReverse?9_,/HLEmphasize?PolyOffset_=/HLReverse?2_, +% /HLEmphasize?PolyIntermediatePoint_=/HLReverse?0.1_,/HLEmphasize?PolyCurves_=/HLReverse?true_] +% \end{CenterExample} +% +% \subsection{Nodes (vertices)} +% +% And another powerful possibility is to define a command +% \PstPolygonNodeMacro{} which will be excuted at each node +% (\emph{Default:~empty} --- nothing executed). The counter name for nodes is +% \cs{INode}, starting from 0. The \cs{multidocount} counter, from the +% \cs{multido} command, start itself from 1. +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \providecommand{\PstPolygonNode}{% +% /HLReverse?\psdots[dotsize=0.2,linecolor=cyan](1;\INode)_} +% \PstPentagon +% \end{SideBySideExample} +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \newcounter{Letter} +% \providecommand{\PstPolygonNode}{% +% /HLReverse?\setcounter{Letter}{\the\multidocount}_% +% /HLReverse?\rput*{*0}(1;\INode){\small\Alph{Letter}}_} +% \PstHeptagon[PolyOffset=3] +% \end{SideBySideExample} +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \providecommand{\PstPolygonNode}{% +% /HLReverse?\psdots[dotstyle=o,dotsize=0.2](1;\INode)_ +% /HLReverse?\psline[linecolor=red]{->}(0.9;\INode)_} +% \PstPolygon[PolyNbSides=8] +% \end{SideBySideExample} +% +% \vspace{3mm} +% It is also a way to nest polygons: +% \vspace{3mm} +% +% \begin{SideBySideExample}[xrightmargin=3cm] +% \newbox{\Star} +% \savebox{\Star}{% +% \PstStarFive*[unit=0.15,linecolor=red]} +% \providecommand{\PstPolygonNode}{% +% /HLReverse?\rput{*0}(1;\INode){\usebox{\Star}}_} +% \shortstack{\PstNonagon\\[5mm] +% \PstDodecagon[linestyle=none]} +% \end{SideBySideExample} +% +% \vspace{3mm} +% Here we redraw one of the polygon examples built with the \XYpic{} package +% in \cite[example 5-5-34, page 203]{LGC97}: +% +% \begin{CenterExample} +% \psset{unit=2,PstPicture=false} +% \begin{pspicture}(-1.6,-1.6)(1.6,1.6) +% % /HLEmphasize?Just to name the nodes, to be able to join some of them._ +% % /HLEmphasize?by solid curves. We can't draw the polygons now,_ +% % /HLEmphasize?as the node numbers must erase the solid curves..._ +% \PstHexagon[unit=0.8,linestyle=none,PolyName=H] +% \PstDodecagon[unit=1.2,linestyle=none,PolyName=D] +% {\SpecialCoor +% \psset{linewidth=0.4pt,border=2pt,nodesep=0.45} +% \psccurve(H1)(H4)(D8)([angle=-30]D9)(D11) +% \psccurve(D3)(H3)(H6)(D12)([angle=90]D1) +% \psccurve(D4)(H2)(H5)(D7)([angle=90]D6)} +% \psset{linestyle=dotted,framesep=1pt} +% \PstTriangle[unit=0.23] +% \providecommand{\PstPolygonNode}{% +% \rput*{*0}(1;\INode){\small\the\multidocount}} +% \PstHexagon[unit=0.8] +% \PstDodecagon[unit=1.2] +% \PstDodecagon[unit=1.6] +% \end{pspicture} +% \end{CenterExample} +% +% \section[Polygonbox]{Polygonbox\protect\footnote{written by Herbert Vo\ss.}} +% The valid options with the predefined values are +% \begin{verbatim} +% PolyNbSides =3 +% PolyRotation=0 +% \end{verbatim} +% +% \begin{itemize} +% \item There are some problems with linearcs and rounding errors, which are seen in the +% following examples for \verb+PolyNbSides=7+. +% \item To rotate the text inside the box, one can use the \verb+\rotatebox+ macro from +% the \verb+rotating+ package (see examples). +% \end{itemize} +% +% \begin{CenterExample} +% \multido{\nA=3+1}{8}{% +% \pspolygonbox[PolyNbSides=\nA,framesep=3mm]{Text}~} +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\nA=3+1}{8}{\pspolygonbox[PolyNbSides=\nA,% +% framesep=2mm,doubleline=true]{Text}~} +% \end{CenterExample} +% +% +% \begin{CenterExample} +% \psset{PolyNbSides=4} +% \multido{\nA=0+60}{8}{\pspolygonbox[PolyRotation=\nA,% +% framesep=2mm,doubleline=true,% +% linecolor=red,doublecolor=blue]{\magenta Text}~} +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\nA=0+60,\nB=45+60}{8}{\pspolygonbox% +% [PolyRotation=\nA,framesep=2mm,doubleline=true,% +% linecolor=red,doublecolor=blue,linearc=0.4]% +% {\rotatebox{\nB}{\blue Text}}~}\\[1cm] +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\nA=3+1}{8}{% +% \pspolygonbox[PolyNbSides=\nA,rot=60,framesep=2pt,% +% doubleline=true,linearc=0.2]{Text}~} +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\nA=3+1}{8}{% +% \pspolygonbox[PolyNbSides=\nA,framesep=10pt,% +% fillstyle=solid,fillcolor=cyan,linearc=0.2]{Text}~} +% \end{CenterExample} +% +% \begin{CenterExample} +% \multido{\nA=-5+5}{8}{\pspolygonbox[framesep=\nA pt,% +% PolyRotation=90]{\Huge\red T}~} +% \end{CenterExample} +% +% +% \begin{CenterExample} +% \multido{\nA=-5+5}{8}{\pspolygonbox[framesep=\nA pt,% +% PolyRotation=90,boxsep=false]{\Huge\red T}~} +% \end{CenterExample} +% +% +% ^^A Bibliography +% \begin{thebibliography}{9} +% \bibitem{Girou94} Denis Girou, Pr\'esentation de PSTricks, +% \emph{Cahiers GUTenberg}, Number~16, pages 21--70, +% February~1994 (in french). +% +% \bibitem{Girou95} Denis Girou, Building high level objects in PSTricks, +% TUG'95, St Petersburg, Florida, 1995. Available at +% {\url{http://www.tug.org/applications/PSTricks/TUG95-PSTricks_4.ps.gz}} +% +% \bibitem{LGC97} Michel Goossens, Sebastian Rahtz and Frank Mittelbach, +% \emph{The \LaTeX{} Graphics Companion}, Addison-Wesley, 1997. +% +% \bibitem{Hoenig98} Alan Hoenig, \emph{\TeX{} Unbound: \LaTeX{} \& \TeX{} +% Strategies, Fonts, Graphics, and More}, +% Oxford University Press, 1998. +% +% \bibitem{voss04} Herbert Vo\ss, PSTricks -- Grafik mit {P}ost{S}cript f\"ur \TeX{} +% und \LaTeX{}, Lehmanns, July 2004 (in german). +% +% \bibitem{XYpic} Kristoffer~H. Rose and Ross Moore, \XYpic. Polygon feature, +% available from \CTAN, 1991-1998, \CTANref{xypic}. +% +% \bibitem{vanZandt93} Timothy van Zandt, PSTricks. PostScript macros for +% Generic \TeX, available from \CTAN, 1993, +% \CTANref{pstricks}. +% +% \bibitem{vanZandtGirou94} Timothy van Zandt and Denis Girou, Inside PSTricks, +% \emph{\TUB}, Volume~15, Number~3, pages 239--246, +% September 1994. +% \end{thebibliography} +% +% +% \StopEventually{} +% +% ^^A .................... End of the documentation part .................... +% +% \section{Driver file} +% +% The next bit of code contains the documentation driver file for \TeX{}, +% i.e., the file that will produce the documentation you are currently +% reading. It will be extracted from this file by the \texttt{docstrip} +% program. +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{pst-poly.dtx} +\usepackage{fancyvrb} +\usepackage{pstricks} +\usepackage{pst-poly} +\usepackage{rotating} +\usepackage{url} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\OnlyDescription % Comment it for implementation details +\hbadness=7000 % Over and under full box warnings +\hfuzz=3pt +\begin{document} + \DocInput{pst-poly.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{\PstPolygonPackage{} \LaTeX{} wrapper} +% +% \begin{macrocode} +%<*latex-wrapper> +\RequirePackage{pstricks} +\ProvidesPackage{pst-poly}[2004/11/20 package wrapper for + pst-poly.tex (hv)] +\input{pst-poly.tex} +\ProvidesFile{pst-poly.tex} + [\filedate\space v\fileversion\space `PST-poly' (DG)] +%</latex-wrapper> +% \end{macrocode} +% +% \section{\PstPolygonPackage{} code} +% +% As it is a general and very powerful way to build \emph{high level graphic +% objects} above PSTricks own ones, we will comment precisely the code, +% focusing these comments on the case of \emph{regular} polygons, which is +% enough to show all useful major technics. In fact, all real difficulties +% in the code of \PstPolygonPackage{} are for the \emph{non regular} case, +% which involve some trigonometry. +% +% \begin{macrocode} +%<*pst-poly> +% \end{macrocode} +% +% \subsection{Preambule} +% +% Who we are. +% +% \begin{macrocode} +% +\def\fileversion{1.60} +\def\filedate{2004/11/20} +\message{`PST-Polygon' v\fileversion, \filedate\space (DG/hv)} +\csname PSTPolygonLoaded\endcsname +\let\PSTPolygonLoaded\endinput +% +% \end{macrocode} +% +% Require the PSTricks, `\textsf{pst-node}' and `\textsf{multido}' packages. +% +% \begin{macrocode} +% +\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi +\ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi +\ifx\MultidoLoaded\endinput\else\input multido.tex\fi +% +% \end{macrocode} +% +% \begin{macrocode} +\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi +% \end{macrocode} +% +% Catcodes changes. +% +% \begin{macrocode} +% +\edef\PstAtCode{\the\catcode`\@} +\catcode`\@=11\relax +\pst@addfams{pst-poly} +% +% \end{macrocode} +% +% \subsection{Definition of the parameters} +% +% \texttt{PstPicture} will define if the polygon must be set inside a +% \texttt{pspicture} environment or not. It is a \emph{boolean} value, so we +% define a new \cs{if} \TeX{} variable. The \texttt{true} value specified +% will give the default to used when no value is affected to this parameter +% (so \texttt{PstPicture} will be equivalent to \texttt{PstPicture=true}). +% Take care that it is not the default value for the parameter itself (we +% will see later that here we choose \texttt{false} as default value...). +% We don't prefix this parameter name by \texttt{Poly} because it is not +% specific to polygons. Note also that \texttt{psset} is for the +% \KeyValPackage{} package the generic name for all PSTricks parameters. +% +% \begin{macrocode} +\newif\ifPst@PstPicture +\define@key[psset]{pst-poly}{PstPicture}[true]{\@nameuse{Pst@PstPicture#1}} +% \end{macrocode} +% +% \texttt{PolyRotation} will be the rotation angle to apply to the +% polygon. It is a \emph{real} value used as an \emph{angle}. +% +% \begin{macrocode} +\define@key[psset]{pst-poly}{PolyRotation}{\edef\PstPoly@Rotation{#1}} +% \end{macrocode} +% +% \texttt{PolyNbSides} will be the number of sides (edges) of the polygon. +% It is an \emph{integer} value and we store it into a \TeX{} macro (in this +% way, we can define a lot of integer parameters without having the risk to +% exhaust \TeX{} limitations of numbers of counters). +% +% \begin{macrocode} +\define@key[psset]{pst-poly}{PolyNbSides}{\pst@getint{#1}{\PstPoly@NbSides}} +% \end{macrocode} +% +% \texttt{PolyOffset} will be the offset to obtain the next vertice to +% connect, for each one of the polygon. It is an \emph{integer} value. +% +% \begin{macrocode} +\define@key[psset]{pst-poly}{PolyOffset}{\pst@getint{#1}{\PstPoly@Offset}} +% \end{macrocode} +% +% \texttt{PolyIntermediatePoint} will be the position of an intermediate +% point to used between the current vertice and the next one, for each edge. +% It will defined a \emph{relative} position, which will be the same for +% each edge. As it is a \emph{real} value on which we will have to make some +% computations, we use here a dimension register. +% +% \begin{macrocode} +\newdimen\PstPoly@IntermediatePointDim +\define@key[psset]{pst-poly}{PolyIntermediatePoint}{\edef\PstPoly@IntermediatePoint{#1}} +% \end{macrocode} +% +% \texttt{PolyName} will be the name assigned to the polygon, which will be +% useful if we would like to connect edges of different polygons. It is a +% \texttt{string} that we store in a macro. +% +% \begin{macrocode} +\define@key[psset]{pst-poly}{PolyName}{\edef\PstPoly@Name{#1}} +% \end{macrocode} +% +% \texttt{PolyCurves} will define if the edges are lines or curves. It is a +% \emph{boolean value}. And logically, there will be no effect of it if there +% is no intermediate point defined. +% +% \begin{macrocode} +\newif\ifPstPoly@Curves +\define@key[psset]{pst-poly}{PolyCurves}[true]{\@nameuse{PstPoly@Curves#1}} +% \end{macrocode} +% +% \texttt{PolyEpicycloid} will define if we will draw a polygon or an +% epicycloid (which is of course not a polygon, but this was a functionality +% very easy to add to this package!) It is a \emph{boolean} value. +% +% \begin{macrocode} +\newif\ifPstPoly@Epicycloid +\define@key[psset]{pst-poly}{PolyEpicycloid}[true]{\@nameuse{PstPoly@Epicycloid#1}} +% \end{macrocode} +% +% Next, we set the default values for all these new parameters. +% We choose to have no rotation, five sides, no offset (so a value of 1), +% no intermediate point, no name, connections by lines (so no curved ones) +% and polygons (so no epicycloids). +% +% \begin{macrocode} +\psset{% + PstPicture=true,PolyRotation=0,PolyNbSides=5,PolyOffset=1, + PolyIntermediatePoint=,PolyName=,PolyCurves=false,PolyEpicycloid=false} +% +% \end{macrocode} +% +% \subsection{Main macro} +% +% The general \cs{PstPolygon} macro to draw polygons. +% +% First we look if the \texttt{*} convention is used, as for many PSTricks +% macros, to fill the graphic object using the current color of the line. +% +% \begin{macro}{\PstPolygon} +% \begin{macrocode} +% +\def\PstPolygon{\pst@ifstar{\@ifnextchar[{\PstPolygon@i}{\PstPolygon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% Then we define the auxiliary macro which will handle the parameters if +% some are used. Note also the usage of the double \verb+{{+ to have only +% changes of parameter values for this specific object, as redefinitions +% of them must be local. +% +% \begin{macro}{\PstPolygon@i} +% \begin{macrocode} +\def\PstPolygon@i[#1]{{% +% \end{macrocode} +% +% After that, we can set the values of local parameters if defined and +% take account of the \texttt{*} convention if used. +% +% \begin{macrocode} +\psset{#1}% +\if@star\solid@star\fi +% \end{macrocode} +% +% For security, we make some checks on the validity of the parameters. +% +% \begin{macrocode} +\ifnum\PstPoly@NbSides<3 + \@pstrickserr{PolyNbSides must be greater than 2 + (and not `\PstPoly@NbSides')}{\@eha}% +\fi +\ifnum\PstPoly@NbSides>200 + \@pstrickserr{PolyNbSides must be less than 201 + (and not `\PstPoly@NbSides')}{\@eha}% +\fi +\ifnum\PstPoly@Offset<1 + \@pstrickserr{PolyOffset must be greater than 0 + (and not `\PstPoly@Offset')}{\@eha}% +\fi +% \end{macrocode} +% +% And now, we can start the \emph{real} code. First we affect a special +% value for the case where an offset will be used. There are only two cases, +% as the offset can be \emph{odd} or \emph{even}. +% +% \begin{macrocode} +\ifodd\PstPoly@Offset + \def\PstPoly@Decimal{.5}% +\else + \def\PstPoly@Decimal{}% +\fi +% \end{macrocode} +% +% We must say to use non cartesian coordinates (we will used polar ones +% --- and special ones computed by trigonometry and defined in PostScript +% for \emph{non} regular polygons). +% +% \begin{macrocode} +% +\SpecialCoor +% \end{macrocode} +% +% We look at the definition of a ``\texttt{pspicture}'' environment or not. +% +% \begin{macrocode} +\ifPst@PstPicture\pspicture(-1,-1)(1,1)\fi +% \end{macrocode} +% +% We rotate the polygon if necessary (if not, we will use a rotation of +% angle 0, which will have of course no effect). +% +% \begin{macrocode} +\rput{\PstPoly@Rotation}(0,0){% +% \end{macrocode} +% +% We will used polar coordinates, with a unit given by the number of sides +% of the polygon. +% +% \begin{macrocode} + \degrees[\PstPoly@NbSides] +% \end{macrocode} +% +% We must recompute it here if the unit has changed after assignation +% (for instance \verb+\psset{PolyIntermediatePoint=0.38}\PstPolygon[unit=2]+) +% +% \begin{macrocode} + \pssetlength{\PstPoly@IntermediatePointDim}{\PstPoly@IntermediatePoint} +% \end{macrocode} +% +% If there is a name for this polygon, we assign this name followed by 0 +% to the center of it, and different names to all vertices, indexed by the +% number of the vertice. +% +% \begin{macrocode} + \ifx\PstPoly@Name\@empty + \else + \pnode(0,0){\PstPoly@Name 0} + \ifnum\psxunit=\psyunit + \def\PstPoly@Node{\pnode(1;\i)}% + \else + \def\PstPoly@Node{% + \pnode(! \i\space 360 \PstPoly@NbSides\space div mul cos + \i\space 360 \PstPoly@NbSides\space div mul sin)}% + \fi + \multido{\i=0+1}{\PstPoly@NbSides}{% + \PstPoly@Node{\PstPoly@Name\the\multidocount}} + \fi +% \end{macrocode} +% +% Now we are ready to draw the polygon. We use a \cs{pscustom} environment. +% +% \begin{macrocode} + \pscustom{% +% \end{macrocode} +% +% First, the case of epicycloids. We must only join each vertice to the +% opposite one, using the defined offset as gap. +% +% \begin{macrocode} + \ifPstPoly@Epicycloid + \pst@cnta=\PstPoly@NbSides + \divide\pst@cnta\tw@ + \multido{\i=0+1}{\PstPoly@NbSides}{% + \moveto(1;\i) + \lineto(1;\the\pst@cnta) + \advance\pst@cnta\PstPoly@Offset} +% \end{macrocode} +% +% Now, we can see the case of polygons. First, we move to the starting point. +% +% \begin{macrocode} + \else + \ifnum\psxunit=\psyunit + \moveto(1,0) + \else + \moveto(! 1 0) + \fi +% \end{macrocode} +% +% If there is no intermediate point, we must only have a loop to join all +% vertices, according to the number of edges. And we use each time the +% defined value of the offset to obtain the next vertice. +% +% \begin{macrocode} + \ifx\PstPoly@IntermediatePoint\@empty + \ifnum\psxunit=\psyunit + \def\PstPoly@Junction{\lineto(1;\i)}% + \else + \def\PstPoly@Junction{\lineto% + (! \i\space 360 \PstPoly@NbSides\space div mul cos + \i\space 360 \PstPoly@NbSides\space div mul sin)}% + \fi + \multido{\i=\PstPoly@Offset+\PstPoly@Offset}{\PstPoly@NbSides}{% + \PstPoly@Junction} +% \end{macrocode} +% +% If there is an intermediate point, first we see if vertices will be joined +% by lines or curves. +% +% \begin{macrocode} + \else + \ifPstPoly@Curves + \let\PstPoly@JunctionType\pscurve + \else + \let\PstPoly@JunctionType\psline + \fi + \ifnum\psxunit=\psyunit + \def\PstPoly@Junction{\PstPoly@JunctionType% + (\PstPoly@IntermediatePointDim;\the\pst@cnta\PstPoly@Decimal) + (1;\i)}% + \else + \def\PstPoly@Junction{\PstPoly@JunctionType% + (! \PstPoly@IntermediatePoint\space + \the\pst@cnta\PstPoly@Decimal\space 360 + \PstPoly@NbSides\space div mul cos mul + \PstPoly@IntermediatePoint\space + \the\pst@cnta\PstPoly@Decimal\space 360 + \PstPoly@NbSides\space div mul sin mul) + (! \i\space 360 \PstPoly@NbSides\space div mul cos + \i\space 360 \PstPoly@NbSides\space div mul sin)}% + \fi +% \end{macrocode} +% +% We compute half of the value of the offset. We use a counter for that, +% which is an integer, so we will add the value of the \cs{PstPoly@Decimal} +% macro defined above, which has value 0.5 if the offset is an odd number. +% +% \begin{macrocode} + \pst@cnta=\PstPoly@Offset + \divide\pst@cnta\tw@ +% \end{macrocode} +% +% Now, we can execute the main loop: for each vertice we join the current +% one to the next, using each time the intermediate point defined. +% +% \begin{macrocode} + \multido{\i=\PstPoly@Offset+\PstPoly@Offset}{\PstPoly@NbSides}{% + \PstPoly@Junction + \advance\pst@cnta\PstPoly@Offset} +% \end{macrocode} +% +% Now, we can close the opened \emph{if} structures and the +% \texttt{pscustom} environment. +% +% \begin{macrocode} + \fi + \fi} +% \end{macrocode} +% +% In the case where there is a special macro of name \cs{PstPolygonNode} +% defined, we execute it at each node, and we close the rotation command. +% The counter used is \cs{INode}. +% +% \begin{macrocode} + \ifx\PstPolygonNode\@undefined + \else + \multido{\INode=\z@+\PstPoly@Offset}{\PstPoly@NbSides}{% + \PstPolygonNode} + \fi} +% \end{macrocode} +% +% Then we close the ``\texttt{pspicture}'' environment, if defined, +% and the \cs{PstPolygon@i} macro. +% +% \begin{macrocode} +\ifPst@PstPicture + \endpspicture +\fi}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Pre-defined polygons} +% +% Triangle (three sides). +% +% \begin{macro}{\PstTriangle} +% \begin{macrocode} +\def\PstTriangle{% +\pst@ifstar{\@ifnextchar[{\PstTriangle@i}{\PstTriangle@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstTriangle@i} +% \begin{macrocode} +\def\PstTriangle@i[#1]{{% +\psset{PolyNbSides=3,PolyRotation=90}% For triangle (360/3*(3/4)) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Square (four sides). +% +% \begin{macro}{\PstSquare} +% \begin{macrocode} +\def\PstSquare{% +\pst@ifstar{\@ifnextchar[{\PstSquare@i}{\PstSquare@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstSquare@i} +% \begin{macrocode} +\def\PstSquare@i[#1]{{% +\psset{PolyNbSides=4,PolyRotation=45}% For square (360/4/2) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Pentagon (five sides). +% +% \begin{macro}{\PstPentagon} +% \begin{macrocode} +\def\PstPentagon{% +\pst@ifstar{\@ifnextchar[{\PstPentagon@i}{\PstPentagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstPentagon@i} +% \begin{macrocode} +\def\PstPentagon@i[#1]{{% +\psset{PolyNbSides=5,PolyRotation=18}% For pentagon (360/5/4) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Hexagon (six sides). +% +% \begin{macro}{\PstHexagon} +% \begin{macrocode} +\def\PstHexagon{% +\pst@ifstar{\@ifnextchar[{\PstHexagon@i}{\PstHexagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstHexagon@i} +% \begin{macrocode} +\def\PstHexagon@i[#1]{{% +\psset{PolyNbSides=6}% +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Heptagon (seven sides). +% +% \begin{macro}{\PstHeptagon} +% \begin{macrocode} +\def\PstHeptagon{% +\pst@ifstar{\@ifnextchar[{\PstHeptagon@i}{\PstHeptagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstHeptagon@i} +% \begin{macrocode} +\def\PstHeptagon@i[#1]{{% +\psset{PolyNbSides=7,PolyRotation=38.57}% For heptagon (360/7*(3/4)) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Octogon (height sides). +% +% \begin{macro}{\PstOctogon} +% \begin{macrocode} +\def\PstOctogon{% +\pst@ifstar{\@ifnextchar[{\PstOctogon@i}{\PstOctogon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstOctogon@i} +% \begin{macrocode} +\def\PstOctogon@i[#1]{{% +\psset{PolyNbSides=8,PolyRotation=22.5}% For octogon (360/8/2) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Nonagon (nine sides). +% +% \begin{macro}{\PstNonagon} +% \begin{macrocode} +\def\PstNonagon{% +\pst@ifstar{\@ifnextchar[{\PstNonagon@i}{\PstNonagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstNonagon@i} +% \begin{macrocode} +\def\PstNonagon@i[#1]{{% +\psset{PolyNbSides=9,PolyRotation=10}% For nonagon (360/9/4) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Decagon (ten sides). +% +% \begin{macro}{\PstDecagon} +% \begin{macrocode} +\def\PstDecagon{% +\pst@ifstar{\@ifnextchar[{\PstDecagon@i}{\PstDecagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstDecagon@i} +% \begin{macrocode} +\def\PstDecagon@i[#1]{{% +\psset{PolyNbSides=10}% +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Dodecagon (twelve sides). +% +% \begin{macro}{\PstDodecagon} +% \begin{macrocode} +\def\PstDodecagon{% +\pst@ifstar{\@ifnextchar[{\PstDodecagon@i}{\PstDodecagon@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstDodecagon@i} +% \begin{macrocode} +\def\PstDodecagon@i[#1]{{% +\psset{PolyNbSides=12,PolyRotation=15}% For dodecagon (360/12/2) +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Star with five leaves, with internal lines. +% +% \begin{macro}{\PstStarFiveLines} +% \begin{macrocode} +\def\PstStarFiveLines{% +\pst@ifstar{\@ifnextchar[{\PstStarFiveLines@i}{\PstStarFiveLines@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstStarFiveLines@i} +% \begin{macrocode} +\def\PstStarFiveLines@i[#1]{{% +\psset{PolyOffset=2,PolyRotation=18}% +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% Star with five leaves. +% +% \begin{macro}{\PstStarFive} +% \begin{macrocode} +\def\PstStarFive{% +\pst@ifstar{\@ifnextchar[{\PstStarFive@i}{\PstStarFive@i[]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PstStarFive@i} +% \begin{macrocode} +\def\PstStarFive@i[#1]{{% +\psset{PolyIntermediatePoint=0.38,PolyRotation=18}% +\psset{#1}% +\if@star\solid@star\fi +\PstPolygon}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pspolygonbox} +% \begin{macrocode} +\newdimen\pst@dimm +\newdimen\pst@dimn +\newdimen\pst@dimo +\newdimen\pst@dimp +\def\pspolygonbox{\pst@object{pspolygonbox}}% voss 2004-11-20 +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pspolygonbox@i} +% \begin{macrocode} +\def\pspolygonbox@i{\pst@makebox\pspolygonbox@ii} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pspolygonbox@ii} +% \begin{macrocode} +% +\def\pspolygonbox@ii{{% + \begingroup% + \pst@useboxpar% + \pst@dima=\pslinewidth% + \ifpsdoubleline% + \advance\pst@dima by \psdoublesep\pslinewidth% + \advance\pst@dima by \pslinewidth% + \fi% + \advance\pst@dima by \psframesep% + \pst@dimc=\wd\pst@hbox% + \pst@dimp=\pst@dimc\advance\pst@dimp by 2\pst@dima% + \pst@dimb=\dp\pst@hbox\pst@dimo=\pst@dimb% + \pst@dimd=\ht\pst@hbox\advance\pst@dimo by \pst@dimd% totalheight + \pst@pyth\pst@dimp\pst@dimo\pst@dimm% + \divide\pst@dimm by 2% Radius + \setbox\pst@hbox=\hbox{% + \ifpsboxsep\kern\pst@dima\fi% left side + \begin@ClosedObj% + \addto@pscode{% + /framesep \pst@number\pst@dima def + /boxdepth \pst@number\pst@dimb framesep add def + /boxheight0 \pst@number\pst@dimd def + /boxheight boxheight0 framesep add def + /boxwidth \pst@number\pst@dimc def + /radius \pst@number\pst@dimm def + /order \PstPoly@NbSides\space def + /dAlpha 360 order div def + /alpha \PstPoly@Rotation\space def + \pst@cp + \tx@polygonB + \psline@iii +%% \tx@Line + \tx@Polygon + }% + \def\pst@linetype{1}% + \showpointsfalse% + \end@ClosedObj% + \box\pst@hbox% + \ifpsboxsep\kern\pst@dima\fi%% right side + }% + \ifpsboxsep% + \pst@dimn=-.5\pst@dimo\advance\pst@dimn by \pst@dimb% + \advance\pst@dimn by 0.809\pst@dimm% + \dp\pst@hbox=\pst@dimn% + \pst@dimn=\pst@dimm\advance\pst@dimn by 0.5\pst@dimo% + \advance\pst@dimn by -\pst@dimb% + \ht\pst@hbox=\pst@dimn\fi% + \leavevmode% + \box\pst@hbox% + \endgroup% +}\ignorespaces} +% +% +% \begin{macro}{polygonB} +% \begin{macrocode} +% +\pst@def{polygonB}<{% + /x1 framesep neg def + /x2 boxwidth framesep add def + /y1 boxdepth framesep add neg def + /y2 boxheight framesep add def + x2 x1 add 2 div y2 y1 add 2 div translate + [ + alpha cos radius mul + alpha sin radius mul + order { /alpha alpha dAlpha add def + radius alpha cos mul + radius alpha sin mul + } repeat +}> +% \end{macrocode} +% \end{macro} +% +% \end{macrocode} +% \end{macro} +% +% \subsection{Closing} +% +% Catcodes restoration. +% +% \begin{macrocode} +\catcode`\@=\PstAtCode\relax +% \end{macrocode} +% +% \begin{macrocode} +%</pst-poly> +% \end{macrocode} +% +% \section{\PstPolygonPackage{} test file} +% +% \begin{macrocode} +%<*tst-poly> +%% `pst-poly' test file. +%% +\documentclass{article} + +\usepackage{fancyvrb} +\usepackage[width=18cm]{geometry} +\usepackage{pstricks} +\usepackage{pst-poly} + +% Example macros - adapted from the `fvrb-ex' package +% --------------------------------------------------- + +\makeatletter + +% Take care that we use here the four /?_Z characters as escape +% characters, so we can't use these characters in the examples! + +% To highlight some verbatim sequences (comments, macro names, etc.) +\def\HLEmphasize#1{\textit{#1}} +\newcommand{\BS}{\texttt{\symbol{`\\}}} +\def\HLMacro#1{\BS{}def\HLMacro@i#1\@nil} +\def\HLMacro@i#1def#2\@nil{\HLReverse{#2}} +\def\HLReverse#1{{\setlength{\fboxsep}{1pt}\HLReverse@i{#1}}} +\def\HLReverse@i#1{\colorbox{black}{\textcolor{white}{\textbf{#1}}}} + +\def\Example{\FV@Environment{}{Example}} +\def\endExample{% +\end{VerbatimOut} +\Below@Example{\jobname.tmp} +\endgroup} + +\def\CenterExample{\FV@Environment{}{Example}} +\def\endCenterExample{% +\end{VerbatimOut} +\begin{center} +\Below@Example{\jobname.tmp} +\end{center} +\endgroup} + +\def\SideBySideExample{\FV@Environment{}{Example}} +\def\endSideBySideExample{% +\end{VerbatimOut} +\SideBySide@Example{\jobname.tmp} +\endgroup} + +\def\FVB@Example{% +\begingroup +\FV@UseKeyValues +\parindent=0pt +\multiply\topsep by 2 +\VerbatimEnvironment +\begin{VerbatimOut}[gobble=2,codes={\catcode`\Z=12}]{\jobname.tmp}} + +\def\Below@Example#1{% +\VerbatimInput[commentchar=Z,commandchars=/?_,frame=single, + numbers=left,numbersep=3pt]{#1} +\catcode`\%=14\relax +\catcode`\Z=9\relax +% We suppress the effect of the highlighting macros +\catcode`/=0\relax +\catcode`?=1\relax +\catcode`_=2\relax +\def\HLEmphasize##1{##1}% +\def\HLMacro##1{##1}% +\def\HLReverse##1{##1}% +\input{#1}\par} + +\def\SideBySide@Example#1{% +\vskip 1mm +\@tempdimb=\FV@XRightMargin +\advance\@tempdimb -5mm +\begin{minipage}[c]{\@tempdimb} + \fvset{xrightmargin=0pt} + \catcode`\%=14\relax + \catcode`\Z=9\relax + % We suppress the effect of the highlighting macros + \catcode`/=0\relax + \catcode`?=1\relax + \catcode`_=2\relax + \def\HLEmphasize##1{##1}% + \def\HLMacro##1{##1}% + \def\HLReverse##1{##1}% + \input{#1} +\end{minipage}% +\@tempdimb=\textwidth +\advance\@tempdimb -\FV@XRightMargin +\advance\@tempdimb 5mm +\begin{minipage}[c]{\@tempdimb} + \VerbatimInput[commentchar=Z,commandchars=/?_, + frame=single,numbers=left,numbersep=3pt, + xleftmargin=5mm,xrightmargin=0pt]{#1} +\end{minipage} +\vskip 1mm} + +\makeatother + +% End of example macros from `fvrb-ex' + +\begin{document} + +% First serie + +\begin{CenterExample} + \multido{\i=3+1}{6}{% + \PstPolygon[PolyNbSides=\i]\hspace{5mm}} + \PstPolygon[PolyNbSides=30] +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=3+2}{6}{% + \PstPolygon[PolyOffset=2,PolyNbSides=\i]\hspace{5mm}} + \PstPolygon[PolyOffset=2,PolyNbSides=31] +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=3+1}{7}{% + \PstPolygon[PolyOffset=3,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=5+1}{7}{% + \PstPolygon[PolyOffset=4,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=5+2}{7}{% + \PstPolygon[PolyOffset=5,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\clearpage +\begin{CenterExample} + \multido{\i=5+2}{7}{% + \PstPolygon[PolyOffset=7,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=5+2}{7}{% + \PstPolygon[PolyOffset=8,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=1+1}{7}{% + \PstPolygon[PolyOffset=\i,PolyNbSides=5]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=1+1}{7}{% + \PstPolygon[PolyOffset=\i,PolyNbSides=7]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=5+1}{7}{% + \PstPolygon[PolyCurves,PolyIntermediatePoint=0.1,PolyNbSides=\i] + \hspace{5mm}} +\end{CenterExample} + +\clearpage +\begin{CenterExample} + \multido{\i=5+1}{7}{% + \PstPolygon[PolyCurves,PolyIntermediatePoint=0.2, + PolyOffset=2,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\i=5+2}{7}{% + \PstPolygon[PolyCurves,PolyIntermediatePoint=0.1, + PolyOffset=3,PolyNbSides=\i]\hspace{5mm}} +\end{CenterExample} + +% Second serie + +\begin{CenterExample} + \multido{\n=-1.4+0.5}{7}{% + \PstPolygon[PolyNbSides=3,PolyOffset=2,PolyIntermediatePoint=\n] + \hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\n=-1.4+0.5}{7}{% + \PstPolygon[PolyNbSides=5,PolyOffset=2,PolyIntermediatePoint=\n] + \hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\n=-1.4+0.5}{7}{% + \PstPolygon[PolyNbSides=13,PolyOffset=2,PolyIntermediatePoint=\n] + \hspace{5mm}} +\end{CenterExample} + +\begin{CenterExample} + \multido{\n=-1.4+0.5}{7}{% + \PstPolygon[PolyNbSides=21,PolyOffset=2,PolyIntermediatePoint=\n] + \hspace{5mm}} +\end{CenterExample} + +% Third serie + +\begin{CenterExample} + \psset{unit=1.4,linewidth=0.001,PolyNbSides=72,PolyEpicycloid} + \multido{\i=2+1}{4}{% + % Epicycloid of factor 1 is cardioid and of factor 2 nephroid + \PstPolygon[PolyOffset=\i]\hspace{5mm}} +\end{CenterExample} + +\begin{SideBySideExample}[xrightmargin=5cm] + % Epicycloid of factor 10 + \PstPolygon[unit=2,linewidth=0.003, + PolyEpicycloid,PolyNbSides=72,PolyOffset=11] +\end{SideBySideExample} + +\begin{SideBySideExample}[xrightmargin=5cm] + % Epicycloid of factor 22 + \PstPolygon[unit=2,linewidth=0.003, + PolyEpicycloid,PolyNbSides=72,PolyOffset=23] +\end{SideBySideExample} + +\clearpage +\begin{CenterExample} + \psset{unit=1.9,linewidth=0.001,PolyNbSides=72,PolyEpicycloid} + \multido{\i=71+1}{3}{% + \PstPolygon[PolyOffset=\i]\hspace{5mm}} +\end{CenterExample} + +\fvset{xrightmargin=5cm} % 5cm reserved for the graphic + +\begin{SideBySideExample} + % Epicycloid of factor 100 + \PstPolygon[unit=2,linewidth=0.003, + PolyEpicycloid,PolyNbSides=72,PolyOffset=101] +\end{SideBySideExample} + +\begin{SideBySideExample}[xrightmargin=5cm] + % Epicycloid of factor 153 + \PstPolygon[unit=2,linewidth=0.003, + PolyEpicycloid,PolyNbSides=72,PolyOffset=154] +\end{SideBySideExample} + +\clearpage + +% Fourth serie + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \psdots[dotsize=0.2,linecolor=cyan](1;\INode)} + \PstPentagon[unit=2] +\end{SideBySideExample} + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \rput{*0}(1.2;\INode){\small\the\multidocount}} + \PstPolygon[unit=2,PolyNbSides=7,PolyOffset=2] +\end{SideBySideExample} + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \rput*{*0}(1;\INode){\small\the\multidocount}} + \PstHeptagon[unit=2,PolyOffset=2] +\end{SideBySideExample} + +\begin{SideBySideExample} + \newcounter{Letter} + \providecommand{\PstPolygonNode}{% + \setcounter{Letter}{\the\multidocount}% + \rput*{*0}(1;\INode){\small\Alph{Letter}}} + \PstHeptagon[unit=2,PolyOffset=3] +\end{SideBySideExample} + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \SpecialCoor + \degrees[3] + \rput{0.5}(0.5;\INode){% + \pspolygon*(0.5;0.5)(0.5;1.5)(0.5;2.5)}} + \PstTriangle +\end{SideBySideExample} + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \psdots[dotstyle=o,dotsize=0.2](1;\INode) + \psline[linecolor=red]{->}(0.9;\INode)} + \PstPolygon[unit=2,PolyNbSides=8] +\end{SideBySideExample} + +\begin{SideBySideExample} + \providecommand{\PstPolygonNode}{% + \psline[linewidth=0.1mm,doubleline=true, + linecolor=green]{<->}(0;0)(1;\INode)} + \PstHexagon[unit=2] +\end{SideBySideExample} + +\begin{SideBySideExample} + \newbox{\Star} + \savebox{\Star}{% + \PstStarFive*[unit=0.15,linecolor=red]} + \providecommand{\PstPolygonNode}{% + \rput{*0}(1;\INode){\usebox{\Star}}} + \shortstack{% + \PstNonagon\\[5mm] + \PstDodecagon[linestyle=none]} +\end{SideBySideExample} + +\end{document} +%</tst-poly> +% \end{macrocode} +% +% +% \Finale +% \PrintIndex +% \PrintChanges +% +\endinput +%% +%% End of file `pst-poly.dtx' |