Move a tag
[latex2e.git] / latex2e-20160201 / required / graphics / trig.dtx
blobf1359622cb7baa99d61c3aa7a129f28bbc28284b
1 % \iffalse
2 %% File: trig.dtx Copyright (C) 1993 1994 1995 1996 1997 1999 David Carlisle
3 %%                Copyright (C) 2000--2015 David Carlisle, LaTeX3 Project
4 %%
5 %% This file is part of the Standard LaTeX `Graphics Bundle'.
6 %% It may be distributed under the terms of the LaTeX Project Public
7 %% License, as described in lppl.txt in the base LaTeX distribution.
8 %% Either version 1.3c or, at your option, any later version.
9 %%
11 %<*dtx>
12           \ProvidesFile{trig.dtx}
13 %</dtx>
14 %<*!plain>
15 %<package&!plain>\NeedsTeXFormat{LaTeX2e}
16 %<package&!plain>\ProvidesPackage{trig}
17 %<driver>        \ProvidesFile{trig.drv}
18 % \fi
19 %                \ProvidesFile{trig.dtx}
20                  [2016/01/03 v1.10 sin cos tan (DPC)]
22 % \iffalse
23 %</!plain>
24 %<*driver>
25 \documentclass{ltxdoc}
26 \usepackage{trig}
27 \begin{document}
28  \DocInput{trig.dtx}
29 \end{document}
30 %</driver>
31 % \fi
33 % \GetFileInfo{trig.dtx}
34 % \title{The \textsf{trig} package\thanks{This file
35 %        has version number \fileversion, last
36 %        revised \filedate.}}
37 % \author{David Carlisle}
38 % \date{\filedate}
39 % \MaintainedByLaTeXTeam{graphics}
40 % \maketitle
42 % \CheckSum{299}
44 % \changes{v1.00}{1993/00/00}{Undocumented versions}
45 % \changes{v1.05}{1993/10/07}{Documented, added tan}
46 % \changes{v1.06}{1994/02/01}{Update for LaTeX2e}
47 % \changes{v1.07}{1994/03/15}{Use ltxdoc}
48 % \changes{v1.08}{1994/10/16}{Change \cs{@xc} to \cs{nin@ty}}
50 % \section{Introduction}
52 % These macros implement the trigonometric functions, sin, cos and tan.
53 % In each case two commands are defined. For instance the command
54 % |\CalculateSin{33}| may be issued at some point, and then anywhere
55 % later in the document, the command |\UseSin{33}| will return the
56 % decimal expansion of $\sin(33^\circ)$.
58 % The arguments to these macros do not have to be whole numbers,
59 % although in the case of whole numbers, \LaTeX\ or plain \TeX\ counters
60 % may be used. In \TeX{}Book syntax, arguments must be  of type:
61 % \meta{optional signs}\meta{factor}
63 % Some other examples are:\\
64 % |\CalculateSin{22.5}|, |\UseTan{\value{mycounter}}|,
65 % |\UseCos{\count@}|.
67 % Note that unlike the psfig macros, these save all previously
68 % computed values. This could easily be changed, but I thought that in
69 % many applications one would want many instances of the
70 % same value. (eg rotating all the headings of a table by the
71 % \emph{same} amount).
73 % I don't really like this need to pre-calculate the values, I
74 % originally implemented |\UseSin| so that it automatically calculated
75 % the value if it was not pre-stored. This worked fine in testing, until
76 % I remembered why one needs these values. You want to be able to say
77 % |\dimen2=\UseSin{30}\dimen0|. Which means that |\UseSin| must
78 % \emph{expand} to a \meta{factor}.
80 % \StopEventually{}
82 % \section{The Macros}
84 %    \begin{macrocode}
85 %<*package>
86 %    \end{macrocode}
88 % \begin{macro}{\nin@ty}\begin{macro}{\@clxx}
89 % \begin{macro}{\@lxxi}\begin{macro}{\@mmmmlxviii}
90 % Some useful constants for converting between degrees and radians.
91 % $$\frac{\pi}{180}\simeq\frac{355}{113\times180}=\frac{71}{4068}$$
92 %    \begin{macrocode}
93 \chardef\nin@ty=90
94 \chardef\@clxx=180
95 \chardef\@lxxi=71
96 \mathchardef\@mmmmlxviii=4068
97 %    \end{macrocode}
98 % \end{macro}\end{macro}\end{macro}\end{macro}
100 % The approximation to $\sin$. I experimented with various
101 % approximations based on Tchebicheff polynomials, and also some
102 % approximations from a SIAM handbook `Computer Approximations' However
103 % the standard Taylor series seems sufficiently accurate, and used by
104 % far the fewest \TeX\ tokens, as the coefficients are all rational.
105 % \begin{eqnarray*}
106 %  \sin(x)& \simeq& x - (1/3!)x^3 + (1/5!)x^5 - (1/7!)x^7 + (1/9!)x^9\\
107 %  &\simeq&\frac{((((7!/9!x^2-7!/7!)x^2+7!/5!)x^2 +7!/3!)x^2+7!/1!)x}
108 % {7!}\\
109 %  &=&\frac{((((1/72x^2-1)x^2+42)x^2 +840)x^2+5040)x}
110 % {5040}
111 % \end{eqnarray*}
112 % The nested form used above reduces the number of operations required.
113 % In order to further reduce the number of operations, and more
114 % importantly reduce the number of tokens used, we can precompute the
115 % coefficients. Note that we can not use $9!$ as the denominator as
116 % this would cause overflow of \TeX's arithmetic.
117 % \begin{macro}{\@coeffz}\begin{macro}{\@coeffa}\begin{macro}{\@coeffb}
118 % \begin{macro}{\@coeffc}\begin{macro}{\@coeffd}
119 % Save the coefficients as |\|(|math|)|char|s.
120 %    \begin{macrocode}
121 \chardef\@coeffz=72
122 %\chardef\@coefa=1
123 \chardef\@coefb=42
124 \mathchardef\@coefc=840
125 \mathchardef\@coefd=5040
126 %    \end{macrocode}
127 % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
129 % \begin{macro}{\TG@rem@pt}
130 % The standard trick of getting a real number out of a \meta{dimen}.
131 % This gives a maximum accuracy of approx.\ 5 decimal places, which
132 % should be sufficient. It puts a space after the number, perhaps it
133 % shouldn't.
134 %    \begin{macrocode}
135 {\catcode`t=12\catcode`p=12\gdef\noPT#1pt{#1}}
136 \def\TG@rem@pt#1{\expandafter\noPT\the#1\space}
137 %    \end{macrocode}
138 % \end{macro}
140 % \begin{macro}{\TG@term}
141 % Compute one term of the above nested series. Multiply the previous sum
142 % by $x^2$ (stored in |\@tempb|, then add the next coefficient, |#1|.
143 %    \begin{macrocode}
144 \def\TG@term#1{%
145  \dimen@\@tempb\dimen@
146  \advance\dimen@ #1\p@}
147 %    \end{macrocode}
148 % \end{macro}
150 % \begin{macro}{\TG@series}
151 % Compute the above series. the value in degrees will be in |\dimen@|
152 % before this is called.
153 %    \begin{macrocode}
154 \def\TG@series{%
155  \dimen@\@lxxi\dimen@
156  \divide \dimen@ \@mmmmlxviii
157 %    \end{macrocode}
158 % |\dimen@| now contains the angle in radians, as a \meta{dimen}. We
159 % need to remove the units, so store the same value as a \meta{factor}
160 % in |\@tempa|.
161 %    \begin{macrocode}
162  \edef\@tempa{\TG@rem@pt\dimen@}%
163 %    \end{macrocode}
164 % Now put $x^2$ in |\dimen@| and |\@tempb|.
165 %    \begin{macrocode}
166  \dimen@\@tempa\dimen@
167  \edef\@tempb{\TG@rem@pt\dimen@}%
168 %    \end{macrocode}
169 % The first coefficient is  $1/72$.
170 %    \begin{macrocode}
171  \divide\dimen@\@coeffz
172  \advance\dimen@\m@ne\p@
173  \TG@term\@coefb
174  \TG@term{-\@coefc}%
175  \TG@term\@coefd
176 %    \end{macrocode}
177 % Now the cubic in $x^2$ is completed, so we need to multiply by $x$ and
178 % divide by $7!$.
179 %    \begin{macrocode}
180  \dimen@\@tempa\dimen@
181  \divide\dimen@ \@coefd}
182 %    \end{macrocode}
183 % \end{macro}
185 % \begin{macro}{\CalculateSin}
186 % If this angle has already been computed, do nothing, else store the
187 % angle, and call |\TG@@sin|.
188 %    \begin{macrocode}
189 \def\CalculateSin#1{{%
190   \expandafter\ifx\csname sin(\number#1)\endcsname\relax
191     \dimen@=#1\p@\TG@@sin
192     \expandafter\xdef\csname sin(\number#1)\endcsname
193                                     {\TG@rem@pt\dimen@}%
194   \fi}}
195 %    \end{macrocode}
196 % \end{macro}
198 % \begin{macro}{\CalculateCos}
199 % As above, but use the relation $\cos(x) = \sin(90-x)$.
200 %    \begin{macrocode}
201 \def\CalculateCos#1{{%
202   \expandafter\ifx\csname cos(\number#1)\endcsname\relax
203     \dimen@=\nin@ty\p@
204     \advance\dimen@-#1\p@
205     \TG@@sin
206     \expandafter\xdef\csname cos(\number#1)\endcsname
207                                      {\TG@rem@pt\dimen@}%
208   \fi}}
209 %    \end{macrocode}
210 % \end{macro}
212 % \begin{macro}{\TG@reduce}
213 % Repeatedly use one of the the relations
214 % $\sin(x)=\sin(180-x)=\sin(-180-x)$ to get $x$ in the range $-90 \leq
215 % x\leq 90$. Then call |\TG@series|.
216 %    \begin{macrocode}
217 \def\TG@reduce#1#2{%
218 \dimen@#1#2\nin@ty\p@
219   \advance\dimen@#2-\@clxx\p@
220   \dimen@-\dimen@
221   \TG@@sin}
222 %    \end{macrocode}
223 % \end{macro}
225 % \begin{macro}{\TG@@sin}
226 % Slightly cryptic, but it seems to  work\ldots
227 %    \begin{macrocode}
228 \def\TG@@sin{%
229   \ifdim\TG@reduce>+%
230   \else\ifdim\TG@reduce<-%
231   \else\TG@series\fi\fi}%
232 %    \end{macrocode}
233 % \end{macro}
235 % \begin{macro}{\UseSin}
236 % \begin{macro}{\UseCos}
237 % Use a pre-computed value.
238 %    \begin{macrocode}
239 \def\UseSin#1{\csname sin(\number#1)\endcsname}
240 \def\UseCos#1{\csname cos(\number#1)\endcsname}
241 %    \end{macrocode}
242 % \end{macro}
243 % \end{macro}
245 % A few shortcuts to save space.
246 % \changes{v1.10}{2016/01/03}{make these expand to digits so safe to use in ctm}
247 %    \begin{macrocode}
248 \def\z@num{0 }
249 \def\@tempa{1 }
250 \def\@tempb{-1 }
251 %    \end{macrocode}
253 %    \begin{macrocode}
254 \expandafter\let\csname sin(0)\endcsname\z@num
255 \expandafter\let\csname cos(0)\endcsname\@tempa
256 \expandafter\let\csname sin(90)\endcsname\@tempa
257 \expandafter\let\csname cos(90)\endcsname\z@num
258 \expandafter\let\csname sin(-90)\endcsname\@tempb
259 \expandafter\let\csname cos(-90)\endcsname\z@num
260 \expandafter\let\csname sin(180)\endcsname\z@num
261 \expandafter\let\csname cos(180)\endcsname\@tempb
262 %    \end{macrocode}
264 % A few more added in 1.10 (previously in pdftex.def)
265 %    \begin{macrocode}
266 \expandafter\let\csname sin(270)\endcsname\@tempb
267 \expandafter\let\csname cos(270)\endcsname\z@num
268 \expandafter\let\csname sin(360)\endcsname\z@num
269 \expandafter\let\csname cos(360)\endcsname\@tempa
270 \expandafter\let\csname sin(-180)\endcsname\z@num
271 \expandafter\let\csname cos(-180)\endcsname\@tempb
272 \expandafter\let\csname sin(-270)\endcsname\@tempa
273 \expandafter\let\csname cos(-270)\endcsname\z@num
274 \expandafter\let\csname sin(-360)\endcsname\z@num
275 \expandafter\let\csname cos(-360)\endcsname\@tempa
276 %    \end{macrocode}
278 % \begin{macro}{\CalculateTan}
279 % Originally I coded the Taylor series for tan, but it seems to be
280 % more accurate to just take the ratio of the sine and cosine.
281 % This is accurate to 4 decimal places for angles up to
282 % $50^\circ$, after that the accuracy tails off, giving
283 % 57.47894 instead of 57.2900 for $89^\circ$.
284 %    \begin{macrocode}
285 \def\CalculateTan#1{{%
286   \expandafter\ifx\csname tan(\number#1)\endcsname\relax
287     \CalculateSin{#1}%
288     \CalculateCos{#1}%
289     \@tempdima\UseCos{#1}\p@
290     \divide\@tempdima\@iv
291     \@tempdimb\UseSin{#1}\p@
292     \@tempdimb\two@fourteen\@tempdimb
293     \divide\@tempdimb\@tempdima
294     \expandafter\xdef\csname tan(\number#1)\endcsname
295                                         {\TG@rem@pt\@tempdimb}%
296   \fi}}
297 %    \end{macrocode}
298 % \end{macro}
300 % \begin{macro}{\UseTan}
301 % Just like |\UseSin|.
302 %    \begin{macrocode}
303 \def\UseTan#1{\csname tan(\number#1)\endcsname}
304 %    \end{macrocode}
305 % \end{macro}
307 % \begin{macro}{\two@fourteen}
308 % \begin{macro}{\@iv}
309 % two constants needed to keep the division within \TeX's range.
310 %    \begin{macrocode}
311 \mathchardef\two@fourteen=16384
312 \chardef\@iv=4
313 %    \end{macrocode}
314 % \end{macro}
315 % \end{macro}
317 % Predefine $\tan(\pm90)$ to be an error.
318 %    \begin{macrocode}
319 \expandafter\def\csname tan(90)\endcsname{\errmessage{Infinite tan !}}
320 \expandafter\let\csname tan(-90)\expandafter\endcsname
321                                        \csname tan(90)\endcsname
322 %    \end{macrocode}
324 %    \begin{macrocode}
325 %</package>
326 %    \end{macrocode}
328 % \Finale
330 \endinput