summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:52:10 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:52:10 +0000
commited2b2a48949cc755dd46554a0f70250821b01863 (patch)
tree2b3025863318588861067563c05badd7c5e1d825 /Master
parent08346c9c4f0a0bf381eaa2c9a04a7dd5f6beb58b (diff)
trunk/Master/texmf-dist/source/latex/curves
git-svn-id: svn://tug.org/texlive/trunk@214 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/source/latex/curves/curves.dtx1818
-rw-r--r--Master/texmf-dist/source/latex/curves/curves.ins25
2 files changed, 1843 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/curves/curves.dtx b/Master/texmf-dist/source/latex/curves/curves.dtx
new file mode 100644
index 00000000000..4902f414542
--- /dev/null
+++ b/Master/texmf-dist/source/latex/curves/curves.dtx
@@ -0,0 +1,1818 @@
+% \def\InternetAddress{i.maclaine-cross@unsw.edu.au}
+% \iffalse meta-comment
+%
+% Program curves
+% Copyright (C) 1991 1992 1993 1994 1995 1996 2000 Ian Maclaine-cross
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.2
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.2 or later is part of all distributions of LaTeX
+% version 1999/12/01 or later.
+%
+% The Program's files are curves.dtx, curves.ins, curves.sty and
+% curvesls.sty. Curves.sty provides curve drawing commands for
+% the standard LaTeX picture environment.
+%
+% When LaTeX is run with input file curves.ins, the docstrip
+% utility generates curves.sty and curvesls.sty and when run
+% with file curves.dtx the users manual.
+%
+% \fi
+%
+% \CheckSum{2045}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \iffalse
+%<*dtx>
+ \ProvidesFile{curves.dtx}
+%</dtx>
+%<package,ls>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{curves}
+%<driver>\ProvidesFile{curves.drv}
+%<*package,driver>
+% \fi
+% \ProvidesFile{curves.dtx}
+ [2000/08/22 1.50 Curves for LaTeX picture environment]
+%
+% \iffalse
+%</package,driver>
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{curves}
+% \usepackage[xdvi]{curves}
+%% Remove the % from the start of the \OnlyDescription line below to
+%% prevent the curves.sty listing printing out.
+% \OnlyDescription
+\begin{document}
+\DocInput{curves.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{curves.dtx}
+%
+% \changes{1.42}{2000/08/12}{Last compatible with LaTeX 2.09}
+% \changes{1.50}{2000/08/22}{Files merged, docstrip, LPPL and PostScript added}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \title{\bf The \textsf{curves} Package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+%
+% \author{Ian Maclaine-cross\\
+% \small Internet: \texttt{\InternetAddress}}
+% \date{22 August 2000}
+% \maketitle
+%
+% \begin{abstract}
+% Draws curves in the \LaTeXe\ \texttt{picture} environment
+% using parabolas between data points
+% with continuous slope at joins. For circles and arcs uses
+% up to 16 parabolas. Also draws
+% symbols or dash patterns along curves. Equivalent to technical pens with
+% compasses and French curves. Curves consist of short secants
+% drawn by overlapping disks or
+% line drawing |\special|s selected by package options.
+% \end{abstract}
+% \thispagestyle{empty}
+% \tableofcontents
+% \section{Introduction}
+%
+% The picture environment in the \LaTeXe \footnote{Leslie Lamport, {\sl
+% \LaTeX\ A Document Preparation System 2nd ed.,} Addison-Wesley, 1994.} macro
+% package for \TeX \footnote{Donald E. Knuth, {\sl The \TeX book,}
+% Addison-Wesley, 1984.} allows simple line drawing using
+% characters. These characters include quadrant circular arcs, solid
+% disks with diameters from 1 to 15pt\footnote{A printer's point,
+% abbreviated pt, is approximately 0.351460 mm.} and short lines with a
+% limited range of slopes in two thicknesses. A |\begin{picture}|
+% command defines an area where following commands place these
+% characters to draw a \LaTeX\ picture.
+%
+% \LaTeX\ pictures save disk space for source descriptions and
+% computer time in producing documents compared with printer commands or
+% bit mapped graphics. From initial pencil sketch on squared graph
+% paper to final printout, they take half the time for manual pen
+% drawings. The labor savings are higher for revisions and
+% rewrites. Unfortunately standard \LaTeX\ cannot yet draw curves like a
+% pen, compass and French curves can. Fortunately there are many macro
+% packages which supplement \LaTeXe's capabilities and do
+% marvellous graphical things for any printing need\footnote{Michel
+% Goossens, Frank Mittelbach and Sebastian Rahtz,
+% \textsl{The LaTeX Graphics Companion,} Addison-Wesley, 1997.}.
+% \textsf{Curves} just adds curve drawing
+% to \LaTeX\ \texttt{pictures}.
+%
+% Brief descriptions, simple examples and a command summary follow. They
+% presume familiarity with relevant chapters of the \LaTeX\
+% manual\footnotemark[1].
+%
+% \section{Installation}
+%
+% \DescribeMacro{curves.sty}
+% To create the file \texttt{curves.sty} you need \LaTeXe\ and a command like:
+% \begin{verbatim}
+% $ latex curves.ins
+% \end{verbatim}
+% Put \texttt{curves.sty} and \texttt{curvesls.sty} in your default or a
+% \texttt{texinput} directory. The package \textsf{curvesls} provides
+% compatibility for old documents. Comprehensive \TeX\ distributions preinstall
+% \textsf{curves} so for most users the above step is unnecessary.
+%
+% Put \texttt{curves} in a |\usepackage|
+% command at the top of your main
+% {\tt .tex} file for any document where you wish to use
+% \textsf{curves} {\it e.g.\/,}
+% \begin{verbatim}
+% \documentclass[11pt]{article}
+% \usepackage{curves}
+% \end{verbatim}
+% Do not combine {\tt curves} with {\tt bezier} in this
+% command. \textsf{Curves} contains a fast powerful replacement for
+% the |\bezier| command.
+% Drawings using the |\bezier| command should not change their appearance.
+%
+% \DescribeMacro{dvips} \DescribeMacro{emtex} \DescribeMacro{xdvi}
+% \DescribeMacro{WML}
+% The \textsf{curves} package has options to save \TeX\ memory and runtime
+% using |\special|
+% commands to draw the straight lines which approximate curves.
+% Select an option only if your program for
+% viewing or printing \TeX's |dvi| files recognizes and uses the
+% corresponding |\special|s. Otherwise the curves on your drawings will be
+% invisible.
+% The \texttt{dvips} option uses the em\TeX\
+% |\special|s of |dvips| which draw lines with rounded ends.
+% The \texttt{emtex} option uses the original |\special|s of
+% em\TeX\ by Eberhard Mattes with disks added to hide their square ends.
+% The \texttt{xdvi} option uses the PostScript
+% |\special|s of Tomas Rokicki's |dvips| to draw lines which the
+% \texttt{xdvi} viewer now implements.
+% |WML| are new versions of the em\TeX\ |\special|s in |dvips| with
+% compact names.
+% No options draws lines using
+% disks from standard
+% \LaTeX\ fonts. No options or |dvips| work with the \textsf{color} package
+% but other drivers may or may not. Select package options when required by
+% modifying |\usepackage| like:
+% \begin{verbatim}
+% \usepackage[dvips]{curves}
+% \end{verbatim}
+%
+% \DescribeMacro{BOX}
+% A drawing frequently uses auxiliary commands to size, place, label and
+% caption it. The following commands draw the box in Figure~\ref{box} on
+% page~\pageref{box}:
+%
+% \begin{figure}
+% \begin{center}
+% \setlength{\unitlength}{1mm}
+% \begin{picture}(100,50) \large\sf
+% \linethickness{1mm}
+% \put(20,5){\framebox(60,40){BOX}}
+% \end{picture}
+% \end{center}
+% \caption{This is a box.}
+% \label{box}
+% \end{figure}
+%
+% \begin{verbatim}
+% \begin{figure}
+% \begin{center}
+% \setlength{\unitlength}{1mm}
+% \begin{picture}(100,50) \large\sf
+% \linethickness{1mm}
+% \put(20,5){\framebox(60,40){BOX}}
+% \end{picture}
+% \end{center}
+% \caption{This is a box.}
+% \label{box}
+% \end{figure}
+% \end{verbatim}
+% Lamport\footnotemark[1] explains these commands. This example is for those
+% unfamiliar with the \LaTeX\ picture environment. The following examples avoid
+% the \textsf{figure} environment but it is often essential.
+%
+% \section{Curves}
+% \label{curves}
+%
+% \DescribeMacro{\curve} \DescribeMacro{\closecurve} \DescribeMacro{\tagcurve}
+% The commands, |\curve|, |\closecurve| and
+% |\tagcurve|, draw parabola segments between coordinate points in the
+% argument\footnote{Please see Section~\ref{summary} for full
+% descriptions of \textsf{curves} commands.}.
+% The segments' tangents at these points are parallel to each other
+% and to straight lines through the points either side. Segments at
+% |\curve| ends
+% are parabolas with the point second from the end a
+% vertex. |\closecurve| adds a
+% parabola between end points to close the curve. |\tagcurve| omits the
+% first and last segments drawing curves with end tangents specified.
+% When only three points are specified |\tagcurve| draws the last segment. The
+% following table shows these features.
+%
+% \begin{center}
+% \setlength\unitlength{0.4pt}
+% \linethickness{0.7mm}
+% \begin{tabular}{lc}
+% Example & Curve \\
+% \hline
+% \raisebox{60\unitlength}{\tt\char92 curve(0,0, 50,100, 100,0)} &
+% \begin{picture}(100,120)(0,-10)
+% \curve(0,0, 50,100, 100,0)
+% \end{picture}\\
+% \raisebox{80\unitlength}{\tt\char92 closecurve(0,0, 50,100, 100,0)} &
+% \begin{picture}(100,170)(0,-60)
+% \closecurve(0,0, 50,100, 100,0)
+% \end{picture} \\
+% \raisebox{60\unitlength}{
+% \tt\char92 tagcurve(100,0, 0,0, 50,100, 100,0, 0,0)} &
+% \begin{picture}(120,120)(-10,-10)
+% \tagcurve(100,0, 0,0, 50,100, 100,0, 0,0)
+% \end{picture} \\
+% \hline
+% \end{tabular}
+% \end{center}
+% \DescribeMacro{\arc} \DescribeMacro{\curve}
+% Axial flow fans often use the RAF 6E aerofoil section. The section
+% coordinates in the following macro come directly from aerodynamic
+% tables\footnote{R.A. Wallis, {\sl Axial Flow Fans,} Academic Press, 1961,
+% p.335}. The |\arc| commands draw the leading and trailing radii and the
+% two coordinate |\curve| the flat chord.
+% \begin{verbatim}
+% \newcommand{\RAFsixE}{
+% \scaleput(1.25,1.25){\arc(0,-1.25){-135}}
+% \scaleput(0,0){\curve(0.366,2.133, 1.25,3.19, 2.5,4.42,
+% 5.0,6.10, 7.5,7.24, 10,8.09, 15,9.28, 20,9.90, 30,10.3,
+% 40,10.22, 50,9.80, 60,8.98, 70,7.70, 80,5.91, 90,3.79,
+% 95,2.58, 99.24,1.52)}
+% \scaleput(99.24,0.76){\arc(0,-0.76){180}}
+% \scaleput(0,0){\curve(1.25,0, 99.24,0)}
+% }
+% \end{verbatim}
+% \newcommand{\RAFsixE}{%
+% \scaleput(1.25,1.25){\arc(0,-1.25){-135}}
+% \scaleput(0,0){\curve(0.366,2.133, 1.25,3.19, 2.5,4.42,
+% 5.0,6.10, 7.5,7.24, 10,8.09, 15,9.28, 20,9.90, 30,10.3,
+% 40,10.22, 50,9.80, 60,8.98, 70,7.70, 80,5.91, 90,3.79,
+% 95,2.58, 99.24,1.52)}
+% \scaleput(99.24,0.76){\arc(0,-0.76){180}}
+% \scaleput(0,0){\curve(1.25,0, 99.24,0)}
+% }
+% In a picture environment like:
+% \begin{verbatim}
+% \begin{picture}(100,20)
+% \RAFsixE
+% \end{picture}
+% \end{verbatim}
+% this macro draws:
+% \linethickness{0.7mm}
+% \setlength\unitlength{0.5mm}
+% \begin{center}
+% \begin{picture}(100,20)
+% \RAFsixE
+% \end{picture}\\
+% The RAF 6E has a flat undersurface.
+% \end{center}
+%
+% \DescribeMacro{\bigcircle}
+% The drawing command |\bigcircle| works similarly to |\circle|
+% except there is no |\circle*| equivalent. The following section scales it
+% to an ellipse.
+%
+% \section{Scaling}
+% \DescribeMacro{\unitlength} \DescribeMacro{\put}
+% The size of \LaTeX\ picture objects may be uniformly scaled by preceding
+% them with:
+% \begin{verbatim}
+% \setlength{\unitlength}{\scale\unitlength}
+% \end{verbatim}
+% the desired scale factor |\scale|
+% is previously defined perhaps with
+% |\newcommand|
+% as a decimal number. The new coordinates of a point \((x',y')\)
+% relative to the current origin are related to the old
+% coordinates \((x,y)\) relative to the same origin by
+% \begin{eqnarray*}
+% x' &=& x \times |\scale| \\
+% y' &=& y \times |\scale|
+% \end{eqnarray*}
+% If a |\put(|$x,y$|){...}| followed the change in |\unitlength| it would
+% actually put the objects |{...}| at \((x',y')\)
+% Objects defined by |\unitlength| in |{...}| would also be larger by
+% |\scale|.
+% Lamport\footnotemark[1] describes these commands.
+%
+% \DescribeMacro{\scaleput} \DescribeMacro{\xscale}
+% \DescribeMacro{\xscaley}
+% \DescribeMacro{\yscale} \DescribeMacro{\yscalex}
+% The scale factors |\xscale|, |\xscaley|, |\yscale| and |\yscalex|
+% are initially defined to be 1, 0, 1 and 0 respectively but may be
+% redefined to any decimal number using |\renewcommand|. After they
+% are redefined the new coordinates of a point \((x',y')\)
+% relative to the current origin are related to the old
+% coordinates \((x,y)\) relative to the same origin by
+% \begin{eqnarray*}
+% x' &=& x \times |\xscale| + y \times |\xscaley|\\
+% y' &=& x \times |\yscalex| + y \times |\yscale|
+% \end{eqnarray*}
+% If a |\scaleput(|$x,y$|){...}| followed the change in these factors it would
+% actual put the objects |{...}| at \((x',y')\). All the drawing
+% commands in \textsf{curves} use the current values of these four scale
+% factors in placing disks and secants.
+%
+% These factors can rotate
+% pictures which like |\RAFsixE| are made solely with \textsf{curves}
+% commands. The
+% factors following rotate the RAF~6E through 12$^\circ$ clockwise about its
+% {\tt (0,0)} co-ordinate:
+% \begin{verbatim}
+% \renewcommand{\xscale}{0.9781}
+% \renewcommand{\xscaley}{0.2079}
+% \renewcommand{\yscale}{0.9781}
+% \renewcommand{\yscalex}{-0.2079}
+% \put(0,20){\RAFsixE}
+% \end{verbatim}
+% This draws:
+% \begin{center}
+% \begin{picture}(120,30)(-20,0)
+% \renewcommand{\xscale}{0.9781}
+% \renewcommand{\xscaley}{0.2079}
+% \renewcommand{\yscale}{0.9781}
+% \renewcommand{\yscalex}{-0.2079}
+% \put(0,20){\RAFsixE}
+% \thicklines
+% \put(-20,5){\vector(1,0){20}}
+% \end{picture}
+%
+% The RAF 6E has maximum lift at angles of attack over 12$^\circ$.
+% \end{center}
+% Note that \(\cos12^\circ\approx0.9781\) and \(\sin12^\circ\approx0.2079\)
+% \let\RAFsixE\relax
+%
+% \DescribeMacro{\arc} \DescribeMacro{\bigcircle}
+% Axonometric projection is another scaling application. Circles become
+% ellipses and circular arcs become elliptical arcs. The commands drawing the
+% ellipse and arc in the following washer are:
+% \begin{verbatim}
+% \put(20,5){
+% \renewcommand{\xscale}{1}
+% \renewcommand{\xscaley}{-1}
+% \renewcommand{\yscale}{0.6}
+% \renewcommand{\yscalex}{0.6}
+% \scaleput(10,10){\bigcircle{10}}
+% \put(0,-2){
+% \scaleput(10,10){\arc(5,0){121}}
+% \scaleput(10,10){\arc(5,0){-31}}
+% }
+% }
+% \end{verbatim}
+% {\tt (20,5)} are the drawing coordinates of the upper vertex of the washer
+% closest to the reader. The angles for the |\arc|s were found by trial and
+% error.
+% \begin{center}
+% \setlength\unitlength{1mm}
+% \begin{picture}(40,30)
+% \thicklines
+% \multiput(20,5)(20,12){2}{\line(0,-1){2}\line(-5,3){20}}
+% \multiput(20,5)(-20,12){2}{\line(5,3){20}}
+% \put(20,3){\line(5,3){20}}
+% \put(20,3){\line(-5,3){20}}
+% \put(0,15){\line(0,1){2}}
+% \linethickness{1pt}
+% \put(20,5){
+% \renewcommand{\xscale}{1}
+% \renewcommand{\xscaley}{-1}
+% \renewcommand{\yscale}{0.6}
+% \renewcommand{\yscalex}{0.6}
+% \scaleput(10,10){\bigcircle{10}}
+% \put(0,-2){
+% \scaleput(10,10){\arc(5,0){121}}
+% \scaleput(10,10){\arc(5,0){-31}}
+% }
+% }
+% \end{picture}
+%
+% Square washers are sometimes preferred for soft materials.
+% \end{center}
+%
+% \section{Symbols}
+% \label{symbols}
+%
+% \DescribeMacro{\curvesymbol} \DescribeMacro{\curve}
+% \textsf{Curves} can also place symbols. |\curvesymbol| must first define
+% the symbol as anything a |\put| or |\multiput| may draw. A negative
+% symbol count between drawing command and coordinates {\it e.g.,}
+% |\tagcurve[-3](0,100,...)| fixes the number of symbols per curve segment.
+%
+% These commands draw flight times and successive positions in the following
+% drawing:
+% \begin{verbatim}
+% \newcounter{time}
+% \curvesymbol{\thetime\,s\addtocounter{time}{1}}
+% \put(5,4){\curve[-2](0,0, 9.8,19.6, 19.6,0)}
+% \curvesymbol{\phantom{\circle*{1}}\circle*{1}}
+% \put(5,2){\curve[-2](0,0, 9.8,19.6, 19.6,0)}
+% \end{verbatim}
+% where |\phantom| is a plain \TeX\ command from the \TeX
+% book\footnotemark[2].
+% \begin{center}
+% \setlength\unitlength{2mm}
+% \begin{picture}(40,35)(-5,-5) \sf
+% \thicklines
+% \newcounter{time}
+% \curvesymbol{\thetime\,s\addtocounter{time}{1}}
+% \put(5,4){\curve[-2](0,0, 9.8,19.6, 19.6,0)}
+% \curvesymbol{\phantom{\circle*{1}}\circle*{1}}
+% \put(5,2){\curve[-2](0,0, 9.8,19.6, 19.6,0)}
+% \put(0,0){\vector(0,1){28}}
+% \put(0,0){\vector(1,0){30}}
+% \multiput(5,0)(5,0){5}{\line(0,1){1}}
+% \multiput(0,5)(0,5){5}{\line(1,0){1}}
+% \setcounter{time}{0}
+% \multiput(0,-1)(5,0){6}{\makebox(0,0)[t]{\thetime}\addtocounter{time}{5}}
+% \put(28,-1){\makebox(0,0)[tl]{$x$ (m)}}
+% \setcounter{time}{0}
+% \multiput(-1,0)(0,5){6}{\makebox(0,0)[r]{\thetime}\addtocounter{time}{5}}
+% \put(-1,27){\makebox(0,0)[rb]{$y$ (m)}}
+% \end{picture} \\
+% Successive positions of a sphere with initial position $(5,2)$ m,\\ initial
+% velocity $(4.9,9.8)$ m/s, and acceleration $(0,-9.8)$ m/s$^2$. \\
+% The flight time is recorded above each sphere position.
+% \end{center}
+%
+% \DescribeMacro{\curvedashes} \DescribeMacro{\curvelength}
+% \DescribeMacro{\curvesymbol}
+% Fixed spacing of symbols at lengths other than the segment's requires more
+% commands. Empty |\curvedashes|, empty |\curvesymbol| and negative
+% symbol count stops drawing so a drawing command will calculate
+% |\curvelength| only. |\curvesymbol| then resets the symbol and
+% |\curvedashes| sets the spacing to its pattern length. If there are no
+% symbols at the ends, |\overhang| pulls symbols along the curve. The last
+% command with no symbol count draws the symbols.
+%
+% \DescribeMacro{\arc} \DescribeMacro{\bigcircle}
+% |\arc| and |\bigcircle| use sixteen segments for a circle so if
+% eight symbols are required the fixed spacing technique is necessary. The
+% following commands draw the pin numbers on a relay base:
+%
+% \begin{verbatim}
+% \newcounter{pin}
+% \curvedashes{}
+% \curvesymbol{}
+% \put(60,60){\arc[-1](40,0){-360}}
+% \setlength{\curvelength}{0.125\curvelength}
+% \curvedashes[\curvelength]{1}
+% \setlength{\overhang}{0.5\curvelength}
+% \curvesymbol{\addtocounter{pin}{1}\thepin}
+% \put(60,60){\arc(40,0){-360}}
+% \end{verbatim}
+%
+% \begin{center}
+% \setlength\unitlength{0.3mm}
+% \begin{picture}(120,120) \sf
+% \thicklines
+% \linethickness{1pt}
+% \curvedashes{}
+% \curvesymbol{}
+% ^^A base
+% \put(60,60){\bigcircle{100}}
+% ^^A spigot
+% \put(60,60){\arc(10,3){325}\put(10,0){\arc(0,3){-180}}}
+% ^^A pins
+% \put(60,60){\bigcircle[-1]{60}}
+% \setlength{\curvelength}{0.125\curvelength}
+% \curvedashes[\curvelength]{1}
+% \overhang0.5\curvelength
+% \curvesymbol{\phantom{\circle{5}}\circle{5}}
+% \put(60,60){\bigcircle{60}}
+% ^^A pin numbers
+% \newcounter{pin}
+% \curvedashes{}
+% \curvesymbol{}
+% \put(60,60){\arc[-1](40,0){-360}}
+% \divide\curvelength8
+% \curvedashes[\curvelength]{1}
+% \setlength{\overhang}{0.5\curvelength}
+% \curvesymbol{\addtocounter{pin}{1}\thepin}
+% \put(60,60){\arc(40,0){-360}}
+% \end{picture} \\ \nobreak
+% The pin numbering of plug-in relays is clockwise \\
+% from the spigot key when viewed from below.
+% \end{center}
+%
+% \DescribeMacro{\patternresolution} \DescribeMacro{\overhang}
+% If symbols and dash pattern exist and |\overhang| is 0pt, \textsf{curves}
+% draw the first position blank. For equal spacing they draw the last position
+% blank if rounding error causes the last pattern to be slightly short. If
+% |\renewcommand| changes |\patternresolution|, rounding error changes
+% and the final symbol may reappear. To avoid fiddling with
+% |\patternresolution| for closed curves with symbols equally spaced, use an
+% |\overhang| which is a fraction of a pattern length as in the previous
+% example.
+%
+% \section{Dashes}
+%
+% \DescribeMacro{\curvedashes}
+% |\curvedashes| must first define a dash pattern with length greater
+% than 0pt. Many symbol and pattern combinations are possible. The fixed number
+% and fixed spacing methods of symbol drawing described in
+% Section~\ref{symbols}
+% work with three methods of drawing dashes which are:
+% \begin{enumerate}
+% \item if there is no symbol count and no symbol, a dash pattern with its
+% length reduced by |\csdiameter| is drawn between symbols spaces of width
+% close to |\csdiameter| to give an overall spacing equal to the pattern
+% length specified by the |\curvedashes| command;
+% \item if there is a symbol count but no symbol, the dash patterns drawn have
+% their length equal to that defined by |\curvedashes| with
+% |\csdiameter| gaps at symbol positions;
+% \item if there is a symbol count and a symbol, the dash patterns drawn have
+% their length adjusted slightly so an integral number of patterns fit between
+% symbol positions.
+% \end{enumerate}
+%
+% Dash pattern commands for centrelines\footnote{R.N. Roth and I.A. van
+% Haeringen, {\sl The Australian Engineering Drawing Handbook, Part~1 Basic
+% Principles and Techniques,} The Institution of Engineers, Australia,
+% Canberra, 1986.} follow for the three techniques above in order:
+% \begin{verbatim}
+% \linethickness{0.25mm}
+% \curvedashes[1.2mm]{0,8,1,3,1,8}
+% \settowidth{\csdiameter}{00}
+% \put(0,20){\curve(0,0, 30,5, 60,0)}
+% \put(0,10){\curve[1](0,0, 30,5, 60,0)}
+% \curvesymbol{\thepin\addtocounter{pin}{1}}
+% \setlength{\csdiameter}{2\csdiameter}
+% \put(0,0){\curve[1](0,0, 30,5, 60,0)}
+% \end{verbatim}
+%
+% The following figure shows the resulting dash patterns. The upper line has
+% first position blank because the |\overhang| is 0pt. It has patterns
+% shrunk to scale between symbol spaces {\it e.g.,}~1 to~2, and symbol space
+% centres one pattern length apart. The middle line has patterns close to
+% defined length but with the first dash part blanked by half of symbol space~3
+% and the second pattern broken in its first dash by symbol space~4. The lower
+% line patterns are stretched between symbol spaces. Which pattern is
+% appropriate depends on picture meaning and function.
+%
+% \begin{center}
+% \setlength\unitlength{1mm}
+% \begin{picture}(60,25) \sf
+% \setcounter{pin}{1}
+% \linethickness{0.25mm}
+% \curvedashes[1.2mm]{0,8,1,3,1,8}
+% \settowidth{\csdiameter}{00}
+% \put(0,20){\curve(0,0, 30,5, 60,0)}
+% \put(0,10){\curve[1](0,0, 30,5, 60,0)}
+% \curvesymbol{\thepin\addtocounter{pin}{1}}
+% \setlength{\csdiameter}{2\csdiameter}
+% \put(0,0){\bezier{-2}(0,0)(30,10)(60,0)}
+% \put(0,20){\curve(0,0, 30,5, 60,0)}
+% \curvedashes{}
+% \put(0,10){\curve[-1](0,0, 30,5, 60,0)}
+% \put(0,0){\bezier{-2}(0,0)(30,10)(60,0)}
+% \end{picture} \\
+% Centrelines and Symbols
+% \end{center}
+%
+% \section{Errors}
+% Syntax errors like incorrect or missing punctuation while
+% using \textsf{curves}
+% will result in \TeX\ or \LaTeX\ error messages. The \TeX book\footnotemark[2]
+% and \LaTeX\ manual\footnotemark[1] explain the meaning and
+% correction of these
+% errors. The previous examples and Section~\ref{summary} should make the
+% correct syntax for \textsf{curves} commands clear.
+%
+% \textsf{Curves} will write a {\tt Package curves Error:\ldots} message
+% to the screen and {\tt
+% log} file if you supply an incorrect number of coordinates.
+%
+% If four sequential points in a drawing command argument have the line
+% through the first and third parallel to the line through the second and
+% fourth:
+% \begin{itemize}
+% \item exactly or closely, \textsf{curves} knows it cannot draw a parabola
+% tangent to two parallel lines, issues to the screen and log file:\\
+% {\tt Package curve Warning: \string\curve\ straight from \ldots}\\
+% and draws a straight line;
+% \item or approximately, \textsf{curves} may draw an unexpected curve with no
+% warning.
+% \end{itemize}
+% If four sequential points in a drawing command argument have the line
+% through the first and second parallel to the line through the third and
+% fourth:
+% \begin{itemize}
+% \item \textsf{curves} draws a parabola which may be nowhere near the curve.
+% \end{itemize}
+%
+% \DescribeMacro{\curvewarnfalse}
+% If the four points were on a straight line, removing one or more points is
+% a remedy. If they are not on a straight line, adding points may help.
+% Specifying many points will give you a satisfactory curve with perhaps an
+% annoying number of |\curve straight| warnings. After a
+% |\curvewarnfalse|, \textsf{curves} still uses the straight lines but does
+% not tell you.
+%
+% \DescribeMacro{\tagcurve}
+% Curvature changes sign on curves like \(y=\sin x\). Specifying inflection
+% points as {\tt curve} coordinates will reduce error and specifying
+% sufficient
+% coordinates will then give satisfactory results. For discontinuous tangents
+% splitting a curve into pieces is unavoidable. Splitting a curve into pieces
+% with curvature the same sign can give satisfactory results with fewer
+% coordinates. |\tagcurve| can prevent tangent discontinuities. If an
+% inflexion point's exact location is unknown, try the midpoint of the straight
+% line through the ends of its segment.
+%
+% \DescribeMacro{\diskpitchstretch}
+% Curves appear rougher than horizontal and vertical lines. Picture
+% digitization causes this not inaccuracy in \TeX\ or {\tt curves.sty}.
+% Setting |\diskpitchstretch| to a value less than one with
+% |\renewcommand| may smooth an unusually rough curve without package options.
+%
+% Symbols and symbol spaces misaligned are usually due to rounding error.
+% Adjusting |\patternresolution| below one can reduce rounding error and
+% increase alignment accuracy. This should be limited to the misaligned curve
+% with {\tt \{\ \}}\footnotemark[1].
+%
+% The replacement |\bezier| does not give exactly the same results as the
+% original in {\tt bezier.sty} or in {\tt LaTeX2e}. The difference is
+% extremely
+% small but if it is important to you comment out the five lines of code for
+% |\bezier| and |\@bezier| near the start of {\tt curves.sty}.
+% You now have a |\bezier| which is slower and needs more
+% memory but has only its original capabilities and gives only its original
+% results.
+%
+% Please email \texttt{\InternetAddress} examples of any errors not covered
+% above. You may have found a
+% bug in the code or documentation.
+%
+%
+% \section{Curves Summary}
+% \label{summary}
+%
+% The commands following are for the picture environment in the \LaTeXe\
+% manual\footnotemark[1].
+%
+% \subsection{Loading \textsf{curves}}
+%
+% \DescribeMacro{\usepackage}
+% A |\usepackage{curves}|
+% between |\documentclass| and |\begin{document}| commands loads
+% \textsf{curves}. If you have a \TeX\ printing or viewing program which
+% accepts the following |\special| commands you may optionally use
+% them to allow larger |picture|s faster. Support for \textsf{color} may
+% be lost.
+%
+% You use |\usepackage[|\meta{option}|]{curves}| to load a |\special| option
+% for drawing the straight line secants which make curves
+% where \meta{option} is one of:
+%
+% { \setlength\parindent{0pt}
+%
+% \DescribeEnv{dvips}
+% uses the em\TeX\ |\special|s with rounded
+% line ends supported by |dvips|. Works with \textsf{color}.
+%
+% \DescribeEnv{emtex}
+% uses the original em\TeX\ |\special|s with rectangular
+% line ends. Curves adds a disk to round them.
+%
+% \DescribeEnv{xdvi}
+% uses the PostScript |\special|s of |dvips|.
+%
+% \DescribeEnv{WML}
+% the same as |dvips| but with single character names |W|, |M| and
+% |L| to minimize
+% \TeX\ memory with large |picture|s.
+%
+% \subsection{Arguments of Commands}
+%
+% \DescribeEnv{\meta{blank length}} decimal number of
+% \meta{unit len} blanks. Not negative.
+%
+% \DescribeEnv{\meta{character or symbol}} is anything which a |\put| or
+% |\multiput| may draw.
+%
+% \DescribeEnv{\meta{coordinates}} are decimal numbers giving
+% alternate $x$ and $y$
+% coordinates of the curve as multiples of |\unitlength|, comma
+% separated.
+%
+% \DescribeEnv{\meta{[,dash...]}} optional continuation of alternating
+% dash
+% and blank numbers
+% of unit lengths, comma separated. Not negative. Allows decimal points.
+%
+% \DescribeEnv{\meta{diameter}} is a decimal number giving the diameter in
+% |\unitlength|s.
+%
+% \DescribeEnv{\meta{symbol count}} is the number of symbols or
+% patterns to be drawn, default 0.
+%
+% \DescribeEnv{\meta{unit len}} unit length dimension {\it e.g.\/,}
+% 2.5mm, 10pt, used in measuring blanks and dashes. Not negative.
+% Default value is |\unitlength|.
+%
+% \subsection{Lengths used by Commands}
+%
+% \DescribeMacro{\csdiameter} is the size of the space left for a
+% symbol and can be increased or set with
+% |\settowidth{\csdiameter}{|\meta{character or symbol}|}|.
+%
+% \DescribeMacro{\curvelength} is the total length of the curve
+% calculated before
+% drawing by using Simpson's rule once between each pair of coordinate points.
+%
+% \DescribeMacro{\overhang} length of as drawn dash pattern
+% overlapping start of
+% patterns.
+%
+% \subsection{Control Commands}
+%
+% \DescribeMacro{\curvewarntrue} turns warning of parabola
+% replacement by straight lines on (default).
+%
+% \DescribeMacro{\curvewarnfalse} turns warning of parabola
+% replacement by straight lines off.
+%
+% \subsection{Parameter Setting Commands}
+%
+% \DescribeMacro{\curvesymbol} |{|\meta{character or
+% symbol}|}| sets symbol and |\csdiameter|.
+%
+% \DescribeMacro{\curvedashes}
+% |[|\meta{unit len}|]{|\meta{blank length}\meta{[,dash...]}|}| A drawing
+% command not following a |\curvedashes| or following one with
+% an empty or zero length pattern will draw:
+%
+% \makeatletter
+% ^^A Hanging indentation with paragraph separation for author-date, etc.
+% \newenvironment{hanging}{\list{}{\topsep\itemsep \advance\topsep-\parskip
+% \parsep\itemsep \itemsep\z@skip \partopsep\parskip
+% \ifdim\parindent>\z@ \@tempdimb\parindent \else \@tempdimb1.5 em\fi
+% \leftmargin\@tempdimb \listparindent-\@tempdimb \itemindent-\@tempdimb
+% \rightmargin\z@ \labelsep\z@ \labelwidth\z@ }\item[]}%
+% {\endlist \addvspace\parsep}
+% \makeatother
+%
+% \begin{hanging}
+% if \meta{symbol count} is zero or missing, a continuous curve;
+%
+% else if \meta{symbol count} is positive, \meta{symbol count}-1 squares of
+% line thickness size between and additional squares at coordinates or bezier
+% end points;
+%
+% else if no \meta{character or symbol} exists, nothing;
+%
+% else, -\meta{symbol count}-1 characters or symbols between coordinates and
+% additional ones at coordinates or bezier end points.
+%
+% \end{hanging}
+% After a |\curvedashes| command defining a pattern whose length exceeds
+% zero, commands draw:
+%
+%
+% \begin{hanging}
+%
+% if \meta{symbol count} is zero or missing then at a spacing equal to the
+% specified pattern length,
+%
+% \begin{hanging}
+%
+% if no \meta{character or symbol} exists, a dash pattern reduced in length
+% by |\csdiameter| to fit between symbol spaces of |\csdiameter|,
+%
+% else if |\overhang| is not 0pt, a \meta{character or symbol} at all
+% positions,
+%
+% else a \meta{character or symbol} with the first position blank;
+%
+% \end{hanging}
+%
+% else, |\csdiameter| wide symbol spaces, one at and
+% \meta{symbol count}-1 between coordinate points with dash pattern
+% lengths,
+%
+% \begin{hanging}
+% if no \meta{character or symbol} exists, exact but broken by the spaces,
+%
+% else, adjusted to give a whole number of patterns between spaces.
+%
+% \end{hanging}
+% \end{hanging}
+%
+% \DescribeMacro{\diskpitchstretch} is initially 1 but |\renewcommand| can
+% change it to a higher value like 5 to save memory in drafts of complex
+% documents or a lower local value like 0.5 to smooth curve digitization.
+%
+% \DescribeMacro{\linethickness} |{|\meta{len}|}| sets line or dash
+% thicknesses to \meta{len} from 0.5pt up to 15pt (0.17mm to 5mm).
+% |\thicklines| and |\thinlines| also set thickness.
+%
+% \DescribeMacro{\patternresolution} is initially 1 but |\renewcommand| can
+% change it to a higher value like 5 to save memory in drafts of complex
+% documents or a lower local value like 0.5 for greater dash
+% pattern accuracy.
+%
+% \DescribeMacro{\xscale} \DescribeMacro{\xscaley}
+% \DescribeMacro{\yscale} \DescribeMacro{\yscalex} are
+% scale factors initially set to 1, 0, 1 and 0 respectively which
+% |\renewcommand| can reset.
+%
+% \subsection{Curve Drawing Commands}
+% Curves drawn consist of parabolic arcs between coordinate points with
+% tangents at each point parallel to the straight line through adjacent points.
+%
+% \DescribeMacro{\arc} |[|\meta{symbol count}|](X1,Y1){|\meta{angle}|}|
+% draws a circular arc centred
+% on current position, starting from {\tt (X1,Y1)} and proceeding
+% counterclockwise for \meta{angle} degrees.
+%
+% \DescribeMacro{\bezier} |{|\meta{symbol count}|}(X1,Y1)(X2,Y2)(X3,Y3)|
+% draws a curve through
+% the end points {\tt (X1,Y1)} and {\tt (X3,Y3)} tangent to the straight lines
+% joining each of them to {\tt (X2,Y2)}. Extended faster replacement for {\tt
+% bezier.sty} version.
+%
+% \DescribeMacro{\bigcircle} |[|\meta{symbol count}|]{|\meta{diameter}|}|
+% draws a circle of diameter
+% equal to \meta{diameter} times |\unitlength|.
+%
+% \DescribeMacro{\closecurve}|[|\meta{symbol count}|](|\meta{coordinates}|)|
+% draws a closed curve
+% with continuous tangents at all points. At least 6 coordinates required.
+%
+% \DescribeMacro{\curve}|[|\meta{symbol count}|](|\meta{coordinates}|)|
+% draws a curve through the \meta{coordinates}
+% specified. For 4 coordinates this is a straight line.
+%
+% \DescribeMacro{\scaleput}|(X1,Y1){|\meta{picture object}|}|
+% places a picture object in a
+% position scaled by |\xscale|, |\xscaley|, |\yscale| and
+% |\yscalex| for axonometric projection or rotations.
+%
+% \DescribeMacro{\tagcurve} |[|\meta{symbol count}|](|\meta{coordinates}|)|
+% draws a curve without its
+% first and last segments but if only 6 coordinates draws the last segment
+% only.
+%
+% }
+%
+% \StopEventually{} ^^A
+%
+% \section{How \textsf{curves} Works}
+%
+% Superimposing characters closely can draw any curve. Disks give directional
+% independence of line thickness and visual smoothness at large pitch.
+% Smoothness increases with output resolution but is almost independent of disk
+% pitch below a critical maximum. The following table suggests this maximum
+% varies from 0.34pt for an 0.5pt thick curve to 3pt for a 15pt curve.
+%
+% \begin{center}
+% \setlength{\unitlength}{1pt}
+% \begin{tabular}{cccc}
+% Thickness & \makebox[3em][l]{Magnified} & Comments & Line at 1/6 slope \\
+% \hline
+% 15pt & $\times1$ & 1pt pitch disks&
+% \begin{picture}(80,20)(0,15) \multiput(10,15)(1,0.1667){61}{\circle*{15}}
+% \end{picture} \\
+% 15pt & $\times1$ & 3pt pitch disks&
+% \begin{picture}(80,20)(0,15) \multiput(10,15)(3,0.5){21}{\circle*{15}}
+% \end{picture} \\
+% $\approx$0.5pt & $\times1$ & \LaTeX\ |\line(6,1)| &
+% \begin{picture}(80,20)(0,15) \thinlines \put(10,15){\line(6,1){60}}
+% \end{picture} \\
+% $\approx$0.5pt & $\times1$ & 0.34pt pitch disks &
+% \begin{picture}(80,20)(0,15)
+% \multiput(10,15)(0.3333,0.05556){181}{\tiny .}
+% \end{picture} \\
+% $\approx$0.5pt & $\times30$ \rule[-10pt]{0pt}{10pt} &
+% \parbox{8em}{\centering 0.34pt pitch disks\\ resolution $\times30$ } &
+% \begin{picture}(80,20)(0,15) \multiput(10,15)(10.0,1.667){7}{\circle*{15}}
+% \end{picture} \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \LaTeX\ |\line|\footnotemark[1] or line drawing |\special|
+% commands require a tenth the \TeX\ memory so are preferable to disks if
+% available.
+% \LaTeX\ can load \TeX\footnote{Donald E. Knuth, {\sl The \TeX book,}
+% Addison-Wesley, 1984, Chapter 20.} macros from package files with a
+% |.sty| extension. These macros can calculate the disk or line positions
+% for a curve.
+%
+% The difference in the changes in position between
+% successive pairs of disks may be so
+% small that \TeX\ rounding causes visible curve error. The difference between
+% a curve and straight secants joining points many disks apart can be invisible
+% with invisible \TeX\ rounding also. \TeX\ can efficiently draw visibly
+% accurate curves as a sequence of straight secants. Straight line drawing
+% |\special|s are often incompatible so multiple line options
+% are desirable in macros. A smooth curve
+% may require thousands of disks but only hundreds of secants so line
+% |\special|s may prevent a complex drawing from overflowing \TeX\ memory.
+%
+% {\tt curves.sty} provides macro commands for drawing curves as secants.
+% Version \fileversion\ loads in about 2000 words\footnote{A character or token
+% takes a \TeX\ word, 32 bits or larger.} of \TeX's main memory, which allows a
+% small \TeX. Complex or numerous floating drawings still require a big \TeX\
+% with {\tt curves.sty}.
+% Current options for line |\special|s are |dvips|, |emtex|, |xdvi|, and
+% |WML|.
+%
+% The capabilities of these macros are:---
+% \begin{itemize}
+% \item A compatible replacement for |\bezier|\footnote{See your Local
+% Guide. Try the system command {\tt latex local} to get a \LaTeX ed Guide.}
+% from {\tt bezier.sty} or \LaTeXe.
+% \item Work with |slides| class
+% for overhead transparencies with \LaTeXe\footnote{Michel Goossens, Frank
+% Mittelbach and Alexander Samarin, {\sl The \LaTeX\ Companion,}
+% Addison-Wesley, 1994.}.
+% \item Curves have the minimum number of disks or secants for visual
+% smoothness.
+% \item Curve thickness adjustable from 0.5 to 15pt (0.17 to 5mm).
+% \item Curves have continuous slope.
+% \item Curves for any number of points greater than one using |\curve|.
+% \item Control of end slopes using |\tagcurve|.
+% \item Closed curves with continuous slope using |\closecurve|.
+% \item Large circles |\bigcircle| and circular arcs |\arc|.
+% \item Independent scaling of curve abscissa and ordinates to fit graphs.
+% \item Affine scaling for making arcs or circles elliptical.
+% \item Symbols and dash patterns combined without interference.
+% \item Any dash length or spacing.
+% \item Three methods for fitting dash patterns to curves.
+% \end{itemize}
+%
+% Parabolas approximate the segments between the specified coordinate points.
+% At an internal curve point, the slope of the two parabolas which join
+% is the slope of the straight line joining the adjacent points. For an end
+% segment, the inside point of the parabola is made a vertex which determines
+% the slope of the end point. |\tagcurve| has hidden end segments which
+% allows complete control of slope at the visible end point when desired.
+% This scheme makes the curves and slopes continuous and the discontinuity
+% in curvature is small with sufficient data points.
+%
+% Usually four points determine the parabola segment between the two
+% inside points. The four points could be close to a straight line or
+% consistent with an inflexion point. A straight line then replaces
+% the parabola between the inside points and optionally a warning is issued.
+%
+% Each parabola is drawn as a series of short secants.
+% For line |\special|s, the dvi driver draws the straight lines.
+% Otherwise, the secants are
+% drawn as overlapping disks at high speed using a simple tail chasing macro.
+% This macro's arithmetic calculations are two fixed point additions per disk
+% drawn.
+%
+% For circles and circular arcs, a parabola approximates an arc segment no
+% more than 23$^\circ$ giving a radius increase between segment ends less than
+% 0.02\%. A full circle uses 16 parabolas.
+% The error in computing and multiplying by sine and cosine is usually
+% less than 0.01\% of the radius at the far end of an arc.
+%
+% \section{Pleas for the Future}
+%
+% \textsf{Curves} will never work with plain \TeX\ and it will never be as
+% powerful as {\sf METAFONT} or importing encapsulated PostScript
+% files. Suggestions or criticisms by email are
+% welcome. Version \fileversion\ has benefitted greatly from previous
+% help. The latest versions are first available at URL:
+% \begin{verbatim}
+% ftp://ilm.mech.unsw.edu.au/pub/archive/latex/macros/curves/
+% \end{verbatim}
+% At your local CTAN mirror the latest version should be near the
+% directory for the latest version of \LaTeX. Please use
+% CTAN to reduce Internet load.
+%
+% \DescribeMacro{WML}
+% A {\tt .dvi} file containing curves produced with the |emtex| option
+% has many occurrences of the text strings {\tt em:lineto}, {\tt
+% em:moveto} and {\tt em:linewidth XXXXpt} placed by the em\TeX\
+% |\special|s. These strings would have earlier occupied \TeX\
+% memory. Extra memory is also taken by the disks used to
+% cover the cracks between square line ends at a slight angle. Renaming
+% these |\special|s to {\tt L}, {\tt M} and {\tt W XXXXpt}
+% respectively would save \TeX\ memory. Even better, {\tt W XXXXpt}
+% could calculate and store the bitmap of a disk which {\tt L}
+% would add to its line ends to round them so {\tt curves} need not add
+% disks\footnote{\texttt{dvips}'s em\TeX\ \texttt{\bslash special}s
+% round line ends but not all em\TeX\ \texttt{\bslash special}s do.}.
+% If you write dvi drivers, please add
+% these three proposed |\special|s.
+%
+% \section{\texttt{curves.sty}}
+%
+% The description of the algorithms following is minimal.
+% Future releases will add more.
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+
+% \noindent Make `;' appear like a letter so control sequences can use
+% it and they
+% will not be accidently used by other macro packages.
+% \begin{macrocode}
+\catcode`\;=11
+
+% \end{macrocode}
+% \subsection{Registers}
+% Counts
+%
+% \noindent number of symbols on Bezier segment
+% \begin{macrocode}
+\newcount\;sc
+\newcount\;scp
+\newcount\;t
+% \end{macrocode}
+% coordinate count
+% \begin{macrocode}
+\newcount\;cc
+% \end{macrocode}
+% actual point count to next dot
+% \begin{macrocode}
+\newcount\;cnd
+% \end{macrocode}
+% maximum point count to next dot
+% \begin{macrocode}
+\newcount\;mcnd
+\newcount\;np
+\newcount\;overhang
+\newcount\;pbs
+\newcount\;pns
+% \end{macrocode}
+% maximum dot spacing on line in sp.
+% \begin{macrocode}
+\newcount\;psc
+\newcount\;rc
+\newcount\;rtc
+\newcount\;tc
+\let\;tca=\@tempcnta
+\let\;tcb=\@tempcntb
+
+% \end{macrocode}
+% Dimens
+% \begin{macrocode}
+\newlength\csdiameter
+\newlength\curvelength
+\newlength\overhang
+\newlength\;x
+\newlength\;dx
+\newlength\;ddx
+\newlength\;y
+\newlength\;dy
+\newlength\;ddy
+\newlength\;pl
+\newlength\;ucd
+\let\;td=\@tempdima
+\let\;ytd=\@tempdimb
+
+% \end{macrocode}
+% Boxes
+% \begin{macrocode}
+\newsavebox{\;csbox}
+\newsavebox{\;pt}
+
+% \end{macrocode}
+% \subsection{Boolean}
+%
+% has an option been selected
+% \begin{macrocode}
+\newif\if;noopt \;noopttrue
+% \end{macrocode}
+% Warn about curve problems
+% \begin{macrocode}
+\newif\ifcurvewarn \curvewarntrue
+% \end{macrocode}
+% coordinate number correct
+% \begin{macrocode}
+\newif\if;ccn
+% \end{macrocode}
+% plot points if true
+% \begin{macrocode}
+\newif\if;pt
+% \end{macrocode}
+% curve symbol defined
+% \begin{macrocode}
+\newif\if;csym
+% \end{macrocode}
+% symbol or pattern count
+% \begin{macrocode}
+\newif\if;scnt
+
+% \end{macrocode}
+% help strings
+% \begin{macrocode}
+\newhelp\;strline{curve straight from}
+\newhelp\m;ssingcoord{curve needs more points, add them.}
+\newhelp\;negdash{curvedashes needs the same sign for all arguments.}
+\newhelp\;oddcoord{curve requires two co-ordinates for each point,
+ count them.}
+
+% \end{macrocode}
+%
+% \subsection{Driver Options}
+%
+% The following three commands may be reset
+% by \textsf{curves} options to contain straight
+% line drawing |\special|s which some |dvi| drivers
+% may have. The usual default for unimplemented
+% |\special|s is the driver
+% draws nothing. If no option is specified \LaTeX\ period and circle
+% fonts are used to plot straight lines segments efficiently.
+% This should always work with \LaTeXe.
+% The resulting curves differ
+% in run time, \TeX\ memory use,
+% |.dvi| and printer file size but not in output |picture|s.
+%
+%
+% \noindent Sets the line width
+% \begin{macrocode}
+\newcommand\;linewidth[1]{}
+% \end{macrocode}
+% Sets the start of the line
+% \begin{macrocode}
+\newcommand\;startline{}
+% \end{macrocode}
+% Draws the line and sets next start.
+% \begin{macrocode}
+\newcommand\;stopl;ne{}
+
+\newcommand\;optioncheck[2]{%
+ \DeclareOption{#1}{%
+ \if;noopt
+ #2\;nooptfalse
+ \else
+ \PackageError{curves}{Option
+ \CurrentOption\space ignored}{curves uses only one dvi option}%
+ \fi
+ }%
+}
+
+% \end{macrocode}
+% Sets thickness and no disk character for rounded line ends.
+% \begin{macrocode}
+\newcommand\;setdisk{\@killglue \;linewidth\@wholewidth
+ \set;pt{}\let\;stopline\;stopl;ne}
+\newcommand\s;tpitch{\;td\patternresolution\p@ \;psc\;td}
+
+\;optioncheck{dvips}{
+% \end{macrocode}
+% Works with the \textsf{color} package.
+% \begin{macrocode}
+ \renewcommand\;linewidth[1]{\special{em:linewidth \the#1}}%
+ \renewcommand\;startline{\special{em:moveto}}%
+ \renewcommand\;stopl;ne{\special{em:lineto}}%
+}
+
+\;optioncheck{emtex}{
+ \renewcommand\;linewidth[1]{\special{em:linewidth \the#1}}%
+ \renewcommand\;startline{\special{em:moveto}}%
+ \renewcommand\;stopl;ne{\special{em:lineto}}%
+ \renewcommand\;setdisk{\@killglue
+ \ifdim\@halfwidth>\p@
+ \set;pt{\@circ\@wholewidth{112}}\;linewidth{\wd\;pt}%
+ \s;tcirc{\unhbox\;pt}%
+ \else \;linewidth\@wholewidth \set;pt{}\fi \let\;stopline\;stopl;ne}
+}
+
+\;optioncheck{xdvi}{
+% \end{macrocode}
+% Works with |xdvi| and |dvips| but not \textsf{color}.
+%
+% Divide the excess precision of scaled points by 256 to save
+% \TeX\ memory and |dvi| file size. Device independent for
+% resolutions smaller than 18501 dots per inch.
+% Note: \(72.27\times256/72=256.96\) exactly so errors occur only after the
+% |\divide|s in the |\;stopl;ne|.
+% \begin{macrocode}
+ \special{!/;L{1 256.96 div dup scale 1 setlinecap
+ setlinewidth newpath 0 0 moveto lineto stroke}def}%
+ \newcount\;wc
+ \newlength\;X
+ \newlength\;Y
+ \renewcommand\;linewidth[1]{\;wc#1}%
+ \renewcommand\;startline{\global\;X\;x \global\;Y\;y}%
+ \renewcommand\;stopl;ne{%
+ \;tca\;X \advance\;tca-\;x \;tcb\;Y \advance\;tcb-\;y
+ \divide\;tca\@cclvi \divide\;tcb\@cclvi \divide\;wc\@cclvi
+ \special{"\the\;tca\space \the\;tcb\space \the\;wc\space ;L}%
+ \;startline
+ }%
+}
+
+\;optioncheck{WML}{
+ \renewcommand\;linewidth[1]{\special{W \the#1}}%
+ \renewcommand\;startline{\special{M}}%
+ \renewcommand\;stopl;ne{\special{L}}%
+ \;nooptfalse
+}
+
+\let\;optioncheck\relax
+\ProcessOptions\relax
+
+\if;noopt
+
+\newcount\;wc
+\newlength\;X
+\newlength\;Y
+
+\newcommand\;setperiod{\;tcb
+ \ifdim\@halfwidth>.6\p@ 17\;td.7
+ \else \ifdim\@wholewidth>.85\p@ 12\;td.48
+ \else \ifdim\@wholewidth>.6\p@ 8\else 5\fi \;td.34
+ \fi
+ \fi \p@
+ \s;tcirc{\rm \fontseries m\fontshape n\fontsize{\the\;tcb}\p@
+ \selectfont \hss.}}%
+
+% \end{macrocode}
+% Sets LaTeX disk character and calculates maximum spacing or selects period.
+% \begin{macrocode}
+\renewcommand\;setdisk{\@killglue \ifdim\@halfwidth>.85\p@
+ \s;tcirc{\@circ{\@wholewidth}{112}}\;td\@wholewidth
+ \divide\;td 8\advance\;td.6\p@ \ifdim\;td>\thr@@\p@\;td\thr@@\p@\fi
+ \else \;setperiod \fi \let\;stopline\;stopl;ne}%
+
+\renewcommand\s;tpitch{\;ytd\diskpitchstretch\;td \;wc\;ytd
+ \;td\patternresolution\p@ \;psc\;td }
+
+\renewcommand\;startline{\global\;X\;x \global\;Y\;y}
+
+\renewcommand\;stopl;ne{%
+% \end{macrocode}
+% This plots just the intermediate disks of a straight line segment which
+% requires any. The end disks are plotted in the device independent code.
+% \begin{macrocode}
+ \;td\;X \advance\;td-\;x \;ytd\;Y \advance\;ytd-\;y
+ \;startline \;rxya\;td\;ytd \divide\;rc\;wc
+ \ifnum\;rc>\z@ \advance\;rc\@ne
+ \divide\;td\;rc \divide\;ytd\;rc \;y\z@
+ \advance\;rc\m@ne \;tca\;rc
+ \let\n;xt\;ls \;ls \kern-\;rc\;td
+ \fi}
+
+\newcommand\;ls{\advance\;y\;ytd \kern\;td \raise\;y\copy\;pt
+ \advance\;tca\m@ne \ifnum\;tca=\z@ \let\n;xt\relax \fi \n;xt}
+
+\fi
+
+% \end{macrocode}
+% \subsection{User Command Definitions}
+% \begin{macrocode}
+\newcommand\arc[1][0]{\;arc[#1]}
+\newcommand\;arc{}
+\def\;arc[#1](#2,#3)#4{\;setpoint{#1}\scaleput(#2,#3){\;ddx
+ -#3\unitlength \;ddy#2\unitlength \;firstpoint \;td#4\p@ \;drwarc}}
+
+% \end{macrocode}
+% Redefines version in LaTeX 2e of 1 June 1994.
+% \begin{macrocode}
+\def\bezier#1)#2(#3)#4({\@bezier#1)(#3)(}
+\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){\;dx#4\unitlength \;ddx-\;dx
+ \advance\;dx-#2\unitlength \advance\;ddx#6\unitlength
+ \;dy#5\unitlength \;ddy-\;dy \advance\;dy-#3\unitlength
+ \advance\;ddy#7\unitlength
+ \;setpoint{#1}\scaleput(#2,#3){\;firstpoint \;bezier}}
+
+\newcommand\bigcircle[2][0]{\;setpoint{#1}\;dx\unitlength
+ \global\divide\unitlength\tw@
+ \scaleput(#2,0){\;startline \;ddx\z@ \;ddy#2\unitlength
+ \global\unitlength\;dx \;td360\p@ \;drwarc}}
+
+\newcommand\closecurve[1][0]{\;closecurve[#1]}
+\newcommand\;closecurve{}
+\def\;closecurve[#1](#2){\;coordn\closecurve\thr@@{#2}{#1}%
+ \if;ccn\scaleput(\;xb,\;yb){\;startline
+ \edef\;ci{\;xa,\;ya,#2,\;xb,\;yb,\;xc,\;yc}%
+ \advance\;cc\thr@@ \;tagcurve\;ci}\fi}
+
+\newcommand\curve[1][0]{\;curve[#1]}
+\newcommand\;curve{}
+\def\;curve[#1](#2){\;coordn\curve\tw@{#2}{#1}%
+ \if;ccn \scaleput(\;xa,\;ya){\;firstpoint
+ \ifnum\;cc=\tw@ \;slbezd \;slbez
+ \else \;scbezd\;dx\;ddx\;xa\;xb\;xc \;scbezd\;dy\;ddy\;ya\;yb\;yc
+ \;bezier \;tagcurve{#2}\ifnum\;cc>6\;endcurve\fi \fi}\fi}
+\newcommand\;scbezd[5]{\;slcd#2#3#5\divide#24\;slcd#1#3#4\advance#1-#2}
+\newcommand\;xa{} \newcommand\;xb{} \newcommand\;xc{}
+\newcommand\;ya{} \newcommand\;yb{} \newcommand\;yc{}
+\newcommand\;ci{}
+
+\newcommand\curvesymbol[1]{\def\;curvesymbol{#1}\ch;ckcs
+ \global\sbox\;csbox{#1}\csdiameter\wd\;csbox}
+\newcommand\;curvesymbol{} \def\;curvesymbol{}
+
+\newcommand\curvedashes[2][\unitlength]{\;ucd#1\def\;icurvedashes{#2}%
+ \;ccnfalse \;pl\z@
+ \@for \;ci:=#2\do{\ifdim\;ci\;ucd<\z@ \;ccntrue
+ \PackageError{curves}{\string
+ \curvedashes\space sign bad at \;ci\MessageBreak}{\the\;negdash}%
+ \else \advance\;pl\;ci\;ucd \fi}\if;ccn\;pl\z@\fi}
+\newcommand\;icurvedashes{}
+
+\newcommand\tagcurve[1][0]{\;tgcrv[#1]}
+\newcommand\;tgcrv{}
+\def\;tgcrv[#1](#2){\;coordn\tagcurve\thr@@{#2}{#1}\if;ccn
+ \scaleput(\;xb,\;yb){\;firstpoint \;tagcurve{#2}}\fi}
+
+\newcommand\scaleput{}
+\long\def\scaleput(#1,#2)#3{\@killglue \;td#2\unitlength
+ \raise\yscale\;td \hbox to \z@{\kern\xscaley\;td \;td#1\unitlength
+ \kern\xscale\;td \raise\yscalex\;td \hbox{#3}\hss}\ignorespaces}
+\newcommand\xscale{\@ne}
+\newcommand\xscaley{0}
+\newcommand\yscale{\@ne}
+\newcommand\yscalex{0}
+
+\newcommand\diskpitchstretch{\@ne}
+\newcommand\patternresolution{\@ne}
+
+% \end{macrocode}
+%
+% \subsection{Drawing Command Details}
+%
+% Plot first point if any.
+% \begin{macrocode}
+\newcommand\;firstpoint{\;startline \ifdim\;pl=\z@\;point\relax\fi}
+
+% \end{macrocode}
+% Calculates segment count, sine, cosine and differences then plots segments.
+% \begin{macrocode}
+\newcommand\;drwarc{\;cc\;td \;np\;td \;td23\p@ \divide\;cc\;td
+ \;abs\;cc \advance\;cc\@ne \;pns\p@ \divide\;pns\tw@
+ \divide\;np\;cc \;rc\;np \divide\;rc\;pns \;abs\;rc
+ \advance\;rc\@ne \divide\;np\;rc \multiply\;np\;pns \divide\;np14668 %
+ \multiply\;np\;rc \divide\;np\@cclvi \;scp\p@ \multiply\;scp\@cclvi
+ \;t\;pns \;csi\;csi\;csi\;csi \;rxya\;ddx\;ddy \divide\;rc\p@
+ \advance\;rc\@ne \;rtc\;rc \advance\;rc\;rc \;ndd\;ddx \;ndd\;ddy
+ \;csi \;rxya\;ddx\;ddy \divide\;rc\;pns \advance\;rc\@ne
+ \@whilenum\;cc>\z@ \do{\advance\;cc\m@ne \;dx\;ddx \;dy\;ddy
+ \divide\;ddx\;rc \divide\;ddy\;rc \;td\;ddx \;ddx\;t\;td
+ \advance\;ddx-\;np\;ddy \;ddy\;t\;ddy \advance\;ddy\;np\;td
+ \divide\;ddx\;pns \divide\;ddy\;pns \;ddx\;rc\;ddx \;ddy\;rc\;ddy
+ {\;bezier \global\;td\;x \global\;ytd\;y
+ \global\;tca\;overhang}\;y\;ytd \;x\;td \;overhang\;tca}}
+\newcommand\;ndd[1]{\divide#1\;rc \multiply#1\;np
+ \divide#1\;t #1\;rtc#1}
+% \end{macrocode}
+% Cosine and sine half angle iteration.
+% \begin{macrocode}
+\newcommand\;csi{\;tcb\;np \multiply\;np\;t \divide\;np\;pns \;t\;tcb
+ \multiply\;t\;t \divide\;t-\;scp \advance\;t\;pns \divide\;scp4 }
+
+% \end{macrocode}
+% Count the number of coordinates specified and warn if incorrect.
+% \begin{macrocode}
+\newcommand\;coordn[4]{\;setpoint{#4}\ifx#1\closecurve\;cc\tw@
+ \else\;cc\z@\fi
+ \@for\;ci:=#3\do{\advance\;cc\@ne
+ \ifcase\;cc \or \;d;f\;xa \or \;d;f\;ya \or \;d;f\;xb
+ \or \;d;f\;yb \or \;d;f\;xc \or \;d;f\;yc \fi
+ \ifx#1\closecurve\ifodd\;cc \;d;f\;xa \else \;d;f\;ya \fi\fi}%
+ \;ccnfalse \ifx#1\closecurve \advance\;cc-\tw@ \fi
+ \ifodd\;cc
+ \PackageError{curves}{\string #1\space points odd}{\the\;oddcoord}%
+ \else \divide\;cc\tw@
+ \ifnum#2>\;cc \PackageError{curves}{\string #1\space needs \the#2
+ points\MessageBreak}{\the\m;ssingcoord}%
+ \else \;ccntrue \fi\fi}
+
+% \end{macrocode}
+% Sets symbol, character or disk depending on how line is to be plotted.
+% Corrects overhang to be positive or zero but no greater than |\;pl|.
+% \begin{macrocode}
+\newcommand\;setpoint[1]{\curvelength\z@ \let\;stopline\relax
+ \def\;point##1{\raise\;y\hbox{{\copy\;pt##1}}}\ch;ckcs
+ \ifnum#1=\z@\;scntfalse\else\;scnttrue\fi
+ \;sc#1\relax \;abs\;sc \;psc\;sc
+ \ifdim\;pl>\z@ \;overhang\overhang
+ \ifnum\;overhang=\z@\else \;np\;overhang
+ \divide\;np\;pl \multiply\;np\;pl
+ \ifnum\;overhang<\z@ \advance\;overhang\;pl
+ \else \ifnum\;overhang=\;np\advance\;overhang\;pl\fi
+ \fi \advance\;overhang-\;np \fi
+ \if;csym \if;scnt\;setdisk\else\;setsymbol\fi
+ \else \;setdisk \fi\s;tpitch
+ \else\ifnum#1>\z@
+ \s;tcirc{\hss\vrule\@height\@wholewidth\@width\@wholewidth}%
+ \else\ifnum#1<\z@ \if;csym\;setsymbol\else\set;pt{}\fi
+ \else\;setdisk\s;tpitch
+ \fi\fi\fi \;x\z@ \;y\dp\;pt \advance\;y-\ht\;pt \divide\;y\tw@}
+\newcommand\;setsymbol{\s;tcirc{\hss\unhcopy\;csbox}%
+ \edef\;point{\;point\relax
+ \s;tcirc{\hss\noexpand\;curvesymbol}\global\setbox\;csbox\copy\;pt}}
+\newcommand\;stopline{} \newcommand\;point{}
+
+% \end{macrocode}
+% Check if curvesymbol exists and set switch.
+% \begin{macrocode}
+\newcommand\ch;ckcs{\ifx\;curvesymbol\@empty\;csymfalse
+ \else\;csymtrue\fi}
+
+% \end{macrocode}
+% Makes zero width box |\;pt| of point
+% \begin{macrocode}
+\newcommand\s;tcirc[1]{\set;pt to\z@{#1\hss}}
+
+% \end{macrocode}
+% Set global box |\;pt|
+% \begin{macrocode}
+\newcommand\set;pt{\global\setbox\;pt\hbox}
+
+% \end{macrocode}
+% Plots last segment of curve from coordinates already read.
+% \begin{macrocode}
+\newcommand\;endcurve{\;ecbezd\;dx\;ddx\;xa\;xb\;xc
+ \;ecbezd\;dy\;ddy\;ya\;yb\;yc \;bezier}
+\newcommand\;ecbezd[5]{\;slcd#1#3#5\divide#14
+ #2-#1\advance#2#5\unitlength
+ \advance#2-#4\unitlength}
+
+% \end{macrocode}
+% Reads coordinates of four points before going to difference calculation.
+% \begin{macrocode}
+\newcommand\;tagcurve[1]{\ifnum\;cc=\thr@@ \;endcurve \else \;cc\z@
+ \@for\;ci:=#1\do{\advance\;cc\@ne \ifnum\;cc>6 %
+ \ifodd\;cc \;slcd\;dx\;xa\;xc \let\;xa\;xb \let\;xb\;xc \;d;f\;xc
+ \else \t;gcrv \fi \fi}\fi}
+
+% \end{macrocode}
+% Calculates differences over whole segment from four points.
+% \begin{macrocode}
+\newcommand\t;gcrv{\;slcd\;dy\;ya\;yc
+ \let\;ya\;yb \let\;yb\;yc \;d;f\;yc
+ \;rxy\;dx\;dy \divide\;dx\;rtc \divide\;dy\;rtc
+ \;ddx-\;ya\;dx \advance\;ddx\;xa\;dy \;ddy\;ddx
+ \advance\;ddx\;yb\;dx \advance\;ddx-\;xb\;dy
+ \advance\;ddy\;yc\;dx \advance\;ddy-\;xc\;dy
+ \;slbezd \;td\;ddy \divide\;td\@m
+ \ifdim\;td=\z@ \ifcurvewarn
+ \PackageWarning{curves}{\the\;strline\MessageBreak
+ \;xa,\;ya\space to \;xb,\;yb\MessageBreak}\fi
+ \;slbez
+ \else \;td\unitlength \;rtc\;td \advance\;rtc\;rtc
+ \divide\;rtc\p@ \advance\;rtc\@ne \divide\;td\;rtc
+ \;t\;ddx \;scp\;t \;abs\;t
+ \advance\;t\;t \divide\;t\p@ \advance\;t\@ne \divide\;scp\;t
+ \multiply\;td\;scp \divide\;td\;ddy
+ \multiply\;td\;rtc \multiply\;td\;t
+ \;ddx\;xc\;td \advance\;ddx-\;xa\;td \advance\;dx-\;ddx
+ \;ddy\;yc\;td \advance\;ddy-\;ya\;td \advance\;dy-\;ddy
+ \;bezier \fi}
+
+% \end{macrocode}
+% Avoid repeating |{\;ci}|
+% \begin{macrocode}
+\newcommand\;d;f[1]{\edef#1{\;ci}}
+
+\newcommand\;slbezd{\;slcd\;dx\;xa\;xb \;slcd\;dy\;ya\;yb}
+
+% \end{macrocode}
+% Calculates difference between two coordinates.
+% \begin{macrocode}
+\newcommand\;slcd[3]{#1#3\unitlength \advance#1-#2\unitlength}
+
+% \end{macrocode}
+% Calculates differences for bezier straight line.
+% \begin{macrocode}
+\newcommand\;slbez{\divide\;dx\tw@ \;ddx\;dx \divide\;dy\tw@
+ \;ddy\;dy \;bezier}
+
+% \end{macrocode}
+% Scales segment differences, then calculates segment pattern and disk count,
+% and initial disk differences; selects line or dashes. Dash patterns
+% were originally measured out in multiples of the disk pitch and are currently
+% in points but can be adjusted with |\patternresolution|. This should
+% be reprogrammed in scaled points.
+% \begin{macrocode}
+\newcommand\;bezier{\;scale\;dx\;dy \;scp\;rc \;scale\;ddx\;ddy
+ \advance\;scp\;rc \;bezc\;dx\;ddx \;bezc\;dy\;ddy \;rxy\;ddx\;ddy
+ \divide\;rc\p@ \advance\;rc\thr@@
+ \;tc\;rc \ifnum\;rc>\sixt@@n\;rc\sixt@@n\fi
+ \;rroot\;rroot\;rroot\;rroot
+ \;t\;rc \;rxy\;dx\;dy \advance\;rc\;scp \divide\;rc\thr@@
+ \global\advance\curvelength\;rc sp\;mcnd\@ne
+% \end{macrocode}
+% Here |\;t| is the number of straight line segments making current
+% bezier segment and |\;rc| is the length of the bezier segment in
+% scaled points.
+% \begin{macrocode}
+ \ifdim\;pl>\z@ \;np\;rc \divide\;np\;psc
+ \ifnum\;t<\;np \;mcnd\;np \divide\;mcnd\;t
+ \divide\;np\;mcnd \multiply\;np\;mcnd \;t\;np
+ \fi
+ \fi
+ \if;scnt
+ \ifdim\;pl=\z@ \;t\;sc
+ \else \;np
+ \if;csym \;rc \divide\;np\;sc \advance\;np-\csdiameter
+ \;td\;pl \divide\;td\tw@ \advance\;np\;td \divide\;np\;pl
+ \ifnum\;np<\@ne\;np\@ne\fi \multiply\;np\;sc
+ \else \;sc
+ \fi
+ \advance\;t\;np \divide\;t\;np \multiply\;t\;np
+ \fi
+ \fi
+% \end{macrocode}
+% Here |\;mcnd| is the number of pattern increments in a straight
+% segment and |\;t| in the bezier segment.
+% |\;np| is the number of complete patterns when known.
+%
+% The calculation following ensures that the end point of the bezier
+% curve is as accurate as possible.
+% \begin{macrocode}
+ \;rtc\;t \divide\;rtc\;mcnd \;tcb\;rtc \multiply\;tcb\;t
+ \advance\;rtc\m@ne \multiply\;rtc\;t \;tc\;t \advance\;tc\;tc
+ \;bezd\;dx\;ddx \;bezd\;dy\;ddy
+ \ifdim\;pl>\z@ \;dashes \else \let\n;xt\;spoints \;spoints \fi}
+\newcommand\;scale[2]{\;td\xscale#1\advance\;td\xscaley#2%
+ #2\yscale#2\advance#2\yscalex#1#1\;td \;rxy#1#2}
+\newcommand\;bezc[2]{\advance#1#1\advance#2#2%
+ \;td#2\advance#2-#1\advance#1\;td}
+\newcommand\;bezd[2]{\divide#2\;tcb \;td#2\multiply\;td\;rtc
+ \advance#1-\;td \divide#1\;tc}
+
+% \end{macrocode}
+% Plots a continuous line or equispaced squares or symbols along a segment.
+% \begin{macrocode}
+\newcommand\;spoints{\advance\;y\;dy \advance\;x\;dx \kern\;dx
+ \;point\;stopline \advance\;t\m@ne
+ \ifnum\;t>\z@ \advance\;dx\;ddx \advance\;dy\;ddy
+ \else \let\n;xt\relax \fi \n;xt}
+
+% \end{macrocode}
+% Calculates length of vector |\;rc| from coordinates |#1|, |#2|
+% \begin{macrocode}
+\newcommand\;rxy[2]{\;rxya#1#2%
+ \ifnum\;rc>\z@ \;rtc\;rc \advance\;rtc\;rtc \divide\;rtc\p@
+ \ifnum\;rtc>\z@ \advance\;rtc\@ne \divide\;tc\;rtc
+ \divide\;tcb\;rtc \divide\;rc\;rtc
+ \else \;rtc\@ne
+ \fi
+ \multiply\;tc\;tc \multiply\;tcb\;tcb
+ \advance\;tc\;tcb \;rroot\;rroot \multiply\;rc\;rtc
+ \fi}
+
+% \end{macrocode}
+% Estimate length of vector |\;rc| from coordinates |#1|, |#2|.
+% For \DeleteShortVerb{\|} \(1>|x|\ge|y|>0\), \(|x|+|y|/3\) is
+% \MakeShortVerb{\|} within 6\% of \(\sqrt{x^2+y^2}\).
+% \begin{macrocode}
+\newcommand\;rxya[2]{\;tc#1\;abs\;tc \;tcb#2\;abs\;tcb
+ \ifnum\;tc>\;tcb \;rc\;tcb \;tcb\;tc \;tc\;rc \fi
+ \;rc\;tc \divide\;rc\thr@@ \advance\;rc\;tcb
+}
+
+% \end{macrocode}
+% Replaces argument by magnitude
+% \begin{macrocode}
+\newcommand\;abs[1]{\ifnum#1<\z@ #1-#1\fi}
+
+% \end{macrocode}
+% One iteration of square root calculation by Newton's method.
+% \begin{macrocode}
+\newcommand\;rroot{\;tcb\;tc \divide\;tcb\;rc
+ \advance\;rc\;tcb \divide\;rc\tw@}
+
+% \end{macrocode}
+%
+% \subsection{Dash Pattern Drawing}
+%
+% Variable uses in |\;dashes|, |\;scdashes|, |\;nscdashes|, |\;pdashes|
+% and |\;dash|.
+%
+% counts
+%
+% |\;scp| = distance between points.
+%
+% |\;rc| = length of Bezier segment.
+%
+% |\;rtc| = total points in Bezier segment.
+%
+% |\;np| = number of whole patterns in Bezier segment or scratch.
+%
+% |\;overhang| = of dash pattern past symbol or end of segment.
+%
+% |\;pbs| = total points between symbols
+%
+% |\;pns| = points to next symbol or dot.
+%
+% |\;tc| = number of points to blank for curve symbol.
+%
+% |\;tcb| = number of points along pattern.
+%
+% dimens
+%
+% |\;pl| = length of dash pattern.
+%
+% |\;ucd| = dash pattern unit length.
+%
+% Initializes dash plot for segment and selects symbol count alternative.
+% \begin{macrocode}
+\newcommand\;dashes{\let\;ticd\;icurvedashes
+ \let\;tucd\;ucd \divide\;rc\;t
+ \;rtc\;t \;tc\;rc \advance\;tc\csdiameter \divide\;tc\;rc
+ \divide\;tc\tw@ \;t\;tc \multiply\;tc\tw@ \;ptfalse \;cnd\;mcnd
+ \;pbs\;rc \divide\;pbs\tw@
+ \advance\;overhang\;pbs \divide\;overhang-\;rc
+ \if;scnt \;scdashes \else \;nscdashes \fi \multiply\;overhang\;rc}
+
+% \end{macrocode}
+% Plots dash pattern when a nonzero symbol count is specified.
+% \begin{macrocode}
+\newcommand\;scdashes{\;pbs\;rtc \divide\;pbs\;sc \;ccss \;scp
+ \if;csym \;pl \multiply\;scp\;np \divide\;scp\;sc \advance\;pbs-\;tc
+ \else \;pbs \multiply\;scp\;rc \fi \;np\;overhang \;overhang\z@
+ \divide\;scp\;pbs \;tcb\z@ \;pns\;t \;dash \;overhang\;np
+ \if;csym\else \advance\;overhang-\;tcb \advance\;rtc-\;tcb
+ \advance\;pbs-\;tc \fi
+ \;pns\;pbs \advance\;pns-\;np \if;csym\else\advance\;pns\;tcb\fi
+ \@whilenum\;rtc>\z@\do{\;pdashes \;ptfalse \;t\;tc \;pns\;t \;dash
+ \;pns\;pbs \;overhang\if;csym\;np\else-\;overhang\fi
+ \advance\;pns-\;overhang}\;overhang-\if;csym\;np\else\;overhang
+ \;ptfalse \;t\;tc \;tcb\;overhang
+ \divide\;t\tw@ \;rtc\;t \;pns\;t \;dash \fi}
+
+% \end{macrocode}
+% Plots symbols at natural pattern length but shrinks pattern to fit between.
+% \begin{macrocode}
+\newcommand\;nscdashes{\advance\;pbs\;pl \divide\;pbs\;rc
+ \if;csym \;bpdashes \fi \;ccss \;pns\;t
+ \;dash \advance\;pbs-\;tc \;scp\;pl \divide\;scp\;pbs \;pns\;pbs
+ \@whilenum\;rtc>\z@\do{\;pdashes \;ptfalse \;t\;tc \;pns\;t \;dash
+ \;pns\;pbs}%
+ \if;csym \else \divide\;tc\tw@ \advance\;overhang\;tc \fi}
+
+% \end{macrocode}
+% If large symbol spaces, blank curve.
+% \begin{macrocode}
+\newcommand\;ccss{\ifnum\;pbs>\;tc\else \;bpdashes \fi}
+
+% \end{macrocode}
+% A blank or symbol plotting dash pattern
+% \begin{macrocode}
+\newcommand\;bpdashes{\let\;tucd\;pl \let\;ticd\;ricd \;tc\z@ \;t\z@}
+\newcommand\;ricd{1,0}
+
+% \end{macrocode}
+% Reads dash pattern plotting dashes and spaces up to next symbol space.
+% \begin{macrocode}
+\newcommand\;pdashes{\ifnum\;pns>\z@ \;td\z@ \;tcb\z@ \;ptfalse
+ \@for\;ci:=\;ticd \do{\advance\;td\;ci\;tucd \;t\;scp \divide\;t\tw@
+ \advance\;t\;td \divide\;t\;scp \advance\;t-\;tcb \;dash
+ \if;pt\;ptfalse\else\;pttrue\fi}%
+ \let\n;xt\;pdashes \else \let\n;xt\relax \fi \n;xt}
+
+% \end{macrocode}
+% Checks if dash or space occurs before or after curve, calculates fractions.
+% \begin{macrocode}
+\newcommand\;dash{\ifnum\;t=\z@
+ \if;csym \ifnum\;rtc>\z@ \if;pt\;point\;startline\fi \fi \fi
+ \else \advance\;tcb\;t \advance\;pns-\;t
+ \ifnum\;overhang<\z@ \advance\;overhang\;t
+ \;t \ifnum\;overhang<\z@ \z@ \else \;overhang \;overhang\;tcb \fi
+ \else \;overhang\;tcb \fi
+ \ifnum\;pns<\z@ \advance\;overhang\;pns \advance\;tcb\;pns
+ \advance\;t\;pns \;pns\z@ \fi \advance\;rtc-\;t
+ \ifnum\;rtc<\z@ \advance\;overhang\;rtc \advance\;t\;rtc\fi
+ \ifnum\;t>\z@ \if;pt\;point\;startline\fi
+ \let\n;xt\;points \;points \fi\fi}
+
+% \end{macrocode}
+% Plots a single dash or space depending on |\if;pt|.
+% \begin{macrocode}
+\newcommand\;points{\ifnum\;t<\;cnd \;tca\;t \else \;tca\;cnd \fi
+ \advance\;y\;tca\;dy \;ytd\;tca\;dx \advance\;x\;ytd \kern\;ytd
+ \if;pt\;point\;stopline\fi
+ \ifnum\;t<\;cnd \let\n;xt\relax \advance\;cnd-\;t
+ \else
+ \advance\;t-\;cnd \advance\;dx\;ddx \advance\;dy\;ddy \;cnd\;mcnd
+ \fi \n;xt}
+
+% \end{macrocode}
+% Make `;' a punctuation mark again.
+% \begin{macrocode}
+ \catcode`\;=12
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{\texttt{curvesls.sty}}
+%
+% This package file is a \LaTeXe\ compatible replacement for
+% \texttt{curvesls.sty}
+% from versions 1.42 and earlier. It may one day be removed.
+%
+% \begin{macrocode}
+%<*ls>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesPackage{curvesls}
+ [2000/08/22 Obsolete! Using option emtex in package curves.]
+\RequirePackage[emtex]{curves}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</ls>
+% \end{macrocode}
+%
+% \Finale
+%
+% \typeout{}
+% \typeout{Please uncomment the line containing
+% just \string\OnlyDescription\space }
+% \typeout{near the start of curves.dtx to prevent the curves.sty}
+% \typeout{and curvesls.sty listings printing out.}
+% \typeout{}
+%
+% \end{document}
+\endinput
+
+MODIFICATION HISTORY
+--------------------
+curves.sty 1.0 26 June 1991
+curves.sty 1.1 8 Jan 1992 large \diskpitchstretch and maximum integer=2^30 - 1.
+curvesls.sty 1.0 21 Mar 1993 draw lines using emTeX dvidriver \special's.
+1.1 23 April, 1993 corrected for large \curves and 2nd differences.
+1.14 29 April, 1993 Alignment of spaces improved in \@nscdashes, \overhang
+ normalized.
+1.15 1 May, 1993 Rounding errors in \nscdashes and \pdashes improved.
+1.16 8 May, 1993 Reduced .dvi size and dots corrected.
+1.2 23 May, 1993 Variable curve symbol introduced.
+1.21 8 June, 1993 \unitlength corrected in \bigcircle.
+1.22 15 June, 1993 \csb@x saves curve symbol, dash pattern selection rounded.
+1.23 18 June, 1993 extra \@killglue and curve smoothing, test for
+ bad point order tightened. 1st network release.
+ 2517 words of TeX main memory.
+1.30 9 July 1993 2nd network release.
+ Bugs Fixed:
+ Blank curve if \csdiameter too large;
+ Transfer of \@y and \@overhang from inner loop of \@drwarc;
+ Missing \pt@false in \@ncsdashes and \@pdashes;
+ Check for zero \@np in \@bezier.
+ Improvements (?):
+ New internal macros to save tokens;
+ Uses LaTeX error messages and warnings;
+ Checks \curvedashes signs;
+ Potential conflicts with other macros reduced with new \@y, \@tc;
+ Warns more readily and replaces possible inflexions with straight line;
+ Some internal variable names rationalized.
+ 2489 words of TeX main memory.
+1.32 14 June 1994 3rd network release tested with LaTeX 2e of February 1994.
+1.33 28 June 1994 4th network release tested with LaTeX 2e of 1 June 1994.
+ Redefines \bezier from June LaTeX 2e.
+ \@bezier renamed to \@Vbezier to avoid conflict with June LaTeX 2e.
+1.40 20 August 1995 5th network release tested with LaTeX 2e of 1 June 1995.
+ Bug Fixed: Dashed curves use straight segments to reduce rounding error.
+ Improvements:
+ \curvewarnfalse stops warning of straight line use between points;
+ ; catcoded to character to protect internal names;
+ New internal macros save tokens and increase speed;
+ 1772 nett extra words of TeX main memory (LaTeX 2e 1995/6/1 pl1).
+1.41 28 November 1996 \;points for wrong \;dy in dash.
+1.42 12 August 2000 6th Internet release
+ last tested and working with LaTeX 2.09.
+1.50 22 August 2000 6th Internet release tested with
+ LaTeX2e <1998/12/01> patch level 1.
+ Copyright licence now LPPL.
+ Improvements:
+ Curvesls.sty merged into curves.sty with options
+ for dvips, emtex, xdvi and WML \specials;
+ More documentation on scaling;
+ LaTeX 2e style warnings and errors;
+ Comments stripped from curves.sty;
+ Tested with color package;
+ All curves consist of short straight lines;
+ Fewer disks per curve by constant pitch on straight lines;
+ Greater accuracy and speed and less memory in use.
+ 2047 nett extra words of TeX main memory to load with no option
+ down to 1913 with WML option.
diff --git a/Master/texmf-dist/source/latex/curves/curves.ins b/Master/texmf-dist/source/latex/curves/curves.ins
new file mode 100644
index 00000000000..7a127665605
--- /dev/null
+++ b/Master/texmf-dist/source/latex/curves/curves.ins
@@ -0,0 +1,25 @@
+\input docstrip
+\keepsilent
+\preamble
+% This is file curves.ins
+%
+Copyright (C) 1991-2000 Ian Maclaine-cross
+This file may be distributed under the terms of the
+ LaTeX Project Public License.
+See file curves.dtx for details.
+Internet: i.maclaine-cross@unsw.edu.au
+\endpreamble
+
+\askforoverwritefalse
+
+\generate{\file{curves.sty}{\from{curves.dtx}{package}}
+ \file{curvesls.sty}{\from{curves.dtx}{ls}}
+\usepreamble
+\usepostamble\empty
+}
+
+\endbatchfile
+
+\usepreamble
+\usepostamble\empty
+