% \iffalse meta-comment, etc. %% %% Package `pst-lens.dtx' %% %% Denis Girou (CNRS/IDRIS - France) %% Manuel Luque (ml) %% Herbert Voss (hv) %% %% June 06, 2006 %% %% 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.02}{2006/06/06}{using psscalebox instead of scalebox. (hv)} % \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,\psscalebox,\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{}}.}\\ % and\\ % Manuel \textsc{Luque}\thanks{\mbox{\texttt{}}. % 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 defines 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} % % \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)] % % \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.02} \def\filedate{2006/06/06} \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 \psscalebox{\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){% \psscalebox{\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} % % \end{macrocode} % \endinput %% %% End of file `pst-lens.dtx'