diff options
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/source/latex/pst-lens/pst-lens.dtx | 1171 |
1 files changed, 1171 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/pst-lens/pst-lens.dtx b/Master/texmf-dist/source/latex/pst-lens/pst-lens.dtx new file mode 100644 index 00000000000..2fcead70942 --- /dev/null +++ b/Master/texmf-dist/source/latex/pst-lens/pst-lens.dtx @@ -0,0 +1,1171 @@ +% \iffalse meta-comment, etc. +%% +%% Package `pst-lens.dtx' +%% +%% Denis Girou (CNRS/IDRIS - France) <Denis.Girou@idris.fr> +%% Manuel Luque <Mluque5130@aol.com> (ml) +%% Herbert Voss <voss@pstricks.de> (hv) +%% +%% September 03, 2005 +%% +%% This file is under the LaTeX Project Public License +%% See CTAN archives in directory macros/latex/base/lppl.txt. +%% +%% DESCRIPTION: +%% `pst-lens' is a PSTricks package to define a generic lens, which can be +%% used on texts and graphics. +%% +% \fi +% +% \changes{v1.01}{2005/09/03}{using the extended pst-xkey instead of pst-key. (hv)} +% \changes{v1.00}{2001/02/16}{First public release. (dg)} +% +% \DoNotIndex{\!,\",\#,\$,\%,\&,\',\(,\+,\*,\,,\-,\.,\/,\:,\;,\<,\=,\>,\?} +% \DoNotIndex{\@,\@B,\@K,\@cTq,\@f,\@fPl,\@ifnextchar,\@nameuse,\@oVk} +% \DoNotIndex{\[,\\,\],\^,\_,\ } +% \DoNotIndex{\^,\\^,\\\^,$\^$,$\\^$,$\\^$} +% \DoNotIndex{\0,\2,\4,\5,\6,\7,\8,} +% \DoNotIndex{\A,\a} +% \DoNotIndex{\B,\b,\Bc,\begin,\Bq,\Bqc} +% \DoNotIndex{\C,\c,\catcode,\cJA,\CodelineIndex,\csname} +% \DoNotIndex{\D,\def,\define@key,\Df,\divide,\DocInput,\documentclass,\pst@addfams} +% \DoNotIndex{\eCN,\edef,\else,\eHd,\eMcj,\EnableCrossrefs,\end,\endcsname} +% \DoNotIndex{\endCenterExample,\endExample,\endinput,\endpsclip} +% \DoNotIndex{\PrintIndex,\PrintChanges,\ProvidesFile} +% \DoNotIndex{\endpspicture,\endSideBySideExample,\Example} +% \DoNotIndex{\F,\f,\FdUrr,\fi,\filedate,\fileversion,\FV@Environment} +% \DoNotIndex{\FV@UseKeyValues,\FV@XRightMargin,\FVB@Example,\fvset} +% \DoNotIndex{\G,\g,\GetFileInfo,\gr,\GradientLoaded,\gsFKrbK@o,\gsj,\gsOX} +% \DoNotIndex{\hbadness,\hfuzz,\HLEmphasize,\HLMacro,\HLMacro@i} +% \DoNotIndex{\HLReverse,\HLReverse@i,\hqcu,\HqY} +% \DoNotIndex{\I,\i,\ifx,\input,\Ir,\IU} +% \DoNotIndex{\j,\jl,\JT,\JVodH} +% \DoNotIndex{\K,\k,\kfSlL} +% \DoNotIndex{\L,\let} +% \DoNotIndex{\message,\mHNa,\mIU} +% \DoNotIndex{\N,\nB,\newcmykcolor,\newdimen,\newif,\nW} +% \DoNotIndex{\O,\oCDJDo,\ocQhVI,\OnlyDescription,\oRKJ} +% \DoNotIndex{\P,\p,\ProvidesPackage,\psframe,\pslinewidth,\psset} +% \DoNotIndex{\PstAtCode,\PSTricksLoaded} +% \DoNotIndex{\q,\Qr,\qssRXq,\qu,\qXjFQp,\qYL} +% \DoNotIndex{\R,\r,\RecordChanges,\relax,\RlaYI,\rN,\Rp,\rp,\RPDXNn,\rput} +% \DoNotIndex{\S,\scalebox,\SgY,\SideBySide@Example,\SideBySideExample} +% \DoNotIndex{\SgY,\sk,\Sp,\space,\sZb} +% \DoNotIndex{\T,\the,\tw@} +% \DoNotIndex{\u,\UiSWGEf@,\uJi,\usepackage,\uVQdMM,\UYj} +% \DoNotIndex{\VerbatimEnvironment,\VerbatimInput,\VrC@} +% \DoNotIndex{\WhZ,\WjKCYb,\WNs} +% \DoNotIndex{\XkN,\XW} +% \DoNotIndex{\Z,\ZCM,\Ze} +% \DoNotIndex{\addtocounter,\advance,\alph,\arabic,\AtBeginDocument,\AtEndDocument} +% \DoNotIndex{\AtEndOfPackage,\begingroup,\bfseries,\bgroup,\box,\csname} +% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\expandafter,\fi} +% +% \setcounter{IndexColumns}{2} +% +% \newcommand{\PstLensPackage}{`\textsf{pst-lens}'} +% \newcommand{\PstBlurPackage}{`\textsf{pst-blur}'} +% \newcommand{\PstLensMacro}{\cs{PstLens}} +% +% ^^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 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} +% +% ^^A End of example macros from `fvrb-ex' +% +% ^^A Customizations of the "Verbatim" environment +% \RecustomVerbatimEnvironment{Verbatim}{Verbatim}% +% {gobble=4,frame=single,numbers=left,numbersep=3pt,commandchars=/?_} +% +% ^^A For the possible index and changes log +% \setlength{\columnseprule}{0.6pt} +% +% ^^A The basic text used for demonstration purposes. +% +% \def\Wishes{{% +% \rput[lb](0,0){% +% \Large +% \begin{minipage}{3cm} +% \centering +% \textbf{Best wishes}\\ +% Caroline,\\ +% for this new year\\ +% \Huge 2001 ! +% \end{minipage}}}} +% +% ^^A The second text used for demonstration purposes (poem from the French +% ^^A poet Arthur Rimbaud.) +% +% \def\TheEternity{{% +% \rput[lb](0,0){% +% \scriptsize +% \begin{minipage}{3.5cm} +% \centerline{\normalsize\textbf{L'\'Eternit\'e}} +% \vspace{5mm} +% \begin{raggedright} +% Elle est retrouv\'ee.\\ +% Quoi ? --- L'\'Eternit\'e.\\ +% C'est la mer all\'ee\\ +% Avec le soleil.\\[3mm] +% +% \^Ame sentinelle\\ +% Murmurons l'aveu\\ +% De la nuit si nulle\\ +% Et du jour en feu.\\[3mm] +% +% Des humains suffrages\\ +% Des communs \'elans\\ +% L\`a tu te d\'egages\\ +% Et voles selon.\\[3mm] +% +% Puisque de vous seules,\\ +% Braises de satin,\\ +% Le devoir s'exhale\\ +% Sans qu'on dise : enfin.\\[3mm] +% +% L\`a pas d'esp\'erance,\\ +% Nul orietur.\\ +% Science avec patience,\\ +% Le supplice est s\^ur.\\[3mm] +% +% Elle est retrouv\'ee.\\ +% Quoi ? --- L'\'Eternit\'e.\\ +% C'est la mer all\'ee\\ +% Avec le soleil.\\[3mm] +% \end{raggedright} +% \flushright{\normalsize\textbf{Arthur Rimbaud}} +% \end{minipage}}}} +% +% ^^A One of the Truchet's tilings, for demonstration purposes +% +% ^^A The four elementary tiles for it +% +% \def\TruchetTileA{\pspolygon*(0,0)(0,1)(1,0)} +% \def\TruchetTileB{\pspolygon*(0,0)(0,1)(1,1)} +% \def\TruchetTileC{\pspolygon*(0,1)(1,1)(1,0)} +% \def\TruchetTileD{\pspolygon*(0,0)(1,0)(1,1)} +% +% \def\TruchetTilingA#1#2{{% +% \psset{dimen=middle} +% \pst@cntb=#2 +% \psframe(#1,#2) +% \whiledo{\pst@cntb>\z@}{% +% \advance\pst@cntb\m@ne +% \pst@cnta=\z@ +% \whiledo{\pst@cnta<#1}{% +% \rput(\pst@cnta,\pst@cntb){\TruchetTileB}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileA}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileD}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileC}\advance\pst@cnta\@ne} +% \advance\pst@cntb\m@ne +% \pst@cnta=\z@ +% \whiledo{\pst@cnta<#1}{% +% \rput(\pst@cnta,\pst@cntb){\TruchetTileC}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileD}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileA}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileB}\advance\pst@cnta\@ne} +% \advance\pst@cntb\m@ne +% \pst@cnta=\z@ +% \whiledo{\pst@cnta<#1}{% +% \rput(\pst@cnta,\pst@cntb){\TruchetTileD}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileC}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileB}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileA}\advance\pst@cnta\@ne} +% \advance\pst@cntb\m@ne +% \pst@cnta=\z@ +% \whiledo{\pst@cnta<#1}{% +% \rput(\pst@cnta,\pst@cntb){\TruchetTileA}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileB}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileC}\advance\pst@cnta\@ne +% \rput(\pst@cnta,\pst@cntb){\TruchetTileD}\advance\pst@cnta\@ne}}}} +% +% \def\TruchetTiling{{% +% \rput[lb](0,0){\psset{unit=0.5}\TruchetTilingA{12}{12}}}} +% +% ^^A Van Koch curve and Siepinski triangle fractals, for demonstration +% ^^A purposes +% +% ^^A The recursion macro used (from David Carlisle) +% +% \newcount\DeepRecursion +% +% \def\Recursion #1{% +% #1\relax +% \expandafter\@firstoftwo +% \else +% \expandafter\@secondoftwo +% \fi} +% +% ^^A General definition of a fractal +% +% \def\PstFractal#1{% +% \ifx\PstFractalBegin\@undefined +% \else +% \PstFractalBegin +% \fi +% \Recursion +% {\ifnum#1>1\relax} +% {\DeepRecursion=#1% +% \advance\DeepRecursion by -1% +% \PstFractalRepeat{\DeepRecursion}} +% {\PstFractalDefinition}} +% +% ^^A Sierpinski triangle +% +% \def\PstSierpinskiTriangle#1{{% +% \rput[lb](0,0){% +% \psset{unit=3} +% \def\PstFractalDefinition{% +% \pspolygon*[linecolor=\PstSierpinskiExternalColor](1;0)(1;1)(1;2) +% \rput{-2}(0,0){\pspolygon*[linecolor=\PstSierpinskiInternalColor]% +% (0.5;0.5)(0.5;1.5)(0.5;2.5)}}% +% \def\PstFractalBegin{\PstFractalDefinition}% +% \def\PstFractalRepeat##1{% +% \rput(0.5;0){\psset{unit=0.5}\PstFractal{##1}} +% \rput(0.5;1){\psset{unit=0.5}\PstFractal{##1}} +% \rput(0.5;2){\psset{unit=0.5}\PstFractal{##1}}}% +% \rput{90}(0,0){% +% \SpecialCoor +% \degrees[3] +% \PstFractal{#1}}}}} +% +% ^^A Von Koch curve +% +% \def\PstVonKochCurve#1{{% +% \rput[lb](0,0){% +% \psset{unit=3} +% \def\PstFractalDefinition{\psline(0,0)(1,0)(1.5,0.8660254)(2,0)(3,0)}% +% \def\PstFractalRepeat##1{% +% \rput(0,0){\psset{unit=0.3333}\PstFractal{##1}} +% \rput{60}(1,0){\psset{unit=0.3333}\PstFractal{##1}} +% \rput{-60}(1.5,0.866){\psset{unit=0.3333}\PstFractal{##1}} +% \rput(2,0){\psset{unit=0.3333}\PstFractal{##1}}}% +% \PstFractal{#1}}}} +% +% \makeatother +% +% +% ^^A Beginning of the documentation itself +% +% \title{The \PstLensPackage{} package\\A PSTricks package for lens} +% \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>}}.}\\ +% and\\ +% Manuel \textsc{Luque}\thanks{\mbox{\texttt{<Mluque5130@aol.com>}}. +% The original idea and the first version of the lens were from +% Manuel \textsc{Luque}.}} +% \date{Version \pstLensFileVersion\ \pstLensFileDate\ \\ +% {\small Documentation revised \today\ (hv)}} +% +% \maketitle +% +% \begin{abstract} +% This package define a lens which can be used in various contexts +% to simulate the effect of a lens, using the unique macro \PstLensMacro, +% with some 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, without +% considering the various customizations, is only 7~lines long!) +% but nevertheless 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. +% +% \verb+pst-lens+ uses the extended version of the keyval interface. Be sure, that +% you have installed the \verb+xkeyval+ package. Otherwise get it from \verb+CTAN+. +% \end{abstract} +% +% \clearpage +% \tableofcontents +% +% \section{Introduction} +% +% \PstLensPackage{} offer a unique macro with some parameters to interact +% on it. +% +% \vspace{1mm} +% \def\ParamObject{\textbraceleft Object\textbraceright} +% The syntax is simply: +% \fbox{\PstLensMacro\texttt{[optional\_parameters]\textit{(x,y)}\ParamObject}} +% +% \vspace{1mm} +% \texttt{\textit{(x,y)}} is a PSTricks coordinate, which as usual is taken +% as \texttt{(0,0)} if it is not defined. +% +% To use the lens, we must define a \texttt{pspicture} environment, +% optionally draw the object and then call the \PstLensMacro{} macro on it. +% +% \section{Usage} +% +% We will use the following textual object to illustrate our examples +% (note that we must define the reference point at the left bottom corner, +% as it is the normal behavior of PSTricks): +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% Z\begin{pspicture}(3,4) +% Z \psgrid[subgriddiv=0,griddots=5] +% /HLMacro?\def\Wishes_{{% +% \rput[lb](0,0){% +% \Large +% \begin{minipage}{3cm} +% \centering +% \textbf{Best wishes}\\ +% Caroline,\\ +% for this new year\\ +% \Huge 2001 ! +% \end{minipage}}}} +% +% \Wishes +% Z\end{pspicture} +% \end{SideBySideExample} +% +% \subsection{Parameters} +% +% There are \textbf{9} specific parameters defined to change the way the +% lens works: +% +% \begin{optlist} +% \item [LensMagnification (real)]: magnification to apply for the lens +% (\emph{Default:~1} --- no~magnification). +% \end{optlist} +% +% \begin{CenterExample} +% \begin{pspicture}(0,-1.5)(3,4) +% \Wishes +% \PstLens[LensMagnification=2](2,2){\Wishes} +% \end{pspicture} +% \hfill +% \begin{pspicture}(0,-1.5)(3,4) +% \Wishes +% \PstLens[LensMagnification=4](1,2.4){\Wishes} +% \end{pspicture} +% \hfill +% \begin{pspicture}(0,-1.5)(3.5,4) +% \Wishes +% \PstLens[LensMagnification=0.5](1,1){\Wishes} +% \PstLens[LensMagnification=-0.5](2.5,3){\Wishes} +% \end{pspicture} +% \end{CenterExample} +% +% \begin{optlist} +% \item [LensSize (real or length)]: value of the radius of the glass of the +% lens (\emph{Default:~1}). +% \end{optlist} +% +% \noindent Note that the size of the handle will change accordingly. +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-4)(3,3.5) +% \Wishes +% \PstLens[LensSize=2](1,1){\Wishes} +% \PstLens[LensSize=0.5](3,3){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensRotation (real)]: rotation angle applied to the lens +% (\emph{Default:~0} --- no rotation). +% \end{optlist} +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-1)(3,3.8) +% \Wishes +% \PstLens[LensRotation=80]{\Wishes} +% \PstLens[LensRotation=-108.5](2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensHandle (boolean)]: boolean value to choose between to draw +% a handle for the lens or not. +% (\emph{Default:~true} --- handle). +% \end{optlist} +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(3,3.5) +% \Wishes +% \PstLens[LensHandle=false](2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensHandleWidth (real or length)]: width of the handle +% (\emph{Default:~0.2 for \texttt{LensSize=1}}). +% \end{optlist} +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-2.5)(3,3.5) +% \Wishes +% \PstLens[LensHandleWidth=0.1]{\Wishes} +% \PstLens[LensHandleWidth=4mm](2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensHandleHeight (real or length)]: height of the handle +% (\emph{Default:~2.5 for \texttt{LensSize=1}}). +% \end{optlist} +% +% Take care that this length is between the \emph{center} of the glass and +% the bottom of the handle. +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-2)(3,3.5) +% \Wishes +% \PstLens[LensHandleHeight=15mm]{\Wishes} +% \PstLens[LensHandleHeight=4](2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensStyleHandle (style)]: name of the PSTricks style for the +% handle. +% (\emph{Default: LensStyleHandle}). +% \end{optlist} +% +% \noindent Its default value is: +% +% \begin{Verbatim} +% \newpsstyle{/HLReverse?LensStyleHandle_}{% +% fillstyle=gradient,framearc=0.6,linewidth=0.5\pslinewidth, +% gradmidpoint=0.5,gradangle=\PstLens@Rotation, +% gradbegin=Brown,gradend=Salmon} +% \end{Verbatim} +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-2.5)(3,3.5) +% \Wishes +% \newpsstyle{/HLReverse?HandleYellow_}{% +% linecolor=red,framearc=1, +% fillstyle=solid,fillcolor=yellow} +% \PstLens[LensHandleWidth=0.5, +% LensStyleHandle=HandleYellow] +% {\Wishes} +% \newpsstyle{/HLReverse?HandleCrosshatch_}{% +% fillstyle=crosshatch*,fillcolor=white} +% \PstLens[LensStyleHandle=HandleCrosshatch] +% (2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensShadow (boolean)]: boolean value to choose between to draw +% a shadow for the glass of the lens or not. +% (\emph{Default:~true} --- shadow). +% \end{optlist} +% +% Note that if we redefine the \texttt{LensStyleGlass} parameter without +% explicitely require a shadow, there will be none even if \texttt{LensShadow} +% will have the \texttt{true} value. +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-0.5)(3,3.5) +% \Wishes +% \PstLens[LensShadow=false](2,2){\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{optlist} +% \item [LensStyleGlass (style)]: name of the PSTricks style for the glass. +% (\emph{Default: LensStyleGlass}). +% \end{optlist} +% +% It allow to change the appearance of the glass, but its main utility is +% probably to be able to define the style of the shadow of the glass. +% Default definition is: +% +% \begin{Verbatim} +% \newpsstyle{/HLReverse?LensStyleGlass_}{% +% fillstyle=solid,fillcolor=white, +% shadow=true,shadowcolor=lightgray,shadowsize=0.15, +% shadowangle=\PstLens@Rotation} +% \end{Verbatim} +% +% Take care that if we will use later the \texttt{LensRotation} parameter +% with \texttt{LensShadow} positioned, we must set the value of the +% \texttt{shadowangle} parameter to \cs{PstLens@Rotation} to have the shadow +% rotate accordingly. +% +% And for better shadow effects, you must look at the \PstBlurPackage{} +% package from Martin \textsc{Giese}. +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(3,4) +% \Wishes +% \makeatletter +% \newpsstyle{/HLReverse?DarkShadow_}{% +% fillstyle=solid,fillcolor=white, +% shadow=true,shadowcolor=darkgray, +% shadowsize=0.2, +% shadowangle=\PstLens@Rotation} +% \makeatother +% \PstLens[LensRotation=230, +% LensStyleGlass=DarkShadow](2,2) +% {\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \begin{SideBySideExample}[xrightmargin=3.8cm] +% \begin{pspicture}(0,-0.5)(3,3.5) +% \Wishes +% \newpsstyle{/HLReverse?YellowGlass_}{% +% linecolor=red,linewidth=0.1, +% fillstyle=solid,fillcolor=yellow} +% \PstLens[LensStyleGlass=YellowGlass](2,2) +% {\Wishes} +% \end{pspicture} +% \end{SideBySideExample} +% +% \subsection{Shape of the glass} +% +% The \cs{PstLensShape} macro define the shape of the glass. It default +% value is a circle, as in real life, but we can redefine it for various +% effects... +% +% \begin{CenterExample} +% \psset{LensMagnification=1.5} +% \begin{pspicture}(0,-1.8)(4,3.8) +% \Wishes +% \renewcommand{\PstLensShape}{\psellipse(2,1)} +% \PstLens(2,2){\Wishes} +% \end{pspicture} +% \hfill +% \begin{pspicture}(-0.5,-1.8)(4,3.8) +% \Wishes +% \renewcommand{\PstLensShape}{\pstriangle(3,1)} +% \PstLens[LensSize=1.5](2,2){\Wishes} +% \end{pspicture} +% \hfill +% \begin{pspicture}(0,-1.8)(3.5,3.8) +% \Wishes +% \renewcommand{\PstLensShape}{% +% \rput{18}{\pspolygon(1;0)(1;144)(1;288)(1;72)(1;216)}} +% \PstLens[LensSize=1.5](2,2){\Wishes} +% \end{pspicture} +% +% \begin{pspicture}(0,-0.5)(4,3.5) +% \renewcommand{\PstLensShape}{% +% \parabola[fillstyle=solid,fillcolor=white](-1,-1.5)(1,2)} +% \Wishes +% \PstLens[LensShadow=false,LensHandle=false](1,1){\Wishes} +% \end{pspicture} +% \hfill +% \begin{pspicture}(-1.5,-1)(3.5,3.5) +% \renewcommand{\PstLensShape}{% +% \psccurve(-1,-1)(0,1.2)(0.5,-1)(1,0.8)} +% \Wishes +% \PstLens[LensSize=2,LensHandle=false](1,1){\Wishes} +% \end{pspicture} +% \end{CenterExample} +% +% \subsection{Examples} +% +% We can use the lens for all textual objects and for all PSTricks graphic +% objects (we use here some versions of tilings and fractals, but only basic +% ones to avoid requiring too much memory from old \TeX{} systems, to compile +% the file). +% +% And specially take care to explicitely position the reference point +% at the left bottom corner and to compute the correct dimensions for the +% \texttt{pspicture} environment (in our examples, we choose most of the time +% to include the lens inside the bounding boxes, but we can choose to define +% them just for the objects). +% +% \begin{Verbatim} +% /HLMacro?\def\TheEternity_{{% +% \rput[lb](0,0){% +% \scriptsize +% \begin{minipage}{3.5cm} +% \centerline{\normalsize\textbf{L'\'Eternit\'e}} +% ... +% /HLMacro?\def\TruchetTiling_#1#2{{% +% \rput[lb](0,0){% +% ... +% /HLMacro?\def\PstSierpinskiTriangle_#1{{% +% \rput[lb](0,0){% +% ... +% /HLMacro?\def\PstVonKochCurve_#1{{% +% \rput[lb](0,0){% +% ... +% \end{Verbatim} +% +% \begin{CenterExample} +% \newpsstyle{/HLReverse?SimpleGlass_}{fillstyle=solid,fillcolor=white} +% \newpsstyle{/HLReverse?SimpleHandle_}{fillstyle=solid,fillcolor=white, +% framearc=0.5} +% \psset{LensStyleGlass=SimpleGlass,LensStyleHandle=SimpleHandle} +% +% \begin{pspicture}(-1,-2.5)(5,10.5) +% \TheEternity +% \PstLens[LensSize=2,LensMagnification=4,LensRotation=40] +% (1.5,6){\TheEternity} +% \PstLens[LensSize=1.5,LensMagnification=2,LensRotation=-20] +% (0.5,2){\TheEternity} +% \end{pspicture} +% \hfill +% \begin{pspicture}(-2,-2.5)(4,10.5) +% \TheEternity +% \PstLens[LensMagnification=0.5,LensRotation=140] +% (1,8.5){\TheEternity} +% \PstLens[LensSize=2.5,LensMagnification=3,LensRotation=-100] +% (2.4,0){\TheEternity} +% \end{pspicture} +% \end{CenterExample} +% +% \begin{CenterExample} +% \begin{pspicture}(0,-6)(6,6) +% \TruchetTiling +% \PstLens[LensSize=2.5,LensMagnification=2.5](3.5,1) +% {\TruchetTiling} +% \end{pspicture} +% \end{CenterExample} +% +% \begin{CenterExample} +% \newcommand{\PstSierpinskiInternalColor}{red} +% \newcommand{\PstSierpinskiExternalColor}{yellow} +% +% % /HLEmphasize?The Sierpinski triangle is in a unit circle of radius 1,_ +% % /HLEmphasize?so we must define the "pspicture" accordingly: (-3,-2)(3,3)_ +% \begin{pspicture}(-3,-2)(3,3) +% \PstSierpinskiTriangle{3} +% \end{pspicture} +% \hfill +% \begin{pspicture}(-3,-2)(3,3) +% \PstSierpinskiTriangle{3} +% \psset{LensShadow=false} +% \PstLens[LensMagnification=2,LensRotation=-80](-1,0) +% {\PstSierpinskiTriangle{3}} +% \PstLens[LensSize=2,LensMagnification=5,LensRotation=100, +% LensHandle=false](1,1){\PstSierpinskiTriangle{3}} +% \end{pspicture} +% +% \begin{pspicture}(-1,-2)(11,5) +% \PstVonKochCurve{3} +% \PstLens[LensSize=1.2,LensMagnification=2,LensRotation=-50] +% (1.5,0.6){\PstVonKochCurve{3}} +% \PstLens[LensSize=2.5,LensMagnification=5,LensRotation=160, +% LensHandleHeight=2](6.2,0.2){\PstVonKochCurve{3}} +% \end{pspicture} +% \end{CenterExample} +% +% Of course, as for all PSTricks objects, we can apply to them some +% transformations. For instance, we can project them in the 3~dimensional +% space, with the general \cs{ThreeDput} macro or the simple \cs{pstilt} one. +% +% \begin{CenterExample} +% \psset{LensMagnification=1.5} +% \begin{pspicture}(0.8,-1.5)(5.3,3) +% \renewcommand{\PstLensShape}{\psdiamond(1.5,1)} +% \pstilt{60}{% +% \Wishes +% \PstLens[LensSize=1.5](2,2){\Wishes}} +% \end{pspicture} +% \hfill +% \begin{pspicture}(-3,-0.5)(3.5,8) +% \psset{viewpoint=0.5 -2 5,LensHandleHeight=3.5} +% \multido{\nPosX=0+-0.8,\nPosY=8+-1.5,\nMag=3+-0.5}{5}{% +% \ThreeDput(\nPosX,\nPosY,0){% +% \PstLens[LensMagnification=\nMag](0.6,0.2) +% {\rput[lb](0,0){Danger!}}}} +% \end{pspicture} +% \end{CenterExample} +% +% \noindent And we can also use the lens on non PSTricks graphics, +% as external images. +% +% \begin{CenterExample} +% \newcommand{\tigerHead}{% +% \rput[lb](0,0){% +% \includegraphics[width=4cm,height=5cm]{tiger}}} +% \newpsstyle{/HLReverse?SimpleGlass_}{linestyle=none} +% \psset{LensStyleGlass=SimpleGlass} +% +% \begin{pspicture}(0,-1)(4,5) +% \tigerHead +% \end{pspicture} +% \hfill +% \begin{pspicture}(-0.5,-1)(3,5) +% \PstLens[LensHandle=false,LensSize=1.8,LensMagnification=2] +% (1.2,2.3){\tigerHead} +% \end{pspicture} +% \hfill +% \newpsstyle{/HLReverse?SimpleHandle_}{fillstyle=solid,fillcolor=white, +% framearc=0.5} +% \psset{LensStyleHandle=SimpleHandle} +% \begin{pspicture}(0,-1)(4,5) +% \tigerHead +% \PstLens[LensSize=1.5,LensMagnification=4] +% (1.5,2.5){\tigerHead} +% \end{pspicture} +% \end{CenterExample} +% +% +% \begin{CenterExample} +% \def\Persistance{{% +% \rput(0,0){%
+% \begin{minipage}{6cm}
+% \centerline{\normalsize\textbf{La persistance rétinienne}}
+% \vspace{5mm}
+% La persistance des impressions lumineuses, ou maintien de la +% sensation lumineuse après que l'excitation ait disparue, est +% connue depuis la plus haute antiquité. \textsc{Aristote} +% (Sur le Songes) et \textsc{Lucrèce} (De Natura Rerum),
+% entre autres, constatent son existence et proposent le +% premières explications, à la mesure de leurs moyens. +% Au fil des siècles, Guillaume de Saint Cloud (1285), +% Léonard de Vinci, Newton et bien d'autres s'intéressent aussi +% à la question de l'observation des éclipses de Soleil. +%
+% Toutefois, la mesure de la durée de persistance n'aura lieu qu'au
+% \textsc{xiii}\textsuperscript{eme} siècle. Reprenant une
+% observation déjà formulée par Léonard de Vinci :
+%
+% <<\ldots si tu agites un tison enflammé, le cercle que tu lui feras +% tracer semblera un anneau de feu.>>, Patrice d'\textsc{Arcy} +% imagine en 1765 toute une machinerie pour effectuer des mesures à +% peu près fiables. Un charbon ardent est fixé à la périphérie d'une +% roue qu'un mécanisme de poids et de volants met en rotation +% uniforme. En raison de la persistance des impressions lumineuses, +% la braise semble décrire un arc de cercle, d'autant plus grand que +% la vitesse de rotation est plus importante. Quand la durée d'un +% tour est égale à celle de la persistance de la sensation lumineuse, +% la trace décrit un tour complet. À la suite de nombreuses +% expériences, d'\textsc{Arcy} aboutit à la valeur de 8 tierces, à +% peu près 130 millisecondes. +% \flushright{\normalsize\textbf{Miche HENRY}}
+% \end{minipage}}}} +% +% \begin{pspicture}*(-3,-5)(3,5) +% \Persistance +% \PstLens[LensSize=2.5,LensMagnification=2,LensRotation=20]% +% (0,1.5){\Persistance} +% \end{pspicture}\hfill +% \begin{pspicture}*(-3,-5)(3,5) +% \Persistance +% \PstLens[LensSize=2,LensMagnification=0.6,LensRotation=-20]% +% (0,1.5){\Persistance} +% \end{pspicture} +% \end{CenterExample} +% +% +% \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-lens.dtx} +\usepackage[T1]{fontenc} +\usepackage{fancyvrb} +\usepackage{graphicx} +\usepackage{ifthen} +\usepackage{multido} +\usepackage{pstricks} +\usepackage{pst-lens} +\let\pstLensFileVersion\fileversion +\let\pstLensFileDate\filedate +\usepackage{pst-3d} +\AtBeginDocument{ +% \OnlyDescription % comment out for implementation details + \EnableCrossrefs + \RecordChanges + \CodelineIndex +} +\AtEndDocument{ + \PrintChanges + \PrintIndex +} +\hbadness=7000 % Over and under full box warnings +\hfuzz=3pt +\begin{document} + \DocInput{pst-lens.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{\PstLensPackage{} \LaTeX{} wrapper} +% +% \begin{macrocode} +%<*latex-wrapper> +\RequirePackage{pstricks} +\ProvidesPackage{pst-lens}[2005/09/02 package wrapper for + pst-lens.tex (hv)] +\input{pst-lens.tex} +\ProvidesFile{pst-lens.tex} + [\filedate\space v\fileversion\space `PST-lens' (hv)] +%</latex-wrapper> +% \end{macrocode} +% +% \section{\PstLensPackage{} code} +% +% \begin{macrocode} +%<*pst-lens> +% \end{macrocode} +% +% \subsection{Preambule} +% +% Who we are. +% +% \begin{macrocode} +\csname PSTLensLoaded\endcsname +\let\PSTLensLoaded\endinput +% \end{macrocode} +% +% Require the PSTricks and `\textsf{pst-grad}' packages. +% +% \begin{macrocode} +\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi +\ifx\GradientLoaded\endinput\else\input pst-grad.tex\fi +\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi % (hv 2005-09-03) +% \end{macrocode} +% +% Catcodes changes. +% +% \begin{macrocode} +\edef\PstAtCode{\the\catcode`\@} +\catcode`\@=11\relax +\pst@addfams{pst-lens} +\def\fileversion{1.01} +\def\filedate{2005/09/03} +\message{`PST-Lens' v\fileversion, \filedate\space + (Denis Girou and Manuel Luque)} +% \end{macrocode} +% +% \subsection{Definition of the parameters} +% +% \texttt{LensHandle} will define if we will draw an handle to the lens +% or not. It is a \emph{boolean} value. +% +% \begin{macrocode} +\newif\ifPstLens@Handle +\define@key[psset]{pst-lens}{LensHandle}[true]{% + \@nameuse{PstLens@Handle#1}} +% \end{macrocode} +% +% \texttt{LensStyleHandle} is the name of the PSTricks style to draw +% the handle of the lens. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensStyleHandle}{% + \def\PstLens@StyleHandle{#1}} +% \end{macrocode} +% +% \texttt{LensHandleWidth} will be the size of the lens. +% This is a \emph{real} or \emph{length} value, as all PSTrisks dimensions, +% but as we will have to make computations with it, we store it in a dimension +% register. +% +% \begin{macrocode} +\newdimen\PstLens@HandleWidth +\define@key[psset]{pst-lens}{LensHandleWidth}{% + \pssetlength{\PstLens@HandleWidth}{#1}} +% \end{macrocode} +% +% \texttt{LensHandleHeight} will be the size of the lens. +% This is a \emph{real} or \emph{length} value, as all PSTrisks dimensions, +% but as we will have not to make computations with it, we store it in a +% simple macro. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensHandleHeight}{% + \def\PstLens@HandleHeight{#1}} +% \end{macrocode} +% +% \texttt{LensShadow} will define if we will draw a shadow to the glass +% of the lens or not. It is a \emph{boolean} value. +% +% \begin{macrocode} +\newif\ifPstLens@Shadow +\define@key[psset]{pst-lens}{LensShadow}[true]{% + \@nameuse{PstLens@Shadow#1}} +% \end{macrocode} +% +% \texttt{LensStyleGlass} is the name of the PSTricks style to draw +% the glass. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensStyleGlass}{% + \def\PstLens@StyleGlass{#1}} +% \end{macrocode} +% +% \texttt{LensSize} will be the size of the lens. +% This is a \emph{real} or \emph{length} value, as all PSTrisks dimensions, +% but as we will have not to make computations with it, we store it in a +% simple macro. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensSize}{% + \def\PstLens@Size{#1}} +% \end{macrocode} +% +% \texttt{LensMagnification} will be the magnification to apply to the lens. +% This is a \emph{real} or \emph{length} value, but as we will have not +% to make computations with it, we strore it in a simple macro. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensMagnification}{% + \def\PstLens@Magnification{#1}} +% \end{macrocode} +% +% \texttt{LensRotation} will be the rotation angle to apply to the lens. +% It is a \emph{real} value used as an \emph{angle}. +% +% \begin{macrocode} +\define@key[psset]{pst-lens}{LensRotation}{% + \def\PstLens@Rotation{#1}} +% \end{macrocode} +% +% Next, we set the default values for all these new parameters. +% We choose to have an handle of width 0.2 unit and height of 2.5 unit, +% LensStyleHandle as style for the handle, a shadow to the glass, +% LensStyleGlass as style for it, no rotation, a size equal to 1 unit +% and no magnification (so of value 1). +% +% \begin{macrocode} +\psset[pst-lens]{% + LensHandle=true,LensHandleWidth=0.2,LensHandleHeight=2.5, + LensStyleHandle=LensStyleHandle, + LensShadow=true,LensStyleGlass=LensStyleGlass, + LensRotation=0,LensSize=1,LensMagnification=1} +% \end{macrocode} +% +% We define also the default style for the handle. +% +% \begin{macrocode} +\newcmykcolor{Brown}{0 0.81 1 0.6} +\newcmykcolor{Salmon}{0 0.53 0.38 0} +\newpsstyle{LensStyleHandle}{% + fillstyle=gradient,framearc=0.6,linewidth=0.5\pslinewidth, + gradmidpoint=0.5,gradangle=\PstLens@Rotation,gradbegin=Brown,gradend=Salmon} +% \end{macrocode} +% +% And the default style for the glass (we only define a shaow for it). +% +% \begin{macrocode} +\newpsstyle{LensStyleGlass}{% + fillstyle=solid,fillcolor=white, + shadow=true,shadowcolor=lightgray,shadowsize=0.15, + shadowangle=\PstLens@Rotation} +% \end{macrocode} +% +% Then we define the default shape for the lens (a circle of radius 1 and +% center (0,0)). +% +% \begin{macrocode} +\def\PstLensShape{\pscircle{1}} +% \end{macrocode} +% +% \subsection{Main macro} +% +% The general \cs{PstLens} macro to draw lens. +% +% \begin{macro}{\PstLens} +% \begin{macrocode} +\def\PstLens{\@ifnextchar[{\PstLens@i}{\PstLens@i[]}} +% \end{macrocode} +% \end{macro} +% +% We first check if the coordinate is given, and if not we choose as usual +% (0,0) as default one. +% +% \begin{macro}{\PstLens@i} +% \begin{macrocode} +\def\PstLens@i[#1]{\@ifnextchar({\PstLens@ii[#1]}{\PstLens@ii[#1](0,0)}} +% \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}{\PstLens@ii} +% \begin{macrocode} +\def\PstLens@ii[#1](#2,#3)#4{{% +% \end{macrocode} +% +% After that, we can set the values of local parameters if defined. +% +% \begin{macrocode} +\psset{#1}% +% \end{macrocode} +% +% Now, we can start the \emph{real} code. First, we must be able to use +% PostScript expressions as coordinates. +% +% \begin{macrocode} +\SpecialCoor +% \end{macrocode} +% +% Then, if the handle is not suppressed, we position it at the required +% coordinate, with it specified rotation. +% +% \begin{macrocode} +\rput{\PstLens@Rotation}(#2,#3){% + \ifPstLens@Handle + \scalebox{\PstLens@Size}{% + \divide\PstLens@HandleWidth\tw@ + \psframe[style=\PstLens@StyleHandle] + (-\PstLens@HandleWidth,0) + (\PstLens@HandleWidth,-\PstLens@HandleHeight)}% + \fi} +% \end{macrocode} +% +% Now, we can draw the object at the specified position, but surimposing on +% it a shape which will represent the glass of the lens, and we use the +% powerful clipping mechanism to eliminate the parts of the object not inside +% this shape. +% +% \begin{macrocode} +\psclip{{\psset{style=\PstLens@StyleGlass} + \ifPstLens@Shadow + \else + \psset{shadow=false} + \fi + \rput(#2,#3){\psset{unit=\PstLens@Size}\PstLensShape}}} +% \end{macrocode} +% +% Then we draw again the object, but with the specified magnification. +% It require also to recompute the coordinates where to put the object, +% according to the magnification. +% +% \begin{macrocode} + \rput(! 1 \PstLens@Magnification\space sub #2\space mul + 1 \PstLens@Magnification\space sub #3\space mul){% + \scalebox{\PstLens@Magnification}{#4}} +% \end{macrocode} +% +% To finish we close the clipping mechanism and the \cs{PstLens@ii} macro. +% +% \begin{macrocode} +\endpsclip}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Closing} +% +% Catcodes restoration. +% +% \begin{macrocode} +\catcode`\@=\PstAtCode\relax +% \end{macrocode} +% +% \begin{macrocode} +%</pst-lens> +% \end{macrocode} +% +\endinput +%% +%% End of file `pst-lens.dtx' |