diff options
author | Karl Berry <karl@freefriends.org> | 2009-01-30 00:07:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-01-30 00:07:44 +0000 |
commit | 233e8430afec69ca29c28c798cc0912785ea29d1 (patch) | |
tree | 77b0bea1f6629464d7b3b9b776f8e4af86f0504e /Master/texmf-dist/tex/generic/pst-bezier | |
parent | 8eb0c96ca66f661f5ab3b61a641c3ef7ec79fea1 (diff) |
new pstricks package pst-bezier (29jan09)
git-svn-id: svn://tug.org/texlive/trunk@12014 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-bezier')
-rw-r--r-- | Master/texmf-dist/tex/generic/pst-bezier/pst-bezier.tex | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-bezier/pst-bezier.tex b/Master/texmf-dist/tex/generic/pst-bezier/pst-bezier.tex new file mode 100644 index 00000000000..a13a8fb239c --- /dev/null +++ b/Master/texmf-dist/tex/generic/pst-bezier/pst-bezier.tex @@ -0,0 +1,335 @@ +%% $Id: pst-bezier.tex 87 2009-01-29 10:37:06Z herbert $ +%% +%% This is file `pst-bezier.tex', +%% +%% IMPORTANT NOTICE: +%% +%% Package `pst-bezier.tex' +%% +%% Tobias Nähring (www.tn-home.de) +%% Herbert Voss <voss@PSTricks.de> +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory CTAN:/macros/latex/base/lppl.txt. +%% +%% DESCRIPTION: +%% `pst-bezier' is a PSTricks package to draw spline curves +%% +%% +\csname PSTbezierLoaded\endcsname +\let\PSTbezierLoaded\endinput + +\def\fileversion{0.01} +\def\filedate{2009/01/29} +\message{ v\fileversion, \filedate} + +\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi +\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi + +\edef\TheAtCode{\the\catcode`\@}\catcode`\@=11 + +\pst@addfams{pst-bezier} + +%% We need this: +\expandafter\if\csname gobble\endcsname\relax\def\gobble#1{}\fi +%% +%% \newcommand is not native TeX. Therefore the following definition. +%%%%%%%%%%%% +%% \defopt defines a macro with one optional argument. +%% Syntax: +%% \defopt\MyNewMacro{DefaultValue}[#1]#2{StuffToBeAssignedToMyNewMacro} +%% where \myNewMacro, DefaultValue, and StuffToBeAssignedToMyNewMacro +%% have the obvious meaning. Instead of #2 up to #9 arguments can be +%% specified. +\def\defopt#1#2{% + \def\defopt@tmp##1{% + \expandafter\def\csname##1\endcsname{% + \def\defopt@tmp{\futurelet\defopt@arg}% + \expandafter\defopt@tmp\csname##1@opt\endcsname% + }% + \expandafter\def\csname##1@opt\endcsname{% + \if\defopt@arg[%] + \def\next{\csname##1@@opt\endcsname}% + \else% + \def\next{\csname##1@@opt\endcsname[#2]}% + \fi\next}% + }% + \edef\defopt@arg{\expandafter\gobble\string#1} + \expandafter\defopt@tmp\expandafter{\defopt@arg}% + \expandafter\def\csname\expandafter\gobble\string#1@@opt\endcsname% +} +%% The postscript part of pst-bezier: +\pstheader{pst-bezier.pro} + +%% A list of TeX-code fragments is generated when parsing \psbcurve. +%% The list is managed with the help of these two counters: +\newcount\psbcurve@codeCntrEnd +\newcount\psbcurve@codeCntr +%% These counters should never be set globally. +%% Also the code fragments should never be set globally. +%% The list entries are numberated (therefore the entries can be +%% accessed via \csname only). +%% E. g. for the third entry you have the following items: +%% \csname psbcurve@code3l\endcsname (the left control point) +%% \csname psbcurve@code3r\endcsname (the right control point) +%% \csname psbcurve@code3\endcsname (the interpolated point) +%% \csname psbcurve@code3sl\endcsname (the left scaling factor) +%% \csname psbcurve@code3sr\endcsname (the right scaling factor) +%% \csname psbcurve@code3addon\endcsname (additional code that is run at +%% first) +%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Auxiliary macros for dealing +%% with the list TeX-code fragments +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Syntax: +%% \psbcurve@def[offset]{item}{TeXcode} +%% Where offset is some number (default:0), +%% and item is one of {l,r,sl,sr,addon}. +%% TeXcode will be assigned to the item of the list entry at +%% \psbcurve@codeCntrEnd + offset. +\defopt\psbcurve@def{0}[#1]#2{ + \psbcurve@codeCntr\psbcurve@codeCntrEnd + \advance\psbcurve@codeCntr by #1 + \expandafter\def\csname psbcurve@code\the\psbcurve@codeCntr#2\endcsname} + +%% Essentially the same as \psbcurve@def, but +%% the list item will only be set if it is undefined. +\defopt\psbcurve@defIfVoid{0}[#1]#2{ + \psbcurve@codeCntr\psbcurve@codeCntrEnd + \let\next\relax + \advance\psbcurve@codeCntr by #1 + \expandafter\ifx\csname % + psbcurve@code\the\psbcurve@codeCntr#2\endcsname\relax% + \def\next{\expandafter\def\csname % + psbcurve@code\the\psbcurve@codeCntr#2\endcsname}% + \fi\next} + +%% Essentially the same as \psbcurve@def (just \def replaced by \let): +\defopt\psbcurve@let{0}[#1]#2{ + \psbcurve@codeCntr\psbcurve@codeCntrEnd + \advance\psbcurve@codeCntr by #1 + \expandafter\let\csname psbcurve@code\the\psbcurve@codeCntr#2\endcsname} + +%% Syntax: +%% \psbcurve@letvar[offset]{item}\MyVarToBeSet +%% sets \MyVarToBeSet to the value of the list entry. +%% See the definition of \psbcurve@def for a description +%% of the list entry. +\defopt\psbcurve@letvar{0}[#1]#2#3{ + \psbcurve@codeCntr\psbcurve@codeCntrEnd + \advance\psbcurve@codeCntr by #1 + \def#3{\noexpand#3}% + \expandafter\let\expandafter#3\csname psbcurve@code\the\psbcurve@codeCntr#2\endcsname} + +%% Syntax: +%% \psbcurve@ifx[offset]{item}\MyVarToBeCompared +%% That is essentially an \ifx with the list item compared to +%% \MyVarToBeCompared. +\defopt\psbcurve@ifx{0}[#1]#2{ + \psbcurve@codeCntr\psbcurve@codeCntrEnd + \advance\psbcurve@codeCntr by #1 + \expandafter\ifx\csname psbcurve@code\the\psbcurve@codeCntr#2\endcsname} + +%% Syntax: +%% \psbcurve@get{item} +%% This expands to the macro corresponding to `item' from the +%% list entry at \psbcurve@codeCntr. +\def\psbcurve@get#1{\csname psbcurve@code\the\psbcurve@codeCntr#1\endcsname} + + +%% Auxiliary macros: +%%%%%%%%%%%%%%%%%%%%% +%% Multiple branching +%% Syntax: +%% \psbcurve@switch\ExpandingToKey{KeyI,\MacroI,KeyII,\MacroII,...and so on...} +%% If \ExpandingToKey expands to one of the keys KeyI, \KeyII, ... +%% the corresponding \MacroI, \MacroII, ..., resp. is called. +%% The key value \relax is special. Its corresponding \Macro is the +%% default action which is taken if none of the Keys matches. +\def\psbcurve@switch#1#2{% +\def\next##1,##2,##3|{% +\ifx#1##1\relax\def\next####1|{\let\next##2}\fi% +\ifx##1\relax\def\next####1|{\let\next##2}\fi% +\next##3|% +}% +\next#2,\relax,\relax,|\next} + +%% The user interface to psbcurve: +%% Usage: See description in pst-bezier-doc.tex. +%% The default value \relax for the optional argument indicates that +%% there are no optional arguments. +\defopt\psbcurve\relax[#1](#2){% + \bgroup% Makes optional pstricks-settings local to this \psbcurve call. + \ifx#1\relax\else% + \psset{#1}% + \fi% + \def\psbcurve@code{% + \moveto(#2)% + \code{ + << + /Splines [%] begin of the array of splines + [%] begin of the first dummy spline (just the start point) + /n /n /n /n } \coor(#2) \code{% + /n /n %[ + ] % end of the first dummy spline + }% end of \code + }% + %% Initialise the list of postscript code fragments: + \psbcurve@codeCntrEnd0% + \psbcurve@pointSetDefaults%% Init first spline. + \psbcurve@def{l}{\coor(#2)}%% Default left control point of the first spline. + \psbcurve@next%% Now, get the next arguments... +} + +%% The following macro declare the pstricks option psbcurveTension +%% and set it to its default value. +\define@key[psset]{pst-bezier}{bcurveTension}[0.25]{\def\psk@bcurveTension{#1}} +\psset{bcurveTension=0.25} + +%% Points of a spline that are not set yet +%% to a certain value or action +%% get the following value: +\def\psbcurve@ptNotDef{\code{ /n /n }} + +%% A newly allocated spline gets the following defaults: +\def\psbcurve@pointSetDefaults{% + \psbcurve@defIfVoid{l}{\psbcurve@ptNotDef}% + \psbcurve@defIfVoid{r}{\psbcurve@ptNotDef}% + \psbcurve@defIfVoid{sl}{\code{ \psk@bcurveTension\space}}% + \psbcurve@defIfVoid{sr}{\code{ \psk@bcurveTension\space}}% + \psbcurve@defIfVoid{addon}{}% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Now, there comes a series of commands. Depending on the next optional modifier +%% in the argument list of \psbcurve one of these is called. If there follows a +%% point (x,y) without modifier \psbcurve@nextPoint is called. If there follows a token that +%% does not make sense to \psbcurve \psbcurve@end is called. + +%% the modifier l +\def\psbcurve@lPoint#1(#2){% + \psbcurve@def{l}{\coor(#2)}% + \psbcurve@next} + +%% the modifier r +\def\psbcurve@rPoint#1(#2){% + \psbcurve@def{r}{\coor(#2)}% + \psbcurve@next} + +%% the modifier L +\def\psbcurve@LPoint#1(#2){% + \psbcurve@def{l}{\coor(#2)}% + \psbcurve@def[-1]{r}{\code{ /s /s }}% + \psbcurve@next} + +%% the modifier T +\def\psbcurve@Tension#1#2{% + \psbcurve@def{addon}{\psset{bcurveTension=#2}}% + \psbcurve@next} + +%% The t modifier has some sub-modifiers +%% These are recognised by this macro and the +%% corresponding action is taken. +\def\psbcurve@tension#1{\futurelet\psbcurve@tmp\psbcurve@@tension} +%% +\def\psbcurve@@tension{% +\psbcurve@switch\psbcurve@tmp{% + l,\psbcurve@ltension,% + r,\psbcurve@rtension,% + s,\psbcurve@stension,% + \relax,\psbcurve@@@tension% +}} + +%% the modifier t without further sub-modifiers +\def\psbcurve@@@tension#1{% +\psbcurve@def{sr}{\code{ #1 }}% +\psbcurve@def{sl}{\code{ #1 }}% +\psbcurve@next} + +%% the modifier ts +\def\psbcurve@stension#1#2{% symmetric +\psbcurve@def[-1]{sr}{\code{ #2 }}% +\psbcurve@def{sl}{\code{ #2 }}% +\psbcurve@next} + +%% the modifier tl +\def\psbcurve@ltension#1#2{% left control point +\psbcurve@def{sl}{\code{ #2 }}% +\psbcurve@next} + +%% the modifier tr +\def\psbcurve@rtension#1#2{% right control point +\psbcurve@def{sr}{\code{ #2 }}% +\psbcurve@next} + +%% This macro is called if the next token is +%% no modifier but a point (x,y) +\def\psbcurve@nextPoint(#1){% + \psbcurve@def{}{\coor(#1)}% + \advance\psbcurve@codeCntrEnd by 1 + \psbcurve@pointSetDefaults% + \psbcurve@next} + +%% If the next token does not make sense to \psbcurve +%% the curve is finished. +\def\psbcurve@end{ + %% Do we need to set the last control point to its default? + \def\tmp{\psbcurve@ptNotDef}% + \psbcurve@ifx[-1]{r}\tmp% + \psbcurve@letvar[-1]{}\tmp% \tmp is set to the end point + \psbcurve@let[-1]{r}\tmp% last control point is set to \tmp + \fi% + %% pscustom deactivates showpoints: reverse this: + \let\if@psbcurve@showpoints\ifshowpoints% + \pscustom{% + %% Following, the TeX-code fragments in \psbcurve@code... + %% are executed. These compose the postscript spline array. + \psbcurve@code% + \psbcurve@codeCntr0 + \loop% + \code{[ %] + }% + \psbcurve@get{addon}% additional code + \psbcurve@get{l}% left control point + \psbcurve@get{r}% right control point + \psbcurve@get{}% interpolation point + \psbcurve@get{sl}% left scaling factor + \psbcurve@get{sr}% right scaling factor + \code{ %[ + ] }% end of the spline. + \advance\psbcurve@codeCntr by 1 + \ifnum\psbcurve@codeCntr<\psbcurve@codeCntrEnd% + \repeat% + \code{%[ + ] % end of the spline array + /K 1 + >> pstBCurve + }% + \if@psbcurve@showpoints% + \pst@OpenShowPoints %% works fine, only the dashed lines are missing: + \code{ \tx@BezierShowPoints }% + \fi% + }% + \egroup% +} + +%% The following macro reads the next argument from the \psbcurve argument list +%% recognises optional modifiers and branches to the corresponding macro. +\def\psbcurve@next{\futurelet\psbcurve@tmp\psbcurve@@next} +\def\psbcurve@@next{% + \psbcurve@switch\psbcurve@tmp{% +(,\psbcurve@nextPoint,%) +l,\psbcurve@lPoint,% +r,\psbcurve@rPoint,% +L,\psbcurve@LPoint,% +t,\psbcurve@tension,% +T,\psbcurve@Tension,% +\relax,\psbcurve@end}% +} + +\catcode`\@=\TheAtCode\relax +\endinput + |