diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:55:41 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:55:41 +0000 |
commit | 3c80959f183b98603d5637301189f1d53cd136b2 (patch) | |
tree | 1296da2a5ae1073812827e888feac57ef0705679 /Master/texmf-dist/source/latex/numprint/numprint032.dtx | |
parent | 96e50dbc7cb82ad05b5d4da7d37620f1b34eebbe (diff) |
trunk/Master/texmf-dist/source/latex/numprint
git-svn-id: svn://tug.org/texlive/trunk@420 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/numprint/numprint032.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/numprint/numprint032.dtx | 1532 |
1 files changed, 1532 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/numprint/numprint032.dtx b/Master/texmf-dist/source/latex/numprint/numprint032.dtx new file mode 100644 index 00000000000..7458c7f7f06 --- /dev/null +++ b/Master/texmf-dist/source/latex/numprint/numprint032.dtx @@ -0,0 +1,1532 @@ +% \iffalse meta comment +% File: numprint.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} +%</package> +%<*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{h.harders@tu-bs.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} +%</driver> +% \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 +%</package> +% \fi +% \Finale + |