% \iffalse meta-comment % % by Stefan Höst 2007 % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either % version 1.2 of this license or (at your option) any later % version. The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.2 or later is part of all distributions of % LaTeX version 1999/12/01 or later. % % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{polynomial} %<*driver> \documentclass{ltxdoc} \usepackage{polynomial} \usepackage{amsmath} \usepackage{t1enc} \usepackage[a4paper,body={150mm,230mm}]{geometry} \def\labelitemi{$\blacktriangleright$} \def\labelitemii{$\triangleright$} \newdimen\tabsepadd \tabsepadd=2mm \EnableCrossrefs \CodelineIndex \RecordChanges \OnlyDescription \begin{document} \DocInput{polynomial.dtx} \end{document} % % \fi % \CheckSum{0} % \changes{v1.0}{2007/02/04}{Initial version} % \changes{v1.1}{2007/03/17}{Test} % \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ } % \title{The \textsf{polynomial.sty} package\thanks{Version 1.1, 2007/03/17}} % \author{Stefan Höst} % \date{} % \maketitle % \noindent % The package \texttt{polynomial.sty} offers an easy way to write % (univariate) polynomials and rational functions. It defines two commands, % one for polynomials \verb|\polynomial{coeffs}| and one for rational functions % \verb|\polynomialfrac{Numerator}{Denominator}|. The first of them, % \verb|\polynomial|, prints a polynomial with the coefficients in the % comma separated list of the argument. The second, \verb|\polynomialfrac|, % prints a fraction of two polynomials. There is also an optional % argument to the commands that changees the properties of the % polynomials. The default values can be changed % by the command \verb|\polynomialstyle|. In the following the commands % are described by a set of explained examples. % The coefficients of the polynomials are given as a comma separated % lists. If a coefficient is a zero it is not printed, and if it is 1 % only the monomial is printed. By default there is a plus in % between two terms, but if the first character of the coefficient is % minus it is changed to minus. % \par\strut\par % \noindent % \textbf{Examples:} % \newline\strut % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial{1,2,3,4,5}| % & $\polynomial{1,2,3,4,5}$\\[\tabsepadd] % \verb|\polynomial{3,35,0,0,45}| % & $\polynomial{3,35,0,0,45}$\\[\tabsepadd] % \verb|\polynomial{c_0,-c_1,c_2,-c_3,c_4}| % & $\polynomial{c_0,-c_1,c_2,-c_3,c_4}$\\[\tabsepadd] % \verb|\polynomial{0,0,0,1,-1,1,0,1,0,0,1,0,0}| % & $\polynomial{0,0,0,1,-1,1,0,1,0,0,1,0,0}$\\[\tabsepadd] % \verb|\polynomial{-3,A\sin(\alpha t), e^{j\phi},|\newline % \verb| \left(\sum_{k=0}^{\infty}a^k\right)}| % & $\displaystyle\polynomial{-3,A\sin(\alpha t),e^{j\phi}, % \left(\sum_{k=0}^{\infty}a^k\right)}$\\[\tabsepadd] % \verb|\polynomialfrac{a,b,c,-d,e}{f,g,h,i}| % & $\displaystyle\polynomialfrac{a,b,c,-d,e}{f,g,h,i}$ % \end{tabular} % \par\strut\par % There is a set of variables that can be used in an optional % argument, using the keyval-style. By default the the exponents % increases from left to right. There are two Boolean variables, % \verb|falling| and \verb|reciprocal|, that change this. Both are used % as \verb|falling=true| or \verb|falling=false|. The default is % \verb|true| for both variables, meaning, e.g., that \verb|falling| is % the same as the first variant. The difference between the commands % is that the first uses decreasing exponents from left to right instead % of increasing, while the second uses increasing exponents from right % to left (hence giving the reciprocal polynomial). If both are true the % polynomial will be written with decreasing exponents from right to % left. % \par\strut\par % \noindent % \textbf{Examples:} % \newline\strut % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial[falling]{a,b,c,-d,e}| % & $\polynomial[falling]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[reciprocal]{a,b,c,-d,e}| % & $\polynomial[reciprocal]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[reciprocal,falling]{a,b,c,-d,e}| % & $\polynomial[reciprocal,falling]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomialfrac[falling]{a,b,c,-d,e}{f,g,h,i}| % & $\displaystyle\polynomialfrac[falling]{a,b,c,-d,e}{f,g,h,i}$\\[\tabsepadd] % \verb|\polynomialfrac[reciprocal]{a,b,c,-d,e}{f,g,h,i}| % & $\displaystyle\polynomialfrac[reciprocal]{a,b,c,-d,e}{f,g,h,i}$ % \end{tabular} % \par\strut\par % It is also possible to change the polynomial variable through the % optional argument \verb|var=|. The starting value of the % exponents can be changed through \verb|start=|. There is also a % variable \verb|step=| that changes the incrementation steps of the % exponents. % \par\strut\par % \noindent % \textbf{Examples:} % \newline\strut % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial[var=t]{a,b,c,-d,e}| % & $\polynomial[var=t]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[var=\Phi,start=2]{a,b,c,-d,e}| % & $\polynomial[var=\Phi,start=2]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[var=z,falling]{a,b,c,-d,e}| % & $\polynomial[var=z,falling]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomialfrac[var=\varphi,reciprocal,start=-3]|\newline % \verb| {a,b,c,-d,e}{f,g,h,i}| % & $\displaystyle\polynomialfrac[var=\varphi,reciprocal,start=-3] % {a,b,c,-d,e}{f,g,h,i}$\\[\tabsepadd] % \verb|\polynomial[step=3,var=\pi]{a,b,c,-d,e}| % & $\polynomial[step=3,var=\pi]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[step=2,reciprocal,falling,start=3]|\newline % \verb| {a,b,c,-d,e}| % & $\polynomial[step=2,reciprocal,falling,start=3]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[step=-3,start=2]{a,b,c,-d,e}| % & $\polynomial[step=-3,start=2]{a,b,c,-d,e}$\\[\tabsepadd] % \end{tabular} % \par\strut\par % Sometimes, it is desirable to use other addition and subtraction % symbols than the default. This is done by the variables \verb|add| and % \verb|sub|. If the first coefficient is negative this will also have % the subtraction sign specified in \verb|sub|. In some cases the % additive inverse is denoted by a normal minus, while the % subtraction (if defined) something else, e.g., $\ominus$. For this % purpose there is a third variable \verb|firstsub|. % \par\strut\par % \noindent % \textbf{Examples:} % \newline\strut % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial[add=\oplus,sub=\ominus]|\newline % \verb| {a,-b,c,-d,e}| % & $\polynomial[add=\oplus,sub=\ominus]{a,-b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[add=\oplus,sub=\ominus]|\newline % \verb| {-a,b,-c,d,-e}| % & $\polynomial[add=\oplus,sub=\ominus]{-a,b,-c,d,-e}$\\[\tabsepadd] % \verb|\polynomial[add=\oplus,sub=\ominus,firstsub=-]|\newline % \verb| {-a,b,-c,d,-e}| % & $\polynomial[add=\oplus,sub=\ominus,firstsub=-]{-a,b,-c,d,-e}$ % \end{tabular} % \par\strut\par % All of the above variables can be set either for individual % commands, as shown, or for the rest of the document with the command % \verb|\polynomialstyle|. In this case there is also an option that % resets all values to the starting values, called \verb|default|. % \par\strut\par % \noindent % \textbf{Examples:} % \newline\strut % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial{a,b,c,-d,e}| % & $\polynomial{a,b,c,-d,e}$ % \end{tabular}\vspace*{\tabsepadd}\newline % \verb|\polynomialstyle{var=z,falling}| % \polynomialstyle{var=z,falling}\vspace*{\tabsepadd}\newline % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial{a,b,c,-d,e}| % & $\polynomial{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[reciprocal]{a,b,c,-d,e}| % & $\polynomial[reciprocal]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomial[start=3,falling=false]{a,b,c,-d,e}| % & $\polynomial[start=3,falling=false]{a,b,c,-d,e}$\\[\tabsepadd] % \verb|\polynomialfrac{a,b,c,-d,e}{f,g,h,i}| % & $\displaystyle\polynomialfrac{a,b,c,-d,e}{f,g,h,i}$ % \end{tabular}\vspace*{\tabsepadd}\newline % \verb|\polynomialstyle{add=\oplus,sub=\ominus}| % \polynomialstyle{add=\oplus,sub=\ominus}\vspace*{\tabsepadd}\newline % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial{a,b,c,-d,e}| % & $\polynomial{a,b,c,-d,e}$ % \end{tabular}\vspace*{\tabsepadd}\newline % \verb|\polynomialstyle{default}| % \polynomialstyle{default}\vspace*{\tabsepadd}\newline % \begin{tabular}{@{}p{0.6\linewidth}p{0.4\linewidth}} % \verb|\polynomial{a,b,c,-d,e}| % & $\polynomial{a,b,c,-d,e}$ % \end{tabular} % \StopEventually{} %%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% polynomial.sty %% %% v1.1 %% 2007-03-17 %% %% Stefan Höst %% (stefan.host@it.lth.se) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Problems: %% * Very long numbers in coefficient result in overflow. %% %% Fixes %% 2007-03-17: Removed allocation of counter for each call of \polynomial. %% 2007-03-17: Replaced some other counters with \def. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Counters \newcount\shpol@numcoeff% Number of coeffs parsed \newcount\shpol@coeffnum% loop var for coeffs \newcount\shpol@exponent% loop var for exponents (not same as coeffnum) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ifs \newif\if@shpol@firstterm% If first term no '+' \newif\if@shpol@falling% If exponents falling \newif\if@shpol@reciprocal% If reciprocal %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% variables \def\shpol@var{x}% keyval: poly var %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% keyval \RequirePackage{keyval} %% in function \define@key{shpol}{start}[0]{\def\shpol@start{#1}}%{\shpol@start=#1} \define@key{shpol}{var}[x]{\def\shpol@tmpvar{#1}} \define@key{shpol}{step}[1]{\def\shpol@expstep{#1}}%{\shpol@expstep=#1} \define@key{shpol}{falling}[true]{\csname @shpol@falling#1\endcsname} \define@key{shpol}{reciprocal}[true]{\csname @shpol@reciprocal#1\endcsname} \define@key{shpol}{add}[+]{\def\shpol@add{#1}} \define@key{shpol}{sub}[-]{\def\shpol@sub{#1}\def\shpol@firstsub{#1}} \define@key{shpol}{firstsub}[-]{\def\shpol@firstsub{#1}} %% default values \define@key{shpoldefault}{start}[0]{\def\shpol@start{#1}}%{\shpol@start=#1} \define@key{shpoldefault}{var}[x]{\def\shpol@var{#1}} \define@key{shpoldefault}{step}[1]{\def\shpol@expstep{#1}}%{\shpol@expstep=#1} \define@key{shpoldefault}{falling}[true]{\csname @shpol@falling#1\endcsname} \define@key{shpoldefault}{reciprocal}[true]{\csname @shpol@reciprocal#1\endcsname} \define@key{shpoldefault}{add}[+]{\def\shpol@add@default{#1}} \define@key{shpoldefault}{sub}[-]{% \def\shpol@sub@default{#1}\def\shpol@firstsub@default{#1}} \define@key{shpoldefault}{firstsub}[-]{\def\shpol@firstsub@default{#1}} %% \define@key{shpoldefault}{default}[true]{% \setkeys{shpoldefault}{start,var,step,falling=false,reciprocal=false,add,sub,firstsub}} \setkeys{shpoldefault}{default} \def\polynomialstyle#1{\setkeys{shpoldefault}{#1}} %%%%%%%%%%%%%%%%%%%%%%%% %% help defs \def\shpol@splitcoeff#1{\shpol@@splitcoeff#1\@nil} \def\shpol@@splitcoeff#1#2\@nil{% \def\shpol@firstofcoeff{#1}% \def\shpol@restofcoeff{#2} } \def\shpol@minus{-} %% If #1 is a number that is =1 then #2 else #3 %% see www.tex.ac.uk/cgi-bin/texfaq2html?label=isitanum \def\if@@one#1#2#3{% \ifcat_\ifnum1=0#1 _\else A\fi #2\else #3\fi} %% If #1 a number that is =0 then #2 else #3 \def\if@@zero#1#2#3{% \ifcat_\ifnum0=0#1 _\else A\fi #2\else #3\fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% set one term in polynomial \def\shpol@setterm[#1]#2#3{% [variable]{koefficient}{exponent} \def\@shpol@koeff{#2} %% To make it more clear \ifnum#3=0 %% x^0 \@shpol@koeff \else \if@@one{#2}{}{\@shpol@koeff} #1 \ifnum#3=1\else ^{#3} \fi \fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\shpol@getcoeff#1{% Pars the coeffs and store in #1-vars \shpol@numcoeff=0% \@for\shpol@coeff:=#1\do{% \advance\shpol@numcoeff by 1\relax% \expandafter\let\csname shpol@coeff\romannumeral\shpol@numcoeff\endcsname\shpol@coeff% }% } \def\shpol@writepoly{% Write the #1-vars as polynomial \shpol@coeffnum=1 \shpol@exponent=0 \if@shpol@reciprocal \if@shpol@falling \advance\shpol@exponent by -\shpol@numcoeff \advance\shpol@exponent by 1 \else \advance\shpol@exponent by \shpol@numcoeff \advance\shpol@exponent by -1 \fi \multiply\shpol@exponent by \shpol@expstep \fi \advance\shpol@exponent by \shpol@start \loop% \expandafter\let\expandafter\shpol@coeff% \csname shpol@coeff\romannumeral\shpol@coeffnum\endcsname \if@@zero{\shpol@coeff}{}{% coeff not zero %% Check if first char is '-'. Then remove it and replace + with -. \expandafter\shpol@splitcoeff\expandafter{\shpol@coeff} \ifx\shpol@firstofcoeff\shpol@minus \if@shpol@firstterm\shpol@firstsub\else\shpol@sub\fi \let\shpol@coeff\shpol@restofcoeff \else \if@shpol@firstterm\else\shpol@add\fi \fi %%\fi \@shpol@firsttermfalse \shpol@setterm[\shpol@tmpvar]% {\shpol@coeff}% {\the\shpol@exponent}% } \ifnum\shpol@coeffnum<\shpol@numcoeff \advance\shpol@coeffnum by 1\relax% \advance\shpol@exponent by \if@shpol@falling \if@shpol@reciprocal \shpol@expstep \else -\shpol@expstep \fi \else \if@shpol@reciprocal -\shpol@expstep \else \shpol@expstep \fi \fi\relax% \repeat } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\shpol@defaultvalues{% Set default values for keyval \let\shpol@tmpvar\shpol@var \let\shpol@add\shpol@add@default \let\shpol@sub\shpol@sub@default \let\shpol@firstsub\shpol@firstsub@default \@shpol@firsttermtrue } \def\polynomial{% \shpol@defaultvalues \@ifnextchar[%] {\opt@shpol@polynomial}{\shpol@polynomial}} \def\opt@shpol@polynomial[#1]{% \setkeys{shpol}{#1} \shpol@polynomial} \def\shpol@polynomial#1{% \shpol@getcoeff{#1} \shpol@writepoly } \def\polynomialfrac{% \@ifnextchar[%] {\opt@shpol@rational}{\@shpol@rational}} \def\@shpol@rational#1#2{% \frac{\polynomial{#1}}{\polynomial{#2}}} \def\opt@shpol@rational[#1]#2#3{% \frac{\polynomial[#1]{#2}}{\polynomial[#1]{#3}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput % \Finale