summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2016-09-03 01:25:14 +0000
committerKarl Berry <karl@freefriends.org>2016-09-03 01:25:14 +0000
commit2e03ce1ab48d0df8278421f3c58e89e063e51e3b (patch)
tree4705e4e10e8d841428d7aa8871fb01cf53a73aca /Master/texmf-dist/tex/generic
parent3f1f836612a33595683361deac1863bf8011b89a (diff)
pst-arrow (2sep16)
git-svn-id: svn://tug.org/texlive/trunk@41980 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic')
-rw-r--r--Master/texmf-dist/tex/generic/pst-arrow/pst-arrow.tex624
1 files changed, 624 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-arrow/pst-arrow.tex b/Master/texmf-dist/tex/generic/pst-arrow/pst-arrow.tex
new file mode 100644
index 00000000000..7e14839b368
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pst-arrow/pst-arrow.tex
@@ -0,0 +1,624 @@
+%% $Id: pst-arrow.tex 328 2016-09-01 19:00:31Z herbert $
+%%
+%% This is file `pst-arrow.tex',
+%%
+%% IMPORTANT NOTICE:
+%%
+%% Package `pst-arrow.tex'
+%%
+%% Herbert Voss <hvoss@tug.org>
+%%
+%% 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-arrow' is a PSTricks package for additional arrows
+%%
+\csname PSTarrowLoaded\endcsname
+\let\PSTarrowLoaded\endinput
+%
+% Requires some packages
+\ifx\PSTricksLoaded\endinput\else\input pstricks \fi
+\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi
+%
+\def\fileversion{0.01}
+\def\filedate{2016/09/01}
+\message{`pst-arrow' v\fileversion, \filedate\space (dr,hv)}
+%
+\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
+\pst@addfams{pst-arrow}
+%
+\def\psBigArrow{\pst@object{psBigArrow}}
+\def\psBigArrow@i(#1)(#2){%
+ \addbefore@par{doublesep=1cm}
+ \begin@ClosedObj
+ \pssetlength\pst@dimm{\psdoublesep}
+ \pst@getcoor{#1}\pst@tempA
+ \pst@getcoor{#2}\pst@tempB
+ \addto@pscode{
+ /Width \pst@number\pst@dimm def
+ \pst@tempA % x y
+ \pst@tempB % x y
+ exch % x y y x
+ 4 -1 roll % y y x x
+ sub % y y dx
+ 3 1 roll % dx y y
+ sub % dx dy
+ exch % dy dx
+ atan neg % alpha
+ \pst@tempA
+ translate
+ rotate
+ 0 0 moveto
+ 0 Width 2 div rlineto % |
+ \pst@tempB \pst@tempA Pyth2 Width 1.5 mul sub 0 rlineto
+ 0 Width 1.5 div rlineto
+ Width 1.5 mul dup neg rlineto
+ Width 1.5 mul neg dup rlineto
+ 0 Width 1.5 div rlineto
+ \pst@tempB \pst@tempA Pyth2 neg Width 1.5 mul add 0 rlineto
+ closepath
+ }%
+ \end@ClosedObj
+}
+% the original table
+% \def\pst@arrowtable{,<->,<<->>,>-<,>>-<<,(-),[-],)-(,]-[,|>-<|}
+%
+% v : Vee arrow (inside) v,V,f and F by Christophe FOUREY
+% V : Vee arrow (outside)
+% f : Filled vee arrow (inside)
+% F : Filled vee arrow (outside)
+\edef\pst@arrowtable{\pst@arrowtable,v-v,V-V,f-f,F-F,t-t,T-T}
+
+% Vee arrow
+\define@key[psset]{pst-arrow}{veearrowlength}[3mm]{\pst@getlength{#1}\psk@veearrowlength}
+\psset[pst-arrow]{veearrowlength=3mm} % default projected length
+\define@key[psset]{pst-arrow}{veearrowangle}[30]{\pst@getangle{#1}\psk@veearrowangle}
+\psset[pst-arrow]{veearrowangle=30} % default angle
+\define@key[psset]{pst-arrow}{veearrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@veearrowlinewidth}
+\psset[pst-arrow]{veearrowlinewidth=0.35mm} % default vee arrow line width
+
+% Filled vee arrow
+\define@key[psset]{pst-arrow}{filledveearrowlength}[3mm]{\pst@getlength{#1}\psk@filledveearrowlength}
+\psset[pst-arrow]{filledveearrowlength=3mm} % default projected length
+\define@key[psset]{pst-arrow}{filledveearrowangle}[15]{\pst@getangle{#1}\psk@filledveearrowangle}
+\psset[pst-arrow]{filledveearrowangle=15} % default angle
+\define@key[psset]{pst-arrow}{filledveearrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@filledveearrowlinewidth}
+\psset[pst-arrow]{filledveearrowlinewidth=0.35mm} % default vee arrow line width
+\define@key[psset]{pst-arrow}{arrowlinestyle}[solid]{%
+ \@ifundefined{psls@#1}%
+ {\@pstrickserr{Line style `#1' not defined}\@eha}%
+ {\def\psarrowlinestyle{#1}}}
+\psset[pst-arrow]{arrowlinestyle=solid} % default
+\pst@def{VeeArrow}<%
+ 1 setlinecap % round caps
+ 1 setlinejoin % round join
+ setlinewidth % vee arrow line width
+ /y ED % projected length
+ 2 div /a ED % angle (divide by 2)
+ /t ED % false = inside, true = outside
+ a sin a cos div y mul /x ED % perpendicular length : x=tan(a).y
+ t { 1 -1 scale } if % if outside : symmetry
+ x neg y moveto % point #1
+ 0 0 L % point #2
+ x y L % point #3
+ { closepath gsave fill grestore } if % if filled : close and fill
+ \@nameuse{psls@\psarrowlinestyle}
+ stroke % draw line
+ 0 t { y 2 mul } { 0 } ifelse moveto> % if outside : twice longer line
+
+% VeeArrow : filled? outside? (total) angle (projected) length (arrow) line width
+
+\@namedef{psas@v}{%
+ false false \psk@veearrowangle \psk@veearrowlength \psk@veearrowlinewidth \tx@VeeArrow}
+\@namedef{psas@V}{%
+ false true \psk@veearrowangle \psk@veearrowlength \psk@veearrowlinewidth \tx@VeeArrow}
+\@namedef{psas@f}{%
+ true false \psk@filledveearrowangle \psk@filledveearrowlength \psk@filledveearrowlinewidth \tx@VeeArrow}
+\@namedef{psas@F}{%
+ true true \psk@filledveearrowangle \psk@filledveearrowlength \psk@filledveearrowlinewidth \tx@VeeArrow}
+
+% And An another arrowhead
+% architectural tick / oblique arrow
+
+% Tick arrow
+\define@key[psset]{pst-arrow}{tickarrowlength}[1.5mm]{\pst@getlength{#1}\psk@tickarrowlength}
+\psset[pst-arrow]{tickarrowlength=1.5mm} % default projected length
+\define@key[psset]{pst-arrow}{tickarrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@tickarrowlinewidth}
+\psset[pst-arrow]{tickarrowlinewidth=0.35mm} % default tick arrow line width
+
+\pst@def{TickArrow}<%
+ 1 setlinecap % round caps
+ 1 setlinejoin % round join
+ setlinewidth % tick line width
+ /y ED % projected length
+ /t ED % false = normal, true = reversed
+ t { 1 -1 scale } if % if reversed : symmetry
+ y neg y moveto % point #1
+ y y neg L % point #2
+ \@nameuse{psls@\psarrowlinestyle}
+ stroke % draw line
+ 0 0 moveto> % origin
+
+\@namedef{psas@t}{ false \psk@tickarrowlength \psk@tickarrowlinewidth \tx@TickArrow }
+\@namedef{psas@T}{ true \psk@tickarrowlength \psk@tickarrowlinewidth \tx@TickArrow }
+%
+% HookLeft/RightArrow
+\newdimen\pshooklength
+\newdimen\pshookwidth
+\define@key[psset]{pst-arrow}{hooklength}[3mm]{\pssetlength\pshooklength{#1}}
+\define@key[psset]{pst-arrow}{hookwidth}[1mm]{\pssetlength\pshookwidth{#1}}
+%\psset{hooklength=3mm,hookwidth=1mm}
+%
+\edef\pst@arrowtable{\pst@arrowtable,H-H,h-h} % add new arrow
+\def\tx@RHook{RHook } % PostScript name
+\def\tx@Rhook{Rhook } % PostScript name
+\@namedef{psas@H}{%
+ /RHook {
+ /x ED % hook width
+ /y ED % hook length
+ /z CLW 2 div def % save it
+ x y moveto % goto first point
+ x 0 0 0 0 y
+ curveto % draw Bezier
+ stroke
+ 0 y moveto % define current point
+ } def
+ \pst@number\pshooklength
+ \pst@number\pshookwidth
+ \tx@RHook
+}
+\@namedef{psas@h}{%
+ /Rhook {
+ CLW mul % size * CLW
+ add dup % +length size*CLW+length size*CLW+length
+ 2 div /w ED % (size*CLW+length)/2 -> w
+ mul dup /h ED mul % (size*CLW+length)
+ /a ED
+ w neg h abs moveto 0 0 L
+ gsave
+ stroke grestore
+ } def
+ 0 \psk@arrowlength \psk@arrowsize \tx@Rhook
+}
+% New parameter "arrowfill", with default as "true"
+\define@boolkey[psset]{pst-arrow}[ps]{ArrowFill}[true]{}
+%
+% Modification of the PostScript macro Arrow to choose to fill or not the arrow
+% (it require to restore the current linewidth, despite of the scaling)
+\pst@def{Arrow}<{%
+ CLW mul add dup 2 div
+ /w ED mul dup
+ /h ED mul
+ /a ED { 0 h T 1 -1 scale } if
+ gsave
+ \ifpsArrowFill\else\pst@number\pslinewidth \pst@arrowscale\space div SLW \fi
+ w neg h moveto
+ 0 0 L w h L w neg a neg rlineto
+ \ifpsArrowFill gsave
+ \tx@setStrokeTransparency
+ fill
+ grestore \else gsave closepath stroke grestore \fi
+ grestore
+ 0 h a sub moveto
+}>
+%
+\define@key[psset]{pst-arrow}{nArrowsA}[2]{\def\psk@nArrowsA{#1}}
+\define@key[psset]{pst-arrow}{nArrowsB}[2]{\def\psk@nArrowsB{#1}}
+\define@key[psset]{pst-arrow}{nArrows}[2]{\def\psk@nArrowsA{#1}\def\psk@nArrowsB{#1}}
+\psset{nArrows=2}
+%
+\@namedef{psas@>>}{%
+ \psk@nArrowsA\space 1 sub {
+ false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
+ 0 h a sub T
+ } repeat
+ gsave
+ newpath
+ false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
+ CP
+ grestore
+ moveto
+}
+%
+\@namedef{psas@<<}{%
+ true \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
+ 0 h neg a add T
+ \psk@nArrowsB\space 2 sub {
+ false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
+ 0 h neg a add T
+ } repeat
+ false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
+ 0 h a 5 mul 2 div sub moveto
+}
+%
+% DG addition begin - Dec. 18/19, 1997 and Oct. 11, 2002
+% Adapted from \psset@arrows
+\define@key[psset]{pst-arrow}{ArrowInside}{%
+ \def\pst@tempArrow{#1}%
+ \ifx\pst@tempArrow\@empty \def\psk@ArrowInside{} %
+ \else%
+ \begingroup%
+ \pst@activearrows%
+ \xdef\pst@tempg{<#1}%
+ \endgroup%
+ \expandafter\psset@@ArrowInside\pst@tempg\@empty-\@empty\@nil%
+ \if@pst\else\@pstrickserr{Bad intermediate arrow specification: #1}\@ehpa\fi%
+ \fi%
+}
+% Adapted from \psset@@arrows
+\def\psset@@ArrowInside#1-#2\@empty#3\@nil{%
+ \@psttrue
+ \def\next##1,#1-##2,##3\@nil{\def\pst@tempg{##2}}%
+ \expandafter\next\pst@arrowtable,#1-#1,\@nil
+ \@ifundefined{psas@#2}%
+ {\@pstfalse\def\psk@ArrowInside{}}%
+ {\def\psk@ArrowInside{#2}}%
+}
+% Default value empty
+\psset{ArrowInside={}}
+% Modified version of \pst@addarrowdef
+\def\pst@addarrowdef{%
+ \addto@pscode{%
+ /ArrowA {
+ \ifx\psk@arrowA\@empty
+ \pst@oplineto
+ \else
+ \pst@arrowdef{A}
+ moveto
+ \fi
+ } def
+ /ArrowB { \ifx\psk@arrowB\@empty \else \pst@arrowdef{B} \fi } def
+% DG addition
+ /ArrowInside {
+ \ifx\psk@ArrowInside\@empty \else \pst@arrowdefA{Inside} \fi
+ } def
+ }%
+}
+% Adapted from \pst@arrowdef
+\def\pst@arrowdefA#1{%
+ \ifnum\pst@repeatarrowsflag>\z@ /Arrow#1c [ 6 2 roll ] cvx def Arrow#1c\fi
+ \tx@BeginArrow
+ \psk@arrowscale
+ \@nameuse{psas@\@nameuse{psk@Arrow#1}}
+ \tx@EndArrow%
+}
+% ArrowInsidePos parameter (default value 0.5)
+\define@key[psset]{pst-arrow}{ArrowInsidePos}[0.5]{\pst@checknum{#1}\psk@ArrowInsidePos}%
+%\psset{ArrowInsidePos=0.5}
+%
+%
+% Redefinition of the PostScript /Line macro to print the intermediate
+% arrow on each segment of the line
+%
+\define@key[psset]{pst-arrow}{ArrowInsideNo}[1]{\pst@checknum{#1}\psk@ArrowInsideNo}% hv 20031001
+\define@key[psset]{pst-arrow}{ArrowInsideOffset}[0]{\pst@checknum{#1}\psk@ArrowInsideOffset}% hv 20031001
+%\psset{ArrowInsideNo=1,ArrowInsideOffset=0}
+%
+\def\arrowType@H{H}
+\pst@def{Line}<
+ NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if
+ (\psk@ArrowInside) length 0 gt {
+ \ifx\psk@arrowA\arrowType@H % do we have a Hook arrow at the beginning?
+ \pst@number\pshooklength % yes
+ \else
+ \psk@arrowsize\space CLW mul add dup \psk@arrowlength\space mul exch \psk@arrowinset mul neg add
+ \fi
+ /arrowlength exch def
+ 4 copy % copy all four values for the arrow line
+ /y1 ED /x1 ED /y2 ED /x2 ED % save them
+ /Alpha y2 y1 sub x2 x1 sub Atan def % the gradient of the line
+% 2 copy /y1 ED /x1 ED ArrowA x1 y1
+ ArrowA % draw arrowA
+ x1 Alpha cos arrowlength mul add % dx add
+ y1 Alpha sin arrowlength mul add % dy add, to get the current point at the end of the arrow tip
+ /n n 1 sub def
+ n {
+ 4 copy
+ /y1 ED /x1 ED /y2 ED /x2 ED
+ x1 y1
+ \psk@ArrowInsidePos\space 1 gt {
+ /Alpha y2 y1 sub x2 x1 sub Atan def
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /dArrowPos \psk@ArrowInsidePos\space abs def
+% /Length x2 x1 sub y2 y1 sub Pyth def
+ \psk@ArrowInsideNo\space cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+% ArrowPos Length gt { exit } if
+ x1 Alpha cos ArrowPos mul add
+ y1 Alpha sin ArrowPos mul add
+ ArrowInside
+ pop pop
+ } repeat
+ }{
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /dArrowPos \psk@ArrowInsideNo 1 gt {%
+ 1.0 \psk@ArrowInsideNo 1.0 add div
+ }{\psk@ArrowInsidePos } ifelse def
+ \psk@ArrowInsideNo\space cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+ x2 x1 sub ArrowPos mul x1 add
+ y2 y1 sub ArrowPos mul y1 add
+ ArrowInside
+ pop pop
+ } repeat
+ } ifelse
+ pop pop Lineto
+ } repeat
+ }{ ArrowA /n n 2 sub def n { Lineto } repeat } ifelse
+ CP 4 2 roll ArrowB L pop pop } if >
+%
+% Redefinition of the PostScript /Polygon macro to print the intermediate
+% arrow on each segment of the line
+\pst@def{Polygon}<{%
+ NArray n 2 eq { 0 0 /n 3 def } if
+ n 3 lt {
+ n { pop pop } repeat
+ }{
+ n 3 gt { CheckClosed } if
+ n 2 mul -2 roll
+ /y0 ED
+ /x0 ED
+ /y1 ED
+ /x1 ED
+ /xx1 x1 def
+ /yy1 y1 def
+ x1 y1
+ /x1 x0 x1 add 2 div def
+ /y1 y0 y1 add 2 div def
+ x1 y1 moveto
+ /n n 2 sub def
+ /drawArrows {
+ x11 y11
+ \psk@ArrowInsidePos\space 1 gt {
+ /Alpha y12 y11 sub x12 x11 sub atan def
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /Length x12 x11 sub y12 y11 sub Pyth def
+ /dArrowPos \psk@ArrowInsidePos\space abs def
+ {
+ /ArrowPos ArrowPos dArrowPos add def
+ ArrowPos Length gt { exit } if
+ x11 Alpha cos ArrowPos mul add
+ y11 Alpha sin ArrowPos mul add
+ currentdict /ArrowInside known { ArrowInside } if
+ pop pop
+ } loop
+ }{
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /dArrowPos \psk@ArrowInsideNo\space 1 gt {%
+ 1.0 \psk@ArrowInsideNo\space 1.0 add div
+ }{ \psk@ArrowInsidePos } ifelse def
+ \psk@ArrowInsideNo\space cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+ x12 x11 sub ArrowPos mul x11 add
+ y12 y11 sub ArrowPos mul y11 add
+ currentdict /ArrowInside known { ArrowInside } if
+ pop pop
+ } repeat
+ } ifelse
+ pop pop Lineto
+ } def
+ n {
+ 4 copy
+ /y11 ED /x11 ED /y12 ED /x12 ED
+ drawArrows
+ } repeat
+ x1 y1 x0 y0
+ 6 4 roll
+ 2 copy
+ /y11 ED /x11 ED /y12 y0 def /x12 x0 def
+ drawArrows
+ /y11 y0 def /x11 x0 def /y12 yy1 def /x12 xx1 def
+ drawArrows
+ pop pop
+ closepath
+ } ifelse %
+}>
+%
+%
+% Redefinition of the PostScript /OpenBezier macro to print the intermediate
+% arrow
+\pst@def{OpenBezier}<{%
+ /dArrowPos \psk@ArrowInsideNo 1 gt {%
+ 1.0 \psk@ArrowInsideNo 1.0 add div
+ }{ \psk@ArrowInsidePos } ifelse def
+ BezierNArray
+ n 1 eq { pop pop
+ }{ 2 copy
+ /y0 ED /x0 ED
+ ArrowA
+ n 4 sub 3 idiv { 6 2 roll 4 2 roll curveto } repeat
+ 6 2 roll
+ 4 2 roll
+ ArrowB
+ /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED
+ /cx x1 x0 sub 3 mul def
+ /cy y1 y0 sub 3 mul def
+ /bx x2 x1 sub 3 mul cx sub def
+ /by y2 y1 sub 3 mul cy sub def
+ /ax x3 x0 sub cx sub bx sub def
+ /ay y3 y0 sub cy sub by sub def
+ /getValues {
+ ax t0 3 exp mul bx t0 t0 mul mul add cx t0 mul add x0 add
+ ay t0 3 exp mul by t0 t0 mul mul add cy t0 mul add y0 add
+ ax t 3 exp mul bx t t mul mul add cx t mul add x0 add
+ ay t 3 exp mul by t t mul mul add cy t mul add y0 add
+ } def
+ /getdL {
+ getValues
+ 3 -1 roll sub 3 1 roll sub Pyth
+ } def
+ /CurveLength {
+ /u 0 def
+ /du 0.01 def
+ 0 100 {
+ /t0 u def
+ /u u du add def
+ /t u def
+ getdL add
+ } repeat } def
+ /GetArrowPos {
+ /ende \psk@ArrowInsidePos\space 1 gt
+ {ArrowPos}
+ {ArrowPos CurveLength mul} ifelse def
+ /u 0 def
+ /du 0.01 def
+ /sum 0 def
+ { /t0 u def
+ /u u du add def
+ /t u def
+ /sum getdL sum add def
+ sum ende gt {exit} if
+ } loop u
+ } def
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /loopNo \psk@ArrowInsidePos\space 1 gt {%
+ CurveLength \psk@ArrowInsidePos\space div cvi
+ }{ \psk@ArrowInsideNo } ifelse def
+ loopNo cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+ /t GetArrowPos def
+ /t0 t 0.95 mul def
+ getValues
+ ArrowInside pop pop pop pop
+ } repeat
+ x1 y1 x2 y2 x3 y3 curveto
+ } ifelse
+}>
+%
+% Redefinition of the PostScript /NCLine macro to print the intermediate
+% arrow of the line
+\pst@def{NCLine}<{%
+ NCCoor
+ tx@Dict begin
+ ArrowA CP 4 2 roll ArrowB
+ 4 copy
+ /y2 ED /x2 ED /y1 ED /x1 ED
+ x1 y1
+ \psk@ArrowInsidePos\space 1 gt {
+ /Alpha y2 y1 sub x2 x1 sub atan def
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /Length x2 x1 sub y2 y1 sub Pyth def
+ /dArrowPos \psk@ArrowInsidePos\space abs def
+ {%
+ /ArrowPos ArrowPos dArrowPos add def
+ ArrowPos Length gt { exit } if
+ x1 Alpha cos ArrowPos mul add
+ y1 Alpha sin ArrowPos mul add
+ ArrowInside
+ pop pop
+ } loop
+ }{%
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /dArrowPos \psk@ArrowInsideNo 1 gt {%
+ 1.0 \psk@ArrowInsideNo 1.0 add div
+ }{ \psk@ArrowInsidePos } ifelse def
+ \psk@ArrowInsideNo\space cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+ x2 x1 sub ArrowPos mul x1 add
+ y2 y1 sub ArrowPos mul y1 add
+ ArrowInside
+ pop pop
+ } repeat
+ } ifelse
+ pop pop lineto pop pop
+ end%
+}>
+%
+\pst@def{NCCurve}<{%
+ GetEdgeA GetEdgeB
+ xA1 xB1 sub yA1 yB1 sub
+ Pyth 2 div dup 3 -1 roll mul
+ /ArmA ED
+ mul
+ /ArmB ED
+ /ArmTypeA 0 def
+ /ArmTypeB 0 def
+ GetArmA GetArmB
+ xA2 yA2 xA1 yA1
+ 2 copy
+ /y0 ED /x0 ED
+ tx@Dict begin
+ ArrowA
+ end
+ xB2 yB2 xB1 yB1
+ tx@Dict begin
+ ArrowB
+ end
+ /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED
+ /cx x1 x0 sub 3 mul def
+ /cy y1 y0 sub 3 mul def
+ /bx x2 x1 sub 3 mul cx sub def
+ /by y2 y1 sub 3 mul cy sub def
+ /ax x3 x0 sub cx sub bx sub def
+ /ay y3 y0 sub cy sub by sub def
+ /getValues {
+ ax t0 3 exp mul bx t0 t0 mul mul add cx t0 mul add x0 add
+ ay t0 3 exp mul by t0 t0 mul mul add cy t0 mul add y0 add
+ ax t 3 exp mul bx t t mul mul add cx t mul add x0 add
+ ay t 3 exp mul by t t mul mul add cy t mul add y0 add
+ } def
+ /getdL {
+ getValues
+ 3 -1 roll sub 3 1 roll sub Pyth
+ } def
+ /CurveLength {
+ /u 0 def
+ /du 0.01 def
+ 0 100 {
+ /t0 u def
+ /u u du add def
+ /t u def
+ getdL add
+ } repeat } def
+ /GetArrowPos {
+ /ende \psk@ArrowInsidePos\space 1 gt {ArrowPos}{ArrowPos CurveLength mul} ifelse def
+ /u 0 def
+ /du 0.01 def
+ /sum 0 def
+ {
+ /t0 u def
+ /u u du add def
+ /t u def
+ /sum getdL sum add def
+ sum ende gt {exit} if
+ } loop u
+ } def
+ /dArrowPos \psk@ArrowInsideNo 1 gt {%
+ 1.0 \psk@ArrowInsideNo 1.0 add div
+ }{ \psk@ArrowInsidePos } ifelse def
+ /ArrowPos \psk@ArrowInsideOffset\space def
+ /loopNo \psk@ArrowInsidePos\space 1 gt {%
+ CurveLength \psk@ArrowInsidePos\space div cvi
+ }{ \psk@ArrowInsideNo } ifelse def
+ loopNo cvi {
+ /ArrowPos ArrowPos dArrowPos add def
+ /t GetArrowPos def
+ /t0 t 0.95 mul def
+ getValues
+ ArrowInside pop pop pop pop
+ } repeat
+ x1 y1 x2 y2 x3 y3 curveto
+ /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ] cvx def
+ /LPutPos { t LPutVar BezierMidpoint } def
+ /HPutPos { { HPutLines } HPutCurve } def
+ /VPutPos { { VPutLines } HPutCurve } def
+}>
+%
+
+\def\resetArrowOptions{%
+ \def\pst@linetype{0}%
+ \psset[pst-arrow]{%
+ hooklength=3mm, hookwidth=1mm,
+ ArrowFill=true,
+ ArrowInside={}, ArrowInsidePos=0.5,
+ ArrowInsideNo=1, ArrowInsideOffset=0,
+}}
+%
+\resetArrowOptions
+%
+\catcode`\@=\PstAtCode\relax
+%
+%% END: pst-arrow.tex
+\endinput