diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/curve2e/README | 10 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/curve2e/curve2e.pdf | bin | 370457 -> 567379 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/curve2e/manifest.txt | 27 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/curve2e/curve2e.dtx | 751 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/curve2e/curve2e.sty | 156 |
5 files changed, 621 insertions, 323 deletions
diff --git a/Master/texmf-dist/doc/latex/curve2e/README b/Master/texmf-dist/doc/latex/curve2e/README index ef6af1cf0ae..8230ad92e95 100644 --- a/Master/texmf-dist/doc/latex/curve2e/README +++ b/Master/texmf-dist/doc/latex/curve2e/README @@ -1,13 +1,13 @@ Curve2e.sty -version 1.41 -filedate 11 December 2012 +version 1.32 +filedate 06 June 2015 This file is an extension of the package pict2e.sty which extends the standard picture LaTeX environment according to what Leslie Lamport specified in the second edition of the LaTeX manual. -This further extension allows to draw lines and vectors with any non integer slope parameters, to draw dashed lined of any slope, to draw arcs and curved vectors, to draw curves where just the interpolating nodes are specified together with the slopes at the nodes. Some of these features, implemented in this package previous version, have been incorporated in the 2009 version of pict2e; therefore this package has provisions for -avoiding the original commands redefinition. +This further extension allows to draw lines and vectors with any non integer slope parameters, to draw dashed lined of any slope, to draw arcs and curved vectors, to draw curves where just the interpolating nodes are specified together with the slopes at the nodes. Some of these features, implemented in this package previous versions, have been incorporated in the 2011 version of pict2e; therefore this package avoids redefining +the original commands. -This version should be fully compatible with pict2e version 0.2x dated 2011/04/05. +This version id fully compatible with pict2e version 0.2x dated 2011/05/01. I you specify diff --git a/Master/texmf-dist/doc/latex/curve2e/curve2e.pdf b/Master/texmf-dist/doc/latex/curve2e/curve2e.pdf Binary files differindex 54c50b4e147..78ba5350c21 100644 --- a/Master/texmf-dist/doc/latex/curve2e/curve2e.pdf +++ b/Master/texmf-dist/doc/latex/curve2e/curve2e.pdf diff --git a/Master/texmf-dist/doc/latex/curve2e/manifest.txt b/Master/texmf-dist/doc/latex/curve2e/manifest.txt index 90e2f5f397a..7938ea3786c 100644 --- a/Master/texmf-dist/doc/latex/curve2e/manifest.txt +++ b/Master/texmf-dist/doc/latex/curve2e/manifest.txt @@ -1,9 +1,7 @@ The package bundle curve2e is composed of the following files - curve2e.dtx curve2e.pdf -curve2e.sty mainfest.txt README @@ -12,28 +10,19 @@ Maninfest.txt is this file. curve2e.dtx is the documented source file of package curve2e.sty; you get both curve2e.sty and curve2e.pdf by running pdflatex on curve2e.dtx. -README (or Readme or readme depending on the operating system) contains general -information - -This package is subjectt to the LPPL (LaTeX Project Public Licence( version 1.3 or successive: the full text of the license is contained in any full distribution of the TeX system; in any case you can find it onCTAN (Comprehensive TeX Archive Network). +README contains general information -The package has the LPPL status of author maintained. +The package has the lppl status of author maintained. Nevertheless this package is an extension to the standard LaTeX package pict2e -(2011), so that any modification to this file is first of all submitted to the -authors of pict2e, in case they wanted to incorporate part or all of its contents -in the official package they maintain. Therefore any change must be controlled -against the parent package pict2e so as to avoid redefining what has already been -incorporated in the official package. Their e-mails are - -Rolf Niepraschk, Rolf.Niepraschk@ptb.de -Hubert Gaesslein, HubertJG@open.mind.de -Josef Tkadlec, j.tkadlec@email.cz +(2011). Therefore any change must be controlled against the parent package +pict2e so as to avoid redefining what has already been incorporated in the +official package. If you prefer sending me your modifications, as long as I will maintain this -package, I will forward every (documented) suggestion or modification to the -authors of pict2e. +package, I will possibly include every (documented) suggestion or modification into this +package. Claudio Beccari -claudio.beccari@gmail.com
\ No newline at end of file +claudio.beccari@gmail.com diff --git a/Master/texmf-dist/source/latex/curve2e/curve2e.dtx b/Master/texmf-dist/source/latex/curve2e/curve2e.dtx index 599f0a2da38..3af8caafb3e 100644 --- a/Master/texmf-dist/source/latex/curve2e/curve2e.dtx +++ b/Master/texmf-dist/source/latex/curve2e/curve2e.dtx @@ -1,12 +1,13 @@ % \iffalse +% !TEX encoding = UTF-8 Unicode %<*internal> \begingroup \input docstrip.tex \keepsilent \preamble ______________________________________________________ - The curve2e package for LaTeX and XeLaTeX - Copyright (C) 2005-2012 Claudio Beccari + The curve2e package for LaTeX and XeLATeX + Copyright (C) 2010 Claudio Beccari All rights reserved License information appended @@ -14,7 +15,7 @@ \endpreamble \postamble -Copyright 2005-2012 Claudio Beccari +Copyright 2005-2015 Claudio Beccari Distributable under the LaTeX Project Public License, version 1.3c or higher (your choice). The latest version of @@ -37,7 +38,7 @@ and the derived files curve2e.sty and curve2e.pdf. % %% %% File `curve2e.dtx'. -%% Copyright (C) 2005--2011 Claudio Beccari all rights reserved. +%% Copyright (C) 2005--2015 Claudio Beccari all rights reserved. %% % What follows is the usual trick that is not typeset in the documentation % dvi file that is produced by LaTeX. It is used to define the date, the version @@ -50,26 +51,28 @@ and the derived files curve2e.sty and curve2e.pdf. % % \iffalse %<*package> -%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\NeedsTeXFormat{LaTeX2e}[2014/05/01] %</package> %<*driver> \ProvidesFile{curve2e.dtx}% %</driver> %<+package>\ProvidesPackage{curve2e}% %<*package> - [2012/12/11 v.1.41 Extension package for pict2e] + [2015/06/06 v.1.42 Extension package for pict2e] %</package> %<*driver> -\documentclass{ltxdoc} +\documentclass{ltxdoc}\errorcontextlines=9 \hfuzz 10pt -\usepackage{multicol} +\usepackage{multicol,amsmath} \usepackage[utf8]{inputenc} +\usepackage{lmodern,textcomp} +\usepackage{mflogo} \usepackage{curve2e} \GetFileInfo{curve2e.dtx} -\title{The extension package \textsf{curve2e}\thanks{Version number -\fileversion; last revised \filedate.}} +\title{The extension package \textsf{curve2e}} \author{Claudio Beccari} -\date{} +\date{Version number \fileversion; last revised \filedate.} +\providecommand*\diff{\mathop{}\!\mathrm{d}} \begin{document} \maketitle \begin{multicols}{2} @@ -80,7 +83,7 @@ and the derived files curve2e.sty and curve2e.pdf. %</driver> % \fi % -% \CheckSum{2264} +% \CheckSum{2484} % \begin{abstract} % This file documents the |curve2e| extension package to the recent % implementation of the |pict2e| bundle that has been described by Lamport @@ -90,8 +93,8 @@ and the derived files curve2e.sty and curve2e.pdf. % |pict2e| has been released that incorporates some of the commands defined in % this package; apparently there are no conflicts, but only the advanced features % of |curve2e| remain available for extending the above package. Moreover -% the |xetex.def| driver was introduced so that certian commands previously -% defined in this extension not only become unnnecessary, but also would produce +% the |xetex.def| driver was introduced so that certain commands previously +% defined in this extension not only become unnecessary, but also would produce % errors when the program is used under XeLaTeX. Therefore these commands were % either eliminated or corrected. % @@ -154,10 +157,9 @@ and the derived files curve2e.sty and curve2e.pdf. % \begin{enumerate} % \item commands for setting the line terminations are introduced; the user can % chose between square or rounded caps; the default is set to rounded caps (now -% available also with |pict2e|); the 2011 upgrade of |pict2e| made these commands -% superfluous and redefined the internal special commands for the drivers, so that -% I deicided to completely eliminate these definitions and relay on those produced -% by |pict2e|; +% available also with |pict2e|); +% \item commands for specifying the way two lines or curves join to one nanother; +% ^^A % \item the |\line| macro is redefined so as to allow integer and fractional % direction coefficients, but maintaining the same syntax as in the original % \texttt{picture} environment (now available also with |pict2e|); @@ -183,15 +185,17 @@ and the derived files curve2e.sty and curve2e.pdf. % pointing to the second point; % \item a new macro |\polyline| for drawing polygonal lines is defined that % accepts from two vertices up to an arbitrary (reasonably limited) number of -% them (available now also in |pict2e|); +% them (available now also in |pict2e|); here if is redefined so as to allow +% an optional specification of the way segments fo the polyline are join to +% one another.; % \item a new macro |\Arc| is defined in order to draw an arc with arbitrary % radius and arbitrary angle amplitude; this amplitude is specified in % sexagesimal degrees, not in radians; the same functionality is now achieved with -% the |\arc| macro of |pict2e|, which provides also the star version |\arc*| that +% the |\arc| macro of |pict2e|, which provides also the strar version |\arc*| that % fills up the interior of the generated circular arc. It must be noticed that % the syntax is slighltly different, so that it's reasonable that both commands, -% in spite of producing identical arcs, might be more comfortable with this or that -% syntax. +% in spite of producing identical arcs, might be more comfortable with this or +% that syntax. % \item two new macros are defined in order to draw circular arcs with one % arrow at one or both ends; % \item a new macro |\Curve| is defined so as to draw arbitrary curved lines @@ -200,20 +204,25 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{enumerate} % % In order to make the necessary calculations many macros have been defined so -% as to use complex number arithmetics to manipulate point coordinates, directions, -% rotations and the like. The trigonometric functions have also been defined in -% a way that the author believes to be more efficient than that implied by the -% \texttt{trig} package; in any case the macro names are sufficiently -% different to accommodate both definitions in the same \LaTeX\ run. +% as to use complex number arithmetics to manipulate point coordinates, +% directions (directional versors), rotations and the like. The trigonometric +% functions have also been defined in a way that the author believes to be +% more efficient than that implied by the \texttt{trig} package; in any case +% the macro names are sufficiently different to accommodate both definitions +% in the same \LaTeX\ run. % % Many aspects of this extension could be fine tuned for better performance; % many new commands could be defined in order to further extend this extension. % If the new service macros are accepted by other \TeX\ and \LaTeX\ programmers, % this beta version could become the start for a real extension of the -% \texttt{pict2e} package or even become a part of it. +% \texttt{pict2e} package or even become a part of it. Actually some macros +% have already been included in the \texttt{pict2e} package. Actually the +% \verb|\Curve| algorithm might be redefined so as to use the macros introduced +% in the \texttt{hobby} package, that implements for the typesetting engines +% the same functionalities that John Hobby wrote for \MF\ and \MP\ programs. % % For this reason I suppose that every enhancement should be submitted to -% Gäßlein and Niepraschk who are the prime maintainers of \texttt{pict2e}; +% Gäßlein and Niepraschk who are the prime maintainers of \texttt{pict2e}; % they only can decide whether or not to incorporate new macros in their package. % % \section{Summary of modifications and new commands} @@ -226,13 +235,25 @@ and the derived files curve2e.sty and curve2e.pdf. % either \LaTeX\ or PostScript styled, because it is assumed that if you use this % package you are not interested in using the original \LaTeX\ commands. See the % |pict2e| documentation in order to use the correct options |pict2e| can receive. +% \item The user is offered new commands in order to control the line terminators +% and the line joins; specifically: +% \begin{itemize} +% \item |\roundcap|: the line is terminated with a semicircle; +% \item |\squarecap|: the line is terminated with a half square; +% \item |\roundjoin|: two lines are joined with a rounded join; +% \item |\beveljoin|: two lines are joined with a bevel join; +% \item |\miterjoin|: two lines are joined with a miter join. +% \end{itemize} +% All the above commands should respect the intended range; but since they act at +% the PostScript or PDF level, not at \TeX\ level, it might be necessary to issue +% the necessary command in order to restore the previous terminator or join. % \item The commands |\linethickness|, |\thicklines|, |\thinlines| together with % |\defaultlinethickness| always redefine the internal |\@wholewidth| and -% |\@halfwidth| -% so that the former always refer to a full width and the latter to a half of it in this -% way: if you issue the command |\defaultlinewidth{2pt}| all thin lines will be -% drawn with a thickeness of 1\,pt while if a drawing command directly refers to the -% internal value |\@wholewidth|, its line will be drawn with a thickness of 2\,pt. +% |\@halfwidth| so that the latter always refer to a full width and to a half of +% it in this way: if you issue the command |\defaultlinewidth{2pt}| all thin +% lines will be drawn with a thickeness of 1\,pt while if a drawing command +% directly refers to the internal value |\@wholewidth|, its line will be drawn +% with a thickness of 2\,pt. % If one issues the declaration |\thinlines| all lines will be drawn with a 1\,pt % width, but if a command refers to the internal value |\@halfwidth| the line will % be drawn with a thickness of 0.5\,pt. The command |\linethickness| redefines the @@ -242,25 +263,26 @@ and the derived files curve2e.sty and curve2e.pdf. % |thicklines| are declarations that do not take arguments; on the opposite the % other two commands follow the standard syntax: % \begin{flushleft} -% |\linethickness|\marg{dimension value}\\ -% |\defaultlinewidth|\marg{dimension value} +% |\linethickness|\marg{dimensioned value}\\ +% |\defaultlinewidth|\marg{dimensioned value} % \end{flushleft} -% where \meta{dimension value} means a length specification complete of its units -% or a dimensional expression. -% \item Straight lines and vectors are redefined in such a way that fractional slope -% coefficients may be specified; the zero length line does not produce errors and is -% ignored; the zero length vectors draw only the arrow tips. +% where \meta{dimensioned value} means a length specification complete of its +% units or a dimensional expression. +% \item Straight lines and vectors are redefined in such a way that fractional +% slope coefficients may be specified; the zero length line does not produce +% errors and is ignored; the zero length vectors draw only the arrow tips. % \item New line and vector macros are defined that avoid the necessity of -% specifying the horizontal component |\put(3,4){\LIne(25,15)}| specifies a segment -% that starts at point $(3,4)$ and goes to point $(3+25,4+15)$; the command -% |\segment(3,4)(28,19)| achieves the same result without the need of the using -% command |\put|. +% specifying the horizontal component |\put(3,4){\LIne(25,15)}| specifies a +% segment that starts at point $(3,4)$ and goes to point $(3+25,4+15)$; the +% command |\segment(3,4)(28,19)| achieves the same result without the need of +% the using command |\put|. % The same applies to the vector commands |\Vector| and |\VECTOR|. Experience has % shown that the commands intended to joint two specified coordinates are % particularly useful. -% \item The |\polyline| command has been introduced: it accepts an unlimited list of -% point coordinates enclosed within round parentheses; the command draws a sequence -% of connected segments that joins in sequence the specified points; the syntax is: +% \item The |\polyline| command has been introduced: it accepts an unlimited +% list of point coordinates enclosed within round parentheses; the command +% draws a sequence of connected segments that joins in sequence the specified +% points; the syntax is: % \begin{flushleft} % \cs{polyline[}\marg{optional join style}\texttt{](}\meta{$P_1$}\texttt{)(}% % \meta{$P_2$}\texttt{)...(}\meta{$P_n$}\texttt{)} @@ -290,22 +312,23 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{figure} % % Although you can draw polygons with |\polyline|, as it was done in -% figure~\ref{fig:polyline}, do not confuse this command with the command |\polygon| -% defined in |pict2e| 2009; the latter automatically joins the last specified -% coordinate to the first one, therefore closing the path. |pict2e| defines also the -% starred command that fills up the inside of the generated polygon. +% figure~\ref{fig:polyline}, do not confuse this command with the command +% |\polygon| defined in |pict2e| 2009; the latter automatically joins the +% last specified coordinate to the first one with a straight line, therefore +% closing the path. |pict2e| defines also the starred command that fills up +% the inside of the generated polygon. % \item The new command % \begin{flushleft} % |\Dline(|\textit{first point}|)(|\textit{second point}|)(|\textit{dash length}|)| % \end{flushleft} -% draws a dashed line containing as many dashes as possible, long as specified, and -% separated by a gap exactly the same size; actually, in order to make an even -% gap-dash sequence, the desired dash length is used to do some computations in -% order to find a suitable length, close to the one specified, such that the +% draws a dashed line containing as many dashes as possible, long as specified, +% and separated by a gap exactly the same size; actually, in order to make an +% even gap-dash sequence, the desired dash length is used to do some computations +% in order to find a suitable length, close to the one specified, such that the % distance of the end points is evenly divided in equally sized dashes and gaps. -% The end points may be anywhere in -% the drawing area, without any constraint on the slope of the joining segment. The -% desired dash length is specified as a fractional multiple of |\unitlength|; see +% The end points may be anywhere in the drawing area, without any constraint on +% the slope of the joining segment. The desired dash length is specified as a +% fractional multiple of |\unitlength|; see % figure~\ref{fig:dashline}. % \begin{figure}[!ht] % \begin{minipage}{.48\textwidth} @@ -339,30 +362,32 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{minipage} % \caption{Dashed lines and graph grid}\label{fig:dashline} % \end{figure} -% \item |\GraphGrid| is a command that draws a red grid over the drawing area with -% lines separated |10\unitlength|s; it is described only with a comma separated -% couple of numbers, representing the base and the height of the grid, see -% figure~\ref{fig;dashline}; it's better to specify multiples of ten and the grid -% can be placed anywhere in the drawing plane by means of |\put|, whose coordinates -% are multiples of 10; nevertheless the grid line distance is rounded to the -% nearest multiple of 10, while the point coordinates specified to |\put| are not -% rounded at all; therefore some care should be used to place the working grid in -% the drawing plane. This grid is intended as an aid in drawing; even if you sketch -% your drawing on millimeter paper, the drawing grid turns out to be very useful; -% one must only delete or comment out the command when the drawing is finished. -% \item New trigonometric function macros have been implemented; possibly they are -% not better than the corresponding macros of the |trig| package, but they are -% supposed to be more accurate at least they were intended to be so. The other -% difference is that angles are specified in sexagesimal degrees ($360^\circ$ to one -% revolution), so that reduction to the fundamental quadrant is supposed to be more -% accurate; the tangent of odd multiples of $90^\circ$ are approximated with a -% ``\TeX\ infinity'', that is the signed value 16383.99999. This will possibly -% produce computational errors in the subsequent calculations, but at least it does -% not stop the tangent computation. In order to avoid overflows or underflows in the -% computation of small angles (reduced to the first quadrant), the sine and the -% tangent of angles smaller than $1^\circ$ are approximated by the first term of the -% McLaurin series, while for the cosine the approximation is given by the first two -% terms of the McLaurin series. In both cases theoretical errors are smaller +% \item |\GraphGrid| is a command that draws a red grid over the drawing area +% with lines separated |10\unitlength|s; it is described only with a comma +% separated couple of numbers, representing the base and the height of the grid, +% see figure~\ref{fig:dashline}; it's better to specify multiples of ten and +% the grid can be placed anywhere in the drawing plane by means of |\put|, +% whose coordinates are multiples of 10; nevertheless the grid line distance is +% rounded to the nearest multiple of 10, while the point coordinates specified +% to |\put| are not rounded at all; therefore some care should be used to place +% the working grid in the drawing plane. This grid is intended as an aid in +% drawing; even if you sketch your drawing on millimetre paper, the drawing grid +% turns out to be very useful; one must only delete or comment out the command +% when the drawing is finished. +% \item New trigonometric function macros have been implemented; possibly they +% are not better than the corresponding macros of the |trig| package, but they +% are supposed to be more accurate at least they were intended to be so. The +% other difference is that angles are specified in sexagesimal degrees +% ($360^\circ$ to one revolution), so that reduction to the fundamental quadrant +% is supposed to be more accurate; the tangent of odd multiples of $90^\circ$ +% are approximated with a ``\TeX\ infinity'', that is the signed value +% 16383.99999. This will possibly produce computational errors in the +% subsequent calculations, but at least it does not stop the tangent +% computation. In order to avoid overflows or underflows in the computation +% of small angles (reduced to the first quadrant), the sine and the tangent +% of angles smaller than $1^\circ$ are approximated by the first term of the +% McLaurin series, while for the cosine the approximation is given by the first +% two terms of the McLaurin series. In both cases theoretical errors are smaller % than what \TeX\ arithmetics can handle. % % These trigonometric functions are used within the complex number macros; but if @@ -417,41 +442,47 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{figure} % \item A multitude of commands have been defined in order to manage complex % numbers; actually complex numbers are represented as a comma separated pair of -% fractional numbers. They are used to point to specific points in the drawing +% fractional numbers. They are used to address to specific points in the drawing % plane, but also as operators so as to scale and rotate other objects. In the % following \meta{vector} means a comma separated pair of fractional numbers, -% possibly stored in macros; \meta{argument} means a brace delimiteded numeric -% value, possibly a macro; \textit{macro} is a valid macro name, a backslash -% followed by letters, or anything else that can receive a definition. +% \meta{vector macro} means a macro the contains a comma separated pair of +% fractional numbers; \meta{angle macro} means a macro that contains the angle +% of a vector in sexagesimal degrees; \meta{argument} means a brace delimited +% numeric value, possibly a macro; \textit{macro} is a valid macro name, that +% is a backslash followed by letters, or anything else that can receive a +% definition. A `direction' of a vector is its versor; the angle of a vector +% is the angle between the vector and the positive $x$ axis, generally directly +% used in the Euler formula $ \vec{v} = Me^{\mathrm{j}\varphi}$. % % {\footnotesize\begin{itemize} -% \item |\MakeVectorFrom|\meta{two arguments}|to|\meta{vector} -% \item |\CopyVect|\meta{first vector}|to|\meta{second vector} +% \item |\MakeVectorFrom|\meta{two arguments}|to|\meta{vector macro} +% \item |\CopyVect|\meta{first vector}|to|\meta{second vector macro} % \item |\ModOfVect|\meta{vector}|to|\meta{macro} -% \item |\DirOfvect|\meta{vector}|to|\meta{macro} -% \item |\DmodAndDirOfVect|\meta{vector}|to|\meta{first macro}|and|\meta{second macro} -% \item |\DistanceAndDirOfVect|\meta{first vector}|minus|\meta{second vector}|to|\meta{first macro}|and|\meta{second macro} +% \item |\DirOfvect|\meta{vector}|to|\meta{versor macro} +% \item |\ModAndDirOfVect|\meta{vector}|to|\meta{1st macro}|and|\meta{2nd macro} +% \item |\DistanceAndDirOfVect|\meta{first vector}|minus|\meta{second vector}|to|\meta{1st macro}|and|\meta{2nd macro} % \item |\XpartOfVect|\meta{vector}|to|\meta{macro} % \item |\YpartOfVect|\meta{vector}|to|\meta{macro} -% \item |\DirFromAngle|\meta{angle}|to|\meta{macro} -% \item |\ScaleVect|\meta{vector}|by|\meta{scaling factor}|to|\meta{macro} -% \item |\ConjVect|\meta{vector}|to|\meta{conjugate vector} -% \item |\SubVect|\meta{first vector}|from|\meta{second vector}|to|\meta{vector} -% \item |\AddVect|\meta{first vector}|and|\meta{second vector}|to|\meta{vector} -% \item |\MultVect|\meta{first vector}|by|\meta{second vector}|to|\meta{vector} -% \item |\MultVect|\meta{first vector}|by*|\meta{second vector}|to|\meta{vector} -% \item |\DivVect|\meta{first vector}|by|\meta{second vector}|to|\meta{vector} +% \item |\DirFromAngle|\meta{angle}|to|\meta{versor macro} +% \item |\ArgOfVect|\meta{vector}|to|\meta{angle macro} +% \item |\ScaleVect|\meta{vector}|by|\meta{scaling factor}|to|\meta{vector macro} +% \item |\ConjVect|\meta{vector}|to|\meta{conjugate vector macro} +% \item |\SubVect|\meta{first vector}|from|\meta{second vector}|to|\meta{vector macro} +% \item |\AddVect|\meta{first vector}|and|\meta{second vector}|to|\meta{vector macro} +% \item |\MultVect|\meta{first vector}|by|\meta{second vector}|to|\meta{vector macro} +% \item |\MultVect|\meta{first vector}|by*|\meta{second vector}|to|\meta{vector macro} +% \item |\DivVect|\meta{first vector}|by|\meta{second vector}|to|\meta{vector macro} % \end{itemize}} % -% \item General curves can be drawn with the |pict2e| macro |\curve| but it requires -% the specification of the Bézier third order spline control points; sometimes it's -% better to be very specific with the control points and there is no other means to -% do a decent graph; sometimes the curves to be drawn are not so tricky and a -% general set of macros can be defined so as to compute the control points, while -% letting the user specify only the nodes through which the curve must pass, and the -% tangent direction of the curve in such nodes. This macro is |\Curve| and must be -% followed by an ``unlimited" sequence of node-direction coordinates as a quadruple -% defined as +% \item General curves can be drawn with the |pict2e| macro |\curve| but it +% requires the specification of the Bézier third order spline control points; +% sometimes it's better to be very specific with the control points and there +% is no other means to do a decent graph; sometimes the curves to be drawn +% are not so tricky and a general set of macros can be defined so as to compute +% the control points, while letting the user specify only the nodes through +% which the curve must pass, and the tangent direction of the curve in such +% nodes. This macro is |\Curve| and must be followed by an ``unlimited'' +% sequence of node-direction coordinates as a quadruple defined as %\[ % \texttt{(}\meta{node coordinates}\texttt{)<}\meta{direction vector}\texttt{>} %\] @@ -460,15 +491,14 @@ and the derived files curve2e.sty and curve2e.pdf. %\[ % \texttt{...(...)<...>[}\meta{new direction vector}\texttt{](...)<...>...} %\] -% The |\Curve| macro does not (still) have facilities for cycling the path, that is -% to close the path from the last specified node-direction to the first specified -% node-direction. -% The tangent direction need not be specified with a unit vector, although only its -% direction is relevant; the scaling of the specified direction vector to a unit -% vector is performed by the macro itself. Therefore one cannot specify the fine -% tuning of the curve convexity as it can be done with other programs, as for -% example with METAFONT or the |pgf/tikz| package and environment. -% See figure~\ref{fig:curve} for an example. +% The |\Curve| macro does not (still) have facilities for cycling the path, +% that is to close the path from the last specified node-direction to the first +% specified node-direction. The tangent direction need not be specified with +% a unit vector, although only its direction is relevant; the scaling of the +% specified direction vector to a unit vector is performed by the macro itself. +% Therefore one cannot specify the fine tuning of the curve convexity as it +% can be done with other programs, as for example with \MF\ or the |pgf/tikz| +% package and environment. See figure~\ref{fig:curve} for an example. % \end{enumerate} % \begin{figure} % \begin{minipage}{.48\textwidth} @@ -483,11 +513,11 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{verbatim} % \end{minipage} % \hfill -% \begin{minipage}{.48\textwidth}\raggedleft -% \unitlength=8mm +% \begin{minipage}{.48\textwidth}\raggedleft\relax +% \unitlength=8mm\relax % \begin{picture}(5,5) -% \put(0,0){\framebox(5,5){}}\thicklines\roundcap -% \Curve(2.5,0)<1,1>(5,3.5)<0,1>(2.5,3.5)<-0.5,-1.2>[-0.5,1.2](0,3.5)<0,-1>(2.5,0)<1,-1> +% \put(0,0.5){\put(0,0){\framebox(5,5){}}\thicklines\roundcap +% \Curve(2.5,0)<1,1>(5,3.5)<0,1>(2.5,3.5)<-0.5,-1.2>[-0.5,1.2](0,3.5)<0,-1>(2.5,0)<1,-1>} % \end{picture} % \end{minipage} % \caption{A heart shaped curve with cusps drawn with \texttt{\string\Curve}} @@ -504,21 +534,22 @@ and the derived files curve2e.sty and curve2e.pdf. % package is a simple attempt to follow the initial path while extending the drawing % facilities; but Till Tantau's |pgf| package has gone much farther. % -% \section{Notice} +% \section{Remark} % There are other packages in the \textsc{ctan} archives that deal with tracing -% curves of various kinds. |PSTricks| and |tikz/pgf| are the most powerful ones. But -% there are also the package |curves| that is intended to draw almost anything by -% using little dots or other symbols partially superimposed to one another. It used -% only quadratic Bézier curves and the curve tracing is eased by specifying only the -% curve nodes, without specifying the control nodes; with a suitable option to the -% package call it is possible to reduce the memory usage by using short straight -% segments drawn with the PostScript facilities offered by the |dvips| driver. +% curves of various kinds. |PSTricks| and |tikz/pgf| are the most powerful ones. +% But there are also the package |curves| that is intended to draw almost +% anything by using little dots or other symbols partially superimposed to one +% another. It used only quadratic Bézier curves and the curve tracing is eased +% by specifying only the curve nodes, without specifying the control nodes; +% with a suitable option to the package call it is possible to reduce the +% memory usage by using short straight segments drawn with the PostScript +% facilities offered by the |dvips| driver. % % Another package |ebezier| performs about the same as |curve2e| but draws its % Bézier curves by using little dots partially superimposed to one another. The -% documentation is quite interesting but since it explains very clearly what exactly -% are the Bézier splines, it appears that |ebezier| should be used only for dvi -% output without recourse to PostScript machinery. +% documentation is quite interesting but since it explains very clearly what +% exactly are the Bézier splines, it appears that |ebezier| should be used only +% for dvi output without recourse to PostScript machinery. % % \section{Acknowledgements} % I wish to express my deepest thanks to Michel Goosens who spotted some errors @@ -527,18 +558,18 @@ and the derived files curve2e.sty and curve2e.pdf. % Josef Tkadlec and the author collaborated extensively in order to make a better % real long division so as to get the fractional part and to avoid as much as % possible any numeric overflow; many Josef's ideas are incorporated in the macro -% that is implemented in this package, although the macro used by Josef is slightly -% different from this one. Both versions aim at a better accuracy and at widening -% the operand ranges. Some of the work we did together was incorporated in |pict2e| 2009. +% that is implemented in this package, although the macro used by Josef is +% slightly different from this one. Both versions aim at a better accuracy and +% at widening the operand ranges. % % Daniele Degiorgi spotted a fault in the kernel definition of |\linethickness| % that heavily influenced also |curve2e|; see below. % -% Thanks also to Jin-Hwan Cho and Juho Lee who suggested a small but crucial modification -% in order to have \texttt{curve2e} work smoothly also with XeTeX (XeLaTeX). -% Actually if version 0.2x or later, dated 2009/08/05 or later, of |pict2e| is being used, -% such modification is not necessary, but it's true that it becomes imperative if older -% versions are used. +% Thanks also to Jin-Hwan Cho and Juho Lee who suggested a small but crucial +% modification in order to have \texttt{curve2e} work smoothly also with XeTeX +% (XeLaTeX). Actually if version 0.2x or later, dated 2009/08/05 or later, of +% |pict2e| is being used, such modification is not necessary, but it's true +% that it becomes imperative if older versions are used. % % \StopEventually{% % \begin{thebibliography}{9} @@ -556,13 +587,12 @@ and the derived files curve2e.sty and curve2e.pdf. % make sure that a sufficiently recent version is used. % \begin{macrocode} \RequirePackage{color} -\RequirePackageWithOptions{pict2e}[2011/04/01] +\RequirePackageWithOptions{pict2e}[2014/01/01] % \end{macrocode} % -% The next macros are just for debugging. With the \texttt{trace} package it +% The next macros are just for debugging. With the \texttt{tracing} package it % would probably be better to define other macros, but this is not for the -% developers, not the users. - +% users, but for the developers. % \begin{macrocode} \def\TRON{\tracingcommands\tw@ \tracingmacros\tw@}% \def\TROF{\tracingcommands\z@ \tracingmacros\z@}% @@ -590,9 +620,9 @@ and the derived files curve2e.sty and curve2e.pdf. % default whole width of thick lines is 0,8pt, but this is specified in the % kernel of \LaTeX\ and\slash or in \texttt{pict2e}. On the opposite it is % necessary to redefine |\linethickness| because the \LaTeX\ kernel global -% definition does not hide the space after the closed brace when you enter something -% such as |\linethickness{1mm}| followed by a space or a new line.\footnote{Thanks -% to Daniele Degiorgi (\texttt{degiorgi@inf.ethz.ch}).} +% definition does not hide the space after the closed brace when you enter +% something such as |\linethickness{1mm}| followed by a space or a new line. +%\footnote{Thanks to Daniele Degiorgi (\texttt{degiorgi@inf.ethz.ch}).} % \begin{macrocode} \gdef\linethickness#1{\@wholewidth#1\@halfwidth.5\@wholewidth\ignorespaces}% \newcommand\defaultlinethickness[1]{\defaultlinewidth=#1\relax @@ -612,15 +642,15 @@ and the derived files curve2e.sty and curve2e.pdf. % coordinate point. The two arguments define the horizontal and the % vertical component respectively. % \begin{macrocode} -\def\LIne(#1,#2){\pIIe@moveto\z@\z@ - \pIIe@lineto{#1\unitlength}{#2\unitlength}\pIIe@strokeGraph}% +\def\LIne(#1,#2){\moveto(0,0) + \pIIe@lineto{#1\unitlength}{#2\unitlength}\strokepath}% % \end{macrocode} % % A similar macro |\segment| operates between two explicit points with absolute % coordinates, instead of relative to the position specified by a |\put| % command; it resorts to the |\polyline| macro that is to be defined in a while. -% The |\@killglue|command might be unnecessary, but it does not harm; it eliminates -% any explicit or implicit spacing that might precede this command. +% The |\@killglue| command might be unnecessary, but it does not harm; it +% eliminates any explicit or implicit spacing that might precede this command. % \begin{macrocode} \def\segment(#1)(#2){\@killglue\polyline(#1)(#2)}% % \end{macrocode} @@ -644,7 +674,7 @@ and the derived files curve2e.sty and curve2e.pdf. % \end{macrocode} % but as soon as it is verified that the line length is not negative, things % change remarkably; in facts the machinery for complex numbers is invoked. -% This makes the code muche simpler, not necessarily more efficient; nevertheless +% This makes the code much simpler, not necessarily more efficient; nevertheless % |\DirOfVect| takes the only macro argument (that actually contains a comma % separated pair of fractional numbers) and copies it to |\Dir@line| (an % arbitrarily named control sequence) after re-normalizing to unit magnitude; @@ -667,7 +697,7 @@ and the derived files curve2e.sty and curve2e.pdf. \@linelen=\sc@lelen\@linelen \fi % \end{macrocode} -% Of course, it the line is vertical this division must not take place. +% Of course, if the line is vertical this division must not take place. % Finally the \texttt{moveto}, \texttt{lineto} and \texttt{stroke} language % keywords are invoked by means of the internal \texttt{pict2e} commands in % order to draw the line. Notice that even vertical lines are drawn with the @@ -677,31 +707,32 @@ and the derived files curve2e.sty and curve2e.pdf. % any when lines are drawn by the driver that drives the output to a visible % document form, not by \TeX\ the program. % \begin{macrocode} - \pIIe@moveto\z@\z@ + \moveto(0,0) \pIIe@lineto{\d@mX\@linelen}{\d@mY\@linelen}% - \pIIe@strokeGraph + \strokepath \fi \endgroup\ignorespaces}% % \end{macrocode} -% The new definition of the command |\line|, besides tha ease with which is +% The new definition of the command |\line|, besides the ease with which is % readable, does not do different things from the definition of |pict2e| 2009, but -% it did preform in a better way whith the 2004 version that was limited to integer -% direction coefficients up to 999 in magnitude. -% -% Another usefull line-type macro creates a dashed line between two given points -% with a dash length that must be specified; actually the specified dash length is a -% desired dash length; the actual length is computed by integer division between -% the distance of the given points and the desired dash length; this integer is -% tested in order to see if it's odd; if it's not, it is increased by one. Then the -% actual dash length is obtained by dividing the above distance by this odd number. +% it did preform in a better way whith the 2004 version that was limited to +% integer direction coefficients up to 999 in magnitude. +% +% Another useful line-type macro creates a dashed line between two given points +% with a dash length that must be specified; actually the specified dash length +% is a desired dash length; the actual length is computed by integer division +% between the distance of the given points and the desired dash length; this +% integer is tested in order to see if it's odd; if it's not, it is increased by +% one. Then the actual dash length is obtained by dividing the above distance by +% this odd number. % Another vector is created from $P_1-P_0$ by dividing it by the magic odd number; % then it is multiplied by two in order to have the increment from one dash to the -% next, and finally the number of patterns is obtained by integer dividing the magic -% odd number by 2 and increasing it by 1. A simple |\multiput| completes the job, -% but in order to use the various vectors and numbers within a group and to throw -% the result outside the group while restoring all the intermediate counters and -% registers, a service macro is created with an expanded definition and then this -% service macro is executed. +% next, and finally the number of patterns is obtained by integer dividing the +% magic odd number by 2 and increasing it by 1. A simple |\multiput| completes the +% job, but in order to use the various vectors and numbers within a group and to +% throw the result outside the group while restoring all the intermediate counters +% and registers, a service macro is created with an expanded definition and then +% this service macro is executed. % \begin{macrocode} \ifx\Dline\undefined \def\Dline(#1,#2)(#3,#4)#5{% @@ -712,7 +743,7 @@ and the derived files curve2e.sty and curve2e.pdf. \SubVect\V@ttA from\V@ttB to\V@ttC \ModOfVect\V@ttC to\DlineMod \DividE\DlineMod\p@ by#5\p@ to\NumD - \NumA\expandafter\Integer\NumD.?? + \NumA\expandafter\Integer\NumD?? \ifodd\NumA\else\advance\NumA\@ne\fi \NumB=\NumA \divide\NumB\tw@ \DividE\DlineMod\p@ by\NumA\p@ to\D@shMod @@ -817,7 +848,7 @@ and the derived files curve2e.sty and curve2e.pdf. \pIIe@concat\@xdim\@ydim{-\@ydim}\@xdim{\@xnum\@linelen}{\@ynum\@linelen}% \@linelen\z@ \pIIe@vector - \pIIe@fillGraph + \fillpath % \end{macrocode} % Now we can restore the stem length that must be shortened by the dimension of % the arrow; examining the documentation of \texttt{pict2e} we discover that @@ -832,9 +863,9 @@ and the derived files curve2e.sty and curve2e.pdf. \@tdA=\pIIe@FAL\@tdA \advance\@linelen-\@tdA \ifdim\@linelen>\z@ - \pIIe@moveto\z@\z@ + \moveto(0,0) \pIIe@lineto{\@xnum\@linelen}{\@ynum\@linelen}% - \pIIe@strokeGraph\fi + \strokepath\fi \endgroup} % \end{macrocode} % @@ -842,8 +873,8 @@ and the derived files curve2e.sty and curve2e.pdf. % or the $l_x$ length component; the way the new |\vector| macro works does not % actually require this specification, because \TeX\ can compute the vector % length, provided the two direction components are exactly the horizontal and -% vertical vector components. If the horizontal component is zero, the actual length -% must be specified as the vertical component. +% vertical vector components. If the horizontal component is zero, the actual +% length% must be specified as the vertical component. % \begin{macrocode} \def\Vector(#1,#2){% \ifdim#1\p@=\z@\vector(#1,#2){#2} @@ -892,7 +923,7 @@ and the derived files curve2e.sty and curve2e.pdf. % macros.}\label{fig:vectors} % \end{figure} % -% \subsubsection{Polygonal lines} +% \subsubsection{Polylines} % We now define the polygonal line macro; its syntax is very simple % \begin{flushleft} % \cs{polygonal}\texttt{(}$P_0$\texttt{)(}$P_1$\texttt{)(}$P_2$)% @@ -916,20 +947,22 @@ and the derived files curve2e.sty and curve2e.pdf. % not necessarily is put in position through a |\put| command that provides to % eliminate any spurious spaces preceding this command. % -% Remember: |\polyline| has been incorporated into |pict2e| 2009, but we redefine it so as to allow an optional argument to allow the line join specification. +% Remember: |\polyline| has been incorporated into |pict2e| 2009, but we +% redefine it so as to allow an optional argument to allow the line join +% specification. % -% In order to allow a specification for the joints of the various segements of +% In order to allow a specification for the joints of the various segments of % a polygonal line it is necessary to allow for an optional parameter; the default % join is the bevel join. % \begin{macrocode} -\providecommand*\polyline[1][\beveljoin]{\p@lylin@[#1]} +\renewcommand*\polyline[1][\beveljoin]{\p@lylin@[#1]} \def\p@lylin@[#1](#2){\@killglue#1\GetCoord(#2)\d@mX\d@mY \pIIe@moveto{\d@mX\unitlength}{\d@mY\unitlength}% \@ifnextchar\lp@r{\p@lyline}{% \PackageWarning{curve2e}% - {Polygonal lines require at least two vertices!\MessageBreak - Control your polygonal line specification\MessageBreak}% + {Polylines require at least two vertices!\MessageBreak + Control your polyline specification\MessageBreak}% \ignorespaces}} % \end{macrocode} @@ -940,7 +973,7 @@ and the derived files curve2e.sty and curve2e.pdf. % \begin{macrocode} \def\p@lyline(#1){\GetCoord(#1)\d@mX\d@mY \pIIe@lineto{\d@mX\unitlength}{\d@mY\unitlength}% - \@ifnextchar\lp@r{\p@lyline}{\pIIe@strokeGraph\ignorespaces}} + \@ifnextchar\lp@r{\p@lyline}{\strokepath\ignorespaces}} % \end{macrocode} % % \subsubsection{The red service grid} @@ -991,39 +1024,40 @@ and the derived files curve2e.sty and curve2e.pdf. % It must take care of the signs, so that it examines the operand signs and % determines the result sign separately conserving this computed sign in the % macro |\segno|; this done, we are sure that both operands are or are -% made positive; should the -% numerator be zero it directly issues the zero quotient; should the -% denominator be zero it outputs ``infinity'' (|\maxdimen| in points), that is -% the maximum allowable length measured in points that \TeX\ can deal with. +% made positive; should the numerator be zero it directly issues the zero +% quotient; should the denominator be zero it outputs +% ``infinity'' (|\maxdimen| in points), that is the maximum allowable length +% measured in points that \TeX\ can deal with. % Since the result is assigned a value, the calling statement must pass as the % third argument either a control sequence or an active character. Of course the % first operand is the dividend, the second the divisor and the third the % quotient. % -% Since |curve2e| is supposed to be an extension of |pic2e| and this macro package -% already contains a division maro, we do not define any other division macro; -% nevetheless, since the macro in |pic2e| may not be so efficient as it might be -% if the |e-tex| extensions of the interpreter program were available, here we -% check and eventually provide a more efficient macro. The latter exploits the -% scaling mechanism embedded in |pdftex| since 2007, if the extended mode is +% Since |curve2e| is supposed to be an extension of |pict2e| and this macro +%package already contains a division macro, we do not define any other division +% macro; nevertheless, since the macro in |pict2e| may not be so efficient as it +% might be if the |e-tex| extensions of the interpreter program were available, +% here we check and eventually provide a more efficient macro. The latter exploits +% the scaling mechanism embedded in |pdftex| since 2007, if the extended mode is % enabled, that is used to scale a dimension by a fraction: $L\times N/D$, where % $L$ is a dimension, and $N$ and $D$ are the numerator an denominator of the % scaling factor; these might be integers, but it's better they represent the % numbers of scaled points another two dimensions correspond to, in the philosophy -% that floating point numbers are represented by the measures of lengths in points. +% that floating point numbers are represented by the measures of lengths in +% points. % % Therefore first we test if the macro is already defined: % \begin{macrocode} -\ifx\DividE\undefined +\ifdefined\dimexpr % \end{macrocode} -%then we test if the extended mode exists and/or is enabled: +% then we test if the extended mode exists and/or is enabled: % \begin{macrocode} -\ifx\dimexpr\undefined\else + \unless\ifdefined\DividE % \end{macrocode} -% Notice that |\dimexpr| is the specific extended mode control sequence we are going -% to use in order to perform our task; if the interpeter program is too old and/or -% it is a recent version, but it was compiled without activating the extended mode, -% the macro |\dimexpr| is undefined. +% Notice that |\dimexpr| is the specific extended mode control sequence we are +% going to use in order to perform our task; if the interpreter program is too +% old and/or it is a recent version, but it was compiled without activating the +% extended mode, the macro |\dimexpr| is undefined. % % The macro, creates a group where the names of two counters and a % dimensional register are defined; the numbers of these integer and dimension @@ -1033,51 +1067,75 @@ and the derived files curve2e.sty and curve2e.pdf. % does not damage the other macros; we just have to use a dirty trick to throw % the result beyond the end-group command. % -% The efficiency of this macro is contained in the extended command |\dimexpr|; both -% the |\@DimA| and |\Num| registers are program words of 32\,bits; the result is -% stored into an internal register of 64\,bits; the final division by a factor -% stored into a register of 32 bits, so that in terms of scaled points a division by -% 1\,pt = $1\times 2^{16}$, scales down the result by 16 bits, and if the total +% The efficiency of this macro is contained in the extended command |\dimexpr|; +% both the |\@DimA| and |\Num| registers are program words of 32\,bits; the result +% is stored into an internal register of 64\,bits; the final division by a factor +% stored into a register of 32 bits, so that in terms of scaled points a division +% by 1\,pt = $1\times 2^{16}$, scales down the result by 16 bits, and if the total % length of the result is smaller than $2^{30}$, the result can be correctly % assigned to a dimension register. In any other case the extended features imply -% suitable error messages end the termination of the program. During the division a -% scaling down by 16 bits, the result is not simply truncated, but it is rounded to -% the nearest integer (in scaled points) +% suitable error messages end the termination of the program. During the division +% a scaling down by 16 bits, the result is not simply truncated, but it is rounded +% to the nearest integer (in scaled points). The first two operands are lengths +% and the third is a macro. % % \begin{macrocode} - \def\DividE#1by#2to#3{% - \begingroup + \def\DividE#1by#2to#3{\bgroup \countdef\Num2254\relax \countdef\Den2252\relax \dimendef\@DimA 2254 \Num=\p@ \@DimA=#2\relax \Den=\@DimA \ifnum\Den=\z@ - \edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\maxdimen}}% + \edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\maxdimen}}% \else - \@DimA=#1\relax - \@DimA=\dimexpr\@DimA*\Num/\Den\relax - \edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% + \@DimA=#1\relax + \@DimA=\dimexpr\@DimA*\Num/\Den\relax + \edef\x{\noexpand\egroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% \fi - \x} + \x\ignorespaces}% + \fi % \end{macrocode} +% +% We need a similar macro to divide two fractional or integer numbers, +% not dimensions, and produce a macro that contains the fractional result. % \begin{macrocode} -\fi\fi + \unless\ifdefined\DivideFN + \def\DivideFN#1by#2to#3{\DividE#1\p@ by#2\p@ to#3}% + \fi % \end{macrocode} % -% The next two macros are one of the myriad variants of the dirty trick used by -% Knuth for separating a measure from its units that \textit{must} be points, -% ``\texttt{pt}''. One has to call |\Numero| with a control sequence and a -% dimension; the dimension value in points is assigned to the control sequence. +% We do the same in order to multiply two integer o fractional numbers held +% in the first two arguments and the third argument is a definable token that +% will hold the result of multiplication in the form of a fractional number, +% possibly with a non null fractional part; a null fractional part is +% eliminated by \verb|strip@pt|. % \begin{macrocode} -\ifx\undefined\@Numero% - {\let\cc\catcode \cc`p=12\cc`t=12\gdef\@Numero#1pt{#1}}% + \unless\ifdefined\MultiplY + \def\MultiplY#1by#2to#3{\bgroup + \dimendef\@DimA 2254 \dimendef\@DimB2255 + \@DimA=#1\p@\relax \@DimB=#2\p@\relax + \@DimA=\dimexpr\@DimA*\@DimB/\p@\relax + \edef\x{\noexpand\egroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% + \x\ignorespaces}% + \fi \fi -\ifx\undefined\Numero - \def\Numero#1#2{\dimen254#2\relax - \edef#1{\expandafter\@Numero\the\dimen254}\ignorespaces}% +% \end{macrocode} + +% The next macro uses the \verb|\strip@pt| \LaTeX\ kernel macro to get the +% numerical value of a measure in points. One has to call |\Numero| with +% a control sequence and a dimension; the dimension value in points is +% assigned to the control sequence. +% \begin{macrocode} +\unless\ifdefined\Numero + \def\Numero#1#2{\dimen3254#2\relax + \edef#1{\strip@pt\dimen3254}\ignorespaces}% \fi % \end{macrocode} -% For both macros the |\ifx|\dots|\fi| constructs avoid messing up the -% definitions I have in several packages. +% The \verb|\ifdefined| primitive command is provided by the e-\TeX\ extension +% of the typesetting engine; the test does not create any hash table entry; +% it is a different way than the \verb|\ifx\csname ....\endcsname| test, +% because the latter first possibly creates a macro with meaning \verb|relax| +% then executes the test; therefore an undefined macro name is always defined +% to mean \verb|\relax|. % % \subsection{Trigonometric functions} % We now start with trigonometric functions. We define the macros |\SinOf|, @@ -1123,7 +1181,7 @@ and the derived files curve2e.sty and curve2e.pdf. % Computations are done with the help of counter |\I|, of the length |\@tdB|, % and the auxiliary control sequences |\Tan| and |\Cot| whose meaning is % transparent. The iterative process controlled by |\@whilenum| implements the -% (truncated) continued fraction expansion of the tangent function +% (truncated) continued fraction expansion of the tangent function. % \[ % \tan x = \frac{1}{\displaystyle \frac{1\mathstrut}{\displaystyle x} % -\frac{1}{\displaystyle \frac{3\mathstrut}{\displaystyle x} @@ -1134,7 +1192,7 @@ and the derived files curve2e.sty and curve2e.pdf. % -\cdots}}}}}} % \] % \begin{macrocode} -\countdef\I=254\def\Tan{0}\I=11\relax +\countdef\I=2546\def\Tan{0}\I=11\relax \@whilenum\I>\z@\do{% \@tdC=\Tan\p@ \@tdD=\I\@tdB \advance\@tdD-\@tdC \DividE\p@ by\@tdD to\Tan @@ -1158,7 +1216,7 @@ and the derived files curve2e.sty and curve2e.pdf. % auxiliary function is not defined any more, although its expansion keeps getting % executed so that the expanded result is thrown beyond the group end. % \begin{macrocode} -\def\SinOf#1to#2{\begingroup% +\def\SinOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>\z@% \@whiledim\@tdA>180\p@\do{\advance\@tdA -360\p@}% @@ -1193,15 +1251,15 @@ and the derived files curve2e.sty and curve2e.pdf. \fi \fi \fi -\edef\endSinOf{\noexpand\endgroup +\edef\endSinOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endSinOf}% % \end{macrocode} % -% For the computation of the cosine we behave in a similar way using also the identical -% trick for throwing the result beyond the group end. +% For the computation of the cosine we behave in a similar way using also the +% identical trick for throwing the result beyond the group end. % \begin{macrocode} -\def\CosOf#1to#2{\begingroup% +\def\CosOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>\z@% \@whiledim\@tdA>360\p@\do{\advance\@tdA -360\p@}% @@ -1238,7 +1296,7 @@ and the derived files curve2e.sty and curve2e.pdf. \fi \fi \fi -\edef\endCosOf{\noexpand\endgroup +\edef\endCosOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endCosOf}% % \end{macrocode} @@ -1248,7 +1306,7 @@ and the derived files curve2e.sty and curve2e.pdf. % multiples of $90^\circ$ we assign the result a \TeX\ infinity value, that is % the maximum a dimension can be. % \begin{macrocode} -\def\TanOf#1to#2{\begingroup% +\def\TanOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>90\p@% \@whiledim\@tdA>90\p@\do{\advance\@tdA -180\p@}% @@ -1277,7 +1335,7 @@ and the derived files curve2e.sty and curve2e.pdf. \fi \fi \fi -\edef\endTanOf{\noexpand\endgroup +\edef\endTanOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endTanOf}% % \end{macrocode} @@ -1390,7 +1448,7 @@ and the derived files curve2e.sty and curve2e.pdf. % \begin{macrocode} \def\DirOfVect#1to#2{\GetCoord(#1)\t@X\t@Y \ModOfVect#1to\@tempa -\ifdim\@tempdimc=\z@\else +\unless\ifdim\@tempdimc=\z@ \DividE\t@X\p@ by\@tempdimc to\t@X \DividE\t@Y\p@ by\@tempdimc to\t@Y \fi @@ -1442,6 +1500,195 @@ and the derived files curve2e.sty and curve2e.pdf. \MakeVectorFrom\t@X\t@Y to#2\ignorespaces}% % \end{macrocode} % +% As of today the anomaly (angle) of a complex number may not be necessary, but +% it might become useful in the future; therefore with macro \verb|\ArgOfVect| +% we calculate the four quadrant arctangent (in degrees) of the given vector +% taking into account the sings of the vector components. For the principal +% value of the arctangent we would like to use the continued fraction: +%\begin{equation} +%\arctan x = \cfrac{x}{1+ \cfrac{x^2}{3-x^2 + \cfrac{(3x)^2}{5-3x^2 + +% \cfrac{(5x)^2}{7-5x^2 + \cfrac{(7x)^2}{9-7x^2 + \ddots}}}}} +%\label{equ:arctan-fraz-cont} +%\end{equation} +% but after some testing we had to give up due to the slow convergence of +% continued fraction~\eqref{equ:arctan-fraz-cont}, strictly connected with +% the slow convergence of the McLaurin series from which it is derived. +% +% Waiting for a faster convergence continued fraction, we examined the +% parametric formula and its inverse: +%\begin{equation} +%\begin{subequations} +%\begin{aligned} +%\tan\theta &= \frac{2\tan(\theta/2))}{1 - \tan^2(\theta/2)}\\ +%\tan(\theta/2) &= \frac{\sqrt{\tan^2\theta +1}-1}{\tan\theta} +%\label{equ:tanfimezzi} +%\end{aligned} +%\end{subequations} +%\end{equation} +% If we count the times we use the above formula we can arrive at a point +% where we have to compute the arctangent of a very small value, where the +% arctangent and it argument are approximately equal, so that the angle value +% in radians is equal to its tangent; at that point we multiply by $2^n$, +% where $n$ is the number of bisections and transform the radians in degrees. +% The procedure is pretty good, even if is is very rudimental and based on an +% approximation; the fixed radix computation of the typesetting engine does +% not help, but we get pretty decent results, although we loose some accuracy +% that hopefully would not harm further computations. +% +% The results obtainable with equation~\eqref{equ:tanfimezzi} are possibly +% acceptable, but the square that must be computed in it tends to go in +% underflow if too many iterations are performed and the algorthim crashes; +% therefore it's virtually impossibile to get more than three correct digits +% after the decimal separator. +% +% It is probably better to refer to the Newton iterations for solving the +% equation: +%\begin{equation} +% \tan\theta -\tan\theta_\infty= 0 +%\end{equation} +% in the unknown $\theta$ given the value $t=\tan\theta_\infty$; see +% figure~\ref{fig:tangenti}. +% +%\begin{figure}\centering\unitlength=0.007\textwidth +%\begin{picture}(100,70) +%\put(10,63){\framebox(18,7){$y=\tan\theta$}} +%\put(30,63){\framebox(20,7){$t=\tan\theta_\infty$}} +%\put(0,0){\vector(1,0){100}}\put(100,3){\makebox(0,0)[br]{$\theta$}} +%\put(0,0){\vector(0,1){70}}\put(3,70){\makebox(0,0)[tl]{$y$}} +%\multiput(75,0)(0,5){14}{\line(0,1){2.5}}\put(77,2){\makebox(0,0)[bl]{$\pi/2$}} +%{\linethickness{1pt}\cbezier(0,0)(5,5)(55,40)(60,70)} +%\put(51,50){\circle*{2}} +%\multiput(51,0)(0,5){10}{\line(0,1){2.5}}\put(54,3){\makebox(0,0)[bl]{$\theta_{i-1}$}} +%\multiput(0,50)(5,0){10}{\line(1,0){2.5}}\put(3,53){\makebox(0,0)[bl]{$y_{i-1}$}} +%\put(0,20){\line(1,0){70}}\put(3,23){\makebox(0,0)[bl]{$t$}} +%\Line(34,20)(51,50) +%\put(34,20){\circle*{2}} +%\multiput(34,0)(0,5){4}{% +% \line(0,1){2.5}}\put(36,3){\makebox(0,0)[bl]{$\theta_{i}$}} +%\put(24,20){\circle*{2}} +%\multiput(24,0)(0,5){4}{\line(0,1){2.5}}\put(21,3){\makebox(0,0)[br]{$\theta_\infty$}} +%\end{picture} +%\caption{Newton method}\label{fig:tangenti} +%\end{figure} +% +% The iterative algorithm with Newton method implies the recurrence +%\begin{equation}\begin{subequations}\begin{aligned} +%y'_{i-1} &= \frac{\diff\tan(\theta_{i-1})}{\diff\theta} +% = \frac{1}{\cos^2\theta_{i-1}}\\ +%\theta_i &= \theta_{i-1} - y'_{i-1}(\tan \theta_{i-1} - t) +% =\theta_{i-1} - \cos^2 \theta_{i-1}(\tan \theta_{i-1} - t) +%\end{aligned} +%\label{equ:iterazione} +%\end{subequations}\end{equation} +% +% The algorithm starts with an initial value $\theta_0$, at each iteration +% for $i=1, 2, 3,\dots$ a new value of $\theta_i$ is computed from the data +% of the previous iteration $i-1$. When for a certain $i$, $\tan\theta_i$ +% is sufficiently close to $t$, the iterations may be stopped; since we +% already have the algorithms for computing both the tangent and the cosine; +% such Newton iterative method dos not pose any problems, especially if we +% use the properties of the trigonometric functions and we confine the +% computations to the first quadrant. +% \begin{macrocode} +\def\ArcTanOf#1to#2{\bgroup +\edef\@tF{#1}\@tdF=\@tF\p@ +\@tdE=57.295779\p@ +\ifdim\@tdF=\z@\def\@tX{0}\else +\edef\@tXX{1}% +\MultiplY57.295779by\@tXX to \@tX +\countdef\I 2323 \I=7\relax +\@whilenum\I>0\do{\TanOf\@tX to\@tG +\CosOf\@tX to \@tH +\edef\@tG{\strip@pt\dimexpr\@tG\p@-\@tdF\relax}% +\MultiplY\@tH by\@tH to\@tH +\MultiplY\@tH by\@tG to \@tH +\edef\@tXX{\strip@pt\dimexpr\@tXX\p@ - \@tH\p@\relax}% +\MultiplY57.295779by\@tXX to\@tX +\advance\I\m@ne}\fi +\edef\x{\egroup\noexpand\edef\noexpand#2{\@tX}}\x}% +% \end{macrocode} +% +% Now we have the algorithm to compute the arctangent of a number; and +% it should be relatively easy to compute the angle of a complex number. +% We have to pay attention that the algorithm to compute the arctangent +% does not care about the quadrant where the complex number lays in, and +% it yields the principal value of the arctan in the domain $\pi/2 < +% \theta \leq \pi/2$. with complex numbers we have just a sign change in +% their angle when the lay in the first or the fourth quadrants; while +% for the third and second quadrants we have to reflect the complex number +% to its opposite and in the result we have to add a ``flat angle'', that +% is 180°, since we are working in degrees. Even if mathematically it +% is undefined we decided to assign a null angle to a null complex number; +% possibly a warning message would be helpful, but for drawing purposes +% we think that the problem is irrelevant. +% +% \begin{macrocode} +\def\ArgOfVect#1to#2{\bgroup\GetCoord(#1){\t@X}{\t@Y}% +\def\s@gno{}\def\addflatt@ngle{0} +\ifdim\t@X\p@=\z@ + \ifdim\t@Y\p@=\z@ + \def\ArcTan{0}% + \else + \def\ArcTan{90}% + \ifdim\t@Y\p@<\z@\def\s@gno{-}\fi + \fi +\else + \ifdim\t@Y\p@=\z@ + \ifdim\t@X\p@<\z@ + \def\ArcTan{180}% + \else + \def\ArcTan{0}% + \fi + \else + \ifdim\t@X\p@<\z@% + \def\addflatt@ngle{180}% + \edef\t@X{\strip@pt\dimexpr-\t@X\p@}% + \edef\t@Y{\strip@pt\dimexpr-\t@Y\p@}% + \ifdim\t@Y\p@<\z@ + \def\s@gno{-}% + \edef\t@Y{-\t@Y}% + \fi + \fi + \DivideFN\t@Y by\t@X to \t@A + \ArcTanOf\t@A to\ArcTan + \fi +\fi +\edef\ArcTan{\unless\ifx\s@gno\empty\s@gno\fi\ArcTan}% +\unless\ifnum\addflatt@ngle=0\relax + \edef\ArcTan{% + \strip@pt\dimexpr\ArcTan\p@\ifx\s@gno\empty-\else+\fi + \addflatt@ngle\p@\relax}% +\fi +\edef\x{\noexpand\egroup\noexpand\edef\noexpand#2{\ArcTan}}% +\x\ignorespaces} +% \end{macrocode} +%^^A \begin{tabular}{ll} +%^^A 0 & \ArcTanOf 0 to\Res \Res\\ +%^^A 1 & \ArcTanOf 1 to\Res \Res\\ +%^^A 2 & \ArcTanOf 2 to\Res \Res\\ +%^^A 0.5 & \ArcTanOf 0.5 to\Res \Res\\ +%^^A 0.707 & \ArcTanOf 0.707 to\Res \Res\\ +%^^A \end{tabular} +%^^A +%^^A\bigskip +%^^A +%^^A \begin{tabular}{rl} +%^^A 0,0 & \ArgOfVect0,0to\Res \Res\\ +%^^A 1,0 & \ArgOfVect1,0to\Res \Res\\ +%^^A -1,0 & \ArgOfVect-1,0to\Res \Res\\ +%^^A 0,1 & \ArgOfVect0,1to\Res \Res\\ +%^^A 0,-1 & \ArgOfVect0,-1to\Res \Res\\ +%^^A 1,1 & \ArgOfVect1,1to\Res \Res\\ +%^^A 1,-1 & \ArgOfVect1,-1to\Res \Res\\ +% ^^A-1,1 & \ArgOfVect-1,1to\Res \Res\\ +% ^^A-1,-1 & \ArgOfVect-1,-1to\Res \Res\\ +%^^A \end{tabular} +% It is worth noting that the absolute error in these computations is lower +% than 0.001°, that is 0.000017\,rad; pretty satisfactory since the typesetting +% engines work in fixed radix notation with 16 fractional binary digits, and +% an error on the fifth fractional digit is almost the best it can be expected +% from this kind of arithmetics. +% % Sometimes it is necessary to scale a vector by an arbitrary real factor; this % implies scaling both the real and imaginary part of the input given vector. % \begin{macrocode} @@ -1573,7 +1820,7 @@ and the derived files curve2e.sty and curve2e.pdf. % macro, stroke the line and exit. % \begin{macrocode} \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% % \end{macrocode} % And the new macro |\@@Arc| starts with moving the drawing point to the first % point and does everything needed for tracing the requested arc, except @@ -1699,12 +1946,12 @@ and the derived files curve2e.sty and curve2e.pdf. % macro is almost identical to that of the plain arc; the beginning also is % quite similar. The central part is dedicated to the positioning of the arrow % tip and to the necessary calculations for determining the tip tilt and the -% reduction of the total arc length; pay attention that the arrow length, stored in -% |\@tdE| is a real length, while the radius stored in |\@Raggio| is just a multiple -% of the |\unitlength|, so that the division (that yields a good angular -% approximation to the arrow length as seen from the center of the arc) must be done -% with real lengths. The already defined |\@@Arc| macro actually draws the curved -% vector stem without stroking it. +% reduction of the total arc length; pay attention that the arrow length, stored +% in |\@tdE| is a real length, while the radius stored in |\@Raggio| is just +% a multiple of the |\unitlength|, so that the division (that yields a good +% angular approximation to the arrow length as seen from the center of the arc) +% must be done with real lengths. The already defined |\@@Arc| macro actually +% draws the curved vector stem without stroking it. % \begin{macrocode} \def\@VArc(#1)(#2){% \ifdim\@tdA>\z@ @@ -1741,7 +1988,7 @@ and the derived files curve2e.sty and curve2e.pdf. \advance\@tdA -\@tdE \Numero\@gradi\@tdA \CopyVect#1to\@Cent \GetCoord(\@pPun)\@pPunX\@pPunY \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% % \end{macrocode} % % The macro for the arc terminated with arrow tips at both ends is again very @@ -1797,7 +2044,7 @@ and the derived files curve2e.sty and curve2e.pdf. \AddVect\@Cent and\@V to\@pPun \GetCoord(\@pPun)\@pPunX\@pPunY \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% % \end{macrocode} % % It must be understood that the curved vectors, the above circular arcs @@ -1881,7 +2128,7 @@ and the derived files curve2e.sty and curve2e.pdf. % The next macro is the finishing one; it strokes the whole curve and closes the % group that was opened with |\StartCurve|. % \begin{macrocode} -\def\CurveFinish{\pIIe@strokeGraph\endgroup\ignorespaces}% +\def\CurveFinish{\strokepath\endgroup\ignorespaces}% % \end{macrocode} % % The ``real'' curve macro comes next; it is supposed to determine the control @@ -2114,7 +2361,7 @@ and the derived files curve2e.sty and curve2e.pdf. \def\@ChangeDir[#1]{\ChangeDir<#1>\@Curve} % \end{macrocode} % -% As a concluding remark, please notice the the |\Curve| macro is certainly the +% As a concluding remark, please notice that the |\Curve| macro is certainly the % most comfortable to use, but it is sort of frozen in its possibilities. The % user may certainly use the |\StartCurve|, |\CurveTo|, |\ChangeDir|, and % |\CurveFinish| for a more versatile set of drawing macros; evidently nobody diff --git a/Master/texmf-dist/tex/latex/curve2e/curve2e.sty b/Master/texmf-dist/tex/latex/curve2e/curve2e.sty index 41bd06afae4..e97c8f5f16b 100644 --- a/Master/texmf-dist/tex/latex/curve2e/curve2e.sty +++ b/Master/texmf-dist/tex/latex/curve2e/curve2e.sty @@ -6,22 +6,21 @@ %% %% curve2e.dtx (with options: `package') %% ______________________________________________________ -%% The curve2e package for LaTeX and XeLaTeX -%% Copyright (C) 2005-2012 Claudio Beccari +%% The curve2e package for LaTeX and XeLATeX +%% Copyright (C) 2010 Claudio Beccari %% All rights reserved %% %% License information appended %% %% %% File `curve2e.dtx'. -%% Copyright (C) 2005--2011 Claudio Beccari all rights reserved. +%% Copyright (C) 2005--2015 Claudio Beccari all rights reserved. %% -\NeedsTeXFormat{LaTeX2e} +\NeedsTeXFormat{LaTeX2e}[2014/05/01] \ProvidesPackage{curve2e}% - [2012/12/11 v.1.41 Extension package for pict2e] + [2015/06/06 v.1.42 Extension package for pict2e] \RequirePackage{color} -\RequirePackageWithOptions{pict2e}[2011/04/01] - +\RequirePackageWithOptions{pict2e}[2014/01/01] \def\TRON{\tracingcommands\tw@ \tracingmacros\tw@}% \def\TROF{\tracingcommands\z@ \tracingmacros\z@}% \ifx\undefined\@tdA \newdimen\@tdA \fi @@ -36,8 +35,8 @@ \def\thicklines{\linethickness{\defaultlinewidth}}% \def\thinlines{\linethickness{.5\defaultlinewidth}}% \thinlines\ignorespaces} -\def\LIne(#1,#2){\pIIe@moveto\z@\z@ - \pIIe@lineto{#1\unitlength}{#2\unitlength}\pIIe@strokeGraph}% +\def\LIne(#1,#2){\moveto(0,0) + \pIIe@lineto{#1\unitlength}{#2\unitlength}\strokepath}% \def\segment(#1)(#2){\@killglue\polyline(#1)(#2)}% \def\line(#1)#2{\begingroup \@linelen #2\unitlength @@ -48,9 +47,9 @@ \DividE\ifdim\d@mX\p@<\z@-\fi\p@ by\d@mX\p@ to\sc@lelen \@linelen=\sc@lelen\@linelen \fi - \pIIe@moveto\z@\z@ + \moveto(0,0) \pIIe@lineto{\d@mX\@linelen}{\d@mY\@linelen}% - \pIIe@strokeGraph + \strokepath \fi \endgroup\ignorespaces}% \ifx\Dline\undefined @@ -62,7 +61,7 @@ \SubVect\V@ttA from\V@ttB to\V@ttC \ModOfVect\V@ttC to\DlineMod \DividE\DlineMod\p@ by#5\p@ to\NumD - \NumA\expandafter\Integer\NumD.?? + \NumA\expandafter\Integer\NumD?? \ifodd\NumA\else\advance\NumA\@ne\fi \NumB=\NumA \divide\NumB\tw@ \DividE\DlineMod\p@ by\NumA\p@ to\D@shMod @@ -98,15 +97,15 @@ \pIIe@concat\@xdim\@ydim{-\@ydim}\@xdim{\@xnum\@linelen}{\@ynum\@linelen}% \@linelen\z@ \pIIe@vector - \pIIe@fillGraph + \fillpath \@linelen=\@tdB \@tdA=\pIIe@FAW\@wholewidth \@tdA=\pIIe@FAL\@tdA \advance\@linelen-\@tdA \ifdim\@linelen>\z@ - \pIIe@moveto\z@\z@ + \moveto(0,0) \pIIe@lineto{\@xnum\@linelen}{\@ynum\@linelen}% - \pIIe@strokeGraph\fi + \strokepath\fi \endgroup} \def\Vector(#1,#2){% \ifdim#1\p@=\z@\vector(#1,#2){#2} @@ -117,19 +116,19 @@ \expandafter\put\expandafter(#1){\expandafter\Vector\expandafter(\@tempa)}% \endgroup\ignorespaces} \let\lp@r( \let\rp@r) -\providecommand*\polyline[1][\beveljoin]{\p@lylin@[#1]} +\renewcommand*\polyline[1][\beveljoin]{\p@lylin@[#1]} \def\p@lylin@[#1](#2){\@killglue#1\GetCoord(#2)\d@mX\d@mY \pIIe@moveto{\d@mX\unitlength}{\d@mY\unitlength}% \@ifnextchar\lp@r{\p@lyline}{% \PackageWarning{curve2e}% - {Polygonal lines require at least two vertices!\MessageBreak - Control your polygonal line specification\MessageBreak}% + {Polylines require at least two vertices!\MessageBreak + Control your polyline specification\MessageBreak}% \ignorespaces}} \def\p@lyline(#1){\GetCoord(#1)\d@mX\d@mY \pIIe@lineto{\d@mX\unitlength}{\d@mY\unitlength}% - \@ifnextchar\lp@r{\p@lyline}{\pIIe@strokeGraph\ignorespaces}} + \@ifnextchar\lp@r{\p@lyline}{\strokepath\ignorespaces}} \def\GraphGrid(#1,#2){\begingroup\textcolor{red}{\linethickness{.1\p@}% \RoundUp#1modulo10to\@GridWd \RoundUp#2modulo10to\@GridHt \@tempcnta=\@GridWd \divide\@tempcnta10\relax \advance\@tempcnta\@ne @@ -144,39 +143,48 @@ \ifnum\count252>0\advance\count252-#2\relax \advance\@tempcnta-\count252\fi\edef#3{\number\@tempcnta}\ignorespaces}% \def\Integer#1.#2??{#1}% -\ifx\DividE\undefined -\ifx\dimexpr\undefined\else -\def\DividE#1by#2to#3{% -\begingroup +\ifdefined\dimexpr + \unless\ifdefined\DividE +\def\DividE#1by#2to#3{\bgroup \countdef\Num2254\relax \countdef\Den2252\relax \dimendef\@DimA 2254 \Num=\p@ \@DimA=#2\relax \Den=\@DimA \ifnum\Den=\z@ -\edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\maxdimen}}% + \edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\maxdimen}}% \else -\@DimA=#1\relax -\@DimA=\dimexpr\@DimA*\Num/\Den\relax -\edef\x{\noexpand\endgroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% + \@DimA=#1\relax + \@DimA=\dimexpr\@DimA*\Num/\Den\relax + \edef\x{\noexpand\egroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% \fi -\x} -\fi\fi -\ifx\undefined\@Numero% - {\let\cc\catcode \cc`p=12\cc`t=12\gdef\@Numero#1pt{#1}}% +\x\ignorespaces}% \fi -\ifx\undefined\Numero - \def\Numero#1#2{\dimen254#2\relax - \edef#1{\expandafter\@Numero\the\dimen254}\ignorespaces}% + \unless\ifdefined\DivideFN + \def\DivideFN#1by#2to#3{\DividE#1\p@ by#2\p@ to#3}% + \fi + \unless\ifdefined\MultiplY + \def\MultiplY#1by#2to#3{\bgroup + \dimendef\@DimA 2254 \dimendef\@DimB2255 + \@DimA=#1\p@\relax \@DimB=#2\p@\relax + \@DimA=\dimexpr\@DimA*\@DimB/\p@\relax + \edef\x{\noexpand\egroup\noexpand\def\noexpand#3{\strip@pt\@DimA}}% + \x\ignorespaces}% + \fi +\fi + +\unless\ifdefined\Numero + \def\Numero#1#2{\dimen3254#2\relax + \edef#1{\strip@pt\dimen3254}\ignorespaces}% \fi \def\g@tTanCotanFrom#1to#2and#3{% \DividE 114.591559\p@ by#1to\X@ \@tdB=\X@\p@ -\countdef\I=254\def\Tan{0}\I=11\relax +\countdef\I=2546\def\Tan{0}\I=11\relax \@whilenum\I>\z@\do{% \@tdC=\Tan\p@ \@tdD=\I\@tdB \advance\@tdD-\@tdC \DividE\p@ by\@tdD to\Tan \advance\I-2\relax}% \def#2{\Tan}\DividE\p@ by\Tan\p@ to\Cot \def#3{\Cot}% \ignorespaces}% -\def\SinOf#1to#2{\begingroup% +\def\SinOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>\z@% \@whiledim\@tdA>180\p@\do{\advance\@tdA -360\p@}% @@ -211,10 +219,10 @@ \fi \fi \fi -\edef\endSinOf{\noexpand\endgroup +\edef\endSinOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endSinOf}% -\def\CosOf#1to#2{\begingroup% +\def\CosOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>\z@% \@whiledim\@tdA>360\p@\do{\advance\@tdA -360\p@}% @@ -249,10 +257,10 @@ \fi \fi \fi -\edef\endCosOf{\noexpand\endgroup +\edef\endCosOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endCosOf}% -\def\TanOf#1to#2{\begingroup% +\def\TanOf#1to#2{\bgroup% \@tdA=#1\p@% \ifdim\@tdA>90\p@% \@whiledim\@tdA>90\p@\do{\advance\@tdA -180\p@}% @@ -281,7 +289,7 @@ \fi \fi \fi -\edef\endTanOf{\noexpand\endgroup +\edef\endTanOf{\noexpand\egroup \noexpand\def\noexpand#2{\@tempA}\noexpand\ignorespaces}% \endTanOf}% \def\MakeVectorFrom#1#2to#3{\edef#3{#1,#2}\ignorespaces}% @@ -311,7 +319,7 @@ \ignorespaces}% \def\DirOfVect#1to#2{\GetCoord(#1)\t@X\t@Y \ModOfVect#1to\@tempa -\ifdim\@tempdimc=\z@\else +\unless\ifdim\@tempdimc=\z@ \DividE\t@X\p@ by\@tempdimc to\t@X \DividE\t@Y\p@ by\@tempdimc to\t@Y \fi @@ -335,6 +343,60 @@ \CosOf#1to\t@X \SinOf#1to\t@Y \MakeVectorFrom\t@X\t@Y to#2\ignorespaces}% +\def\ArcTanOf#1to#2{\bgroup +\edef\@tF{#1}\@tdF=\@tF\p@ +\@tdE=57.295779\p@ +\ifdim\@tdF=\z@\def\@tX{0}\else +\edef\@tXX{1}% +\MultiplY57.295779by\@tXX to \@tX +\countdef\I 2323 \I=7\relax +\@whilenum\I>0\do{\TanOf\@tX to\@tG +\CosOf\@tX to \@tH +\edef\@tG{\strip@pt\dimexpr\@tG\p@-\@tdF\relax}% +\MultiplY\@tH by\@tH to\@tH +\MultiplY\@tH by\@tG to \@tH +\edef\@tXX{\strip@pt\dimexpr\@tXX\p@ - \@tH\p@\relax}% +\MultiplY57.295779by\@tXX to\@tX +\advance\I\m@ne}\fi +\edef\x{\egroup\noexpand\edef\noexpand#2{\@tX}}\x}% +\def\ArgOfVect#1to#2{\bgroup\GetCoord(#1){\t@X}{\t@Y}% +\def\s@gno{}\def\addflatt@ngle{0} +\ifdim\t@X\p@=\z@ + \ifdim\t@Y\p@=\z@ + \def\ArcTan{0}% + \else + \def\ArcTan{90}% + \ifdim\t@Y\p@<\z@\def\s@gno{-}\fi + \fi +\else + \ifdim\t@Y\p@=\z@ + \ifdim\t@X\p@<\z@ + \def\ArcTan{180}% + \else + \def\ArcTan{0}% + \fi + \else + \ifdim\t@X\p@<\z@% + \def\addflatt@ngle{180}% + \edef\t@X{\strip@pt\dimexpr-\t@X\p@}% + \edef\t@Y{\strip@pt\dimexpr-\t@Y\p@}% + \ifdim\t@Y\p@<\z@ + \def\s@gno{-}% + \edef\t@Y{-\t@Y}% + \fi + \fi + \DivideFN\t@Y by\t@X to \t@A + \ArcTanOf\t@A to\ArcTan + \fi +\fi +\edef\ArcTan{\unless\ifx\s@gno\empty\s@gno\fi\ArcTan}% +\unless\ifnum\addflatt@ngle=0\relax + \edef\ArcTan{% + \strip@pt\dimexpr\ArcTan\p@\ifx\s@gno\empty-\else+\fi + \addflatt@ngle\p@\relax}% +\fi +\edef\x{\noexpand\egroup\noexpand\edef\noexpand#2{\ArcTan}}% +\x\ignorespaces} \def\ScaleVect#1by#2to#3{\GetCoord(#1)\t@X\t@Y \@tempdima=\t@X\p@ \@tempdima=#2\@tempdima\Numero\t@X\@tempdima \@tempdima=\t@Y\p@ \@tempdima=#2\@tempdima\Numero\t@Y\@tempdima @@ -394,7 +456,7 @@ \SubVect#2from#1to\@V \ModOfVect\@V to\@Raggio \CopyVect#2to\@pPun \CopyVect#1to\@Cent \GetCoord(\@pPun)\@pPunX\@pPunY \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% \def\@@Arc{% \pIIe@moveto{\@pPunX\unitlength}{\@pPunY\unitlength}% \ifdim\@tdA>180\p@ @@ -492,7 +554,7 @@ \advance\@tdA -\@tdE \Numero\@gradi\@tdA \CopyVect#1to\@Cent \GetCoord(\@pPun)\@pPunX\@pPunY \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% \def\@VARC(#1)(#2){% \ifdim\@tdA>\z@ \let\Segno+% @@ -542,7 +604,7 @@ \AddVect\@Cent and\@V to\@pPun \GetCoord(\@pPun)\@pPunX\@pPunY \@@Arc -\pIIe@strokeGraph\ignorespaces}% +\strokepath\ignorespaces}% \def\CurveBetween#1and#2WithDirs#3and#4{% \StartCurveAt#1WithDir{#3}\relax \CurveTo#2WithDir{#4}\CurveFinish}% @@ -559,7 +621,7 @@ \CopyVect\@tempa,\@tempb to\@Dzero \DirOfVect\@Dzero to\@Dzero \ignorespaces} -\def\CurveFinish{\pIIe@strokeGraph\endgroup\ignorespaces}% +\def\CurveFinish{\strokepath\endgroup\ignorespaces}% \def\CurveTo#1WithDir#2{% \def\@Puno{#1}\def\@Duno{#2}\DirOfVect\@Duno to\@Duno \DistanceAndDirOfVect\@Puno minus\@Pzero to\@Chord and\@DirChord @@ -655,7 +717,7 @@ \def\@ChangeDir[#1]{\ChangeDir<#1>\@Curve} %% -%% Copyright 2005-2012 Claudio Beccari +%% Copyright 2005-2015 Claudio Beccari %% %% Distributable under the LaTeX Project Public License, %% version 1.3c or higher (your choice). The latest version of |