summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pspicture
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/pspicture
Initial commit
Diffstat (limited to 'macros/latex/contrib/pspicture')
-rw-r--r--macros/latex/contrib/pspicture/README7
-rw-r--r--macros/latex/contrib/pspicture/pspicture.dtx703
-rw-r--r--macros/latex/contrib/pspicture/pspicture.ins14
-rw-r--r--macros/latex/contrib/pspicture/pspicture.pdfbin0 -> 65590 bytes
4 files changed, 724 insertions, 0 deletions
diff --git a/macros/latex/contrib/pspicture/README b/macros/latex/contrib/pspicture/README
new file mode 100644
index 0000000000..f4332560bf
--- /dev/null
+++ b/macros/latex/contrib/pspicture/README
@@ -0,0 +1,7 @@
+The pspicture package:
+
+ Reimplements picture mode to use dvips specials, thus removing
+ restrictions on available slopes etc.
+
+ Further development of this idea is to be seen in the pict2e
+ package.
diff --git a/macros/latex/contrib/pspicture/pspicture.dtx b/macros/latex/contrib/pspicture/pspicture.dtx
new file mode 100644
index 0000000000..4bb464b4c1
--- /dev/null
+++ b/macros/latex/contrib/pspicture/pspicture.dtx
@@ -0,0 +1,703 @@
+%
+% \iffalse
+%%
+%% Source File `pspicture.dtx'.
+%% Copyright (C) 1992 1999 David Carlisle
+%% This file may be distributed under the terms of the LPPL.
+%% See 00readme.txt for details.
+%%
+%
+%<*dtx>
+ \ProvidesFile{pspicture.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{pspicture}
+%<driver>\ProvidesFile{pspicture.drv}
+%<*package,driver>
+% \fi
+% \ProvidesFile{pspicture.dtx}
+ [1999/04/11/ v2.02 Picture mode via PS specials (DPC)]
+%
+% \iffalse
+%</package,driver>
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document}
+\DocInput{pspicture.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{pspicture.dtx}
+% \CheckSum{110}
+%
+% \changes{1} {1989/05/10}{(Not made widely available)}
+% \changes{2} {1992/01/02}{support for dvips added}
+% \changes{2.01}{1992/06/16}{First public release}
+% \changes{2.02}{1999/04/11}{Fix for `new' docstrip, and LPPL}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \title{The \textsf{pspicture} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+%
+% \author{D. P. Carlisle}
+% \date{16 June 1992}
+% \maketitle
+%
+%
+% \section{Introduction}
+% {\tt pspicture} is a re-implementation, and extension of, \LaTeX's
+% {\tt picture} environment, using PostScript |\special|'s. This has
+% several advantages, mainly that lines of arbitrary slope and thickness
+% may be specified, and there is no limit on the size of the circles
+% that may be drawn\footnote{^^A
+% There is a certain amount of overlap between this style option and the
+% widely available {\tt eepic} option. However when I wrote the first
+% version of this, in 1989, I was not aware of {\tt eepic}, and {\tt
+% pspicture} has been reasonably popular in Manchester, even
+% though {\tt epic} and {\tt eepic} have been installed.}.
+%
+% One disadvantage is that the picture can no longer be previewed on a
+% |dvi| previewer, such as |xdvi|. To help with this problem, a
+% companion style option, {\tt texpicture}, may be used while developing
+% a document, this uses the standard picture commands as much as
+% possible, and silently omits any picture objects that can not be drawn
+% with standard \LaTeX.
+%
+% A second disadvantage, is that a {\tt dvi} file produced with {\tt
+% pspicture} will contain embedded |\special| commands. These commands
+% will only work with the driver program for which they were intended.
+% This makes the {\tt dvi} file less portable. {\tt pspicture} will by
+% default use |\special|'s set up for Rokicki's {\tt dvips} program,
+% although it should be easy to modify the code to work with other
+% PostScript drivers. A {\sc DocStrip} option for a version of {\tt
+% dvi2ps} is included with this distribution.
+%
+% \subsection{Commands Available}{\parskip=\baselineskip\parindent=0pt
+% \DescribeMacro{\circle}\DescribeMacro{\circle*}
+% Use as described in the \LaTeX\ book but with no maximum diameter.
+% The thickness of the circle is altered by the |\linethickness|
+% command. The size of the circle produced by |\circle*| is not
+% affected by |\linethickness|, so it is not the same as `filling in'
+% the circle drawn by |\circle|.
+%
+% \DescribeMacro{\oval}
+% Use as described in the \LaTeX\ book, but as there is no maximum
+% diameter for the circular arcs, the oval (in the absence of the
+% optional |[tr]| etc) always consists of two semi-circular arcs
+% joined by a pair of parallel lines. To obtain a `rectangle with
+% rounded corners' the oval command has a second optional argument
+% (given first !).\\
+% |\oval[20](100,200)[t]|\\
+% Produces the top half of an oval with quarter circles of radius
+% 20*unitlength.
+% If unitlength = 1pt then this is equivalent to the standard oval
+% command. In general |\oval[R](x,y)| uses circular arcs of radius
+% $\min(R,x/2,y/2)$.
+%
+% \DescribeMacro{\line}\DescribeMacro{\vector}
+% Use as described in the \LaTeX\ book but with no restriction on the
+% available slopes. The thickness of a sloping line is altered by the
+% |\linethickness| command.
+%
+% \DescribeMacro{\Line}\DescribeMacro{\Vector}
+% New forms of the line and vector commands.\\
+% |\put(x1,y1){\Line(x2,y2)}|\\
+% produces a line from (x1,y1) to (x1+x2,y1+y2) and similarly for
+% |\Vector|.
+%
+% \DescribeMacro{\Curve}
+% Like |\Line| except that it produce a curve!\\
+% |\put(x1,y1){\Curve(x2,y2){m}}|\\
+% produces a curve from (x1,y1) to (x1+x2,y1+y2). the amount of
+% curvature is controlled by m but try $1$ or $-1$ first. m does not
+% have to be an integer. Negative numbers curve the opposite way to
+% positive numbers.
+%
+% \DescribeMacro{\thinlines}\DescribeMacro{\thicklines}%
+% \DescribeMacro{\linethickness}
+% These commands alter the thickness of {\bf all} lines including
+% slanted lines and circular arcs.\vspace{\baselineskip}
+%
+% \DescribeMacro{\arrowlength}
+% A new command which specifies the size of the arrowhead drawn by the
+% |\vector| and |\Vector| commands. Like |\linethickness| it does not
+% get multiplied by |\unitlength|. At present the arrowhead is
+% triangular. If a head with curved sides more like the standard
+% \LaTeX\ head is required the definition of |!A| in pspicture.ps
+% should be altered.
+%
+% Other {\tt picture} mode commands are not altered by this style, and
+% so may be used, just as described in the \LaTeX\ book. These include:
+% |\put|, |\multiput|, |\makebox|, |\framebox|, |dashbox| and
+% |\shortstack|.
+%
+% }\newpage\section{Examples}
+%
+% \noindent A picture built with \LaTeX's line and circle fonts.
+%
+% \noindent\begin{picture}(300,130)
+% \put(0,0){\line(1,2){50}}
+% \put(50,50){\vector(1,1){30}}
+% \put(50,50){\circle{30}}
+% \put(100,50){\circle*{10}}
+% \put(150,50){\oval(50,20)[t]}
+% \put(150,100){\oval(30,30)[bl]}
+%
+% ^^A LaTeX does not do these so well
+% \put(250,60){\circle{60}}
+% \put(250,60){\circle{50}}
+%
+% \end{picture}
+%
+% \bigskip
+% \def\eatmodule#1>{}
+
+%\eatmodule
+%<*x>
+ \ifcat a\noexpand @\else
+ \MakePercentComment
+ \def\ProvidesPackage#1[#2]{}
+ \def\NeedsTeXFormat#1{}
+ \makeatletter ^^A This is NOT the usual way to access this
+ \input{pspicture.sty} ^^A style. It is intended as a style option:
+ \makeatother ^^A \documentstyle[a4,pspicture]{article}
+ \MakePercentIgnore
+ \fi
+%\eatmodule
+%</x>
+%
+% \noindent The same picture built with PostScript |\special|'s.
+%
+% \noindent\begin{picture}(300,130)
+% \put(0,0){\line(1,2){50}}
+% \put(50,50){\vector(1,1){30}}
+% \put(50,50){\circle{30}}
+% \put(100,50){\circle*{10}}
+% \put(150,50){\oval(50,20)[t]}
+% \put(150,100){\oval(30,30)[bl]}
+%
+% ^^A LaTeX does not do these so well
+% \put(250,60){\circle{60}}
+% \put(250,60){\circle{50}}
+%
+% \end{picture}
+%
+% \bigskip
+% \noindent Some extra features not available using the standard picture
+% mode.
+%
+% \noindent\begin{picture}(300,150)
+% \put(250,60){\vector(-8,1){50}} ^^A Vector of any slope.
+% \put(200,0){\Line(100,100)} ^^A Line command.
+% \put(210,100){\Vector(90,10)} ^^A Vector command.
+% \put(70,90){\oval(100,70)} ^^A Control over the radius of
+% \put(70,90){\oval[10](100,70)} ^^A `corners' of an oval.
+% \linethickness{3pt}
+% \put(20,20){\circle{20}} ^^A Circles of any thickness and size.
+% \put(20,20){\line(10,1){30}} ^^A Sloping lines of any thickness.
+%
+% \end{picture}
+%
+% \StopEventually{}
+%
+% \section{pspicture.sty}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% First we set up the code that is specific to the driver program that
+% is being used. If the driver can incorporate a header file, define
+% |\PS@header| appropriately, |\PS@special| should expand to the format
+% for inline PostScript code. The driver should protect this code with a
+% (g)save (g)restore pair. dvips is treated specially so that it will be
+% the default driver if this file is used without being stripped. If you
+% find definitions of these macros which work for the driver you use,
+% email me, and I will include them in the next release.
+% \begin{macro}{\PS@header}
+% Code to include the PostScript header.
+% \begin{macrocode}
+%<*dvips>
+ \def\PS@header#1{\special{header=#1}}
+%</dvips>
+%<dvi2ps>\def\PS@header#1{\typeout{Print with the option -i #1}}
+\PS@header{pspicture.ps}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PS@special}
+% The format of the |\special| command for inline PostScript.
+% \begin{macrocode}
+%<*dvips>
+ \def\PS@special#1{\special{"#1}}
+%</dvips>
+%<dvi2ps>\def\PS@special#1{\special{pstext="#1"}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\strippt}
+% Strip the final `pt' off the string returned by |\the|.
+% \begin{macrocode}
+{\catcode`t=12\catcode`p=12\gdef\noPT#1pt{#1}}
+\def\strippt#1{\expandafter\noPT\the#1\space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@circle}
+% Internal name for |\circle|.
+% \begin{macrocode}
+\def\@circle#1{%
+ \@tempdimb #1\unitlength
+ \PS@special{%
+ \strippt\@wholewidth
+ \strippt\@tempdimb
+ !C}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@dot}
+% Internal name for |\circle*|.
+% \begin{macrocode}
+\def\@dot#1{%
+ \@tempdimb #1\unitlength
+ \PS@special{%
+ \strippt\@tempdimb
+ !D}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\line}
+% Line with a \LaTeX\ style slope specification.
+% \begin{macrocode}
+\def\line(#1,#2)#3{%
+ \@linelen=#3\unitlength
+ \PS@special{%
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ !L}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vector}
+% Line and arrow head with a \LaTeX\ style slope specification.
+% \begin{macrocode}
+\def\vector(#1,#2)#3{%
+ \@linelen=#3\unitlength
+ \PS@special{%
+ \strippt\@arrowlength
+ \strippt\@wholewidth
+ #1
+ #2
+ \strippt\@linelen
+ !V}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\oval}
+% If no optional argument appears, use a default of maximum radius of
+% \TeX's maximum length.
+% \begin{macrocode}
+\def\oval{%
+ \@ifnextchar[%
+ {\@ov@l}%
+ {\count@=\maxdimen \divide\count@ by \unitlength \@ov@l[\count@]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ov@l}
+% Look for an optional |tlbr| argument.
+% \begin{macrocode}
+\def\@ov@l[#1](#2,#3){%
+ \@ifnextchar[{\@oval[#1](#2,#3)}{\@oval[#1](#2,#3)[]}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@oval}
+% The PostScript version of the |\oval| command will print each quarter
+% of the oval separately, each quarter will only be printed if the
+% appropriate argument is $1$. An optional argument of |t| causes the
+% arguments for the two bottom quarters to be set to $0$, similarly, |r|
+% causes the two left quarters to be set to $0$. Thus an argument [tr]
+% will set the bottom and left quarters to $0$, resulting in only the
+% top right quarter being printed.
+% \begin{macrocode}
+\def\@oval[#1](#2,#3)[#4]{\begingroup
+ \@tempdimb #1\unitlength
+ \@ovxx #2\unitlength
+ \@ovyy #3\unitlength
+ \def\r{\def\TL{0 }\def\BL{0 }}%
+ \def\l{\def\TR{0 }\def\BR{0 }}%
+ \def\t{\def\BL{0 }\def\BR{0 }}%
+ \def\b{\def\TL{0 }\def\TR{0 }}%
+ \def\TL{1 }\def\BL{1 }\def\TR{1 }\def\BR{1 }%
+ \@tfor\@tempa :=#4\do{\csname\@tempa\endcsname}%
+ \PS@special{%
+ \BR\BL\TR\TL
+ \strippt\@wholewidth
+ \strippt\@tempdimb
+ \strippt\@ovxx
+ \strippt\@ovyy
+ !O}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Line}
+% New style |\Line| command.
+% \begin{macrocode}
+\def\Line(#1,#2){%
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \PS@special{%
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ !L2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Curve}
+% Not particularly good, but it will do for now.
+% \begin{macrocode}
+\def\Curve(#1,#2)#3{%
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \PS@special{%
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ #3
+ !C2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Vector}
+% New style |\Vector| command.
+% \begin{macrocode}
+\def\Vector(#1,#2){%
+ \@ovxx #1\unitlength
+ \@ovyy #2\unitlength
+ \PS@special{%
+ \strippt\@arrowlength
+ \strippt\@wholewidth
+ \strippt\@ovxx
+ \strippt\@ovyy
+ !V2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@arrowlength}
+% Length of an arrow head.
+% \begin{macrocode}
+\newdimen\@arrowlength
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\arrowlength}
+% Set the length of an arrow head.
+% \begin{macrocode}
+\def\arrowlength#1{\@arrowlength #1}
+\arrowlength{8pt}
+% \end{macrocode}
+% \end{macro}
+% If this file is used as a {\tt .sty} file without being stripped, we
+% want to stop here. The |\endinput| must not be at the beginning of the
+% line, or {\sf DocStrip} will stop here as well!.
+% \begin{macrocode}
+ \endinput
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+
+% \section{texpicture.sty}
+% A dummy style file so that documents using {\tt pspicture.sty}
+% can be previewed or printed (as much as possible) using a
+% dvi (not PostScript) previewer or printer driver.
+
+% Just change `{\tt pspicture}' to `{\tt texpicture}' in the
+% |\documentstyle| options list.
+
+% \begin{macrocode}
+%<*texsty>
+% \end{macrocode}
+
+% \begin{macrocode}
+\@warning{texpicture.sty in operation:^^J\@spaces
+LaTeX document with pspicture.sty before printing}
+% \end{macrocode}
+% \begin{macro}{\Line}
+% \begin{macro}{\Vector}
+% \begin{macro}{\arrowlength}
+% \begin{macro}{\Curve}
+% Define all these new commands to silently gobble their arguments.
+% \begin{macrocode}
+\def\Line(#1,#2){}
+\def\Vector(#1,#2){}
+\def\arrowlength#1{}
+\def\Curve(#1,#2)#3{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@badlinearg}
+% If a vector or line is called with a slope specification that is not
+% allowed by standard \LaTeX, |\@badlinearg| is called to produce the
+% error message. We do not want to see these errors, so:
+% \begin{macrocode}
+\def\@badlinearg{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\oval}
+% \begin{macro}{\@@v@l}
+% \begin{macro}{\@@vv@l}
+% Give the standard |\oval| command another optional argument (which
+% will be ignored), to match the extra argument defined in {\tt
+% pspicture.sty}.
+% \begin{macrocode}
+\let\@@v@l\oval
+\def\@@@v@l[#1]{\@@v@l}
+\def\oval{\@ifnextchar[{\@@@v@l}{\@@v@l}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</texsty>
+% \end{macrocode}
+%
+% \section{pspicture.ps}
+% The PostScript header file for use with {\tt pspicture.sty}.
+% Probably this should use the PostScript dictionary mechanism, to keep
+% identifiers local to this package, but for now, just give them names
+% begining with {\tt!}.
+% \begin{macrocode}
+%<*ps>
+% \end{macrocode}
+%
+% \begin{macro}{!BP}
+% PostScript uses \TeX's |bp|, that is $1/72$ of an inch, not \TeX's
+% |pt|, $1/72.27$ of an inch, but it is inconvenient to get \TeX\ to
+% output in |bp|, so we need to scale the PostScript.
+% \begin{macrocode}
+/!BP{
+ 72 72.27 div dup scale
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!A}
+% Arrow head:\\
+% \meta{arrow length} |!A|
+% \begin{macrocode}
+/!A{
+ newpath
+ 0 0 moveto
+ dup neg dup .4 mul rlineto
+ .8 mul 0 exch rlineto
+ closepath
+ fill
+ } def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!V}
+% |\vector(|\meta{x}|,|\meta{y}|)| \\
+% \meta{arrow length} \meta{line width} \meta{x} \meta{y}
+% \meta{len*unitlength} |!V|
+% \begin{macrocode}
+/!V{
+ !BP
+ /!X exch def
+ /!y exch def
+ /!x exch def
+ newpath
+ 0 0 moveto
+ !x 0 eq {0 !y 0 lt {!X neg}{!X} ifelse}
+ {!x 0 lt {!X neg}{!X}ifelse !X !y mul !x abs div} ifelse
+ lineto
+ setlinewidth % @wholewidth
+ currentpoint
+ stroke
+ translate
+ !y !x atan
+ rotate
+ !A % @arrowlength
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!L}
+% |\line(|\meta{x}|,|\meta{y}|)| \\
+% \meta{arrow length} \meta{line width} \meta{x} \meta{y}
+% \meta{len*unitlength} |!L|
+% \begin{macrocode}
+/!L{
+ !BP
+ /!X exch def
+ /!y exch def
+ /!x exch def
+ newpath
+ 0 0 moveto
+ !x 0 eq {0 !y 0 lt {!X neg}{!X} ifelse}
+ {!x 0 lt {!X neg}{!X}ifelse !X !y mul !x abs div} ifelse
+ lineto
+ setlinewidth % @wholewidth
+ stroke
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!C}
+% |\circle{|\meta{diam}|}| \\
+% \meta{line width} \meta{diam*unitlength} |!C|
+% \begin{macrocode}
+/!C{
+ !BP
+ 0 0 3 2 roll
+ 2 div 0 360 arc
+ setlinewidth % @wholewidth
+ stroke
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!D}
+% |\circle*{|\meta{diam}|}| \\
+% \meta{diam*unitlength} |!D|
+% \begin{macrocode}
+/!D{
+ !BP
+ 0 0 3 2 roll
+ 2 div 0 360 arc fill
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!O}
+% |\oval[|\meta{max-radius}|](|\meta{x}|,|\meta{y}|)[|\meta{tlbr}|]| \\
+% \meta{br}\meta{bl}\meta{tr}\meta{tl}\\
+% \meta{line width} \meta{max-radius*unitlength}
+% \meta{x*unitlength} \meta{y*unitlength} |!O|\\
+% The first four arguments should be either $0$, denoting that that
+% quarter should not be drawn, or $1$, to draw a quarter oval.
+% \begin{macrocode}
+/!O{
+ !BP
+ /!y exch 2 div def
+ /!x exch 2 div def
+ /!r exch !x !y
+% \end{macrocode}
+% Ghostscript appears to have a {\tt min} operator, so the following 2
+% lines could be coded as {\tt min min}, but it's not in the
+% Ref.~Manual, and it doesn't work on my printer!
+% \begin{macrocode}
+ 2 copy gt {exch} if pop
+ 2 copy gt {exch} if pop
+ def
+ setlinewidth % @wholewidth
+ 1 eq
+ {newpath
+ !x neg 0 moveto
+ !x neg !y 0 !y !r arcto 4 {pop} repeat
+ 0 !y lineto
+ stroke}if
+ 1 eq
+ {newpath
+ !x 0 moveto
+ !x !y 0 !y !r arcto 4 {pop} repeat
+ 0 !y lineto
+ stroke}if
+ 1 eq
+ {newpath
+ !x neg 0 moveto
+ !x neg !y neg 0 !y neg !r arcto 4 {pop} repeat
+ 0 !y neg lineto
+ stroke}if
+ 1 eq
+ {newpath
+ !x 0 moveto
+ !x !y neg 0 !y neg !r arcto 4 {pop} repeat
+ 0 !y neg lineto
+ stroke}if
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!V2}
+% |\Vector(|\meta{x}|,|\meta{y}|)| \\
+% \meta{arrow length} \meta{line width} \meta{x*unitlength}
+% \meta{y*unitlength} |!V2|
+% \begin{macrocode}
+/!V2{
+ !BP
+ 2 copy exch
+ atan
+ /a exch def
+ 2 copy
+ newpath
+ 0 0 moveto
+ lineto % <x*unitlength> <y*unitlength>
+ 3 2 roll
+ setlinewidth % @wholewidth
+ stroke
+ translate % <x*unitlength> <y*unitlength>
+ a rotate
+ !A % @arrowlength
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!L2}
+% |\Line(|\meta{x}|,|\meta{y}|)| \\
+% \meta{line width} \meta{x*unitlength} \meta{y*unitlength} |!L2|
+% \begin{macrocode}
+/!L2{
+ !BP
+ newpath
+ 0 0 moveto
+ lineto % <x*unitlength> <y*unitlength>
+ setlinewidth % @wholewidth
+ stroke
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{!C2}
+% |\Curve(|\meta{x}|,|\meta{y}|){|\meta{$\pm$}|}| \\
+% \meta{line width} \meta{x*unitlength} \meta{y*unitlength} \meta{$\pm$}
+% |!C2|
+% \begin{macrocode}
+/!C2{
+ !BP
+ /!s exch def
+ /!y exch def
+ /!x exch def
+ newpath
+ 0 0 moveto
+ 0 0
+ !x 2 div !y 10 div !s mul add
+ !y 2 div !x 10 div !s mul sub
+ !x !y
+ curveto
+ setlinewidth % @wholewidth
+ stroke
+ }def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</ps>
+% \end{macrocode}
+%
+% \end{document}
+% \Finale \ No newline at end of file
diff --git a/macros/latex/contrib/pspicture/pspicture.ins b/macros/latex/contrib/pspicture/pspicture.ins
new file mode 100644
index 0000000000..e9bad40d28
--- /dev/null
+++ b/macros/latex/contrib/pspicture/pspicture.ins
@@ -0,0 +1,14 @@
+\input docstrip
+\keepsilent
+\preamble
+\endpreamble
+
+\askforoverwritefalse
+\def\ps{\perCent!}
+
+\generate{\file{pspicture.sty}{\from{pspicture.dtx}{package,dvips}}
+\usepostamble\empty
+\usepreamble\ps
+ \file{pspicture.ps}{\from{pspicture.dtx}{ps}}}
+
+\endbatchfile
diff --git a/macros/latex/contrib/pspicture/pspicture.pdf b/macros/latex/contrib/pspicture/pspicture.pdf
new file mode 100644
index 0000000000..481a0fa2d9
--- /dev/null
+++ b/macros/latex/contrib/pspicture/pspicture.pdf
Binary files differ