Current File : //usr/share/texlive/texmf-dist/tex/generic/pst-arrow/pst-arrow.tex |
%% $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