% \iffalse meta comment % File: numprint032.dtx Copyright (C) 2000--2004 Harald Harders % \fi % % \iffalse % %<*package> \def\packagename{numprint} \def\nprtfileversion{0.32} \def\nprtfiledate{2003/09/18} \def\nprtdocdate{2003/09/18} % %<*driver> \documentclass{ltxdoc} \IfFileExists{numprint.sty}{\usepackage{numprint} \let\numprintSTYfound\active}{\GenericWarning{numprint.dtx}{Package file numprint.sty not found (Documentation will be messed up!^^J^^A Generate numprint.sty by (La)TeXing numprint.ins, process numprint.dtx again)^^J}\stop} \usepackage{longtable} \title{The \texttt{numprint} package\thanks{This file has version \nprtfileversion\ last revised \nprtfiledate, documentation dated \nprtdocdate.}} \author{Harald Harders\\\texttt{harald.harders@gmx.de}} \date{File Date \nprtfiledate, Printed \today} \npdecimalsign{.}% \newlength{\tempdima}% \makeatletter \renewenvironment{table}[1][]{% \@float{table}[#1]% \centering% \setlength{\tempdima}{\abovecaptionskip}% \setlength{\abovecaptionskip}{\belowcaptionskip}% \setlength{\belowcaptionskip}{\tempdima}% }{% \end@float } \makeatother \EnableCrossrefs \CodelineIndex \DoNotIndex{\def,\edef,\let,\newcommand,\newenvironment,\newcounter} \DoNotIndex{\setcounter,\space,\if,\else,\fi,\empty,\@empty,\ifx,\fi} \DoNotIndex{\ifnum,\fi,\expandafter} \CodelineNumbered \RecordChanges %\CheckSum{1016} \begin{document} \DocInput{numprint.dtx} \end{document} % % \fi % % \changes{0.01}{2000/08/30}{Changed to dtx format} % \changes{0.08}{2001/01/08}{Preceed ``np'' to some commands due to % incompatibility with babel french} % % \maketitle % \begin{abstract} % \noindent This package prints numbers with a separator every three % digits and it convert numbers given as |12345.6e789| to % $12\,345{,}6\cdot 10^{789}$. % The decimal sign, the thousand separator, as well as the product % sign can be changed by the user, e.g. to reach % $12{,}345.6\times 10^{789}$. % If an optional argument is given it is printed upright as unit. % \changes{0.21}{2003/02/25}{Abstract changed} % \end{abstract} % % \tableofcontents % % \section*{Copyright} % Copyright 2000--2004 Harald Harders. % % This program can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % % \section{The user interface} % % To use this package place % \begin{verbatim} %\usepackage{numprint} % \end{verbatim} % in the preamble of your document. No options are necessary. % % \subsection{Print numbers in text and math mode} % % \DescribeMacro{\numprint}% % The package provides the command \verb|\numprint[#1]{#2}| that prints % the number given in the required argument. The number is printed in the % active mode (math or text) so that an eventual chosen difference % between mathematical and text numbers stays visible (e.g. by using % the eco-package. % % Numbers may contain of these characters: % ``|+-\pm0123456789.,eE|''. Either a ``,'' or a ''.'' can be used as % decimal sign. No thousand separators are allowed in the % argument. ``E'' or ``e'' is converted to $\cdot 10^{x}$. % |\pm| produces a $\pm$. % \changes{0.20}{2003/02/24}{Added support for $\pm$ sign}% % From version 0.30 on, \cs{numprint} is stricter with the argument. % It tests wheather the argument contains of supported characters % only. % % For example typing % \begin{verbatim} %\numprint{-123456}; \numprint[N/mm^2]{-123456}; \numprint{3,1415927e-3.1} % \end{verbatim} % leads to ``\numprint{-123456}; \numprint[N/mm^2]{-123456}; % \numprint{3,1415927e-3.1}''. Notice % that ``.'' and ``,'' can be mixed within one number. % % If no number is given before the exponential character ``e'' % resp. ``E'' a pure exponential format is generated. % For example typing % \begin{verbatim} %\numprint{e4.3242} % \end{verbatim} % leads to ``\numprint{e4.3242}''. % \changes{0.04}{2001/03/06}{Added support for pure $10^x$ format}% % % \changes{0.02}{2000/08/30}{Added optional argument for units}% % If the optional argument is given it is printed as a unit in math % mode with an upright font (\verb|\mathrm|). The space between the % number and the unit is \verb|\,| by default. It can be changed using % the command |\npunitseparator|. % % \DescribeMacro{\npthousandsep}% % \DescribeMacro{\npthousandthpartsep}% % \DescribeMacro{\npdecimalsign}% % \DescribeMacro{\npproductsign}% % By using the three commands \verb|\npthousandsep{#1}|, % \verb|\npdecimalsign{#1}|, and % \verb|\npproductsign{#1}|\footnote{These command did not have the % ``np'' in older versions. This had to be changed in order to avoid % an incompatibiliby with the french language of babel.} several % separators can be changed. E.g. % \begin{verbatim} %\npdecimalsign{\ensuremath{\cdot}}\npthousandsep{,}\npproductsign{\times}% %\numprint{-123456}; \numprint{3,1415927e-3.1} % \end{verbatim} % leads to ``{\npdecimalsign{\ensuremath{\cdot}}% % \npthousandsep{,}\npproductsign{\times}% % \numprint{-123456}; \numprint{3,1415927e-3.1}}''. % % \DescribeMacro{\global}% % These commands change the behaviour of the \verb|\numprint| command % only locally (inside the current group). By preceding \verb|\global| % the change can be made global inside a group. For example: % \begin{verbatim} %Local: %\numprint{123e4}, %{\npproductsign{\times}\numprint{123e4}}, %\numprint{123e4}. %Global: %\numprint{123e4}, %{\global\npproductsign{\times}\numprint{123e4}}, %\numprint{123e4} % \end{verbatim} % leads to the following: % % \noindent Local: % \numprint{123e4}, % {\npproductsign{\times}\numprint{123e4}}, % \numprint{123e4}. % Global: % \numprint{123e4}, % {\global\npproductsign{\times}\numprint{123e4}}, % \numprint{123e4} % \npproductsign{\cdot} % % The current version has the following defaults: % \begin{verbatim} %\npthousandsep{\,} %\npthousandthpartsep{\,} %\npdecimalsign{,} %\npproductsign{{}\cdot{}} %\npunitseparator{\,} % \end{verbatim} % These will surely change in a new version when I add automatic % international support. Then the defaults will by language dependent. % % \changes{0.31}{2003/09/16}{Describe automatic language-dependent % switch of decimal sign}% % If you are using the |babel| package you may reach an automatic % change of the parameters by using the \cs{addto} command of |babel|, % e.g.: % \begin{verbatim} %\addto\extrasenglish{% % \npthousandsep{,}% % \npthousandthpartsep{,}% % \npdecimalsign{.}% % \npproductsign{{}\times{}}% %} %\addto\extrasngerman{% % \npthousandsep{\,}% % \npthousandthpartsep{\,}% % \npdecimalsign{,}% % \npproductsign{{}\cdot{}}% %} % \end{verbatim} % % \subsection{Change the behaviour} % \subsubsection{Eliminate separators for four-digit numbers} % % \DescribeMacro{\fourdigitsep}% % \DescribeMacro{\fourdigitnosep}% % \changes{0.06}{2002/09/18}{Add description for not separating four % digit numbers}% % Some people want numbers with four digits not to be devided by a % thousand separator. % This can be achieved using the command |\fourdigitnosep|. % You can switch back to separating with |\fourdigitsep|. % An example: % \begin{verbatim} %\fourdigitnosep$\numprint{1234.1234}$, $\numprint{12345.12345}$ -- %\fourdigitsep$\numprint{1234.1234}$, $\numprint{12345.12345}$ % \end{verbatim} % Leads to % ``\fourdigitnosep$\numprint{1234.1234}$, $\numprint{12345.12345}$ -- % \fourdigitsep$\numprint{1234.1234}$, $\numprint{12345.12345}$''. % Default values can be set by the package options |sepfour| and % |nosepfour|. % % If a number has four digits before the decimal sign, but more than % four digits after it, or vice versa, the fourth digit is seperated % \emph{before and after} the digital sign for consistency. % An example: % \begin{verbatim} %\fourdigitnosep$\numprint{1234.1234}$, $\numprint{1234.12345}$, %$\numprint{12345.1234}$ % \end{verbatim} % Leads to % ``\fourdigitnosep$\numprint{1234.1234}$, $\numprint{1234.12345}$, % $\numprint{12345.1234}$''. % % \subsubsection{Add missing zeros before or after decimal sign} % % \DescribeMacro{\addmissingzero}% % \DescribeMacro{\noaddmissingzero}% % \changes{0.06}{2002/09/18}{Add handling for missing numbers before % and after decimalsign}% % Sometimes people let out a leading zero or a zero after the % decimalsign, e.g. |123.| or |.123|. % Numprint can add the left out zero, when |\addmissingzero| is % used. This behaviour can be switched of with |\noaddmissingzero|. % Corresponding package options are |addmissingzero| and % |noaddmissinzero|. Default is |addmissingzero|. % % % \subsubsection[Rounding numbers]{Rounding numbers\footnote{This was % an idea of Tilman Finke, tfinke@it-and-law.de}}% % \changes{0.30}{2003/05/19}{Add rounding of numbers}% % % \DescribeMacro{\nprounddigits}% % \DescribeMacro{\nproundexpdigits}% % \DescribeMacro{\npnoround}% % \DescribeMacro{\npnoroundexp}% % By default, as many digits are printed after the decimal sign, as % the \cs{numprint} command gets as argument. % This behaviour can be changed to print a given number of digits % where the number is rounded resp.\ filled with zeros. % % This can be switched of using the % \cs{nprounddigits\{\meta{\normalfont digits}\}} command for ordinary % numbers and the \cs{nproundexpdigits\{\meta{\normalfont digits}\}} % command for exponents. % Rounding is switched off with \cs{npnoround} resp.\ % \cs{npnoroundexp}. % For example, % \begin{verbatim} %\nprounddigits{2}$\numprint{1.123}$, $\numprint{1.149}$, %$\numprint{1}$, $\numprint{9.999}$ $\numprint{-9.999}$ -- %\npnoround$\numprint{1.123}$, $\numprint{1.149}$, %$\numprint{1}$, $\numprint{9.999}$ $\numprint{-9.999}$ % \end{verbatim} % leads to % ``\nprounddigits{2}$\numprint{1.123}$, $\numprint{1.149}$, % $\numprint{1}$, $\numprint{9.999}$ $\numprint{-9.999}$ -- % \npnoround$\numprint{1.123}$, $\numprint{1.149}$, % $\numprint{1}$, $\numprint{9.999}$ $\numprint{-9.999}$'' % % \DescribeMacro{\npreplacenull}% % \DescribeMacro{\npprintnull}% % For amounts of money, sometimes a zero after the decimal sign is % replaced by different signs, as for example ``---''. % If rounding is switched on, this can be done by calling % \cs{npreplacenull\{\meta{\normalfont replacement}\}}, e.g. % \begin{verbatim} %\npreplacenull{\mbox{---}} % \end{verbatim} % Here, \cs{mbox} guarantees that ``---'' is printed in text mode. % It can be switched off using \cs{npprintnull}. % % % \subsection{Print aligned numbers in tabulars}% % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular % entries}% % % The aim of this function is to combine the functionality of the % \verb|dcolumn| package with this one. This has not been achieved by % this version. But a first step is done. % % \DescribeMacro{columntype n} % \DescribeMacro{columntype N} % This package defines two new column types \verb|n| and \verb|N|. The % first one alignes the base number to the decimal sign, the second % additionaly alignes the exponent. % Use these commands like follows: % \begin{verbatim} %\begin{tabular}{|n{5}{3}|N{5}{3}{3}|} % \hline % \numprint{123.45e12.12}& \numprint{123.45e12.12}\\ % \numprint{12345.678e123.123}& \numprint{12345.678e123.123}\\ % \hline %\end{tabular} % \end{verbatim} % This leads to\par % \begin{tabular}{|n{5}{3}|N{5}{3}{3}|} % \hline % \numprint{123.45e12.12}& \numprint{123.45e12.12}\\ % \numprint{12345.678e123.123}& \numprint{12345.678e123.123}\\ % \hline % \end{tabular} % % The first option defines the number of digits before the decimal % sign, the second the number after. % In case of the type \verb|N| the third option defines the number of % digits before the decimal sign in the exponent. % Unfortunately the number of digits can not be calculated % automatically. % Notice that the command \verb|\numprint| has to be written again in % each tabular entry. This will hopefully be changed in a future version. % % \section{To Do} % % \begin{itemize} % \item Add automatic international support using babel, german, or ngerman: % % German: \npdecimalsign{,}\npthousandsep{\,}\npproductsign{\cdot}% % \numprint{3,1415927e-3.1} % % American: \npdecimalsign{.}\npthousandsep{,}\npproductsign{\times}% % \numprint{3,1415927e-3.1} % \item Combine the packages dcolumn and numprint. % \item Fix spacing in aligned exponents (spacing is too large). % \end{itemize} % % \StopEventually{\PrintChanges \PrintIndex} % % % \section{The implementation} % \iffalse %<*package> % \fi % Heading of the package: % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{numprint032}[\nprtfiledate\space v\nprtfileversion\space Print numbers] \message{Package `numprint032', Version \nprtfileversion\space of \nprtfiledate.} \message{Compatiblity version of numprint for versions prior 1.00} % \end{macrocode} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % Load package calc.sty for calculating widths of boxes. % \begin{macrocode} \RequirePackage{calc} % \end{macrocode} % Load package array.sty for the new column types. % \begin{macrocode} \RequirePackage{array} % \end{macrocode} % Define a boolean if the first digit is separated in a four digit % number. Default is true for compatibility with older versions. % \begin{macrocode} \newif\if@numsepfour % \end{macrocode} % Define a command which helds the zero to be added if necessary. % \begin{macrocode} \newcommand\@addmissingzero{} % \end{macrocode} % \begin{macro}{\fourdigitsep} % Switch separating of the fourth digit on. % \begin{macrocode} \newcommand*{\fourdigitsep}{\@numsepfourtrue}% % \end{macrocode} % \end{macro} % \begin{macro}{\fourdigitnosep} % Switch separating of the fourth digit off. % \begin{macrocode} \newcommand*{\fourdigitnosep}{\@numsepfourfalse}% % \end{macrocode} % \end{macro} % \begin{macro}{\addmissingzero} % \changes{0.06}{2002/09/18}{Add handling for missing numbers before % and after decimalsign}% % Add a missing zero before or after decimalsign. % \begin{macrocode} \newcommand*{\addmissingzero}{\def\@addmissingzero{0}}% % \end{macrocode} % \end{macro} % \begin{macro}{\noaddmissingzero} % Don't add a missing zero before or after decimalsign. % \begin{macrocode} \newcommand*{\noaddmissingzero}{\def\@addmissingzero{}}% % \end{macrocode} % \end{macro} % Declare options. \verb|nosepfour| switches seperating of the fourth % digit off, \verb|sepfour| switches it on. Default is on four % compatibility reasons with older versions. % \begin{macrocode} \DeclareOption{nosepfour}{\fourdigitnosep} \DeclareOption{sepfour}{\fourdigitsep} \DeclareOption{noaddmissingzero}{\noaddmissingzero} \DeclareOption{addmissingzero}{\addmissingzero} \ExecuteOptions{sepfour,addmissingzero} \ProcessOptions\relax % \end{macrocode} % Define commands to change the output of the \verb|\numprint| % command. % % \begin{macro}{\npdecimalsign} % Change the decimal sign. In English it is normally ``.'', in German % ``,''. % The additional pair of braces \verb|{}| prevents from inserting % additional space in math mode, e.g. $1,2$ versus $1{,}2$. % \begin{macrocode} \newcommand{\npdecimalsign}[1]{\def\nprt@decimal{{#1}}} % \end{macrocode} % \end{macro} % \begin{macro}{\npthousandsep} % Change the thousand separator. In English it often is ``,'', in % German ``.'' or ``\,'' (\verb|\,|). % Here again the additional \verb|{}| is used as above. % This command changes both the sign before and after the comma. If % you want a different sign after the comma you have to call % \verb|\npthousandthpartsep| after \verb|\npthousandsep|. % \begin{macrocode} \newcommand{\npthousandsep}[1]{\def\nprt@thousand{{#1}}% \def\nprt@thousandthpart{{#1}}} % \end{macrocode} % \end{macro}% % \begin{macro}{\npthousandthpartsep} % \begin{macrocode} \newcommand{\npthousandthpartsep}[1]{\def\nprt@thousandthpart{{#1}}} % \end{macrocode} % \end{macro} % \begin{macro}{\npproductsign} % Change the product sign that is printed in numbers with exponent % like $\numprint{123e4}$. Normally it is \verb|\cdot|. In American % texts sometimes \verb|\times|. % The two pairs of braces \verb|{}| ensure the correct spacing on the % left and right side of the product sign, e.g. 3$\cdot$4 versus % 3${}\cdot{}$4. % \begin{macrocode} \newcommand{\npproductsign}[1]{\def\nprt@prod{\ensuremath{{}#1{}}}} % \end{macrocode} % \end{macro} % \begin{macro}{\npunitseparator} % Change the separator between number an unit. % Here again the additional \verb|{}| is used as above. % \changes{0.03}{2001/02/10}{Fixed bug with units}% % \begin{macrocode} \newcommand{\npunitseparator}[1]{\def\nprt@unitsep{{#1}}} % \end{macrocode} % \end{macro} % Set the default values for the separators. They will surely change % in a new version with automatic international support. At the moment % the defaults match the German language. % \begin{macrocode} \npthousandsep{\,}% \npthousandthpartsep{\,}% \npdecimalsign{,}% \npproductsign{{}\cdot{}}% \npunitseparator{\,}% % \end{macrocode} % \changes{0.30}{2003/05/19}{Add rounding of numbers}% % \begin{macro}{\@fillnull} % Defines command |#1| with a number of |#2| zeros filled. % \begin{macrocode} \def\@fillnull#1#2{% \@tempcnta=0 \loop \g@addto@macro{#1}{0}% \advance\@tempcnta by 1 \ifnum\@tempcnta<#2 \repeat } % \end{macrocode} % \end{macro} % \begin{macro}{\nprounddigits} % Define a command that sets a count of digits after which the number % is rounded. % This command defines \cs{nprt@rounddigits} that stores the count and % \cs{nprt@roundnull} that contains of \cs{nprt@rounddigits} ``0'' % digits. % \begin{macrocode} \newcommand\nprounddigits[1]{% \def\nprt@rounddigits{#1}% \def\nprt@roundnull{}% \@fillnull{\nprt@roundnull}{#1}% } % \end{macrocode} % \end{macro} % \begin{macro}{\npnoround} % A command to switch off rounding. % \begin{macrocode} \newcommand\npnoround{\nprounddigits{-1}} % \end{macrocode} % \end{macro} % Don't round by default. % \begin{macrocode} \npnoround % \end{macrocode} % \begin{macro}{\nproundexpdigits} % \begin{macro}{\npnoroundexp} % The same for exponents. % \begin{macrocode} \newcommand\nproundexpdigits[1]{% \def\nprt@roundexpdigits{#1}% \def\nprt@roundexpnull{}% \@fillnull{\nprt@roundexpnull}{#1}% } \newcommand\npnoroundexp{\nproundexpdigits{-1}} \npnoroundexp % \end{macrocode} % \end{macro} % \end{macro} % \changes{0.30}{2003/05/19}{Optionally replace zero after decimal sign}% % \begin{macro}{\npreplacenull} % Optionally, one or more zeros after the decimal sign can be replaced % by other text, e.g.\ ``---'''. % \begin{macrocode} \newcommand\npreplacenull[1]{\def\nprt@replacenull{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\npprintnull} % Switch off replacement, again. % \begin{macrocode} \newcommand\npprintnull{\let\nprt@replacenull=\@empty} % \end{macrocode} % \end{macro} % Print the zero by default. % \begin{macrocode} \npprintnull % \end{macrocode} % Define the signs as commands. This is necessary to be able to % compare them with other characters. % \changes{0.20}{2003/02/24}{Added support for $\pm$ sign}% % \begin{macrocode} \def\nprt@plus@test{+} \def\nprt@minus@test{-} \def\nprt@plusminus@test{\pm} % \end{macrocode} % Define commands for printing the signs in math mode. This ensures % that the printed signs really are signs and not hyphens. Compare % ``-'' to ``\ensuremath{-}''. % \changes{0.20}{2003/02/24}{Added support for $\pm$ sign}% % \begin{macrocode} \def\nprt@plus{\ensuremath{+}} \def\nprt@minus{\ensuremath{-}} \def\nprt@plusminus{\ensuremath{\pm}} % \end{macrocode} % \begin{macro}{\nprt@printdigit} % Print a digit. If this digit is a sign (\verb|+| or \verb|-|) it is % printed in math mode, else it is printed in the active mode. % \begin{macrocode} \def\nprt@printdigit#1{% \def\nprt@tmp{#1}% \ifx\nprt@tmp\nprt@plus@test \nprt@plus \else \ifx\nprt@tmp\nprt@minus@test \nprt@minus \else \ifx\nprt@tmp\nprt@plusminus@test \nprt@plusminus \else #1% \fi \fi \fi } % \end{macrocode} % \end{macro} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % Define some booleans. % \verb|\ifnprt@block| decides whether the number is centered to the % decimal sign. % \verb|\ifnprt@blockexp| does the same for the exponent. % \verb|\ifnprt@exponent| is true when printing the exponent and false % otherwise. % \verb|\ifnprt@inmath| is set to true when using the command in math % mode. % \begin{macrocode} \newif\ifnprt@block \newif\ifnprt@blockexp \newif\ifnprt@exponent \newif\ifnprt@inmath % \end{macrocode} % \begin{macro}{\digits} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % With this command the user can switch to aligned printing. % The first parameter stands for the digits before the decimal sign % and the second for the digits after it. % \begin{macrocode} \newcommand{\digits}[2]{% \xdef\nprt@blockbefore{#1}% \xdef\nprt@blockafter{#2}% \nprt@blocktrue}% % \end{macrocode} % \end{macro} % \begin{macro}{\nodigits} % Switch back to normal printing. % \begin{macrocode} \newcommand{\nodigits}{\nprt@blockfalse}% % \end{macrocode} % \end{macro} % \begin{macro}{\exponentdigits} % With this command the user can switch to aligned printing of the % exponent. % The parameter stands for the digits before the decimal sign. % \begin{macrocode} \newcommand{\exponentdigits}[1]{% \xdef\nprt@blockexpbefore{#1}% \nprt@blockexptrue}% % \end{macrocode} % \end{macro} % \begin{macro}{\noexponentdigits} % Switch back to normal printing. % \begin{macrocode} \newcommand{\noexponentdigits}{\nprt@blockexpfalse}% % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@three} % Print up to three digits and call this command again recursively if there % are more digits to print. % % The command must be called in a different way than normal \LaTeX\ % commands. Braces must not be used but at the end of the command % list \verb|\@empty| has to appear in the source code. The command % gets four arguments where the first three are single digits and the % fourth contains the rest of the text preceding the \verb|\@empty|. % \begin{macrocode} \def\nprt@three#1#2#3#4\@empty{% % \end{macrocode} % Print the three digits. % \begin{macrocode} \nprt@printdigit#1% \nprt@printdigit#2% \nprt@printdigit#3% % \end{macrocode} % Define a temporary variable containing the rest string for testing % if there is a rest at all. % \begin{macrocode} \def\nprt@tmp{#4}% \ifx\nprt@tmp\empty \else % \end{macrocode} % If there is a rest string insert the thousand separator \dots % \begin{macrocode} \nprt@thousand% % \end{macrocode} % \dots\ and call this command recursively. % Append enough \verb|\@empty| statements to ensure that the command % gets four arguments. % \begin{macrocode} \nprt@three#4\@empty\@empty\@empty \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@threeafter} % Print up to three digits and call this command again recursively if there % are more digits to print. For use after the decimal sign. % \begin{macrocode} \def\nprt@threeafter#1#2#3#4\@empty{% % \end{macrocode} % Print the three digits. % \begin{macrocode} \nprt@printdigit#1% \nprt@printdigit#2% \nprt@printdigit#3% % \end{macrocode} % Define a temporary variable containing the rest string for testing % if there is a rest at all. % \begin{macrocode} \def\nprt@tmp{#4}% \ifx\nprt@tmp\empty \else % \end{macrocode} % If there is a rest string insert the thousand separator \dots % \begin{macrocode} \nprt@thousandthpart% % \end{macrocode} % \dots\ and call this command recursively. % Append enough \verb|\@empty| statements to ensure that the command % gets four arguments. % \begin{macrocode} \nprt@threeafter#4\@empty\@empty\@empty \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@two} % Print two digits and call \verb|\nprt@three| if there % are more digits to print. This command is maximally used once at the % beginning of the number when it contains 2, 5, 8, 11, \dots\ digits % before the decimal sign. For a description have a look at % \verb|\nprt@three|. % \begin{macrocode} \def\nprt@two#1#2#3\@empty{% \nprt@printdigit#1% \nprt@printdigit#2% \def\nprt@tmp{#3}% \ifx\nprt@tmp\empty \else \nprt@thousand\nprt@three#3\@empty\@empty\@empty \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@one} % Print one digit and call \verb|\nprt@three| if there % are more digits to print. This command is maximally used once at the % beginning of the number when it contains 1, 4, 7, 10, \dots\ digits % before the decimal sign. For a description watch \verb|\nprt@three|. % \begin{macrocode} \def\nprt@one#1#2\@empty{% \nprt@printdigit#1% \def\nprt@tmp{#2}% \ifx\nprt@tmp\empty \else % \end{macrocode} % Test if the first character was a sign. The thousand separator may % only be printed if the first character is no sign. % \changes{0.20}{2003/02/24}{Added support for $\pm$ sign}% % \begin{macrocode} \def\nprt@tmp{#1}% \ifx\nprt@tmp\nprt@plus@test \else \ifx\nprt@tmp\nprt@minus@test \else \ifx\nprt@tmp\nprt@plusminus@test \else \nprt@thousand \fi \fi \fi \nprt@three#2\@empty\@empty\@empty \fi } % \end{macrocode} % \end{macro} % Define routines to test if a character is included in a string. If % yes the command \verb|\nprt@tmp| returns a nonempty string. If the % string does not contain the character \verb|\nprt@tmp| returns % nothing. To achieve this functionality the commands have to be % called in a special way. For example to test for a comma in a command % \verb|\str| you have to write % \verb|\nprt@commatest\str,\@empty|. So you always have to % append the character you are searching for (e.g. \verb|,|) and % \verb|\@empty| to your search string. % \begin{macrocode} \def\nprt@exptest#1e#2\@empty{\gdef\nprt@tmp{#2}} \def\nprt@Exptest#1E#2\@empty{\gdef\nprt@tmp{#2}} \def\nprt@commatest#1,#2\@empty{\gdef\nprt@tmp{#2}} \def\nprt@dottest#1.#2\@empty{\gdef\nprt@tmp{#2}} % \end{macrocode} % \begin{macro}{\nprt@exp} % Print number in the exponential format with an argument containing a % small ``e''. Call: \verb|\nprt@exp| number\verb|\@empty|, % e.g. \verb|\nprt@exp 123.2e4,3\@empty|. Both numbers containing a comma or % a dot work. % \begin{macrocode} \def\nprt@exp#1e#2\@empty{\expnumprint{#1}{#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@Exp} % Print number in the exponential format with an argument containing a % capital ``E''. Call: \verb|\nprt@Exp| number\verb|\@empty|, % e.g. \verb|\nprt@Exp 123.2E4,3\@empty|. Both numbers containing a comma or % a dot work. % \begin{macrocode} \def\nprt@Exp#1E#2\@empty{\expnumprint{#1}{#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@comma} % \changes{0.06}{2002/09/18}{Add handling for missing numbers before % and after decimalsign}% % Print a number without exponential part containing a comma. Call: % \verb|\nprt@comma| number\verb|\@empty|, e.g. % \verb|\nprt@comma 123,2\@empty|. % \begin{macrocode} \def\nprt@comma#1,#2\@empty{% \nprt@dotcomma{#1}{#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@dot} % \changes{0.06}{2002/09/18}{Add handling for missing numbers before % and after decimalsign}% % Print a number without exponential part containing a comma. Call: % \verb|\nprt@dot| number\verb|\@empty|, e.g. % \verb|\nprt@dot 123.2\@empty|. % \begin{macrocode} \def\nprt@dot#1.#2\@empty{% \nprt@dotcomma{#1}{#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@dotcomma} % \changes{0.06}{2002/09/18}{Add handling for missing numbers before % and after decimalsign}% % \changes{0.30}{2003/05/19}{Add support for rounding}% % Print a number without exponential part containing a dot or a comma. Call: % \verb|\nprt@dotcomma{before}{after}|, e.g.\ % \verb|\nprt@dot{123}{2}|. % \begin{macrocode} \def\nprt@dotcomma#1#2{% \begingroup % \end{macrocode} % If \cs{nprt@dotcomma} is called for printing an exponent, copy the % routines for exponents to the ordinary ones. This has to be done % between \cs{begingroup} and \cs{endgroup} to preserve the normal % settings. % \begin{macrocode} \ifnprt@exponent \edef\nprt@rounddigits{\nprt@roundexpdigits}% \edef\nprt@roundnull{\nprt@roundexpnull}% \fi \ifnum\nprt@rounddigits<0 % \end{macrocode} % If no rounding is done, just use the given arguments for printing. % \begin{macrocode} \def\nprt@charsbeforecomma{#1}% \def\nprt@charsaftercomma{#2}% \else % \end{macrocode} % If rounding, do it. % First, provide empty strings for the parts before and after the % digit sign. % \begin{macrocode} \def\nprt@charsbeforecomma{}% \def\nprt@charsaftercomma{}% % \end{macrocode} % Append enough zeros after the decimal sign that all digits are % surely printed. % \begin{macrocode} \edef\zwei{#2\nprt@roundnull}% % \end{macrocode} % Call the command \cs{nprt@roundaftercomma} that does the rounding % for the part after the decimal sign. % \begin{macrocode} \expandafter\nprt@roundaftercomma\zwei\empty % \end{macrocode} % If the first digit after the comma is rounded from 9 to 0, rounding % has to be continued before the decimal sign by calling % \cs{nprt@roundbeforecomma}. % \begin{macrocode} \if@@roundup \nprt@roundbeforecomma#1\empty % \end{macrocode} % If the first digit has to be rounded from 9 to 0, a 1 has to be % inserted before the number. % \begin{macrocode} \if@@roundup \expandafter\xdef\expandafter\nprt@charsbeforecomma{% 1\nprt@charsbeforecomma}% \fi \else \def\nprt@charsbeforecomma{#1}% \fi \fi % \end{macrocode} % Count the digits after the comma. % \begin{macrocode} \nprt@@hassignfalse \expandafter\nprt@count\nprt@charsaftercomma\@empty\@empty\@empty % \end{macrocode} % Copy the result which is stored in |nprt@digitsbeforedecimal| to % |nprt@digitsafterdecimal|. % \begin{macrocode} \setcounter{nprt@digitsafterdecimal}{\thenprt@digitsbeforedecimal}% % \end{macrocode} % Count the digits before the comma. % \begin{macrocode} \expandafter\nprt@hassign\nprt@charsbeforecomma\@empty\@empty \expandafter\nprt@count\nprt@charsbeforecomma\@empty\@empty\@empty % \end{macrocode} % Typeset the digits before the comma. % \begin{macrocode} \ifnum\the\c@nprt@digitsbeforedecimal=0 \@addmissingzero \else \expandafter\beforecomma\nprt@charsbeforecomma\@empty\@empty \fi % \end{macrocode} % Typeset the part after the decimal sign, if necessary. % \begin{macrocode} \ifnum\nprt@rounddigits=0 \else % \end{macrocode} % Typeset the decimal sign. % \begin{macrocode} \nprt@decimal % \end{macrocode} % Typeset the digits after the comma. % \begin{macrocode} \ifnum\the\c@nprt@digitsafterdecimal>0 \aftercomma{\nprt@charsaftercomma}% \else \ifx\nprt@replacenull\@empty \@addmissingzero \else \nprt@replacenull \fi \fi \fi \endgroup } % \end{macrocode} % \end{macro} % \begin{macro}{\expnumprint} % Print number in the exponential format. This function is called by % \verb|\nprt@exp| and \verb|\nprt@Exp|. It just calls % \verb|\numprint| for the number itself, prints $\cdot 10$, and % calls \verb|\numprint| for the exponent. It is distinguished between % text and math mode to ensure the usage of the right fonts. % \changes{0.04}{2001/03/06}{Added support for pure $10^x$ format}% % \begin{macrocode} \newcommand{\expnumprint}[2]{% \def\nprt@tmp{#1}% \ifx\nprt@tmp\@empty \nprt@exponenttrue \ifmmode 10^{\numprint{#2}}% \else 10\textsuperscript{\numprint{#2}}% \fi \else \ifmmode \numprint{#1}% \nprt@exponenttrue \nprt@prod 10^{\numprint{#2}}% \else \numprint{#1}% \nprt@exponenttrue \nprt@prod 10\textsuperscript{\numprint{#2}}% \fi \fi \nprt@exponentfalse } % \end{macrocode} % \end{macro} % Define a macro that includes |\@empty|. This seems to be necesarry since % the optional argument of |\numprint| is not expanded before printing it. % \changes{0.22}{2003/02/27}{Bugfix with invalid spacing after the number}% % \begin{macrocode} \def\nprt@empty{\@empty}% % \end{macrocode} % \begin{macro}{\numprint} % This is the main command of this package. It gets a number in the % argument and prints it. % \begin{macrocode} \DeclareRobustCommand*\numprint[2][\@empty]{% % \end{macrocode} % \changes{0.32}{2003/09/28}{Reset the number of digits before and % after the decimal sign (Bugfix for nosepfour)}% % Reset the number of digits before and after the decimal sign. % Without doing it, \texttt{nosepfour} is broken by one number with % more than 4 digits. % \begin{macrocode} \setcounter{nprt@digitsafterdecimal}{0}% \setcounter{nprt@digitsbeforedecimal}{0}% % \end{macrocode} % \changes{0.31}{2003/09/16}{Expand the mandatory argument of the % \cs{numprint} command before parsing it}% % Expand argument first. % \begin{macrocode} \edef\nprt@marg{#2}% % \end{macrocode} % Call \verb|\nprt@Exptest| to test the argument for an ``E''. % \begin{macrocode} \expandafter\nprt@Exptest\nprt@marg E\@empty % \end{macrocode} % If the argument contains no ``E'' proceed here. % \begin{macrocode} \ifx\nprt@tmp\empty % \end{macrocode} % Call \verb|\nprt@exptest| to test the argument for an ``e''. % \begin{macrocode} \expandafter\nprt@exptest\nprt@marg e\@empty % \end{macrocode} % If the argument contains no ``e'' the argument contains a simple % number. Then proceed here. % \begin{macrocode} \ifx\nprt@tmp\empty % \end{macrocode} % Call \verb|\nprt@commatest| to test the argument for a ``,''. % \begin{macrocode} \expandafter\nprt@commatest\nprt@marg,\@empty % \end{macrocode} % If the argument contains no ``,'' proceed here. % \begin{macrocode} \ifx\nprt@tmp\empty % \end{macrocode} % Call \verb|\nprt@commatest| to test the argument for a ``.''. % \begin{macrocode} \expandafter\nprt@dottest\nprt@marg.\@empty % \end{macrocode} % If the argument contains no ``.'' the number has no decimal % places. Then proceed here. % \begin{macrocode} \ifx\nprt@tmp\empty % \end{macrocode} % Count the digits of the integer number. % \begin{macrocode} \expandafter\nprt@hassign\nprt@marg\@empty \expandafter\nprt@count\nprt@marg\@empty\@empty\@empty % \end{macrocode} % Print the number. % \begin{macrocode} \begingroup % \end{macrocode} % If \cs{nprt@dotcomma} is called for printing an exponent, copy the % routines for exponents to the ordinary ones. This has to be done % between \cs{begingroup} and \cs{endgroup} to preserve the normal % settings. % \begin{macrocode} \ifnprt@exponent \def\nprt@rounddigits{\nprt@roundexpdigits}% \def\nprt@roundnull{\nprt@roundexpnull}% \fi % \end{macrocode} % If rounding is switched on with at least on digit, the part % after the decimal sign has to be printed. % Set the number of digits, then. % \begin{macrocode} \ifnum\nprt@rounddigits>0 \setcounter{nprt@digitsafterdecimal}{\nprt@rounddigits}% \fi % \end{macrocode} % Print the integer part. % \begin{macrocode} \expandafter\beforecomma\nprt@marg\@empty\@empty % \end{macrocode} % Print the part after the decimal sign. % \begin{macrocode} \ifnum\nprt@rounddigits>0 \nprt@decimal \aftercomma{\nprt@roundnull}% \fi \endgroup % \end{macrocode} % If the argument contains a ``.'' proceed here. % Call \verb|\nprt@dot| to print the whole number. % \begin{macrocode} \else \expandafter\nprt@dot\nprt@marg\@empty \fi % \end{macrocode} % If the argument contains a ``,'' proceed here. % Call \verb|\nprt@comma| to print the whole number. % \begin{macrocode} \else \expandafter\nprt@comma\nprt@marg\@empty \fi % \end{macrocode} % If the argument contains a ``e'' proceed here. % Call \verb|\nprt@exp| to print the whole number. % \begin{macrocode} \else \expandafter\nprt@exp\nprt@marg\@empty \fi % \end{macrocode} % If the argument contains a ``E'' proceed here. % Call \verb|\nprt@Exp| to print the whole number. % \begin{macrocode} \else \expandafter\nprt@Exp\nprt@marg\@empty \fi % \end{macrocode} % \changes{0.02}{2000/08/30}{Added optional argument for units}% % \changes{0.03}{2001/02/10}{Fixed bug with units}% % \changes{0.20}{2003/02/24}{Fixed bug which made units fragile}% % \changes{0.22}{2003/02/27}{Bugfix with invalid spacing after the number}% % Handle optional argument and print the unit only when specified. % \begin{macrocode} \def\nprt@unit{#1}% \ifx\nprt@unit\nprt@empty \else \ensuremath{\nprt@unitsep\mathrm{\nprt@unit}}% \fi } % \end{macrocode} % \end{macro} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % Counters for counting digits: \verb|nprt@countblocks| counts number % of blocks before the decimal sign. \verb|nprt@digitsfirstblock| % counts the digits in the first block (0 to 2). % \verb|nprt@digitsbeforedecimal| counts the total number of % digits before the decimal sign. % \begin{macrocode} \newcounter{nprt@countblocksbefore}% \newcounter{nprt@digitsfirstblock}% \newcounter{nprt@digitsafterdecimal}% \newcounter{nprt@digitsbeforedecimal}% % \end{macrocode} % \begin{macro}{nprt@hassign} % Tests weather the first character of a string is not a digit. % \begin{macrocode} \newif\ifnprt@@hassign \def\nprt@hassign#1#2\@empty{% \ifnum-9>-1#1 \nprt@@hassignfalse \else \nprt@@hassigntrue \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@count} % Count the number of digits of the argument. This is done recursively % by taking one character of the string and counting the runs of this % command. Every three digits the counter is resetted to zero because % only the modulus (Rest??) of the number of digits devided by 3 is % important. % % If the optional parameter contains anything other than % \verb|\@empty| the number of digits after the comma is counted. % \begin{macrocode} \def\nprt@count#1#2\@empty{% \setcounter{nprt@digitsbeforedecimal}{0}% \edef\nprt@arg{#1}% % \end{macrocode} % Handle an empty argument. % \begin{macrocode} \ifx\nprt@arg\@empty \else % \end{macrocode} % Count the digits. % \begin{macrocode} \ifnprt@@hassign \nprt@@count#2\@empty\@empty \else \nprt@@count#1#2\@empty\@empty \fi \fi % \end{macrocode} % \begin{macrocode} \setcounter{nprt@countblocksbefore}{\arabic{nprt@digitsbeforedecimal}/3}% \setcounter{nprt@digitsfirstblock}{% \arabic{nprt@digitsbeforedecimal}-3*\arabic{nprt@countblocksbefore}}% } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@@count} % \changes{0.32}{2003/09/28}{Only one error message per \cs{numprint}}% % Do the counting itself. % \begin{macrocode} \def\nprt@@count#1#2\@empty{% \ifnum-9>-1#1 \addtocounter{nprt@digitsbeforedecimal}{1}% \def\nprt@tmp{#2}% \ifx\nprt@tmp\empty \else \nprt@@count#2\@empty\@empty \fi \else \PackageError{numprint}{Incorrect number format in \string\numprint}{% The main argument of the \string\numprint\space command may only be started\MessageBreak with \string"+\string", \string"-\string", or \string"\string\pm\string" and then contain of\MessageBreak digits \string"0\string" to \string"9\string", \string",\string", \string".\string", \string"e\string", and \string"E\string".}% % \setcounter{nprt@digitsbeforedecimal}{-1}% \fi % \end{macrocode} % Count number of characters % \begin{macrocode} } % \end{macrocode} % \end{macro} % Print the digits before the decimal sign. Depending on the number of % digits either \verb|\nprt@one|, \verb|\nprt@two|, or % \verb|\nprt@three| is called. % \begin{macrocode} \newlength{\nprt@digitwidth}% \newlength{\nprt@sepwidth}% \newcounter{nprt@digitcount}% \newcounter{nprt@sepcount}% \newlength{\nprt@blockwidth}% % \end{macrocode} % \begin{macro}{beforecomma} % Prints the number before the decimal sign. % \begin{macrocode} \def\beforecomma#1#2\@empty{% % \end{macrocode} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % If the number should be printed aligned generate a block with the % correct size. % \begin{macrocode} \ifnprt@block \ifnprt@exponent \else \settowidth{\nprt@digitwidth}{1}% \settowidth{\nprt@sepwidth}{\nprt@thousand}% \setcounter{nprt@digitcount}{\nprt@blockbefore}% \setcounter{nprt@sepcount}{(\nprt@blockbefore-1)/3}% \setlength{\nprt@blockwidth}{% \arabic{nprt@digitcount}\nprt@digitwidth+% \arabic{nprt@sepcount}\nprt@sepwidth}% % \end{macrocode} % If block length is four digits and fourth digit is not to be % separated adjust new width. % \begin{macrocode} \if@numsepfour \else \ifnum\nprt@blockbefore=4 \ifnum\nprt@blockafter<5 \setlength{\nprt@blockwidth}{4\nprt@digitwidth}% \fi \fi \fi % \end{macrocode} % If math mode switch to math mode again after invoking box. % \begin{macrocode} \ifmmode\nprt@inmathtrue\fi \makebox[\nprt@blockwidth][r]{% \ifnprt@inmath$\fi %$ (only for syntax highlighing in emacs) \fi \fi \ifnprt@blockexp \ifnprt@exponent \settowidth{\nprt@digitwidth}{1}% \settowidth{\nprt@sepwidth}{\nprt@thousand}% \setcounter{nprt@digitcount}{\nprt@blockexpbefore}% \setcounter{nprt@sepcount}{(\nprt@blockexpbefore-1)/3}% \setlength{\nprt@blockwidth}{% \arabic{nprt@digitcount}\nprt@digitwidth+% \arabic{nprt@sepcount}\nprt@sepwidth}% % \end{macrocode} % If block length is four digits and fourth digit is not to be % separated adjust new width. % \begin{macrocode} \if@numsepfour \else \ifnum\nprt@blockexpbefore=4 \setlength{\nprt@blockwidth}{4\nprt@digitwidth}% \fi \fi \ifmmode\nprt@inmathtrue\fi \makebox[\nprt@blockwidth][r]{% % \end{macrocode} % asdf % To do: correct font size (normalstyle, scriptstyle, scriptscriptstyle) % \begin{macrocode} \ifnprt@inmath$\scriptstyle\fi %$ (only for syntax highlighing in emacs) \fi \fi % \end{macrocode} % \changes{0.31}{2003/09/16}{Bug Fix: With four-digit numbers, print % everything instead of first digit only}% % Print the number itself. % \begin{macrocode} \ifnprt@@hassign \nprt@printdigit{#1}% \edef\nprt@tmp{#2}% \else \edef\nprt@tmp{#1#2}% \fi \ifnum\thenprt@digitsfirstblock=1 \ifnum\thenprt@digitsbeforedecimal=4 \if@numsepfour \expandafter\nprt@one\nprt@tmp\@empty\@empty\@empty \else \ifnum\thenprt@digitsafterdecimal<5 \nprt@tmp\ignorespaces \else \expandafter\nprt@one\nprt@tmp\@empty\@empty\@empty \fi \fi \else \expandafter\nprt@one\nprt@tmp\@empty\@empty\@empty \fi \fi \ifnum\thenprt@digitsfirstblock=2 \expandafter\nprt@two\nprt@tmp\@empty\@empty\@empty \fi \ifnum\thenprt@digitsfirstblock=0 \expandafter\nprt@three\nprt@tmp\@empty\@empty\@empty\@empty \fi % \end{macrocode} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % Close the block if necessary. % \begin{macrocode} \ifnprt@blockexp \ifnprt@exponent \ifnprt@inmath$\fi %$ (only for syntax highlighing in emacs) }% \fi \fi \ifnprt@block \ifnprt@exponent \else \ifnprt@inmath$\fi %$ (only for syntax highlighing in emacs) }% \fi \fi } % \end{macrocode} % \end{macro} % \begin{macro}{aftercomma} % Print the digits after the decimal sign. % \begin{macrocode} \newcommand{\aftercomma}[1]{% % \end{macrocode} % Count number of digits. % \begin{macrocode} % \expandafter\nprt@count\expandafter{#1}% % \end{macrocode} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % If the number should be printed aligned generate a block with the % correct size. % \begin{macrocode} \ifnprt@block \ifnprt@exponent \else \settowidth{\nprt@digitwidth}{1}% \settowidth{\nprt@sepwidth}{\nprt@thousand}% \setcounter{nprt@digitcount}{\nprt@blockafter}% \setcounter{nprt@sepcount}{(\nprt@blockafter-1)/3}% \setlength{\nprt@blockwidth}{% \arabic{nprt@digitcount}\nprt@digitwidth+% \arabic{nprt@sepcount}\nprt@sepwidth}% % \end{macrocode} % If block length is four digits and fourth digit is not to be % separated adjust new width. % \begin{macrocode} \if@numsepfour \else \ifnum\nprt@blockafter=4 \ifnum\nprt@blockbefore<5 \setlength{\nprt@blockwidth}{4\nprt@digitwidth}% \fi \fi \fi \ifmmode\nprt@inmathtrue\fi \makebox[\nprt@blockwidth][l]{% \ifnprt@inmath$\fi %$ (only for syntax highlighing in emacs) \fi \fi % \end{macrocode} % If a zero after the decimal sign is replaced, don't test on 4 digits % after comma. % Therefor, set |nprt@digitsafterdecimalsign| to zero. % \begin{macrocode} \ifx\nprt@replacenull\@empty \else \ifnum#1=0 \setcounter{nprt@digitsafterdecimal}{0}% \fi \fi % \end{macrocode} % Print the number itself. % \begin{macrocode} \ifnum\thenprt@digitsafterdecimal=4 \if@numsepfour \expandafter\nprt@threeafter#1\@empty\@empty\@empty \else \ifnum\thenprt@digitsbeforedecimal<5 #1\ignorespaces \else \expandafter\nprt@threeafter#1\@empty\@empty\@empty \fi \fi \else % \end{macrocode} % Replace the zero after the comma by \cs{nprt@replacenull} if this is % wanted. % Otherwise, print the digits. % \begin{macrocode} \ifx\nprt@replacenull\@empty \expandafter\nprt@threeafter#1\@empty\@empty\@empty \else \ifnum#1=0 \nprt@replacenull \else \expandafter\nprt@threeafter#1\@empty\@empty\@empty \fi \fi \fi % \end{macrocode} % \changes{0.05}{2001/03/12}{Added basic support for aligned tabular entries}% % Close the block if necessary. % \begin{macrocode} \ifnprt@block \ifnprt@exponent \else \ifnprt@inmath$\fi %$ (only for syntax highlighing in emacs) }% \fi \fi } % \end{macrocode} % \end{macro} % New counter which shows the digit position for finding the digit % where to round. % \begin{macrocode} \newcounter{nprt@position} % \end{macrocode} % Boolean that shows if a 9 has been rounded to 0. % \begin{macrocode} \newif\if@@roundup % \end{macrocode} % Current digit to be able to add 1 to it. % \begin{macrocode} \newcounter{nprt@thisdigit} % \end{macrocode} % \begin{macro}{\nprt@roundaftercomma} % Command that rounds at the argument |#1#2| at the digit % \cs{nprt@rounddigits}. % This routine calls itself recursively. % \begin{macrocode} \def\nprt@roundaftercomma#1#2\empty{% \addtocounter{nprt@position}{1}% \edef\zwei{#2}% \ifx\zwei\empty \else \expandafter\ifnum\thenprt@position<\nprt@rounddigits \nprt@roundaftercomma#2\empty \else \nprt@roundup#2\empty \fi \fi \setcounter{nprt@thisdigit}{#1}% \if@@roundup \addtocounter{nprt@thisdigit}{1}% \ifnum\thenprt@thisdigit>9 \@@rounduptrue \setcounter{nprt@thisdigit}{0}% \else \@@roundupfalse \fi \fi \expandafter\xdef\expandafter\nprt@charsaftercomma{% \thenprt@thisdigit\nprt@charsaftercomma}% \addtocounter{nprt@position}{-1}% } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@roundup} % \begin{macrocode} \def\nprt@roundup#1#2\empty{% \ifnum#1>4 \@@rounduptrue \else \@@roundupfalse \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\nprt@roundbeforecomma} % \begin{macrocode} \def\nprt@roundbeforecomma#1#2\empty{% \edef\zwei{#2}% \ifx\zwei\empty \else \nprt@roundbeforecomma#2\empty \fi \edef\eins{#1}% % \ifx\eins\nprt@minus@test % \expandafter\xdef\expandafter\nprt@charsbeforecomma{% % #1\nprt@charsbeforecomma}% % \else % \setcounter{nprt@thisdigit}{#1}% % \if@@roundup % \addtocounter{nprt@thisdigit}{1}% % \ifnum\thenprt@thisdigit>9 % \@@rounduptrue % \setcounter{nprt@thisdigit}{0}% % \else % \@@roundupfalse % \fi % \fi \ifnum-9>-1#1 \setcounter{nprt@thisdigit}{#1}% \if@@roundup \addtocounter{nprt@thisdigit}{1}% \ifnum\thenprt@thisdigit>9 \@@rounduptrue \setcounter{nprt@thisdigit}{0}% \else \@@roundupfalse \fi \fi \expandafter\xdef\expandafter\nprt@charsbeforecomma{% \thenprt@thisdigit\nprt@charsbeforecomma}% \else \if@@roundup \expandafter\xdef\expandafter\nprt@charsbeforecomma{% 1\nprt@charsbeforecomma}% \@@roundupfalse \fi \expandafter\xdef\expandafter\nprt@charsbeforecomma{% #1\nprt@charsbeforecomma}% \fi } % \end{macrocode} % \end{macro} % % Define two new column types. % % The column type \verb|n| aligns the base number but not the exponent. % \begin{macrocode} \newcolumntype{n}[2]{>{\digits{#1}{#2}$}l<{$\nodigits}} % \end{macrocode} % Define two new column types. % % The column type \verb|n| aligns the base number as well as the exponent. % \begin{macrocode} \newcolumntype{N}[3]{% >{\digits{#1}{#2}\exponentdigits{#3}$}l<{$\nodigits\noexponentdigits}} % \end{macrocode} % \iffalse % % \fi % \Finale