diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex')
-rw-r--r-- | Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex new file mode 100644 index 00000000000..64332eca3ed --- /dev/null +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-math-algorithms.tex @@ -0,0 +1,74 @@ +% Copyright 2007 by Mark Wibrow +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + + +\section[Reimplementing the Computations of the Mathematical Engine] + {Reimplementing the Computations of the\\ Mathematical Engine} + +\label{pgfmath-reimplement} + +Perhaps you are not satisfied with the Maclaurin series for +$e^x$. Perhaps you have a fantastically more accurate +and efficient way of calculating the sine or cosine of angles. Perhaps + you would like the library to interface with a package such as |fp| + for fixed-point arithmetic (but note that |fp| is \emph{very} slow). +In these case you will want to replace the current implementations of +the computations done by the mathematical engine by your own code. + +The mathematical engine was designed with such a replacement in +mind. For this reason, the operations and functions like |\pgfmathadd| +are implemented in the following manner: + +\begin{itemize} +\item |\pgfmath|\meta{function name} + + This macro is the ``public'' interface for the function + \meta{function name}. All arguments passed to this macro are + evaluated using |\pgfmathparse| and then passed on to the following + function: + +\item |\pgfmath|\meta{function name}|@| + + This macro is the ``non-public'' implementation of the functions + algorithm (but note that, for speed, the parser calls this macro + rather than the ``public'' one). Arguments passed to this macro + are expected to be numbers \emph{without units}. This is the macro + which should be rewritten with your prize-winning new algorithm. + +\end{itemize} + +The effect of |\pgfmath|\meta{function name}|@| should be to set the +macro |\pgfmathresult| to the correct value (namely to the result of +the computation without units). Furthermore, the function should have +no other side effects, that is, it should not change any global +values. One way to achieve this is to use the following code: + +\begin{codeexample}[code only] +\def\pgfmath...@#1#2...{% + \begingroup% + ... code for algorithm XXX ... + \pgfmath@returnone\pgfmath@x% + \endgroup% +} +\end{codeexample} + + +The macro |\pgfmath@returnone<macro>| uses some |\aftergroup| magic to +save result of the algorithm, by defining |\pgfmathresult| as the +expansion of |<macro>| \emph{without units}. |<macro>| can be a macro +containing a number (with or without units), or a dimension or count +(or possibly a skip) register. By performing the algorithm within a +\TeX{} group, \pgfname{} registers such as |\pgf@x|, |\pgf@y| and +|\c@pgf@counta|, |\c@pgfcountb|, and so forth can be used at will. +Note that current the implementation uses |\pgfmath@x|, |\pgfmath@y|, +and |\c@pgfmath@counta|, |\c@pgfmath@countb| throughout, so for +consistency these should be employed. Whilst they are currently |\let| +to their \pgfname{} equivalents (see |pgfmathutil.code.tex|), this +could change (as could the \pgfname{} registers), so keeping things +consistent is probably a good idea.
\ No newline at end of file |