diff options
Diffstat (limited to 'macros/latex/contrib/siunitx/siunitx.dtx')
-rw-r--r-- | macros/latex/contrib/siunitx/siunitx.dtx | 18036 |
1 files changed, 432 insertions, 17604 deletions
diff --git a/macros/latex/contrib/siunitx/siunitx.dtx b/macros/latex/contrib/siunitx/siunitx.dtx index 0125c29569..887d0c0311 100644 --- a/macros/latex/contrib/siunitx/siunitx.dtx +++ b/macros/latex/contrib/siunitx/siunitx.dtx @@ -1,17892 +1,720 @@ % \iffalse meta-comment -%<*internal> -\iffalse -%</internal> -%<*readme> -siunitx - A comprehensive (SI) units package -============================================== - -Physical quantities have both numbers and units, and each -physical quantity should be expressed as the product of a number -and a unit. Typesetting physical quantities requires care to -ensure that the combined mathematical meaning of the number-unit -combination is clear. In particular, the SI units system lays -down a consistent set of units with rules on how these are to be -used. However, different countries and publishers have differing -conventions on the exact appearance of numbers (and units). The -`siunitx` package provides a set of tools for authors to typeset -quantities in a consistent way. The package has an extended set -of configuration options which make it possible to follow -varying typographic conventions with the same input syntax. The -package includes automated processing of numbers and units, and -the ability to control tabular alignment of numbers. - -Installation ------------- - -The package is supplied in `dtx` format and as a pre-extracted -zip file, `siunitx.tds.zip`. The later is most convenient for -most users: simply unzip this in your local texmf directory . If -you want to unpack the `.dtx` yourself, running `tex -siunitx.dtx` will extract the package whereas `latex -siunitx.dtx` will extract it and also typeset the documentation. - -The package requires LaTeX3 support as provided in the -`l3kernel` and `l3packages` bundles. Both of these are available -on [CTAN](http://www.ctan.org/) as ready-to-install zip files. -Suitable versions are available in MiKTeX 2.9 and TeX Live 2015 -(updating the relevant packages online may be necessary). -LaTeX3, and so `siunitx`, requires the e-TeX extensions: these -are available on all modern TeX systems. - -Typesetting the documentation requires a number of packages in -addition to those needed to use the package. This is mainly -because of the number of demonstration items included in the -text. To compile the documentation without error, you will -need the packages: - - `amsmath` - - `booktabs` - - `cancel` - - `caption` - - `cleveref` - - `colortbl` - - `csquotes` - - `datatool` - - `helvet` - - `mathpazo` - - `multirow` - - `listings` - - `pgfplots` - - `xcolor` -%</readme> -%<*internal> -\fi -\def\nameofplainTeX{plain} -\ifx\fmtname\nameofplainTeX\else - \expandafter\begingroup -\fi -%</internal> -%<*install> -\input l3docstrip.tex -\keepsilent -\askforoverwritefalse -\preamble ---------------------------------------------------------------- -The siunitx package --- A comprehensive (SI) units package -Maintained by Joseph Wright -E-mail: joseph.wright@morningstar2.co.uk -Released under the LaTeX Project Public License v1.3c or later -See http://www.latex-project.org/lppl.txt ---------------------------------------------------------------- - -\endpreamble -\postamble -Copyright (C) 2008-2021 by - Joseph Wright <joseph.wright@morningstar2.co.uk> - -It may be distributed and/or modified under the conditions of -the LaTeX Project Public License (LPPL), either version 1.3c of -this license or (at your option) any later version. The latest -version of this license is in the file: - http://www.latex-project.org/lppl.txt - -This work is "maintained" (as per LPPL maintenance status) by - Joseph Wright. - -This work consists of the file siunitx.dtx - and the derived files siunitx.pdf, - siunitx.sty and - siunitx.ins. -\endpostamble -\usedir{tex/latex/siunitx} -\generate{ - \file{\jobname.sty}{\from{\jobname.dtx}{package}} - \file{siunitx-abbreviations.cfg} - {\from{\jobname.dtx}{config,abbreviations}} - \file{siunitx-binary.cfg}{\from{\jobname.dtx}{config,binary}} - \file{siunitx-version-1.cfg}{\from{\jobname.dtx}{config,version-1}} -} -%</install> -%<install>\endbatchfile -%<*internal> -\usedir{source/latex/siunitx} -\generate{ - \file{\jobname.ins}{\from{\jobname.dtx}{install}} -} -\nopreamble\nopostamble -\usedir{doc/latex/siunitx} -\generate{ - \file{README.md}{\from{\jobname.dtx}{readme}} -} -\ifx\fmtname\nameofplainTeX - \expandafter\endbatchfile -\else - \expandafter\endgroup -\fi -%</internal> -%<*driver|package> -\RequirePackage{expl3}[2020/01/12] -\RequirePackage{xparse} -%</driver|package> -%<*driver> -\documentclass{l3doc} -\usepackage[german,french,spanish,UKenglish]{babel} -\usepackage[table]{xcolor} -\usepackage{amsmath,booktabs,cancel,caption,colortbl,csquotes} -\usepackage{datatool,helvet,multirow,pgfplots,siunitx,xfrac,xtab} -\usepackage[capitalise]{cleveref} -\usepackage[final]{listings} -\usepackage[osf]{mathpazo} -\AtBeginDocument{\shorthandoff{<>}} -\crefformat{section}{#2Section~#1#3} -\Crefformat{section}{#2Section~#1#3} -\crefformat{subsection}{#2Section~#1#3} -\Crefformat{subsection}{#2Section~#1#3} -\crefformat{figure}{#2Figure~#1#3} -\Crefformat{figure}{#2Figure~#1#3} -\crefformat{table}{#2Table~#1#3} -\Crefformat{table}{#2Table~#1#3} -\crefrangeformat{table}{#3Tables~#1#4 to~#5#2#6} -\Crefrangeformat{table}{#3Tables~#1#4 to~#5#2#6} -\crefmultiformat{table}{#2Tables~#1#3}{ and~#2#1#3}{, #2#1#3}{, and~#2#1#3} -\Crefmultiformat{table}{#2Tables~#1#3}{ and~#2#1#3}{, #2#1#3}{, and~#2#1#3} -% Silence annoying fp package messages -\FPmessagesfalse -\pgfplotsset{compat = newest} -\sisetup{binary-units} -\DeclareSIUnit{\KWH}{kWh} -\DeclareSIPrePower\quartic{4} -\DeclareSIPostPower\tothefourth{4} -\DeclareSIQualifier\catalyst{cat} -\DeclareSIQualifier\isotropic{i} -\DeclareSIQualifier\polymer{pol} -\newlength\mylength -%\DisableImplementation -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -%</driver> -% \fi -% -%\makeatletter -% -%^^A Some short cuts for the tables -%\NewDocumentCommand\DescribePrefix{m}{^^A -% \expandafter\SpecialUsageIndex\expandafter{\csname #1\endcsname}^^A -% #1 & \cs{#1} & \expandafter\si\expandafter{\csname #1\endcsname} -%} -%\NewDocumentCommand\DescribeUnit{m}{^^A -% \expandafter\SpecialUsageIndex\expandafter{\csname #1\endcsname}^^A -% #1 & -% \cs{#1} & -% \expandafter\si\expandafter{\csname #1\endcsname} -%} -%\NewDocumentCommand\DescribeNamedUnit{mm}{^^A -% \expandafter\SpecialUsageIndex\expandafter{\csname #2\endcsname}^^A -% #1 & -% \cs{#2} & -% \expandafter\si\expandafter{\csname #2\endcsname} -%} -% -%^^A For creating examples with nice highlighting of code, and so -%^^A on; based on the system used in the listings source (lstsample). -%\lst@RequireAspects{writefile} -%\newsavebox{\LaTeXdemo@box} -%\lstnewenvironment{LaTeXdemo}[1][code and example] -% {^^A -% \global\let\lst@intname\@empty -% \expandafter\let\expandafter\LaTeXdemo@end -% \csname LaTeXdemo@#1@end\endcsname -% \@nameuse{LaTeXdemo@#1}^^A -% } -% {\LaTeXdemo@end} -%\newcommand*\LaTeXdemo@new[3]{^^A -% \expandafter\newcommand\expandafter*\expandafter -% {\csname LaTeXdemo@#1\endcsname}{#2}^^A -% \expandafter\newcommand\expandafter*\expandafter -% {\csname LaTeXdemo@#1@end\endcsname}{#3}^^A -%} -%\newcommand*\LaTeXdemo@common{^^A -% \setkeys{lst} -% { -% basicstyle = \small\ttfamily, -% basewidth = 0.51em, -% gobble = 3, -% keywordstyle = \color{blue}, -% language = [LaTeX]{TeX}, -% moretexcs = -% { -% addto, -% ampere, -% ang, -% angstrom, -% becquerel, -% bel, -% bit, -% bottomrule, -% byte, -% cancel, -% candela, -% centi, -% color, -% coulomb, -% cubed, -% cubic, -% deci, -% decibel, -% degree, -% degreeCelsius, -% DeclareBinaryPrefix, -% DeclareRobustCommand, -% DeclareSIPostPower, -% DeclareSIPrefix, -% DeclareSIPrePower, -% DeclareSIQualifier, -% DeclareSIUnit, -% DTLdisplaydb, -% DTLforeach, -% DTLiffirstrow, -% DTLmul, -% DTLnewdb, -% DTLnewdbentry, -% DTLnewrow, -% farad, -% fontspec, -% gram, -% gray, -% henry, -% highlight, -% hour, -% Hz, -% joule, -% kelvin, -% kibi, -% kilo, -% kilogram, -% kWh, -% litre, -% lumen, -% lux, -% mathnormal, -% metre, -% mebi, -% micro, -% midrule, -% milli, -% mm, -% mole, -% multirow, -% num, -% numlist, -% numrange, -% of, -% pascal, -% per, -% percent, -% protected, -% radian, -% raiseto, -% robustify, -% rowcolor, -% second, -% selectlanguage, -% SendSettingsToPgf, -% si, -% SI, -% SIlist, -% SIrange, -% sievert, -% sisetup, -% SIUnitSymbolDegree, -% square, -% squared, -% tablenum, -% tesla, -% texorpdfstring, -% text, -% textmu, -% toprule, -% tothe, -% translate, -% unit, -% volt, -% watt -% } -% }^^A -%} -%\newcommand*\LaTeXdemo@input{^^A -% \MakePercentComment -% \catcode`\^^M=10\relax -% \small -% \begingroup -% \setkeys{lst} -% { -% SelectCharTable=\lst@ReplaceInput{\^\^I}{\lst@ProcessTabulator} -% }^^A -% \leavevmode -% \input{\jobname.tmp}^^A -% \endgroup -% \MakePercentIgnore -%} -%\LaTeXdemo@new{code and example} -% {^^A -% \setbox\LaTeXdemo@box=\hbox\bgroup -% \lst@BeginAlsoWriteFile{\jobname.tmp}^^A -% \LaTeXdemo@common -% } -% {^^A -% \lst@EndWriteFile -% \egroup -% \begin{center} -% \ifdim\wd\LaTeXdemo@box>0.48\linewidth\relax -% \hbox to\linewidth{\box\LaTeXdemo@box\hss}^^A -% \begin{minipage}{\linewidth} -% \LaTeXdemo@input -% \end{minipage} -% \else -% \begin{minipage}{0.48\linewidth} -% \LaTeXdemo@input -% \end{minipage} -% \hfill -% \begin{minipage}{0.48\linewidth} -% \hbox to\linewidth{\box\LaTeXdemo@box\hss}^^A -% \end{minipage} -% \fi -% \end{center} -% } -%\LaTeXdemo@new{code and float}{^^A -% \lst@BeginAlsoWriteFile{siunitx.tmp}^^A -% \LaTeXdemo@common -%}{^^A -% \lst@EndWriteFile -% \LaTeXdemo@input -%} -%\LaTeXdemo@new{code only} -% {\LaTeXdemo@common}{} -% -%^^A Turning of the marginpar warnings is a bit awkward. -%^^A It is achieved by temporarily disabling \@latex@warning@no@line -%\let\latex@addmarginpar\@addmarginpar -%\let\latex@warning@no@line\@latex@warning@no@line -%\def\@addmarginpar{^^A -% \let\@latex@warning@no@line\@gobble -% \latex@addmarginpar -% \let\@latex@warning@no@line\latex@warning@no@line -%} -% -%\ProvideDocumentCommand\opt{m}{\texttt{#1}} -% -%\makeatother -% -%\GetFileInfo{\jobname.sty} -% -%\title{^^A -% \textsf{siunitx} --- A comprehensive (SI) units package\thanks{^^A -% This file describes \fileversion, last revised \filedate.^^A -% }^^A -%} -%\author{^^A -% Joseph Wright\thanks -% {^^A -% E-mail: \href{mailto:joseph.wright@morningstar2.co.uk} -% {\texttt{joseph.wright@morningstar2.co.uk}}^^A -% }^^A -%} -%\date{Released \filedate} -% -%\maketitle -% -%\changes{v0.6}{2008/02/18}{First public testing release (as \pkg{si})} -%\changes{v1.0}{2008/06/15}{First official release} -%\changes{v1.1}{2008/09/28}{Package extended to a greater range of unit -% types} -%\changes{v1.2}{2009/01/22}{Correct handling for ranges of numbers -% added} -%\changes{v1.3}{2009/09/20}{Better definition for micro symbol} -%\changes{v1.4}{2010/01/16}{Detect entire document in non-serif font} -%\changes{v2.0}{2010/05/23}{Complete re-write of package to add many new -% features} -%\changes{v2.0c}{2010/06/07}{Mixed literal and macro units now print -% more reliably} -%\changes{v2.0d}{2010/06/10}{Fix error in \opt{table-format} option -% concerning exponent signs} -%\changes{v2.0e}{2010/06/20}{Correct behaviour of \cs{pm} in numbers -% when \texttt{abbreviations} configuration is loaded: problem -% introduced in v2.0c} -%\changes{v2.0f}{2010/06/27}{Fix issue with spacing of multiplication -% sign in text mode} -%\changes{v2.0g}{2010/06/28}{Fix issue with complex numbers in -% quotients} -%\changes{v2.0g}{2010/06/28}{Repair broken \opt{bracket-numbers} -% option} -%\changes{v2.0g}{2010/06/28}{Improve handling of complex root token} -%\changes{v2.0g}{2010/06/28}{Introduce localisation for text values} -%\changes{v2.0h}{2010/06/29}{Actually get localisation into the -% code} -%\changes{v2.0j}{2010/06/30}{Ensure symbols specified in -% \opt{input-symbols} are always printed in math mode} -%\changes{v2.0k}{2010/07/04}{Fix for \pkg{babel} French settings with -% \cs{fg} in tabular material} -%\changes{v2.0l}{2010/07/07}{Further adjustments to \pkg{babel} support} -%\changes{v2.0p}{2010/07/28}{Actually get change from v2.0o working} -%\changes{v2.0q}{2010/07/29}{Errors with free-standing unit code fixed} -%\changes{v2.0q}{2010/07/29}{Deal with bad definition of \cs{color} -% by \pkg{textpos} package} -%\changes{v2.0s}{2010/08/08}{Correct errors in rounding code when -% precision requested is zero decimal places} -%\changes{v2.0t}{2010/08/24}{Replace \cs{exp_afer:wN} in code for -% \cs{per} with \cs{exp_after:wN}} -%\changes{v2.0u}{2010/09/14}{Fix second possible issue with -% \pkg{textpos} package and \cs{color}} -%\changes{v2.0u}{2010/09/14}{Prevent infinite loop if \cs{SI} function -% is used with an empty number} -%\changes{v2.0v}{2010/09/26}{Internal changes reflecting \pkg{expl3} -% updates} -%\changes{v2.0w}{2010/09/29}{Deal with internal function used by -% REV\TeX{} in tables} -%\changes{v2.0x}{2010/10/05}{Fix bug when detecting single prefixes -% and converting prefixes to numbers} -%\changes{v2.1a}{2010/11/05}{Ensure that output of list separators is -% in text mode} -%\changes{v2.1a}{2010/11/05}{Print prefixes correctly in text mode -% when converting to numerical value} -%\changes{v2.1b}{2010/11/05}{Bug in printing code for complex part with -% no number fixed} -%\changes{v2.1b}{2010/11/05}{Bug in hyphen printing when detecting mode -% sorted} -%\changes{v2.1c}{2010/11/11}{Discourage line break between number and -% unit even when it is permitted} -%\changes{v2.1c}{2010/11/14}{After reviewing internals, \cs{numlist}, -% \cs{numrange}, \cs{SIlist} and \cs{SIrange} are documented as -% requiring text mode due to issues with spacing and line breaks} -%\changes{v2.1c}{2010/11/14}{Auto-detect math mode in tables and -% correct output accordingly} -%\changes{v2.1e}{2010/11/22}{Fix issues with text mode symbols and -% \pkg{fontspec} package} -%\changes{v2.1g}{2010/12/21}{Checks on the versions of \pkg{expl3} and -% \pkg{xparse} installed} -%\changes{v2.1h}{2011/01/18}{Detect AMS display-like environments} -%\changes{v2.1j}{2011/02/01}{Allow for loading of \pkg{inputenc} package -% with no options} -%\changes{v2.1k}{2011/02/09}{Bug fix when printing superscript minus -% signs and using \pkg{fontspec} package} -%\changes{v2.1m}{2011/03/18}{Avoid expansion of erroneous literal -% units when these are forbidden} -%\changes{v2.1m}{2011/03/20}{Ensure some output occurs in all cases -% when \opt{round-precision} is set to \opt{0} and \opt{round-mode} -% is set to \opt{places}} -%\changes{v2.1n}{2011/03/31}{Consistent behaviour for -% \opt{round-integer-to-decimal} when \opt{round-precision} is 0} -%\changes{v2.1o}{2011/04/03}{Fix incorrect font choice when -% \pkg{arev} package is loaded} -%\changes{v2.1o}{2011/04/03}{Account for negative exponents -% when using \opt{fixed-exponent} system} -%\changes{v2.1p}{2011/04/04}{Bad table alignment when some rows -% contain comparators fixed} -%\changes{v2.1p}{2011/04/04}{Poor position of comparators in -% numbers fixed} -%\changes{v2.2a}{2011/04/15}{Fix issue with \texttt{*} tokens in -% tabular preambles} -%\changes{v2.2a}{2011/04/15}{Expand macros with arguments correctly -% in tables} -%\changes{v2.2a}{2011/04/16}{Group digits for input containing symbolic -% entries} -%\changes{v2.2a}{2011/04/16}{Insert tokens correctly when last tabular cell -% does not end \texttt{\textbackslash\textbackslash}} -%\changes{v2.2a}{2011/04/16}{Fix bug with literal units and auto-insertion -% of \num{1} when \opt{per-mode} is \opt{symbol}} -%\changes{v2.2b}{2011/04/17}{Make \cs{of} work in hyper-linked sections} -%\changes{v2.2b}{2011/04/17}{Fix bug with \cs{highlight} macro when -% no colour support is loaded} -%\changes{v2.2b}{2011/04/19}{Fix bad formatting of negative exponents when -% using the \opt{output-exponent-marker} option} -%\changes{v2.2c}{2011/04/20}{Fix bad interaction with \pkg{cellspace} package} -%\changes{v2.2d}{2011/04/28}{Fix the \opt{strict} option} -%\changes{v2.2e}{2011/05/23}{Fix incorrect interpretation of complex numbers -% with no real part} -%\changes{v2.2g}{2011/06/02}{Correctly space \cs{degree} and similar units -% in lists and ranges when only a single unit is given} -%\changes{v2.2h}{2011/06/03}{Fix bug in significant figures rounding code -% for some integer part values} -%\changes{v2.2i}{2011/06/15}{Fix \opt{detect-mode} option inside -% table cells} -%\changes{v2.2j}{2011/06/26}{Fix incorrect line breaking in \cs{SIrange}} -%\changes{v2.2k}{2011/06/27}{Fix behaviour of subscripts inside alignments -% when printing in text mode} -%\changes{v2.2l}{2011/06/30}{Fix loss of main unit when \opt{per-mode} is set -% to \opt{symbol} and a pre-unit is used} -%\changes{v2.3}{2011/06/19}{New implementation for alignment in \texttt{S} -% column} -%\changes{v2.3a}{2011/07/09}{Restore fix in v2.2l missing in v2.3} -%\changes{v2.3b}{2011/08/08}{Adjust internal load order so that -% \opt{free-standing-units} works correctly for abbreviations} -%\changes{v2.3c}{2011/07/12}{Fix display of \( \pm \) in numbers when -% \opt{separate-uncertainty} is \opt{true} and literal units are used} -%\changes{v2.3d}{2011/08/18}{Fix broken superscript display in literal unit -% mode} -%\changes{v2.3e}{2011/09/09}{Internal changes to work with \LaTeX3 -% updates} -%\changes{v2.3f}{2011/09/03}{Fix processing of numbers in tables when entire -% number is invalid} -%\changes{v2.3g}{2011/10/06}{Deal with erroneous leading zero in some -% fixed exponent cases} -%\changes{v2.3h}{2011/10/14}{Ensure math mode for exponent products in all -% circumstances} -%\changes{v2.3h}{2011/10/14}{Improvements to output when using \pkg{tex4ht}} -%\changes{v2.4}{2011/11/03}{Reduce number of math mode options, improving -% consistency of output} -%\changes{v2.4a}{2011/11/28}{Extend search-and-replace code for UTF-8 -% characters} -%\changes{v2.4a}{2011/12/04}{Use a more cautious approach to changing -% settings at the start of the document} -%\changes{v2.4b}{2011/12/06}{Erroneous doubled \texttt{\#} corrected} -%\changes{v2.4c}{2011/12/09}{Erroneous check for text mode sanserif font fixed} -%\changes{v2.4d}{2011/12/09}{Fix for edge-case user commands in captions -% where the command clashes with a unit name} -%\changes{v2.4e}{2011/12/11}{Fix issue with \pkg{inputenc} package and -% some of the recent special symbol changes} -%\changes{v2.4f}{2011/12/21}{Allow easier use of headings when not parsing -% numbers in tables} -%\changes{v2.4f}{2011/12/23}{Fix bug with detection of bold font in table -% cells} -%\changes{v2.4g}{2012/01/06}{Update internals to match changes in \pkg{expl3} -% which caused issues with some tokens in numerical arguments} -%\changes{v2.4h}{2012/01/15}{Bug fix for implementation of -% \opt{reciprocal-positive-first}} -%\changes{v2.4i}{2012/01/19}{Bug fix for rounding with large numbers of -% decimal places} -%\changes{v2.4j}{2012/01/26}{Leave vertical mode before any document-level -% commands} -%\changes{v2.4k}{2012/03/22}{Internal changes to allow for \pkg{breqn} -% package tricks} -%\changes{v2.4l}{2012/03/23}{Fix a load-order issue with \pkg{soulpos} -% package} -%\changes{v2.4m}{2012/04/03}{Correct bug in \cs{SIlist} when only a single -% number is given} -%\changes{v2.4n}{2012/04/04}{Allow conversion of numbers with more than -% nine digits to scientific notation} -% \changes{v2.5}{2012/04/07}{Fixed table code to give fewer underfull -% boxes when comparators are used} -% \changes{v2.5}{2015/04/07}{Added \opt{zero-decimal-to-integer} option} -% \changes{v2.5}{2012/04/07}{Added \opt{omit-uncertainty} option} -% \changes{v2.5}{2012/04/08}{Modified \opt{fixed-exponent} such that it can -% remove an exponent part} -% \changes{v2.5}{2012/04/08}{Modified number of intrinsically-mathematical -% options} -% \changes{v2.5a}{2012/04/19}{Fixed support for \enquote{dynamic} nature of spacing -% in free standing units (bug introduced in v2.5)} -% \changes{v2.5b}{2012/04/20}{Fixed treatement \texttt{\^} and \texttt{\_} -% in literal units when \pkg{breqn} package is loaded} -% \changes{v2.5b}{2012/04/20}{Added support for \pkg{eulervm} package} -% \changes{v2.5c}{2012/04/03}{Fixed conversion of numbers with more than -% nine digits when using fixed exponents} -% \changes{v2.5c}{2012/05/03}{Modified treatment entirely empty cells in -% \texttt{s} columns} -% \changes{v2.5d}{2012/06/11}{Extend range of settings automatically altered -% to use UTF-8 values is appropriate} -% \changes{v2.5d}{2012/06/11}{Added \opt{qualifier-phrase} option} -% \changes{v2.5d}{2012/06/11}{Added \opt{phrase} choice for \opt{qualifier-mode} -% option} -% \changes{v2.5e}{2012/06/13}{Fixed an internal error in unit expansion -% introduced in v2.4f} -% \changes{v2.5f}{2012/07/16}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.5g}{2012/07/22}{Fixed \opt{binary-units} option} -% \changes{v2.5h}{2012/08/28}{Modified literal unit test to allow spaces in -% units to be ignored} -% \changes{v2.5i}{2012/09/11}{Fixed alignment of values without uncertainties in -% columns where space is reserved for uncertainties} -% \changes{v2.5j}{2012/09/18}{Fixed rounding when uncertainties are present} -% \changes{v2.5k}{2012/09/20}{Fixed a warning with \pkg{amsmath} related to fraction -% functions} -% \changes{v2.5k}{2012/11/13}{Fixed handling spaces correctly after start of document} -% \changes{v2.5l}{2012/11/21}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.5m}{2012/11/27}{Fixed bug with UTF-8 engines and literal units} -% \changes{v2.5m}{2012/11/27}{Fixed \cs{highlight} behavior in bookmarks} -% \changes{v2.5m}{2012/11/27}{Modified loading of \opt{binary-units}} -% \changes{v2.5m}{2012/11/27}{Fixed right-to-left mode with \pkg{bidi} -% package} -% \changes{v2.5n}{2012/12/29}{Fixed transmission of grouping information by -% \cs{SendSettingsToPgf}} -% \changes{v2.5o}{2013/01/09}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.5p}{2013/02/01}{Fixed printing of \cs{pm} and \cs{mp} when used -% as signs in text mode} -% \changes{v2.5q}{2013/03/10}{Fixed use active \texttt{-} in numbersn} -% \changes{v2.5q}{2013/03/10}{Fixed binary units in tables} -% \changes{v2.5r}{2013/07/11}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.5s}{2013/07/31}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.6}{2013/11/19}{Fixed loading when \pkg{mdwtab} is in use} -% \changes{v2.6}{2014/09/03}{Fixed minus sign when \pkg{tex4ht} is in use} -% \changes{v2.6}{2014/09/03}{Fixed spacing when printing comparators} -% \changes{v2.6}{2014/09/03}{Modified treatment of hard spaces (\texttt{\~}) in -% argument of \cs{num}} -% \changes{v2.6}{2014/09/03}{Modified standard setting for \opt{mode} option -% to \opt{math}} -% \changes{v2.6}{2014/09/04}{Fixed printing of uncertainties when the -% input is an integer and the uncertainty is given as a separate part} -% \changes{v2.6}{2014/09/04}{Fixed definition \cs{fg} in -% bookmarks when \pkg{babel} is loaded with the \opt{french} option} -% \changes{v2.6}{2014/09/05}{Fixed printing exponent in tables when -% \opt{output-exponent-marker} is active} -% \changes{v2.6a}{2014/09/15}{Modified glyph selection when \pkg{fontspec} -% is detected} -% \changes{v2.6b}{2014/09/27}{Modified range of font shapes which can be -% detected} -% \changes{v2.6c}{2014/10/01}{Fixed use of \cs{micro} when \pkg{fontspec} -% is loaded but \pkg{unicode-math} is not} -% \changes{v2.6d}{2014/10/07}{Fixed conversion of \enquote{long} to -% \enquote{short} uncertainty values with integer mantissas} -% \changes{v2.6e}{2015/01/21}{Modified symbol selection where \pkg{fontspec} -% and certain other packages are in use} -% \changes{v2.6f}{2015/04/01}{Fixed \opt{table-sign-exponent} and -% \opt{table-sign-mantissa} options when set \opt{false}} -% \changes{v2.6f}{2015/04/04}{Modified detection of \pkg{mathspec}} -% \changes{v2.6g}{2015/06/24}{Fixed issue with empty table cells} -% \changes{v2.6h}{2015/07/17}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.6i}{2015/08/18}{Fixed rounding of numbers with large numbers of -% digits} -% \changes{v2.6i}{2015/08/18}{Fixed behaviour of \cs{cancel} when printing -% in math mode} -% \changes{v2.6j}{2015/09/01}{Fixed printing of all units when -% \opt{exponent-to-prefix} is set} -% \changes{v2.6j}{2015/09/01}{Fixed appearance of $\pm$ when -% \opt{exponent-to-prefix} is set} -% \changes{v2.6k}{2015/09/12}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.6l}{2015/09/14}{Fixed an internal error} -% \changes{v2.6m}{2015/10/15}{Fixed an issue with \pkg{mwtab}} -% \changes{v2.6n}{2015/12/31}{Modified definition for degree Celsius} -% \changes{v2.6n}{2015/12/31}{Fixed {\aa}ngstr{\"o}m symbol with \LuaTeX{}} -% \changes{v2.6o}{2016/01/05}{Added support for unit powers when converting exponents -% to prefixes} -% \changes{v2.6p}{2016/01/13}{Added support for reciprocal powers when converting -% exponents to prefixes} -% \changes{v2.6p}{2016/01/19}{Modified definition for degree Celsius} -% \changes{v2.6q}{2016/03/01}{Fixed font selection when document commands are -% used inside table cells in \texttt{S} columns} -% \changes{v2.6r}{2016/06/06}{Fixed color safety issue} -% \changes{v2.6r}{2016/08/14}{Fixed internal \pkg{expl3} usage issues} -% \changes{v2.6r}{2016/08/21}{Fixed handling \texttt{e0}} -% \changes{v2.6r}{2016/08/21}{Added a warning when color support is not available} -% \changes{v2.6s}{2016/09/02}{Removed one excess warning} -% \changes{v2.7}{2016/11/11}{Added first documented code level interfaces} -% \changes{v2.7}{2016/11/23}{Fixed behavior when \pkg{cellspace} is applied to -% math mode material} -% \changes{v2.7b}{2017/01/28}{Fixed large numbers in scientific mode} -% \changes{v2.7c}{2017/02/01}{Fixed spacing of integers in tables when -% aligning decimal marker to center} -% \changes{v2.7d}{2017/02/19}{Fixed doubled pre-number tokens in tables} -% \changes{v2.7e}{2017/03/06}{Modified treatment of \texttt{+} } -% \changes{v2.7f}{2017/03/23}{Fixed spacing with \opt{reciprocal-positive-first} -% setting} -% \changes{v2.7g}{2017/05/19}{Fixed an issue with recent \pkg{expl3} update} -% \changes{v2.7h}{2017/06/12}{Modified code internals} -% \changes{v2.7i}{2017/07/23}{Fixed an incorrect variable name} -% \changes{v2.7k}{2017/11/01}{Fixed formatting of units when not parsed} -% \changes{v2.7l}{2018/03/11}{Modified \pkg{unicode-math} support} -% \changes{v2.7m}{2018/03/20}{Modified definition of \cs{astronomicalunit} unit} -% \changes{v2.7n}{2018/04/27}{Fixed symbolic input and digit grouping} -% \changes{v2.7q}{2018/05/11}{Fixed patching of \pkg{cellspace} columns} -% \changes{v2.7r}{2018/05/16}{Fixed issue in tabulars when REV\TeX{} is in use} -% \changes{v2.7s}{2018/05/17}{Modified package date format} -% \changes{v2.7t}{2018/06/08}{Fix inclusion of sign in astronomy-style -% angles} -% \changes{v2.7t}{2019/10/10}{Fix \opt{round-half} when \opt{even} at zero precision} -% \changes{v2.7u}{2020/01/15}{Modified internals to track \pkg{expl3} changes} -% \changes{v2.7v}{2020/02/17}{Fix appearance of superscript decimals with -% comma decimal marker} -% \changes{v2.8}{2020/02/20}{Use companion font symbols (now always loaded by -% the kernel)} -% \changes{v2.8}{2020/02/20}{Allow \cs{ohm} to appear correctly in PDF -% bookmarks} -% \changes{v2.8a}{2020/02/23}{Correct appearance of ohm when -% \pkg{unicode-math} is loaded} -% \changes{v2.8b}{2020/02/25}{Correct appearance of ohm when -% \pkg{newtxmath} is loaded} -% -%\begin{abstract} -% Physical quantities have both numbers and units, and each physical -% quantity should be expressed as the product of a number and a unit. -% Typesetting physical quantities requires care to ensure that the -% combined mathematical meaning of the number--unit combination is -% clear. In particular, the SI units system lays down a consistent -% set of units with rules on how these are to be used. However, -% different countries and publishers have differing conventions on -% the exact appearance of numbers (and units). -% -% The \pkg{siunitx} package provides a set of tools for authors -% to typeset quantities in a consistent way. The package has an -% extended set of configuration options which make it possible to -% follow varying typographic conventions with the same input syntax. -% The package includes automated processing of numbers and units, and -% the ability to control tabular alignment of numbers. -%\end{abstract} -% -%\tableofcontents -% -%\begin{documentation} -% -%\section{Introduction} -% -% The correct application of units of measurement is very important -% in technical applications. For this reason, carefully-crafted -% definitions of a coherent units system have been laid down by the -% \emph{Conf\'erence G\'en\'erale des Poids et -% Mesures} (CGPM): this has resulted in the \emph{Syst\`eme -% International d'Unit\'es} (SI). At the same time, typographic -% conventions for correctly displaying both numbers and units exist to -% ensure that no loss of meaning occurs in printed matter. -% -% \pkg{siunitx} aims to provide a unified method for \LaTeX{} users to -% typeset numbers and units correctly and easily. The design -% philosophy of \pkg{siunitx} is to follow the agreed rules by -% default, but to allow variation through option settings. In this way, -% users can use \pkg{siunitx} to follow the requirements of -% publishers, co-authors, universities, \emph{etc}.~without needing to -% alter the input at all. -% -%\section{Installation} -% -% The package is supplied in \file{dtx} format and as a pre-extracted -% zip file, \file{\jobname.tds.zip}. The later is most convenient for -% most users: simply unzip this in your local texmf directory and -% run \texttt{texhash} to update the database of file locations. If -% you want to unpack the \file{dtx} yourself, running -% \texttt{tex \jobname.dtx} will extract the package whereas -% \texttt{latex \jobname.dtx} will extract it and also typeset the -% documentation. -% -% The package requires \LaTeX3 support as provided in the -% \pkg{l3kernel} and \pkg{l3packages} bundles. Both of these are available -% on \href{http://www.ctan.org}{\textsc{ctan}} as ready-to-install -% zip files. Suitable versions are available in MiK\TeX{}~2.9 and -% \TeX{}~Live 2015 (updating the relevant packages online may be -% necessary). \LaTeX3, and so \pkg{siunitx}, requires the \eTeX{} -% extensions: these are available on all modern \TeX{} systems. -% -% Typesetting the documentation requires a number of packages in -% addition to those needed to use the package. This is mainly -% because of the number of demonstration items included in the text. To -% compile the documentation without error, you will need the packages: -%\begin{itemize} -% \item \pkg{amsmath} -% \item \pkg{booktabs} -% \item \pkg{cancel} -% \item \pkg{caption} -% \item \pkg{cleveref} -% \item \pkg{colortbl} -% \item \pkg{csquotes} -% \item \pkg{helvet} -% \item \pkg{mathpazo} -% \item \pkg{multirow} -% \item \pkg{listings} -% \item \pkg{pgfplots} -% \item \pkg{xcolor} -%\end{itemize} -% -%\section{\pkg{siunitx} for the impatient} -% -% The package provides the user macros: -%\begin{itemize} -% \item \cs{ang}\oarg{options}\marg{angle} -% \item \cs{num}\oarg{options}\marg{number} -% \item \cs{si}\oarg{options}\marg{unit} -% \item \cs{SI}\oarg{options}\marg{number}\oarg{pre-unit}\marg{unit} -% \item \cs{numlist}\oarg{options}\marg{numbers} -% \item \cs{numrange}\oarg{options}\marg{numbers}\marg{number2} -% \item \cs{SIlist}\oarg{options}\marg{numbers}\marg{unit} -% \item \cs{SIrange}\oarg{options}\marg{number1}\marg{number2}^^A -% \marg{unit} -% \item \cs{sisetup}\marg{options} -% \item \cs{tablenum}\oarg{options}\marg{number} -%\end{itemize} -% plus the \texttt{S} and \texttt{s} column types for decimal -% alignments and units in tabular environments. These user macros and -% column types are designed for -% typesetting numbers and units with control of appearance and with -% intelligent processing. -% -% Numbers are processed with understanding of exponents, complex numbers -% and multiplication. -%\begin{LaTeXdemo} -% \num{12345,67890} \\ -% \num{1+-2i} \\ -% \num{.3e45} \\ -% \num{1.654 x 2.34 x 3.430} -%\end{LaTeXdemo} -% -% The unit system can interpret units given as text to be used directly -% or as macro-based units. In the latter case, different formatting is -% possible. -%\begin{LaTeXdemo} -% \si{kg.m.s^{-1}} \\ -% \si{\kilogram\metre\per\second} \\ -% \si[per-mode=symbol] -% {\kilogram\metre\per\second} \\ -% \si[per-mode=symbol] -% {\kilogram\metre\per\ampere\per\second} -%\end{LaTeXdemo} -% -% Simple lists and ranges of numbers can be handled. -%\begin{LaTeXdemo} -% \numlist{10;20;30} \\ -% \SIlist{0.13;0.67;0.80}{\milli\metre} \\ -% \numrange{10}{20} \\ -% \SIrange{0.13}{0.67}{\milli\metre} -%\end{LaTeXdemo} -% -% By default, all text is typeset in the current upright math -% font. This can be changed by setting the appropriate options: -% "\sisetup{detect-all}" will use the current font for typesetting. -% -%\section{Using the \pkg{siunitx} package} -% -%\subsection{Loading the package} -% -% The package should be loaded in the usual \LaTeXe{} way. -%\begin{LaTeXdemo}[code only] -% \usepackage{siunitx} -%\end{LaTeXdemo} -% The key--value options described later in this document can be used -% when loading the package, for example -%\begin{LaTeXdemo}[code only] -% \usepackage[version-1-compatibility]{siunitx} -%\end{LaTeXdemo} -% to use options from version 1 of the package. -% -%\subsection{Numbers} -% -%\begin{function}{\num} -% \begin{syntax} -% \cs{num}\oarg{options}\marg{number} -% \end{syntax} -%\end{function} -% Numbers are automatically formatted by the \cs{num} macro. This -% takes one optional argument, \meta{options}, and one mandatory one, -% \meta{number}. The contents of \meta{number} are automatically -% formatted. The formatter removes both \enquote{soft} (\verb*" ") and -% \enquote{hard} spaces (\cs{,} and "~"), automatically identifies -% exponents (by default -% marked using \texttt{e}, \texttt{E}, \texttt{d} or \texttt{D}) and -% adds the appropriate spacing of large numbers. With the standard -% settings a leading zero is added before a decimal marker, if needed: -% both \enquote{\texttt{.}} and \enquote{\texttt{,}} are recognised as -% decimal markers. -%\begin{LaTeXdemo} -% \num{123} \\ -% \num{1234} \\ -% \num{12345} \\ -% \num{0.123} \\ -% \num{0,1234} \\ -% \num{.12345} \\ -% \num{3.45d-4} \\ -% \num{-e10} -%\end{LaTeXdemo} -% Note that numbers are parsed before typesetting, which does -% have a performance overhead (only obvious with very large amounts -% of numerical input). The parser understands a range of input syntaxes, -% as demonstrated above. -% -%\begin{function}{\numlist} -% \begin{syntax} -% \cs{numlist}\oarg{options}\marg{numbers} -% \end{syntax} -%\end{function} -%\changes{v2.0}{2010/05/23}{Introduced \cs{numlist} and \cs{SIlist} -% functions} -% Lists of numbers may be processed using the \cs{numlist} function. -% Each \meta{number} is given within the list of \meta{numbers} within -% a brace pair, as the list can have a flexible length. This function -% should be used in text mode, a common feature of all of the list and -% range functions provided by \pkg{siunitx}.\footnote{The reason for -% this restriction is that the separators between items may involve -% text-mode spaces which must be able to vanish at line breaks. It is -% not possible to achieve this effect from inside math mode.} -%\begin{LaTeXdemo} -% \numlist{10;30;50;70} -%\end{LaTeXdemo} -% -%\begin{function}{\numrange} -% \begin{syntax} -% \cs{numrange}\oarg{options}\marg{number1}\marg{number2} -% \end{syntax} -%\end{function} -% Simple ranges of numbers can be handled using the \cs{numrange} -% function. This acts in the same way as \cs{num}, but inserts a -% phrase or other text between the two entries. This function should -% be used in text mode. -%\begin{LaTeXdemo} -% \numrange{10}{30} -%\end{LaTeXdemo} -% -%\begin{function}{\ang} -% \begin{syntax} -% \cs{ang}\oarg{options}\marg{angle} -% \end{syntax} -%\end{function} -% Angles can be typeset using the \cs{ang} command. The -% \meta{angle} can be given either as a decimal number or as a -% semi-colon separated list of degrees, minutes and seconds, which -% is called \enquote{arc format} in this document. The numbers which -% make up an angle are processed using the same system as other numbers. -%\begin{LaTeXdemo} -% \ang{10} \\ -% \ang{12.3} \\ -% \ang{4,5} \\ -% \ang{1;2;3} \\ -% \ang{;;1} \\ -% \ang{+10;;} \\ -% \ang{-0;1;} -%\end{LaTeXdemo} -% -%\subsection{Units} -% -%\begin{function}{\si} -% \begin{syntax} -% \cs{si}\oarg{options}\marg{unit} -% \end{syntax} -%\end{function} -% The symbol for a unit can be typeset using the \cs{si} macro: this -% provides full control over output format for the unit. Like the -% \cs{num} macro, \cs{si} takes one optional and one mandatory -% argument. The unit formatting system can accept two types of input. -% When the \meta{si} contains literal items (for example letters or -% numbers) then \pkg{siunitx} converts \texttt{.} and "~" into -% inter-unit product and correctly positions sub- and superscripts -% specified using "_" and "^". The formatting methods will work with -% both math and text mode. -%\begin{LaTeXdemo} -% \si{kg.m/s^2} \\ -% \si{g_{polymer}~mol_{cat}.s^{-1}} -%\end{LaTeXdemo} -% The second operation mode for the \cs{si} macro is an -% \enquote{interpreted} system, Here, each unit, SI multiple prefix and -% power is given a macro name. These are entered in a method very -% similar to the reading of the unit name in English. -%\begin{LaTeXdemo} -% \si{\kilo\gram\metre\per\square\second} \\ -% \si{\gram\per\cubic\centi\metre} \\ -% \si{\square\volt\cubic\lumen\per\farad} \\ -% \si{\metre\squared\per\gray\cubic\lux} \\ -% \si{\henry\second} -%\end{LaTeXdemo} -% On its own, this is less convenient than the direct method, although -% it does use meaning rather than appearance for input. However, the -% package allows you to define new unit macros; a large number of -% pre-defined abbreviations are also supplied. More importantly, by -% defining macros for units, instead of literal input, new -% functionality is made available. By altering the settings used by the -% package, the same input can yield a variety of different output -% formats. For example, the \cs{per} macro can give reciprocal powers, -% slashes or be used to construct units as fractions. -% -%\begin{function}{\SI} -% \begin{syntax} -% \cs{SI}\oarg{options}\marg{number}\oarg{preunit}\marg{unit} -% \end{syntax} -%\end{function} -% Very often, numbers and units are given together. Formally, the -% value of a quantity is the product of the number and the unit, the -% space being regarded as a multiplication sign \cite{SI:5.3.3}. The -% \cs{SI} macro combines the functionality of \cs{num} and -% \cs{si}, and makes this both possible and easy. The \meta{number} -% and \meta{si} arguments work exactly like those for the \cs{num} and -% \cs{si} macros, respectively. \meta{preunit} is a unit to be typeset -% \emph{before} the numerical value (most likely to be a currency). -%\begin{LaTeXdemo} -% \SI[mode=text]{1.23}{J.mol^{-1}.K^{-1}} \\ -% \SI{.23e7}{\candela} \\ -% \SI[per-mode=symbol]{1.99}[\$]{\per\kilogram} \\ -% \SI[per-mode=fraction]{1,345}{\coulomb\per\mole} -%\end{LaTeXdemo} -% -% It is possible to set up the unit macros to be available outside of -% the \cs{SI} and \cs{si} functions. This is not the standard -% behaviour as there is the risk of name clashes (for example, \cs{bar} -% is used by other packages, and several packages define \cs{degree}). -% Full details of using \enquote{stand alone} units are found in -% \cref{sec:units:creating}. -% -%\begin{function}{\SIlist} -% \begin{syntax} -% \cs{SIlist}\oarg{options}\marg{numbers}\marg{unit} -% \end{syntax} -%\end{function} -% Lists of numbers with units can be handled using the \cs{SIlist} -% function. The behaviour of this function is similar to \cs{numlist}, -% but with the addition of a unit to each number. This function should -% be used in text mode. -%\begin{LaTeXdemo} -% \SIlist{10;30;45}{\metre} -%\end{LaTeXdemo} -% -%\begin{function}{\SIrange} -% \begin{syntax} -% \cs{SIrange}\oarg{options}\marg{number1}\marg{number2}\marg{unit} -% \end{syntax} -%\end{function} -% Ranges of numbers with units can be handled using the \cs{SIrange} -% function. The behaviour of this function is similar to \cs{numrange}, -% but with the addition of a unit to each number. This function should -% be used in text mode. -%\begin{LaTeXdemo} -% \SIrange{10}{30}{\metre} -%\end{LaTeXdemo} -% -%\subsection{The unit macros} -% -% The package always defines the basic set of SI units with macro names. -% This includes the base SI units, the derived units with special names -% and the prefixes. A small number of powers are also given pre-defined -% names. Full details of units in the SI are available -% on-line~\cite{BIPM}. -% -% The seven base SI units are always defined -% (\cref{tab:unit:base}). In addition, the macro \cs{meter} is -% available as an alias for \cs{metre}, for users of US spellings. -% The full details of the base units are given in the SI -% Brochure~\cite{SI:2.1}. -%\begin{table} -% \caption{SI base units.} -% \label{tab:unit:base} -% \centering -% \begin{tabular}{lll} -% \toprule -% Unit & Macro & Symbol \\ -% \midrule -% \DescribeUnit{ampere} \\ -% \DescribeUnit{candela} \\ -% \DescribeUnit{kelvin} \\ -% \DescribeUnit{kilogram} \\ -% \DescribeUnit{metre} \\ -% \DescribeUnit{mole} \\ -% \DescribeUnit{second} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% The SI also lists a number of units which have special names and -% symbols \cite{SI:2.2.2}: these are listed in -% \cref{tab:unit:derived}. As a short-cut for the degree Celsius, -% the unit \cs{celsius} is defined equivalent to \cs{degreeCelsius} . -%\begin{table} -% \caption{Coherent derived units in the SI with special names and -% symbols.} -% \label{tab:unit:derived} -% \centering -% \begin{tabular}{lll>{\qquad}lll} -% \toprule -% Unit & Macro & Symbol & Unit & Macro & Symbol \\ -% \midrule -% \DescribeUnit{becquerel} & -% \DescribeUnit{newton} \\ -% \DescribeNamedUnit{degree Celsius}{degreeCelsius} & -% \DescribeUnit{ohm} \\ -% \DescribeUnit{coulomb} & -% \DescribeUnit{pascal} \\ -% \DescribeUnit{farad} & -% \DescribeUnit{radian} \\ -% \DescribeUnit{gray} & -% \DescribeUnit{siemens} \\ -% \DescribeUnit{hertz} & -% \DescribeUnit{sievert} \\ -% \DescribeUnit{henry} & -% \DescribeUnit{steradian} \\ -% \DescribeUnit{joule} & -% \DescribeUnit{tesla} \\ -% \DescribeUnit{katal} & -% \DescribeUnit{volt} \\ -% \DescribeUnit{lumen} & -% \DescribeUnit{watt} \\ -% \DescribeUnit{lux} & -% \DescribeUnit{weber} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% In addition to the official SI units, \pkg{siunitx} also provides -% macros for a number of units which are accepted for use in the SI -% although they are not SI units. \cref{tab:unit:accepted} lists -% the \enquote{accepted} units \cite{SI:4.1.T6}. Some units are -% fundamental physical quantities, and these are non-SI but can be used -% within the SI (\cref{tab:unit:physical}, \cite{SI:4.1.T7}). -% There are also a set of non-SI units which are used in certain -% defined circumstances (\cref{tab:unit:other}), although they are -% not necessarily officially sanctioned \cite{SI:4.1.T8}. -% \DescribeMacro{\percent} -% The package also predefines the \cs{percent} macro. While this is not a -% unit, it is used in the same way in many cases and is therefore provided -% on the grounds of realism. -%\begin{table} -% \caption{Non-SI units accepted for use with the -% International System of Units.} -% \label{tab:unit:accepted} -% \centering -% \begin{tabular}{lll} -% \toprule -% Unit & Macro & Symbol \\ -% \midrule -% \DescribeUnit{day} \\ -% \DescribeUnit{degree} \\ -% \DescribeUnit{hectare} \\ -% \DescribeUnit{hour} \\ -% \DescribeUnit{litre} \\ -% \SpecialUsageIndex{\liter}^^A -% & \cs{liter} & \si{\liter} \\ -% \DescribeNamedUnit{minute (plane angle)}{arcminute} \\ -% \DescribeNamedUnit{minute (time)}{minute} \\ -% \DescribeNamedUnit{second (plane angle)}{arcsecond} \\ -% \DescribeUnit{tonne} \\ -% \bottomrule -% \end{tabular} -%\end{table} -%\begin{table} -% \changes{v2.0j}{2010/06/30}{Correct \cs{hartree} unit appearance} -% \caption{Non-SI units whose values in SI units must be obtained -% experimentally.} -% \label{tab:unit:physical} -% \centering -% \begin{tabular}{lll} -% \toprule -% Unit & Macro & Symbol \\ -% \midrule -% \DescribeNamedUnit{astronomical unit}{astronomicalunit} \\ -% \DescribeNamedUnit{atomic mass unit}{atomicmassunit} \\ -% \DescribeUnit{bohr} \\ -% \DescribeNamedUnit{speed of light}{clight} \\ -% \DescribeUnit{dalton} \\ -% \DescribeNamedUnit{electron mass}{electronmass} \\ -% \DescribeUnit{electronvolt} \\ -% \DescribeNamedUnit{elementary charge}{elementarycharge} \\ -% \DescribeUnit{hartree} \\ -% \DescribeNamedUnit{reduced Planck constant}{planckbar} \\ -% \bottomrule -% \end{tabular} -%\end{table} -%\begin{table} -% \caption{Other non-SI units.} -% \label{tab:unit:other} -% \centering -% \begin{tabular}{lll} -% \toprule -% Unit & Macro & Symbol \\ -% \midrule -% \DescribeNamedUnit{{\aa}ngstr{\"o}m}{angstrom} \\ -% \DescribeUnit{bar} \\ -% \DescribeUnit{barn} \\ -% \DescribeUnit{bel} \\ -% \DescribeUnit{decibel} \\ -% \DescribeUnit{knot} \\ -% \DescribeNamedUnit{millimetre of mercury}{mmHg} \\ -% \DescribeNamedUnit{nautical mile}{nauticalmile} \\ -% \DescribeUnit{neper} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% In addition to the units themselves, \pkg{siunitx} provides -% pre-defined macros for all of the SI prefixes -% (\cref{tab:unit:prefix}, \cite{SI:3.1}). The spelling -% \enquote{\cs{deka}} is provided for US users as an alternative to -% \cs{deca}. -%\begin{table} -% \caption{SI prefixes.} -% \label{tab:unit:prefix} -% \centering -% \begin{tabular}{llc>{$}l<{$}>{\qquad}llc>{$}l<{$}} -% \toprule -% Prefix & Macro & Symbol & \multicolumn{1}{l}{Power} & -% Prefix & Macro & Symbol & \multicolumn{1}{l}{Power} \\ -% \midrule -% \DescribePrefix{yocto} & -24 & -% \DescribePrefix{deca} & 1 \\ -% \DescribePrefix{zepto} & -21 & -% \DescribePrefix{hecto} & 2 \\ -% \DescribePrefix{atto} & -18 & -% \DescribePrefix{kilo} & 3 \\ -% \DescribePrefix{femto} & -15 & -% \DescribePrefix{mega} & 6 \\ -% \DescribePrefix{pico} & -12 & -% \DescribePrefix{giga} & 9 \\ -% \DescribePrefix{nano} & -9 & -% \DescribePrefix{tera} & 12 \\ -% \DescribePrefix{micro} & -6 & -% \DescribePrefix{peta} & 15 \\ -% \DescribePrefix{milli} & -3 & -% \DescribePrefix{exa} & 18 \\ -% \DescribePrefix{centi} & -2 & -% \DescribePrefix{zetta} & 21 \\ -% \DescribePrefix{deci} & -1 & -% \DescribePrefix{yotta} & 24 \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% A small number of pre-defined powers are provided as macros. -% \cs{square} and \cs{cubic} are intended for use before units, with -% \cs{squared} and \cs{cubed} going after the unit. -%\begin{LaTeXdemo} -% \si{\square\becquerel} \\ -% \si{\joule\squared\per\lumen} \\ -% \si{\cubic\lux\volt\tesla\cubed} -%\end{LaTeXdemo} -% Generic powers can be inserted on a one-off basis using the \cs{tothe} -% and \cs{raiseto} macros. These are the only macros for units which -% take an argument: -%\begin{LaTeXdemo} -% \si{\henry\tothe{5}} \\ -% \si{\raiseto{4.5}\radian} -%\end{LaTeXdemo} -% Reciprocal powers are indicated using the \cs{per} macro. This applies -% to the next unit only, unless the \opt{sticky-per} option -% is turned on. -%\begin{LaTeXdemo} -% \si{\joule\per\mole\per\kelvin} \\ -% \si{\joule\per\mole\kelvin} \\ -% \si{\per\henry\tothe{5}} \\ -% \si{\per\square\becquerel} -%\end{LaTeXdemo} -%\changes{v2.0i}{2010/06/29}{Correct behaviour of \cs{of} function -% so it actually works (bug introduced in v2.0d)} -% As for generic powers, generic qualifiers are also available using -% the \cs{of} function: -%\begin{LaTeXdemo} -% \si{\kilogram\of{metal}} \\ -% \SI[qualifier-mode = brackets] -% {0.1}{\milli\mole\of{cat}\per\kilogram\of{prod}} -%\end{LaTeXdemo} -% -%\changes{v2.2}{2011/04/05}{Support use of \cs{cancel} macro in units} -%\changes{v2.2}{2011/04/06}{New \cs{highlight} macro for selective -% colour in units} -% If the \pkg{cancel} package is loaded, it is possible to -% \enquote{cancel out} units using the \cs{cancel} macro. This applies -% to the next unit, in a similar manner to a prefix. The \cs{highlight} -% macro is also available to selectively colour units. Both \cs{cancel} -% and \cs{highlight} are of course outside of the normal semantic -% meaning of units, but are provided as they may be useful in some -% cases. -%\begin{LaTeXdemo} -% \si[per-mode = fraction] -% {\cancel\kilogram\metre\per\cancel\kilogram\per\second} \\ -% \si{\highlight{red}\kilogram\metre\per\second} \\ -% \si[unit-color = purple] -% {\highlight{red}\kilogram\metre\per\second} -%\end{LaTeXdemo} -% -% When using the unit macros, the package is able to validate the -% input given. As part of this, stand-alone unit prefixes can be used -% with the \cs{si} macro -%\begin{LaTeXdemo} -% \si{\kilo} \\ -% \si{\micro} \\ -% \si[prefixes-as-symbols = false]{\kilo} -%\end{LaTeXdemo} -% However, the package only allows a single prefix to be used in this -% way: multiple prefixes will give an error, as will trying to give -% a number without a unit. So the following will raise errors: -%\begin{LaTeXdemo}[code only] -% \si{\kilo\gram\micro} \\ -% \SI{10}{\micro} -%\end{LaTeXdemo} -% -%\subsection{Creating new macros} -% -% The various macro components of a unit have to be defined before -% they can be used. The package supplies a number of common definitions, -% but new definitions are also possible. As the definition of a logical -% unit should remain the same in a single document, these creation -% functions are all preamble-only. -% -%\DescribeMacro{\DeclareSIUnit} -%\changes{v2.2}{2011/04/01}{Extend \cs{DeclareSIUnit} to take -% optional argument} -%\begin{syntax} -% \cs{DeclareSIUnit}\oarg{options}\marg{unit}\marg{symbol} -%\end{syntax} -% New units are produced using the \cs{DeclareSIUnit} macro. -% \meta{symbol} can contain literal input, other units, multiple -% prefixes, powers and \cs{per}, although literal text should not be -% intermixed with unit macros. Units can be created with \meta{options} -% from the usual list understood by \pkg{siunitx}, and apply the -% specific unit macro only. The (first) optional argument to \cs{SI} -% and \cs{si} can be used to override the settings for the unit. A -% typical example is the \cs{degree} unit. -%\begin{LaTeXdemo} -% \SI{3.1415}{\degree} -%\end{LaTeXdemo} -% This is declared in the package as: -%\begin{LaTeXdemo}[code only] -% \DeclareSIUnit[number-unit-product = {}] -% \degree{\SIUnitSymbolDegree} -%\end{LaTeXdemo} -% The spacing can still be altered at point of use: -%\begin{LaTeXdemo} -% \SI{67890}{\degree} \\ -% \SI[number-unit-product = \,]{67890}{\degree} -%\end{LaTeXdemo} -% The meaning of a pre-defined unit can be altered by using -% \cs{DeclareSIUnit} after loading \pkg{siunitx}. This will overwrite -% the original definition with the newer version. -% -%\DescribeMacro{\DeclareSIPrefix} -%\DescribeMacro{\DeclareBinaryPrefix} -%\begin{syntax} -% \cs{DeclareSIPrefix}\marg{prefix}\marg{symbol}\marg{powers-ten} -% \cs{DeclareBinaryPrefix}\marg{prefix}\marg{symbol}\marg{powers-two} -%\end{syntax} -% The standard SI powers of ten are defined by the package, and are -% described above. However, the user can define new prefixes with -% \cs{DeclareSIPrefix}. The \cs{DeclareBinaryPrefix} function is also -% available for creating binary prefixes, with the same syntax -% (\meta{powers-ten} being replaced by \meta{powers-two}). For -% example, \cs{kilo} and \cs{kibi} are defined: -%\begin{LaTeXdemo}[code only] -% \DeclareSIPrefix\kilo{k}{3} -% \DeclareBinaryPrefix\kibi{Ki}{10} -%\end{LaTeXdemo} -% -%\DescribeMacro{\DeclareSIPostPower} -%\DescribeMacro{\DeclareSIPrePower} -%\begin{syntax} -% \cs{DeclareSIPostPower}\marg{power}\marg{num} -% \cs{DeclareSIPrePower}\marg{power}\marg{num} -%\end{syntax} -% These create power macros to appear before or after the unit they -% apply to. For example, the preamble to a document might contain: -%\begin{LaTeXdemo}[code only] -% \DeclareSIPrePower\quartic{4} -% \DeclareSIPostPower\tothefourth{4} -%\end{LaTeXdemo} -% with the functions then used in the document as: -%\begin{LaTeXdemo} -% \si{\kilogram\tothefourth}\\ -% \si{\quartic\metre} -%\end{LaTeXdemo} -% -%\DescribeMacro{\DeclareSIQualifier} -% Following the syntax of the other macros, qualifiers are created -% with the syntax \cs{DeclareSIQualifier}\marg{qualifier}\marg{symbol}. -% In contrast to the other parts of a unit, there are no pre-defined -% qualifiers. It is therefore entirely up to the user to create these. -% For example, to identify the mass of a product created when using -% a particular catalyst, the preamble could contain: -%\begin{LaTeXdemo}[code only] -% \DeclareSIQualifier\polymer{pol} -% \DeclareSIQualifier\catalyst{cat} -%\end{LaTeXdemo} -% and then in the body the document could read: -%\begin{LaTeXdemo} -% \SI{1.234}{\gram\polymer\per\mole\catalyst\per\hour} -%\end{LaTeXdemo} -% -%\subsection{Tabular material} -% -% Aligning numbers in tabular content is handled by a new column -% type, the \texttt{S} column. This new column type can align material -% using a number of different strategies, with the aim of flexibility -% of output without needing to alter the input. The method used -% as standard is to place the decimal marker in the number at the -% centre of the cell and to align the material appropriately -% (\cref{tab:S:standard}). -% -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Standard behaviour of the \texttt{S} column type.} -% \label{tab:S:standard} -% \centering -% \begin{tabular}{S} -% \toprule -% {Some Values} \\ -% \midrule -% 2.3456 \\ -% 34.2345 \\ -% -6.7835 \\ -% 90.473 \\ -% 5642.5 \\ -% 1.2e3 \\ -% e4 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -% The \texttt{S} column will attempt to automatically detect -% material which should be placed before or after a number, and will -% maintain the alignment of the numerical data -% (\cref{tab:S:extras}). If the material could be mistaken for -% part of a number, it should be protected by braces. The use of -% \cs{color} in a table cell will also be detected and will override any -% general colour applied by \pkg{siunitx}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Detection of surrounding material in an \texttt{S} -% column.} -% \label{tab:S:extras} -% \centering -% \begin{tabular}{S[color=orange]} -% \toprule -% {Some Values} \\ -% \midrule -% 12.34 \\ -% \color{purple} 975,31 \\ -% 44.268 \textsuperscript{\emph{a}} \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\begin{function}{\tablenum} -% \begin{syntax} -% \cs{tablenum}\oarg{options}\marg{number} -% \end{syntax} -%\end{function} -%\changes{v2.2}{2011/03/20}{Add new \cs{tablenum} macro to allow -% complex table alignments} -%\changes{v2.2g}{2011/06/02}{Ensure \cs{tablenum} works correctly when -% \opt{parse-numbers} is set \opt{false}} -% Within more complex tables, aligned numbers may be desirable within -% the argument of \cs{multicolumn} or -% \cs{multirow}.\footnote{Provided by the \pkg{multirow} package} The -% \cs{tablenum} function is available to achieve alignment in these -% situations: this is, in effect, a macro version of the \texttt{S} macro -% (\cref{tab:tablenum}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Controlling complex alignment with the \cs{tablenum} -% macro.} -% \label{tab:tablenum} -% \centering -% \begin{tabular}{lr} -% \toprule -% Heading & Heading \\ -% \midrule -% Info & More info \\ -% Info & More info \\ -% \multicolumn{2}{c}{\tablenum[table-format = 4.4]{12,34}} \\ -% \multicolumn{2}{c}{\tablenum[table-format = 4.4]{333.5567}} \\ -% \multicolumn{2}{c}{\tablenum[table-format = 4.4]{4563.21}} \\ -% \bottomrule -% \end{tabular} -% \hfil -% \begin{tabular}{lr} -% \toprule -% Heading & Heading \\ -% \midrule -% \multirow{2}*{\tablenum{88,999}} & aaa \\ -% & bbb \\ -% \multirow{2}*{\tablenum{33,435}} & ccc \\ -% & ddd \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -% As a complement to the \texttt{S} column type, \pkg{siunitx} also provides -% a second column type, \texttt{s}. This is intended for producing -% columns of units. This allows both macro-based and explicit units to -% be printed easily (\cref{tab:s:demo}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Units in tables.} -% \label{tab:s:demo} -% \begin{tabular}{s} -% \toprule -% \multicolumn{1}{c}{Unit} \\ -% \midrule -% \metre\squared\per\second \\ -% \pascal \\ -% m.s^{-1} \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -% As the \cs{si} macro can take literal or macro input, the \texttt{s} -% column cannot validate the input. \emph{Everything} in an \texttt{s} -% column is therefore passed to the \cs{si} macro for processing. To -% prevent this, you have to use \cs{multicolumn}, as is shown in -% \cref{tab:s:processing}. Notice that braces alone do not prevent -% processing and colouring of the cell contents. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \texttt{s} column processes everything.} -% \label{tab:s:processing} -% \sisetup{color = orange} -% \begin{tabular}{ss} -% \toprule -% {Unit} & \multicolumn{1}{c}{Unit}\\ -% \midrule -% {\si{m^3}} & \multicolumn{1}{c}{\si{m^3}} \\ -% \kilogram & \kilogram \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\section{Comprehensive details of package control options} -% -%\subsection{The key--value control system} -% -%\DescribeMacro{\sisetup} -% The behaviour of the \pkg{siunitx} package is controlled by a -% number of key--value options. These can be given globally using -% the \cs{sisetup} function or locally as the optional argument to the -% user macros. -% -% The package uses a range of different key types: -%\begin{description} -% \item[\texttt{Choice}] Takes a limited number of choices, which -% are described separately for each key. -% \item[\texttt{Integer}] Requires a number as the argument. -% \item[\texttt{Length}] Requires a length, either as a literal -% value such as "2.0 cm", or stored as a \LaTeX{} length, or -% \TeX{} dimension. -% \item[\texttt{Literal}] A key which uses the value(s) given directly, -% either to check input (for example the \texttt{input-digits} key) -% or in output. -% \item[\texttt{Macro}] Requires a macro, which may need a single -% argument. -% \item[\texttt{Math}] Similar to a \texttt{literal} option, but the -% input is always used in math mode, irrespective of other -% \pkg{siunitx} settings. Thus to text-mode only input must be -% placed inside the argument of a \cs{text} macro. -% \item[\texttt{Meta}] These are options which actually apply -% a number of other options. As such, they do not take any -% value at all. -% \item[\texttt{Switch}] These are on--off switches, and recognise -% \opt{true} and \opt{false}. Giving just the key name also -% turns the key on. -%\end{description} -% The tables of option names use these descriptions to indicate how the -% keys should be used. -% -%\subsection{Detecting fonts} -% -% The \pkg{siunitx} package controls the font used to print output -% independently of the surrounding material. The standard method is to -% ignore the surroundings entirely, and to use the current body fonts. -% However, the package can detect and follow surrounding bold, italic -% and font family changes. The font detection options are summarised in -% \cref{tab:opt:font:det}. -%\begin{table} -% \centering -% \caption{Font detection options.} -% \label{tab:opt:font:det} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% detect-all & Meta & \meta{none} \\ -% detect-display-math & Switch & false \\ -% detect-family & Switch & false \\ -% detect-inline-family & Choice & text \\ -% detect-inline-weight & Choice & text \\ -% detect-mode & Switch & false \\ -% detect-none & Meta & \meta{none} \\ -% detect-shape & Switch & false \\ -% detect-weight & Switch & false \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{detect-weight} -%\DescribeOption{detect-family} -%\DescribeOption{detect-shape} -%\DescribeOption{detect-mode} -%\changes{v2.0o}{2010/07/21}{Extend \opt{detect-italic} option -% to other shapes, renaming as \opt{detect-shape} as a result} -% The options \opt{detect-weight} and \opt{detect-shape} set detection -% of the prevailing font weight and font shape states, respectively. The -% font shape state is only checked if the surrounding material is not in -% math mode (as math text is always italic). The \opt{detect-shape} -% option is an extension of the older \opt{detect-italic} option, which -% is retained for backward compatibility. Detecting the current -% family (roman, sans serif or monospaced) is controlled by the -% \opt{detect-family} setting, while the current mode (text or math) -% is detected using the \opt{detect-mode} switch. -%\DescribeOption{detect-all} -%\DescribeOption{detect-none} -% For convenience, all of the preceding options can be turned on or -% off in one go using the \opt{detect-all} and \opt{detect-none} -% options. As the names indicate, \opt{detect-all} sets all -% of \opt{detect-weight}, \opt{detect-family}, \opt{detect-shape} -% and \opt{detect-mode} to \texttt{true}, while \opt{detect-none} -% sets all of them to \texttt{false}. -% -%\DescribeOption{detect-inline-family} -%\DescribeOption{detect-inline-weight} -%\changes{v2.1k}{2011/02/09}{Remove \opt{combined} choice for option -% \opt{detect-inline-weight}} -%\changes{v2.1k}{2011/02/09}{New option \opt{detect-inline-family}} -%\changes{v2.1l}{2011/02/10}{Error in font family detection introduced -% in v2.1k corrected} -% When \pkg{siunitx} macros are used in in-line math, the detection -% of font weight and font family can be tuned using the -% \opt{detect-inline-family} and \opt{detect-inline-weight} options. -% Both of these take the choices \opt{text} and \opt{math}. -%\begin{LaTeXdemo} -% \sisetup{ -% detect-family = true, -% detect-inline-family = math -% }% -% $\num{1234}$ \\ -% { \sffamily $\num{1234}$ } \\ -% $ \mathsf { \num{1234}} $ \\ -% \sisetup{detect-inline-family = text} -% { \sffamily $\num{1234}$ } \\ -% $ \mathsf { \num{1234} } $ \\ -% \sisetup{ -% detect-weight = true, -% detect-inline-weight = math -% }% -% $\num{5678}$ \\ -% { \boldmath $\num{5678}$ } \\ -% { \bfseries $\num{5678}$ } \\ -% \sisetup{detect-inline-weight = text} -% { \boldmath $\num{5678}$ } \\ -% { \bfseries $\num{5678}$ } -%\end{LaTeXdemo} -% -%\DescribeOption{detect-display-math} -% The font detection system can treat displayed mathematical content -% in two ways. This is controlled by the \opt{detect-display-math} -% option. When set \opt{true}, display mathematics is treated -% independently from the body of the document. Thus the local -% \emph{math} font is checked for matching. In contrast, when set -% \opt{false}, display material is treated with the current running -% text font.\footnote{Here, \enquote{display} math means either typeset -% in \TeX's display math mode or using the AMS display-like -% environments. Simply using \cs{displaystyle} will not make otherwise -% in line math be detected as display math.} -%\begin{LaTeXdemo} -% \sffamily -% Some text -% \sisetup{ -% detect-family, -% detect-display-math = true -% } -% \[ x = \SI{1.2e3}{\kilogram\kelvin\candela} \] -% More text -% \sisetup{detect-display-math = false} -% \[ y = \SI{3}{\metre\second\mole} \] -%\end{LaTeXdemo} -% -%\subsection{Font settings} -% -% The relationship between font family detected and font family used -% for output is not fixed. The font detected by the package in the -% surrounding material does not have to match that used for -% output (\cref{tab:opt:font:set}). -% -%\begin{table} -% \centering -% \caption{^^A -% Font options (also available as \opt{number-\ldots} and -% \opt{unit-\ldots} versions). -% } -% \label{tab:opt:font:set} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% color & Literal & \meta{none} \\ -% math-rm & Macro & \cs{mathrm} \\ -% math-sf & Macro & \cs{mathsf} \\ -% math-tt & Macro & \cs{mathtt} \\ -% mode & Choice & math \\ -% text-rm & Macro & \cs{rmfamily} \\ -% text-sf & Macro & \cs{sffamily} \\ -% text-tt & Macro & \cs{ttfamily} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{mode} -% The \opt{mode} option determines whether \pkg{siunitx} uses -% math or text mode when printing output. The choices are \opt{math} and -% \opt{text}. When using math mode, text is printed using a math font -% whereas in text mode a text font is used. The extent to which this is -% visually obvious depends on the fonts in use in the document. This -% manual uses old style (lower-case) figures in text mode to highlight -% the differences. This option has no effect if the \opt{detect-mode} -% switch is \opt{true}. -% -%\DescribeOption{math-rm} -%\DescribeOption{math-sf} -%\DescribeOption{math-tt} -%\DescribeOption{text-rm} -%\DescribeOption{text-sf} -%\DescribeOption{text-tt} -% If font family detection is inactive, \pkg{siunitx} uses the font -% family stored in either \opt{math-rm} or \opt{text-rm} for -% output. The choice of \opt{math} or \opt{text} depends on the -% \opt{mode} setting. If font family detection is active, -% \pkg{siunitx} may be using a sans serif or monospaced font for -% output. In math mode, these are stored in \opt{math-sf} and -% \opt{math-tt}, and for text mode in \opt{text-sf} and \opt{text-tt}. -% Notice that the detected and output font families can differ. -%\begin{LaTeXdemo} -% \sisetup{detect-family}% -% \num{1234} \\ -% { \sffamily \num{1234} } \\ -% \SI{99}{\metre} \\ -% \sisetup{math-rm = \mathtt}% -% \SI{99}{\metre} -%\end{LaTeXdemo} -% -%\DescribeOption{color} -% The colour of printed output can be set using the \opt{color} -% option. When no colour is given, printing follows the surrounding -% text. In contrast, when a specific colour is given, it is used -% irrespective of the surroundings. As there are a number of different -% colour models available, it is left to user to load \pkg{color} or -% a more powerful colour package such as \pkg{xcolor}. -%\begin{LaTeXdemo} -% \color{red} -% Some text \\ -% \SI{4}{\metre\per\sievert} \\ -% More text \\ -% \SI[color = blue]{4}{\metre\per\sievert} \\ -% Still red here! -%\end{LaTeXdemo} -% -% Every one of the font options can be given independently for units -% and number, with the prefixes \opt{unit-} and \opt{number-}, -% respectively. This allows fine control of output. -%\begin{LaTeXdemo} -% \SI{4}{\angstrom} \\ -% \SI[number-color = green]{4}{\angstrom} \\ -% \SI[unit-color = green]{4}{\angstrom} -%\end{LaTeXdemo} -% -%\subsection{Parsing numbers} -% -% The package uses a sophisticated parsing system to understand -% numbers. This allows \pkg{siunitx} to carry out a range of -% formatting, as described later. All of the input options take lists of -% literal tokens, and are summarised in \cref{tab:opt:num:in}. -% -%\begin{table} -% \centering -% \caption{Options for number parsing.} -% \label{tab:opt:num:in} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% input-close-uncertainty & Literal & ) \\ -% input-comparators & Literal & -% <=>\cs{approx}\cs{ge}\cs{geq} \\ -% & & \cs{gg}\cs{le}\cs{leq}\cs{ll} \cs{sim} \\ -% input-complex-roots & Literal & ij \\ -% input-decimal-markers & Literal & ., \\ -% input-digits & Literal & 0123456789 \\ -% input-exponent-markers & Literal & dDeE \\ -% input-ignore & Literal & \meta{none} \\ -% input-open-uncertainty & Literal & ( \\ ^^A ) -% input-protect-tokens & Literal & -% \cs{approx}\cs{dots}\cs{ge}\cs{geq}\cs{gg}\cs{le} \\ -% & & \cs{leq}\cs{ll}\cs{mp}\cs{pi}\cs{pm}\cs{sim} \\ -% input-signs & Literal & +-\cs{pm}\cs{mp} \\ -% input-uncertainty-signs & Literal & \cs{pm} \\ -% input-symbols & Literal & \cs{pi}\cs{dots} \\ -% parse-numbers & Switch & true \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{input-digits} -%\DescribeOption{input-decimal-markers} -%\DescribeOption{input-signs} -%\DescribeOption{input-exponent-markers} -% The basic parts of a number are the digits, any sign and a separator -% between the integer and decimal parts. These are stored in the input -% options \opt{input-digits}, \opt{input-decimal-markers} and -% \opt{input-signs}, respectively. More than one input decimal marker -% can be used: it will be converted by the package to the appropriate -% output marker. Numbers which include an exponent part also require -% a marker for the exponent: this again is taken from the range of -% tokens in the \opt{input-exponent-markers} option. -% -%\DescribeOption{input-symbols} -%\DescribeOption{input-ignore} -% As well as \enquote{normal} digits, the package will interpret -% symbolic \enquote{numbers} (such as \cs{pi}) correctly if they are -% included in the \opt{input-symbols} list. Symbols are always -% printed in math mode. Tokens given in the \opt{input-ignore} list -% are totally passed over by \pkg{siunitx}: they will be removed from -% the input with no further processing. -% -%\DescribeOption{input-comparators} -%\changes{v2.1}{2010/10/26}{New \opt{input-comparators} option -% for numbers greater than, less than and so on} -% In addition to signs, \pkg{siunitx} can recognise comparators, such -% as \texttt{<}. The package will automatically carry out conversions -% for "<<", ">>", "<=" and ">=" to \cs{ll}, \cs{gg}, \cs{le} and -% \cs{ge}, respectively: -%\begin{LaTeXdemo} -% \num{< 10} \\ -% \SI{>> 5}{\metre} \\ -% \num{\le 0.12} -%\end{LaTeXdemo} -% -%\DescribeOption{input-open-uncertainty} -%\DescribeOption{input-close-uncertainty} -% In some fields, it is common to give the uncertainty in a number -% in brackets after the main part of the number, for example -% \enquote{\num{1.234(5)}}. The opening and closing symbols used for -% this type of input are set as \opt{input-open-uncertainty} and -% \opt{input-close-uncertainty}. -%\DescribeOption{input-uncertainty-signs} -%\changes{v2.2}{2011/04/03}{New \opt{input-uncertainty-signs} -% option} -% Alternatively, the uncertainty may be given as a separate part -% following a sign. Which signs are valid for this operation is -% determined by the \opt{input-uncertainty-signs} option. As with -% other signs, the combination \texttt{+-} will automatically be -% converted to \cs{pm} internally. -%\begin{LaTeXdemo} -% \num{9.99(9)} \\ -% \num{9.99 +- 0.09} \\ -% \num{9.99 \pm 0.09} \\ -% \num{123 +- 4.5} \\ -% \num{12.3 +- 6} -%\end{LaTeXdemo} -% -%\DescribeOption{input-complex-roots} -% When using complex numbers in input, the complex root -% \( ( \mathrm{i} = \sqrt{-1} \, ) \) is indicated by one of the tokens stored -% in \opt{input-complex-roots}. The parser understands complex root -% symbols given either before or after the associated number (but will -% detect any invalid arrangement): -%\begin{LaTeXdemo} -% \num{9.99 + 88.8i} \\ -% \num{9.99 + i88.8} -%\end{LaTeXdemo} -% -%\DescribeOption{input-protect-tokens} -% Some symbols can be problematic under expansion in \LaTeXe. To allow -% these to be used in input without issue, the package can protect these -% tokens while expanding input. Symbols to be protected in this way -% should be listed in \opt{input-protect-tokens}. -% -%\DescribeOption{parse-numbers} -% The \opt{parse-numbers} option turns the entire parsing system on -% and off. The option is made available for two reasons. First, if -% all of the numbers in a document are to be reproduced \enquote{as -% given}, turning off the parser will represent a significant saving in -% processing required. Second, it allows the use of arbitrary \TeX{} -% code in numbers. If the parser is turned off, the input will be -% printed in math mode (requiring \cs{text} to protect any text -% in the number). -%\begin{LaTeXdemo} -% \num[parse-numbers = false]{\sqrt{2}} \\ -% \SI[parse-numbers = false]{\sqrt{3}}{\metre} -%\end{LaTeXdemo} -% -%\subsection{Post-processing numbers} -% -% Before typesetting numbers, various post-processing steps can be -% carried out. These involve adding or removing information from the -% number in a systematic way; the options are summarised in -% \cref{tab:opt:num:post}. -% -%\begin{table} -% \centering -% \caption{Number post-processing options.} -% \label{tab:opt:num:post} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% add-decimal-zero & Switch & true \\ -% add-integer-zero & Switch & true \\ -% explicit-sign & Literal & \meta{none} \\ -% fixed-exponent & Integer & 0 \\ -% minimum-integer-digits & Integer & 0 \\ -% omit-uncertainty & Switch & false \\ -% retain-explicit-plus & Switch & false \\ -% retain-unity-mantissa & Switch & true \\ -% retain-zero-exponent & Switch & false \\ -% round-half & Choice & up \\ -% round-integer-to-decimal & Switch & false \\ -% round-minimum & Literal & 0 \\ -% round-mode & Choice & off \\ -% round-precision & Integer & 2 \\ -% scientific-notation & Switch & false \\ -% zero-decimal-to-integer & Switch & false \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{round-mode} -%\DescribeOption{round-precision} -%\changes{v2.1n}{2011/03/31}{Set output to 0 when \opt{round-mode} -% is \opt{figures} and \opt{round-precision} is 0} -% The \pkg{siunitx} package can round numerical input to a fixed -% number of significant figures or decimal places. This is controlled by -% the \opt{round-mode} option, which takes the choices \opt{off}, -% \opt{figures} and \opt{places}. When rounding is turned on, the -% number of digits used (either decimal places or significant figures in -% the mantissa) is set using the \opt{round-precision} option. No rounding will -% take place if the number contains an uncertainty component. -%\begin{LaTeXdemo} -% \num{1.23456} \\ -% \num{14.23} \\ -% \num{0.12345(9)} \\ -% \sisetup{ -% round-mode = places, -% round-precision = 3 -% }% -% \num{1.23456} \\ -% \num{14.23} \\ -% \num{0.12345(9)} \\ -% \sisetup{ -% round-mode = figures, -% round-precision = 3 -% }% -% \num{1.23456} \\ -% \num{14.23} \\ -% \num{0.12345(9)} -%\end{LaTeXdemo} -%\DescribeOption{round-integer-to-decimal} -%\changes{v2.1}{2010/10/25}{New \opt{zero-integer-to-decimal} option -% to convert integers to decimals on rounding} -% The standard settings for \pkg{siunitx} do not add a decimal part -% if none was given in the input. The \opt{round-integer-to-decimal} -% option can be used to allow this conversion as part of the rounding -% process. -%\begin{LaTeXdemo} -% \num[round-mode = figures]{1} \\ -% \num[round-mode = places]{1} \\ -% \sisetup{round-integer-to-decimal} -% \num[round-mode = figures]{1} \\ -% \num[round-mode = places]{1} -%\end{LaTeXdemo} -% \DescribeOption{zero-decimal-to-integer} -% It may be desirable to convert decimals to integers if the decimal part is -% zero. This is set up using the \opt{zero-decimal-to-integer} option. -%\begin{LaTeXdemo} -% \num{2.0} \\ -% \num{2.1} \\ -% \sisetup{zero-decimal-to-integer} -% \num{2.0} \\ -% \num{2.1} -%\end{LaTeXdemo} -%\DescribeOption{round-minimum} -%\changes{v2.1}{2010/10/27}{New \opt{round-minimum} option -% to set a floor for rounding numbers downward} -% There are cases in which rounding will result in the number reaching -% zero. It may be desirable to show such results as below a threshold -% value. This can be achieved by setting \opt{round-minimum} to the -% threshold value. There will be no effect when rounding to a number of -% significant figures as it is not possible to obtain the value zero in -% these cases. -%\begin{LaTeXdemo} -% \sisetup{round-mode = places}% -% \num{0.0055} \\ -% \num{0.0045} \\ -% \sisetup{round-minimum = 0.01}% -% \num{0.0055} \\ -% \num{0.0045} -%\end{LaTeXdemo} -% \DescribeOption{round-half} -% \changes{v2.4}{2011/1/04}{New \opt{round-half} option} -% In cases where the rounded part of a number is exactly half, there are -% two common methods for \enquote{breaking the tie}. The choice of method -% is determined by the option \opt{round-half}, which recognises the -% choices \opt{up} and \opt{even}. -%\begin{LaTeXdemo} -% \sisetup{round-mode = places, round-half = up}% -% \num{0.055} \\ -% \num{0.045} \\ -% \sisetup{round-half = even}% -% \num{0.055} \\ -% \num{0.045} -%\end{LaTeXdemo} -% -%\DescribeOption{add-decimal-zero} -%\DescribeOption{add-integer-zero} -% It is possible to give real (floating point) numbers as input omitting -% the decimal or the integer parts of the number (for example \num{.123} -% or \num{123.}). The options \opt{add-decimal-zero} and -% \opt{add-integer-zero} allow the package to \enquote{fill in} the -% missing zero. -%\begin{LaTeXdemo} -% \num{123.} \\ -% \num{456} \\ -% \num{.789} \\ -% \sisetup{ -% add-decimal-zero = false, -% add-integer-zero = false, -% }% -% \num{123.} \\ -% \num{456} \\ -% \num{.789} -%\end{LaTeXdemo} -%\DescribeOption{minimum-integer-digits} -%\changes{v2.2}{2011/04/04}{New \opt{minimum-integer-digits} option} -% Related is the \opt{minimum-integer-digits} option. This applies -% only to the integer part of the mantissa, and ensures that it will -% contain at least the specified number of digits. This is achieved -% by padding with zeros if needed. -%\begin{LaTeXdemo} -% \num{123} \\ -% \num[minimum-integer-digits = 1]{123} \\ -% \num[minimum-integer-digits = 2]{123} \\ -% \num[minimum-integer-digits = 3]{123} \\ -% \num[minimum-integer-digits = 4]{123} -%\end{LaTeXdemo} -% -%\DescribeOption{explicit-sign} -%\DescribeOption{retain-explicit-plus} -% The inclusion of a leading plus sign is usually unnecessary for -% positive numbers, and so the \opt{retain-explicit-plus} option is -% available to control whether these are printed. At the same time, it -% may be useful to force all numbers to have a sign. This behaviour -% is controlled by the \opt{explicit-sign} option: this is used if -% given and if no sign was present in the input. -%\begin{LaTeXdemo} -% \num{+345} \\ -% \num[retain-explicit-plus]{+345} \\ -% \num[explicit-sign = -]{345} \\ -% \num[explicit-sign = -]{+345} -%\end{LaTeXdemo} -% -%\DescribeOption{retain-unity-mantissa} -%\DescribeOption{retain-zero-exponent} -% The retention of a zero exponent is controlled by the -% \opt{retain-zero-exponent} option. The retention of a mantissa of one -% is likewise controlled by the \opt{retain-unity-mantissa} option. -%\begin{LaTeXdemo} -% \num{1e4} \\ -% \num[retain-unity-mantissa = false]{1e4} \\ -% \num{444e0} \\ -% \num[retain-zero-exponent = true]{444e0} -%\end{LaTeXdemo} -% -%\DescribeOption{scientific-notation} -%\changes{v2.1}{2010/10/13}{New \opt{scientific-notation} option -% for to use exponent form for numbers in all cases} -%\changes{v2.2}{2011/04/04}{Extend \opt{scientific-notation} option -% to include \opt{engineering} mode} -%\DescribeOption{fixed-exponent} -% Numbers can be converted to scientific notation by the package. This -% is controlled by the \opt{scientific-notation} option, which takes -% choices \opt{false}, \opt{true}, \opt{fixed} and -% \opt{engineering}. The \opt{fixed} setting will use the exponent value -% by the \opt{fixed-exponent} option. When \opt{engineering} is set, -% the exponent is always a power of three. -%\begin{LaTeXdemo} -% \num{0.001} \\ -% \num{0.0100} \\ -% \num{1200} \\ -% \sisetup{scientific-notation = true}% -% \num{0.001} \\ -% \num{0.0100} \\ -% \num{1200} \\ -% \sisetup{scientific-notation = engineering}% -% \num{0.001} \\ -% \num{0.0100} \\ -% \num{1200} \\ -% \sisetup{ -% fixed-exponent = 2, -% scientific-notation = fixed, -% }% -% \num{0.001} \\ -% \num{0.0100} \\ -% \num{1200} -%\end{LaTeXdemo} -% When used with a \opt{fixed-exponent} of zero, this may be used to remove -% scientific notation from the input -%\begin{LaTeXdemo} -% \num{1.23e4} \\ -% \num[scientific-notation = fixed, fixed-exponent = 0]{1.23e4} -%\end{LaTeXdemo} -% Note that these options apply after any removal of unit mantissa, -% zero exponent, \emph{etc.} -% -% \DescribeOption{omit-uncertainty} -% The printing of an uncertainty can be suppressed entirely using the -% \opt{omit-uncertainty} option. -%\begin{LaTeXdemo} -% \num{0.01(2)} \\ -% \num[omit-uncertainty]{0.01(2)} -%\end{LaTeXdemo} -% -%\subsection{Printing numbers} -% -% Actually printing numbers is controlled by a number of settings, -% which apply ideas such as differing decimal markers, digit -% grouping and so on. All of these options are concerned with the -% appearance of output, rather than the data it conveys. The options are -% summarised in \cref{tab:opt:num:out}. -% -%\begin{table} -% \centering -% \caption{Output options for numbers.} -% \label{tab:opt:num:out} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% bracket-negative-numbers & Switch & false \\ -% bracket-numbers & Switch & true \\ ^^A ( -% close-bracket & Literal & ) \\ -% complex-root-position & Choice & after-number \\ -% copy-complex-root & Choice & false \\ -% copy-decimal-marker & Choice & false \\ -% exponent-base & Literal & 10 \\ -% exponent-product & Math & \verb=\times= \\ -% group-digits & Choice & true \\ -% group-minimum-digits & integer & 5 \\ -% group-separator & Literal & \cs{,} \\ -% negative-color & Literal & \meta{none} \\ -% open-bracket & Literal & ( -% \\ ^^A ) ( -% output-close-uncertainty & Literal & ) \\ -% output-complex-root & Literal & \verb=\ensuremath{\mathrm{i}}= \\ -% output-decimal-marker & Literal & . \\ -% output-exponent-marker & Literal & \meta{none} \\ -% output-open-uncertainty & Literal & ( \\ ^^A ) -% separate-uncertainty & Switch & false \\ -% tight-spacing & Switch & false \\ -% uncertainty-separator & Literal & \meta{none} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{group-digits} -%\changes{v2.2a}{2011/04/15}{Add missing default for \opt{group-digits} option} -% \changes{v2.3}{2011/06/06}{Extend \opt{group-digits} option, deprecating -% \opt{group-decimal-digits} and \opt{group-integer-digits}} -%\DescribeOption{group-four-digits} -%\DescribeOption{group-separator} -% Grouping digits into blocks of three is a common method to increase -% the ease of reading of numbers. The \opt{group-digits} choice controls -% whether this behaviour applies, and takes the values \opt{true}, \opt{false}, -% \opt{decimal} and \opt{integer}. Grouping can be activated separately for -% the integer and decimal parts of a number using the appropriately-named -% values. -%\begin{LaTeXdemo} -% \num{12345.67890} \\ -% \num[group-digits = false]{12345.67890} \\ -% \num[group-digits = decimal]{12345.67890} \\ -% \num[group-digits = integer]{12345.67890} -%\end{LaTeXdemo} -% The separator used between groups of digits is stored by the -% \opt{group-separator} option. This takes literal input and may be -% used in math mode: for a text-mode full space use |\text{~}|. -%\begin{LaTeXdemo} -% \num{12345} \\ -% \num[group-separator = {,}]{12345} \\ -% \num[group-separator = \text{~}]{12345} -%\end{LaTeXdemo} -% \DescribeOption{group-minimum-digits} -% \changes{v2.3}{2011/06/06}{New \opt{group-minimum-digits} option to -% replace \opt{group-four-digits}} -% Grouping is not always applied to smaller numbers, and the option -% \opt{group-minimum-digits} is available to specify how many digits must -% be present before grouping is applied. The number of digits is considered -% separately for the integer and decimal parts of the number: grouping -% does not \enquote{cross the boundary}. -%\begin{LaTeXdemo} -% \num{1234} \\ -% \num[group-minimum-digits = 4]{1234} \\ -% \num{1234.5678} \\ -% \num[group-minimum-digits = 4]{1234.5678} -%\end{LaTeXdemo} -% -%\DescribeOption{output-complex-root} -%\DescribeOption{output-decimal-marker} -%\DescribeOption{copy-complex-root} -%\changes{v2.1}{2010/10/02}{New \opt{copy-complex-root} option for -% moving input complex root to output} -%\DescribeOption{copy-decimal-marker} -% The decimal marker used in output is set using the -% \opt{output-decimal-marker} option. This can differ from the input -% marker, as can the root of $\sqrt{-1}$, which is stored in the -% \opt{output-complex-root} option. The standard setting uses \cs{mathrm} -% in math mode to give an upright -% \enquote{i}: this can easily be altered. The complex root or decimal -% marker from the input can be used in the output by setting the -% \opt{copy-complex-root} and \opt{copy-decimal-marker} options, -% respectively. -%\begin{LaTeXdemo} -% \num{1.23} \\ -% \num[output-decimal-marker = {,}]{1.23} \\ -% \num{1+2i} \\ -% \num[output-complex-root = \text{\ensuremath{i}}]{1+2i} \\ -% \num[output-complex-root = j]{1+2i} \\ -% \num[copy-complex-root]{1+2j} \\ -% \num[copy-decimal-marker]{555,555} -%\end{LaTeXdemo} -% -%\DescribeOption{complex-root-position} -% The position of the complex root can be adjusted to place it -% either before or after the associated numeral in a complex number -% using the \opt{complex-root-position} option. -%\begin{LaTeXdemo} -% \num{67-0.9i} \\ -% \num[complex-root-position = before-number]{67-0.9i} \\ -% \num[complex-root-position = after-number]{67-0.9i} -%\end{LaTeXdemo} -% -%\DescribeOption{exponent-base} -%\DescribeOption{exponent-product} -% When exponents are present in the input, the -% \opt{exponent-base} and \opt{exponent-product} options set the obvious -% parts of the output. Notice that the base is in the current mode, but -% the product sign is always in math mode. -%\begin{LaTeXdemo} -% \num[exponent-product = \times]{1e2} \\ -% \num[exponent-product = \cdot]{1e2} \\ -% \num[exponent-base = 2]{1e2} -%\end{LaTeXdemo} -%\DescribeOption{output-exponent-marker} -%\changes{v2.2}{2011/04/03}{New \opt{output-exponent-marker} option} -% Alternatively, if the \opt{output-exponent-marker} option is -% set then the value stored will be used in place of the normal -% product and base combination. This will normally be set up to -% ensure math or text mode. -%\begin{LaTeXdemo} -% \num[output-exponent-marker = \text{e}]{1e2} \\ -% \num[output-exponent-marker = \ensuremath{\mathrm{E}}]{1e2} -%\end{LaTeXdemo} -% -%\DescribeOption{separate-uncertainty} -%\DescribeOption{uncertainty-separator} -%\DescribeOption{output-open-uncertainty} -%\DescribeOption{output-close-uncertainty} -% When input is given including an uncertainty in a number, it can be -% printed either with the uncertainty in brackets or as a separate -% number. This behaviour is controlled by the -% \opt{separate-uncertainty} choice. If the uncertainty is given in -% brackets, a space may be added between the main number and the -% uncertainty: this is stored using the \opt{uncertainty-separator} -% option. The opening and closing brackets used are stored in -% \opt{output-open-uncertainty} and -% \opt{output-close-uncertainty}, respectively. -%\begin{LaTeXdemo} -% \num{1.234(5)} \\ -% \num[separate-uncertainty = true]{1.234(5)} \\ -% \sisetup{ -% output-open-uncertainty = [, -% output-close-uncertainty = ], -% uncertainty-separator = {\,} -% } -% \num{1.234(5)} -%\end{LaTeXdemo} -% Notice that \pkg{siunitx} correctly interprets uncertainties which -% cross the decimal marker position whether these are separated out -% or not. -%\begin{LaTeXdemo} -% \num{8.2(13)} \\ -% \num[separate-uncertainty]{8.2(13)} -%\end{LaTeXdemo} -% -%\DescribeOption{bracket-numbers} -%\DescribeOption{open-bracket} -%\DescribeOption{close-bracket} -% There are certain combinations of numerical input which can be -% ambiguous. This can be corrected by adding brackets in the appropriate -% place, and is controlled by the \opt{bracket-numbers} switch. The -% opening and closing brackets used are stored in \opt{open-bracket} and -% \opt{close-bracket}, respectively. Note that \opt{bracket-numbers} -% only applies to numbers without units: for numbers with units -% see the \opt{multi-part-units} option. -%\begin{LaTeXdemo} -% \num{1+2i e10} \\ -% \num[bracket-numbers = false]{1+2i e10} \\ -% \sisetup{ -% open-bracket = \{, -% close-bracket = \}, -% } -% \num{1+2i e10} -%\end{LaTeXdemo} -% -%\DescribeOption{negative-color} -% \pkg{siunitx} can detect negative mantissa values and alter print -% colour accordingly. This is disabled by setting the option to an empty -% value. -%\begin{LaTeXdemo} -% \num{-15673} \\ -% \num[negative-color = red]{-15673} -%\end{LaTeXdemo} -% -%\DescribeOption{bracket-negative-numbers} -%\changes{v2.2}{2011/04/02}{New \opt{bracket-negative-numbers} option} -% A common means to display negative numbers in financial situations -% is to place them in brackets. This can be carried out automatically -% using the \opt{bracket-negative-numbers} option. -%\begin{LaTeXdemo} -% \num{-15673} \\ -% \num[bracket-negative-numbers]{-15673} \\ -% \SI{-10}{\metre} \\ -% \SI[bracket-negative-numbers]{-10}{\metre} -%\end{LaTeXdemo} -% -%\DescribeOption{tight-spacing} -%\changes{v2.0y}{2010/10/09}{Error with \opt{tight-spacing} option -% and exponents corrected} -% Under some circumstances is may be desirable to \enquote{squeeze} -% the output spacing. This is turned on using the \opt{tight-spacing} -% switch, which compresses spacing where possible. -%\begin{LaTeXdemo} -% \num{1 \pm 2i e3} \\ -% \num[tight-spacing = true]{1 \pm 2i e3} -%\end{LaTeXdemo} -% -%\subsection{Multi-part numbers} -% -% \pkg{siunitx} recognises the idea of products and quotients in -% numbers, both with and without units. These multi-part numbers have -% a number of options affecting how they are processed. The options are -% summarised in \cref{tab:opt:num:multi}. -% -%\begin{table} -% \centering -% \caption{Multi-part number options.} -% \label{tab:opt:num:multi} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% fraction-function & Macro & \cs{frac} \\ -% input-product & Literal & x \\ -% input-quotient & Literal & / \\ -% output-product & Math & \verb=\times= \\ -% output-quotient & Literal & / \\ -% quotient-mode & Choice & symbol \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{input-product} -%\DescribeOption{input-quotient} -% The options \opt{input-product} and \opt{input-quotient} contain the -% tokens used to determine if a number contains multiple parts. -%\begin{LaTeXdemo} -% \num{1 x 2 x 3} \\ -% \num{1e4 x 2(3) x 3/4} \\ -% \num[input-product=*]{4 * 5 * 6} \\ -% \num{ 1 / 2e4 } \\ -% \num{ 1e2 / 3e4 } -%\end{LaTeXdemo} -%\DescribeOption{output-product} -%\DescribeOption{output-quotient} -% The symbols used for printing products and quotients are stored using -% the options \opt{output-product} and \opt{output-quotient}. -%\begin{LaTeXdemo} -% \num[output-product = \cdot]{4.87 x 5.321 x 6.90545} \\ -% \num[output-quotient = \text{ div }]{1 / 2} -%\end{LaTeXdemo} -% -%\DescribeOption{quotient-mode} -% For quotients, there is the possibility to print output either using -% a slash, or using the \cs{frac} macro. This is controlled by the -% \opt{quotient} choice option, which takes values \opt{symbol} and -% \opt{fraction}. -%\begin{LaTeXdemo} -% \num{1 / 2e4} \\ -% \num[quotient-mode = fraction]{1 / 2e4} -%\end{LaTeXdemo} -% -%\DescribeOption{fraction-function} -% The function used when \opt{quotient-mode = fraction} is set is -% determined by the \opt{fraction-function} option. This should -% be set to a function which takes two arguments, and presumably -% creates some type of fraction. Most alternatives to the standard -% \cs{frac} function will involve loading additional packages: the -% demonstrations here need \pkg{amsmath} and -% \pkg{xfrac}. -%\begin{LaTeXdemo} -% \sisetup{quotient-mode = fraction} -% \num{1 / 1} -% \num[fraction-function = \dfrac]{1 / 2} -% \num[fraction-function = \sfrac]{1 / 3} -% \num[fraction-function = \tfrac]{1 / 4} -%\end{LaTeXdemo} -% -%\subsection{Lists and ranges of numbers} -% -% Lists and ranges of numbers have a small number of specialised -% options, which apply to these more unusual input forms -% (\cref{tab:opt:num:list}). -% -%\begin{table} -% \centering -% \caption{Output options for lists and ranges of numbers.} -% \label{tab:opt:num:list} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% list-final-separator & Literal & \verb*= and = \\ -% list-pair-separator & Literal & \verb*= and = \\ -% list-separator & Literal & \verb*=, = \\ -% range-phrase & Literal & \verb*= to = \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% \DescribeOption{list-final-separator} -% \DescribeOption{list-pair-separator} -% \changes{v2.4}{2011/11/02}{New \opt{list-pair-separator} option} -% \DescribeOption{list-separator} -% Lists of numbers are printed with a separator between each item, -% which is stored using the \opt{list-separator} option. The -% separator before the last item of a list may be different, and -% is therefore set using the \opt{list-final-separator} option. -% The separator used for exactly two items is set using the -% \opt{list-pair-separator} option. Any -% spaces needed should be included in the option settings: none are -% added within the code. These items are printed in text mode. -%\begin{LaTeXdemo} -% \numlist{0.1;0.2;0.3} \\ -% \numlist[list-separator = {; }]{0.1;0.2;0.3} \\ -% \numlist[list-final-separator = {, }]{0.1;0.2;0.3} \\ -% \numlist[ -% list-separator = { and }, -% list-final-separator = { and finally } -% ]{0.1;0.2;0.3} \\ -% \numlist{0.1;0.2} \\ -% \numlist[list-pair-separator = {, and }]{0.1;0.2} -%\end{LaTeXdemo} -% -%\DescribeOption{range-phrase} -% Ranges of numbers can be given as input. These will have an -% appropriate word or symbol inserted between the two entries: this -% is stored using the \opt{range-phrase} option. The phrase should -% include any necessary spaces: no extra space is added. -%\begin{LaTeXdemo} -% \numrange{5}{100} \\ -% \numrange[range-phrase = --]{5}{100} -%\end{LaTeXdemo} -% -% \changes{v2.4}{2011/11/04}{Automatically compress exponents for lists and -% ranges when fixed exponents are active} -% For lists and ranges when a single unit is given, \pkg{siunitx} will -% automatically \enquote{compress} exponents when a fixed exponent is in -% use. -%\begin{LaTeXdemo} -% \sisetup{ -% fixed-exponent = 3 , -% list-units = brackets , -% range-units = brackets , -% scientific-notation = fixed -% }% -% \SIrange{1e3}{7e3}{\metre} \\ -% \SIlist{1e3;2e3;3e3}{\kg} -%\end{LaTeXdemo} -% -%\subsection{Angles} -% -% Angle processing provided by the \cs{ang} function has a set of -% options which apply in addition to the general ones set up for number -% processing (\cref{tab:opt:ang}). -% -%\begin{table} -% \centering -% \caption{Angle options.} -% \label{tab:opt:ang} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% add-arc-degree-zero & Switch & false \\ -% add-arc-minute-zero & Switch & false \\ -% add-arc-second-zero & Switch & false \\ -% angle-symbol-over-decimal & Switch & false \\ -% arc-separator & Literal & \meta{empty} \\ -% number-angle-product & Literal & \meta{empty} \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{number-angle-product} -% The separator between the number and angle symbol (degrees, minutes -% or seconds) can be set using the \opt{number-angle-product} -% option, independent of the related \opt{number-unit-product} -% option used by the \cs{SI} function. -%\begin{LaTeXdemo} -% \ang{2.67} \\ -% \ang[number-angle-product = \,]{2.67} -%\end{LaTeXdemo} -% -%\DescribeOption{arc-separator} -% When angles are printed in arc format, the separation of the different -% parts is set up using the \opt{arc-separator} option. -%\begin{LaTeXdemo} -% \ang{6;7;6.5} \\ -% \ang[arc-separator = \,]{6;7;6.5} -%\end{LaTeXdemo} -% -%\DescribeOption{add-arc-degree-zero} -%\DescribeOption{add-arc-minute-zero} -%\DescribeOption{add-arc-second-zero} -% Zero-filling for the degree, minute or second parts of an arc is -% controlled using the \opt{add-arc-degree-zero}, -% \opt{add-arc-minute-zero} and \opt{add-arc-second-zero} options. -% All are off as standard. -%\begin{LaTeXdemo} -% \ang{-1;;} \\ -% \ang{;-2;} \\ -% \ang{;;-3} \\ -% \sisetup{add-arc-degree-zero} -% \ang{-1;;} \\ -% \ang{;-2;} \\ -% \ang{;;-3} \\ -% \sisetup{add-arc-minute-zero} -% \ang{-1;;} \\ -% \ang{;-2;} \\ -% \ang{;;-3} \\ -% \sisetup{add-arc-second-zero} -% \ang{-1;;} \\ -% \ang{;-2;} \\ -% \ang{;;-3} -%\end{LaTeXdemo} -% -%\DescribeOption{angle-symbol-over-decimal} -% In some subject areas, most notably astronomy, the angle symbols -% are given over the decimal marker, rather than at the end of the -% number. This behaviour is available using the -% \opt{angle-symbol-over-decimal} option. -%\begin{LaTeXdemo} -% \ang{45.697} \\ -% \ang{6;7;6.5} \\ -% \ang[angle-symbol-over-decimal]{45.697} \\ -% \ang[angle-symbol-over-decimal]{6;7;6.5} -%\end{LaTeXdemo} -% -%\subsection{Creating units} -%\label{sec:units:creating} -% -% The various macro units are created at the start of the document. -% \pkg{siunitx} can define these such that they are only available for -% use within the \cs{si} and \cs{SI} functions, or can make the unit -% macros available throughout the document body. There are a number of -% settings which control this creation process -% (\cref{tab:opt:units:def}). As a result, these options all apply -% in the preamble only. -% -%\begin{table} -% \centering -% \caption{Unit creation options.} -% \label{tab:opt:units:def} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% free-standing-units & Switch & false \\ -% overwrite-functions & Switch & false \\ -% space-before-unit & Switch & false \\ -% unit-optional-argument & Switch & false \\ -% use-xspace & Switch & false \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{free-standing-units} -%\changes{v2.1d}{2010/11/14}{Apply unit options when -% \opt{free-standing-units} is active} -%\changes{v2.1e}{2010/11/22}{Further corrections when applying unit -% options when \opt{free-standing-units} is active} -%\DescribeOption{overwrite-functions} -% The \opt{free-standing-units} option controls whether the unit macros -% exist outside of the \cs{si} and \cs{SI} arguments. When this option -% is \opt{true}, \pkg{siunitx} creates the macros for general use. -% The standard method to achieve this does not overwrite any existing -% macros: this behaviour can be altered using the -% \opt{overwrite-functions} switch. -% -%\DescribeOption{space-before-unit} -%\DescribeOption{unit-optional-argument} -%\changes{v2.1f}{2010/11/24}{Typo in definition for -% \opt{unit-optional-argument} implementation corrected} -%\DescribeOption{use-xspace} -% When \enquote{free standing} unit macros are created, their behaviour -% can be adjusted by a number of options. These are mainly intended for -% emulating the input syntax of older packages. The option -% \opt{unit-optional-argument} gives the same behaviour for the -% inputs -%\begin{LaTeXdemo}[code only] -% \SI{10}{\metre} -%\end{LaTeXdemo} -% and -%\begin{LaTeXdemo}[code only] -% \metre[10]. -%\end{LaTeXdemo} -% The \opt{space-before-unit} and \opt{use-xspace} options control -% the behaviour at the \enquote{ends} of the unit macros. Activating -% \opt{space-before-unit} inserts the number--unit space before the -% unit is printed. This is suitable for the input syntax -%\begin{LaTeXdemo}[code only] -% 30\metre -%\end{LaTeXdemo} -% but does mean that the unit macros are incorrectly spaced in running -% text. On the other hand, the \opt{use-xspace} option attempts to -% correctly space input such as -%\begin{LaTeXdemo}[code only] -% \metre is the symbol for metres. -%\end{LaTeXdemo} -% -%\subsection{Loading additional units} -% -% \DescribeOption{abbreviations} -% As standard, \pkg{siunitx} loads a set of abbreviated versions of the -% SI units (\cref{tab:unit:abbr}). The standard \pkg{siunitx} settings only -% create these abbreviations within the scope of the \cs{si} and \cs{SI} -% functions, meaning that no clashes should occur (for example with the -% standard \cs{pm} symbol). Loading of these abbreviations can be prevented -% by setting the option \opt{abbreviations = false} in the preamble. -% -%\begin{center} -% \changes{v2.0n}{2010/07/15}{More abbreviated units} -% \changes{v2.3b}{2011/07/27}{More abbreviated units} -% \tablecaption{Abbreviated units.} -% \label{tab:unit:abbr} -% \tablefirsthead{^^A -% \toprule -% \multicolumn{1}{l}{Unit} & -% \multicolumn{1}{l}{Abbreviation} & -% \multicolumn{1}{l}{Symbol} \\ -% \midrule -% } -% \tablehead{^^A -% \multicolumn{3}{l}{\emph{Continued from previous page}} \\ -% \toprule -% \multicolumn{1}{l}{Unit} & -% \multicolumn{1}{l}{Abbreviation} & -% \multicolumn{1}{l}{Symbol} \\ -% \midrule -% } -% \tabletail{^^A -% \bottomrule -% \multicolumn{3}{r}{\emph{Continued on next page}} \\ -% } -% \tablelasttail{\bottomrule} -% \begin{xtabular}{lcc} -% \DescribeNamedUnit{femtogram}{fg} \\ -% \DescribeNamedUnit{picogram}{pg} \\ -% \DescribeNamedUnit{nanogram}{ng} \\ -% \DescribeNamedUnit{microgram}{ug} \\ -% \DescribeNamedUnit{milligram}{mg} \\ -% \DescribeNamedUnit{gram}{g} \\ -% \DescribeNamedUnit{kilogram}{kg} \\ -% \DescribeNamedUnit{atomic mass unit}{amu} \\ -% -% \midrule -% -% \DescribeNamedUnit{picometre}{pm} \\ -% \DescribeNamedUnit{nanometre}{nm} \\ -% \DescribeNamedUnit{micrometre}{um} \\ -% \DescribeNamedUnit{millimetre}{mm} \\ -% \DescribeNamedUnit{centimetre}{cm} \\ -% \DescribeNamedUnit{decimetre}{dm} \\ -% \DescribeNamedUnit{metre}{m} \\ -% \DescribeNamedUnit{kilometre}{km} \\ -% -% \midrule -% -% \DescribeNamedUnit{attosecond}{as} \\ -% \DescribeNamedUnit{femtosecond}{fs} \\ -% \DescribeNamedUnit{picosecond}{ps} \\ -% \DescribeNamedUnit{nanosecond}{ns} \\ -% \DescribeNamedUnit{microsecond}{us} \\ -% \DescribeNamedUnit{millisecond}{ms} \\ -% \DescribeNamedUnit{second}{s} \\ -% -% \midrule -% -% \DescribeNamedUnit{femtomole}{fmol} \\ -% \DescribeNamedUnit{picomole}{pmol} \\ -% \DescribeNamedUnit{nanomole}{nmol} \\ -% \DescribeNamedUnit{micromole}{umol} \\ -% \DescribeNamedUnit{millimole}{mmol} \\ -% \DescribeNamedUnit{mole}{mol} \\ -% \DescribeNamedUnit{kilomole}{kmol} \\ -% -% \midrule -% -% \DescribeNamedUnit{picoampere}{pA} \\ -% \DescribeNamedUnit{nanoampere}{nA} \\ -% \DescribeNamedUnit{microampere}{uA} \\ -% \DescribeNamedUnit{milliampere}{mA} \\ -% \DescribeNamedUnit{ampere}{A} \\ -% \DescribeNamedUnit{kiloampere}{kA} \\ -% -% \midrule -% -% \DescribeNamedUnit{microlitre}{ul} \\ -% \DescribeNamedUnit{millilitre}{ml} \\ -% \DescribeNamedUnit{litre}{l} \\ -% \DescribeNamedUnit{hectolitre}{hl} \\ -% \DescribeNamedUnit{microliter}{uL} \\ -% \DescribeNamedUnit{milliliter}{mL} \\ -% \DescribeNamedUnit{liter}{L} \\ -% \DescribeNamedUnit{hectoliter}{hL} \\ -% -% \midrule -% -% \DescribeNamedUnit{millihertz}{mHz} \\ -% \DescribeNamedUnit{hertz}{Hz} \\ -% \DescribeNamedUnit{kilohertz}{kHz} \\ -% \DescribeNamedUnit{megahertz}{MHz} \\ -% \DescribeNamedUnit{gigahertz}{GHz} \\ -% \DescribeNamedUnit{terahertz}{THz} \\ -% -% \midrule -% -% \DescribeNamedUnit{millinewton}{mN} \\ -% \DescribeNamedUnit{newton}{N} \\ -% \DescribeNamedUnit{kilonewton}{kN} \\ -% \DescribeNamedUnit{meganewton}{MN} \\ -% -% \midrule -% -% \DescribeNamedUnit{pascal}{Pa} \\ -% \DescribeNamedUnit{kilopascal}{kPa} \\ -% \DescribeNamedUnit{megapacal}{MPa} \\ -% \DescribeNamedUnit{gigapascal}{GPa} \\ -% -% \midrule -% -% \DescribeNamedUnit{milliohm}{mohm} \\ -% \DescribeNamedUnit{kilohm}{kohm} \\ -% \DescribeNamedUnit{megohm}{Mohm} \\ -% -% \midrule -% -% \DescribeNamedUnit{picovolt}{pV} \\ -% \DescribeNamedUnit{nanovolt}{nV} \\ -% \DescribeNamedUnit{microvolt}{uV} \\ -% \DescribeNamedUnit{millivolt}{mV} \\ -% \DescribeNamedUnit{volt}{V} \\ -% \DescribeNamedUnit{kilovolt}{kV} \\ -% -% \midrule -% -% \DescribeNamedUnit{watt}{W} \\ -% \DescribeNamedUnit{microwatt}{uW} \\ -% \DescribeNamedUnit{milliwatt}{mW} \\ -% \DescribeNamedUnit{kilowatt}{kW} \\ -% \DescribeNamedUnit{megawatt}{MW} \\ -% \DescribeNamedUnit{gigawatt}{GW} \\ -% \DescribeNamedUnit{joule}{J} \\ -% \DescribeNamedUnit{microjoule}{uJ} \\ -% \DescribeNamedUnit{millijoule}{mJ} \\ -% \DescribeNamedUnit{kilojoule}{kJ} \\ -% \DescribeNamedUnit{electronvolt}{eV} \\ -% \DescribeNamedUnit{millielectronvolt}{meV} \\ -% \DescribeNamedUnit{kiloelectronvolt}{keV} \\ -% \DescribeNamedUnit{megaelectronvolt}{MeV} \\ -% \DescribeNamedUnit{gigaelectronvolt}{GeV} \\ -% \DescribeNamedUnit{teraelectronvolt}{TeV} \\ -% \DescribeNamedUnit{kilowatt hour}{kWh} \\ -% -% \midrule -% -% \DescribeNamedUnit{farad}{F} \\ -% \DescribeNamedUnit{femtofarad}{fF} \\ -% \DescribeNamedUnit{picofarad}{pF} \\ -% -% \midrule -% -% \DescribeNamedUnit{kelvin}{K} \\ -% -% \midrule -% -% \DescribeNamedUnit{decibel}{dB} \\ -% -% \end{xtabular} -%\end{center} -% -% \DescribeOption{binary-units} -% \DescribeMacro{\bit} -% \DescribeMacro{\byte} -% Binary data is expressed in units of bits and bytes. These are -% normally given prefixes which use powers of two, rather than the -% powers of ten used by the SI prefixes. As these binary prefixes are -% closely related to the SI prefixes, they are defined by \pkg{siunitx} -% but do have to be loaded using \opt{binary-units = true} (or -% simply \opt{binary-units}) -% (\cref{tab:unit:binary}). The units \cs{bit} and \cs{byte} are -% then also available. -%\begin{LaTeXdemo} -% \SI{100}{\mebi\byte} \\ -% \SI[prefixes-as-symbols=false]{30}{\kibi\bit} -%\end{LaTeXdemo} -% -%\begin{table} -% \caption{Binary prefixes.} -% \label{tab:unit:binary} -% \centering -% \begin{tabular}{llc>{$}l<{$}} -% \toprule -% Prefix & Macro & Symbol & \multicolumn{1}{l}{Power} \\ -% \midrule -% \DescribePrefix{kibi} & 10 \\ -% \DescribePrefix{mebi} & 20 \\ -% \DescribePrefix{gibi} & 30 \\ -% \DescribePrefix{tebi} & 40 \\ -% \DescribePrefix{pebi} & 50 \\ -% \DescribePrefix{exbi} & 60 \\ -% \DescribePrefix{zebi} & 70 \\ -% \DescribePrefix{yobi} & 80 \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -% \DescribeOption{version-1-compatibility} -% A configuration file is also included which will use settings -% and define macros as defined by version 1 of \pkg{siunitx}: this -% can be accessed with the option \opt{version-1-compatibility}. -% This is intended to allow easy transition to version 2: users -% should update their source to use the new interfaces and functions. -% -% Users upgrading from version 1 of \pkg{siunitx} will notice that -% the various \enquote{specialist} units available in version 1 are -% no longer provided as loadable options.\footnote{They are included -% in the loaded configuration file \opt{version-1}, but this is intended -% purely to ease transition to version 2.} These are not included in -% version 2 as the criteria for inclusion of such units are far from -% clear, and it is difficult to justify providing clearly non-SI -% units in the package. For reference, appropriate definitions for -% the units which where provided in version 1 are as follows. -%\begin{LaTeXdemo}[code only] -% % Astronomy -% \DeclareSIUnit\parsec{pc} -% \DeclareSIUnit\lightyear{ly} -% -% % Chemical engineering -% \DeclareSIUnit\gmol{g\text{-}mol} -% \DeclareSIUnit\kgmol{kg\text{-}mol} -% \DeclareSIUnit\lbmol{lb\text{-}mol} -% -% % Chemistry -% \DeclareSIUnit\molar{\mole\per\cubic\deci\metre} -% \DeclareSIUnit\Molar{\textsc{m}} -% \DeclareSIUnit\torr{torr} -% -% % Geophysics -% \DeclareSIUnit\gon{gon} -% -% % High energy physics -% \DeclareSIUnit\micron{\micro\metre} -% \DeclareSIUnit\mrad{\milli\rad} -% \DeclareSIUnit\gauss{G} -% \DeclareSIUnit\eVperc{\eV\per\clight} -% \DeclareSIUnit\nanobarn{\nano\barn} -% \DeclareSIUnit\picobarn{\pico\barn} -% \DeclareSIUnit\femtobarn{\femto\barn} -% \DeclareSIUnit\attobarn{\atto\barn} -% \DeclareSIUnit\zeptobarn{\zepto\barn} -% \DeclareSIUnit\yoctobarn{\yocto\barn} -% \DeclareSIUnit\nb{\nano\barn} -% \DeclareSIUnit\pb{\pico\barn} -% \DeclareSIUnit\fb{\femto\barn} -% \DeclareSIUnit\ab{\atto\barn} -% \DeclareSIUnit\zb{\zepto\barn} -% \DeclareSIUnit\yb{\yocto\barn} -%\end{LaTeXdemo} -% Users can use a local configuration file to make additional units -% available on a local basis, as described in \cref{sec:config:local}. -% -%\subsection{Using units} -% -% Part of the power of \pkg{siunitx} is the ability to alter the output -% format for units without changing the input. The behaviour of units -% is therefore controlled by a number of options which alter either the -% processing of units or the output directly -% (\cref{tab:opt:units:out}). -% -%\begin{table} -% \centering -% \caption{Unit output options.} -% \label{tab:opt:units:out} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule -% bracket-unit-denominator & Switch & true \\ -% forbid-literal-units & Switch & false \\ -% literal-superscript-as-power & Switch & true \\ -% inter-unit-product & Literal & \cs{,} \\ -% parse-units & Switch & true \\ -% per-mode & Choice & reciprocal \\ -% per-symbol & Literal & / \\ -% power-font & Choice & number \\ -% prefixes-as-symbols & Switch & true \\ -% qualifier-mode & Choice & subscript \\ -% sticky-per & Switch & false \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{forbid-literal-units} -% Some users may prefer to completely disable the use of literal input -% in units, for example to enforce consistency. This can be -% accomplished by setting the \opt{forbid-literal-units} switch. With -% this option enabled, only macro-based units can be used in a document. -% -%\DescribeOption{inter-unit-product} -% The separator between each unit is stored using the -% \opt{inter-unit-product} option. The standard setting is a thin -% space: another common choice is a centred dot. To get the correct -% spacing it is necessary to use |\ensuremath{{}\cdot{}}| in the latter case. -%\begin{LaTeXdemo} -% \si{\farad\squared\lumen\candela} \\ -% \si[inter-unit-product = \ensuremath{{}\cdot{}}] -% {\farad\squared\lumen\candela} -%\end{LaTeXdemo} -% -%\DescribeOption{per-mode} -%\changes{v2.1i}{2011/01/27}{Improved logic for \opt{per-mode} setting -% \opt{symbol-or-fraction}} -%\changes{v2.2}{2011/04/05}{Include leading \( 1 \) when \opt{per-mode} -% is set to \opt{symbol} and there are no numerator units in \cs{si} -% arguments} -%\DescribeOption{per-symbol} -%\DescribeOption{bracket-unit-denominator} -% The handling of \cs{per} is altered using the \opt{per-mode} choice -% option. The standard setting is \opt{reciprocal}, meaning that -% \cs{per} generates reciprocal powers for units. Setting the option -% to \opt{fraction} uses the \cs{frac} function to typeset the positive -% and negative powers of a unit separately. -%\begin{LaTeXdemo} -% \si{\joule\per\mole\per\kelvin} \\ -% \si{\metre\per\second\squared} \\ -% \si[per-mode=fraction]{\joule\per\mole\per\kelvin} \\ -% \si[per-mode=fraction]{\metre\per\second\squared} -%\end{LaTeXdemo} -% The closely-related \opt{reciprocal-positive-first} setting acts in -% the same way but places all of the positive powers before any negative -% ones. -%\begin{LaTeXdemo} -% \si{\ampere\per\mole\second} \\ -% \si[per-mode = reciprocal-positive-first] -% {\ampere\per\mole\second} -%\end{LaTeXdemo} -% It is possible to use a symbol (usually \texttt{/}) to separate the -% two parts of a unit by setting \opt{per-mode} to \opt{symbol}; the -% symbol used is stored using the setting \opt{per-symbol}. This method -% for displaying units can be ambiguous, and so brackets are added -% unless \opt{bracket-unit-denominator} is set to \opt{false}. -% Notice that \opt{bracket-unit-denominator} only applies when -% \opt{per-mode} is set to \opt{symbol} or \opt{symbol-or-fraction}. -%\begin{LaTeXdemo} -% \sisetup{per-mode = symbol}% -% \si{\joule\per\mole\per\kelvin} \\ -% \si{\metre\per\second\squared} \\ -% \si[per-symbol = \text{~div~}]{\joule\per\mole\per\kelvin} \\ -% \si[bracket-unit-denominator = false]{\joule\per\mole\per\kelvin} -%\end{LaTeXdemo} -% The often-requested (but mathematically invalid) -% \opt{repeated-symbol} option is also available to repeat the symbol -% for each \cs{per}. -%\begin{LaTeXdemo} -% \si[per-mode=repeated-symbol]{\joule\per\mole\per\kelvin} -%\end{LaTeXdemo} -% Finally, it is possible for the behaviour of the \cs{per} function -% to depend on the prevailing math style. Setting \opt{per-mode} to -% \opt{symbol-or-fraction} will use the \opt{symbol} setting for -% in line math, and the \opt{fraction} setting when used in -% \cs{displaystyle} math. -%\begin{LaTeXdemo} -% \sisetup{per-mode = symbol-or-fraction}% -% \( \si{\joule\per\mole\per\kelvin} \) -% \[ \si{\joule\per\mole\per\kelvin} \] -% \si{\joule\per\mole\per\kelvin} \\ -% \( -% \displaystyle -% \si{\joule\per\mole\per\kelvin} -% \) -% \[ -% \textstyle -% \si{\joule\per\mole\per\kelvin} -% \] -%\end{LaTeXdemo} -% -%\DescribeOption{sticky-per} -% By default, \cs{per} applies only to the next unit -% given.\footnote{This is the standard method of reading units in -% English: for example, \si{\joule\per\mole\per\kelvin} is pronounced -% \enquote{joules per mole per kelvin}.} By setting the -% \opt{sticky-per} flag, this behaviour is changed so that \cs{per} -% applies to all subsequent units. -%\begin{LaTeXdemo} -% \si{\pascal\per\gray\henry} \\ -% \si[sticky-per]{\pascal\per\gray\henry} -%\end{LaTeXdemo} -% -%\DescribeOption{power-font} -%\changes{v2.1}{2010/10/12}{New \opt{power-font} option for controlling -% whether superscript powers are treated as numbers or units} -% The font used for the powers in units can be typeset using the -% current number or unit font. This may be of use when the font used -% for numbers and units are very different, for example when the -% \pkg{euler} package is loaded. Note that this setting applies to all -% printing options for numbers, including the color used for displaying -% the number. -%\begin{LaTeXdemo} -% \si{\metre\per\second\squared} \\ -% \si[power-font = unit]{\metre\per\second\squared} -%\end{LaTeXdemo} -% \DescribeOption{literal-superscript-as-power} -% \changes{v2.3}{2011/06/08}{New \opt{literal-superscript-as-power} option for -% controlling how literal units superscripts behave} -% When printing units in \enquote{literal} mode, it is possible that simply -% printing superscripts \enquote{as is} may lead to poor appearance for the -% numbers. This is most likely if the text font of the document uses -% old style (lower case) numerals, but the math font uses lining (upper -% case) numerals. It is therefore possible to treat superscripts within -% literal units as powers, and thus for the \opt{power-font} option to -% apply within these literal units. This behaviour is controlled using the -% \opt{literal-superscript-as-power} switch. -%\begin{LaTeXdemo} -% \si{m.s^{2}} \\ -% \si[literal-superscript-as-power = false]{m.s^{2}} -%\end{LaTeXdemo} -% -%\DescribeOption{qualifier-mode} -%\changes{v2.1c}{2010/11/13}{New \opt{text} choice for -% \opt{qualifier-mode} option} -% \DescribeOption{qualifier-phrase} -% Unit qualifiers can be printed in three different formats, set by the -% \opt{qualifier-mode} option. The standard setting is \opt{subscript}, -% while the options \opt{brackets}, \opt{phrase}, \opt{space} and \opt{text} -% are also possible. With the last settings, powers can lead to ambiguity and -% are automatically detected and brackets added as appropriate. -%\begin{LaTeXdemo} -% \si{\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -% \si[qualifier-mode = brackets] -% {\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -% \si[qualifier-mode = subscript] -% {\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -% \si[qualifier-mode = space] -% {\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -% \si[qualifier-mode = text] -% {\deci\bel\isotropic} -%\end{LaTeXdemo} -% The \opt{phrase} setting for \opt{qualifier-mode} uses the text stored using -% \opt{qualifier-phrase} to separate the qualifier. -%\begin{LaTeXdemo} -% \si[qualifier-mode = phrase] -% {\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -% \si[qualifier-mode = phrase, qualifier-phrase = { by }] -% {\kilogram\polymer\squared\per\mole\catalyst\per\hour} \\ -%\end{LaTeXdemo} -% -%\DescribeOption{prefixes-as-symbols} -% The unit prefixes (\cs{kilo}, \emph{etc}.) are normally given as -% letters. However, the package can convert these into numerical powers. -% This is controlled by the \opt{prefixes-as-symbols} switch option. -% This correctly deals with the kilogram, which is a base unit even -% though it involves a prefix. -%\begin{LaTeXdemo} -% \si{\milli\litre\per\mole\deci\ampere} \\ -% \SI{10}{\kilo\gram\squared\deci\second} \\ -% \si[prefixes-as-symbols=false]{\milli\litre\per\mole\deci\ampere}\\ -% \SI[prefixes-as-symbols=false]{10}{\kilo\gram\squared\deci\second} -%\end{LaTeXdemo} % -%\DescribeOption{parse-units} -% Normally, \pkg{siunitx} is used with the unit parse enabled, and -% only prints units directly if there is literal input. However, if -% the input is known to be essentially consistent and high performance -% is desired, then the parser can be turned off using the -% \opt{parse-units} switch. -%\begin{LaTeXdemo} -% \SI{300}{\MHz} \\ -% \SI[parse-units = false]{300}{\MHz} -%\end{LaTeXdemo} +% File: siunitx.dtx Copyright (C) 2008-2019,2021 Joseph Wright % -%\subsection{Numbers with units} +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file % -% Some options apply to the combination of units and numbers, rather -% than to units or numbers alone (\cref{tab:opt:units:numbers}). +% https://www.latex-project.org/lppl.txt % -%\begin{table} -% \centering -% \caption{Options for numbers with units.} -% \label{tab:opt:units:numbers} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% allow-number-unit-breaks & Switch & false \\ -% exponent-to-prefix & Switch & false \\ -% list-units & Choice & repeat \\ -% multi-part-units & Choice & brackets \\ -% number-unit-product & Literal & \cs{,} \\ -% product-units & Choice & repeat \\ -% range-units & Choice & repeat \\ -% \bottomrule -% \end{tabular} -%\end{table} +% This file is part of the "siunitx bundle" (The Work in LPPL) +% and all files in that bundle must be distributed together. % -%\DescribeOption{allow-number-unit-breaks} -% Usually, the combination of a number and unit is regarded as a single -% mathematical entity which should not be split across lines. However, -% there are cases (very long units, narrow columns, \emph{etc}.) where -% breaks may be needed. This can be turned on using the -% \opt{allow-number-unit-breaks} option. -%\begin{LaTeXdemo} -% \begin{minipage}{2.55 cm} -% % Gives an underfull hbox -% Some filler text \SI{10}{\metre} \\ -% \sisetup{allow-number-unit-breaks} -% Some filler text \SI{10}{\metre} -% \end{minipage} -%\end{LaTeXdemo} +% The released version of this bundle is available from CTAN. % -%\DescribeOption{number-unit-product} -% The product symbol between the number and unit is set using the -% \opt{number-unit-product} option. -%\begin{LaTeXdemo} -% \SI{2.67}{\farad} \\ -% \SI[number-unit-product = \ ]{2.67}{\farad} \\ -% \SI[number-unit-product = ]{2.67}{\farad} -%\end{LaTeXdemo} +% ----------------------------------------------------------------------- % -%\DescribeOption{multi-part-units} -% When a number has multiple parts (such as a separate uncertainty) then -% the unit must apply to all parts of the number. How this is shown is -% controlled using the \opt{multi-part-units} options. The standard -% setting is \opt{brackets}, which will place the entire numerical part -% in brackets and use a single unit symbol. Alternative options are -% \opt{repeat} (print the unit for each part of the number) and -% \opt{single} (print only one unit symbol: mathematically incorrect). -%\begin{LaTeXdemo} -% \sisetup{separate-uncertainty}% -% \SI{12.3(4)}{\kilo\gram} \\ -% \SI[multi-part-units = brackets]{12.3(4)}{\kilo\gram} \\ -% \SI[multi-part-units = repeat]{12.3(4)}{\kilo\gram} \\ -% \SI[multi-part-units = single]{12.3(4)}{\kilo\gram} -%\end{LaTeXdemo} -% It is important to notice that numbers with units are not affected by -% the setting of \opt{bracket-numbers}, which applies to \enquote{pure} -% numbers only. For example: -%\begin{LaTeXdemo} -% \sisetup{separate-uncertainty,bracket-numbers = false}% -% \num{1.234(5)e-4} \\ -% \SI{1.234(5)e-4}{\metre} -%\end{LaTeXdemo} -% The reason is that the requirements to bracket values with units are -% fundamentally different from those for numbers alone. Some -% combinations which are mathematically valid in the absence of a unit -% become invalid when a unit is present. +% The development version of the bundle can be found at % -%\DescribeOption{product-units} -% When a product of quantities is given, the resulting units can be -% displayed in a number of ways, set using the \opt{product-units} -% option. The standard setting is \opt{repeat}, which prints one -% unit symbol for each numbers. Alternatives are \opt{brackets}, -% \opt{brackets-power}, \opt{power}, \opt{repeat} and \opt{single}. -% This option does not affect the application of brackets for each -% number within the product list: it only sets those around the -% entire list. -%\begin{LaTeXdemo} -% \SI{2 x 3 x 4}{\metre} \\ -% \SI[product-units = brackets]{2 x 3 x 4}{\metre} \\ -% \SI[product-units = brackets-power]{2 x 3 x 4}{\metre} \\ -% \SI[product-units = power]{2 x 3 x 4}{\metre} \\ -% \SI[product-units = repeat]{2 x 3 x 4}{\metre} \\ -% \SI[product-units = single]{2 x 3 x 4}{\metre} -%\end{LaTeXdemo} +% https://github.com/josephwright/siunitx % -%\DescribeOption{list-units} -%\DescribeOption{range-units} -% The \opt{list-units} and \opt{range-units} options determine how -% the \cs{SIlist} and \cs{SIrange} functions display units, -% respectively. The standard setting for both is \opt{repeat}, where -% each number will be printed with a unit. Alternatives are -% \opt{brackets} and \opt{single}. Any brackets needed on individual -% numbers within a product are controlled by the \opt{brackets-numbers} -% option (\emph{i.e}.~they are treated as pure numbers). -% These options do not affect the application of brackets for each -% number within the list or range: they only set those around the -% entire group. -%\begin{LaTeXdemo} -% \SIlist{2;4;6;8}{\tesla} \\ -% \SIlist[list-units = brackets]{2;4;6;8}{\tesla} \\ -% \SIlist[list-units = repeat]{2;4;6;8}{\tesla} \\ -% \SIlist[list-units = single]{2;4;6;8}{\tesla} \\ -% \SIrange{2}{4}{\degreeCelsius} \\ -% \SIrange[range-units = brackets]{2}{4}{\degreeCelsius} \\ -% \SIrange[range-units = repeat]{2}{4}{\degreeCelsius} \\ -% \SIrange[range-units = single]{2}{4}{\degreeCelsius} -%\end{LaTeXdemo} +% for those people who are interested. % -% \DescribeOption{exponent-to-prefix} -% \changes{v2.4}{2011/11/06}{New \opt{exponent-to-prefix} option} -% When the \opt{exponent-to-prefix} option is set \opt{true}, the package -% will attempt to convert any exponents in quantities into unit prefixes, -% and will attach these to the first unit given. This process is only -% possible if the exponent is one for which a prefix is available, and -% retains the number of significant figures in the input. -%\begin{LaTeXdemo} -% \SI{1700}{\g} \\ -% \SI{1.7e3}{\g} \\ -% \sisetup{exponent-to-prefix}% -% \SI{1700}{\g} \\ -% \SI{1.7e3}{\g} \\ -% \sisetup{fixed-exponent = 3, scientific-notation = fixed}% -% \SI{1700}{\g} \\ -% \SI{1.7e3}{\g} -%\end{LaTeXdemo} +% ----------------------------------------------------------------------- % -%\subsection{Tabular material} -% -% Processing of material in tables obeys the same settings as described -% for the functions already described. However, there are some settings -% which apply only to the layout of tabular material -% (\cref{tab:opt:tables}). -% -%\begin{table} -% \centering -% \caption{Options for tabular material.} -% \label{tab:opt:tables} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% table-align-comparator & Switch & true \\ -% table-align-exponent & Switch & true \\ -% table-align-text-pre & Switch & true \\ -% table-align-text-post & Switch & true \\ -% table-align-uncertainty & Switch & true \\ -% table-alignment & Choice & \meta{none} \\ -% table-auto-round & Switch & false \\ -% table-column-width & Length & 0 pt \\ -% table-comparator & Switch & false \\ -% table-figures-decimal & Integer & 2 \\ -% table-figures-exponent & Integer & 0 \\ -% table-figures-integer & Integer & 3 \\ -% table-figures-uncertainty & Integer & 0 \\ -% table-format & Special & \meta{none} \\ -% table-number-alignment & Choice & -% center-decimal-marker \\ -% table-parse-only & Switch & false \\ -% table-omit-exponent & Switch & true \\ -% table-space-text-pre & Literal & \meta{empty} \\ -% table-space-text-post & Literal & \meta{empty} \\ -% table-sign-exponent & Switch & false \\ -% table-sign-mantissa & Switch & false \\ -% table-text-alignment & Choice & center \\ -% table-unit-alignment & Choice & center \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeOption{table-parse-only} -% The main use of the \texttt{S} column is to control the alignment of -% the resulting output. However, it is possible to turn off alignment -% entirely and only use the number parser of \pkg{siunitx}. This is -% achieved using the \opt{table-parse-only} switch, as illustrated -% in \cref{tab:S:parse}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Parsing without aligning in an \texttt{S} column.} -% \label{tab:S:parse} -% \begin{tabular} -% { -% S -% S[table-parse-only] -% } -% \toprule -% {Decimal-centred} & -% {Simple centring} \\ -% \midrule -% 12.345 & 12.345 \\ -% 6,78 & 6,78 \\ -% -88.8(9) & -88.8(9) \\ -% 4.5e3 & 4.5e3 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-number-alignment} -% The alignment of numbers with the boundaries of the \texttt{S} -% column is controlled using the \opt{table-number-alignment} option, -% which takes the values \opt{center-decimal-marker}, \opt{center}, -% \opt{left} and \opt{right}. The \opt{center-decimal-marker} places the -% decimal marker for the number at the centre of the column. This does -% not need any information in advance, and so is the standard setting. -% It works best for approximately symmetrical input (equal numbers of -% digits before and after the decimal). On the other hand, the -% \opt{center}, \opt{left} and \opt{right} options require space to be -% reserved for the numbers, and then use this fixed space to align with -% the edges of the column. The different alignment choices are -% illustrated in \cref{tab:S:align}, which uses somewhat -% exaggerated column headings to show the relative position of the -% cell contents. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Aligning the \texttt{S} column.} -% \label{tab:S:align} -% \centering -% \sisetup{ -% table-figures-integer = 2, -% table-figures-decimal = 4 -% } -% \begin{tabular}{ -% S -% S[table-number-alignment = center] -% S[table-number-alignment = left] -% S[table-number-alignment = right] -% } -% \toprule -% {Some Values} & {Some Values} & {Some Values} & {Some Values} \\ -% \midrule -% 2.3456 & 2.3456 & 2.3456 & 2.3456 \\ -% 34.2345 & 34.2345 & 34.2345 & 34.2345 \\ -% 56.7835 & 56.7835 & 56.7835 & 56.7835 \\ -% 90.473 & 90.473 & 90.473 & 90.473 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% Many of the other table options do not apply when -% \opt{table-number-alignment = center-decimal-marker} is set, as this -% mode always centres the marker at the expense of any other -% choices. -% -%\DescribeOption{table-figures-decimal} -%\DescribeOption{table-figures-exponent} -%\DescribeOption{table-figures-integer} -%\DescribeOption{table-figures-uncertainty} -% The space reserved by \pkg{siunitx} for a number is controlled by -% two families of options. The first family cover the number of digits -% allowed for in different parts of the number, for example -% \opt{table-figures-integer} controls the space for integer digits in -% the mantissa. If the number of figures is set to \num{0}, then no -% space is reserved and some output will either be out of position -% or not printed at all (although a warning will result). Reserving -% space for a given part of number will automatically include space -% for any associated items (for example the \enquote{\( \times \)} -% symbol for exponents). -%\DescribeOption{table-sign-exponent} -%\DescribeOption{table-sign-mantissa} -% The second family of options are switches which govern whether -% space is reserved for a sign: \opt{table-sign-exponent} and -% \opt{table-sign-mantissa}. The effect of altering some of these -% settings is shown in \cref{tab:S:space}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Reserving space in \texttt{S} columns.} -% \label{tab:S:space} -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 2 -% } -% \centering -% \begin{tabular}{ -% S -% S[table-number-alignment = right] -% S[table-figures-uncertainty = 1] -% S[ -% separate-uncertainty, -% table-figures-uncertainty = 1 -% ] -% S[table-sign-mantissa] -% S[table-figures-exponent = 1] -% } -% \toprule -% {Values} -% & {Values} -% & {Values} -% & {Values} -% & {Values} -% & {Values} \\ -% \midrule -% 2.3 & 2.3 & 2.3(5) & 2.3(5) & 2.3 & 2.3e8 \\ -% 34.23 & 34.23 & 34.23(4) & 34.23(4) & 34.23 & 34.23 \\ -% 56.78 & 56.78 & 56.78(3) & 56.78(3) & -56.78 & 56.78e3 \\ -% 3,76 & 3,76 & 3,76(2) & 3.76(2) & +-3.76 & e6 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -%\DescribeOption{table-comparator} -%\changes{v2.1}{2010/10/26}{New \opt{table-comparator} option -% for reserving space for comparators in tables} -% Space can also be reserved in a table for a comparator (greater than, -% less than, and so forth). This is activated using the -% \opt{table-comparator} switch (\cref{tab:S:comparators}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Reserving space for comparators in \texttt{S} columns.} -% \label{tab:S:comparators} -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 2, -% table-figures-decimal = 2, -% table-figures-exponent = 2, -% } -% \centering -% \begin{tabular}{ -% S -% S[table-comparator = true] -% } -% \toprule -% {Values} -% & {Values} \\ -% \midrule -% 2.3 & < 2.3e8 \\ -% 34.23 & = 34.23 \\ -% 56.78 & >= 56.78e3 \\ -% 3,76 & \gg e6 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% The table-printing code will omit any part of a number which has no -% space reserved, placing a warning in the \LaTeX{} log. This means that -% uncertainties and exponents will not be printed if no space is -% reserved for them. -% -%\DescribeOption{table-format} -% As a short cut for the preceding options, \pkg{siunitx} also -% provides the \opt{table-format} option. This can be used to give the -% same information about the space to reserve for a number in a -% \enquote{compressed} manner. The input to \opt{table-format} should -% consist of a number showing how many figures to reserve in each part -% of the input. Thus -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% table-format = 3.2 -% } -%\end{LaTeXdemo} -% is equivalent to -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% table-figures-integer = 3, -% table-figures-decimal = 2 -% } -%\end{LaTeXdemo} -% The \opt{table-format} option will also correctly interpret the -% presence of a sign, so that -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% table-format = +3.2e+4 -% } -%\end{LaTeXdemo} -% will have the same effect as -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% table-figures-integer = 3, -% table-figures-decimal = 2, -% table-figures-exponent = 4, -% table-sign-mantissa, -% table-sign-exponent -% } -%\end{LaTeXdemo} -% It is important to note that any parts of a number \emph{not} -% specified in the table format argument are set to be absent (the -% number of figures is set to zero). Setting the \opt{table-format} -% option also resets \opt{table-number-alignment} to \opt{center} -% (\cref{tab:S:format}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Using the \opt{table-format} option.} -% \label{tab:S:format} -% \centering -% \begin{tabular}{ -% S -% S[table-format = 2.2] -% S[table-format = 2.2(1)] -% S[table-format = +2.2] -% S[table-format = 2.2e1] -% } -% \toprule -% {Values} -% & {Values} -% & {Values} -% & {Values} -% & {Values} \\ -% \midrule -% 2.3 & 2.3 & 2.3(5) & 2.3 & 2.3e8 \\ -% 34.23 & 34.23 & 34.23(4) & 34.23 & 34.23 \\ -% 56.78 & 56.78 & 56.78(3) & -56.78 & 56.78e3 \\ -% 3,76 & 3,76 & 3.76(2) & +-3.76 & e6 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-space-text-pre} -%\DescribeOption{table-space-text-post} -% Space for material before and after the \texttt{S} column can -% be reserved by giving model text for the options -% \opt{table-space-text-pre} and \opt{\ldots -post}. -% This is then used to provide the necessary gap while maintaining -% alignment (\cref{tab:S:ends}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Text before and after numbers.} -% \label{tab:S:ends} -% \centering -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 2, -% table-figures-decimal = 4, -% table-space-text-pre = now~, -% table-space-text-post = -% \textsuperscript{\emph{a}} -% } -% \begin{tabular}{S} -% \toprule -% {Values} \\ -% \midrule -% 2.3456 \\ -% 34.2345 \textsuperscript{\emph{a}}\\ -% 56.7835 \\ -% now~ 90.473 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-align-comparator} -%\changes{v2.2}{2010/04/04}{New \opt{table-align-comparator} -% option for more control of table formatting} -%\DescribeOption{table-align-exponent} -%\DescribeOption{table-align-uncertainty} -%\changes{v2.1}{2010/10/12}{New \opt{table-align-exponent} and -% \opt{table-align-uncertainty} options for additional choices of -% table formatting} -% When printing exponents in tables, there is a choice of aligning -% the exponent parts or having these close up to the mantissa. This -% is controlled by the \opt{table-align-exponent} option -% (\cref{tab:align:exp}). Similarly, uncertainty parts which are printed -% separately from the mantissa can be aligned or closed up. This is -% set by the \opt{table-align-uncertainty} option -% (\cref{tab:align:uncert}). Finally, the same approach is available -% for the comparator with the \opt{table-align-comparator} option -% (\cref{tab:align:comp}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \opt{table-align-exponent} option} -% \label{tab:align:exp} -% \sisetup{table-format = 1.3e2, table-number-alignment = center} -% \begin{tabular}{SS[table-align-exponent = false]} -% \toprule -% {Header} & {Header} \\ -% \midrule -% 1.2e3 & 1.2e3 \\ -% 1.234e56 & 1.234e56 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \opt{table-align-uncertainty} option} -% \label{tab:align:uncert} -% \sisetup{ -% separate-uncertainty, -% table-format = 1.3(1), -% } -% \begin{tabular}{SS[table-align-uncertainty = false]} -% \toprule -% {Header} & {Header} \\ -% \midrule -% 1.2(1) & 1.2(3) \\ -% 1.234(5) & 1.234(5) \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \opt{table-align-comparator} option} -% \label{tab:align:comp} -% \sisetup{table-format = >2.2} -% \begin{tabular}{SS[table-align-comparator = false]} -% \toprule -% {Header} & {Header} \\ -% \midrule -% > 1.2 & > 1.2 \\ -% < 12.34 & < 12.34 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-omit-exponent} -%\changes{v2.1}{2010/10/13}{New \opt{table-omit-exponent} option -% for simplifying tables} -% In cases where data cover a range of values, printing using a fixed -% exponent in a table may make presentation clearer. In these cases, -% omitting the exponent value from the table is useful. The package -% offers the \opt{table-omit-exponent} option to do this -% (\cref{tab:exp:omit}); this automatically sets -% \opt{scientific-notation = fixed} for the table column. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \opt{table-omit-exponent} option} -% \label{tab:exp:omit} -% \begin{tabular}{ -% S[table-format = 1.1e1] -% S[ -% fixed-exponent = 3, -% table-format = 2.1, -% table-omit-exponent -% ] -% } -% \toprule -% {Header} & {Header / \num{e3}} \\ -% \midrule -% 1.2e3 & 1.2e3 \\ -% 3e2 & 3e2 \\ -% 1.0e4 & 1.0e4 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-align-text-pre} -% \changes{v2.3}{2011/06/19}{New \opt{table-align-text-pre} option} -%\DescribeOption{table-align-text-post} -% Note markers are often given in tables after the numerical content. It -% may be desirable for these to close up to the numbers. Whether this -% takes place is controlled by the \opt{table-align-text-pre} -% and \opt{\ldots-post} -% option (\cref{tab:S:notes}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Closing notes up to text.} -% \label{tab:S:notes} -% \newrobustcmd\NoteMark[1]{% -% \textsuperscript{\emph{#1}}% -% } -% \centering -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 2, -% table-figures-decimal = 4, -% table-space-text-pre = \NoteMark{a} -% } -% \begin{tabular}{ -% S -% S[table-align-text-pre = false] -% } -% \toprule -% {Values} & {Values} \\ -% \midrule -% 2.3456 & 2.3456 \\ -% \NoteMark{a} 4.234 & \NoteMark{a} 4.234 \\ -% \NoteMark{b} .78 & \NoteMark{b} .78 \\ -% \NoteMark{d} 88 & \NoteMark{d} 88 \\ -% \bottomrule -% \end{tabular} -% \hfil -% \sisetup{table-space-text-post = \NoteMark{a}} -% \begin{tabular}{ -% S -% S[table-align-text-post = false] -% } -% \toprule -% {Values} & {Values} \\ -% \midrule -% 2.3456 & 2.3456 \\ -% 34.234 \NoteMark{a} & 34.234 \NoteMark{a} \\ -% 56.78 \NoteMark{b} & 56.78 \NoteMark{b} \\ -% 90.4 \NoteMark{c} & 90.4 \NoteMark{c} \\ -% 88 \NoteMark{d} & 88 \NoteMark{d} \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-auto-round} -% The contents of table cells can automatically be rounded or -% zero-filled to the number of decimal digits given for the -% \opt{table-figures-decimal} option. This mode is activated using -% the \opt{table-auto-round} switch, as illustrated in -% \cref{tab:S:auto}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{The \opt{table-auto-round} option.} -% \label{tab:S:auto} -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 1, -% table-figures-decimal = 3 -% } -% % Notice the overfull hbox which results with -% % the first column -% \begin{tabular}{ -% S -% S[table-auto-round] -% } -% \toprule -% {Header} & {Header} \\ -% \midrule -% 1.2 & 1.2 \\ -% 1.2345 & 1.2345 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{parse-numbers} -% When the \opt{parse-numbers} option is set to \opt{false}, then -% the alignment code for tables takes a different approach. The -% output is always set in math mode, and alignment takes place -% at the first decimal marker. This is achieved by making it -% active in math mode. When reserving space for content only -% the integer and decimal values for the mantissa are considered -% (\cref{tab:S:nonparsed}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Aligning without parsing.} -% \label{tab:S:nonparsed} -% \sisetup{ -% parse-numbers = false, -% table-figures-integer = 2, -% table-figures-decimal = 3 -% } -% \centering -% \begin{tabular}{ -% S -% S[table-number-alignment = center] -% S[table-number-alignment = right] -% S[table-number-alignment = left] -% } -% \toprule -% {Some values} -% & {Some values} -% & {Some values} -% & {Some values} \\ -% \midrule -% 2.35 & 2.35 & 2.35 & 2.35 \\ -% 34.234 & 34.234 & 34.234 & 34.234 \\ -% 56.783 & 56.783 & 56.783 & 56.783 \\ -% 3,762 & 3,762 & 3,762 & 3.762 \\ -% \sqrt{2} & \sqrt{2} & \sqrt{2} & \sqrt{2} \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-text-alignment} -% Cell contents which are not part of a number can be protected -% using braces, as illustrated. Cells which contain no numerical data -% at all are aligned using the setting specified by the -% \opt{table-text-alignment} option, which recognises the values -% \opt{center}, \opt{left} and \opt{right} (\cref{tab:S:text}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Aligning text in \texttt{S} columns.} -% \label{tab:S:text} -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 4, -% table-figures-decimal = 4 -% } -% \centering -% \begin{tabular}{ -% S -% S[table-text-alignment = left] -% S[table-text-alignment = right] -% } -% \toprule -% {Values} -% & {Values} -% & {Values} \\ -% \midrule -% 992.435 & 992.435 & 992.435 \\ -% 7734.2344 & 7734.2344 & 7734.2344 \\ -% 56.7834 & 56.7834 & 56.7834 \\ -% 3,7462 & 3,7462 & 3,7462 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-unit-alignment} -% The contents of \texttt{s} columns can be centred or aligned to the -% left or right using the \opt{table-unit-alignment} option. As for the -% other alignment options, this recognises the choices \opt{center}, -% \opt{left} and \opt{right}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Alignment options in \texttt{s} columns.} -% \label{tab:s:align} -% \begin{tabular} -% { -% s[table-unit-alignment = right] -% s -% s[table-unit-alignment = left] -% } -% \toprule -% {Right-aligned} & -% {Centred text} & -% {Left-aligned} \\ -% \midrule -% \metre\per\second & \metre\per\second & \metre\per\second \\ -% \kilogram & \kilogram & \kilogram \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\DescribeOption{table-alignment} -% The three table alignment options (\opt{table-number-alignment}, -% \opt{table-text-alignment} and \opt{table-unit-alignment}) can be set -% to the same value using the \opt{table-alignment} option. This will -% set all three alignment options to the same value (one of -% \opt{center}, \opt{right} or \opt{left}). -% -%\DescribeOption{table-column-width} -%\changes{v2.2}{2011/04/02}{New \opt{table-column-width} option} -%\changes{v2.2f}{2011/05/25}{Fix setting \opt{table-column-width} to -% \opt{0 pt} to restore auto-sizing} -% Usually, the width of the \texttt{S} and \texttt{s} columns is allowed -% to vary depending on the content. However, there are cases where a -% strictly fixed width is desirable. For these cases, the -% \opt{table-column-width} option is available. The standard -% setting, "0 pt", indicates that no fixing takes place. If a value -% is set for this option then the tabular material is typeset to -% the specified width (\cref{tab:width:fixed}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Fixed-width columns.} -% \label{tab:width:fixed} -% \begin{tabular} -% { -% s -% s[table-column-width = 2 cm] -% S -% S[table-column-width = 2 cm] -% } -% \toprule -% {Flexible} & -% {Fixed} & -% {Flexible} & -% {Fixed} \\ -% \midrule -% \metre\per\second & \metre\per\second & 1.23 & 1.23 \\ -% \kilogram\candela & \kilogram\candela & 45.6 & 45.6 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -% The \opt{table-column-width} option can also be used to achieve -% special effects. One example is centring a column of numbers under -% a wide heading, with the numbers themselves right-aligned -% (\cref{tab:width:special}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Right-aligning under a heading.} -% \label{tab:width:special} -% \settowidth\mylength{Long header} -% \sisetup{ -% table-format = 4 , -% table-number-alignment = center , -% table-column-width = \mylength , -% input-decimal-markers = , -% input-symbols = . , -% } -% \begin{tabular}{S} -% \toprule -% {Long header} \\ -% \midrule -% 12.33 \\ -% 2 \\ -% 1234 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Symbols} -% -% Most units use letters as the symbol for the unit, and these are all -% very easy to control. However, a small number of units use other -% symbols, and matching these to the body text requires more work. -% \pkg{siunitx} provides appropriate symbols for commonly-used units, -% but the definitions may need adjustment depending on the body font -% used in a document. -% -%\DescribeOption{redefine-symbols} -% The package provides one general option for the handling of symbols. -% If the packages \pkg{textcomp} or \pkg{upgreek} are loaded, symbols -% can be taken from these for units, rather than using the -% \pkg{siunitx} default values. The switch \opt{redefine-symbols} -% can be used to turn this behaviour on or off: the standard setting -% is \opt{true}. -% -% The individual symbols are set up independently for math and text -% output, and are summarised in \cref{tab:opt:symbols}. Many of -% the definitions are variations using \cs{text} or \cs{ensuremath} to -% produce the correct output, as the symbols available in the document -% may vary considerably. In the case of the micro symbol -% (\SIUnitSymbolMicro), \pkg{siunitx} provides a suitable low-level -% definition for the symbol. Depending on the fonts available, this -% may need to be replaced by an alternative by the user. The -% ohm symbol (\SIUnitSymbolOhm) is usually set to \cs{Omega}, but -% will check that this has not been redefined as a slanted letter. If -% \cs{Omega} has been redefined, an alternative definition is used. -% -%\begin{table} -% \centering -% \caption{Symbol options.} -% \label{tab:opt:symbols} -% \begin{tabular}{>{\ttfamily}ll>{\ttfamily}l} -% \toprule -% \multicolumn{1}{l}{Option name} & -% Type & -% \multicolumn{1}{l}{Default} \\ -% \midrule ^^A ( -% math-angstrom & Literal & \verb=\text{\AA}= \\ -% math-arcminute & Literal & \verb={}^{\prime}= \\ -% math-arcsecond & Literal & \verb={}^{\prime\prime}= \\ -% math-celsius & Literal & \meta{see text} \\ -% math-degree & Literal & \verb=\text{\textdegree}= \\ -% math-micro & Literal & \verb=\text{\textmu}= \\ -% math-ohm & Literal & \verb=\text{\ensuremath{\Omega}}= \\ -% redefine-symbols & Switch & true \\ -% text-angstrom & Literal & \cs{AA} \\ -% text-arcminute & Literal & \verb=\ensuremath{{}^{\prime}}= \\ -% text-arcsecond & Literal & -% \verb=\ensuremath{{}^{\prime\prime}}= \\ -% text-celsius & Literal & \verb=\textdegree C= \\ -% text-degree & Literal & \verb=\textdegree= \\ -% text-micro & Literal & \verb=\textmu= \\ -% text-ohm & Literal & \verb=\textohm= \\ -% \bottomrule -% \end{tabular} -%\end{table} -% -%\DescribeMacro{\SIUnitSymbolAngstrom} -%\DescribeMacro{\SIUnitSymbolArcminute} -%\DescribeMacro{\SIUnitSymbolArcsecond} -%\DescribeMacro{\SIUnitSymbolCelsius} -%\DescribeMacro{\SIUnitSymbolDegree} -%\DescribeMacro{\SIUnitSymbolMicro} -%\DescribeMacro{\SIUnitSymbolOhm} -% The math and text symbols defined above are wrapped up into mode -% independent functions with user names. These are then used in the -% definitions of the appropriate units. For example, the micro -% symbol can be accessed using the macro \cs{SIUnitSymbolMicro}. -% Notice that these names capitalise the unit name (to make reading -% the macro name easier!).\footnote{The function -% \cs{SIUnitSymbolAngstrom} uses the name without accents.} -% -%\subsection{Other options} -% -%\DescribeOption{locale} -%\changes{v2.0m}{2010/07/09}{Re-introduce \opt{locale} option} -% \pkg{siunitx} allows the user to switch between the typographic -% conventions of different (geographical) areas by using locales. -% Currently, the package is supplied with configurations for locales -% \opt{UK}, \opt{US}, \opt{DE} (Germany), \opt{FR} (French) and \opt{ZA} -% (South Africa). The \opt{locale} option is used to switch to a -% particular locale. -%\begin{LaTeXdemo} -% \SI{1.234}{\metre}\\ -% \SI[locale = DE]{6.789}{\metre} -%\end{LaTeXdemo} -% -%\DescribeOption{strict} -% Some users will want to stick closely to the official rules for -% typesetting units. This could be made complicated if the options -% for non-standards behaviour could not be turned off. The -% preamble-only option \opt{strict} resets package behaviour to -% follow the rules closely, and disables options which deviate from -% this. If the package is loaded with the \opt{strict} option, all -% output is made using the upright (serif) font. -% -%\subsection{Local configurations} -%\label{sec:config:local} -% -% The \pkg{siunitx} package will check for a local configuration file -% \file{siunitx.cfg} during package loading. This occurs before -% applying any setting given in the optional argument to -% \cs{usepackage}. A typical configuration file may include -% settings (using \cs{sisetup}) and locally-defined units, for -% example -%\begin{LaTeXdemo}[code only] -% \ProvidesFile{siunitx.cfg} -% \sisetup{ -% output-decimal-marker = {,}, -% per-mode = symbol, -% } -% \DeclareSIUnit\torr{torr} -%\end{LaTeXdemo} -% As units are always declared, overwriting any existing definition, -% units may safely be created in the configuration file even when also -% included in individual \LaTeX{} document headers. -% -% Installing a local configuration file on your system is very much like doing -% a local installation of a package. The exact method depends on the \TeX{} -% system in use. For advice on this, a good start is the -% \href{http://tex.stackexchange.com/questions/1137/} -% {TeX.SX question on local installation}. -% -%\section{Localisation} -% -% The \pkg{translator} package provides a structured framework for -% localisation of words and phrases, and is part of the larger -% \pkg{beamer} bundle. The \pkg{translator} package provides the -% \cs{translate} macro, which will provide appropriate translations -% based on the current \pkg{babel} or \pkg{polyglossia} language -% setting. -% -% If \pkg{translator} is available, \pkg{siunitx} will load it and alter -% the standard settings for the \opt{list-final-separator} and -% \opt{range-phrase} options to read: -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% list-final-separator = { \translate{and} }, -% list-pair-separator = { \translate{and} }, -% range-phrase = { \translate{to (numerical range)} }, -% } -%\end{LaTeXdemo} -% If the current language is known to the \pkg{translator} package -% then the result will be localised text. The preamble for this manual -% loads English, French, German and Spanish as options, and also loads the -% \pkg{babel} package: -%\begin{LaTeXdemo} -% % In English by default -% \SIlist{1;2;3}{\metre} \\ -% \SIrange{1}{10}{\degreeCelsius} \\ -% \selectlanguage{french}% -% \SIlist{1;2;3}{\metre} \\ -% \SIrange{1}{10}{\degreeCelsius} \\ -% \selectlanguage{german}% -% \SIlist{1;2;3}{\metre} \\ -% \SIrange{1}{10}{\degreeCelsius} \\ -% \selectlanguage{spanish}% -% \SIlist{1;2;3}{\metre} \\ -% \SIrange{1}{10}{\degreeCelsius} \\ -%\end{LaTeXdemo} -% -% Note that the in order for this to work correctly, languages should -% be given as global (class) options rather than as package options -% for \pkg{babel}. -% -%\section{Hints for using \pkg{siunitx}} -% -%\subsection{Ensuring text or math output} -% -% The macros \cs{ensuremath} and \cs{text} should be used to ensure that -% a particular item is always printed in the desired mode. Some -% mathematical output does not work well in \cs{mathrm} (the standard -% font used by \pkg{siunitx} for printing). The easiest way to solve -% this is to use the construction "\text{\ensuremath{...}}", which will -% print the material in the standard mathematics font without affecting -% the rest of the output. In some cases, simply forcing \cs{mathnormal} -% will suffice, but this is less reliable with non-Latin characters. -% -%\subsection{Expanding content in tables} -%\label{sec:expanding} -% -% When processing tables, \pkg{siunitx} will expand anything stored -% inside a macro, unless it is long or protected. \LaTeXe{} robust -% commands are also detected and are not expanded -% (\cref{tab:xmpl:macro}). Values which would otherwise be expanded -% can be protected by wrapping them in a set of braces. As \TeX{} itself -% will expand the first token in a table cell before \pkg{siunitx} -% can act on it, using the \eTeX{} protected mechanism is the -% recommended course of action to prevent expansion of macros in -% table cells. (As is shown in the table, \TeX's expansion of -% \LaTeXe{} robust commands can lead to unexpected results.) -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Values as macros in \texttt{S} columns.} -% \label{tab:xmpl:macro} -% \newcommand*\myvaluea{1234} -% \newcommand\myvalueb{1234} -% \DeclareRobustCommand*\myvaluec{1234} -% \protected\def\myvalued{1234} -% \begin{tabular}{S} -% \toprule -% {Some Values} \\ -% \midrule -% \myvaluea 8.8 \myvaluea \\ % Both expanded -% \myvalueb 8.8 \myvalueb \\ % First expanded by TeX -% % to numbers -% \myvaluec 8.8 \myvaluec \\ % First expanded by TeX -% % but not to numbers! -% \myvalued 8.8 \myvalued \\ % Neither expanded -% {\myvaluea\ 8.8 \myvaluea} \\ % Neither expanded -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -% It is possible to use calculated values in tables. For this to -% work, the calculation must take place before attempting to parse -% the number. An added complication is that \TeX{} itself will -% expand the first macro in a table cell until it finds -% something unexpandable. The \eTeX{} protected mechanism can be -% used to prevent this; using the \pkg{etoolbox} package provides -% a convenient way to apply this protection to existing functions. -% The general approach is illustrated in \cref{tab:xmpl:calc}. -% The macro \cs{DTLmul} is made robust inside the table using -% the \cs{robustify} command from \pkg{etoolbox}, before -% constructing the table using an extra column to contain the -% calculation. -%\begin{LaTeXdemo}[code and float] -% \DTLnewdb{data} -% \DTLnewrow{data}\DTLnewdbentry{data}{value}{66.7012} -% \DTLnewrow{data}\DTLnewdbentry{data}{value}{66.0212} -% \DTLnewrow{data}\DTLnewdbentry{data}{value}{64.9026} -% \begin{table} -% \caption{Calculated values.} -% \label{tab:xmpl:calc} -% \centering -% \robustify\DTLmul -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 2, -% table-figures-decimal = 4 -% } -% \begin{tabular}{ -% S -% S[table-figures-integer = 3] -% @{}l -% } -% \toprule -% {Value} & {Doubled} & -% \DTLforeach{data}{\myvalue=value}{% -% \DTLiffirstrow {\\ \midrule}{\\}% -% \myvalue & % First column -% \DTLmul{\myvalue}{\myvalue}{2} \myvalue % second column -% & }\\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Using \pkg{siunitx} with \pkg{datatool}} -% -% As illustrated in \cref{tab:xmpl:calc}, \pkg{siunitx} can be used -% to typeset data stored using \pkg{datatool}. For quickly displaying -% the contents of tables, \pkg{datatool} offers the \cs{DTLshowtable} -% macro. This will only work with \texttt{S} columns if number parsing -% is turned off (\cref{tab:xmpl:datatool}). -%\begin{LaTeXdemo}[code and float] -% \DTLnewdb{moredata} -% \DTLnewrow{moredata}\DTLnewdbentry{moredata}{value}{ 6.7012} -% \DTLnewrow{moredata}\DTLnewdbentry{moredata}{value}{66.0212} -% \DTLnewrow{moredata}\DTLnewdbentry{moredata}{value}{64.902 } -% \begin{table} -% \caption{Displaying a \textsf{datatool} table.} -% \label{tab:xmpl:datatool} -% \centering -% \sisetup{ -% parse-numbers = false, -% table-number-alignment = center, -% table-figures-integer = 2, -% table-figures-decimal = 4 -% } -% \renewcommand*\dtlrealalign{S} -% \DTLdisplaydb{moredata} -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Using units such as \si{\micro\metre\per\second} in -% headings} -% -% The \pkg{siunitx} code is designed to work correctly with functions -% in headings. They will print correctly in headings and in the table -% of contents. As illustrated here, the standard behaviour is to ignore -% font changes. When the \pkg{hyperref} package is loaded, the -% functions automatically \enquote{degrade gracefully} to produce -% useful information in PDF bookmarks. If you want more control over -% the bookmark text, use the \cs{texorpdfstring} function from -% \pkg{hyperref}, for example: -%\begin{LaTeXdemo}[code only] -% \section{Some text -% \texorpdfstring -% {\si{\joule\per\mole\per\kelvin}} -% {J mol-1 K-1}% -% } -%\end{LaTeXdemo} -% -% \subsection{A left-aligned column visually centred under a heading} -% -% When you have a column of non-related numbers, the usual advice is to -% make these left-aligned and then centre the resulting column under the -% heading. With the \pkg{dcolumn} package, that would be done with -% something like |D{x}{}{5.0}|. This is something of an abuse of the -% nature of a number, but can also be done using \pkg{siunitx} -% (\ref{tbl:xmpl:unrel}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Formatting unrelated numbers} -% \label{tbl:xmpl:unrel} -% \centering -% \begin{tabular} -% { -% S[ -% table-format = 5.0, -% parse-numbers = false, -% input-symbols=., -% input-decimal-markers = x -% ] -% } -% \toprule -% \multicolumn{1}{c}{Header} \\ -% \midrule -% 120 \\ -% 12.3 \\ -% 12340 \\ -% 12.02 \\ -% 123 \\ -% 1 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Symbols and \texorpdfstring{\XeTeX}{XeTeX}} -% -% A small number of non-Latin symbols are needed by \pkg{siunitx}, -% notably \SIUnitSymbolOhm\ and \SIUnitSymbolMicro. The package picks -% glyphs for these which are correct in the sense that they are upright -% (not italic) symbols, and match the \LaTeX{} standard Computer Modern -% font. However, this does not make them the best choice if other -% fonts are in use, which is particularly common when \XeTeX{} is -% being used. -% -% \XeTeX{} users will probably need to choose appropriate symbols -% themselves. The correct choice depends on the fonts in use, but many -% system fonts include Greek letters and other symbols (which is not -% the case with most \TeX-specific fonts). An appropriate setting -% could then be to use the text \SIUnitSymbolMicro\ symbol in all -% cases: -%^^A This document cannot be UTF-8, as it has to work correctly with -%^^A pdfLaTeX. So there is a bit of work to do here to get the right -%^^A output. -%\begin{flushleft} -% \ttfamily -% \textbackslash \textcolor{blue}{sisetup}\{\\ -% \ \ math-micro = \textbackslash -% \textcolor{blue}{text}\{\SIUnitSymbolMicro\}, \\ -% \ \ text-micro \ = \SIUnitSymbolMicro \\ -% \} -%\end{flushleft} -% It may also be desirable in these cases to select a fixed font -% using the \pkg{fontspec} package, for example -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% math-micro = \fontspec{Minion Pro} \textmu, -% text-micro = \fontspec{Minion Pro} \textmu -% } -%\end{LaTeXdemo} -% -%\subsection{Scaled document fonts with \texorpdfstring{\XeTeX}{XeTeX}} -% -% The \pkg{fontspec} package makes it possible to scale the document -% body font. This can lead to unexpected problems with printing -% for \pkg{siunitx}, as some symbols will not scale while numbers -% and text will. The problem is best avoided by forcing \pkg{siunitx} -% to use the default math font for all output: -%\begin{LaTeXdemo}[code only] -% \sisetup{ -% mode = math, -% math-rm = \ensuremath -% } -%\end{LaTeXdemo} -% This will cause all \pkg{siunitx} output \emph{not} to scale at all, -% consistent with other mathematical content. -% -% \subsection{Interaction with \pkg{tex4ht}} -% -% \pkg{siunitx} will detect when \pkg{tex4ht} is in use, and makes -% some changes to the way output is printed. Text mode printing is -% automatically selected, and certain items (such as spaces) are -% printed in text mode rather than as math. This is designed to -% reduce the likelihood of spurious formulae appearing in, for -% example, output converted to OpenOffice format. -% -%\subsection{Maximising performance} -% -% Both the number and unit parsers require significant effort in -% terms of \TeX{} programming. For input that does not require -% such processing, the maximum performance for \pkg{siunitx} can -% therefore be obtained by turning off both systems: -%\begin{LaTeXdemo} -% \SI{7.3}{\Hz} \\ -% \SI[parse-units = false]{7.3}{\Hz} \\ -% \SI[ -% parse-numbers = false, -% parse-units = false -% ]{7.3}{\Hz} -%\end{LaTeXdemo} -% -%\subsection{Transferring settings to \pkg{pgf}} -% -%\DescribeMacro{\SendSettingsToPgf} -%\changes{v2.0a}{2010/05/28}{Make \cs{SendSettingsToPgf} available -% in document body} -% The numerical engine in the \pkg{pgf} package has settings similar -% to those in \pkg{siunitx}. To enable working with both packages -% easily, the macro \cs{SendSettingsToPgf} is available. It will -% set some commonly-used numerical formatting options in \pkg{pgf} -% to the current values used by \pkg{siunitx} to make using the -% two packages together more convenient for end users. This -% function can be used at any point after loading both the -% \pkg{pgf} and \pkg{siunitx} packages. -%\begin{LaTeXdemo}[code only] -% \documentclass{article} -% \usepackage{pgf,siunitx} -% \sisetup{...} -% \SendSettingsToPgf -% ... -%\end{LaTeXdemo} -% -%\subsection{Using \pkg{siunitx} with the \pkg{cellspace} package} -% -% Both \pkg{siunitx} and \pkg{cellspace} use the letter \texttt{S} for a -% new column type as standard. If \pkg{cellspace} loaded and is using the -% \texttt{S} column specifier, \pkg{siunitx} will move the -% functionality of \pkg{cellspace} to the letter \texttt{C}, and \texttt{S} -% will be used by \pkg{siunitx}. This -% allows the normal use of \pkg{cellspace} with standard column types: -% it does \emph{not} work with the \pkg{siunitx} \texttt{S} or -% \texttt{s} columns. Note that \pkg{cellspace} can be loaded with a -% user-selectable identifier, for example -%\begin{LaTeXdemo}[code only] -% \usepackage[column=Q]{cellspace} -%\end{LaTeXdemo} -% -%\subsection{Special considerations for the \cs{kWh} unit} -% -% The \file{abbreviations} configuration file provides the unit -% \cs{kWh}, which is set up with no spacing between the -% \enquote{\si{\kilo\watt}} and the \enquote{\si{\hour}} unit to -% give \enquote{\si{\kWh}}. However, this only applies when the unit -% is given on its own: combinations will follow the normal rules -%\begin{LaTeXdemo} -% \si{\kWh} \\ -% \si{\kWh\per\metre} -%\end{LaTeXdemo} -% This is because the unit \cs{kWh} is defined so that it can still be -% varied by altering \cs{kilo}, \cs{watt} and \cs{hour}, and so that -% the prefix can still be turned into a number. However, some users -% may prefer to have a non-flexible macro which never adds a space. -% This can be achieved by redefining \cs{kWh} with \cs{DeclareSIUnit}, -% by added an alternative definition -%\begin{LaTeXdemo}[code only] -% \DeclareSIUnit\kWh{kWh} -% \DeclareSIUnit\KWH{kWh} -%\end{LaTeXdemo} -% or of course by using literal unit input. -%\begin{LaTeXdemo} -% \si{\KWH\per\metre}\\ -% \si{kWh.m^{-1}} -%\end{LaTeXdemo} -% -% Another point to notice is that the \cs{per} macro applies to -% the next unit, and not an entire unit combination. Thus in -%\begin{LaTeXdemo} -% \si{\candela\per\kWh} -%\end{LaTeXdemo} -% \cs{per} applies to the watts but not to the hours. In this case, -% the units need to be written out in full or the \opt{sticky-per} -% option should be used. -%\begin{LaTeXdemo} -% \si{\candela\per\kilo\watt\per\hour} \\ -% \si[sticky-per]{\candela\per\kWh} -%\end{LaTeXdemo} -% -%\subsection{Adding items after the last column of a tabular} -%\changes{v2.0d}{2010/06/10}{Document special case situations for last -% cell in table row} -% -% When using the \pkg{array} package \enquote{\texttt{<}} construct -% to insert material after an \texttt{S} or \texttt{s} column, the -% alignment of the final column may be wrong if the standard tabular row -% terminator |\\| is used. -% This is due to the way that \LaTeX{} constructs -% tables at a low level. The incorrect spacing can be avoided by using -% the \TeX{} \cs{cr} primitive to end the table rows (\cref{tab:cr}). -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Correcting spacing in last \texttt{S} column} -% \label{tab:cr} -% \hfil -% \begin{tabular}{S<{\,\si{\kg}}S<{\,\si{\kg}}} -% \toprule -% \multicolumn{1}{c}{Long header} & -% \multicolumn{1}{c}{Long header} \\ -% \midrule -% 1.23 & 1.23 \\ -% 4.56 & 4.56 \\ -% 7.8 & 7.8 \\ -% \bottomrule -% \end{tabular} -% \hfil -% \begin{tabular}{S<{\,\si{\kg}}S<{\,\si{\kg}}} -% \toprule -% \multicolumn{1}{c}{Long header} & -% \multicolumn{1}{c}{Long header} \\ -% \midrule -% 1.23 & 1.23 \cr -% 4.56 & 4.56 \cr -% 7.8 & 7.8 \cr -% \bottomrule -% \end{tabular} -% \hfil -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Creating a column with numbers and units} -% -% Usually, numbers in a table should be given with the units in the -% column heading. However, there are cases where a series of data are -% best presented in a table but have different units. There are two -% ways to do this (\cref{tab:xmpl:mixed}). The first is to place the -% units in the first column of the table, which makes sense if there -% are several related items in the table. The second method is to -% generate two columns, one for numbers and a second for units, and then -% to format these to give the visual effect of a single column. The -% later effect is most appropriate when only one set of numbers are -% presented in a table. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Tables where numbers have different units} -% \label{tab:xmpl:mixed} -% \hfil -% \begin{tabular} -% { -% >{$}l<{$} -% S[table-format = 2.3(1)] -% S[table-format = 3.3(1)] -% } -% \toprule -% & {One} & {Two} \\ -% \midrule -% a / \si{\angstrom} & 1.234(2) & 5.678(4) \\ -% \beta / \si{\degree} & 90.34(4) & 104.45(5) \\ -% \mu / \si{\per\mm} & 0.532 & 0.894 \\ -% \bottomrule -% \end{tabular} -% \hfil -% \begin{tabular} -% {S[table-format=1.3]@{\,}s[table-unit-alignment = left]} -% \toprule -% \multicolumn{2}{c}{Heading} \\ -% \midrule -% 1.234 & \metre \\ -% 0.835 & \candela \\ -% 4.23 & \joule\per\mole \\ -% \bottomrule -% \end{tabular} -% \hfil -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Tables with heading rows} -%\changes{v2.0s}{2010/08/12}{Document how to do mixed bold and normal -% numbers in tables} -% -% A common format for tables is to make the heading row visually -% distinct using a background colour and bold text. If numbers appear -% in such a heading row within an \texttt{S} column then getting the -% appearance right can be challenging. The best approach is to -% make the \cs{bfseries} macro \enquote{robust} (as demonstrated in -% \cref{sec:expanding}), then to use this macro to make the heading -% cells bold. This approach is illustrated in \cref{tab:xmpl:headers}, -% along with the use of \cs{rowcolor} to provide a background colour. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \caption{Header row in a table} -% \label{tab:xmpl:headers} -% \robustify\bfseries -% \centering -% \begin{tabular} -% {S[detect-weight,table-format = 3.3]} -% \rowcolor[gray]{0.9} -% \bfseries 123.456 \\ -% 23.45 \\ -% 123.4 \\ -% 3.456 \\ -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\subsection{Associating a locale with a \pkg{babel} language} -% -% It is possible to instruct the \pkg{babel} package to switch -% to a particular \pkg{siunitx} locale when changing language. This -% can be done using the \pkg{babel} \cs{extras\meta{language}} -% system. For example, to associate the \texttt{DE} locale with -% the \texttt{german} \pkg{babel} language, the appropriate -% code would be -%\begin{LaTeXdemo}[code only] -% \addto\extrasgerman{\sisetup{locale = DE}} -%\end{LaTeXdemo} -% -%\section{Information for those upgrading} -% -%\subsection{Upgrading from version 1} -%\changes{v2.0a}{2010/05/28}{Fix various errors in \file{version-1} -% configuration file} -%\changes{v2.0a}{2010/05/28}{Detect use of version 1 options and -% automatically load appropriate configuration file} -%\changes{v2.0a}{2010/05/28}{Include high energy physics units in -% discussion of old configurations and in \file{version-1} -% configuration file} -%\changes{v2.0b}{2010/06/01}{Further improvements to \file{version-1} -% configuration file} -%\changes{v2.0r}{2010/08/02}{Error in definition for old -% \opt{decimalsymbol} option corrected} -%\changes{v2.1d}{2010/11/14}{Error with definition of version 1 option -% \opt{xspace} corrected} -% -% The key--value control system of \pkg{siunitx} has been completely -% rewritten for version 2, and at the same time some of the macros -% provided by the package have been renamed and reworked. The package -% can be loaded with a configuration file to provide most of the -% same options and defaults as in version 1: -%\begin{LaTeXdemo}[code only] -% \usepackage[version-1-compatibility]{siunitx} -%\end{LaTeXdemo} -% Many of the options from version 1 map to similar ones in version 2 -% (\cref{tab:opt:map}). The correspondence often includes a syntax -% change: consult details of the new options for the correct syntax for -% the new options. In some cases, the new approach is different to the -% older one, and in these cases the most appropriate option new has been -% listed in the table. -%\begin{center} -% \tablecaption{Mapping of version 1 options to version 2.} -% \label{tab:opt:map} -% \tablefirsthead{^^A -% \toprule -% \multicolumn{1}{l}{Version 1} & -% \multicolumn{1}{l}{See in version 2} \\ -% \midrule -% } -% \tablehead{^^A -% \multicolumn{2}{l}{\emph{Continued from previous page}} \\ -% \toprule -% \multicolumn{1}{l}{Version 1} & -% \multicolumn{1}{l}{See in version 2} \\ -% \midrule -% } -% \tabletail{^^A -% \bottomrule -% \multicolumn{2}{r}{\emph{Continued on next page}} \\ -% } -% \tablelasttail{\bottomrule} -% -% \begin{xtabular}{>{\ttfamily}l>{\ttfamily}l} -% addsign & explicit-sign \\ -% allowlitunits & free-standing-units \\ -% allowoptarg & unit-optional-argument \\ -% allowzeroexp & retain-zero-exponent \\ -% anglesep & arc-separator \\ -% astroang & angle-symbol-over-decimal \\ -% closeerr & close-bracket \\ -% closefrac & close-bracket \\ -% closerange & close-bracket \\ -% colour & color \\ -% colorall & color \\ -% colourall & color \\ -% colorunits & unit-color \\ -% colorneg & negative-color \\ -% colourneg & negative-color \\ -% colourunits & unit-color \\ -% colorvalues & number-color \\ -% colourvalues & number-color \\ -% decimalsymbol & output-decimal-marker \\ -% detectdisplay & detect-display-math \\ -% digitsep & group-separator \\ -% dp & round-mode \\ -% & round-precision \\ -% errspace & uncertainty-separator \\ -% expbase & exponent-base \\ -% expproduct & exponent-product \\ -% fixdp & round-mode \\ -% fixsf & round-mode \\ -% fraction & fraction-function \\ -% inlinebold & detect-inline-weight \\ -% locale & locale \\ -% mathOmega & math-ohm \\ -% mathcelsius & math-celsius \\ -% mathdegree & math-degree \\ -% mathminute & math-arcminute \\ -% mathmu & math-micro \\ -% mathringA & math-angstrom \\ -% mathrm & math-rm \\ -% mathsOmega & math-ohm \\ -% mathscelsius & math-celsius \\ -% mathsdegree & math-degree \\ -% mathsecond & math-arcsecond \\ -% mathsf & math-sf \\ -% mathsminute & math-arcminute \\ -% mathsmu & math-micro \\ -% mathsringA & math-angstrom \\ -% mathsrm & math-rm \\ -% mathssecond & math-arcsecond \\ -% mathssf & math-sf \\ -% mathstt & math-tt \\ -% mathtt & math-tt \\ -% mode & mode \\ -% negcolor & negative-color \\ -% negcolour & negative-color \\ -% numaddn & input-symbols \\ -% numcloseerr & input-close-uncertainty \\ -% numdecimal & input-decimal-markers \\ -% numdigits & input-digits \\ -% numdiv & input-quotient \\ -% numexp & input-exponent-markers \\ -% numgobble & input-ignore \\ -% numopenerr & input-open-uncertainty \\ -% numprod & input-product \\ -% numsign & input-signs \\ -% obeyall & detect-all \\ -% obeybold & detect-weight \\ -% obeyfamily & detect-family \\ -% obeyitalic & detect-shape \\ -% obeymode & detect-mode \\ -% openerr & open-bracket \\ -% openfrac & open-bracket \\ -% openrange & open-bracket \\ -% padangle & add-arc-degree-zero \\ -% & add-arc-minute-zero \\ -% & add-arc-second-zero \\ -% padnumber & add-decimal-zero \\ -% & add-integer-zero \\ -% per & per-mode \\ -% prefixsymbolic & prefixes-as-symbols \\ -% prespace & space-before-unit \\ -% redefsymbols & redefine-symbols \\ -% repeatunits & multi-part-units \\ -% & product-units \\ -% & range-units \\ -% retainplus & retain-explicit-plus \\ -% seperr & separate-uncertainty \\ -% sepfour & group-four-digits \\ -% sf & round-mode \\ -% & round-precision \\ -% sign & explicit-sign \\ -% slash & per-symbol \\ -% stickyper & sticky-per \\ -% strict & strict \\ -% tabalign & table-alignment \\ -% tabalignexp & table-align-exponent \\ -% tabautofit & table-auto-round \\ -% tabformat & table-format \\ -% tabnumalign & table-number-alignment \\ -% tabparseonly & table-parse-only \\ -% tabexpalign & table-align-exponent \\ -% tabtextalign & table-text-alignment \\ -% tabunitalign & table-unit-alignment \\ -% textcelsius & text-celsius \\ -% textdegree & text-degree \\ -% textminute & text-arcminute \\ -% textmode & mode \\ -% textmu & text-micro \\ -% textOmega & text-ohm \\ -% textringA & text-angstrom \\ -% textrm & text-rm \\ -% textsecond & text-arcsecond \\ -% textsf & text-sf \\ -% texttt & text-tt \\ -% tightpm & tight-spacing \\ -% tophrase & range-phrase \\ -% trapambigerr & multi-part-units \\ -% trapambigfrac & bracket-numbers \\ -% trapambigrange & range-units \\ -% unitcolor & unit-color \\ -% unitcolour & unit-color \\ -% unitmathrm & unit-math-rm \\ -% unitmathsf & unit-math-sf \\ -% unitmathsrm & unit-math-rm \\ -% unitmathssf & unit-math-sf \\ -% unitmathstt & unit-math-tt \\ -% unitmathtt & unit-math-tt \\ -% unitmode & unit-mode \\ -% unitsep & inter-unit-product \\ -% unitspace & inter-unit-product \\ -% valuecolor & number-color \\ -% valuecolour & number-color \\ -% valuemathrm & number-math-rm \\ -% valuemathsf & number-math-sf \\ -% valuemathsrm & number-math-rm \\ -% valuemathssf & number-math-sf \\ -% valuemathstt & number-math-tt \\ -% valuemathtt & number-math-tt \\ -% valuemode & value-mode \\ -% valuesep & number-unit-product \\ -% xspace & use-xspace \\ -% \end{xtabular} -%\end{center} -% A small number of the options from version 1 are used unchanged in -% version 2, for example the \opt{mode} setting. These are listed above -% but require no action on the part of the user. There are also a -% few options which are no longer used at all, and are therefore ignored -% by the current code. -% -% Loading configuration files has been completely changed, and this -% means that the options \opt{alsoload}, \opt{load} and \opt{noload} are -% ignored by version 2. In the same way the options \opt{debug} and -% \opt{log} are not used by the current release of \pkg{siunitx}, as -% this information is usually only needed by the package author. -% Emulation of older packages is no longer offered (it was intended -% to help with the transition form earlier packages), and so the -% \opt{emulate} option no longer applies. -% -%\subsection{Upgrading from version 2.0 or 2.1} -% -% User feedback on \pkg{siunitx} means that over time some renaming -% takes place. The following functions and options have been deprecated -% in version 2.2. They are therefore available in version 2.2, but -% should be replaced in new or updated documents with the successor -% names. -% -%\DescribeOption{angle-unit-separator} -%\DescribeOption{inter-unit-separator} -%\DescribeOption{number-unit-separator} -%\changes{v2.2}{2011/03/20}{Renamed \opt{angle-unit-separator} option -% to \opt{angle-unit-product}} -%\changes{v2.2}{2011/03/20}{Renamed \opt{inter-unit-separator} option -% to \opt{inter-unit-product}} -%\changes{v2.2}{2011/03/20}{Renamed \opt{number-unit-separator} option -% to \opt{number-unit-product}} -% These options have been replaced by the options -%\begin{itemize} -% \item \opt{angle-unit-product} -% \item \opt{inter-unit-product} -% \item \opt{number-unit-product} -%\end{itemize} -% as these items are formally products, and the new option names -% emphasise this. -% -%\DescribeMacro{\DeclareSIUnitWithOptions} -%\changes{v2.2}{2011/04/01}{Depreciate \cs{DeclareSIUnitWithOptions}} -% The \cs{DeclareSIUnit} function has been extended to take a -% first optional argument, which removes the need for -% \cs{DeclareSIUnitWithOptions}. This function is therefore depreciated -% but retained for compatibility. -% -% \subsection{Upgrading from version 2.2} -% -% \DescribeOption{load-configurations} -% \changes{v2.3}{2011/03/20}{Load abbreviations as standard} -% \changes{v2.3}{2011/03/20}{Replace \opt{load-configurations} option -% with separate \opt{abbreviations}, \opt{binary-units} and -% \opt{version-1-compatibility} options} -% The option \opt{load-configurations} has been deprecated in favour of the -% three options \opt{abbreviations}, \opt{binary-units} and -% \opt{version-1-compatibility}. At the same time, loading of the abbreviations -% is now the standard behaviour, and so in most cases no -% explicit configuration file loading will be needed. -% -% \DescribeOption{group-decimal-digits} -% \DescribeOption{group-integer-digits} -% The digit grouping options have been revised, and the options -% \opt{group-decimal-digits} and \opt{group-integer-digits} are now -% integrated into \opt{group-digits}. -% \DescribeOption{group-four-digits} -% At the same time, the \opt{group-four-digits} option has been extended -% to the new option \opt{group-minimum-digits}. -% -% \DescribeOption{literal-superscript-as-power} -% The new {literal-superscript-as-power} option means that the standard -% behaviour now uses the current math font for superscripts, even when -% units are printed literally. This will only be obvious in documents such -% as this manual, where the text and math mode numerals are (deliberately) -% different. To restore the previous behaviour, set -% \opt{literal-superscript-as-power = false}. -% -% \subsection{Upgrading from version 2.3} -% -% The number of options which assume that the input is given in math mode -% has been significantly reduced. As most material can be typeset in either -% math or text mode, the \enquote{intrinsic} math mode options could lead to -% inconsistent output. The only options which now force math mode are those -% for products, which will almost always require the use of math mode. -% -% \subsection{Upgrading from version 2.4} -% -% The process of removing options which assume math mode, begun with -% version~2.4, has been taken further, and only \opt{output-product} -% and \opt{exponent-product} now do not require \cs{ensuremath} for material -% which must be in math mode. The standard settings have been altered to take -% account of this, but user-set options for products may need to be updated -% accordingly. -% -% \subsection{Upgrading from version 2.5} -% -% All printing now takes place in math mode (\emph{i.e.}~\opt{mode = math} -% is set). This may alter the appearance of some units, and users may want -% to verify the output is correct. -% -%\section{Correct application of (SI) units} -% -% Consistent and logical units are a necessity for scientific work, -% and have applicability everywhere. Historically, a number of -% systems have been used for physical units. SI units were -% introduced by the \emph{Conf{\'e}rence G{\'e}n{\'e}rale des Poids et -% Mesures} (CGPM) in 1960. SI units are a coherent system based on -% seven base units, from which all other units may be derived. -% -% At the same time, physical quantities with units are mathematical -% entities, and as such way that they are typeset is important. In -% mathematics, changes of type (such as using bold, italic, sans -% serif typeface and so on) convey information. This means that -% rules exist not only for the type of units to be used under the SI -% system, but also the way they should appear in print. Advice on -% best practice has been made available by the \emph{National -% Institute of Standards and Technology} (NIST) \cite{NIST}. -% -% As befits an agreed international standard, the full rules are -% detailed. It is not appropriate to reproduce these in totality -% here; instead, a useful summary of the key points is provided. The -% full details are available from the \emph{Bureau International des -% Poids et Mesures} \cite{BIPM}. -% -% \pkg{siunitx} takes account of the information given here, so far as -% is possible. Thus the package defaults follow the recommendations -% made for typesetting numbers and units. Spacing and so forth is -% handled in such a way as to make implementing the rules -% (relatively) easy. -% -%\subsection{Units} -% -% There are seven base SI units, listed in \cref{tab:unit:base}. -% Apart from the kilogram, these are defined in terms of a measurable -% physical quantity needing the definition alone.\footnote{Some base -% units need others defined first; there is therefore a required -% order of definition.} The base units have been chosen such that -% all physical quantities can be expressed using an appropriative -% combination of these units, needing no others and with no -% redundancy. The kilogram is slightly different from the other base -% units as it is still defined in terms of a \enquote{prototype} held in -% Paris. -% -% All other units within the SI system are regarded as \enquote{derived} -% from the seven base units. At the most basic, all other SI units -% can be expressed as combinations of the base units. However, many -% units (listed in \cref{tab:unit:derived,tab:unit:accepted}) have a -% special name and symbol. Most of these units are simple combinations -% of one or more base units (raised to powers as appropriate). A small -% number of units derived from experimental data are allowed as SI -% units (\cref{tab:unit:physical}). -% -% A series of SI prefixes for decimal multiples and sub-multiples are -% provided, and can be used as modifiers for any SI unit (either base -% or derived units) with the exception of the kilogram. The prefixes -% are listed in \cref{tab:unit:prefix}. No space should be used -% between a prefix and the unit, and only a single prefix should be -% used. Even the degree Celsius can be given a prefix, for example -% \SI{1}{\milli\degreeCelsius}. -% -% It is important to note that the kilogram is the only SI unit with -% a prefix as part of its name and symbol. Only single prefix may -% be used, and so in the case of the kilogram prefix names are used -% with the unit name \enquote{gram} and the prefix symbols are used with -% the unit symbol \si{\gram}. For example -% \( \SI[prefixes-as-symbols = false]{1}{\milli\gram} = -% \SI{1}{\milli\gram} \). -% -% The application of SI units is meant to provide a single set of -% units which ensure consistency and clarity across all areas. -% However, other units are common is many areas, and are not without -% merit. The units provided by \pkg{siunitx} by default do not include -% any of these; only units which are part of the SI set or are -% accepted for use with SI units are defined. However, several other -% sets of units can be loaded as optional modules. The binary -% prefixes and units (\cref{tab:unit:binary}) are the most obvious -% example. These are \emph{not} part of the SI specifications, but the -% prefix names are derived from those in \cref{tab:unit:prefix}. -% -% Other units are normally to be avoided where possible. SI units -% should, in the main, be preferred due to the advantages of clear -% definition and self-consistency this brings. However, there will -% probably always be a place for specialist or non-standard units. -% This is particularly true of units derived from basic physical -% constants. -% -% There are also many areas where non-standard units are used so -% commonly that to do otherwise is difficult or impossible. For -% example, most synthetic chemists measure the pressure inside vacuum -% apparatus in \si{\mmHg}, partly because the most common gauge for -% the task still uses a column of mercury metal. For these reasons, -% \pkg{siunitx} does define non-SI units. -% -%\subsection{Mathematical meaning} -% -% As explained earlier, a number--unit combination is a single -% mathematical entity. This has implications for how both the number -% and the unit should be printed. Firstly, the two parts should not -% be separated: a quantity is a product of the number and the unit. -% With the exception of the symbols for plane angles (\si{\degree}, -% \si{\arcminute} and \si{\arcsecond}), the \textsc{bipm} -% specifies either a space or half-height (centred) dot should be -% used \cite{BIPM}. -%\begin{LaTeXdemo} -% A space for \SI{10}{\percent}\\ -% and also for \SI{100}{\degreeCelsius}\\ -% but not for \ang{1.23}. -%\end{LaTeXdemo} -% -% The mathematical meaning of units also means that the shape, weight -% and family are important. Units are supposed to be typeset in an -% upright, medium weight font. Italic, bold and sans serif are -% all used mathematically to convey other meanings. (In an all -% sans serif document, using sans serif for units is reasonable.) -% The \pkg{siunitx} -% package defaults again follow this convention: any local settings are -% ignored, and uses the current upright math font. However, -% there are occasions where this may not be the most desirable -% behaviour. A classic example would be in an all-bold section -% heading. As the surrounding text is bold, some people feel that -% any units should follow this. -%\begin{LaTeXdemo} -% Units should \textbf{not be bold: \SI{54}{\farad}}\\ -% \textbf{But perhaps in a running block,\\ -% it might look better: \SI[detect-weight]{54}{\farad}} -%\end{LaTeXdemo} -% -% Symbols for units formed from other units by multiplication are -% indicated by means of either a half-height (that is, centred) dot -% or a (thin) space. -%\begin{LaTeXdemo} -% \( \si{\metre\second} = \text{metre second} \) \\ -% \( \si{\milli\second} = \text{millisecond} \) \\ -% \sisetup{inter-unit-product = \ensuremath { { } \cdot { } } } -% \( \si{\metre\second} = \text{metre second} \) \\ -% \( \si{\milli\second} = \text{millisecond} \) -%\end{LaTeXdemo} -% There are some circumstances under which it is common practice to omit -% any spaces. The classic example is \si{\kWh}, where -% \enquote{\si[inter-unit-product = \,]{\kWh}} does not add any -% useful information. If using such a unit repeatedly, users of -% \pkg{siunitx} are advised to create a custom unit to ensure -% consistency. It is important to note that while this is common -% practice, it is \emph{not} allowed by the \textsc{bipm} -% \cite{BIPM}. -% -% Symbols for units formed from other units by division are indicated -% by means of a virgule (oblique stroke, slash, "/"), a horizontal -% line, or negative exponents.\footnote{Notice that a virgule and a -% solidus are not the same symbol.} However, to avoid ambiguity, the -% virgule must not be repeated on the same line unless parentheses -% are used. This is ensured when using named unit macros in -% \pkg{siunitx}, which will \enquote{trap} repeated division and format -% it correctly. In complicated cases, negative exponents are to be -% preferred over other formats. -%\begin{LaTeXdemo} -% \si{\joule\per\mole\per\kelvin}\\ -% \si[per-mode = fraction]{\joule\per\mole\per\kelvin}\\ -% \si[per-mode = symbol]{\joule\per\mole\per\kelvin} -%\end{LaTeXdemo} -% -% Products and errors should show what unit applies to each number -% given. Thus \SI[product-units = brackets]{2x3}{\metre} is an -% ordered set of lengths of a geometric area, whereas -% \SI[product-units = single]{2x3}{\metre} is a length (and equal -% to \SI{6}{\metre}). Thus, \(\times\) is not a product but is a -% mathematical operator; in the same way, a \(2 \times 3\) matrix is not -% a \(6\) matrix! In some areas, areas and volumes are given with -% separated units but a unit raised to the appropriate power: -% \SI[product-units = power]{2 x 3}{\metre}. Although this does -% display the correct overall units, it is potentially-confusing and is -% not encouraged. -% -% Care must be taken when writing ranges of numbers. For purely -% numerical values, it is common to use a en-dash to show a range, for -% example \enquote{see pages 1--5}. On the other hand, physical -% quantities could be misinterpret as negative values if written in this -% way. As the unit--number combination is a single mathematical entity, -% writing the values with an en-dash followed by a single unit is also -% incorrect. As a result, using the word \enquote{to} is strongly -% recommended. -%\begin{LaTeXdemo} -% \SIrange{1}{5}{\metre} long. -%\end{LaTeXdemo} -% -%\subsection{Graphs and tables} -% -% In graphs and tables, repetition of the units following each entry -% or axis mark is confusing and repetitive. It is therefore best to -% place the unit in the label part of the information. Placing the -% unit in square brackets is common but mathematically -% poor.\footnote{For example, for an acceleration \(a\), the expression -% \([a]\) is the dimensions of \(a\), \emph{i.e.}~length per time -% squared in this case.} Much better is to show division of all -% quantities by the unit, which leaves the entries as unitless ratios. -% This is illustrated in \cref{tab:xmpl:unitless} and -% \cref{fig:xmpl:unitless}. -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{An example of table labelling.} -% \label{tab:xmpl:unitless} -% \sisetup{ -% table-number-alignment = center, -% table-figures-integer = 1, -% table-figures-decimal = 4 -% } -% \begin{tabular}{cS} -% \toprule -% Entry & {Length/\si{\metre}} \\ -% \midrule -% 1 & 1.1234 \\ -% 2 & 1.1425 \\ -% 3 & 1.7578 \\ -% 4 & 1.9560 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -%\begin{LaTeXdemo}[code and float] -% \begin{figure} -% \centering -% \begin{tikzpicture} -% \begin{axis}[ -% xlabel = \( t/\si{\second} \), -% xmax = 6, -% xmin = 0, -% ylabel = \( d/\si{\metre} \), -% ymin = 0 -% ] -% \addplot[smooth,mark=*] -% plot coordinates { -% (0,0) -% (1,5) -% (2,8) -% (3,9) -% (4,8) -% (5,5) -% (6,0) -% }; -% \end{axis} -% \end{tikzpicture} -% \caption{An example of graph labelling.} -% \label{fig:xmpl:unitless} -% \end{figure} -%\end{LaTeXdemo} -% -% In most cases, adding exponent values in the body of a table is -% less desirable than adding a fixed exponent to column headers. An -% example is shown in \cref{tab:good}. The use of \cs{multicolumn} is -% needed here due to the \enquote{\texttt{<}}; without \cs{multicolumn}, -% the titles are followed by \enquote{\si{\kilo\gram}}! -%\begin{LaTeXdemo}[code and float] -% \begin{table} -% \centering -% \caption{Good and bad columns.} -% \label{tab:good} -% \sisetup{table-number-alignment = center} -% \begin{tabular}{ -% c -% S[ -% table-figures-integer = 1, -% table-figures-decimal = 3, -% table-figures-exponent = 1 -% ] -% @{\,\si{\kilogram}} -% S[ -% table-figures-integer = 2, -% table-figures-decimal = 2 -% ] -% } -% \toprule -% Entry & \multicolumn{1}{c}{Mass} & -% {Mass/\SI{e3}{\kilogram}} \\ -% \midrule -% 1 & 4.56e3 & 4.56 \\ -% 2 & 2.40e3 & 2.40 \\ -% 3 & 1.345e4 & 13.45 \\ -% 4 & 4.5e2 & 0.45 \\ -% \bottomrule -% \end{tabular} -% \end{table} -%\end{LaTeXdemo} -% -%\section{Making suggestions and reporting bugs} -% -% Feedback on \pkg{siunitx} is always welcome, either to make -% suggestions or to report problems. When sending feedback, it is -% always useful if a small example file is included, showing the -% bug being reported or illustrating the desired output. It is -% helpful if a \enquote{reference rendering} is included, showing what -% the output should look like. A typical example file might read -%\begin{LaTeXdemo}[code only] -% \listfiles -% % Use the article class unless the problem is class-dependent -% \documentclass{article} -% \usepackage{siunitx} -% % Other packages loaded as required -% \begin{document} -% Reference output: $ 1.23\,\mathrm{m} $ -% -% siunitx output: \SI{1.23}{\metre} -% \end{document} -%\end{LaTeXdemo} -% As illustrated, it is usually best to use the \texttt{article} -% class and to only load packages which are needed to show the issue. -% It is also useful to include a copy of the log file generate by -% \TeX{} when reporting a bug (as the versions of packages can be -% important to solving the issue). +%<*driver> +\documentclass{l3doc} +% The next line is needed so that \GetFileInfo will be able to pick up +% version data +\usepackage{siunitx} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi % -% Feedback can be sent in a range of ways. The development code -% is hosted by -% \href{https://github.com/josephwright/siunitx/}{GitHub}, -% and the site includes an issue tracker. Adding feedback directly -% to the database means that other users can see it, and also -% ensures that it does not get forgotten. E-mailing directly -% will also definitely get attention: -% \href{mailto:joseph.wright@morningstar2.co.uk} -% {\texttt{joseph.wright@morningstar2.co.uk}}. +% \GetFileInfo{siunitx.sty} % -% \section{Code level interfaces} +% \title{^^A +% \pkg{siunitx} -- Overall set up^^A +% \thanks{This file describes \fileversion, +% last revised \filedate.}^^A +% } % -% At present, most interfaces in \pkg{siunitx} at the code level are internal. -% This largely reflects the parallel between \pkg{siunitx} and core \pkg{expl3} -% development: much of the code here was written whilst the \LaTeX{} team were -% defining how best to handle this area. Development work on the next major -% release of \pkg{siunitx} includes a full set of documented code level -% interfaces. Some of these will be added to this (release) version of the -% package over time, where this is appropriate. +% \author{^^A +% Joseph Wright^^A +% \thanks{^^A +% E-mail: +% \href{mailto:joseph.wright@morningstar2.co.uk} +% {joseph.wright@morningstar2.co.uk}^^A +% }^^A +% } % -% \begin{variable}{\l_siunitx_unit_symbolic_seq} -% This sequence contains all of the symbolic \meta{unit} names defined: -% these will be in the form of control sequences such as |\kilogram|. -% The order of the sequence is unimportant. -% \end{variable} +% \date{Released \filedate} % -%\section{Thanks} +% \maketitle % -% Many users have provided feedback, bug reports and ideas for new -% features for \pkg{siunitx}: thanks to all of them. Particular thanks -% to Stefan Pinnow, who has taken the lead role as beta tester for -% \pkg{siunitx}, finding incorrect output, bad documentation and the -% odd spelling mistake in the documentation. Thanks also to -% Danie Els and Marcel Heldoorn for the \pkg{SIstyle} and \pkg{SIunits} -% packages, respectively, which provided the starting point for the -% development of \pkg{siunitx}. +% \begin{documentation} % -%\end{documentation} +% \end{documentation} % -%\begin{implementation} +% \begin{implementation} % -%\section{Implementation} +% \section{\pkg{siunitx} implementation} % +% Start the \pkg{DocStrip} guards. % \begin{macrocode} %<*package> % \end{macrocode} % +% Identify the internal prefix (\LaTeX3 \pkg{DocStrip} convention). % \begin{macrocode} %<@@=siunitx> % \end{macrocode} % -%\subsection{Preliminaries} -% -% The usual preliminaries. -% \begin{macrocode} -\ProvidesExplPackage {siunitx} {2021-04-17} {2.8e} - {A comprehensive (SI) units package} -% \end{macrocode} +% \subsection{Initial set up} % -% Make sure that the version of \pkg{l3kernel} in use is sufficiently new. -% This will also trap any problems with \pkg{l3packages} (as the two are now -% tied together, version-wise). % \begin{macrocode} -\@ifpackagelater { expl3 } { 2020/01/12 } - { } - { - \PackageError { siunitx } { Support~package~expl3~too~old } - { - You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ - 'l3packages'.\MessageBreak - Loading~siunitx~will~abort! - } - \tex_endinput:D - } +%<*init> % \end{macrocode} % -%\begin{macro}{\@@_load_check:} -% There are also a number of packages that are incompatible with -% \pkg{siunitx}. These are all checked for next. Some of the -% incompatible packages will not raise an error if loaded after -% \pkg{siunitx}. So a test is made at the beginning of the -% document as well. The message for this may be needed immediately, so -% it is created here not with the other messages. +% Set up a couple of commands in recent-ish \LaTeXe{} releases. % \begin{macrocode} -\msg_new:nnnn { siunitx } { incompatible-package } - { Package~'#1'~incompatible. } - { The~#1~package~and~siunitx~are~incompatible. } -\cs_new_protected:Npn \@@_load_check:n #1 { - \group_begin: - \@ifpackageloaded {#1} - { \msg_error:nnx { siunitx } { incompatible-package } {#1} } - { } - \group_end: -} -\clist_map_function:nN - { SIunits , sistyle , siunits , SIstyle , unitsdef , fancyunits } - \@@_load_check:n -\AtBeginDocument { - \clist_map_function:nN { SIunits , sistyle , siunits , SIstyle } - \@@_load_check:n -} -% \end{macrocode} -%\end{macro} -% -% Now load the support packages. -% \begin{macrocode} -\RequirePackage{ amstext , array , l3keys2e } -% \end{macrocode} -% -% \begin{macro}{@@_if_hooks:TF} -% To work with updated hooks if available. -% \begin{macrocode} -\@ifl@t@r \fmtversion { 2020-10-01 } - { \cs_new_eq:NN \@@_if_hooks:TF \use_i:nn } - { \cs_new_eq:NN \@@_if_hooks:TF \use_ii:nn } -% \end{macrocode} -% \end{macro} -% -%\begin{macro}{\@@_tmp:w} -% A scratch function. -% \begin{macrocode} -\cs_new:Npn \@@_tmp:w { } -% \end{macrocode} -%\end{macro} -% -% Add some variants. -% \begin{macrocode} -\cs_generate_variant:Nn \clist_map_function:nN { nc } -\cs_generate_variant:Nn \tl_if_blank:nTF { V } -\cs_generate_variant:Nn \tl_replace_all:Nnn { No, NV , Nx } -% \end{macrocode} -% -%\begin{macro}{ -% \l_@@_tmp_bool , -% \l_@@_tmp_box , -% \l_@@_tmp_dim , -% \l_@@_tmp_int , -% \l_@@_tmpa_tl , -% \l_@@_tmpb_tl -%} -% Scratch variables. -% \begin{macrocode} -\bool_new:N \l_@@_tmp_bool -\box_new:N \l_@@_tmp_box -\dim_new:N \l_@@_tmp_dim -\int_new:N \l_@@_tmp_int -\tl_new:N \l_@@_tmpa_tl -\tl_new:N \l_@@_tmpb_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_error:nxx , -% \@@_error:nx , -% \@@_error:n -%} -%\begin{macro}{\l_@@_error_bool} -% General-purpose functions for throwing errors. -% \begin{macrocode} -\cs_new_protected:Npn \@@_error:nxx #1#2#3 { - \bool_set_true:N \l_@@_error_bool - \msg_error:nnxx { siunitx } {#1} {#2} {#3} -} -\cs_new_protected:Npn \@@_error:nx #1#2 { - \@@_error:nxx {#1} {#2} { } -} -\cs_new_protected:Npn \@@_error:n #1 { - \@@_error:nxx {#1} { } { } -} -\bool_new:N \l_@@_error_bool -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% Ensure that the companion font is loaded. -% \begin{macrocode} -\AtBeginDocument { - \cs_if_free:cT { T@TS1 } - { \RequirePackage { textcomp } } -} -% \end{macrocode} -% -% \begin{macro} -% { -% \@@_tl_put_left_math:Nn , -% \@@_tl_put_left_math:NV , -% } -% To add stuff in math mode. -% \begin{macrocode} -\cs_new_protected:Npn \@@_tl_put_left_math:Nn #1#2 - { \tl_put_left:Nn #1 { \ensuremath {#2} } } -\cs_generate_variant:Nn \@@_tl_put_left_math:Nn { NV } -% \end{macrocode} -% \end{macro} -% -%\begin{macro}{\c_@@_old_options_seq} -% To pick up old options, all of the names need to be known. -% \begin{macrocode} -\exp_args:NNx \seq_const_from_clist:Nn \c_@@_old_options_seq - { - \tl_to_str:n - { - addsign , - allowlitunits , - allowoptarg , - allowzeroexp , - alsoload , - angformat , - anglesep , - astroang , - closeerr , - closrfrac , - closerange , - colour , - colorall , - colourall , - colorneg , - colourneg , - colourunits , - colourunits , - colorvalues , - colourvalues , - decimalsymbol , - debug , - detectdisplay , - digitsep , - dp , - emulate , - errspace , - eVcorra , - eVcorrb , - expbase , - expproduct , - fixdp , - fixsf , - fraction , - inlinebold , - loctolang , - log , - load , - mathOmega , - mathcelsius , - mathdegree , - mathminute , - mathmu , - mathringA , - mathrm , - mathsOmega , - mathscelsius , - mathsdegree , - mathsecond , - mathsf , - mathsminute , - mathsmu , - mathsringA , - mathsrm , - mathssecond , - mathssf , - mathstt , - mathtt , - negcolor , - negcolour , - noload , - numaddn , - numcloseerr , - numdecimal , - numdigits , - numdiv , - numexp , - numgobble , - numopenerr , - numprod , - numsign , - obeyall , - obeybold , - obeyfamily , - obeymode , - obeyitalic , - openerr , - openfrac , - openrange , - padangle , - padnumber , - per , - prefixbase , - prefixproduct , - prefixsymbolic , - prespace , - redefsymbols , - repeatunits , - retainplus , - seperr , - sepfour , - sf , - sign , - slash , - stickyper , - strictarc , - tabalign , - tabalignexp , - tabautofit , - tabexpalign , - tabformat , - tabnumalign , - tabparseonly , - tabtextalign , - textOmega , - textcelsius , - textdegree , - textminute , - textmode , - textmu , - textringA , - textrm , - textsecond , - textsf , - texttt , - tightpm , - tophrase , - trapamigerr , - trapambigfrac , - trapambigrange , - unitcolor , - unitcolour , - unitmathrm , - unitmathsf , - unitmathsrm , - unitmathssf , - unitmathstt , - unitmathtt , - unitmode , - unitsep , - unitspace , - valuecolor , - valuecolour , - valuemathrm , - valuemathsf , - valuemathsrm , - valuemathssf , - valuemathstt , - valuemathtt , - valuemode , - valuesep , - xspace - } - } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_key_tl} -% Unknown options should raise an \pkg{siunitx}-specific error message. -% \begin{macrocode} -\tl_new:N \l_@@_key_tl -\keys_define:nn { siunitx } { - unknown .code:n = - { - \seq_if_in:NVTF \c_@@_old_options_seq \l_keys_key_tl - { - \msg_warning:nnx { siunitx } { version-1-option } - { \exp_not:V \l_keys_key_tl } - \tl_set:Nx \l_@@_key_tl - { - \keys_set:nn { siunitx } - { - \exp_not:V \l_keys_key_tl - \tl_if_blank:nF {#1} { = \exp_not:n {#1} } - } - } - \keys_set:nn { siunitx } { version-1-compatibility } - \tl_use:N \l_@@_key_tl - } - { - \msg_error:nnx { siunitx } { unknown-option } - { \exp_not:V \l_keys_key_tl } - } - } -} -\AtBeginDocument { - \keys_define:nn { siunitx } { - unknown .code:n = - { - \seq_if_in:NVTF \c_@@_old_options_seq \l_keys_key_tl - { - \msg_error:nnx { siunitx } { version-1-option } - { \exp_not:V \l_keys_key_tl } - } - { - \msg_error:nnx { siunitx } { unknown-option } - { \exp_not:V \l_keys_key_tl } - } - } -} -} +\providecommand\DeclareRelease[3]{} +\providecommand\DeclareCurrentRelease[2]{} % \end{macrocode} -%\end{macro} % -%\begin{macro}{\@@_option_deactivate:n} -%\begin{macro}{\@@_option_deactivate_aux:n} -%\begin{macro}{\l_@@_option_deactivate_clist} -% Some options need to be deactivated at the start of the document. +% Allow rollback to version~$2$: if we need to, version~$1$ could eventually +% be added here too. % \begin{macrocode} -\cs_new_protected:Npn \@@_option_deactivate:n #1 { - \clist_put_right:Nn \l_@@_option_deactivate_clist {#1} -} -\cs_new_protected:Npn \@@_option_deactivate_aux:n #1 { - \keys_define:nn { siunitx } - { - #1 .code:n = - { \msg_warning:nnx { siunitx } { option-preamble-only } {#1} } - } -} -\AtBeginDocument { - \clist_map_function:NN \l_@@_option_deactivate_clist - \@@_option_deactivate_aux:n -} -\clist_new:N \l_@@_option_deactivate_clist +\DeclareRelease{2}{2010-05-23}{siunitx-v2.sty} +\DeclareRelease{v2}{2010-05-23}{siunitx-v2.sty} +\DeclareCurrentRelease{}{2021-05-17} % \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} % -% \begin{macro}{\@@_option_unchanged:Nnn} -% Needed to allow for altering of options at the start of the document -% only if they are unchanged. This needs to use the low-level implementation -% detail, hence the use of variable name directly. +% Load only the essential support (\pkg{expl3}) \enquote{up-front}, and +% only if required. % \begin{macrocode} -\cs_new_protected:Npn \@@_option_unchanged:Nnn #1#2#3 - { - \str_if_eq:VnT #1 {#2} - { \tl_set:Nn #1 {#3} } - } +\@ifundefined{ExplFileDate} + {\RequirePackage{expl3}} + {} % \end{macrocode} -% \end{macro} % -% Variants needed which are not in \pkg{expl3}. -% \begin{macrocode} -\cs_generate_variant:Nn \tl_if_empty_p:n { f } -\cs_generate_variant:Nn \tl_if_empty:nT { f } -\cs_generate_variant:Nn \tl_if_in:NnTF { NV } -\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV } +% Make sure that the version of \pkg{l3kernel} in use is sufficiently new. +% We use \cs{ExplFileDate} as \cs{@ifpackagelater} doesn't work for pre-loaded +% \pkg{expl3} in the absence of the package. +% \begin{macrocode} +\@ifl@t@r\ExplFileDate{2018-06-01} + {} + {% + \PackageError{siunitx}{Support package expl3 too old} + {% + You need to update your installation of the bundles 'l3kernel' and + 'l3packages'.\MessageBreak + Loading~siunitx~will~abort!% + }% + \endinput + }% % \end{macrocode} % -% \begin{macro}[pTF]{\@@_cs_if_tl:N} -% A test for token lists (more or less). +% Identify the package and give the over all version information. % \begin{macrocode} -\prg_new_conditional:Npnn \@@_cs_if_tl:N #1 { T, F , TF , p } - { - \bool_lazy_and:nnTF - { - \tl_if_empty_p:f - { - \cs_prefix_spec:N #1 - \cs_argument_spec:N #1 - } - } - { \bool_not_p:n { \cs_if_exist_p:c { \cs_to_str:N #1 ~ } } } - { \prg_return_true: } - { \prg_return_false: } - } +\ProvidesExplPackage {siunitx} {2021-05-17} {3.0.0} + {A comprehensive (SI) units package} % \end{macrocode} -% \end{macro} % -% \begin{macro}[EXP] -% {\@@_number_if_zero:nTF, \@@_number_if_zero_p:n \@@_number_if_zero_p:V} -% \begin{macro}[EXP, aux]{\@@_number_if_zero_aux:n} -% A test for all of the input to a function being made up of zeros: -% needed to avoid overflowing \TeX{}'s integer range. -% \begin{macrocode} -\prg_new_conditional:Npnn \@@_number_if_zero:n #1 { p , TF } - { - \tl_map_function:nN {#1} \@@_number_if_zero_aux:n - \prg_return_true: - } -\cs_generate_variant:Nn \@@_number_if_zero_p:n { V } -\cs_new:Npn \@@_number_if_zero_aux:n #1 - { - \token_if_eq_charcode:NNF #1 0 - { \tl_map_break:n { \prg_return_false: \use_none:n } } - } -% \end{macrocode} -% \end{macro} -% \end{macro} +% \subsection{Safety checks} % -% If \pkg{tex4ht} is in use, make a few changes to give nicer looking -% conversion to other formats. +% \begin{macro}{\@@_load_check:} +% There are a number of packages that are incompatible with \pkg{siunitx} +% as they cover the same concepts and in some cases define the same command +% names. These are all tested at the point of loading to try to trap +% issues, and a couple are also tested later as it's possible for them to +% load without an obvious error if \pkg{siunitx} was loaded first. % \begin{macrocode} -\AtBeginDocument +\msg_new:nnnn { siunitx } { incompatible-package } + { Package~'#1'~incompatible. } + { The~#1~package~and~siunitx~are~incompatible. } +\cs_new_protected:Npn \@@_load_check:n #1 { - \@ifpackageloaded { tex4ht } - { - \cs_set_eq:NN \@@_print_text_super:n \textsuperscript - \@@_option_unchanged:Nnn \l_@@_qualifier_mode_tl - { subscript } { brackets } - \keys_set:nn { siunitx } { mode = text } - } + \@ifpackageloaded {#1} + { \msg_error:nnx { siunitx } { incompatible-package } {#1} } { } } -% \end{macrocode} -% -% \begin{macro}{\@@_ensure_ltr:n} -% When the \pkg{bidi} package is loaded with \XeTeX{} we need to make sure -% that \cs{text} is doing the correct thing. The \pkg{bidi} package seems to -% lead to a slightly broken \cs{text}, so this is something of a hack. -% \begin{macrocode} -\cs_new_eq:NN \@@_ensure_ltr:n \use:n +\clist_map_function:nN + { SIunits , sistyle , unitsdef , fancyunits } + \@@_load_check:n \AtBeginDocument { - \@ifpackageloaded { bidi } - { - \sys_if_engine_xetex:T - { \cs_set_protected:Npn \@@_ensure_ltr:n #1 { \LRE {#1} } } - } - { } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_textsuperscript:n} -% This function is set up here so that it can be redefined -% elsewhere as expandable. That is used in the bookmark system so -% that \pkg{hyperref} does not raise any unnecessary warnings. With -% \pkg{fontspec} loaded the kernel defintion for \cs{textsuperscript} -% may get altered so a private copy of the orignal code is used. (Yes, -% this really should be done like Con\TeX{}t -% \begin{macrocode} -\cs_new_protected:Npn \@@_textsuperscript:n #1 - { - \m@th - \ensuremath { ^ { \mbox { \fontsize \sf@size \z@ \selectfont #1 } } } - } -% \end{macrocode} -% \end{macro} -% -%\begin{macro}{\l_@@_display_math_bool} -% To test for display math, a flag is added to the start of every -% display environment. -% \begin{macrocode} -\bool_new:N \l_@@_display_math_bool -\tex_everydisplay:D \exp_after:wN - { - \tex_the:D \tex_everydisplay:D - \bool_set_true:N \l_@@_display_math_bool - } -% \end{macrocode} -%\end{macro} -% -% \begin{macro}[TF]{\prop_get:NVN} -% Missing from \pkg{expl3} at the moment. -% \begin{macrocode} -\cs_generate_variant:Nn \prop_get:NnNT { NV } -\cs_generate_variant:Nn \prop_get:NnNF { NV } -\cs_generate_variant:Nn \prop_get:NnNTF { NV } -% \end{macrocode} -% \end{macro} -% -%\subsection{Font detection} -% -% A number of controls and tests are needed to control the font used -% for output. The detection routines set up various functions which can -% then be used inside the \cs{text} macro from the \pkg{amstext} -% package. By carrying out the changes outside math mode, bold can -% reliably be applied to math output. -% -%\begin{macro}{\@@_set_math_fam:n} -%\begin{macro}{ -% \c_@@_mathsf_int , -% \c_@@_mathtt_int -%} -% The detection routine needs some basic data about the sans serif and -% monospaced fonts in use. This is collected up at the start of the -% document. The families used can change between here and the start of -% the document. This is run as a hook onto \cs{document}, rather than -% using \cs{AtBeginDocument} as it has to come after anything that -% \pkg{fontspec} does (nasty errors arise otherwise). -% \begin{macrocode} -\cs_new_protected:Npn \@@_set_math_fam:n #1 { - \group_begin: - \hbox_set:Nn \l_@@_tmp_box - { - \ensuremath - { - \use:c { math #1 } - { - \int_const:cn { c_@@_math #1 _int } { \fam } - } - } - } - \group_end: -} -\@@_if_hooks:TF - { - \AddToHook { begindocument / end } [ siunitx ] - { - \@@_set_math_fam:n { sf } - \@@_set_math_fam:n { tt } - } - } - { - \tl_put_right:Nn \document - { - \@@_set_math_fam:n { sf } - \@@_set_math_fam:n { tt } - \ignorespaces - } + \clist_map_function:nN { SIunits , sistyle } + \@@_load_check:n } % \end{macrocode} %\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_font_set_text_fam:n} -%\begin{macro}{ -% \c_@@_textsf_tl , -% \c_@@_texttt_tl -%} -% The text families are done in a somewhat different manner: there are -% no issues with \cs{AtBeginDocument}, luckily. The need to define -% new macros here arises as \cs{sfdefault} and \cs{ttdefault} are -% \cs{long}, whereas \cs{f@family} is not. -% \begin{macrocode} -\cs_new_protected:Npn \@@_set_text_fam:n #1 { - \tl_const:cx { c_@@_text #1 _tl } { \use:c { #1 default } } -} -\AtBeginDocument { - \@@_set_text_fam:n { sf } - \@@_set_text_fam:n { tt } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\l_@@_detect_inline_weight_tl} -% Used by the keys, but needs to be created here. -% \begin{macrocode} -\tl_new:N \l_@@_detect_inline_weight_tl -% \end{macrocode} -%\end{macro} -% -% \begin{variable}{\l_@@_detect_inline_family_tl} -% This one is not generated by the keys system. -% \begin{macrocode} -\tl_new:N \l_@@_detect_inline_family_tl -% \end{macrocode} -% \end{variable} % -%\begin{macro}{ -% \l_@@_detect_display_math_bool , -% \l_@@_detect_family_bool , -% \l_@@_detect_inline_family_tl , -% \l_@@_detect_shape_bool , -% \l_@@_detect_mode_bool , -% \l_@@_detect_weight_bool -%} -% Font detection is all about creating switches, with just a little -% gloss for \texttt{detect-all} and \texttt{detect-none}. -% \begin{macrocode} -\keys_define:nn { siunitx } { - detect-all .choice:, - detect-all .default:n = true, - detect-all / false .meta:n = - { - detect-family = false , - detect-mode = false , - detect-shape = false , - detect-weight = false , - }, - detect-all / true .meta:n = - { - detect-family = true , - detect-mode = true , - detect-shape = true , - detect-weight = true , - }, - detect-display-math .bool_set:N = - \l_@@_detect_display_math_bool, - detect-family .bool_set:N = \l_@@_detect_family_bool, - detect-inline-family .choice:, - detect-inline-family .value_required:n = true, - detect-inline-family / - math .code:n = - { \tl_set:Nn \l_@@_detect_inline_family_tl { math } }, - detect-inline-family / - text .code:n = - { \tl_set:Nn \l_@@_detect_inline_family_tl { text } }, - detect-inline-weight .choice:, - detect-inline-weight .value_required:n = true, - detect-inline-weight / - math .code:n = - { \tl_set:Nn \l_@@_detect_inline_weight_tl { math } }, - detect-inline-weight / - text .code:n = - { \tl_set:Nn \l_@@_detect_inline_weight_tl { text } }, - detect-italic .bool_set:N = \l_@@_detect_shape_bool, - detect-mode .bool_set:N = \l_@@_detect_mode_bool, - detect-none .choice:, - detect-none .default:n = true, - detect-none / false .meta:n = - { - detect-family = true, - detect-mode = true, - detect-shape = true, - detect-weight = true - }, - detect-none / true .meta:n = - { - detect-family = false, - detect-mode = false, - detect-shape = false, - detect-weight = false - }, - detect-shape .bool_set:N = \l_@@_detect_shape_bool, - detect-weight .bool_set:N = \l_@@_detect_weight_bool -} -\keys_set:nn { siunitx } { - detect-inline-family = text , - detect-inline-weight = text , -} -% \end{macrocode} -%\end{macro} +% \subsection{Provide a kernel command} % -%\begin{macro}{ -% \l_@@_font_set_bool , -% \l_@@_font_math_mode_bool -%} -% The internals of the package need a number of switches to track what -% is happening. +% \begin{macro}{\IfFormatAtLeastTF} +% Not present in older kernels: use the \LaTeXe{} mechanism as this is correct +% for this case. % \begin{macrocode} -\bool_new:N \l_@@_font_set_bool -\bool_new:N \l_@@_font_math_mode_bool +\providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion } % \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_font_family_tl} -% Also some token storage. -% \begin{macrocode} -\tl_new:N \l_@@_font_family_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_font_shape: , -% \@@_font_weight: -%} -% These could be token lists or functions! -% \begin{macrocode} -\cs_new:Npn \@@_font_shape: { } -\cs_new:Npn \@@_font_weight: { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font:} -% The main font-setting macro is a control point for the other -% functions. Nesting font-control should not happen, so the first -% test is to ensure this is not happening. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font: { - \bool_if:NF \l_@@_font_set_bool - { - \@@_detect_font_init: - \bool_if:NT \l_@@_detect_weight_bool - { \@@_detect_font_weight: } - \bool_if:NT \l_@@_detect_family_bool - { \@@_detect_font_family: } - \bool_if:NT \l_@@_detect_shape_bool - { \@@_detect_font_shape: } - \bool_if:NT \l_@@_detect_mode_bool - { \@@_detect_font_mode: } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font_init:} -% Set up the basic macros on the assumption nothing happens. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_init: { - \bool_set_true:N \l_@@_font_set_bool - \cs_set:Npn \@@_font_weight: - { - \unboldmath - \mdseries - } - \cs_set:Npn \@@_font_shape: { \upshape } - \tl_set:Nn \l_@@_font_family_tl { rm } - \bool_set_true:N \l_@@_font_math_mode_bool -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font_weight:} -% The font weight detection code depends on whether the current text is -% math or text, and also the type of math (if appropriate). For -% inline math, there is a choice of what test to apply. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_weight: { - \mode_if_math:TF - { - \bool_if:NTF \l_@@_display_math_bool - { - \bool_if:NTF \l_@@_detect_display_math_bool - { \@@_detect_font_weight_math: } - { \@@_detect_font_weight_text: } - } - { - \use:c - { - @@_detect_font_weight_ - \l_@@_detect_inline_weight_tl - : - } - } - } - { \@@_detect_font_weight_text: } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{ -% \@@_detect_font_weight_math: , -% \@@_detect_font_weight_text: -%} -% The tests for font weight depend on whether the module is testing -% text or math content. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_weight_math: { - \str_if_eq:VnT \math@version { bold } - { - \cs_set:Npn \@@_font_weight: - { - \boldmath - \bfseries - } - } - \str_if_eq:VnT \math@version { light } - { \cs_set:Npn \@@_font_weight: { \lseries } } -} -\cs_new_protected:Npn \@@_detect_font_weight_text: { - \tl_set:Nx \l_@@_tmpa_tl { \tl_head:N \f@series } - \str_if_eq:VnT \l_@@_tmpa_tl { b } - { - \cs_set:Npn \@@_font_weight: - { - \boldmath - \bfseries - } - } - \str_if_eq:VnT \l_@@_tmpa_tl { l } - { \cs_set:Npn \@@_font_weight: { \lseries } } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font_family:} -% Family detection usually picks up the surrounding text. However, for -% display math there are two options, and so a second test may be made. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_family: { - \mode_if_math:TF - { - \bool_if:NTF \l_@@_display_math_bool - { - \bool_if:NTF \l_@@_detect_display_math_bool - { \@@_detect_font_family_math: } - { \@@_detect_font_family_text: } - } - { - \use:c - { - @@_detect_font_family_ - \l_@@_detect_inline_family_tl - : - } - } - } - { \@@_detect_font_family_text: } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{ -% \@@_detect_font_family_math: , -% \@@_detect_font_family_text: -%} -% The two detections routines check if the current font is sans serif or -% monospaced. The method used depends on whether the current math or -% text font is of interest. The math detection routine re-applies the -% default (\texttt{rm}), as the text function is always called and may -% have changed things. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_family_math: { - \tl_set:Nn \l_@@_font_family_tl { rm } - \int_compare:nNnT { \fam } = { \c_@@_mathsf_int } - { \tl_set:Nn \l_@@_font_family_tl { sf } } - \int_compare:nNnT { \fam } = { \c_@@_mathtt_int } - { \tl_set:Nn \l_@@_font_family_tl { tt } } -} -\cs_new_protected:Npn \@@_detect_font_family_text: { - \tl_if_eq:NNT \f@family \c_@@_textsf_tl - { \tl_set:Nn \l_@@_font_family_tl { sf } } - \tl_if_eq:NNT \f@family \c_@@_texttt_tl - { \tl_set:Nn \l_@@_font_family_tl { tt } } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font_shape:} -% The shape test uses \cs{f@shape} as a handy indicator. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_shape: - { - \cs_if_exist:cT { \f@shape shape } - { - \cs_set:Npx \@@_font_shape: { \exp_not:c { \f@shape shape } } - } - } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_detect_font_mode:} -% The mode switch works from the fact that math mode output it the -% standard. -% \begin{macrocode} -\cs_new_protected:Npn \@@_detect_font_mode: { - \mode_if_math:F - { - \bool_set_false:N \l_@@_font_math_mode_bool - \bool_set_false:N \l_@@_number_math_mode_bool - \bool_set_false:N \l_@@_unit_math_mode_bool - } -} -% \end{macrocode} -%\end{macro} -% -%\subsection{Font macros} -% -% With the detection routines in place, the module can apply the result -% to control the font used for output. This requires a series of font -% names to be available. The appropriate storage areas will be selected -% by name, based on output type (\texttt{unit} or \texttt{value}) and -% the family selected by the detector. -% -%\begin{macro}{ -% \l_@@_number_math_mode_bool , -% \l_@@_unit_math_mode_bool -%} -% Most of the variables are created by the keys system: these are not. -% \begin{macrocode} -\bool_new:N \l_@@_number_math_mode_bool -\bool_new:N \l_@@_unit_math_mode_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_mathrm:n , -% \@@_number_mathsf:n , -% \@@_number_mathtt:n , -% \@@_number_textrm: , -% \@@_number_textsf: , -% \@@_number_texttt: -%} -% Functions for number-mode fonts. -% \begin{macrocode} -\cs_new:Npn \@@_number_mathrm:n #1 { } -\cs_new:Npn \@@_number_mathsf:n #1 { } -\cs_new:Npn \@@_number_mathtt:n #1 { } -\cs_new:Npn \@@_number_textrm: { } -\cs_new:Npn \@@_number_textsf: { } -\cs_new:Npn \@@_number_texttt: { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_color_tl} -% The settings are actually created separately for numbers and units: -% numbers first. -% \begin{macrocode} -\keys_define:nn { siunitx } { - number-color .tl_set:N = \l_@@_number_color_tl, - number-math-rm .code:n = - { \cs_set:Npn \@@_number_mathrm:n ##1 { #1 {##1} } }, - number-math-sf .code:n = - { \cs_set:Npn \@@_number_mathsf:n ##1 { #1 {##1} } }, - number-math-tt .code:n = - { \cs_set:Npn \@@_number_mathtt:n ##1 { #1 {##1} } }, - number-mode .choice:, - number-mode / math .code:n = - { \bool_set_true:N \l_@@_number_math_mode_bool }, - number-mode / text .code:n = - { \bool_set_false:N \l_@@_number_math_mode_bool }, - number-text-rm .code:n = - { \cs_set:Npn \@@_number_textrm: {#1} }, - number-text-sf .code:n = - { \cs_set:Npn \@@_number_textsf: {#1} }, - number-text-tt .code:n = - { \cs_set:Npn \@@_number_texttt: {#1} } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_unit_mathrm:n , -% \@@_unit_mathsf:n , -% \@@_unit_mathtt:n , -% \@@_unit_textrm: , -% \@@_unit_textsf: , -% \@@_unit_texttt: -%} -% The same storage for unit-mode fonts. -% \begin{macrocode} -\cs_new:Npn \@@_unit_mathrm: { } -\cs_new:Npn \@@_unit_mathsf: { } -\cs_new:Npn \@@_unit_mathtt: { } -\cs_new:Npn \@@_unit_textrm: { } -\cs_new:Npn \@@_unit_textsf: { } -\cs_new:Npn \@@_unit_texttt: { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_unit_color_tl} -% Units look exactly the same. -% \begin{macrocode} -\keys_define:nn { siunitx } { - unit-color .tl_set:N = \l_@@_unit_color_tl, - unit-math-rm .code:n = - { \cs_set:Npn \@@_unit_mathrm:n ##1 { #1 {##1} } }, - unit-math-sf .code:n = - { \cs_set:Npn \@@_unit_mathsf:n ##1 { #1 {##1} } }, - unit-math-tt .code:n = - { \cs_set:Npn \@@_unit_mathtt:n ##1 { #1 {##1} } }, - unit-mode .choice:, - unit-mode / math .code:n = - { \bool_set_true:N \l_@@_unit_math_mode_bool }, - unit-mode / text .code:n = - { \bool_set_false:N \l_@@_unit_math_mode_bool }, - unit-text-rm .code:n = - { \cs_set:Npn \@@_unit_textrm: {#1} }, - unit-text-sf .code:n = - { \cs_set:Npn \@@_unit_textsf: {#1} }, - unit-text-tt .code:n = - { \cs_set:Npn \@@_unit_texttt: {#1} } -} -% \end{macrocode} -%\end{macro} -% -% The general settings are all meta-keys. A few initial values are set -% here as they are needed for everything to work. -% \begin{macrocode} -\keys_define:nn { siunitx } { - color .meta:n = - { - number-color = #1, - unit-color = #1 - }, - math-rm .meta:n = - { - number-math-rm = #1, - unit-math-rm = #1 - }, - math-sf .meta:n = - { - number-math-sf = #1, - unit-math-sf = #1 - }, - math-tt .meta:n = - { - number-math-tt = #1, - unit-math-tt = #1 - }, - mode .choice:, - mode / math .meta:n = - { - number-mode = math, - unit-mode = math - }, - mode / text .meta:n = - { - number-mode = text, - unit-mode = text - }, - text-rm .meta:n = - { - number-text-rm = #1, - unit-text-rm = #1 - }, - text-sf .meta:n = - { - number-text-sf = #1, - unit-text-sf = #1 - }, - text-tt .meta:n = - { - number-text-tt = #1, - unit-text-tt = #1 - } -} -\keys_set:nn { siunitx } { - math-rm = \mathrm, - math-sf = \mathsf, - math-tt = \mathtt, - mode = math, - text-rm = \rmfamily, - text-sf = \sffamily, - text-tt = \ttfamily, -} -% \end{macrocode} -% -% Some packages and classes (for example \pkg{beamer}) set the default -% family to be something other than serif family. A one-off detection -% will make life easier -% all round. -% \begin{macrocode} -\AtBeginDocument { - \tl_set:Nx \l_@@_tmpa_tl { \familydefault } - \@ifpackageloaded { eulervm } - { - \cs_set:Npn \@@_tmp:w #1 { \mathrm {#1} } - \cs_if_eq:NNT \@@_number_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { number-math-rm = \mathnormal } } - \cs_if_eq:NNT \@@_unit_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { unit-math-rm = \mathnormal } } - } - { } - \tl_if_eq:NNT \l_@@_tmpa_tl \c_@@_textsf_tl - { - \@ifpackageloaded { arev } - { } - { - \@ifpackageloaded { cmbright } - { } - { - \cs_set:Npn \@@_tmp:w #1 { \mathrm {#1} } - \cs_if_eq:NNT \@@_number_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { number-math-rm = \mathsf } } - \cs_if_eq:NNT \@@_unit_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { unit-math-rm = \mathsf } } - } - } - \cs_set:Npn \@@_tmp:w { \rmfamily } - \cs_if_eq:NNT \@@_number_textrm: \@@_tmp:w - { \keys_set:nn { siunitx } { number-text-rm = \sffamily } } - \cs_if_eq:NNT \@@_unit_textrm: \@@_tmp:w - { \keys_set:nn { siunitx } { unit-text-rm = \sffamily } } - } - \tl_if_eq:NNT \l_@@_tmpa_tl \c_@@_texttt_tl - { - \cs_set:Npn \@@_tmp:w #1 { \mathrm {#1} } - \cs_if_eq:NNT \@@_number_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { number-math-rm = \mathtt } } - \cs_if_eq:NNT \@@_unit_mathrm:n \@@_tmp:w - { \keys_set:nn { siunitx } { unit-math-rm = \mathtt } } - \cs_set:Npn \@@_tmp:w { \rmfamily } - \cs_if_eq:NNT \@@_number_textrm: \@@_tmp:w - { \keys_set:nn { siunitx } { number-text-rm = \ttfamily } } - \cs_if_eq:NNT \@@_unit_textrm: \@@_tmp:w - { \keys_set:nn { siunitx } { unit-text-rm = \ttfamily } } - } -} -% \end{macrocode} -% -%\subsection{Output control} -% -% The \pkg{siunitx} output routine uses all of the font information -% gathered earlier to print the text given in whatever font is required. -% The low-level stuff is done here, with the calling routines expected -% to have taken some steps first (this is to allow line breaks in the -% appropriate places). -% -%\begin{macro}{\l_@@_print_arg_tl} -% The text to print. -% \begin{macrocode} -\tl_new:N \l_@@_print_arg_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_print_type_tl} -% The type of output (\texttt{number} or \texttt{unit}) is always -% needed. -% \begin{macrocode} -\tl_new:N \l_@@_print_type_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_print:nn , -% \@@_print:nV -%} -%\begin{macro}{\@@_print_aux:} -% The main printing function does everything inside a group, as -% there are category code and definition changes to make. First, set -% the fonts. Then move on to printing mode, before moving to actual -% printing. -% \begin{macrocode} -\cs_new_protected:Npn \@@_print:nn #1#2 { - \group_begin: - \tl_set:Nn \l_@@_print_type_tl {#1} - \tl_set:Nn \l_@@_print_arg_tl {#2} - \@@_detect_font: - \bool_if:NF \l_@@_detect_mode_bool - { - \bool_if:cTF { l_@@_ #1 _math_mode_bool } - { \bool_set_true:N \l_@@_font_math_mode_bool } - { \bool_set_false:N \l_@@_font_math_mode_bool } - } - \@@_print_aux: - \group_end: -} -\cs_generate_variant:Nn \@@_print:nn { nV } -% \end{macrocode} -% The various font changes are set up, then the correct printing -% function is called. Everything is inside \cs{text} as this allows -% proper setting of the various mode settings. -% \begin{macrocode} -\cs_new_protected:Npn \@@_print_aux: - { - \text - { - \@@_ensure_ltr:n - { - \color@begingroup - \@@_print_color: - \@@_font_shape: - \@@_font_weight: - \use:c - { - @@_ \l_@@_print_type_tl _ - text \l_@@_font_family_tl : - } - \bool_if:NTF \l_@@_font_math_mode_bool - { \@@_print_math: } - { \@@_print_text: } - \color@endgroup - } - } - } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{ -% \@@_print_color: , -% \@@_textcolor:n -%} -% The colour system checks if \pkg{color} is loaded, and only does -% anything if it is. This will change when \LaTeX3 proper is available: -% there will be colour out of the box! -% \begin{macrocode} -\cs_new_protected:Npn \@@_print_color: { - \tl_if_empty:cF { l_@@_ \l_@@_print_type_tl _color_tl } - { - \color - { - \tl_use:c { l_@@_ \l_@@_print_type_tl _color_tl } - } - } -} -\AtBeginDocument { - \@ifpackageloaded { color } - { \cs_new_eq:NN \@@_textcolor:n \textcolor } - { - \cs_set_protected:Npn \@@_print_color: - { - \tl_if_empty:cF { l_@@_ \l_@@_print_type_tl _color_tl } - { - \cs_gset_eq:NN \@@_print_color: \scan_stop: - \msg_warning:nn { siunitx } { color-not-loaded } - } - } - \cs_new_protected:Npn \@@_textcolor:n #1 - { - \cs_gset_eq:NN \@@_textcolor:n \use_none:n - \msg_warning:nn { siunitx } { color-not-loaded } - } - } -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_print_math:, \@@_print_text:} -% \begin{macro}{\@@_print_text_aux:} -% \begin{macro}{\@@_print_text_aux:NnN} -% Printing the text means replacing any awkward characters, which is -% dependent on the output mode. The rest of the package uses "_" and -% "^" to represent sub- and superscripts, respectively. In this way, -% mode decisions can be delayed as long as possible. The -% \pkg{underscore} package may make "_" active, or more likely -% it will be a superscript character. Both are tested for here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_print_math: - { - \cs_set_eq:NN \PrintSubscript \sb - \cs_set_eq:NN \PrintSuperscript \sp - \ensuremath - { - \use:c - { - @@_ \l_@@_print_type_tl _ - math \l_@@_font_family_tl :n - } - { \l_@@_print_arg_tl } - } - } -\cs_new_protected:Npn \@@_print_text: - { - \tl_replace_all:Nnn \l_@@_print_arg_tl { - } - { \textminus } - \@@_print_text_aux: - \tl_replace_all:Nnn \l_@@_print_arg_tl { \mp } - { \ensuremath { \mp } } - \tl_remove_all:Nn \l_@@_print_arg_tl { \mathord } - \cs_set_eq:NN \PrintSubscript \@@_print_text_sub:n - \cs_set_eq:NN \PrintSuperscript \@@_print_text_super:n - \__siunitx_print_text_aux:NnN - _ { math_subscript } \@@_print_text_sub:n - _ { active } \@@_print_text_sub:n - ^ { math_superscript } \@@_print_text_super:n - ^ { active } \@@_print_text_super:n - \q_recursion_tail ? ? - \q_recursion_stop - \l_@@_print_arg_tl - } -\cs_new_protected:Npn \@@_print_text_aux: - { - \tl_replace_all:Nnn \l_@@_print_arg_tl { \pm } - { \ensuremath { \pm } } - } -\cs_new_protected:Npn \@@_print_text_aux:NnN #1#2#3 - { - \quark_if_recursion_tail_stop:N #1 - \tl_set_rescan:Nnn \l_@@_tmpa_tl - { \use:c { char_set_catcode_ #2 :N } #1 } - {#1} - \tl_replace_all:NVn \l_@@_print_arg_tl \l_@@_tmpa_tl {#3} - \_@@_print_text_aux:NnN - } -\AtBeginDocument - { - \@ifpackageloaded { textcomp } - { - \cs_set_protected:Npn \@@_print_text_aux: - { - \tl_replace_all:Nnn \l_@@_print_arg_tl { \pm } - { \textpm } - } - } - { } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -%\begin{macro}{ -% \@@_print_text_sub:n , -% \@@_print_text_super:n -%} -%\begin{macro}{\@@_print_text_sub_super:n} -% \begin{macro}{\@@_print_text_sub_peek:} -% \begin{macro}{\@@_peek_true:, \@@_peek_false:} -% The appropriate macros for sub- and superscript in text mode ensure -% the appearance is the same as math mode. The search and replace -% code for superscripts deals with the case where a literal number has -% been given with text mode printing. There is currently an issue with -% \pkg{expl3}'s \cs{peek_\ldots} functions, which means that the peek -% code is written out here in full. -% \begin{macrocode} -\cs_new_protected:Npn \@@_print_text_sub:n #1 - { - \cs_set:Npn \@@_print_text_sub_super:n ##1 - { - \ensuremath - { - \sb { \text {#1} } - \sp { \text {##1} } - } - } - \cs_set_protected:Npn \@@_peek_true: - { - \tex_afterassignment:D \@@_print_text_sub_super:n - \cs_set_eq:NN \@@_tmp:w - } - \cs_set_protected:Npn \@@_peek_false: - { \ensuremath { \sb { \text {#1} } } } - \peek_after:Nw \@@_print_text_sub_peek: - } -\cs_new_protected:Npn \@@_print_text_sub_peek: - { - \if_meaning:w \l_peek_token \@@_print_text_super:n - \exp_after:wN \@@_peek_true: - \else: - \exp_after:wN \@@_peek_false: - \fi: - } -\cs_new_protected:Npn \@@_peek_true: { } -\cs_new_protected:Npn \@@_peek_false: { } -\cs_new_protected:Npn \@@_print_text_sub_super:n { } -\cs_new_protected:Npn \@@_print_text_super:n #1 { - \tl_set:Nn \l_@@_tmpa_tl {#1} - \tl_replace_all:Nnn \l_@@_tmpa_tl { - } - { \textminus } - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath - { \sp { \exp_not:N \text { \exp_not:V \l_@@_tmpa_tl } } } - } - \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% \end{macro} % \end{macro} % -%\begin{macro}{ -% \PrintSubscript , -% \PrintSuperscript -%} -% In the unit-construction code, there are places where it cannot -% be guarenteed that the search-and-replace approach will work. -% Instead, two user-space functions are needed. These are only -% defined within the above code: the names are not needed elsewhere. -%\end{macro} -% -%\subsection{Pre-processing numbers} -% -% Before the main parsing routine can be called, there is a need to -% pre-process the input. The possibility that the data in can contain -% more than one number needs to be handled. -% -%\begin{macro}{\l_@@_input_product_tl} -%\begin{macro}{\l_@@_input_quotient_tl} -% There are a couple of settings which are created here as they are used -% only for pre-processing. -% \begin{macrocode} -\keys_define:nn { siunitx } { - input-product .tl_set:N = \l_@@_input_product_tl, - input-quotient .tl_set:N = \l_@@_input_quotient_tl, -} -\keys_set:nn { siunitx } { - input-product = x, - input-quotient = / -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_number_arg_tl , -% \l_@@_number_next_tl -%} -% Storage for the pre-parsed material. The \texttt{arg} variable -% contains the current argument, the \texttt{next} variable contains -% anything held-over for the next round. -% \begin{macrocode} -\tl_new:N \l_@@_number_arg_tl -\tl_new:N \l_@@_number_next_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_multi_tl} -% For products and quotients, a way of feeding information back. -% \begin{macrocode} -\tl_new:N \l_@@_number_multi_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_number_denominator_tl , -% \l_@@_number_numerator_tl -%} -% When searching for quotients, some more storage is needed. -% \begin{macrocode} -\tl_new:N \l_@@_number_denominator_tl -\tl_new:N \l_@@_number_numerator_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_preprocess:n , -% \@@_number_preprocess:V -%} -% The pre-processor starts with the obvious: the most likely outcome is -% that all of the argument is passed through unchanged. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_preprocess:n #1 { - \@@_number_preprocess_init: - \tl_set:Nn \l_@@_number_arg_tl {#1} - \@@_number_preprocess_product: - \tl_if_empty:NT \l_@@_number_multi_tl - { \@@_number_preprocess_quotient: } -} -\cs_generate_variant:Nn \@@_number_preprocess:n { V } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_preprocess_init:} -% A little initialisation as normal. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_preprocess_init: { - \bool_set_false:N \l_@@_error_bool - \tl_clear:N \l_@@_number_multi_tl -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_preprocess_product:} -%\begin{macro}{\@@_number_preprocess_product_aux:N} -% Rather than search through the entire argument, we use the -% delimited-argument trick. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_preprocess_product: { - \tl_map_function:NN \l_@@_input_product_tl - \@@_number_preprocess_product_aux:N -} -\cs_new_protected:Npn \@@_number_preprocess_product_aux:N #1 { - \tl_if_in:NnT \l_@@_number_arg_tl {#1} - { - \cs_set:Npn \@@_tmp:w ##1 #1 ##2 \q_stop - { - \tl_set:Nn \l_@@_number_arg_tl {##1} - \tl_set:Nn \l_@@_number_next_tl {##2} - \tl_set:Nn \l_@@_number_multi_tl { product } - } - \exp_after:wN \@@_tmp:w \l_@@_number_arg_tl \q_stop - \tl_if_empty:NT \l_@@_number_arg_tl - { \@@_error:n { starting-product-token } } - \tl_if_empty:NT \l_@@_number_next_tl - { \@@_error:n { ending-product-token } } - \tl_map_break: - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_preprocess_quotient:} -%\begin{macro}{\@@_number_preprocess_quotient_aux:N} -% For the quotient, only one token can appear in each part. So there -% is an additional error check. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_preprocess_quotient: { - \tl_map_function:NN \l_@@_input_quotient_tl - \@@_number_preprocess_quotient_aux:N -} -\cs_new_protected:Npn \@@_number_preprocess_quotient_aux:N #1 { - \tl_if_in:NnT \l_@@_number_arg_tl {#1} - { - \cs_set:Npn \@@_tmp:w ##1 #1 ##2 \q_stop - { - \tl_set:Nn \l_@@_number_numerator_tl {##1} - \tl_set:Nn \l_@@_number_denominator_tl {##2} - \tl_set:Nn \l_@@_number_multi_tl { quotient } - } - \exp_after:wN \@@_tmp:w \l_@@_number_arg_tl \q_stop - \tl_if_empty:NT \l_@@_number_numerator_tl - { \@@_error:n { starting-quotient-token } } - \tl_if_empty:NT \l_@@_number_denominator_tl - { \@@_error:n { ending-quotient-token } } - \tl_if_in:NnT \l_@@_number_denominator_tl {#1} - { \@@_error:n { duplicate-quotient-token } } - \tl_map_break: - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Parsing numbers} -% -% The parser is designed to be relativity fast, which means some code is -% more or less duplicated to gain more speed. It is also loaded so -% that simple numbers (such as \num{-1.23}) are parsed particularly -% quickly. For most documents, this gain more than offsets any slight -% losses with more complicated numbers. -% -%\begin{macro}{\c_@@_number_part_complex_tl} -% A couple of the comparisons needed for checking complex numbers -% are done using stored text. To make them a little quicker, a -% pre-stored version of the text is stored here. -% \begin{macrocode} -\tl_const:Nn \c_@@_number_part_complex_tl { complex } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_number_in_complex_bool , -% \l_@@_number_in_complex_root_bool , -% \l_@@_number_in_decimal_bool , -% \l_@@_number_in_exponent_bool , -% \l_@@_number_in_first_bool , -% \l_@@_number_in_sign_bool , -% \l_@@_number_in_uncert_bool , -% \l_@@_number_in_value_bool -%} -% \begin{macrocode} -\bool_new:N \l_@@_number_in_complex_bool -\bool_new:N \l_@@_number_in_complex_root_bool -\bool_new:N \l_@@_number_in_decimal_bool -\bool_new:N \l_@@_number_in_exponent_bool -\bool_new:N \l_@@_number_in_first_bool -\bool_new:N \l_@@_number_in_sign_bool -\bool_new:N \l_@@_number_in_uncert_bool -\bool_new:N \l_@@_number_in_value_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_in_prop} -% The parsed number is stored in a property list as its constituent -% parts. -% \begin{macrocode} -\prop_new:N \l_@@_number_in_prop -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_parsed_tl} -% Each part of the number parsed has to be built up in a token list. -% \begin{macrocode} -\tl_new:N \l_@@_number_parsed_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_number_part_tl , -% \l_@@_number_part_decimal_tl , -% \l_@@_number_part_decimal_marker_tl , -% \l_@@_number_part_integer_tl , -% \l_@@_number_part_sign_tl , -% \l_@@_number_part_uncert_tl -%} -% The names of various parts of a number are set up as stored values. -% This lets some code be used for different parts of a number, while -% pre-storing everything brings a performance (and clarity) benefit. -% \begin{macrocode} -\tl_new:N \l_@@_number_part_tl -\tl_new:N \l_@@_number_part_decimal_tl -\tl_new:N \l_@@_number_part_decimal_marker_tl -\tl_new:N \l_@@_number_part_integer_tl -\tl_new:N \l_@@_number_part_sign_tl -\tl_new:N \l_@@_number_part_uncert_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_number_mantissa_length_int -% \l_@@_number_uncert_tl -% \l_@@_number_uncert_length_int -%} -% Conversion of uncertainty forms requires some storage, mainly for -% performance reasons. -% \begin{macrocode} -\int_new:N \l_@@_number_mantissa_length_int -\tl_new:N \l_@@_number_uncert_tl -\int_new:N \l_@@_number_uncert_length_int -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_input_uncert_sign_tl} -% This one is stored by some low-level code, so is declared explicitly. -% \begin{macrocode} -\tl_new:N \l_@@_input_uncert_sign_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_input_uncert_close_tl , -% \l_@@_input_complex_tl , -% \l_@@_input_comparator_tl , -% \l_@@_input_decimal_tl , -% \l_@@_input_digit_tl , -% \l_@@_input_exponent_tl , -% \l_@@_input_ignore_tl , -% \l_@@_input_uncert_open_tl , -% \l_@@_input_protect_tl , -% \l_@@_input_sign_tl , -% \l_@@_input_symbol_tl , -% \l_@@_input_uncert_sign_tl -%} -% The various tokens to check against when parsing are all set up here. -% These are valid inside a single number: the pre-processor has already -% set up the appropriate things for products and quotients. -% \begin{macrocode} -\keys_define:nn { siunitx } { - input-close-uncertainty .tl_set:N = \l_@@_input_uncert_close_tl , - input-complex-roots .tl_set:N = \l_@@_input_complex_tl , - input-comparators .tl_set:N = \l_@@_input_comparator_tl , - input-decimal-markers .tl_set:N = \l_@@_input_decimal_tl , - input-digits .tl_set:N = \l_@@_input_digit_tl , - input-exponent-markers .tl_set:N = \l_@@_input_exponent_tl , - input-ignore .tl_set:N = \l_@@_input_ignore_tl , - input-open-uncertainty .tl_set:N = \l_@@_input_uncert_open_tl , - input-protect-tokens .tl_set:N = \l_@@_input_protect_tl , - input-signs .tl_set:N = \l_@@_input_sign_tl , - input-symbols .tl_set:N = \l_@@_input_symbol_tl , - input-uncertainty-signs .code:n = - { - \tl_set:Nn \l_@@_input_uncert_sign_tl {#1} - \tl_map_inline:nn {#1} - { - \tl_if_in:NnF \l_@@_input_sign_tl {##1} - { \tl_put_right:Nn \l_@@_input_sign_tl {##1} } - } - } , -} -\keys_set:nn { siunitx } { % ( - input-close-uncertainty = ), - input-complex-roots = ij, - input-comparators = {<=>\approx\ge\geq\gg\le\leq\ll\sim}, - input-decimal-markers = {.,}, - input-digits = 0123456789, - input-exponent-markers = dDeE, - input-open-uncertainty = (, % ) - input-protect-tokens = \approx\dots\ge\geq\gg\le\leq\ll\mp\pi\pm\sim, - input-signs = +-\mp\pm, - input-symbols = \dots\pi, - input-uncertainty-signs = \pm, -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_in_parse:n , -% \@@_number_in_parse:V -%} -%\begin{macro}{\@@_number_in_parse_aux:n} -% The parsing routine starts by replacing any formatting in the input -% using \cs{tl_set_rescan:Nnx}. Next, there is a quick routine to -% ensure that all signs are single tokens. The main loop then takes -% place, which will parse the input into the property list and also -% set up the flags. There are then some checks and possible corrections. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse:n #1 { - \tl_if_empty:nF {#1} - { - \@@_number_in_init: - \cs_set_eq:NN \@@_number_in_parse_more:N - \@@_number_in_parse_mantissa_aux:N - \@@_number_in_parse_aux:n {#1} - } -} -\cs_generate_variant:Nn \@@_number_in_parse:n { V } -\group_begin: - \char_set_catcode_active:N \~ - \char_set_catcode_space:N \ % - \cs_new_protected:Npn \@@_number_in_parse_aux:n#1% - {% - \group_begin: - \@@_number_in_protect: - \cs_set_eq:NN\,\prg_do_nothing: - \cs_set_eq:NN~\prg_do_nothing: - \tl_set_rescan:Nnx\l_@@_number_arg_tl - {% - \char_set_catcode_ignore:N\ % - \char_set_catcode_other:N\,% - \char_set_catcode_other:N\.% - }% - {#1}% - \exp_args:NNNV\group_end: - \tl_set:Nn\l_@@_number_arg_tl\l_@@_number_arg_tl - \@@_number_in_sign_replace:N\l_@@_number_arg_tl - \@@_number_in_parse_relation:N\l_@@_number_arg_tl - \tl_map_function:NN\l_@@_number_arg_tl - \@@_number_in_parse_loop:N - \tl_if_empty:NF\l_@@_number_parsed_tl - {% - \bool_if:NTF\l_@@_number_in_uncert_bool - {\@@_error:nx{invalid-number}{#1}}% - {% - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_tl {true}% - \bool_if:NTF\l_@@_number_in_decimal_bool - {% - \prop_put:NVV\l_@@_number_in_prop - \l_@@_number_part_decimal_tl - \l_@@_number_parsed_tl - }% - {% - \prop_put:NVV\l_@@_number_in_prop - \l_@@_number_part_integer_tl - \l_@@_number_parsed_tl - }% - }% - }% - \@@_number_in_check:n {#1}% - } -\group_end: -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_in_init: , -% \@@_number_in_init_part:n -%} -% The set up code is divided into to parts. First, code only needed -% once to start the entire parser. Then a second group, which is -% carried out at the start of each part of a number, and so is called -% from a few places. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_init: { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_mantissa:N - \cs_set_eq:NN \@@_number_in_check:n - \@@_number_in_check_short:n - \tl_clear:N \l_@@_number_parsed_tl - \prop_clear:N \l_@@_number_in_prop - \bool_set_false:N \l_@@_error_bool - \bool_set_false:N \l_@@_number_in_complex_bool - \bool_set_false:N \l_@@_number_in_complex_root_bool - \bool_set_false:N \l_@@_number_in_exponent_bool - \bool_set_false:N \l_@@_number_in_uncert_bool - \@@_number_in_init_part:n { mantissa } -} -\cs_new_protected:Npn \@@_number_in_init_part:n #1 { - \bool_set_false:N \l_@@_number_in_decimal_bool - \bool_set_true:N \l_@@_number_in_first_bool - \bool_set_false:N \l_@@_number_in_sign_bool - \bool_set_false:N \l_@@_number_in_value_bool - \tl_set:Nn \l_@@_number_part_tl {#1} - \tl_set:Nn \l_@@_number_part_decimal_tl { #1 -decimal } - \tl_set:Nn \l_@@_number_part_decimal_marker_tl - { #1 -decimal-marker } - \tl_set:Nn \l_@@_number_part_integer_tl { #1 -integer } - \tl_set:Nn \l_@@_number_part_sign_tl { #1 -sign } - \tl_set:Nn \l_@@_number_part_uncert_tl { #1 -uncertainty } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_protect:} -%\begin{macro}{\@@_number_in_protect_aux:N} -% Under some circumstances (for example when loading \pkg{breqn}) -% some tokens do not behave safely under \texttt{x} expansion (at the -% moment). To get round this, they are redefined here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_protect: { - \tl_map_function:NN \l_@@_input_protect_tl - \@@_number_in_protect_aux:N -} -\cs_new_protected:Npn \@@_number_in_protect_aux:N #1 { - \cs_set_eq:NN #1 \scan_stop: -} -% \end{macrocode} -%\end{macro} -%\end{macro} +% \subsection{Top-level scratch space} % -% \begin{macro}[int]{\@@_number_in_sign_replace:N} -% \begin{macro}{\@@_number_in_sign_replace_aux:N} -% \begin{macro}{\@@_number_in_sign_replace_aux:NnN} -% A short spin-out to keep the replacement of tokens clear. -% The case where |-| is active needs special treatment and -% needs to come first. +% \begin{macro}{\l_@@_tmp_tl} +% Scratch space for the interfaces. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_sign_replace:N #1 - { - \@@_number_in_sign_replace_aux:N #1 - \@@_number_in_sign_replace_aux:NnN #1 - { -+ } \mp - { +- } \pm - { << } \ll - { <= } \le - { >> } \gg - { >= } \ge - { ?? } \q_recursion_tail - \q_recursion_stop - } -\group_begin: - \char_set_catcode_active:N - - \cs_new_protected:Npx \_@@_number_in_sign_replace_aux:N #1 - { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } } -\group_end: -\cs_new_protected:Npn \@@_number_in_sign_replace_aux:NnN #1#2#3 - { - \quark_if_recursion_tail_stop:N #3 - \tl_replace_all:Nnn #1 {#2} {#3} - \@@_number_in_sign_replace_aux:NnN #1 - } +\tl_new:N \l_@@_tmp_tl % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} % -%\begin{macro}{ -% \@@_number_in_parse_error:nn , -% \@@_number_in_parse_error:nV -%} -% There are lots of rather similar errors in the parser, all of which -% require a \cs{tl_map_break:}. To keep life simple, this is set up -% here. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_error:nn #1#2 { - \@@_error:nx {#1} { \exp_not:n {#2} } - \tl_map_break: -} -\cs_generate_variant:Nn \@@_number_in_parse_error:nn { nV } +%</init> % \end{macrocode} -%\end{macro} % -%\begin{macro}{ -% \@@_number_in_parse_loop:N , -% \@@_number_in_parse_more:N -%} -% The main loop is set up as a place holder, as the definition is -% varied to keep things fast. There is also a place holder for the -% extended routing for normal mantissas. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_loop:N #1 { } -\cs_new_protected:Npn \@@_number_in_parse_more:N #1 { } +%<*options> % \end{macrocode} -%\end{macro} % -%\begin{macro}{\@@_number_in_parse_relation:N} -%\begin{macro}{\@@_number_in_parse_relation:w} -% The idea here is that a relation with be the very first token in the -% input, or it is not valid. So the test for a relation can be very -% simple and hopefully efficient. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_relation:N #1 { - \exp_after:wN \@@_number_in_parse_relation:w #1 \q_stop #1 -} -\cs_new_protected:Npn \@@_number_in_parse_relation:w - #1#2 \q_stop #3 { - \tl_if_in:NnT \l_@@_input_comparator_tl {#1} - { - \prop_put:Nnn \l_@@_number_in_prop { comparator } {#1} - \tl_set:Nn #3 {#2} - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_in_parse_restricted:N} -% When parsing numbers for the \cs{ang} function, no extended input -% is permitted at all. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_restricted:N #1 { - \tl_if_in:NnTF \l_@@_input_exponent_tl {#1} - { - \@@_number_in_parse_error:nn - { restricted-number } {#1} - } - { - \tl_if_in:NnTF \l_@@_input_uncert_open_tl {#1} - { - \@@_number_in_parse_error:nV - { restricted-number } \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_uncert_close_tl {#1} - { - \@@_number_in_parse_error:nV - { restricted-number } \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_complex_tl {#1} - { - \@@_number_in_parse_error:nV - { restricted-number } \l_@@_number_arg_tl - } - { - \@@_number_in_parse_error:nn - { restricted-number } {#1} - } - } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_parse_complex:N} -% After a complex root when the root is \emph{after} the number, there -% are a very limited range of legitimate tokens. Thus most cases can be -% trapped with a modified parser. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_complex:N #1 { - \tl_if_in:NnTF \l_@@_input_exponent_tl {#1} - { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_mantissa:N - \@@_number_in_exponent:N #1 - } - { - \tl_if_in:NnF \l_@@_input_ignore_tl {#1} - { - \@@_number_in_parse_error:nV - { misplaced-complex-root-token } - \l_@@_number_arg_tl - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_parse_exponent:N} -% When processing an exponent, the \enquote{extended} part of the -% number which is valid in a mantissa is no longer needed. So the -% auxiliary function is pointed to a series of errors instead. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_exponent:N #1 { - \tl_if_in:NnTF \l_@@_input_exponent_tl {#1} - { - \@@_number_in_parse_error:nn - { duplicate-exponent-token } { \token_to_str:N #1 } - } - { - \tl_if_in:NnTF \l_@@_input_uncert_open_tl {#1} - { - \@@_number_in_parse_error:nV - { invalid-token-in-exponent } \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_uncert_close_tl {#1} - { - \@@_number_in_parse_error:nV - { invalid-token-in-exponent } \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_complex_tl {#1} - { - \@@_number_in_parse_error:nV - { invalid-token-in-exponent } - \l_@@_number_arg_tl - } - { - \@@_number_in_parse_error:nn - { invalid-token-in-number } {#1} - } - } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_parse_mantissa:N} -%\begin{macro}{\@@_number_in_parse_mantissa_aux:N} -% For the mantissa, most things are valid. The procedure is split -% into two parts, with the simple symbols handled here and the more -% complex ones in a second part(which needs to be varied). Essentially -% everything here is a comparison, done so that the code is a fast as -% possible. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_mantissa:N #1 { - \tl_if_in:NnTF \l_@@_input_digit_tl {#1} - { \@@_number_in_digit:n {#1} } - { - \tl_if_in:NnTF \l_@@_input_decimal_tl {#1} - { \@@_number_in_decimal:N #1 } - { - \tl_if_in:NnTF \l_@@_input_sign_tl {#1} - { \@@_number_in_sign:N #1 } - { - \tl_if_in:NnTF \l_@@_input_symbol_tl {#1} - { - \prop_put:Nnn \l_@@_number_in_prop { symbolic } - { true } - \@@_number_in_digit:n {#1} - } - { - \tl_if_in:NnF \l_@@_input_ignore_tl {#1} - { \@@_number_in_parse_more:N #1 } - } - } - } - } -} -\cs_new_protected:Npn \@@_number_in_parse_mantissa_aux:N #1 { - \tl_if_in:NnTF \l_@@_input_exponent_tl {#1} - { \@@_number_in_exponent:N #1 } - { - \tl_if_in:NnTF \l_@@_input_uncert_open_tl {#1} - { \@@_number_in_uncert_open:N #1 } - { - \tl_if_in:NnTF \l_@@_input_uncert_close_tl {#1} - { - \@@_number_in_parse_error:nn - { misplaced-uncertainty-token } {#1} - } - { - \tl_if_in:NnTF \l_@@_input_complex_tl {#1} - { \@@_number_in_complex:N #1 } - { - \@@_number_in_parse_error:nn - { invalid-token-in-number } {#1} - } - } - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_in_parse_uncert:N} -% Within uncertainties, the range of tokens is limited. An alternative -% parsing system can therefore be used. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_uncert:N #1 { - \tl_if_in:NnTF \l_@@_input_digit_tl {#1} - { \@@_number_in_digit:n {#1} } - { - \tl_if_in:NnTF \l_@@_input_decimal_tl {#1} - { - \@@_number_in_parse_error:nV - { invalid-token-in-uncertainty } - \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_sign_tl {#1} - { - \@@_number_in_parse_error:nV - { invalid-token-in-uncertainty } - \l_@@_number_arg_tl - } - { - \tl_if_in:NnTF \l_@@_input_symbol_tl {#1} - { - \prop_put:Nnn \l_@@_number_in_prop { symbolic } - { true } - \@@_number_in_digit:n {#1} - } - { - \tl_if_in:NnF \l_@@_input_ignore_tl {#1} - { - \tl_if_in:NnTF \l_@@_input_uncert_close_tl - {#1} - { \@@_number_in_uncert_close:N #1 } - { - \@@_number_in_parse_error:nV - { invalid-token-in-uncertainty } - \l_@@_number_arg_tl - } - } - } - } - } - } -} -% \end{macrocode} -%\end{macro} +% \subsection{Load time options} % -%\begin{macro}{\@@_number_in_parse_uncert_after:N} -% After an uncertainty, there is once again a very limited range of -% tokens that can be present in a valid number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_parse_uncert_after:N #1 { - \tl_if_in:NnTF \l_@@_input_exponent_tl {#1} - { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_mantissa:N - \@@_number_in_exponent:N #1 - } - { - \tl_if_in:NnTF \l_@@_input_sign_tl {#1} - { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_mantissa:N - \@@_number_in_sign:N #1 - } - { - \tl_if_in:NnF \l_@@_input_ignore_tl {#1} - { - \tl_if_in:NnTF \l_@@_input_complex_tl {#1} - { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_mantissa:N - \@@_number_in_complex:N #1 - } - { - \@@_number_in_parse_error:nV { invalid-number } - \l_@@_number_arg_tl - } - } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_complex:N} -%\begin{macro}{\@@_number_in_complex_aux:nn} -% Only one complex root token can be give, hence the initial test. -% More tests are needed for complex numbers than other systems, so -% the additional ones are turned on, followed by some flag setting. -% The complex root is stored, then there is a check to see if the -% root is at the end of the number: if it is, prevent any more tokens -% being added. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_complex:N #1 { - \bool_set_false:N \l_@@_number_in_first_bool - \bool_if:NTF \l_@@_number_in_complex_root_bool - { - \@@_number_in_parse_error:nn - { duplicate-complex-root-token } { \token_to_str:N #1 } - } - { - \cs_set_eq:NN \@@_number_in_check:n - \@@_number_in_check_full:n - \bool_set_true:N \l_@@_number_in_complex_root_bool - \prop_put:Nnn \l_@@_number_in_prop { complex-root } {#1} - \tl_if_empty:NF \l_@@_number_parsed_tl - { - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_complex:N - } - \bool_if:NT \l_@@_number_in_decimal_bool - { - \bool_if:NF \l_@@_number_in_complex_bool - { - \prop_if_in:NnT \l_@@_number_in_prop - { mantissa-uncertainty } - { - \@@_number_in_complex_aux:nn - { mantissa-decimal } { complex-decimal } - \@@_number_in_complex_aux:nn - { mantissa-uncertainty } { complex-uncertainty } - } - \@@_number_in_complex_aux:nn { mantissa-integer } - { complex-integer } - \@@_number_in_complex_aux:nn - { mantissa-decimal-marker } { complex-decimal-marker } - \prop_remove:Nn \l_@@_number_in_prop { mantissa } - \prop_put:Nnn \l_@@_number_in_prop { complex } - { true } - } - } - \prop_if_in:NnF \l_@@_number_in_prop { mantissa } - { - \prop_if_in:NnT \l_@@_number_in_prop { mantissa-sign } - { - \@@_number_in_complex_aux:nn { mantissa-sign } - { complex-sign } - } - } - \bool_set_true:N \l_@@_number_in_complex_bool - \bool_set_false:N \l_@@_number_in_first_bool - \@@_number_in_init_part:n { complex } - \prop_if_in:NnT \l_@@_number_in_prop - { complex-decimal-marker } - { \bool_set_true:N \l_@@_number_in_decimal_bool } - \prop_if_in:NnTF \l_@@_number_in_prop - { complex-sign } - { \bool_set_true:N \l_@@_number_in_sign_bool } - { \prop_remove:Nn \l_@@_number_in_prop { mantissa } } - } -} -\cs_new_protected:Npn \@@_number_in_complex_aux:nn #1#2 { - \prop_get:NnNT \l_@@_number_in_prop {#1} \l_@@_tmpa_tl - { - \prop_remove:Nn \l_@@_number_in_prop {#1} - \prop_put:NnV \l_@@_number_in_prop {#2} \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_in_decimal:N} -% Only one decimal marker allowed, so a test for this. If an integer -% part has been found, it is saved. The flag for the number being -% found is not set unless there is an integer, to watch for the case -% of invalid numbers. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_decimal:N #1 { - \bool_set_false:N \l_@@_number_in_first_bool - \bool_if:NTF \l_@@_number_in_decimal_bool - { - \@@_number_in_parse_error:nn { duplicate-decimal-token } - {#1} - } - { - \bool_set_true:N \l_@@_number_in_decimal_bool - \tl_if_empty:NF \l_@@_number_parsed_tl - { - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_tl { true } - \prop_put:NVV \l_@@_number_in_prop - \l_@@_number_part_integer_tl - \l_@@_number_parsed_tl - \tl_clear:N \l_@@_number_parsed_tl - } - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_decimal_marker_tl {#1} - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_digit:n} -% For digits, only in an uncertainty can the value be stored -% directly. Otherwise, there is a need to see if the value is non-zero. -% This is used to drop leading zeros and to validate any sign (as zero -% is unsigned). -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_digit:n #1 { - \bool_set_false:N \l_@@_number_in_first_bool - \bool_if:NTF \l_@@_number_in_uncert_bool - { \tl_put_right:Nn \l_@@_number_parsed_tl {#1} } - { - \bool_if:NTF \l_@@_number_in_decimal_bool - { - \tl_put_right:Nn \l_@@_number_parsed_tl {#1} - \str_if_eq:nnF {#1} { 0 } - { \bool_set_true:N \l_@@_number_in_value_bool } - } - { - \str_if_eq:nnTF {#1} { 0 } - { - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_tl { true } - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_integer_tl { 0 } - } - { \bool_set_true:N \l_@@_number_in_value_bool } - \bool_if:NT \l_@@_number_in_value_bool - { \tl_put_right:Nn \l_@@_number_parsed_tl {#1} } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_exponent:N} -% A duplicate token test starts off the code, which if passed -% leads to some simple storage manipulation. As exponents are -% more simple than the mantissa, the extra processing is swapped for -% some that only raises errors. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_exponent:N #1 { - \bool_if:NTF \l_@@_number_in_exponent_bool - { - \@@_number_in_parse_error:nn { duplicate-exponent-token } - { \token_to_str:N #1 } - } - { - \cs_set_eq:NN \@@_number_in_parse_more:N - \@@_number_in_parse_exponent:N - \tl_if_empty:NF \l_@@_number_parsed_tl - { \@@_number_in_store: } - \bool_set_true:N \l_@@_number_in_exponent_bool - \@@_number_in_init_part:n { exponent } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_sign:N} -% The code for signs is complicated by complex numbers. A sign token -% must be the fist thing in a number, but after the real part of the -% mantissa a second sign token can appear to start a complex number. -% So most of the code here is to detect that case. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_sign:N #1 { - \bool_if:NTF \l_@@_number_in_first_bool - { - \bool_set_false:N \l_@@_number_in_first_bool - \bool_set_true:N \l_@@_number_in_sign_bool - \prop_put:NVn \l_@@_number_in_prop - \l_@@_number_part_sign_tl {#1} - } - { - \bool_if:NTF \l_@@_number_in_exponent_bool - { - \@@_number_in_parse_error:nn { misplaced-sign-token } - {#1} - } - { - \bool_if:NTF \l_@@_number_in_complex_bool - { - \@@_number_in_parse_error:nn - { misplaced-sign-token } {#1} - } - { - \tl_if_empty:NF \l_@@_number_parsed_tl - { \@@_number_in_store: } - \cs_set_eq:NN \@@_number_in_check:n - \@@_number_in_check_full:n - \@@_number_in_init_part:n { complex } - \prop_put:Nnn \l_@@_number_in_prop - { complex-sign } {#1} - \bool_set_true:N \l_@@_number_in_complex_bool - } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_in_uncert_open:N , -% \@@_number_in_uncert_close:N -%} -% Opening and closing uncertainty tokens are handled separately. For -% opening tokens, a check is made that there is something else to the -% number before collecting material up. For the closing token, the -% uncertainty must contain some numbers. A special loop function is then -% set up to prevent any additional digits after the closing token. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_uncert_open:N #1 { - \bool_set_false:N \l_@@_number_in_first_bool - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_uncert:N - \bool_set_true:N \l_@@_number_in_uncert_bool - \tl_if_empty:NTF \l_@@_number_parsed_tl - { - \prop_if_in:NVF \l_@@_number_in_prop - \l_@@_number_part_integer_tl - { - \@@_number_in_parse_error:nV { invalid-number } - \l_@@_number_arg_tl - } - } - { \@@_number_in_store: } -} -\cs_new_protected:Npn \@@_number_in_uncert_close:N #1 { - \bool_set_false:N \l_@@_number_in_uncert_bool - \tl_if_empty:NTF \l_@@_number_parsed_tl - { - \@@_number_in_parse_error:nV { empty-uncertainty } - \l_@@_number_arg_tl - } - { - \prop_put:NVV \l_@@_number_in_prop - \l_@@_number_part_uncert_tl \l_@@_number_parsed_tl - \prop_put:Nnn \l_@@_number_in_prop - { uncertainty } { true } - \tl_clear:N \l_@@_number_parsed_tl - \cs_set_eq:NN \@@_number_in_parse_loop:N - \@@_number_in_parse_uncert_after:N - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_in_store:} -% A short auxiliary function needed in various places for storing -% either the integer or decimal part of a number, as appropriate. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_store: { - \prop_put:NVn \l_@@_number_in_prop \l_@@_number_part_tl - { true } - \bool_if:NTF \l_@@_number_in_decimal_bool - { - \prop_put:NVV \l_@@_number_in_prop - \l_@@_number_part_decimal_tl \l_@@_number_parsed_tl - } - { - \prop_put:NVV \l_@@_number_in_prop - \l_@@_number_part_integer_tl \l_@@_number_parsed_tl - } - \tl_clear:N \l_@@_number_parsed_tl -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_in_check:n , -% \@@_number_in_check_short:n , -% \@@_number_in_check_full:n -%} -% The checks needed for a number depend on whether there is a complex -% part. In all cases, there must be some digits, as well as a sign or -% decimal marker. There is also a check for a zero-valued input, which -% has any sign deleted. For complex numbers, the check is needed in -% case there was no real part. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_check:n #1 { } -\cs_new_protected:Npn \@@_number_in_check_short:n #1 { - \prop_if_in:NVF \l_@@_number_in_prop - \l_@@_number_part_integer_tl - { - \prop_if_in:NVF \l_@@_number_in_prop - \l_@@_number_part_decimal_tl - { \@@_error:nx { invalid-number } {#1} } - } - \bool_if:NF \l_@@_number_in_value_bool - { - \tl_if_eq:NNF \l_@@_number_part_tl - \c_@@_number_part_complex_tl - { - \prop_get:NVNT \l_@@_number_in_prop - \l_@@_number_part_sign_tl \l_@@_tmpa_tl - { - \tl_set:Nx \l_@@_tmpb_tl - { \l_@@_number_part_sign_tl -deleted } - \prop_put:NVV \l_@@_number_in_prop - \l_@@_tmpb_tl \l_@@_tmpa_tl - } - \prop_remove:NV \l_@@_number_in_prop - \l_@@_number_part_sign_tl - } - } -} -\cs_new_protected:Npn \@@_number_in_check_full:n #1 { - \tl_if_eq:NNF \l_@@_number_part_tl - \c_@@_number_part_complex_tl - { \@@_number_in_check_short:n {#1} } - \bool_if:NF \l_@@_number_in_complex_root_bool - { - \prop_get:NnN \l_@@_number_in_prop { complex-sign } - \l_@@_tmpa_tl - \tl_if_in:NVTF \l_@@_input_uncert_sign_tl \l_@@_tmpa_tl - { - \prop_if_in:NnTF \l_@@_number_in_prop { uncertainty } - { - \@@_error:nx { misplaced-sign-token } - { \exp_not:n {#1} } - } - { \@@_number_in_complex_to_uncert:n {#1} } - } - { - \@@_error:nx { misplaced-sign-token } - { \exp_not:n {#1} } - } - } - \prop_get:NnNT \l_@@_number_in_prop { mantissa-sign } - \l_@@_tmpa_tl - { - \prop_if_in:NnF \l_@@_number_in_prop { mantissa } - { - \prop_remove:Nn \l_@@_number_in_prop { mantissa-sign } - \prop_put:NnV \l_@@_number_in_prop { complex-sign } - \l_@@_tmpa_tl - } - } -} -% \end{macrocode} -%\end{macro} -% -% -%\begin{macro}{\@@_number_in_complex_to_uncert:n} -%\begin{macro}{ -% \@@_number_in_complex_to_uncert_int: , -% \@@_number_in_complex_to_uncert_dec: -%} -% Internally, uncertainties are stored in \enquote{compact} form. -% The code here takes a putative complex part and converts it to -% a compact uncertainty, with checks for the cases where things look -% wrong. The method needed depends on whether there is an integer -% part. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_complex_to_uncert:n #1 { - \prop_remove:Nn \l_@@_number_in_prop { complex } - \prop_remove:Nn \l_@@_number_in_prop { complex-decimal-marker } - \prop_remove:Nn \l_@@_number_in_prop { complex-sign } - \prop_put:Nnn \l_@@_number_in_prop { uncertainty } { true } - \prop_get:NnNTF \l_@@_number_in_prop { complex-integer } - \l_@@_number_uncert_tl - { - \tl_if_single:NTF \l_@@_number_uncert_tl - { - \int_compare:nNnTF \l_@@_number_uncert_tl = 0 - { \@@_number_in_complex_to_uncert_dec:n {#1} } - { \@@_number_in_complex_to_uncert_int: } - } - { \@@_number_in_complex_to_uncert_int: } - } - { \@@_number_in_complex_to_uncert_dec:n {#1} } - \prop_remove:Nn \l_@@_number_in_prop { complex-integer } - \prop_remove:Nn \l_@@_number_in_prop { complex-decimal } -} -% \end{macrocode} -% When the input has an integer part to the uncertainty, the -% conversion is easy as all of the decimal part can be copied -% across. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_complex_to_uncert_int: { - \prop_get:NnNF \l_@@_number_in_prop { complex-decimal } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNF \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \@@_number_in_complex_to_uncert_pad: -} -% \end{macrocode} -% For a number in which all of the uncertainty is in the decimal part, -% only the significant digits are needed. This means that a loop is -% needed to drop non-significant ones. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_complex_to_uncert_dec:n - #1 - { - \tl_clear:N \l_@@_number_uncert_tl - \prop_get:NnNTF \l_@@_number_in_prop { complex-decimal } - \l_@@_tmpa_tl - { - \prop_get:NnN \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - \quark_if_no_value:NT \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \tl_map_function:NN - \l_@@_tmpa_tl - \@@_number_in_complex_to_uncert_dec_loop:N - \@@_number_in_complex_to_uncert_pad: - } - { \@@_error:nx { misplaced-sign-token } { \exp_not:n {#1} } } - } -\cs_new_protected:Npn - \@@_number_in_complex_to_uncert_dec_loop:N #1 +% \begin{variable}{\l_@@_column_type_tl} +% \begin{macrocode} +\keys_define:nn { siunitx } { - \str_if_eq:nnTF {#1} { 0 } - { - \tl_set:Nx \l_@@_tmpa_tl - { \tl_tail:N \l_@@_tmpa_tl } - \tl_if_empty:NF \l_@@_tmpb_tl - { - \tl_set:Nx \l_@@_tmpb_tl - { \tl_tail:N \l_@@_tmpb_tl } - } - } - { \tl_map_break: } + table-column-type .tl_set:N = + \l_@@_column_type_tl } -% \end{macrocode} -% In all cases, there is a need to pad out either the uncertainty or -% the decimal part so the places agree. To allow the two branches to -% share code, some of the order here is slightly odd. The code -% also re-obtains the decimal part from the mantissa, as the stored -% value may have been trimmed to drop non-significant zeros. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_in_complex_to_uncert_pad: +\keys_set:nn { siunitx } { - \int_set:Nn \l_@@_number_uncert_length_int - { \tl_count:N \l_@@_tmpa_tl } - \int_set:Nn \l_@@_number_mantissa_length_int - { \tl_count:N \l_@@_tmpb_tl } - \int_compare:nNnTF - { \l_@@_number_mantissa_length_int } - > { \l_@@_number_uncert_length_int } - { - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:V \l_@@_tmpa_tl - \prg_replicate:nn - { - \l_@@_number_mantissa_length_int - - \l_@@_number_uncert_length_int - } - { 0 } - } - } - { - \prop_get:NnNF \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \tl_set:Nx \l_@@_tmpb_tl - { - \exp_not:V \l_@@_tmpb_tl - \prg_replicate:nn - { - \l_@@_number_uncert_length_int - - \l_@@_number_mantissa_length_int - } - { 0 } - } - \tl_if_empty:NF \l_@@_tmpb_tl - { - \prop_put:NnV \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - \prop_if_in:NnF \l_@@_number_in_prop - { mantissa-decimal-marker } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal-marker } { . } - } - } - } - \tl_put_right:NV \l_@@_number_uncert_tl \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_in_prop { mantissa-uncertainty } - \l_@@_number_uncert_tl + table-column-type = S } % \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Post-processing numbers} -% -% After finding the basic number in the code above, there may be some -% manipulation to do. This covers things such as tidying up excess -% information and rounding numbers. Nothing is added here that is -% for \enquote{formatting}: this is left for the output part of the -% system. -% -% \begin{variable} -% { -% \l_@@_round_int , -% \l_@@_round_tl , -% \l_@@_round_bool , -% \l_@@_round_decimal_in_tl , -% \l_@@_round_decimal_out_tl , -% \l_@@_round_discard_tl , -% \l_@@_round_even_bool , -% \l_@@_round_integer_in_tl , -% \l_@@_round_integer_out_tl , -% \l_@@_round_half_up_bool -% } -% The rounding system needs a number of variables. -% \begin{macrocode} -\int_new:N \l_@@_round_int -\tl_new:N \l_@@_round_tl -\bool_new:N \l_@@_round_bool -\tl_new:N \l_@@_round_decimal_in_tl -\tl_new:N \l_@@_round_decimal_out_tl -\tl_new:N \l_@@_round_discard_tl -\tl_new:N \l_@@_round_even_bool -\tl_new:N \l_@@_round_integer_in_tl -\tl_new:N \l_@@_round_integer_out_tl -\bool_new:N \l_@@_round_half_up_bool -% \end{macrocode} % \end{variable} % -%\begin{macro}{ -% \l_@@_process_decimal_int , -% \l_@@_process_uncertainty_int , -% \l_@@_uncertainty_decimal_tl , -% \l_@@_uncertainty_integer_tl -%} -% The code to expand uncertainties needs to know numbers of digits, and -% to store various data. -% \begin{macrocode} -\int_new:N \l_@@_process_decimal_int -\int_new:N \l_@@_process_uncertainty_int -\tl_new:N \l_@@_uncertainty_decimal_tl -\tl_new:N \l_@@_uncertainty_integer_tl -% \end{macrocode} -%\end{macro} +% \subsection{Option handling} % -%\begin{macro}{ -% \l_@@_process_fixed_bool , -% \l_@@_process_engineering_bool , -% \l_@@_process_scientific_bool -%} -% Settings for the scientific notation system. -% \begin{macrocode} -\bool_new:N \l_@@_process_fixed_bool -\bool_new:N \l_@@_process_engineering_bool -\bool_new:N \l_@@_process_scientific_bool +% \begin{macrocode} +\RequirePackage { l3keys2e } % \end{macrocode} -%\end{macro} % -% \begin{variable}{\l_@@_process_drop_exponent_bool} -% Used to drop the exponent when this is necessary. -% \begin{macrocode} -\bool_new:N \l_@@_process_drop_exponent_bool +% \begin{macrocode} +\ProcessKeysOptions { siunitx } % \end{macrocode} -% \end{variable} % -% \begin{variable} -% { -% \l_@@_process_decimal_zero_bool , -% \l_@@_process_integer_zero_bool , -% \l_@@_process_sign_tl , -% \l_@@_process_fixed_int , -% \l_@@_process_integer_min_int , -% \l_@@_process_plus_bool , -% \l_@@_omit_uncert_bool , -% \l_@@_process_unity_mantissa_tl , -% \l_@@_process_zero_exponent_bool , -% \l_@@_process_int_to_dec_bool , -% \l_@@_process_round_min_tl , -% \l_@@_process_precision_int , -% \l_@@_zero_decimal_to_integer_bool -% } -% First, the options are set up. % \begin{macrocode} -\keys_define:nn { siunitx } - { - add-decimal-zero .bool_set:N = \l_@@_process_decimal_zero_bool, - add-integer-zero .bool_set:N = \l_@@_process_integer_zero_bool, - explicit-sign .tl_set:N = \l_@@_process_sign_tl, - fixed-exponent .int_set:N = \l_@@_process_fixed_int, - minimum-integer-digits .int_set:N = - \l_@@_process_integer_min_int, - retain-explicit-plus .bool_set:N = \l_@@_process_plus_bool, - omit-uncertainty .bool_set:N = \l_@@_omit_uncert_bool, - retain-unity-mantissa .bool_set:N = - \l_@@_process_unity_mantissa_bool, - retain-zero-exponent .bool_set:N = - \l_@@_process_zero_exponent_bool, - round-half .choice:, - round-half / even .code:n = - { \bool_set_false:N \l_@@_round_half_up_bool }, - round-half / up .code:n = - { \bool_set_true:N \l_@@_round_half_up_bool }, - round-integer-to-decimal .bool_set:N = - \l_@@_process_int_to_dec_bool, - round-minimum .tl_set:N = \l_@@_process_round_min_tl, - round-mode .choice: , - round-mode / figures .code:n = - { \tl_set:Nn \l_@@_round_tl { figures } }, - round-mode / off .code:n = { \tl_clear:N \l_@@_round_tl }, - round-mode / places .code:n = - { \tl_set:Nn \l_@@_round_tl { places } }, - round-precision .int_set:N = \l_@@_process_precision_int, - scientific-notation .choice: , - scientific-notation - / false .code:n = - { - \bool_set_false:N \l_@@_process_fixed_bool - \bool_set_false:N \l_@@_process_engineering_bool - \bool_set_false:N \l_@@_process_scientific_bool - }, - scientific-notation - / engineering .code:n = - { - \bool_set_false:N \l_@@_process_fixed_bool - \bool_set_true:N \l_@@_process_engineering_bool - \bool_set_true:N \l_@@_process_scientific_bool - }, - scientific-notation - / fixed .code:n = - { - \bool_set_true:N \l_@@_process_fixed_bool - \bool_set_false:N \l_@@_process_engineering_bool - \bool_set_false:N \l_@@_process_scientific_bool - }, - scientific-notation - / true .code:n = - { - \bool_set_false:N \l_@@_process_fixed_bool - \bool_set_false:N \l_@@_process_engineering_bool - \bool_set_true:N \l_@@_process_scientific_bool - }, - zero-decimal-to-integer .bool_set:N = - \l_@@_zero_decimal_to_integer_bool - } -\keys_set:nn { siunitx } - { - add-decimal-zero = true, - add-integer-zero = true, - retain-unity-mantissa = true, - round-half = up, - round-minimum = 0, - round-precision = 2 - } +%</options> % \end{macrocode} -% \end{variable} % -% \begin{macro}{\@@_number_process:} -% Post-processing is a series of small tasks. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process: - { - \@@_number_process_sign: - \@@_number_process_zero_fill: - \@@_number_process_mantissa: - \prop_if_in:NnF \l_@@_number_in_prop { symbolic } - { - \bool_if:NTF \l_@@_process_fixed_bool - { \@@_number_process_fixed: } - { - \bool_if:NT \l_@@_process_scientific_bool - { \@@_number_process_scientific: } - } - \@@_number_process_exponent: - \@@_number_process_uncertainty: - \bool_if:NT \l_@@_exp_to_prefix_bool - { - \tl_if_empty:NF \l_@@_unit_tl - { \@@_number_exp_to_prefix: } - } - \prop_if_in:NnTF \l_@@_number_in_prop { uncertainty } - { - \bool_if:NT \l_@@_omit_uncert_bool - { - \prop_remove:Nn \l_@@_number_in_prop { uncertainty } - \prop_remove:Nn \l_@@_number_in_prop { mantissa-uncertainty } - } - } - { \@@_number_process_round: } - } - \@@_number_process_zero_to_integer: - \@@_number_process_integer_digits: - \bool_if:NT \l_@@_process_drop_exponent_bool - { - \prop_remove:Nn \l_@@_number_in_prop { exponent } - \prop_remove:Nn \l_@@_number_in_prop { exponent-integer } - } - } -% \end{macrocode} -% \end{macro} +% \subsection{User interfaces} % -%\begin{macro}{\@@_number_process_exponent:} -%\begin{macro}{\@@_number_process_exponent_aux:n} -% To check for a totally zero exponent, the possibility that one or more -% of the exponent storage areas is zero needs to be considered. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_exponent: { - \bool_if:NF \l_@@_process_zero_exponent_bool - { - \prop_if_in:NnT \l_@@_number_in_prop { exponent } - { - \bool_set_false:N \l_@@_tmp_bool - \@@_number_process_exponent_aux:n { integer } - \bool_if:NF \l_@@_tmp_bool - { \@@_number_process_exponent_aux:n { decimal } } - \bool_if:NF \l_@@_tmp_bool - { - \prop_remove:Nn \l_@@_number_in_prop { exponent } - \prop_remove:Nn \l_@@_number_in_prop - { exponent-integer } - \prop_remove:Nn \l_@@_number_in_prop - { exponent-decimal } - \prop_if_in:NnF \l_@@_number_in_prop { mantissa } - { - \prop_put:Nnn \l_@@_number_in_prop { mantissa } { true } - \prop_put:Nnn \l_@@_number_in_prop { mantissa-integer } { 1 } - } - } - } - } -} -\cs_new_protected:Npn \@@_number_process_exponent_aux:n #1 { - \prop_get:NnNT \l_@@_number_in_prop { exponent- #1 } - \l_@@_tmpa_tl - { - \int_compare:nNnF { \l_@@_tmpa_tl } = { 0 } - { \bool_set_true:N \l_@@_tmp_bool } - } -} +%<*interfaces> % \end{macrocode} -%\end{macro} -%\end{macro} % -% \begin{macro}{\@@_number_process_figures:n} -% \begin{macro} -% { -% \@@_number_process_figures_aux:n , -% \@@_number_process_figures_init:n -% } -% The approach here is to find how many digits there are in each part -% of the number, working out which are significant. The next stage is -% reconstruction of the number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_figures:n #1 - { - \int_compare:nNnTF \l_@@_process_precision_int > 0 - { - \prop_if_in:NnT \l_@@_number_in_prop {#1} - { \@@_number_process_figures_aux:n {#1} } - } - { - \prop_remove:Nn \l_@@_number_in_prop { #1 -sign } - \prop_put:Nnn \l_@@_number_in_prop { #1 -integer } { 0 } - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal } - \bool_if:NF \l_@@_process_int_to_dec_bool - { \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal-marker } } - } - } -\cs_new_protected:Npn \@@_number_process_figures_aux:n #1 - { - \@@_number_process_figures_init:n {#1} - \@@_number_process_figures_count:n { integer } - \@@_number_process_figures_count:n { decimal } - \bool_if:NTF \l_@@_round_bool - { - \bool_set_false:N \l_@@_round_bool - \int_compare:nNnTF - \l_@@_round_int > \l_@@_process_precision_int - { - \@@_number_process_figures_round: - \@@_number_process_round_tidy:n {#1} - } - { \@@_number_process_figures_pad:n {#1} } - } - { - \prop_put:Nnn \l_@@_number_in_prop { #1 -integer } { 0 } - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal } - } - } -\cs_new_protected:Npn \@@_number_process_figures_init:n #1 - { - \int_zero:N \l_@@_round_int - \bool_set_false:N \l_@@_round_bool - \bool_set_false:N \l_@@_round_even_bool - \prop_get:NnNF \l_@@_number_in_prop { #1 -decimal } - \l_@@_round_decimal_in_tl - { \tl_clear:N \l_@@_round_decimal_in_tl } - \prop_get:NnNF \l_@@_number_in_prop { #1 -integer } - \l_@@_round_integer_in_tl - { \tl_clear:N \l_@@_round_integer_in_tl } - \tl_clear:N \l_@@_round_decimal_out_tl - \tl_clear:N \l_@@_round_integer_out_tl - \tl_clear:N \l_@@_round_discard_tl - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \begin{macro}{\@@_number_process_figures_count:n} -% \begin{macro}{\@@_number_process_figures_count_aux:n} -% The counting code has to check that characters are actually -% significant. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_figures_count:n #1 - { - \tl_if_empty:cF { l_@@_round_ #1 _in_tl } - { - \prop_if_in:NnF \l_@@_number_in_prop { #1 -uncertainty } - { \@@_number_process_figures_count_aux:n {#1} } - } - } -\cs_new_protected:Npn \@@_number_process_figures_count_aux:n #1 - { - \int_set:Nn \l_@@_tmp_int - { \tl_head:v { l_@@_round_ #1 _in_tl } } - \tl_set:cx { l_@@_round_ #1 _in_tl } - { \tl_tail:v { l_@@_round_ #1 _in_tl } } - \tl_put_left:cV { l_@@_round_ #1 _out_tl } \l_@@_tmp_int - \bool_if:NF \l_@@_round_bool - { - \int_compare:nNnF \l_@@_tmp_int = 0 - { \bool_set_true:N \l_@@_round_bool } - } - \bool_if:NT \l_@@_round_bool - { \int_incr:N \l_@@_round_int } - \tl_if_empty:cTF { l_@@_round_ #1 _in_tl } - { - \tl_set_eq:cc { l_@@_round_ #1 _in_tl } - { l_@@_round_ #1 _out_tl } - \tl_clear:c { l_@@_round_ #1 _out_tl } - } - { \@@_number_process_figures_count_aux:n {#1} } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \begin{macro}{\@@_number_process_figures_round:} -% \begin{macro}{\@@_number_process_figures_round_loop:} -% The control macro for rounding to figures does the decimal part -% then the integer part as loops. There is then some tidying up if a -% digit is carried at the end. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_figures_round: - { - \int_set:Nn \l_@@_round_int - { \l_@@_round_int - \l_@@_process_precision_int } - \tl_if_empty:NF \l_@@_round_decimal_in_tl - { \@@_number_process_figures_round_loop: } - \tl_if_empty:NF \l_@@_round_integer_in_tl - { \@@_number_process_figures_integer: } - \bool_if:NT \l_@@_round_bool - { \tl_put_left:Nn \l_@@_round_integer_out_tl { 1 } } - } -\cs_new_protected:Npn \@@_number_process_figures_round_loop: - { - \@@_number_process_round_decimal: - \tl_if_empty:NF \l_@@_round_decimal_in_tl - { \@@_number_process_figures_round_loop: } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \begin{macro}{\@@_number_process_figures_integer:} -% For figures, the integer part is a little complicated as zeros need -% to be included. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_figures_integer: - { - \int_compare:nNnT \l_@@_round_int > 0 - { \tl_put_left:Nn \l_@@_round_integer_out_tl { 0 } } - \int_compare:nNnF \l_@@_round_int > 1 - { - \int_set:Nn \l_@@_tmp_int - { \tl_head:N \l_@@_round_integer_in_tl } - \@@_number_process_round_up: - \int_compare:nNnTF \l_@@_round_int = 1 - { - \int_compare:nNnT \l_@@_tmp_int > 4 - { \bool_set_true:N \l_@@_round_bool } - } - { - \int_compare:nNnT \l_@@_tmp_int = { 10 } - { - \bool_set_true:N \l_@@_round_bool - \int_zero:N \l_@@_tmp_int - } - \tl_put_left:NV \l_@@_round_integer_out_tl - \l_@@_tmp_int - } - } - \int_decr:N \l_@@_round_int - \tl_set:Nx \l_@@_round_integer_in_tl - { \tl_tail:N \l_@@_round_integer_in_tl } - \tl_if_empty:NF \l_@@_round_integer_in_tl - { \@@_number_process_figures_integer: } - } -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_process_figures_pad:n} -% If the number is too short, then the reversal is undone and the -% padding routine is called. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_figures_pad:n #1 { - \prop_get:NnN \l_@@_number_in_prop { #1 -integer } - \l_@@_round_integer_in_tl - \prop_get:NnN \l_@@_number_in_prop { #1 -decimal } - \l_@@_round_decimal_in_tl - \int_set:Nn \l_@@_round_int - { \l_@@_process_precision_int - \l_@@_round_int } - \@@_number_process_pad:n {#1} -} -% \end{macrocode} -%\end{macro} +% The user interfaces are defined in terms of documented code-level ones. +% This is all done here, and will appear in the \file{.sty} file before the +% relevant code. Things could be re-arranged by \pkg{DocStrip} but there is no +% advantage. % -%\begin{macro}{\@@_number_process_fixed:} -%\begin{macro}{ -% \@@_number_process_fixed_aux_i:nnn , -% \@@_number_process_fixed_aux_ii:nnn , -% \@@_number_process_fixed_aux_iii:nnn , -% \@@_number_process_fixed_large:nnn , -% \@@_number_process_fixed_large_aux:w , -% \@@_number_process_fixed_small:nnn , -% \@@_number_process_fixed_small_aux:w -%} -% When working to a fixed exponent value, the idea is to use the stack -% to do the work. First, there is some set up to do. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_fixed: { - \prop_if_in:NnF \l_@@_number_in_prop { complex } - { - \prop_get:NnNF \l_@@_number_in_prop { mantissa-integer } - \l_@@_tmpa_tl - { \tl_set:Nn \l_@@_tmpa_tl { 0 } } - \prop_get:NnNF \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \tl_set:Nx \l_@@_tmpa_tl - { { \l_@@_tmpa_tl } { \l_@@_tmpb_tl } } - \prop_get:NnNF \l_@@_number_in_prop { exponent-integer } - \l_@@_tmpb_tl - { \tl_set:Nn \l_@@_tmpb_tl { 0 } } - \group_begin: - \prop_get:NnNT \l_@@_number_in_prop { exponent-sign } - \l_@@_tmpa_tl - { - \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpa_tl - } - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmpb_tl \l_@@_tmpb_tl - \tl_set:Nx \l_@@_tmpa_tl - { \l_@@_tmpa_tl { \l_@@_tmpb_tl } } - \exp_after:wN \@@_number_process_fixed_aux_i:nnn - \l_@@_tmpa_tl - } -} -% \end{macrocode} -% The main loop checks to see which way to adjust the exponent then -% does the work. +% User level interfaces are all created by \pkg{xparse} % \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_fixed_aux_i:nnn #1#2#3 - { - \prop_put:Nnn \l_@@_number_in_prop { exponent } { true } - \int_compare:nNnTF \l_@@_process_fixed_int > 0 - { - \prop_put:NnV \l_@@_number_in_prop { exponent-integer } - \l_@@_process_fixed_int - \prop_remove:Nn \l_@@_number_in_prop { exponent-sign } - } - { - \prop_put:Nnx \l_@@_number_in_prop { exponent-integer } - { \int_eval:n { - \l_@@_process_fixed_int } } - \prop_put:Nnn \l_@@_number_in_prop { exponent-sign } { - } - } - \@@_number_process_fixed_aux_ii:nnn {#1} {#2} {#3} - } -\cs_new_protected:Npn \@@_number_process_fixed_aux_ii:nnn #1#2#3 - { - \bool_set_true:N \l_@@_tmp_bool - \tl_map_inline:nn {#1#2} - { - \str_if_eq:nnF {##1} { 0 } - { - \bool_set_false:N \l_@@_tmp_bool - \tl_map_break: - } - } - \bool_if:NF \l_@@_tmp_bool - { \@@_number_process_fixed_aux_iii:nnn {#1} {#2} {#3} } - } -\cs_new_protected:Npn - \@@_number_process_fixed_aux_iii:nnn #1#2#3 { - \int_compare:nNnTF {#3} > { \l_@@_process_fixed_int } - { \@@_number_process_fixed_large:nnn {#1} {#2} {#3} } - { - \int_compare:nNnTF {#3} < { \l_@@_process_fixed_int } - { \@@_number_process_fixed_small:nnn {#1} {#2} {#3} } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-integer } {#1} - \tl_if_empty:nTF {#2} - { - \prop_remove:Nn \l_@@_number_in_prop - { mantissa-decimal } - \prop_remove:Nn \l_@@_number_in_prop - { mantissa-decimal-marker } - } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal } {#2} - \prop_if_in:NnF \l_@@_number_in_prop - { mantissa-decimal-marker } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal-marker } { . } - } - } - } - } -} -% \end{macrocode} -% Simple stack-based manipulation of the input for number which are -% either too big or too small. There are a couple of checks needed to -% deal with cases where there is no decimal part and where there are -% leading zeros to dispose of. There is also a check to avoid adding -% an additional zero to the decimal part of the number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_fixed_large:nnn #1 - { - \@@_number_if_zero:nTF {#1} - { \@@_number_process_fixed_large_aux:nnn { } } - { \@@_number_process_fixed_large_aux:nnn {#1} } - } -\cs_new_protected:Npn \@@_number_process_fixed_large_aux:nnn #1#2#3 - { - \cs_set_protected:Npn - \@@_number_process_fixed_large_aux:w ##1##2 \q_stop - { - \tl_if_empty:nTF {##2} - { - \int_compare:nNnTF - { #3 - 1 } = { \l_@@_process_fixed_int } - { - \@@_number_process_fixed_aux_ii:nnn { #1 ##1 } - { } { #3 - 1 } - } - { - \@@_number_process_fixed_aux_ii:nnn { #1 ##1 } - { 0 } { #3 - 1 } - } - } - { - \@@_number_if_zero:nTF {#1} - { - \@@_number_process_fixed_aux_ii:nnn {##1} {##2} - { #3 - 1 } - } - { - \@@_number_process_fixed_aux_ii:nnn { #1 ##1 } - {##2} { #3 - 1 } - } - } - } - \tl_if_empty:nTF {#2} - { \@@_number_process_fixed_aux_ii:nnn { #1 0 } { } { #3 - 1 } } - { \@@_number_process_fixed_large_aux:w #2 \q_stop } -} -\cs_new_protected:Npn \@@_number_process_fixed_large_aux:w +\IfFormatAtLeastTF { 2020-10-01 } { } -\cs_new_protected:Npn - \@@_number_process_fixed_small:nnn #1#2#3 { - \cs_set_protected:Npn - \@@_number_process_fixed_small_aux:w ##1##2 \q_stop ##3 - { - \tl_if_empty:nTF {##2} - { - \tl_if_empty:nTF {##3} - { - \@@_number_process_fixed_aux_ii:nnn { 0 } - { ##1 #2 } { #3 + 1 } - } - { - \@@_number_process_fixed_aux_ii:nnn {##3} - { ##1 #2 } { #3 + 1 } - } - } - { - \@@_number_process_fixed_small_aux:w ##2 \q_stop - { ##3 ##1 } - } - } - \@@_number_process_fixed_small_aux:w #1 \q_stop { } -} -\cs_new_protected:Npn \@@_number_process_fixed_small_aux:w - { } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_process_integer_digits:} -% Producing extra digits for the integer part is a simple process -% once the target is known. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_integer_digits: { - \int_compare:nNnT \l_@@_process_integer_min_int > 0 - { - \prop_get:NnNT \l_@@_number_in_prop { mantissa-integer } - \l_@@_tmpa_tl - { - \int_set:Nn \l_@@_tmp_int - { - \l_@@_process_integer_min_int - - \tl_count:N \l_@@_tmpa_tl - } - \int_compare:nNnT \l_@@_tmp_int > 0 - { - \tl_set:Nx \l_@@_tmpa_tl - { - \prg_replicate:nn { \l_@@_tmp_int } { 0 } - \exp_not:V \l_@@_tmpa_tl - } - \prop_put:NnV \l_@@_number_in_prop - { mantissa-integer } \l_@@_tmpa_tl - } - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_process_mantissa:} -%\begin{macro}{\c_@@_unity_tl} -% A check for the mantissa consisting only of the token \texttt{1}, when -% an exponent is also available. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_mantissa: { - \bool_if:NF \l_@@_process_unity_mantissa_bool - { - \prop_if_in:NnT \l_@@_number_in_prop { exponent } - { - \prop_get:NnNT \l_@@_number_in_prop { mantissa-integer } - \l_@@_tmpa_tl - { - \tl_if_eq:NNT \c_@@_unity_tl \l_@@_tmpa_tl - { - \prop_if_in:NnF \l_@@_number_in_prop - { mantissa-decimal-marker } - { - \prop_remove:Nn \l_@@_number_in_prop - { mantissa } - \prop_remove:Nn \l_@@_number_in_prop - { mantissa-integer } - } - } - } - } - } -} -\tl_const:Nn \c_@@_unity_tl { 1 } + { \RequirePackage { xparse } } % \end{macrocode} -%\end{macro} -%\end{macro} % -%\begin{macro}{\@@_number_process_pad:n} -% For padding a number by adding zero to the end repeatedly. This can -% happen if the input was zero or if the number is too short. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_pad:n #1 { - \prop_get:NnNT \l_@@_number_in_prop { #1 -decimal } - \l_@@_tmpa_tl - { - \int_while_do:nNnn { \l_@@_round_int } > { 0 } - { - \tl_put_right:Nn \l_@@_tmpa_tl { 0 } - \int_decr:N \l_@@_round_int - } - \prop_put:NnV \l_@@_number_in_prop { #1 -decimal } - \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} +% \subsubsection{Preamble commands} % -% \begin{macro}{\@@_number_process_places:n} % \begin{macro} % { -% \@@_number_process_places_init:n , -% \@@_number_process_places_aux_i:n , -% \@@_number_process_places_aux_i:TF , -% \@@_number_process_places_none: , -% \@@_number_process_places_aux_ii:n , -% \@@_number_process_places_loop:n , -% \@@_number_process_places_integer:n -% } -% For rounding to a fixed number of places, a check is made to see if -% the decimal part is exactly zero. If it is, just create the -% appropriate number of zeros in the padding routine. Otherwise, do the -% real work. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places:n #1 - { - \prop_if_in:NnT \l_@@_number_in_prop {#1} - { - \prop_if_in:NnF \l_@@_number_in_prop { #1 -uncertainty } - { \@@_number_process_places_aux_i:n {#1} } - } - } -\cs_new_protected:Npn \@@_number_process_places_aux_i:n #1 - { - \int_compare:nNnTF \l_@@_process_precision_int = 0 - { \@@_number_process_places_none:n {#1} } - { - \prop_get:NnNT \l_@@_number_in_prop { #1 -decimal } - \l_@@_tmpa_tl - { - \tl_if_empty:NT \l_@@_tmpa_tl - { \tl_set:Nn \l_@@_tmpa_tl { 0 } } - \@@_number_process_places_aux_i:TF - { - \prop_put:Nnn \l_@@_number_in_prop { #1 -decimal } { } - \int_set:Nn \l_@@_round_int - { \l_@@_process_precision_int } - \@@_number_process_pad:n {#1} - } - { - \int_set:Nn \l_@@_round_int - { \tl_count:N \l_@@_tmpa_tl } - \@@_number_process_places_aux_ii:n {#1} - } - } - } - } -% \end{macrocode} -% The number of digits in the decimal part could be more that \TeX{} can -% handle, so a slow loop is used to see if we need to round. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_aux_i:TF - { - \bool_set_true:N \l_@@_tmp_bool - \tl_map_inline:Nn \l_@@_tmpa_tl - { - \int_compare:nNnF {##1} = 0 - { - \bool_set_false:N \l_@@_tmp_bool - \tl_map_break: - } - } - \bool_if:NTF \l_@@_tmp_bool - } -% \end{macrocode} -% Rounding to no places at all requires a few checks to see if there is any -% work to do. That includes a check for rounding half to even, where if -% the decimal part is exactly half then special action is required. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_none:n #1 - { - \prop_get:NnNT \l_@@_number_in_prop { #1 -decimal } \l_@@_tmpa_tl - { - \int_compare:nNnTF { \tl_head:N \l_@@_tmpa_tl } > 4 - { - \prop_get:NnNTF \l_@@_number_in_prop { #1 -integer } - \l_@@_tmpb_tl - { - \tl_set:Nx \l_@@_tmpb_tl - { \int_eval:n { \l_@@_tmpb_tl + 1 } } - \bool_if:NF \l_@@_round_half_up_bool - { - \bool_lazy_and:nnT - { - \int_compare_p:nNn - { 0 \tl_head:N \l_@@_tmpa_tl } = 5 - } - { - \int_compare_p:nNn - { 0 \tl_tail:N \l_@@_tmpa_tl } = 0 - } - { - \int_if_odd:nT \l_@@_tmpb_tl - { - \tl_set:Nx \l_@@_tmpb_tl - { \int_eval:n { \l_@@_tmpb_tl - 1 } } - } - } - } - } - { \tl_set:Nn \l_@@_tmpb_tl { 1 } } - \prop_put:NnV \l_@@_number_in_prop - { #1 -integer } \l_@@_tmpb_tl - } - { - \prop_if_in:NnF \l_@@_number_in_prop { #1 -integer } - { - \prop_put:Nnn \l_@@_number_in_prop - { #1 -integer } { 0 } - } - } - } - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal } - \bool_if:NF \l_@@_process_int_to_dec_bool - { \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal-marker } } - } -% \end{macrocode} -% For rounding to a fixed number of places, the package finds the -% difference in length between what is present and what is required. -% If the number is too short, there is some simple padding to do. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_aux_ii:n #1 - { - \int_sub:Nn \l_@@_round_int - { \l_@@_process_precision_int } - \int_compare:nNnTF \l_@@_round_int < 0 - { - \int_set:Nn \l_@@_round_int { - \l_@@_round_int } - \@@_number_process_pad:n {#1} - } - { - \@@_number_process_places_init:n {#1} - \@@_number_process_places_loop:n {#1} - \@@_number_process_round_tidy:n {#1} - } - } -% \end{macrocode} -% To keep the code a little clearer. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_init:n #1 - { - \prop_get:NnNF \l_@@_number_in_prop { #1 -integer } - \l_@@_round_integer_in_tl - { \tl_clear:N \l_@@_round_integer_in_tl } - \prop_get:NnN \l_@@_number_in_prop { #1 -decimal } - \l_@@_round_decimal_in_tl - \tl_reverse:N \l_@@_round_integer_in_tl - \tl_reverse:N \l_@@_round_decimal_in_tl - \tl_clear:N \l_@@_round_integer_out_tl - \tl_clear:N \l_@@_round_decimal_out_tl - \tl_clear:N \l_@@_round_discard_tl - \bool_set_false:N \l_@@_round_bool - \bool_set_false:N \l_@@_round_even_bool - } -% \end{macrocode} -% If there is a decimal, do the decimal processing then come back here. -% If there is an integer, do the same. Only if both are empty does the -% loop stop. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_loop:n #1 - { - \tl_if_empty:NTF \l_@@_round_decimal_in_tl - { - \tl_if_empty:NF \l_@@_round_integer_in_tl - { - \@@_number_process_places_integer:n {#1} - \@@_number_process_places_loop:n {#1} - } - \bool_if:NT \l_@@_round_bool - { - \tl_put_left:Nn \l_@@_round_integer_out_tl { 1 } - \bool_set_false:N \l_@@_round_bool - } - } - { - \@@_number_process_round_decimal: - \@@_number_process_places_loop:n {#1} - } - } -% \end{macrocode} -% Rounding for integers is just a case of carrying digits. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_places_integer:n #1 - { - \int_set:Nn \l_@@_tmp_int - { \tl_head:N \l_@@_round_integer_in_tl } - \tl_set:Nx \l_@@_round_integer_in_tl - { \tl_tail:N \l_@@_round_integer_in_tl } - \@@_number_process_round_up: - \bool_set_false:N \l_@@_round_bool - \int_compare:nNnT \l_@@_tmp_int = { 10 } - { - \int_zero:N \l_@@_tmp_int - \bool_set_true:N \l_@@_round_bool - } - \tl_put_left:NV \l_@@_round_integer_out_tl \l_@@_tmp_int - } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% \begin{macro}{\@@_number_process_round:} -% The lead-off for rounding is the same for decimal places and -% significant figures. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_round: - { - \tl_if_empty:NF \l_@@_round_tl - { - \bool_if:NT \l_@@_process_int_to_dec_bool - { - \prop_if_in:NnF \l_@@_number_in_prop { mantissa-decimal } - { - \prop_put:Nnn \l_@@_number_in_prop { mantissa-decimal } - { 0 } - } - \prop_if_in:NnF \l_@@_number_in_prop - { mantissa-decimal-marker } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal-marker } { . } - } - } - \clist_map_function:nc { mantissa , complex } - { @@_number_process_ \l_@@_round_tl :n } - } - } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\@@_number_process_round_decimal:} -% \begin{macro}{\@@_number_process_round_decimal_aux:} -% The rounding routine for decimals is the same for figures and places, -% so there is a generalised function here. Unfortunately, it is also -% complicated! +% \DeclareSIPower , +% \DeclareSIPrefix , +% \DeclareSIQualifier , +% \DeclareSIUnit +% } +% Pass data to the code layer. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_round_decimal: +\NewDocumentCommand \DeclareSIPower { +m +m m } { - \int_compare:nNnF \l_@@_round_int > 1 - { \@@_number_process_round_decimal_aux: } - \tl_put_right:Nx \l_@@_round_discard_tl - { \tl_head:N \l_@@_round_decimal_in_tl } - \tl_set:Nx \l_@@_round_decimal_in_tl - { \tl_tail:N \l_@@_round_decimal_in_tl } - \int_decr:N \l_@@_round_int + \siunitx_declare_power:NNn #1 #2 {#3} } -% \end{macrocode} -% The logic here has to deal with the (simpler) rounding up method and the -% case where there is a need to check for rounding to an even number. The -% later is only required when the discarded part is exactly equal to -% half of the least-significant digit. So there is a somewhat complex check -% for that, along with a somewhat simpler check when carrying out the -% rounding. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_round_decimal_aux: +\NewDocumentCommand \DeclareSIPrefix { +m m m } { - \int_set:Nn \l_@@_tmp_int - { \tl_head:N \l_@@_round_decimal_in_tl } - \@@_number_process_round_up: - \int_compare:nNnTF \l_@@_round_int = 1 - { - \int_compare:nNnT \l_@@_tmp_int > 4 - { - \bool_set_true:N \l_@@_round_bool - \bool_if:NF \l_@@_round_half_up_bool - { - \int_compare:nNnT - { \l_@@_round_discard_tl \int_use:N \l_@@_tmp_int } = 5 - { \bool_set_true:N \l_@@_round_even_bool } - } - } - } - { - \int_compare:nNnT \l_@@_tmp_int = { 10 } - { - \bool_set_true:N \l_@@_round_bool - \int_zero:N \l_@@_tmp_int - } - \tl_put_left:NV \l_@@_round_decimal_out_tl - \l_@@_tmp_int - } + \siunitx_declare_prefix:Nnn #1 {#2} {#3} } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \begin{macro}{\@@_number_process_round_up:} -% This is needed a few times, to round up the current digit unless -% it is even and \enquote{half to even} is active. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_round_up: +\NewDocumentCommand \DeclareSIQualifier { +m m } { - \bool_if:NT \l_@@_round_bool - { - \bool_if:NTF \l_@@_round_even_bool - { - \bool_set_false:N \l_@@_round_even_bool - \int_if_even:nF \l_@@_tmp_int - { \int_incr:N \l_@@_tmp_int } - } - { \int_incr:N \l_@@_tmp_int } - } - \bool_set_false:N \l_@@_round_bool + \siunitx_declare_qualifier:Nn #1 {#2} } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\@@_number_process_round_tidy:n} -% \begin{macro}{\@@_number_process_round_tidy_aux:w} -% To put data back again: there is a check to see if the number has been -% r ounded to zero and a minimal value has been requested. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_round_tidy:n #1 +\NewDocumentCommand \DeclareSIUnit { o +m m } { - \bool_lazy_and:nnTF - { \@@_number_if_zero_p:V \l_@@_round_integer_out_tl } - { \@@_number_if_zero_p:V \l_@@_round_decimal_out_tl } - { - \str_if_eq:VnTF \l_@@_process_round_min_tl { 0 } - { - \prop_put:Nnn \l_@@_number_in_prop { #1 -integer } { 0 } - \prop_put:NnV \l_@@_number_in_prop { #1 -decimal } - \l_@@_round_decimal_out_tl - } - { - \exp_after:wN \@@_number_process_round_tidy_aux:w - \l_@@_process_round_min_tl . . \q_stop {#1} - } - } - { - \prop_put:NnV \l_@@_number_in_prop { #1 -integer } - \l_@@_round_integer_out_tl - \tl_if_empty:NTF \l_@@_round_decimal_out_tl - { - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal } - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal-marker } - } - { - \prop_put:NnV \l_@@_number_in_prop { #1 -decimal } - \l_@@_round_decimal_out_tl - } - } - } -\cs_new_protected:Npn \@@_number_process_round_tidy_aux:w - #1 . #2 . #3 \q_stop #4 - { - \prop_put:Nnn \l_@@_number_in_prop { comparator } { < } - \prop_put:Nnn \l_@@_number_in_prop { #4 -integer } {#1} - \tl_if_empty:nTF {#2} - { \prop_remove:Nn \l_@@_number_in_prop { #4 -decimal } } - { \prop_put:Nnn \l_@@_number_in_prop { #4 -decimal } {#2} } + \IfNoValueTF {#1} + { \siunitx_declare_unit:Nn #2 {#3} } + { \siunitx_declare_unit:Nnn #2 {#3} {#1} } } % \end{macrocode} % \end{macro} -% \end{macro} % -%\begin{macro}{\@@_number_process_scientific:} -%\begin{macro}{ -% \@@_number_process_scientific_aux_i:nnn , -% \@@_number_process_scientific_aux_ii:nnn , -% \@@_number_process_scientific_large:nnn , -% \@@_number_process_scientific_large_loop:nNN , -% \@@_number_process_scientific_small:wn , -% \@@_number_process_scientific_store:nnn , -% \@@_number_process_scientific_engineering:nnn , -% \@@_number_process_scientific_engineering_0:nnn , -% \@@_number_process_scientific_engineering_1:nnn , -% \@@_number_process_scientific_engineering_1:nw , -% \@@_number_process_scientific_engineering_2:nnn , -% \@@_number_process_scientific_engineering_2_i:nw , -% \@@_number_process_scientific_engineering_2_ii:nw -%} -% Converting a number to scientific form is done such that the number -% of places involved is unchanged. The first step is to skip any -% complex-number containing input and to recover the stored data. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_scientific: { - \prop_if_in:NnF \l_@@_number_in_prop { complex } - { - \prop_get:NnNF \l_@@_number_in_prop { mantissa-integer } - \l_@@_tmpa_tl - { \tl_set:Nn \l_@@_tmpa_tl { 0 } } - \prop_get:NnNF \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \tl_set:Nx \l_@@_tmpa_tl - { { \l_@@_tmpa_tl } { \l_@@_tmpb_tl } } - \prop_get:NnNF \l_@@_number_in_prop { exponent-integer } - \l_@@_tmpb_tl - { \tl_set:Nn \l_@@_tmpb_tl { 0 } } - \group_begin: - \prop_get:NnNT \l_@@_number_in_prop { exponent-sign } - \l_@@_tmpa_tl - { \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpa_tl } - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmpb_tl \l_@@_tmpb_tl - \tl_set:Nx \l_@@_tmpa_tl - { \l_@@_tmpa_tl { \l_@@_tmpb_tl } } - \exp_after:wN \@@_number_process_scientific_aux_i:nnn - \l_@@_tmpa_tl - } -} -\cs_new_protected:Npn \@@_number_process_scientific_aux_i:nnn #1#2#3 - { - \bool_set_true:N \l_@@_tmp_bool - \tl_map_inline:nn {#1#2} - { - \str_if_eq:nnF {##1} { 0 } - { - \bool_set_false:N \l_@@_tmp_bool - \tl_map_break: - } - } - \bool_if:NF \l_@@_tmp_bool - { \@@_number_process_scientific_aux_ii:nnn {#1} {#2} {#3} } - } -% \end{macrocode} -% The code here works on a loop, standardising the mantissa into the -% range \( 1 \le x < 10 \). -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_scientific_aux_ii:nnn #1#2#3 { - \int_compare:nNnTF { \tl_count:n {#1} } > 1 - { \@@_number_process_scientific_large:nnn {#1} {#2} {#3} } - { - \@@_number_if_zero:nTF {#1} - { - \@@_number_process_scientific_small:wn - #2 \q_stop {#3} - } - { - \bool_if:NTF \l_@@_process_engineering_bool - { \@@_number_process_scientific_engineering:nnn } - { \@@_number_process_scientific_store:nnn } - {#1} {#2} {#3} - } - - } -} -% \end{macrocode} -% A faster approach here is to use integer maths to do the digit move, -% but that runs into problems with the range available for the input. -% Instead, we use a loop to find the last digit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_scientific_large:nnn #1#2#3 - { - \cs_set_protected:Npn \@@_number_process_scientific_large_loop:nNN - ##1##2##3 - { - \quark_if_recursion_tail_stop_do:Nn ##3 - { - \@@_number_process_scientific_aux_ii:nnn {##1} { ##2 #2 } - { #3 + 1 } - } - \@@_number_process_scientific_large_loop:nNN { ##1 ##2 } ##3 - } - \@@_number_process_scientific_large_loop:nNN { } #1 - \q_recursion_tail \q_recursion_stop - } -% \end{macrocode} -% For small numbers, the important digit is easy to find. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_scientific_small:wn #1#2 \q_stop #3 - { \@@_number_process_scientific_aux_ii:nnn {#1} {#2} { #3 - 1 } } -% \end{macrocode} -% A tidy-up and store routine. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_scientific_store:nnn #1#2#3 - { - \prop_put:Nnn \l_@@_number_in_prop { mantissa-integer } {#1} - \tl_if_empty:nTF {#2} - { - \prop_remove:Nn \l_@@_number_in_prop { mantissa-decimal } - \prop_remove:Nn \l_@@_number_in_prop - { mantissa-decimal-marker } - } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal } {#2} - \prop_if_in:NnF \l_@@_number_in_prop - { mantissa-decimal-marker } - { - \prop_put:Nnn \l_@@_number_in_prop - { mantissa-decimal-marker } { . } - } - } - \int_compare:nNnTF {#3} = { 0 } - { - \prop_remove:Nn \l_@@_number_in_prop { exponent } - \prop_remove:Nn \l_@@_number_in_prop { exponent-sign } - \prop_remove:Nn \l_@@_number_in_prop { exponent-integer } - } - { - \prop_put:Nnn \l_@@_number_in_prop { exponent } { true } - \int_compare:nNnTF {#3} > { 0 } - { - \int_set:Nn \l_@@_tmp_int {#3} - \prop_put:NnV \l_@@_number_in_prop - { exponent-integer } \l_@@_tmp_int - \prop_remove:Nn \l_@@_number_in_prop { exponent-sign } - } - { - \int_set:Nn \l_@@_tmp_int { 0 - (#3) } - \prop_put:NnV \l_@@_number_in_prop - { exponent-integer } \l_@@_tmp_int - \prop_put:Nnn \l_@@_number_in_prop { exponent-sign } - { - } - } - } - } -% \end{macrocode} -% For engineering style, the exponent has to be a power of three. -% The fastest way to do this is by expansion, as the number of tokens -% is known. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_scientific_engineering:nnn #1#2#3 - { - \use:c - { - @@_number_process_scientific_engineering_ - \int_compare:nNnTF {#3} < { 0 } - { - \int_case:nnF { \int_mod:nn { 0 - (#3) } { 3 } } - { - { 1 } { 2 } - { 2 } { 1 } - } - { 0 } - } - { \int_mod:nn {#3} { 3 } } - :nnn - } - {#1} {#2} {#3} - } -\cs_new_eq:cN - { @@_number_process_scientific_engineering_0:nnn } - \@@_number_process_scientific_store:nnn -\cs_new_protected:cpn - { @@_number_process_scientific_engineering_1:nnn } #1#2#3 - { - \tl_if_empty:nTF {#2} - { - \@@_number_process_scientific_store:nnn { #1 0 } { } - { #3 - 1 } - } - { - \use:c - { @@_number_process_scientific_engineering_1:nw } - {#1} #2 \q_stop {#3} - } - } -\cs_new_protected:cpn - { @@_number_process_scientific_engineering_1:nw } - #1#2#3 \q_stop #4 - { - \@@_number_process_scientific_store:nnn - {#1#2} {#3} { #4 - 1 } - } -\cs_new_protected:cpn - { @@_number_process_scientific_engineering_2:nnn } #1#2#3 - { - \tl_if_empty:nTF {#2} - { - \@@_number_process_scientific_store:nnn { #1 00 } { } - { #3 - 2 } - } - { - \use:c - { @@_number_process_scientific_engineering_2_i:nw } - {#1} #2 \q_stop {#3} - } - } -\cs_new_protected:cpn - { @@_number_process_scientific_engineering_2_i:nw } - #1#2#3 \q_stop #4 - { - \tl_if_empty:nTF {#3} - { - \@@_number_process_scientific_store:nnn { #1#2 0 } { } - { #4 - 2 } - } - { - \use:c - { @@_number_process_scientific_engineering_2_ii:nw } - {#1#2} #3 \q_stop {#4} - } - } -\cs_new_protected:cpn - { @@_number_process_scientific_engineering_2_ii:nw } - #1#2#3 \q_stop #4 - { - \@@_number_process_scientific_store:nnn { #1#2 } {#3} - { #4 - 2 } - } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_process_sign:} -%\begin{macro}{ -% \@@_number_process_sign_add:n , -% \@@_number_process_sign_plus:n -%} -%\begin{macro}{\c_@@_plus_tl} -% Sorting out signs consists of two parts: retaining a plus if necessary -% and adding an explicit sign. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_sign: { - \bool_if:NF \l_@@_process_plus_bool - { - \prop_if_in:NnTF \l_@@_number_in_prop { mantissa-sign } - { \@@_number_process_sign_plus:n { mantissa } } - { - \prop_if_in:NnT \l_@@_number_in_prop { complex-sign } - { - \prop_if_in:NnF \l_@@_number_in_prop { mantissa } - { \@@_number_process_sign_plus:n { complex } } - } - } - \prop_if_in:NnT \l_@@_number_in_prop { exponent-sign } - { \@@_number_process_sign_plus:n { exponent } } - } - \tl_if_empty:NF \l_@@_process_sign_tl - { - \@@_number_process_sign_add:n { mantissa } - \prop_if_in:NnTF \l_@@_number_in_prop { complex } - { \@@_number_process_sign_add:n { complex } } - } -} -% \end{macrocode} -% Adding a sign to an existing number needs a couple of to make sure -% there is a number to add to, and to see if there is a sign already. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_sign_add:n #1 { - \prop_if_in:NnF \l_@@_number_in_prop { #1 -sign } - { - \prop_if_in:NnF \l_@@_number_in_prop { #1 -had-sign } - { - \prop_get:NnN \l_@@_number_in_prop {#1} - \l_@@_tmpa_tl - \tl_if_empty:NTF \l_@@_tmpa_tl - { - \prop_put:NnV \l_@@_number_in_prop { sign } - \l_@@_process_sign_tl - } - { - \prop_put:NnV \l_@@_number_in_prop { #1 -sign } - \l_@@_process_sign_tl - } - } - } -} -% \end{macrocode} -% Holding onto a plus works very much in the same way as adding a sign: -% some quick tests and an assignment. Using a pre-defined token list is -% a speed-related choice: very slightly faster comparison. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_sign_plus:n #1 { - \prop_get:NnN \l_@@_number_in_prop { #1 -sign } - \l_@@_tmpa_tl - \tl_if_eq:NNT \c_@@_plus_tl \l_@@_tmpa_tl - { - \prop_remove:Nn \l_@@_number_in_prop { #1 -sign } - \prop_put:Nnn \l_@@_number_in_prop { #1 -had-sign } { true } - } -} -\tl_const:Nn \c_@@_plus_tl { + } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} +% \subsubsection{Document commands} % -%\begin{macro}{\@@_number_process_uncertainty:} -%\begin{macro}{\@@_number_process_uncertainty_aux:n} -% There may be a need to expand uncertainties into a decimal and integer -% part. This is done here so that the core \texttt{in} code is faster. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_uncertainty: { - \clist_map_function:nN { mantissa , complex } - \@@_number_process_uncertainty_aux:n -} -\cs_new_protected:Npn - \@@_number_process_uncertainty_aux:n #1 { - \prop_if_in:NnT \l_@@_number_in_prop { #1 -uncertainty } - { - \prop_if_in:NnTF \l_@@_number_in_prop { #1 -decimal-marker } - { \@@_number_process_uncertainty_decimal:n {#1} } - { \@@_number_process_uncertainty_integer:n {#1} } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\begin{macro}{\@@_number_process_uncertainty_decimal:n} -%\begin{macro}{\@@_number_process_uncertainty_count:nn} -% To deal with an error in the decimal part, care needs to be taken to -% correctly pad with zeros and also to allow for the possibility that -% the error crosses the decimal--integer boundary. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_uncertainty_decimal:n #1 { - \@@_number_process_uncertainty_count:nn {#1} { decimal } - \@@_number_process_uncertainty_count:nn {#1} { uncertainty } - \tl_clear:N \l_@@_uncertainty_decimal_tl - \tl_clear:N \l_@@_uncertainty_integer_tl - \int_compare:nNnTF - { \l_@@_process_uncertainty_int } > - { \l_@@_process_decimal_int } - { \@@_number_process_uncertainty_separate: } - { \@@_number_process_uncertainty_pad: } - \tl_if_empty:NF \l_@@_uncertainty_integer_tl - { - \prop_put:NnV \l_@@_number_in_prop - { #1 -uncertainty-integer } - \l_@@_uncertainty_integer_tl - } - \prop_put:NnV \l_@@_number_in_prop { #1 -uncertainty-decimal } - \l_@@_uncertainty_decimal_tl - \prop_get:NnN \l_@@_number_in_prop { #1 -decimal-marker } - \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_in_prop - { #1 -uncertainty-decimal-marker } \l_@@_tmpa_tl -} -\cs_new_protected:Npn - \@@_number_process_uncertainty_count:nn #1#2 { - \prop_get:NnN \l_@@_number_in_prop { #1 - #2 } - \l_@@_tmpa_tl - \int_set:cn { l_@@_process_ #2 _int } - { \tl_count:N \l_@@_tmpa_tl } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\begin{macro}{\@@_number_process_uncertainty_pad:} -% Uncertainty is short: add zeros. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_uncertainty_pad: { - \int_while_do:nNnn - { \l_@@_process_uncertainty_int } < - { \l_@@_process_decimal_int } - { - \tl_put_right:Nn \l_@@_uncertainty_decimal_tl {0} - \int_incr:N \l_@@_process_uncertainty_int - } - \tl_put_right:NV \l_@@_uncertainty_decimal_tl - \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_process_uncertainty_separate:} -%\begin{macro}{\@@_number_process_uncertainty_separate_aux:N} -% Find the integer--decimal boundary and work appropriately. +% \begin{macro}{\qty} % \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_uncertainty_separate: { - \tl_map_function:NN \l_@@_tmpa_tl - \@@_number_process_uncertainty_separate_aux:N -} -\cs_new_protected:Npn - \@@_number_process_uncertainty_separate_aux:N #1 { - \int_compare:nNnTF - { \l_@@_process_uncertainty_int } > - { \l_@@_process_decimal_int } - { \tl_put_right:Nn \l_@@_uncertainty_integer_tl {#1} } - { \tl_put_right:Nn \l_@@_uncertainty_decimal_tl {#1} } - \int_decr:N \l_@@_process_uncertainty_int -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\begin{macro}{\@@_number_process_uncertainty_integer:n} -% Relatively easy: the uncertainty is in the integer part of the number, -% and so there is no need to generate zeros. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_process_uncertainty_integer:n #1 { - \prop_get:NnN \l_@@_number_in_prop { #1 -uncertainty } - \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_in_prop { #1 -uncertainty-integer } - \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_process_zero_fill:} -%\begin{macro}{ -% \@@_number_process_zero_fill_aux:n , -% \@@_number_process_zero_fill_aux:nn -%} -% Checks for adding zeros to each component are carried out. The nesting -% here makes checking the appropriate flag a little more efficient. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_zero_fill: { - \@@_number_process_zero_fill_aux:n { integer } - \@@_number_process_zero_fill_aux:n { decimal } -} -\cs_new:Npn \@@_number_process_zero_fill_aux:n #1 { - \bool_if:cT { l_@@_process_ #1 _zero_bool } - { - \@@_number_process_zero_fill_aux:nn { mantissa } {#1} - \@@_number_process_zero_fill_aux:nn { complex } {#1} - \@@_number_process_zero_fill_aux:nn { exponent } {#1} - } -} -\cs_new_protected:Npn - \@@_number_process_zero_fill_aux:nn #1#2 { - \prop_if_in:NnT \l_@@_number_in_prop { #1 -decimal-marker } - { - \prop_if_in:NnF \l_@@_number_in_prop { #1 - #2 } - { \prop_put:Nnn \l_@@_number_in_prop { #1 - #2 } { 0 } } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% \begin{macro}{\@@_number_process_zero_to_integer:} -% \begin{macro}{\@@_number_process_zero_to_integer_aux:n} -% Look for a decimal part which is simply zero, and if found delete it. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_process_zero_to_integer: - { - \bool_if:NT \l_@@_zero_decimal_to_integer_bool - { - \@@_number_process_zero_to_integer_aux:n { mantissa } - \@@_number_process_zero_to_integer_aux:n { complex } - } - } -\cs_new_protected:Npn \@@_number_process_zero_to_integer_aux:n #1 +\@ifpackageloaded { physics } { - \prop_get:NnNT \l_@@_number_in_prop { #1 -decimal } \l_@@_tmpa_tl + \msg_new:nnn { siunitx } { physics-pkg } { - \bool_set_true:N \l_@@_tmp_bool - \tl_map_inline:Nn \l_@@_tmpa_tl - { - \str_if_eq:nnF {##1} { 0 } - { - \bool_set_false:N \l_@@_tmp_bool - \tl_map_break: - } - } - \bool_if:NT \l_@@_tmp_bool - { - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal } - \prop_remove:Nn \l_@@_number_in_prop { #1 -decimal-marker } - } + Detected~the~"physics"~package: \\ + Omitting~definition~of~\token_to_str:N \qty. } + \msg_warning:nn { siunitx } { physics-pkg } + \use_none:nnnn } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_number_exp_to_prefix:} -% This function is a bit awkward, as it essentially cuts across the -% unit processor. The idea here is first to recover the numerical exponent, -% and sign if there is one. The earlier formatting run will have reset the -% total number of units to zero, so that has to be recovered before -% doing the format a second time. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_exp_to_prefix: - { - \prop_set_eq:NN \l_@@_unit_prop \l_@@_unit_saved_prop - \prop_get:NnNT \l_@@_number_in_prop { exponent-integer } - \l_@@_tmpa_tl - { - \prop_get:NnNT \l_@@_number_in_prop { exponent-sign } - \l_@@_tmpb_tl - { \tl_put_left:NV \l_@@_tmpa_tl \l_@@_tmpb_tl } - \prop_if_in:NnT \l_@@_unit_prop { per-1 } - { - \tl_set:Nx \l_@@_tmpa_tl - { \int_eval:n { - \l_@@_tmpa_tl } } - } - \prop_get:NnNT \l_@@_unit_prop { prefix-1 } \l_@@_tmpb_tl - { - \prop_remove:Nn \l_@@_unit_prop { prefix-1 } - \prop_remove:Nn \l_@@_unit_prop { prefix-symbol-1 } - \prop_get:NVN \l_@@_prefix_forward_prop \l_@@_tmpb_tl - \l_@@_tmpb_tl - \tl_set:Nx \l_@@_tmpa_tl - { \int_eval:n { \l_@@_tmpa_tl + \l_@@_tmpb_tl } } - } - \prop_get:NnNT \l_@@_unit_prop { power-1 } \l_@@_tmpb_tl - { - \tl_set:Nx \l_@@_tmpa_tl - { \int_eval:n { \l_@@_tmpa_tl / \l_@@_tmpb_tl } } - } - \prop_get:NVNTF \l_@@_prefix_reverse_prop \l_@@_tmpa_tl - \l_@@_tmpb_tl - { - \prop_remove:Nn \l_@@_number_in_prop { exponent } - \use:c - { - @@_ \exp_after:wN \token_to_str:N \l_@@_tmpb_tl - _function:w - } - \prop_get:NnN \l_@@_unit_prop { total-units } \l_@@_tmpa_tl - \int_set:Nn \l_@@_unit_int \l_@@_tmpa_tl - \cs_set_eq:NN \@@_pm: \pm - \@@_unit_format: - \cs_set_eq:NN \pm \@@_pm: - } - { - \msg_error:nnx { siunitx } { non-convertible-exponent } - { \l_@@_tmpa_tl } - } - } - } -% \end{macrocode} -% \end{macro} -% -%\subsection{Formatting numbers for output} -% -% Getting numbers ready for printing requires the reconstruction of the -% number from the various parts processed earlier. Spaces and brackets -% are added back into the main numbers, as the various parts are also -% correctly formatted. The difference between the \texttt{in} and -% \texttt{out} store is that the later can include formatting such as -% hard spaces. -% -%\begin{macro}{\l_@@_number_out_prop} -% Like the \texttt{in} version! -% \begin{macrocode} -\prop_new:N \l_@@_number_out_prop -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_group_sep_tl , -% \l_@@_output_decimal_tl -%} -% A couple of variables are declared here, as they need a little more -% work than just storage. -% \begin{macrocode} -\tl_new:N \l_@@_group_sep_tl -\tl_new:N \l_@@_output_decimal_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_complex_after_bool} -% A setting for where complex numbers go. -% \begin{macrocode} -\bool_new:N \l_@@_complex_after_bool -% \end{macrocode} -%\end{macro} -% -% \begin{variable} -% {\l_@@_group_decimal_bool, \l_@@_group_integer_bool} -% Used for grouping digits. -% \begin{macrocode} -\bool_new:N \l_@@_group_decimal_bool -\bool_new:N \l_@@_group_integer_bool -% \end{macrocode} -% \end{variable} -% -%\begin{macro}{ -% \l_@@_negative_bracket_bool , -% \l_@@_brackets_bool , -% \l_@@_bracket_close_tl , -% \l_@@_output_complex_copy_bool , -% \l_@@_output_decimal_copy_bool , -% \l_@@_exponent_base_tl , -% \l_@@_exponent_product_tl , -% \l_@@_group_min_int , -% \l_@@_negative_color_tl , -% \l_@@_bracket_open_tl , -% \l_@@_output_uncert_close_tl , -% \l_@@_output_complex_tl , -% \l_@@_output_exponent_tl , -% \l_@@_output_uncert_open_tl , -% \l_@@_uncert_sep_bool , -% \l_@@_tight_bool , -% \l_@@_uncert_sep_tl -%} -% Lots of settings, some used only for numbers, some more widely. -% \begin{macrocode} -\keys_define:nn { siunitx } { - bracket-negative-numbers .bool_set:N = - \l_@@_negative_bracket_bool , - bracket-numbers .bool_set:N = \l_@@_brackets_bool, - close-bracket .tl_set:N = \l_@@_bracket_close_tl, - complex-root-position .choice:, - complex-root-position - / after-number .code:n = - { \bool_set_true:N \l_@@_complex_after_bool } , - complex-root-position - / before-number .code:n = - { \bool_set_false:N \l_@@_complex_after_bool } , - copy-complex-root .bool_set:N = - \l_@@_output_complex_copy_bool, - copy-decimal-marker .bool_set:N = - \l_@@_output_decimal_copy_bool, - exponent-base .tl_set:N = \l_@@_exponent_base_tl, - exponent-product .tl_set:N = - \l_@@_exponent_product_tl, - group-decimal-digits .meta:n = { group-digits = decimal }, - group-digits .choice: , - group-digits / - decimal .code:n = - { - \bool_set_true:N \l_@@_group_decimal_bool - \bool_set_false:N \l_@@_group_integer_bool - }, - group-digits / - false .code:n = - { - \bool_set_false:N \l_@@_group_decimal_bool - \bool_set_false:N \l_@@_group_integer_bool - }, - group-digits / - integer .code:n = - { - \bool_set_false:N \l_@@_group_decimal_bool - \bool_set_true:N \l_@@_group_integer_bool - }, - group-digits / - true .code:n = - { - \bool_set_true:N \l_@@_group_decimal_bool - \bool_set_true:N \l_@@_group_integer_bool - }, - group-digits .default:n = true , - group-four-digits .choice:, - group-four-digits / - false .meta:n = { group-minimum-digits = 5 }, - group-four-digits / - true .meta:n = { group-minimum-digits = 4 }, - group-four-digits .default:n = true, - group-integer-digits .meta:n = { group-digits = integer }, - group-minimum-digits .int_set:N = \l_@@_group_min_int, - group-separator .code:n = - { \tl_set:Nn \l_@@_group_sep_tl { {#1} } }, - negative-color .tl_set:N = \l_@@_negative_color_tl, - open-bracket .tl_set:N = \l_@@_bracket_open_tl, - output-close-uncertainty .tl_set:N = - \l_@@_output_uncert_close_tl, - output-complex-root .tl_set:N = \l_@@_output_complex_tl , - output-decimal-marker .code:n = - { \tl_set:Nn \l_@@_output_decimal_tl { {#1} } }, - output-exponent-marker .tl_set:N = \l_@@_output_exponent_tl, - output-open-uncertainty .tl_set:N = - \l_@@_output_uncert_open_tl, - separate-uncertainty .bool_set:N = \l_@@_uncert_sep_bool, - tight-spacing .bool_set:N = \l_@@_tight_bool, - uncertainty-separator .tl_set:N = \l_@@_uncert_sep_tl, -} -\keys_set:nn { siunitx } - { - bracket-numbers = true , % ( - close-bracket = ) , - complex-root-position = after-number , - copy-decimal-marker = false , - exponent-base = 10 , - exponent-product = \times , - group-digits = true , - group-minimum-digits = 5 , - group-separator = \, , - open-bracket = ( , % ) ( - output-close-uncertainty = ) , - output-complex-root = \ensuremath { \mathrm { i } } , - output-decimal-marker = . , - output-open-uncertainty = ( % ) - } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_format:} -% The master control function for formatting output: the usual set up. -% The number is put back together in stages. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format: { - \prop_if_empty:NF \l_@@_number_in_prop - { - \prop_clear:N \l_@@_number_out_prop - \@@_number_format_reassemble: - \@@_number_format_complex: - \@@_number_format_sign:n { mantissa } - \@@_number_format_sign:n { exponent } - \@@_number_format_relation: - \@@_number_format_color: - \@@_number_format_final: - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_format_brackets:n} -%\begin{macro}{\@@_number_format_brackets_aux:n} -% There are various points at which brackets might be added to -% avoid ambiguity. The function here adds the appropriate tokens -% around whatever is in the supplied named store. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_brackets:n #1 { - \bool_if:NT \l_@@_brackets_bool - { - \prop_if_in:NnT \l_@@_number_out_prop { #1 -bracket } - { - \@@_number_format_brackets_aux:n {#1} - \prop_remove:Nn \l_@@_number_out_prop { #1 -bracket } - } - } -} -\cs_new_protected:Npn \@@_number_format_brackets_aux:n #1 { - \prop_get:NnNF \l_@@_number_out_prop { #1 -result } - \l_@@_tmpa_tl - { - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - } - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_bracket_open_tl - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_bracket_close_tl - \str_if_eq:nnTF {#1} { result } - { \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpa_tl } - { - \prop_put:NnV \l_@@_number_out_prop { #1 -result } - \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_format_color:} -%\begin{macro}{\@@_number_format_color_aux:n} -% If the mantissa is negative, then any colour for output might change. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_color: { - \tl_if_empty:NF \l_@@_negative_color_tl - { - \@@_number_format_color_aux:n { mantissa-sign } - \@@_number_format_color_aux:n { sign } - } -} -\cs_new_protected:Npn \@@_number_format_color_aux:n #1 { - \prop_get:NnNT \l_@@_number_in_prop {#1} \l_@@_tmpa_tl - { - \str_if_eq:VnT \l_@@_tmpa_tl { - } - { - \prop_put:NnV \l_@@_number_out_prop { color } - \l_@@_negative_color_tl - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_format_complex:} -%\begin{macro}{ -% \@@_number_format_complex_aux:n , -% \@@_number_format_complex_aux: -%} -% The real and complex parts of each number are reassembled, with -% brackets if needed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_complex: { - \prop_if_in:NnT \l_@@_number_in_prop { complex-root } - { - \prop_if_in:NnTF \l_@@_number_out_prop { complex } - { - \@@_number_format_brackets:n { complex } - \@@_number_format_complex_aux:n { complex } - \@@_number_format_complex_aux:n { complex-result } - \prop_if_in:NnT \l_@@_number_out_prop - { complex-uncertainty } - { - \@@_number_format_complex_aux:n - { complex-uncertainty } - } - } - { - \prop_put:NnV \l_@@_number_out_prop { complex } - \l_@@_output_complex_tl - } - \@@_number_format_join_complex: - } -} -\cs_new_protected:Npn \@@_number_format_complex_aux:n #1 { - \bool_if:NTF \l_@@_output_complex_copy_bool - { - \prop_get:NnN \l_@@_number_in_prop { complex-root } - \l_@@_tmpa_tl - } - { \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_output_complex_tl } - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpb_tl - \bool_if:NTF \l_@@_complex_after_bool - { \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpa_tl } - { \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpa_tl } - \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpb_tl -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_format_copy:n , -% \@@_number_format_copy:nn -%} -% Just copy across. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_copy:n #1 { - \prop_get:NnN \l_@@_number_in_prop {#1} \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpa_tl -} -\cs_new_protected:Npn \@@_number_format_copy:nn #1#2 { - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop {#2} \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_format_final:} -% For numbers which do not contain an exponent, the mantissa result is -% simply copied to the final output position. On the other hand, for -% exponents there are further checks, which are handed off to dedicated -% functions. There is also a check for complex numbers with no real -% part, which needs to be \enquote{copied} to the standard result -% slot. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_final: { - \prop_if_in:NnT \l_@@_number_out_prop { complex } - { - \prop_if_in:NnF \l_@@_number_out_prop { mantissa-result } - { - \@@_number_format_copy:nn { complex } - { mantissa-result } - } - } - \prop_if_in:NnTF \l_@@_number_out_prop { exponent } - { - \@@_number_format_final_exponent: - \prop_if_in:NnTF \l_@@_number_out_prop { mantissa-result } - { \@@_number_format_final_combined: } - { \@@_number_format_final_exponent_only: } - } - { \@@_number_format_copy:nn { mantissa-result } { result } } - \prop_if_in:NnT \l_@@_number_out_prop { mantissa-bracket } - { - \prop_put:Nnn \l_@@_number_out_prop { result-bracket } - { true } - \prop_remove:Nn \l_@@_number_out_prop { mantissa-bracket } - } - \prop_if_in:NnT \l_@@_number_out_prop { comparator } - { - \@@_number_format_brackets:n { result } - \prop_get:NnN \l_@@_number_out_prop { comparator } - \l_@@_tmpa_tl - \prop_get:NnN \l_@@_number_out_prop { result } - \l_@@_tmpb_tl - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:N \mathord - \exp_not:V \l_@@_tmpa_tl - \exp_not:V \l_@@_tmpb_tl - } - \prop_put:NnV \l_@@_number_out_prop { result } - \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_format_final_combined:} -% When there is both a mantissa and an exponent, the mantissa is -% combined with the product sign before adding the exponent part on. -% The combined result is then stored. The marker -% \texttt{result-bracket-exponent} indicates that the number needs -% brackets due to the exponent part, but not in other cases. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_final_combined: { - \@@_number_format_brackets:n { mantissa } - \prop_get:NnN \l_@@_number_out_prop { mantissa-result } - \l_@@_tmpa_tl - \tl_if_empty:NT \l_@@_output_exponent_tl - { - \tl_put_right:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath - { - \bool_if:NTF \l_@@_tight_bool - { { \exp_not:V \l_@@_exponent_product_tl } } - { { } \exp_not:V \l_@@_exponent_product_tl { } } - } - } - } - \prop_get:NnN \l_@@_number_out_prop { exponent-result } - \l_@@_tmpb_tl - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop { result } - \l_@@_tmpa_tl - \prop_put:Nnn \l_@@_number_out_prop - { result-bracket-exponent } { true } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_format_final_exponent:} -% When there is an exponent, the base always needs to be added to the -% front of the number itself. The number must be superscripted, of -% course. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_final_exponent: { - \prop_get:NnN \l_@@_number_out_prop { exponent } - \l_@@_tmpa_tl - \tl_if_empty:NTF \l_@@_output_exponent_tl - { - \tl_set:Nx \l_@@_tmpa_tl - { ^ { \exp_not:V \l_@@_tmpa_tl } } - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_exponent_base_tl - } - { - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:V \l_@@_output_exponent_tl - \exp_not:N \mathord - \exp_not:V \l_@@_tmpa_tl - } - } - \prop_put:NnV \l_@@_number_out_prop { exponent-result } - \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_format_final_exponent_only:} -% When there is only an exponent, a check must be made for a -% sign in the mantissa part. If there is one, it is copied across. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_number_format_final_exponent_only: { - \prop_get:NnNT \l_@@_number_in_prop { mantissa-sign } - \l_@@_tmpa_tl - { - \prop_get:NnN \l_@@_number_out_prop { exponent-result } - \l_@@_tmpb_tl - \@@_tl_put_left_math:NV \l_@@_tmpb_tl - \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop { exponent-result } - \l_@@_tmpb_tl - } - \@@_number_format_copy:nn { exponent-result } { result } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_format_group:n} -%\begin{macro}{\@@_number_format_group_aux:nn} -% Grouping digits only happens if there are no symbols in the input, and -% of course if grouping has been requested. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_group:n #1 { - \@@_number_format_group_aux:nn {#1} { integer } - \@@_number_format_group_aux:nn {#1} { decimal } - \prop_if_in:NnTF \l_@@_number_out_prop { #1 -integer } - { \@@_number_format_copy:nn { #1 -integer } {#1} } - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNT \l_@@_number_in_prop { #1 -decimal-marker } - \l_@@_tmpb_tl - { - \bool_if:NTF \l_@@_output_decimal_copy_bool - { \tl_set:Nx \l_@@_tmpb_tl { { \l_@@_tmpb_tl } } } - { - \tl_set_eq:NN \l_@@_tmpb_tl - \l_@@_output_decimal_tl - } - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop { #1 -decimal-marker } - \l_@@_tmpb_tl - \prop_get:NnNF \l_@@_number_out_prop { #1 -decimal } - \l_@@_tmpb_tl - { \tl_clear:N \l_@@_tmpb_tl } - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - } -} -\cs_new_protected:Npn \@@_number_format_group_aux:nn #1#2 { - \prop_if_in:NnT \l_@@_number_in_prop { #1 - #2 } - { - \bool_if:cTF { l_@@_group_ #2 _bool } - { \@@_number_format_group:nn {#1} {#2} } - { \@@_number_format_copy:n { #1 - #2 } } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% \begin{macro}{\@@_number_format_group:nn} -% The idea here is that grouping is only needed for numbers with sufficient -% digits: this is done simply by counting up all of the digits. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_group:nn #1#2 + { } +\NewDocumentCommand \qty { O { } m > { \TrimSpaces } m } { - \prop_get:NnN \l_@@_number_in_prop { #1 - #2 } \l_@@_tmpa_tl - \int_compare:nNnTF - { \tl_count:N \l_@@_tmpa_tl } < \l_@@_group_min_int - { \@@_number_format_copy:n { #1 - #2 } } - { - \tl_clear:N \l_@@_tmpb_tl - \use:c { @@_number_format_group_ #2 : } - \prop_put:NnV \l_@@_number_out_prop { #1 - #2 } \l_@@_tmpb_tl - } + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#3} + \keys_set:nn { siunitx } {#1} + \siunitx_quantity:nn {#2} {#3} + \group_end: } % \end{macrocode} % \end{macro} -%\begin{macro}{\@@_number_format_group_decimal:} -%\begin{macro}{\@@_number_format_group_decimal_aux:} -% Using the \enquote{keep everything on the stack} approach, relatively -% simple recursion is needed. This trick is taken more or less directly -% from \pkg{numprint}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_group_decimal: { - \tl_if_empty:NF \l_@@_tmpa_tl - { - \exp_after:wN \@@_number_format_group_decimal_aux:NNNN - \l_@@_tmpa_tl { } { } { } - } -} -\cs_new_protected:Npn \@@_number_format_group_decimal_aux:NNNN - #1#2#3#4 { - \tl_if_empty:nTF {#2} - { \tl_put_right:Nn \l_@@_tmpb_tl {#1} } - { - \tl_if_empty:nTF {#3} - { \tl_put_right:Nn \l_@@_tmpb_tl { #1 #2 } } - { - \tl_put_right:Nn \l_@@_tmpb_tl { #1 #2 #3 } - \tl_if_empty:nF {#4} - { - \tl_put_right:NV \l_@@_tmpb_tl \l_@@_group_sep_tl - \@@_number_format_group_decimal_aux:NNNN #4 - } - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\begin{macro}{\@@_number_format_group_integer:} -%\begin{macro}{ -% \@@_number_format_group_integer_setup:n , -% \@@_number_format_group_integer_setup:V , -% \@@_number_format_group_integer_setup_aux:NNNN , -% \@@_number_format_group_integer_aux:NNNN -%} -% By keeping everything on the stack, recursion can occur quite -% efficiently here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_group_integer: { - \tl_if_empty:NF \l_@@_tmpa_tl - { - \@@_number_format_group_integer_setup:V \l_@@_tmpa_tl - } -} -\cs_new_protected:Npn \@@_number_format_group_integer_setup:n #1 { - \@@_number_format_group_integer_setup_aux:NNNN - { } #1 { } { } { } -} -\cs_generate_variant:Nn \@@_number_format_group_integer_setup:n - { V } -\cs_new_protected:Npn - \@@_number_format_group_integer_setup_aux:NNNN #1#2#3#4 { - \tl_if_empty:nTF {#2} - { \@@_number_format_group_integer_aux:NNNN #1 \q_nil } - { - \tl_if_empty:nTF {#3} - { - \@@_number_format_group_integer_aux:NNNN { } { } #1#2 - \q_nil - } - { - \tl_if_empty:nTF {#4} - { - \@@_number_format_group_integer_aux:NNNN { } #1#2#3 - \q_nil - } - { - \@@_number_format_group_integer_setup_aux:NNNN - {#1#2#3#4} - } - } - } -} -\cs_new_protected:Npn - \@@_number_format_group_integer_aux:NNNN #1#2#3#4 { - \tl_put_right:Nn \l_@@_tmpb_tl {#1#2#3} - \quark_if_nil:nF {#4} - { - \tl_put_right:NV \l_@@_tmpb_tl \l_@@_group_sep_tl - \@@_number_format_group_integer_aux:NNNN #4 - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_format_join_complex:} -% For adding the complex part to the main part of a number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_join_complex: { - \@@_number_format_sign_complex: - \prop_if_in:NnT \l_@@_number_out_prop { mantissa } - { - \@@_number_format_brackets:n { mantissa } - \prop_get:NnN \l_@@_number_out_prop { mantissa-result } - \l_@@_tmpa_tl - \prop_get:NnNF \l_@@_number_out_prop { complex-result } - \l_@@_tmpb_tl - { - \prop_get:NnN \l_@@_number_out_prop { complex } - \l_@@_tmpb_tl - } - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop { mantissa-result } - \l_@@_tmpa_tl - \prop_put:Nnn \l_@@_number_out_prop { mantissa-bracket } - { true } - } -} -% \end{macrocode} -%\end{macro} % -%\begin{macro}{ -% \@@_number_format_join_uncert: , -% \@@_number_format_join_uncert:n -%} -%\begin{macro}{\@@_number_format_join_uncert_pm:N} -% For adding separated uncertainties to the main part of a number. +% \begin{macro}{\ang, \num, \unit} +% All of a standard form: start a paragraph (if required), set local +% key values, do the formatting, print the result. % \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_join_uncert: { - \@@_number_format_join_uncert:n { mantissa } - \@@_number_format_join_uncert:n { complex } -} -\cs_new_protected:Npn \@@_number_format_join_uncert:n #1 { - \prop_get:NnNT \l_@@_number_out_prop {#1} - \l_@@_tmpa_tl - { - \prop_get:NnNTF \l_@@_number_out_prop { #1 -uncertainty } - \l_@@_tmpb_tl - { - \bool_if:NT \l_@@_uncert_sep_bool - { \@@_number_format_join_uncert_pm:N \l_@@_tmpb_tl } - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop { #1 -result } - \l_@@_tmpa_tl - \prop_put:Nnn \l_@@_number_out_prop { #1 -bracket } - { true } - } - { \@@_number_format_copy:nn {#1} { #1 -result } } - } -} -\cs_new_protected:Npn \@@_number_format_join_uncert_pm:N #1 +\NewDocumentCommand \ang { O { } > { \SplitArgument { 2 } { ; } } m } { - \bool_if:NTF \l_@@_tight_bool - { \tl_put_left:Nn #1 { \ensuremath { { \pm } } } } - { \tl_put_left:Nn #1 { \ensuremath { { } \pm { } } } } + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \@@_angle:nnn #2 + \group_end: } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_format_reassemble:} -% The integer, decimal and any non-separated uncertainty parts are -% put back together. This gives a \enquote{minimal} unit which cannot -% need any brackets or repeated units (if applicable). If the -% uncertainty is separate, it is stored at this stage pending later -% re-attachment. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_reassemble: { - \prop_if_in:NnT \l_@@_number_in_prop { mantissa } - { - \@@_number_format_group:n { mantissa } - \@@_number_format_uncertainty:n { mantissa } - } - \prop_if_in:NnT \l_@@_number_in_prop { complex } - { - \@@_number_format_group:n { complex } - \@@_number_format_uncertainty:n { complex } - } - \prop_if_in:NnT \l_@@_number_in_prop { exponent } - { \@@_number_format_group:n { exponent } } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_format_relation:} -% A simple check and copy operation for a relation: this will still need -% to be added to the result, of course. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_relation: { - \prop_get:NnNT \l_@@_number_in_prop { comparator } - \l_@@_tmpa_tl - { - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath - { \exp_not:V \l_@@_tmpa_tl } - } - \prop_put:NnV \l_@@_number_out_prop { comparator } - \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_format_sign:n , -% \@@_number_format_sign_complex: -%} -%\begin{macro}{ -% \@@_number_format_sign_aux:n , -% \@@_number_format_sign_negative_brackets:n , -% \@@_number_format_sign_complex:n -%} -% Some simple sign manipulation: for tight signs, a little shuffling. -% In the complex number case, there is a need for a correction to get -% the right formatting in text mode. For speed reasons, this is done in -% a separate function. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_sign:n #1 { - \prop_if_in:NnT \l_@@_number_out_prop {#1} - { - \prop_get:NnNT \l_@@_number_in_prop { #1 -sign } - \l_@@_tmpa_tl - { - \bool_if:NTF \l_@@_negative_bracket_bool - { - \str_if_eq:VnTF \l_@@_tmpa_tl { - } - { \@@_number_format_sign_negative_brackets:n {#1} } - { \@@_number_format_sign_aux:n {#1} } - } - { \@@_number_format_sign_aux:n {#1} } - } - } -} -\cs_new_protected:Npn \@@_number_format_sign_aux:n #1 { - \tl_clear:N \l_@@_tmpb_tl - \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop { #1 -sign } - \l_@@_tmpb_tl - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - \prop_get:NnNT \l_@@_number_out_prop { #1 -result } - \l_@@_tmpa_tl - { - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop { #1 -result } - \l_@@_tmpa_tl - } -} -\cs_new_protected:Npn - \@@_number_format_sign_negative_brackets:n #1 +\NewDocumentCommand \num { O { } m } { - \@@_number_format_brackets_aux:n {#1} - \prop_get:NnNT \l_@@_number_out_prop { #1 } - \l_@@_tmpa_tl - { - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_bracket_open_tl - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_bracket_close_tl - \prop_put:NnV \l_@@_number_out_prop { #1 } - \l_@@_tmpa_tl - } + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_number_format:nN {#2} \l_@@_tmp_tl + \siunitx_print_number:V \l_@@_tmp_tl + \group_end: } -\cs_new_protected:Npn \@@_number_format_sign_complex: { - \@@_number_format_sign_complex:n { complex } - \@@_number_format_sign_complex:n { complex-result } -} -\cs_new_protected:Npn \@@_number_format_sign_complex:n #1 { - \prop_if_in:NnT \l_@@_number_out_prop {#1} - { - \prop_get:NnNT \l_@@_number_in_prop { complex-sign } - \l_@@_tmpa_tl - { - \bool_if:NTF \l_@@_tight_bool - { - \tl_set:Nx \l_@@_tmpa_tl - { \exp_not:N \mathord \exp_not:V \l_@@_tmpa_tl } - } - { - \prop_if_in:NnT \l_@@_number_out_prop { mantissa } - { - \tl_set:Nx \l_@@_tmpa_tl - { { } \exp_not:V \l_@@_tmpa_tl { } } - } - } - \tl_clear:N \l_@@_tmpb_tl - \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop { complex-sign } - \l_@@_tmpb_tl - \prop_get:NnN \l_@@_number_out_prop {#1} - \l_@@_tmpa_tl - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \prop_put:NnV \l_@@_number_out_prop {#1} - \l_@@_tmpa_tl - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_format_uncertainty:n} -%\begin{macro}{ -% \@@_number_format_uncertainty_joined:n , -% \@@_number_format_uncertainty_sep:n -%} -% Uncertainty output varies depending on whether there is a need to -% separate the error form the number in the output. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_format_uncertainty:n #1 { - \prop_if_in:NnTF \l_@@_number_in_prop { #1 -uncertainty } - { - \bool_if:NTF \l_@@_uncert_sep_bool - { \@@_number_format_uncertainty_sep:n {#1} } - { \@@_number_format_uncertainty_joined:n {#1} } - \@@_number_format_join_uncert: - } - { \@@_number_format_copy:nn {#1} { #1 -result } } -} -\cs_new_protected:Npn - \@@_number_format_uncertainty_joined:n #1 { - \prop_get:NnN \l_@@_number_in_prop { #1 -uncertainty } - \l_@@_tmpa_tl - \prop_remove:Nn \l_@@_number_in_prop { #1 -uncertainty } - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_output_uncert_open_tl - \tl_put_left:NV \l_@@_tmpa_tl \l_@@_uncert_sep_tl - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_output_uncert_close_tl - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpb_tl - \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpa_tl - \prop_put:NnV \l_@@_number_out_prop {#1} \l_@@_tmpb_tl -} -\cs_new_protected:Npn - \@@_number_format_uncertainty_sep:n #1 { - \prop_if_in:NnT \l_@@_number_out_prop { #1 -integer } - { - \prop_if_in:NnF \l_@@_number_out_prop - { #1 -uncertainty-integer } - { - \prop_put:Nnn \l_@@_number_out_prop - { #1 -uncertainty-integer } { 0 } - } - } - \@@_number_format_group:n { #1 -uncertainty } - \prop_put:NnV \l_@@_number_out_prop { #1 -uncertainty } - \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Numerical output} -% -% The outer level of number processing for actually printing things. -% -%\begin{macro}{ -% \l_@@_number_out_tl , -% \l_@@_number_out_saved_tl -%} -% The final result, plus a version for loops. -% \begin{macrocode} -\tl_new:N \l_@@_number_out_tl -\tl_new:N \l_@@_number_out_saved_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_fraction_tl} -% Fractions need to be build separately, so that there is no problem -% with stack order. -% \begin{macrocode} -\tl_new:N \l_@@_number_fraction_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_compound_bool} -% To help with brackets. -% \begin{macrocode} -\bool_new:N \l_@@_number_compound_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_quotient_mode_tl} -% The action for quotients is stored as a token list variable. -% \begin{macrocode} -\tl_new:N \l_@@_quotient_mode_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_fraction:nn} -% The function used for fractions should be stored here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_fraction:nn { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_output_quotient_tl , -% \l_siunix_number_parse_bool -%} -% Some options related to numbers at the output stage. -% \begin{macrocode} -\keys_define:nn { siunitx } { - fraction-function .code:n = - { \cs_set_protected:Npn \@@_fraction:nn {#1} }, - output-product .tl_set:N = \l_@@_output_product_tl, - output-quotient .tl_set:N = \l_@@_output_quotient_tl, - parse-numbers .bool_set:N = \l_@@_number_parse_bool, - quotient-mode .choice:, - quotient-mode / fraction .code:n = - { \tl_set:Nn \l_@@_quotient_mode_tl { fraction } }, - quotient-mode / symbol .code:n = - { \tl_set:Nn \l_@@_quotient_mode_tl { symbol } }, -} -\keys_set:nn { siunitx } { - fraction-function = \frac , - output-product = \times , - output-quotient = / , - parse-numbers = true , - quotient-mode = symbol -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_output:n , -% \@@_number_output:V -%} -% The number output system simply sets up for the combined number and -% unit system. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output:n #1 { - \tl_clear:N \l_@@_unit_tl - \tl_clear:N \l_@@_preunit_tl - \@@_combined_output:n {#1} -} -\cs_generate_variant:Nn \@@_number_output:n { V } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_output_bracket:} -% Compound numbers may need brackets adding. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_bracket: { - \bool_if:NF \l_@@_error_bool - { - \bool_if:NT \l_@@_number_compound_bool - { \@@_number_format_brackets:n { result } } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_output_color:} -% If a colour needs to be set, it is recovered here and put into the -% appropriate place. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_color: { - \prop_if_in:NnT \l_@@_number_out_prop { color } - { - \prop_get:NnN \l_@@_number_out_prop { color } - \l_@@_number_color_tl - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_number_output_parse:n , -% \@@_number_output_parse:V -%} -%\begin{macro}{\@@_number_output_parse_aux:} -% The parsing system just has to check if there are multiple parts to -% worry about. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_parse:n #1 { - \@@_number_preprocess:n {#1} - \bool_if:NF \l_@@_error_bool - { - \tl_if_empty:NTF \l_@@_number_multi_tl - { \@@_number_output_parse_aux: } - { - \use:c - { @@_number_output_ \l_@@_number_multi_tl : } - } - } -} -\cs_generate_variant:Nn \@@_number_output_parse:n { V } -% \end{macrocode} -% There are a few additional tests for printing partwise, as this is -% only needed if there are brackets to add and these are not due to -% an exponent. The test for an exponent is needed as this must force -% the units to come at the end of the number, and there then have to -% be brackets in the output if there are any separate parts. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_parse_aux: { - \@@_number_in_parse:V \l_@@_number_arg_tl - \bool_if:NF \l_@@_error_bool - { - \@@_number_process: - \@@_number_format: - \@@_number_output_color: - \bool_if:NTF \l_@@_brackets_bool - { \@@_number_output_single: } - { - \prop_if_in:NnTF \l_@@_number_out_prop - { result-bracket } - { \@@_number_output_parts: } - { \@@_number_output_single: } - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_output_parts:} -%\begin{macro}{ -% \@@_number_output_parts_aux: , -% \@@_number_output_parts_aux:n , -% \@@_number_output_parts_print:n -%} -% Printing numbers by parts is necessary when there are units to -% repeat. That means doing things that have already been done by the -% number formatter again. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_parts: { - \bool_lazy_and:nnTF - { \tl_if_empty_p:N \l_@@_pre_unit_tl } - { \tl_if_empty_p:N \l_@@_unit_tl } - { \@@_number_output_single: } - { \@@_number_output_parts_aux: } -} -\cs_new_protected:Npn \@@_number_output_parts_aux: { - \bool_if:NTF \l_@@_multi_repeat_bool - { - \prop_if_in:NnT \l_@@_number_out_prop { mantissa-result } - { - \@@_number_output_parts_aux:n { mantissa } - \@@_number_output_parts_aux:n { complex } - } - \prop_get:NnNT \l_@@_number_out_prop { exponent-result } - \l_@@_tmpa_tl - { - \prop_if_in:NnT \l_@@_number_out_prop { mantissa-result } - { - \tl_put_left:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath - { - \bool_if:NTF \l_@@_tight_bool - { { \exp_not:V \l_@@_exponent_product_tl } } - { { } \exp_not:V \l_@@_exponent_product_tl { } } - } - } - \prop_put:NnV \l_@@_number_out_prop { exponent } - \l_@@_tmpa_tl - } - \@@_number_output_parts_print:n { exponent } - } - } - { \@@_number_output_single: } -} -\cs_new_protected:Npn \@@_number_output_parts_aux:n #1 { - \prop_if_in:NnT \l_@@_number_out_prop {#1} - { \@@_number_output_parts_print:n {#1} } - \prop_if_in:NnT \l_@@_number_out_prop { #1 -uncertainty } - { - \bool_if:NTF \l_@@_tight_bool - { \@@_print:nn { number } { \ensuremath { { \pm } } } } - { \@@_print:nn { number } { \ensuremath { { } \pm { } } } } - \@@_number_output_parts_print:n { #1 -uncertainty } - } -} -\cs_new_protected:Npn \@@_number_output_parts_print:n #1 { - \@@_unit_output_pre_print: - \prop_get:NnN \l_@@_number_out_prop {#1} \l_@@_tmpa_tl - \@@_print:nV { number } \l_@@_tmpa_tl - \@@_unit_output_print: -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_number_output_product:} -% For products, there may need to be the addition of brackets if there -% are units about. When not repeating units, some work has to be done to -% print everything correctly. The extra group here is necessary -% otherwise looping will delete the units entirely! -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_product: { - \bool_if:NTF \l_@@_product_brackets_bool - { - \bool_lazy_and:nnTF - { \tl_if_empty_p:N \l_@@_pre_unit_tl } - { \tl_if_empty_p:N \l_@@_unit_tl } - { \@@_number_output_product_aux: } - { \@@_number_output_product_brackets: } - } - { - \bool_if:NTF \l_@@_product_repeat_bool - { \@@_number_output_product_aux: } - { - \@@_unit_output_pre_print: - \tl_set_eq:NN \l_@@_unit_saved_tl \l_@@_unit_tl - \tl_clear:N \l_@@_pre_unit_tl - \tl_clear:N \l_@@_unit_tl - \group_begin: - \@@_number_output_product_aux: - \group_end: - \tl_set_eq:NN \l_@@_unit_tl \l_@@_unit_saved_tl - \@@_unit_output_print: - } - } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_output_product_brackets:} -% When printing products that have to be bracketed, there is a need to -% shuffle the units about a bit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_product_brackets: { - \@@_unit_output_pre_print: - \@@_print:nV { number } \l_@@_bracket_open_tl - \nobreak - \tl_set_eq:NN \l_@@_unit_saved_tl \l_@@_unit_tl - \tl_clear:N \l_@@_pre_unit_tl - \tl_clear:N \l_@@_unit_tl - \@@_number_output_product_aux: - \nobreak - \tl_set_eq:NN \l_@@_unit_tl \l_@@_unit_saved_tl - \@@_print:nV { number } \l_@@_bracket_close_tl - \@@_unit_output_print: -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_output_product_aux:} -% Printing the products needs a looping function. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_product_aux: { - \bool_set_true:N \l_@@_number_compound_bool - \@@_number_preprocess:V \l_@@_number_arg_tl - \bool_if:NF \l_@@_error_bool - { - \tl_if_empty:NTF \l_@@_number_multi_tl - { \@@_number_output_parse_aux: } - { \@@_number_output_quotient: } - \tl_if_empty:NF \l_@@_number_next_tl - { - \bool_if:NTF \l_@@_tight_bool - { - \@@_print:nn { number } - { \ensuremath { \l_@@_output_product_tl } } - } - { - \@@_print:nn { number } - { \ensuremath { { } \l_@@_output_product_tl { } } } - } - \@@_number_output_parse:V \l_@@_number_next_tl - } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_output_quotient:} -% For quotients, there are two options. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_quotient: { - \use:c - { @@_number_output_quotient_ \l_@@_quotient_mode_tl : } -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_output_quotient_fraction:} -% For fraction output, there are quite a lot of braces to construct, -% unfortunately. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_quotient_fraction: { - \bool_set_false:N \l_@@_number_compound_bool - \@@_number_output_quotient_aux_i: - \tl_set:Nx \l_@@_number_out_tl - { { \exp_not:V \l_@@_number_numerator_tl } } - \tl_set:Nx \l_@@_tmpa_tl - { { \exp_not:V \l_@@_number_denominator_tl } } - \tl_put_right:NV \l_@@_number_out_tl \l_@@_tmpa_tl - \tl_put_left:Nn \l_@@_number_out_tl { \@@_fraction:nn } - \tl_set:Nx \l_@@_number_out_tl - { - \exp_not:N \ensuremath - { \exp_not:V \l_@@_number_out_tl } - } - \@@_number_output_single_aux: -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_number_output_quotient_symbol:} -% If a symbol is used for the division, the build process is less -% complex. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_quotient_symbol: { - \bool_set_true:N \l_@@_number_compound_bool - \@@_number_output_quotient_aux_i: - \tl_set_eq:NN \l_@@_number_out_tl - \l_@@_number_numerator_tl - \tl_put_right:NV \l_@@_number_out_tl \l_@@_output_quotient_tl - \tl_put_right:NV \l_@@_number_out_tl - \l_@@_number_denominator_tl - \@@_number_output_single_aux: -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{ -% \@@_number_output_quotient_aux_i: , -% \@@_number_output_quotient_aux_ii: -%} -% The two parts of the number are parsed and formatted. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_quotient_aux_i: { - \@@_number_in_parse:V \l_@@_number_numerator_tl - \@@_number_output_quotient_aux_ii: - \@@_number_output_color: - \prop_if_in:NnT \l_@@_number_out_prop { complex } - { - \prop_if_in:NnT \l_@@_number_out_prop { mantissa } - { - \prop_put:Nnn \l_@@_number_out_prop - { result-bracket } { true } - \@@_number_format_brackets:n { result } - } - } - \prop_get:NnN \l_@@_number_out_prop { result } - \l_@@_number_numerator_tl - \@@_number_in_parse:V \l_@@_number_denominator_tl - \@@_number_output_quotient_aux_ii: - \prop_if_in:NnT \l_@@_number_out_prop - { result-bracket-exponent } - { - \prop_put:Nnn \l_@@_number_out_prop { result-bracket } - { true } - } - \@@_number_output_bracket: - \prop_get:NnN \l_@@_number_out_prop { result } - \l_@@_number_denominator_tl -} -\cs_new_protected:Npn \@@_number_output_quotient_aux_ii: { - \@@_number_process: - \@@_number_format: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_number_output_single:} -%\begin{macro}{\@@_number_output_single_aux:} -% Printing a number with no multiple parts is easy. There is a check for -% any units, which if present may force the number to have brackets -% added. there is then simply a short run to print the units and number. -% The test for bracketing numbers does not happen if there is an -% exponent: if there is, any other parts will already be bracketed and -% mathematically there is no need for brackets at this point. -% \begin{macrocode} -\cs_new_protected:Npn \@@_number_output_single: { - \bool_lazy_and:nnF - { \tl_if_empty_p:N \l_@@_pre_unit_tl } - { \tl_if_empty_p:N \l_@@_unit_tl } - { - \prop_if_in:NnF \l_@@_number_out_prop { exponent } - { \@@_number_format_brackets:n { result } } - } - \@@_number_output_bracket: - \prop_get:NnN \l_@@_number_out_prop { result } - \l_@@_number_out_tl - \@@_number_output_single_aux: -} -\cs_new_protected:Npn \@@_number_output_single_aux: { - \@@_unit_output_pre_print: - \quark_if_no_value:NTF \l_@@_number_out_tl - { \tl_clear:N \l_@@_number_unit_product_tl } - { \@@_print:nV { number } \l_@@_number_out_tl } - \@@_unit_output_print: -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Angles} -% -% Angles are a special case of numbers for two reasons. First, there -% is always a unit, which is known in advance. Second, there are two -% possible input syntaxes, "\ang{1.23}" and "\ang{1;2;3}". Both need -% to be handled correctly. -% -%\begin{macro}{ -% \l_@@_angle_degree_space_bool , -% \l_@@_angle_minute_space_bool -%} -% The need for spaces between parts of an arc needs to be accommodated: -% this is achieved by flagging up the need for such spaces using two -% switches. -% \begin{macrocode} -\bool_new:N \l_@@_angle_degree_space_bool -\bool_new:N \l_@@_angle_minute_space_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_angle_marker_box , -% \l_@@_angle_unit_box , -% \l_@@_angle_marker_dim , -% \l_@@_angle_unit_dim -%} -% When creating astronomy-style angles, the decimal marker and angle -% symbol have to be boxed up and measured. -% \begin{macrocode} -\box_new:N \l_@@_angle_marker_box -\box_new:N \l_@@_angle_unit_box -\dim_new:N \l_@@_angle_marker_dim -\dim_new:N \l_@@_angle_unit_dim -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_angle_degree_prop , -% \l_@@_angle_minute_prop , -% \l_@@_angle_second_prop -%} -% As there are potentially three numbers to parse, three properly lists -% are made available to hold the results. This allows the code to be -% generalised, with only the name of the storage area varying. -% \begin{macrocode} -\prop_new:N \l_@@_angle_degree_prop -\prop_new:N \l_@@_angle_minute_prop -\prop_new:N \l_@@_angle_second_prop -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_angle_degree_zero_bool , -% \l_@@_angle_minute_zero_bool , -% \l_@@_angle_second_zero_bool , -% \l_@@_angle_arc_separator_tl , -% \l_@@_angle_astronomy_bool , -% \l_@@_angle_unit_product_tl -%} -% The angle-specific options are created here. -% \begin{macrocode} -\keys_define:nn { siunitx } { - add-arc-degree-zero .bool_set:N = - \l_@@_angle_degree_zero_bool , - add-arc-minute-zero .bool_set:N = - \l_@@_angle_minute_zero_bool , - add-arc-second-zero .bool_set:N = - \l_@@_angle_second_zero_bool , - angle-symbol-over-decimal .bool_set:N = - \l_@@_angle_astronomy_bool , - arc-separator .tl_set:N = - \l_@@_angle_arc_separator_tl , - number-angle-product .tl_set:N = - \l_@@_angle_unit_product_tl , - number-angle-separator .tl_set:N = - \l_@@_angle_unit_product_tl , -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_angle_output:nnn} -%\begin{macro}{\@@_angle_output_aux:nnn} -% The input will have been split up by \pkg{xparse}, and so the various -% possible inputs can be picked up. To keep to a minimal route through -% the code, a decimal angle is simply treated like an arc, but with -% any zero-filling disabled. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_output:nnn #1#2#3 { - \@@_angle_init: - \IfNoValueTF {#2} - { - \bool_set_false:N \l_@@_angle_minute_zero_bool - \bool_set_false:N \l_@@_angle_second_zero_bool - \@@_angle_output_aux:nnn {#1} { } { } - } - { - \IfNoValueTF {#3} - { \@@_error:nx { invalid-arc-format } { #1 ; #2 } } - { \@@_angle_output_aux:nnn {#1} {#2} {#3} } - } -} -\cs_new_protected:Npn \@@_angle_output_aux:nnn #1#2#3 { - \tl_if_empty:nTF { #1#2#3 } - { \@@_error:n { empty-arc } } - { - \bool_if:NTF \l_@@_number_parse_bool - { \@@_angle_parse:nnn {#1} {#2} {#3} } - { \@@_angle_direct:nnn {#1} {#2} {#3} } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_angle_init:} -% The usual separation of initial storage resets. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_init: { - \bool_set_false:N \l_@@_angle_degree_space_bool - \bool_set_false:N \l_@@_angle_minute_space_bool - \prop_clear:N \l_@@_angle_degree_prop - \prop_clear:N \l_@@_angle_minute_prop - \prop_clear:N \l_@@_angle_second_prop - \tl_clear:N \l_@@_preunit_tl - \tl_set_eq:NN \l_@@_number_unit_product_tl - \l_@@_angle_unit_product_tl - \cs_set_eq:NN \@@_number_in_parse_more:N - \@@_number_in_parse_restricted:N -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_angle_direct:nnn} -%\begin{macro}{ -% \@@_angle_direct_aux_i:nnn , -% \@@_angle_direct_aux_ii:nnn , -% \@@_angle_direct_aux_iii:nnn -%} -% When printing an arc directly, there is still the need to fill in -% any zero values required and to check the spacing is correct. That -% is done using a chain approach, which is easy to implement and -% reasonably clear. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_direct:nnn #1 { - \tl_if_empty:nTF {#1} - { - \bool_if:NTF \l_@@_angle_degree_zero_bool - { \@@_angle_direct_aux_i:nnn { 0 } } - { \@@_angle_direct_aux_i:nnn { } } - } - { \@@_angle_direct_aux_i:nnn {#1} } -} -\cs_new_protected:Npn \@@_angle_direct_aux_i:nnn #1#2 { - \tl_if_empty:nTF {#2} - { - \bool_if:NTF \l_@@_angle_minute_zero_bool - { \@@_angle_direct_aux_ii:nnn {#1} { 0 } } - { \@@_angle_direct_aux_ii:nnn {#1} { } } - } - { \@@_angle_direct_aux_ii:nnn {#1} {#2} } -} -\cs_new_protected:Npn \@@_angle_direct_aux_ii:nnn #1#2#3 { - \tl_if_empty:nTF {#3} - { - \bool_if:NTF \l_@@_angle_second_zero_bool - { \@@_angle_direct_aux_iii:nnn {#1} {#2} { 0 } } - { \@@_angle_direct_aux_iii:nnn {#1} {#2} { } } - } - { \@@_angle_direct_aux_iii:nnn {#1} {#2} {#3} } -} -\cs_new_protected:Npn \@@_angle_direct_aux_iii:nnn #1#2#3 { - \tl_if_empty:nF {#1} - { - \tl_if_empty:nF {#2#3} - { \bool_set_true:N \l_@@_angle_degree_space_bool } - } - \tl_if_empty:nF {#2} - { - \tl_if_empty:nF {#3} - { \bool_set_true:N \l_@@_angle_minute_space_bool } - } - \@@_angle_print_direct:nnn {#1} {#2} {#3} -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{ -% \@@_angle_parse:nnn , -% \@@_angle_check_sign: , -% \@@_angle_zero_fill: , -% \@@_angle_sign_shuffle:nn -%} -%\begin{macro}{ -% \@@_angle_parse_aux:nnn , -% \@@_angle_check_sign:n , -% \@@_angle_sign_shuffle_aux:nnn -%} -% Parsing an arc requires a number of stages. First, there is the -% basic conversion of the input numbers into three property lists, -% which will contain the data required. There is then a zero-filling -% step, done here so that signs can be shuffled into the correct places. -% After that, a check to make sure there is only one sign for an arc -% before setting up the inter-part spacing and actually printing. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_parse:nnn #1#2#3 { - \@@_angle_parse_aux:nn {#1} { degree } - \@@_angle_parse_aux:nn {#2} { minute } - \@@_angle_parse_aux:nn {#3} { second } - \@@_angle_check_sign: - \@@_angle_zero_fill: - \prop_if_empty:NF \l_@@_angle_degree_prop - { - \prop_if_empty:NF \l_@@_angle_minute_prop - { \bool_set_true:N \l_@@_angle_degree_space_bool } - \prop_if_empty:NF \l_@@_angle_second_prop - { \bool_set_true:N \l_@@_angle_degree_space_bool } - } - \prop_if_empty:NF \l_@@_angle_minute_prop - { - \prop_if_empty:NF \l_@@_angle_second_prop - { \bool_set_true:N \l_@@_angle_minute_space_bool } - } - \@@_angle_print: -} -\cs_new_protected:Npn \@@_angle_parse_aux:nn #1#2 { - \prop_clear:N \l_@@_number_in_prop - \tl_if_empty:nF {#1} - { - \@@_number_in_init: - \@@_number_in_parse_aux:n {#1} - } - \prop_get:NnNT \l_@@_number_in_prop { mantissa-sign-deleted } - \l_@@_tmpa_tl - { - \prop_put:NnV \l_@@_number_in_prop { mantissa-sign } - \l_@@_tmpa_tl - } - \@@_number_process: - \prop_set_eq:cN { l_@@_angle_ #2 _prop } - \l_@@_number_in_prop -} -% \end{macrocode} -% Only the highest-order part of an arc can have a sign. This is checked -% now so that the shuffling code is easier to write. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_check_sign: { - \prop_if_empty:NTF \l_@@_angle_degree_prop - { - \prop_if_empty:NF \l_@@_angle_minute_prop - { \@@_angle_check_sign_aux:n { second } } - } - { - \@@_angle_check_sign_aux:n { minute } - \@@_angle_check_sign_aux:n { second } - } -} -\cs_new_protected:Npn \@@_angle_check_sign_aux:n #1 { - \prop_if_in:cnTF { l_@@_angle_ #1 _prop } - { mantissa-sign } - { \msg_error:nn { siunitx } { bad-arc-sign } } - { - \prop_if_in:cnT { l_@@_angle_ #1 _prop } - { mantissa-sign-deleted } - { \msg_error:nn { siunitx } { bad-arc-sign } } - } -} -% \end{macrocode} -% Filling in the zero values is rather awkward as there are signs -% to worry about. There is therefore a shuffle to move them into the -% correct places. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_zero_fill: { - \bool_lazy_and:nnT - { \l_@@_angle_second_zero_bool } - { \prop_if_empty_p:N \l_@@_angle_second_prop } - { - \prop_put:Nnn \l_@@_angle_second_prop { mantissa } - { true } - \prop_put:Nnn \l_@@_angle_second_prop { mantissa-integer } - { 0 } - } - \bool_lazy_and:nnT - { \l_@@_angle_minute_zero_bool } - { \prop_if_empty_p:N \l_@@_angle_minute_prop } - { - \prop_put:Nnn \l_@@_angle_minute_prop { mantissa } - { true } - \prop_put:Nnn \l_@@_angle_minute_prop { mantissa-integer } - { 0 } - \@@_angle_sign_shuffle:nn { second } { minute } - } - \bool_lazy_and:nnT - { \l_@@_angle_degree_zero_bool } - { \prop_if_empty_p:N \l_@@_angle_degree_prop } - { - \prop_put:Nnn \l_@@_angle_degree_prop { mantissa } - { true } - \prop_put:Nnn \l_@@_angle_degree_prop { mantissa-integer } - { 0 } - \@@_angle_sign_shuffle:nn { second } { degree } - \@@_angle_sign_shuffle:nn { minute } { degree } - } -} -\cs_new_protected:Npn \@@_angle_sign_shuffle:nn #1#2 { - \@@_angle_sign_shuffle_aux:nnn {#1} {#2} { } - \@@_angle_sign_shuffle_aux:nnn {#1} {#2} { -deleted } -} -\cs_new_protected:Npn \@@_angle_sign_shuffle_aux:nnn - #1#2#3 { - \prop_get:cnN { l_@@_angle_ #1 _prop } { mantissa-sign #3 } - \l_@@_tmpa_tl - \prop_remove:cn { l_@@_angle_ #1 _prop } { mantissa-sign #3 } - \quark_if_no_value:NF \l_@@_tmpa_tl - { - \prop_put:cnV { l_@@_angle_ #2 _prop } { mantissa-sign #3 } - \l_@@_tmpa_tl - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_angle_print:} -%\begin{macro}{\@@_angle_print:nn} -% The standard printing routine examines each part of the arc in turn -% and either does a standard format or calls the special astronomy-style -% routine. There may also be some spaces to add. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_print: { - \@@_angle_print_aux:nn { degree } { \SIUnitSymbolDegree } - \bool_if:NT \l_@@_angle_degree_space_bool - { - \nobreak - \l_@@_angle_arc_separator_tl - } - \@@_angle_print_aux:nn { minute } { \SIUnitSymbolArcminute } - \bool_if:NT \l_@@_angle_minute_space_bool - { - \nobreak - \l_@@_angle_arc_separator_tl - } - \@@_angle_print_aux:nn { second } { \SIUnitSymbolArcsecond } -} -\cs_new_protected:Npn \@@_angle_print_aux:nn #1#2 { - \prop_if_empty:cF { l_@@_angle_ #1 _prop } - { - \prop_set_eq:Nc \l_@@_number_in_prop - { l_@@_angle_ #1 _prop } - \tl_set:Nn \l_@@_unit_tl {#2} - \tl_clear:N \l_@@_number_out_tl - \@@_number_format: - \@@_number_output_color: - \bool_if:NTF \l_@@_angle_astronomy_bool - { \@@_angle_print_astronomy: } - { \@@_number_output_single: } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_angle_print_astronomy:} -%\begin{macro}{ -% \@@_angle_print_astronomy_aux: , -% \@@_angle_print_astronomy_aux:n , -% \@@_angle_print_astronomy_marker: , -% \@@_angle_print_astronomy_unit: -%} -% The first check for astronomy-style angles is that there is a decimal -% marker in the current input: if not, the standard method can be used. -% The method for the astronomy-style angle is not straight-forward, so -% needs a little explanation. The integer and decimal parts of the -% number are printed at each end of the function. In the middle is a -% method to centre the unit symbol on the decimal marker. This is done -% by typesetting the two symbols and measuring their respective widths. -% The two are then put into zero-width boxes, which allows them to be -% aligned horizontally centred with no vertical change. The larger -% dimension is then used to reconstruct the appropriate width for the -% final output. There is also a need to allow for the \cs{scriptspace} -% added in after superscripts, which otherwise messes up the -% calculation. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_print_astronomy: { - \prop_if_in:NnTF \l_@@_number_in_prop - { mantissa-decimal-marker } - { \@@_angle_print_astronomy_aux: } - { \@@_number_output_single: } -} -\cs_new_protected:Npn \@@_angle_print_astronomy_aux: { - \prop_get:NnNF \l_@@_number_out_prop { mantissa-sign } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNT \l_@@_number_out_prop { mantissa-integer } - \l_@@_tmpb_tl - { - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \@@_print:nV { number } \l_@@_tmpa_tl - } - \hbox_set:Nn \l_@@_angle_marker_box - { - \@@_print:nn { number } { { \l_@@_output_decimal_tl } } - } - \hbox_set:Nn \l_@@_angle_unit_box - { - \@@_print:nV { unit } \l_@@_unit_tl - \skip_horizontal:n { -\scriptspace } - } - \@@_angle_print_astronomy_aux:n { marker } - \@@_angle_print_astronomy_aux:n { unit } - \hbox_set:Nn \l_@@_angle_marker_box - { - \box_use:N \l_@@_angle_marker_box - \box_use:N \l_@@_angle_unit_box - } - \dim_compare:nNnTF - { \l_@@_angle_marker_dim } > { \l_@@_angle_unit_dim } - { \@@_angle_print_astronomy_marker: } - { \@@_angle_print_astronomy_unit: } - \prop_get:NnNT \l_@@_number_out_prop { mantissa-decimal } - \l_@@_tmpa_tl - { \@@_print:nV { number } \l_@@_tmpa_tl } -} -\cs_new_protected:Npn \@@_angle_print_astronomy_aux:n #1 { - \dim_set:cn { l_@@_angle_ #1 _dim } - { \box_wd:c { l_@@_angle_ #1 _box } } - \hbox_set_to_wd:cnn { l_@@_angle_ #1 _box } { \c_zero_skip } - { - \tex_hss:D - \hbox_unpack:c { l_@@_angle_ #1_box } - \tex_hss:D - } -} -\cs_new_protected:Npn \@@_angle_print_astronomy_marker: { - \hbox_set_to_wd:Nnn \l_@@_angle_marker_box - { \l_@@_angle_marker_dim } - { - \tex_hss:D - \hbox_unpack:N \l_@@_angle_marker_box - \tex_hss:D - } - \box_use:N \l_@@_angle_marker_box -} -\cs_new_protected:Npn \@@_angle_print_astronomy_unit: { - \hbox_set_to_wd:Nnn \l_@@_angle_marker_box - { \l_@@_angle_unit_dim } - { - \tex_hss:D - \hbox_unpack:N \l_@@_angle_marker_box - \tex_hss:D - } - \box_use:N \l_@@_angle_marker_box - \skip_horizontal:N \scriptspace -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_angle_print_direct:nnn} -%\begin{macro}{\@@_angle_print_direct_aux:nn} -% The direct printing routine is rather similar to the standard -% one, with just a modified final step. -% \begin{macrocode} -\cs_new_protected:Npn \@@_angle_print_direct:nnn #1#2#3 { - \@@_angle_print_direct_aux:nn {#1} { \SIUnitSymbolDegree } - \bool_if:NT \l_@@_angle_degree_space_bool - { - \nobreak - \l_@@_angle_arc_separator_tl - } - \@@_angle_print_direct_aux:nn {#2} { \SIUnitSymbolArcminute } - \bool_if:NT \l_@@_angle_minute_space_bool - { - \nobreak - \l_@@_angle_arc_separator_tl - } - \@@_angle_print_direct_aux:nn {#3} { \SIUnitSymbolArcsecond } -} -\cs_new_protected:Npn \@@_angle_print_direct_aux:nn #1#2 { - \tl_if_empty:nF {#1} - { - \tl_set:Nn \l_@@_unit_tl {#2} - \@@_print:nn { number } { \ensuremath {#1} } - \@@_unit_output_print: - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Creating unit macros} -% -% Unit macros and related support are created here. To avoid cluttering -% up the user name-space with a lot of short macro names, the standard -% method only makes these available inside the unit-processing functions -% (\cs{SI}, \cs{si} and the \texttt{S} column). -% -%\begin{macro}{\l_siunitx_unit_symbolic_seq} -% A list of all unit and related functions. -% \begin{macrocode} -\seq_new:N \l_siunitx_unit_symbolic_seq -\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \of } -\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \highlight } -\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \per } -\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \raiseto } -\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \tothe } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_declare_power_after:Nn , -% \@@_declare_power_before:Nn -%} -% Creating powers is all about storing values. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_power_after:Nn #1#2 { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} - \cs_set:cpn { @@_ \token_to_str:N #1 _literal:w } - { \@@_textsuperscript:n {#2} } - \cs_set:cpn { @@_ \token_to_str:N #1 _function:w } - { \@@_unit_parse_power_after:n {#2} } -} -\cs_new_protected:Npn \@@_declare_power_before:Nn #1#2 { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} - \cs_set:cpn { @@_ \token_to_str:N #1 _literal:w } ##1 - { ##1 \@@_textsuperscript:n {#2} } - \cs_set:cpn { @@_ \token_to_str:N #1 _function:w } - { \@@_unit_parse_power_before:n {#2} } -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_declare_prefix:Nnnn} -% \begin{variable} -% {\l_@@_prefix_forward_prop, \l_@@_prefix_reverse_prop} -% Prefixes need to store both the symbol and the power they represent. -% A reverse system is also set up, to allow powers to be converted to -% prefixes. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_prefix:Nnnn #1#2#3#4 +\NewDocumentCommand \unit { O { } > { \TrimSpaces } m } { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} - \prop_put:Nnn \l_@@_prefix_forward_prop {#1} {#4} - \prop_put:Nnn \l_@@_prefix_reverse_prop {#4} {#1} - \cs_set:cpn { @@_ \token_to_str:N #1 _literal:w } {#2} - \cs_set:cpn { @@_ \token_to_str:N #1 _function:w } - { - \bool_if:NTF \l_@@_prefix_symbols_bool - { \@@_unit_parse_prefix:Nn #1 {#2} } - { \@@_unit_parse_prefix:nn {#3} {#4} } - } + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#2} + \keys_set:nn { siunitx } {#1} + \siunitx_unit_format:nN {#2} \l_@@_tmp_tl + \siunitx_print_unit:V \l_@@_tmp_tl + \group_end: } -\prop_new:N \l_@@_prefix_forward_prop -\prop_new:N \l_@@_prefix_reverse_prop % \end{macrocode} -% \end{variable} % \end{macro} % -%\begin{macro}{\@@_declare_qualifier:Nn} -% Qualifiers just need storing. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_qualifier:Nn #1#2 { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} - \cs_set:cpn { @@_ \token_to_str:N #1 _literal:w } - { \text { ~ } ( #2 ) } - \cs_set:cpn { @@_ \token_to_str:N #1 _function:w } - { \@@_unit_parse_qualifier:n {#2} } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_declare_unit:Nnn} -%\begin{macro}{\@@_unit_first_token:n} -% Creating units requires various things to be stored. This is done -% with several storage bins to keep the code clear. For the -% \texttt{macro} definition, the test occurs at use so that there is no -% problem with the creation order for units. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_unit:Nnn #1#2#3 { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} - \cs_set:cpn { @@_ \token_to_str:N #1 _literal:w } {#2} - \cs_set_protected:cpn { @@_ \token_to_str:N #1 _function:w } - { - \@@_unit_if_literal:nTF {#2} - { \@@_unit_parse_unit:Nn #1 {#2} } - {#2} - } - \tl_if_empty:nTF {#3} - { \cs_undefine:c { l_@@_ \token_to_str:N #1 _options_tl } } - { - \tl_clear_new:c { l_@@_ \token_to_str:N #1 _options_tl } - \tl_set:cn { l_@@_ \token_to_str:N #1 _options_tl } {#3} - } -} -\cs_new_protected:Npn \@@_unit_first_token:n #1 { - \exp_last_unbraced:No \token_to_str:N { \tl_head:w #1 \q_stop } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\per} -% The \cs{per} function is pretty simple. -% \begin{macrocode} -\cs_new:cpn { @@_ \token_to_str:N \per _literal:w } { / } -\cs_new_protected:cpn { @@_ \token_to_str:N \per _function:w } { - \bool_set_true:N \l_@@_per_bool - \@@_unit_parse_per: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \raiseto , -% \tothe -%} -% Generic versions of the pre-set powers. -% \begin{macrocode} -\cs_new:cpn { @@_ \token_to_str:N \raiseto _literal:w } #1#2 { - #2 - \@@_textsuperscript:n {#1} -} -\cs_new_protected:cpn { @@_ \token_to_str:N \raiseto _function:w } - #1 { - \@@_unit_parse_power_before:n {#1} -} -\cs_new:cpn { @@_ \token_to_str:N \tothe _literal:w } #1 { - \@@_textsuperscript:n {#1} -} -\cs_new_protected:cpn { @@_ \token_to_str:N \tothe _function:w } - #1 { - \@@_unit_parse_power_after:n {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\of} -% A flexible qualifier as well. -% \begin{macrocode} -\cs_new:cpn { @@_ \token_to_str:N \of _literal:w } #1 { - \text { ~ } ( #1 ) -} -\cs_new_protected:cpn { @@_ \token_to_str:N \of _function:w } #1 { - \@@_unit_parse_qualifier:n {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\cancel} -%\begin{macro}{\@@_real_cancel:n} -%\begin{macro}{\@@_cancel:n} -% The \cs{cancel} macro is odd as it is only defined if the appropriate -% package is loaded. -% \begin{macrocode} -\AtBeginDocument { - \cs_if_exist:NT \cancel - { - \cs_set_protected:Npn \@@_cancel:n #1 - { \@@__real_cancel:n { \@@_print:nn { unit } {#1} } } - \cs_set_eq:NN \@@__real_cancel:n \cancel - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \cancel } - \cs_new_protected:cpn - { @@_ \token_to_str:N \cancel _function:w } - { \@@_unit_parse_special:n { \@@_cancel:n } } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\highlight} -% Another special function: selective colour. -% \begin{macrocode} -\cs_new:cpn - { @@_ \token_to_str:N \highlight _literal:w } #1 - { \@@_textcolor:n {#1} } -\cs_new_protected:cpn - { @@_ \token_to_str:N \highlight _function:w } #1 - { \@@_unit_parse_special:n { \@@_textcolor:n {#1} } } -% \end{macrocode} -%\end{macro} -% -%\subsection{Creating body unit macros} -% -% The user might have asked for the unit macros to be available in the -% document body. If so, then these are created at the start of the -% document body. -% -%\begin{macro}{ -% \l_@@_create_free_bool , -% \l_@@_create_overwrite_bool , -% \l_@@_create_prespace_bool , -% \l_@@_create_optional_bool , -% \l_@@_create_xspace_bool -%} -% There are a few options which control this behaviour: these are all -% preamble-only. -% \begin{macrocode} -\keys_define:nn { siunitx } { - free-standing-units .bool_set:N = \l_@@_create_free_bool , - overwrite-functions .bool_set:N = \l_@@_create_overwrite_bool, - space-before-unit .bool_set:N = \l_@@_create_prespace_bool , - unit-optional-argument .bool_set:N = \l_@@_create_optional_bool , - use-xspace .bool_set:N = \l_@@_create_xspace_bool , -} -\@@_option_deactivate:n { - free-standing-units , - overwrite-functions , - space-before-unit , - unit-optional-argument , - use-xspace , -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_create_empty_functions:} -%\begin{macro}{\@@_unit_create_empty_functions_aux:N} -% Without this, horrible things happen with \pkg{memoir} and -% \pkg{hyperref}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_create_empty_functions: - { - \@@_unit_create_functions_aux_i: - \seq_map_function:NN \l_siunitx_unit_symbolic_seq - \@@_unit_create_empty_functions_aux:N - \@@_unit_create_functions_aux_ii: - } -\cs_new_protected:Npn \@@_unit_create_empty_functions_aux:N #1 - { - \cs_if_free:NT #1 - { \cs_set_protected:Npn #1 { \ERROR } } - } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% \begin{macro}{\@@_unit_create_functions:} % \begin{macro} -% { -% \@@_unit_create_functions_aux_i:, -% \@@_unit_create_functions_aux_ii: -% } -% Creation of macros essentially involves picking up a couple of loops. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_create_functions: - { - \@@_unit_create_functions_aux_i: - \bool_if:NT \l_@@_create_overwrite_bool - { \seq_map_function:NN \l_siunitx_unit_symbolic_seq \cs_undefine:N } - \bool_if:NTF \l_@@_create_optional_bool - { - \seq_map_function:NN \l_siunitx_unit_symbolic_seq - \@@_unit_create_with_arg:N - } - { - \seq_map_function:NN \l_siunitx_unit_symbolic_seq - \@@_unit_create:N - } - \@@_unit_create_functions_aux_ii: - \bool_if:NT \l_@@_create_xspace_bool - { \RequirePackage { xspace } } - } -\cs_new_protected:Npn \@@_unit_create_functions_aux_i: - { - \@ifpackageloaded { soulpos } - { - \@ifpackageloaded { soul } - { } - { - \cs_set_protected:Npn \@@_unit_create_functions_aux_ii: - { - \cs_undefine:N \hl - \cs_undefine:N \ul - } - } - } - { } - } -\cs_new_protected:Npn \@@_unit_create_functions_aux_ii: { } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -%\begin{macro}{ -% \@@_unit_create:N , -% \@@_unit_create_with_arg:N -%} -% The creation functions expand everything as far as possible so that -% there is less to do in the document. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_create:N #1 { - \cs_if_free:NT #1 - { - \cs_set:Npx \@@_tmp:w - { - \ProvideDocumentCommand \exp_not:N #1 { } - { - \group_begin: - \exp_not:N \cs_if_free:NF - \exp_not:c - { l_@@_ \token_to_str:N #1 _options_tl } - { - \keys_set:nV { siunitx } - \exp_not:c - { l_@@_ \token_to_str:N #1 _options_tl } - } - \bool_if:NT \l_@@_create_prespace_bool - { \exp_not:N \l_@@_number_unit_product_tl } - \exp_not:n { \@@_unit_output:nn {#1} { } } - \group_end: - \bool_if:NT \l_@@_create_xspace_bool - { \exp_not:N \xspace } - } - } - \@@_tmp:w - } -} -\cs_new_protected:Npn \@@_unit_create_with_arg:N #1 { - \cs_if_free:NT #1 - { - \cs_set:Npx \@@_tmp:w - { - \ProvideDocumentCommand \exp_not:N #1 { o } - { - \group_begin: - \exp_not:N \cs_if_free:NF - \exp_not:c - { l_@@_ \token_to_str:N #1 _options_tl } - { - \keys_set:nV { siunitx } - \exp_not:c - { - l_@@_ \token_to_str:N #1 _options_tl - } - } - \exp_not:N \IfNoValueTF {####1} - { - \bool_if:NT \l_@@_create_prespace_bool - { \exp_not:N \l_@@_number_unit_product_tl } - \exp_not:n { \@@_unit_output:nn {#1} { } } - } - { \SI {####1} { \exp_not:N #1 } } - \group_end: - \bool_if:NT \l_@@_create_xspace_bool - { \exp_not:N \xspace } - } - } - \@@_tmp:w - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_protect_symbols:N} -% There are a few unit names which may be defined by other parts of -% \LaTeX. They need to be unexpandable, as in an \texttt{S} column -% \TeX{} will look for \cs{omit} \emph{before} starting the internal -% version of \cs{si} and doing a redefinition. The same is true -% for the \cs{color} function, which may well be the first thing in -% a table cell. The same is true for \cs{array@row@rst}, from REV\TeX, -% which otherwise gives an error. -% \begin{macrocode} -\AtBeginDocument { - \cs_if_eq:NNT \color \use_none:n - { \cs_set_protected:Npn \color #1 { } } - \cs_set:Npn \@@_tmp:w #1 { } - \cs_if_eq:NNT \color \@@_tmp:w - { \cs_set_protected:Npn \color #1 { } } - \tl_map_function:nN { \bar \color \ng \pm \array@row@rst } - \@@_protect_symbols:N -} -\@@_if_hooks:TF - { - \AddToHook { begindocument / end } [ siunitx ] - { \@@_protect_symbols:N \fg } - } - { - \tl_put_right:Nn \document - { - \@@_protect_symbols:N \fg - \ignorespaces - } - } -\cs_new_protected:Npn \@@_protect_symbols:N #1 { - \cs_if_exist:NT #1 - { - \tl_if_empty:fT { \cs_prefix_spec:N #1 } - { \cs_set_protected:Npx #1 { \exp_not:V #1 } } - } -} -% \end{macrocode} -%\end{macro} -% -%\subsection{Initial unit processing} -% -% The unit processor has to convert the input (which may be all macros -% or may contain literal input) into formatted text for output. The -% input part of the process is used to sort out parsed or literal units. -% -%\begin{macro}{ -% \l_@@_unit_forbid_literal_bool , -% \l_@@_unit_parse_bool -%} -% One option is related to how units are pre-processed. -% \begin{macrocode} -\keys_define:nn { siunitx } { - forbid-literal-units .bool_set:N = - \l_@@_unit_forbid_literal_bool, - parse-units .bool_set:N = \l_@@_unit_parse_bool -} -\keys_set:nn { siunitx } { - forbid-literal-units = false, - parse-units = true -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_unit_in:nn , -% \@@_unit_in:Vn , -% \@@_pm: -%} -% The master function does a very simple checks then hands off. -% The definition of \cs{pm} needs to be saved here so that it can -% safely be used as an abbreviation for picometre and also in numbers -% for \( \pm \). -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_in:nn #1#2 { - \bool_if:NTF \l_@@_unit_parse_bool - { - \tl_if_empty:nF {#1} - { - \@@_unit_if_literal:nTF {#1} - { - \tl_clear:N \l_@@_per_mode_tl - \bool_if:NTF \l_@@_unit_forbid_literal_bool - { - \msg_error:nnx { siunitx } { literal-unit } - { \exp_not:n {#1} } - } - { - \cs_set_eq:NN \@@_pm: \pm - \@@_unit_format_literal:n {#1} - \cs_set_eq:NN \pm \@@_pm: - } - } - { - \cs_set_eq:NN \@@_pm: \pm - \@@_unit_parse:nn {#1} {#2} - \@@_unit_format: - \prop_set_eq:NN \l_@@_unit_saved_prop \l_@@_unit_prop - \cs_set_eq:NN \pm \@@_pm: - } - } - } - { \@@_unit_format_literal:n {#1} } -} -\cs_generate_variant:Nn \@@_unit_in:nn { V } -\cs_new:Npn \@@_pm: { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_if_literal:nTF} -%\begin{macro}{\@@_unit_if_literal_aux:N} -% A test is needed to see if the input only contains unit macros. This -% is done by altering setting all of the unit macros to expand to -% nothing at all. Thus there will only be anything left if there is -% a literal in the unit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_if_literal:nTF #1#2#3 { - \group_begin: - \seq_map_function:NN \l_siunitx_unit_symbolic_seq - \@@_unit_if_literal_aux:N - \cs_set_eq:NN \of \use_none:n - \cs_set_eq:NN \highlight \use_none:n - \cs_set_eq:NN \raiseto \use_none:n - \cs_set_eq:NN \tothe \use_none:n - \protected@edef \l_@@_tmpa_tl {#1} - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmpa_tl \l_@@_tmpa_tl - \tl_if_blank:VTF \l_@@_tmpa_tl {#3} {#2} -} -\cs_new_protected:Npn \@@_unit_if_literal_aux:N #1 { - \cs_set_eq:NN #1 \prg_do_nothing: -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Parsing macro units} -% -% For macro-based units, the macros are converted into literal text, -% which is then passed on for printing. The code reads through the -% input to collect up the units, before re-combining everything into -% a single block at the end of the process. -% -% \begin{variable} -% { -% \l_@@_unit_int , -% \l_@@_unit_prop , -% \l_@@_unit_saved_prop -% } -% Parsed units are stored in a property list, to keep things compact. -% An integer is also needed to count up units. -% \begin{macrocode} -\int_new:N \l_@@_unit_int -\prop_new:N \l_@@_unit_prop -\prop_new:N \l_@@_unit_saved_prop -% \end{macrocode} -% \end{variable} -% -%\begin{macro}{\l_@@_per_bool} -% To allow \cs{per} to be \enquote{sticky}. -% \begin{macrocode} -\bool_new:N \l_@@_per_bool -% \end{macrocode} -%\end{macro} -% -% \begin{variable} -% { -% \l_@@_exp_to_prefix_bool , -% \l_@@_prefix_symbols_bool , -% \l_@@_sticky_per_bool -% } -% Some options are directly related to how units are handled at this -% stage, so need be created before the reconstruction part of the code. +% {\qtylist, \numlist, \qtyproduct, \numproduct, \qtyrange, \numproduct} +% Interfaces for compound values. % \begin{macrocode} -\keys_define:nn { siunitx } +\NewDocumentCommand \qtylist + { O { } > { \SplitList { ; } } m > { \TrimSpaces } m } { - exponent-to-prefix .bool_set:N = \l_@@_exp_to_prefix_bool , - prefixes-as-symbols .bool_set:N = \l_@@_prefix_symbols_bool , - sticky-per .bool_set:N = \l_@@_sticky_per_bool + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#3} + \keys_set:nn { siunitx } {#1} + \siunitx_quantity_list:nn {#2} {#3} + \group_end: } -\keys_set:nn { siunitx } { prefixes-as-symbols = true } -% \end{macrocode} -% \end{variable} -% -%\begin{macro}{\@@_unit_parse:nn} -% The unit to be parsed is received here along with any options given. -% The later are needed so that the user can override any saved options -% on a one-off basis. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse:nn #1#2 { - \@@_unit_parse_init: - \@@_unit_parse_options:nn {#1} {#2} - #1 -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_unit_parse_init:} -% As always, the initialisation is a separate routine to make life a -% little clearer. The definition of \cs{pm} is saved here as it -% is used by units and numbers. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_init: +\NewDocumentCommand \numlist { O { } > { \SplitList { ; } } m } { - \prop_clear:N \l_@@_unit_prop - \int_zero:N \l_@@_unit_int - \bool_set_false:N \l_@@_per_bool - \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq - { \cs_set_eq:Nc ##1 { @@_ \token_to_str:N ##1 _function:w } } - } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_parse_options:n} -% Any unit-specific options are loaded, followed by re-applying any -% options given for this particular macro. The second call to -% \cs{keys_set:nn} is needed to allow the local overriding of settings. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_options:nn #1#2 { - \tl_if_single:nT {#1} - { - \cs_if_free:cF - { l_@@_ \@@_unit_first_token:n {#1} _options_tl } - { - \keys_set:nv { siunitx } - { l_@@_ \@@_unit_first_token:n {#1} _options_tl } - \keys_set:nn { siunitx } {#2} - } + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_number_list:nn {#2} + \group_end: } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_unit_parse_power_before:n , -% \@@_unit_parse_power_after:n -%} -% Storing powers depends on whether they are given before or after -% the unit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_power_before:n #1 { - \tl_set:Nx \l_@@_tmpa_tl - { power- \int_eval:n { \l_@@_unit_int + 1 } } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} -} -\cs_new_protected:Npn \@@_unit_parse_power_after:n #1 { - \tl_set:Nx \l_@@_tmpa_tl - { power- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \@@_unit_parse_prefix:Nn , -% \@@_unit_parse_prefix:nn -%} -% Saving prefixes always increments the counter. For non-symbolic -% mode, the base needs to be saved along with the power. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_prefix:Nn #1#2 +\NewDocumentCommand \qtyproduct + { O { } > { \SplitList { x } } m > { \TrimSpaces } m } { - \int_incr:N \l_@@_unit_int - \tl_set:Nx \l_@@_tmpa_tl - { prefix- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} - \tl_set:Nx \l_@@_tmpa_tl - { prefix-symbol- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#2} + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#3} + \keys_set:nn { siunitx } {#1} + \siunitx_quantity_product:nn {#2} {#3} + \group_end: } -\cs_new_protected:Npn \@@_unit_parse_prefix:nn #1#2 +\NewDocumentCommand \numproduct + { O { } > { \SplitList { x } } > { \TrimSpaces } m } { - \@@_unit_parse_prefix:Nn \ERROR {#2} - \tl_set:Nx \l_@@_tmpa_tl - { prefix-base- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_number_product:n {#2} + \group_end: } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_parse_per:} -% The \cs{per} function always applies to the next unit seen, so -% the counter has to be advanced by one. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_per: { - \tl_set:Nx \l_@@_tmpa_tl - { per- \int_eval:n { \l_@@_unit_int + 1 } } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl { true } - \bool_if:NT \l_@@_sticky_per_bool - { \cs_set_eq:NN \per \@@_unit_parse_per_error: } -} -\cs_new_protected:Npn \@@_unit_parse_per_error: { - \msg_error:nn { siunitx } { duplicate-sticky-per } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_parse_qualifier:n} -% Qualifiers never alter the number of units. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_qualifier:n #1 { - \tl_set:Nx \l_@@_tmpa_tl - { symbol- \int_use:N \l_@@_unit_int } - \prop_if_in:NVF \l_@@_unit_prop \l_@@_tmpa_tl - { \msg_error:nn { siunitx } { qualifier-before-unit } } - \tl_set:Nx \l_@@_tmpa_tl - { qualifier- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_parse_special:n} -% Special effects are possible by adding code to the unit property -% list here: this is pretty much arbitrary, so there is no real -% processing done. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_special:n #1 { - \tl_set:Nx \l_@@_tmpa_tl - { special- \int_eval:n { \l_@@_unit_int + 1 } } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_parse_unit:Nn} -%\begin{macro}{\@@_unit_parse_unit_per:} -% For units, there is a check in case a prefix is present (which will -% have incremented the counter). With the counter correct, simply add -% the literal to the property list. There is also a check to see if -% there is a \enquote{sticky} \cs{per} to think about. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_parse_unit:Nn #1#2 { - \tl_set:Nx \l_@@_tmpa_tl - { prefix-symbol- \int_use:N \l_@@_unit_int } - \prop_if_in:NVTF \l_@@_unit_prop \l_@@_tmpa_tl - { - \tl_set:Nx \l_@@_tmpa_tl - { symbol- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpa_tl - { \int_incr:N \l_@@_unit_int } - } - { \int_incr:N \l_@@_unit_int } - \tl_set:Nx \l_@@_tmpa_tl - { unit- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#1} - \tl_set:Nx \l_@@_tmpa_tl - { symbol- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl {#2} - \@@_unit_parse_unit_per: -} -\cs_new_protected:Npn \@@_unit_parse_unit_per: { - \bool_if:NT \l_@@_sticky_per_bool - { - \bool_if:NT \l_@@_per_bool - { - \tl_set:Nx \l_@@_tmpa_tl - { per- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl - { true } - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Unit formatting} -% -%\begin{macro}{ -% \l_@@_preunit_tl , -% \l_@@_unit_tl , -% \l_@@_unit_current_tl , -% \l_@@_unit_denominator_tl , -% \l_@@_unit_numerator_tl , -% \l_@@_unit_saved_tl -%} -% Storage space for creating unit output. -% \begin{macrocode} -\tl_new:N \l_@@_preunit_tl -\tl_new:N \l_@@_unit_tl -\tl_new:N \l_@@_unit_current_tl -\tl_new:N \l_@@_unit_denominator_tl -\tl_new:N \l_@@_unit_numerator_tl -\tl_new:N \l_@@_unit_saved_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_unit_denominator_int , -% \l_@@_unit_numerator_int -%} -% For tracking in case brackets are needed. -% \begin{macrocode} -\int_new:N \l_@@_unit_denominator_int -\int_new:N \l_@@_unit_numerator_int -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_unit_prefix_int , -% \l_@@_unit_prefix_base_int , -% \l_@@_unit_prefix_current_tl -%} -% Used to calculate the overall prefix value. -% \begin{macrocode} -\int_new:N \l_@@_unit_prefix_int -\int_new:N \l_@@_unit_prefix_base_int -\tl_new:N \l_@@_unit_prefix_current_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_unit_prefix_gram_int} -% Formatting units is complicated by the fact that the kilogram is a -% base unit, making conversions a little more awkward. -% \begin{macrocode} -\int_new:N \l_@@_unit_prefix_gram_int -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_omit_unit_space_bool} -% Needed to omit the space between a number an a unit when printing -% symbols and when there is no numerator unit. -% \begin{macrocode} -\bool_new:N \l_@@_omit_unit_space_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_per_auto_bool , -% \l_@@_per_fraction_bool , -% \l_@@_per_mode_tl , -% \l_@@_power_number_bool , -% \l_@@_qualifier_mode_tl , -% \l_@@_per_two_parts_bool -%} -% For saving settings. -% \begin{macrocode} -\bool_new:N \l_@@_per_auto_bool -\bool_new:N \l_@@_per_fraction_bool -\tl_new:N \l_@@_per_mode_tl -\bool_new:N \l_@@_power_number_bool -\bool_new:N \l_@@_per_two_parts_bool -\tl_new:N \l_@@_qualifier_mode_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \l_@@_unit_denominator_bracket_bool , -% \l_@@_unit_product_tl , -% \l_@@_literal_power_bool , -% \l_@@_per_symbol_tl , -% \l_@@_qualifier_phrase_tl -%} -% At this stage, output formatting options are created. -% \begin{macrocode} -\keys_define:nn { siunitx } { - bracket-unit-denominator .bool_set:N - = \l_@@_unit_denominator_bracket_bool, - inter-unit-product .tl_set:N = \l_@@_unit_product_tl , - inter-unit-separator .tl_set:N = \l_@@_unit_product_tl , - literal-superscript-as-power - .bool_set:N = \l_@@_literal_power_bool, - per-mode .choice:, - per-mode / fraction .code:n = - { - \bool_set_false:N \l_@@_per_auto_bool - \bool_set_true:N \l_@@_per_fraction_bool - \bool_set_true:N \l_@@_per_two_parts_bool - \tl_set:Nn \l_@@_per_mode_tl { fraction } - }, - per-mode / power .meta:n = { per-mode = reciprocal } , - per-mode / power-positive-first .meta:n = - { per-mode = reciprocal-positive-first } , - per-mode / reciprocal .code:n = - { - \bool_set_false:N \l_@@_per_auto_bool - \bool_set_false:N \l_@@_per_fraction_bool - \bool_set_false:N \l_@@_per_two_parts_bool - \tl_clear:N \l_@@_per_mode_tl - }, - per-mode / reciprocal-positive-first .code:n = - { - \bool_set_false:N \l_@@_per_auto_bool - \bool_set_false:N \l_@@_per_fraction_bool - \bool_set_true:N \l_@@_per_two_parts_bool - \tl_clear:N \l_@@_per_mode_tl - }, - per-mode / repeated-symbol .code:n = - { - \bool_set_false:N \l_@@_per_auto_bool - \bool_set_false:N \l_@@_per_fraction_bool - \bool_set_false:N \l_@@_per_two_parts_bool - \tl_set:Nn \l_@@_per_mode_tl { repeat } - }, - per-mode / symbol .code:n = - { - \bool_set_false:N \l_@@_per_auto_bool - \bool_set_true:N \l_@@_per_fraction_bool - \bool_set_true:N \l_@@_per_two_parts_bool - \tl_set:Nn \l_@@_per_mode_tl { symbol } - }, - per-mode / symbol-or-fraction .code:n = - { - \bool_set_true:N \l_@@_per_auto_bool - \bool_set_true:N \l_@@_per_fraction_bool - \bool_set_true:N \l_@@_per_two_parts_bool - \tl_set:Nn \l_@@_per_mode_tl { symbol } - }, - per-symbol .tl_set:N = \l_@@_per_symbol_tl, - power-font .choice:, - power-font / number .code:n = - { \bool_set_true:N \l_@@_power_number_bool }, - power-font / unit .code:n = - { \bool_set_false:N \l_@@_power_number_bool }, - qualifier-mode .choice:, - qualifier-mode / brackets .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { brackets } }, - qualifier-mode / phrase .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { phrase } }, - qualifier-mode / space .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { space } }, - qualifier-mode / subscript .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { subscript } }, - qualifier-mode / text .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { text } }, - qualifier-phrase .tl_set:N = \l_@@_qualifier_phrase_tl -} -\keys_set:nn { siunitx } { - bracket-unit-denominator = true, - inter-unit-product = \,, - literal-superscript-as-power = true, - per-mode = reciprocal, - per-symbol = /, - power-font = number, - qualifier-mode = subscript, - qualifier-phrase = { ~ of ~ } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_format:} -% Most of the work is done by the loop, with a little tidying up for -% fraction-like output. Before starting the loop, there is a check for -% the case of a single reciprocal unit when per is set up to create a -% symbol. In that special case, the space between a number and a unit -% has to be removed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format: { - \prop_put:Nnx \l_@@_unit_prop { total-units } - { \int_use:N \l_@@_unit_int } - \@@_unit_format_init: - \int_while_do:nNnn { \l_@@_unit_int } > { 0 } - { - \@@_unit_format_prefix: - \@@_unit_format_symbol: - \@@_unit_format_qualifier: - \@@_unit_format_power: - \@@_unit_format_add: - \int_decr:N \l_@@_unit_int - } - \bool_if:NT \l_@@_per_two_parts_bool - { - \bool_if:NTF \l_@@_per_fraction_bool - { \@@_unit_format_fraction: } - { \@@_unit_format_sorted: } - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_unit_format_add:} -%\begin{macro}{\@@_unit_format_add_aux:n} -% Adding the current unit to the output means checking where it goes. -% The odd code when adding a space is to pick up repeated per symbols, -% which need to suppress the space. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_add: { - \bool_if:NTF \l_@@_per_two_parts_bool - { - \tl_set:Nx \l_@@_tmpb_tl - { per- \int_use:N \l_@@_unit_int } - \prop_if_in:NVTF \l_@@_unit_prop \l_@@_tmpb_tl - { - \@@_unit_format_add_aux:n { _denominator } - \int_incr:N \l_@@_unit_denominator_int - } - { - \@@_unit_format_add_aux:n { _numerator } - \int_incr:N \l_@@_unit_numerator_int - } - } - { \@@_unit_format_add_aux:n { } } - \tl_clear:N \l_@@_unit_current_tl -} -\cs_new_protected:Npn \@@_unit_format_add_aux:n #1 { - \tl_if_empty:cF { l_@@_unit #1 _tl } - { - \str_if_eq:VnTF \l_@@_per_mode_tl { repeat } - { - \tl_set:Nx \l_@@_tmpa_tl - { per- \int_eval:n { \l_@@_unit_int + 1 } } - \prop_if_in:NVF \l_@@_unit_prop \l_@@_tmpa_tl - { - \tl_put_right:NV \l_@@_unit_current_tl - \l_@@_unit_product_tl - } - } - { - \tl_put_right:NV \l_@@_unit_current_tl - \l_@@_unit_product_tl - } - } - \tl_set:Nx \l_@@_tmpa_tl - { special- \int_use:N \l_@@_unit_int } - \prop_get:NVNTF \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl +\NewDocumentCommand \qtyrange { O { } m m > { \TrimSpaces } m } { - \tl_put_left:cx { l_@@_unit #1 _tl } - { - \exp_not:V \l_@@_tmpa_tl - { \exp_not:V \l_@@_unit_current_tl } - } + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#4} + \keys_set:nn { siunitx } {#1} + \siunitx_quantity_range:nnn {#2} {#3} {#4} + \group_end: } +\NewDocumentCommand \numrange { O { } m m } { - \tl_put_left:cV { l_@@_unit #1 _tl } - \l_@@_unit_current_tl + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_number_range:nn {#2} {#3} + \group_end: } -} % \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_format_fraction:} -%\begin{macro}{ -% \@@_unit_format_fraction: , -% \@@_unit_format_auto: , -% \@@_unit_format_symbol: , -% \@@_unit_format_symbol_aux: , -% \@@_unit_format_symbol_aux_alt: -%} -% When making (\emph{psuedo}-)fractions there is a check to place a -% \( 1 \) in the numerator is it's blank. For symbol mode, this is -% only done if there is no number. Then some construction work. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_fraction: { - \int_compare:nNnT { \l_@@_unit_numerator_int } = { 0 } - { - \str_if_eq:VnT \l_@@_per_mode_tl { symbol } - { \bool_set_true:N \l_@@_omit_unit_space_bool } - } - \int_compare:nNnTF { \l_@@_unit_denominator_int } > { 0 } - { - \bool_if:NTF \l_@@_per_auto_bool - { \@@_unit_format_fraction_auto: } - { - \use:c - { @@_unit_format_fraction_ \l_@@_per_mode_tl : } - } - } - { \tl_set_eq:NN \l_@@_unit_tl \l_@@_unit_numerator_tl } -} -\cs_new_protected:Npn \@@_unit_format_fraction_fraction: { - \tl_if_empty:NT \l_@@_unit_numerator_tl - { \tl_set:Nn \l_@@_unit_numerator_tl { 1 } } - \tl_set:Nx \l_@@_unit_numerator_tl - { { \exp_not:V \l_@@_unit_numerator_tl } } - \tl_put_left:Nn \l_@@_unit_numerator_tl - { \@@_print:nn { unit } } - \tl_set:Nx \l_@@_unit_numerator_tl - { { \exp_not:V \l_@@_unit_numerator_tl } } - \tl_set:Nx \l_@@_unit_denominator_tl - { { \exp_not:V \l_@@_unit_denominator_tl } } - \tl_put_left:Nn \l_@@_unit_denominator_tl - { \@@_print:nn { unit } } - \tl_set:Nx \l_@@_unit_denominator_tl - { { \exp_not:V \l_@@_unit_denominator_tl } } - \tl_set:Nn \l_@@_unit_tl { \@@_fraction:nn } - \tl_put_right:NV \l_@@_unit_tl \l_@@_unit_numerator_tl - \tl_put_right:NV \l_@@_unit_tl \l_@@_unit_denominator_tl - \tl_set:Nx \l_@@_unit_tl - { \exp_not:N \ensuremath { \exp_not:V \l_@@_unit_tl } } -} -% \end{macrocode} -% For the \opt{symbol} setting, there is a need to deal with the -% possible \opt{symbol-or-fraction} choice. That is achieved by -% setting up both the \opt{fraction} and \opt{symbol} output. -% In the automatic mode, both cases are combined inside a -% \cs{tex_mathchoice:D}, with appropriate protection, before sending -% everything through for printing. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_fraction_auto: { - \mode_if_math:TF - { - \group_begin: - \@@_unit_format_fraction_fraction: - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmpa_tl \l_@@_unit_tl - \group_begin: - \@@_unit_format_fraction_symbol: - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmpb_tl \l_@@_unit_tl - \tl_set:Nx \l_@@_tmpb_tl - { - \@@_print:nn { unit } - { \exp_not:V \l_@@_tmpb_tl } - } - \tl_set:Nx \l_@@_unit_tl - { - \exp_not:N \ensuremath { - \tex_mathchoice:D - { \exp_not:V \l_@@_tmpa_tl } - { \exp_not:V \l_@@_tmpb_tl } - { \exp_not:V \l_@@_tmpb_tl } - { \exp_not:V \l_@@_tmpb_tl } - } - } - } - { \@@_unit_format_fraction_symbol: } -} -% \end{macrocode} -% For a normal symbol, the two parts of the input are arranged either -% side of the symbol itself in math mode. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_fraction_symbol: { - \@@_unit_format_fraction_symbol_aux: - \int_compare:nNnT { \l_@@_unit_denominator_int } > { 1 } - { - \bool_if:NT \l_@@_unit_denominator_bracket_bool - { - \tl_put_left:NV \l_@@_unit_denominator_tl \l_@@_bracket_open_tl - \tl_put_right:NV \l_@@_unit_denominator_tl \l_@@_bracket_close_tl - } - } - \tl_set_eq:NN \l_@@_unit_tl \l_@@_unit_numerator_tl - \tl_put_right:NV \l_@@_unit_tl \l_@@_per_symbol_tl - \tl_put_right:NV \l_@@_unit_tl \l_@@_unit_denominator_tl -} -\cs_new_protected:Npn - \@@_unit_format_fraction_symbol_aux: { } -\cs_new_protected:Npn - \@@_unit_format_fraction_symbol_aux_alt: { - \tl_if_empty:NT \l_@@_unit_numerator_tl - { \tl_set:Nn \l_@@_unit_numerator_tl { 1 } } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_format_init:} -% The normal initialisation stuff. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_init: { - \bool_set_false:N \l_@@_omit_unit_space_bool - \tl_clear:N \l_@@_unit_tl - \tl_clear:N \l_@@_unit_current_tl - \tl_clear:N \l_@@_unit_denominator_tl - \int_zero:N \l_@@_unit_prefix_gram_int - \tl_clear:N \l_@@_unit_numerator_tl - \int_zero:N \l_@@_unit_prefix_base_int - \int_zero:N \l_@@_unit_prefix_int - \int_zero:N \l_@@_unit_denominator_int - \int_zero:N \l_@@_unit_numerator_int - \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq - { \@@_unit_print_literal_aux:N ##1 } -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_unit_format_literal:n} -% \begin{macro}{\@@_unit_format_literal_aux:N} -% \begin{macro}{\@@_unit_format_literal_power:n} -% If the unit given contains anything which is not a unit macro, then -% any unit macros that are there simply dump literal meanings. There is -% then a little work to do sorting out |~| and |.| characters at -% the outer level. -% \begin{macrocode} -\group_begin: - \char_set_catcode_active:N \~ - \cs_new_protected:Npn \@@_unit_format_literal:n #1 - { - \int_zero:N \l_@@_unit_prefix_int - \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq - { \@@_unit_print_literal_aux:N ##1 } - \tl_set:Nn \l_@@_unit_tl {#1} - \tl_replace_all:NnV \l_@@_unit_tl { . } - \l_@@_unit_product_tl - \tl_replace_all:NnV \l_@@_unit_tl { ~ } - \l_@@_unit_product_tl - \bool_if:NT \l_@@_literal_power_bool - { - \tl_replace_all:Nnn \l_@@_unit_tl { ^ } - { \@@_unit_format_literal_power:n } - \tl_replace_all:Non \l_@@_unit_tl { \token_to_str:N ^ } - { \@@_unit_format_literal_power:n } - } - \@@_unit_format_literal_extras: - } -\group_end: -\cs_new_protected:Npn \@@_unit_print_literal_aux:N #1 - { \cs_set_eq:Nc #1 { @@_ \token_to_str:N #1 _literal:w } } -\cs_new_protected:Npn \@@_unit_format_literal_power:n #1 - { \PrintSuperscript { \@@_unit_format_power_aux:n {#1} } } -% \end{macrocode} -% \end{macro} % \end{macro} - %\end{macro} -% -%\begin{macro}{\@@_unit_format_literal_extras:} -%\begin{macro}{\@@_unit_format_literal_extras_aux:nN} -% The code here deals with characters outside the normal range that -% can appear in units in UTF-8 and related encodings. The idea is to -% do a search and replace, thus avoiding any active characters. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_literal_extras: - { - \@@_unit_format_literal_extras_aux:nN { 176 } - \SIUnitSymbolDegree - \@@_unit_format_literal_extras_aux:nN { 181 } - \SIUnitSymbolMicro - \@@_unit_format_literal_extras_aux:nN { 197 } - \SIUnitSymbolAngstrom - } -\cs_new_protected:Npn \@@_unit_format_literal_extras_aux:nN #1#2 - { - \tl_replace_all:Nxn \l_@@_unit_tl - { \char_generate:nn { #1 } { 12 } } - {#2} - } -\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } - { - \AtBeginDocument - { - \cs_if_exist:NTF \inputencodingname - { - \tl_set:Nn \l_@@_tmpa_tl { latin1 , latin5 , latin9 } - \clist_if_in:NVF \l_@@_tmpa_tl \inputencodingname - { - \cs_set_eq:NN \@@_unit_format_literal_extras: - \scan_stop: - } - } - { - \cs_set_eq:NN \@@_unit_format_literal_extras: - \scan_stop: - } - } - } -% \end{macrocode} -%\end{macro} -%\end{macro} % -%\begin{macro}{\@@_unit_format_power:} -%\begin{macro}{ -% \@@_unit_format_power_aux: , -% \@@_unit_format_power_aux:n , -% \@@_unit_format_power_aux:nn , -% \@@_unit_format_power_aux:w , -% \@@_unit_format_power_brackets: , -% \@@_unit_format_power_per: , -% \@@_unit_format_power_repeat: -%} -% To format powers, there are a few issues: are brackets needed, is -% the power reciprocal and is fraction-formatting in operation. Repeated -% per symbols make life a little more complex, as they have to be -% handled here as well. +% \begin{macro}{\complexnum, \complexqty} +% Interfaces for complex numbers. % \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_power: { - \tl_set:Nx \l_@@_tmpa_tl - { power- \int_use:N \l_@@_unit_int } - \prop_get:NVNTF \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl - { \@@_unit_format_power_aux: } - { - \tl_set:Nx \l_@@_tmpa_tl - { per- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpa_tl - { - \tl_set:Nn \l_@@_tmpa_tl { 1 } - \@@_unit_format_power_aux: - } - } -} -% \end{macrocode} -% The auxiliary function needs to make sure that the printing routine -% prints the power as a number, not as text: the two modes may be -% different. A search and replace function is needed for superscripts -% in text mode so that negative signs get printed correctly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_power_aux: { - \str_if_eq:VnTF \l_@@_per_mode_tl { repeat } - { \@@_unit_format_power_repeat: } - { \@@_unit_format_power_per: } - \str_if_eq:VnF \l_@@_tmpa_tl { 1 } - { - \@@_unit_format_power_brackets: - \tl_put_right:Nx \l_@@_unit_current_tl - { - \exp_not:N \PrintSuperscript - { - \@@_unit_format_power_aux:n - { - \exp_after:wN \@@_unit_format_power:w - \l_@@_tmpa_tl . . \q_stop - } - } - } - } -} -\cs_new_protected:Npn \@@_unit_format_power_aux:n #1 { - \bool_if:NTF \l_@@_power_number_bool - { \@@_unit_format_power_aux:nn { number } {#1} } - { \@@_unit_format_power_aux:nn { unit } {#1} } -} -\cs_new_protected:Npn \@@_unit_format_power_aux:nn #1#2 { - \bool_if:cTF { l_@@_ #1 _math_mode_bool } - { \@@_print:nn {#1} {#2} } - { - \tl_set:Nn \l_@@_tmpa_tl {#2} - \tl_replace_all:Nnn \l_@@_tmpa_tl { - } - { \text { \textminus } } - \@@_print:nV {#1} \l_@@_tmpa_tl - } -} -\cs_new:Npn \@@_unit_format_power:w #1 . #2 . #3 \q_stop +\NewDocumentCommand \complexnum { O { } m } { - \exp_not:n {#1} - \tl_if_blank:nF {#2} - { - \exp_not:V \l_@@_output_decimal_tl - \exp_not:n {#2} - } + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_complex_number:n {#2} \l_@@_tmp_tl + \group_end: } -% \end{macrocode} -% A check is made for a qualifier with a space, which needs brackets -% if there is also a power. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_power_brackets: { - \tl_set:Nx \l_@@_tmpb_tl - { bracket- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpb_tl - { - \tl_put_left:NV \l_@@_unit_current_tl \l_@@_bracket_open_tl - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_bracket_close_tl - } -} -% \end{macrocode} -% For dealing with \cs{per} and repeated \cs{per} symbols. The sign -% change does not use any numbers, as this makes life easier with -% non-integer values. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_power_per: { - \tl_set:Nx \l_@@_tmpb_tl - { per- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpb_tl - { - \bool_if:NF \l_@@_per_fraction_bool - { - \tl_if_in:NnTF \l_@@_tmpa_tl { - } - { - \cs_set:Npn \@@_tmp:w ##1 - ##2 \q_stop - { \tl_set:Nn \l_@@_tmpa_tl {##2} } - \exp_after:wN \@@_tmp:w \l_@@_tmpa_tl \q_stop - } - { \tl_put_left:Nn \l_@@_tmpa_tl { - } } - } - } -} -\cs_new_protected:Npn \@@_unit_format_power_repeat: { - \tl_set:Nx \l_@@_tmpb_tl - { per- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpb_tl - { - \tl_put_left:NV \l_@@_unit_current_tl \l_@@_per_symbol_tl - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_format_prefix:} -%\begin{macro}{ -% \@@_unit_format_prefix_number: , -% \@@_unit_format_prefix_number_calc: , -% \@@_unit_format_prefix_symbol: -%} -% If there is a prefix, it is added to the output. When using numerical -% output, some conversion is needed instead. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_prefix: { - \tl_set:Nx \l_@@_tmpa_tl - { prefix-symbol- \int_use:N \l_@@_unit_int } - \prop_if_in:NVT \l_@@_unit_prop \l_@@_tmpa_tl - { - \prop_get:NVN \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_unit_prefix_current_tl - \bool_if:NTF \l_@@_prefix_symbols_bool - { \@@_unit_format_prefix_symbol: } - { \@@_unit_format_prefix_number: } - } -} -\cs_new_protected:Npn \@@_unit_format_prefix_number: { - \tl_set:Nx \l_@@_tmpa_tl - { prefix-base- \int_use:N \l_@@_unit_int } - \prop_get:NVN \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl - \int_compare:nNnT { \l_@@_unit_prefix_base_int } = { 0 } - { - \int_set:Nn \l_@@_unit_prefix_base_int - { \l_@@_tmpa_tl } - } - \int_compare:nNnTF - { \l_@@_unit_prefix_base_int } = { \l_@@_tmpa_tl } - { \@@_unit_format_prefix_number_calc: } - { \msg_error:nn { siunitx } { prefix-base-mismatch } } -} -% \end{macrocode} -% The calculation for converting a unit prefix into a number is -% simple unless there are grammes involved. In that case, the base unit -% is the kilogram and so there is some code to convert the number -% back correctly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_prefix_number_calc: { - \tl_set:Nx \l_@@_tmpa_tl - { power- \int_use:N \l_@@_unit_int } - \prop_get:NVNF \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl - { \tl_set:Nn \l_@@_tmpa_tl { 1 } } - \tl_set:Nx \l_@@_tmpb_tl - { unit- \int_use:N \l_@@_unit_int } - \prop_get:NVN \l_@@_unit_prop \l_@@_tmpb_tl - \l_@@_tmpb_tl - \str_if_eq:VnT \l_@@_tmpb_tl { \gram } - { - \tl_set:Nx \l_@@_unit_prefix_current_tl - { \int_eval:n { \l_@@_unit_prefix_current_tl - 3 } } - \tl_set:Nx \l_@@_tmpb_tl - { symbol- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpb_tl { kg } - } - \tl_set:Nx \l_@@_unit_prefix_current_tl - { - \int_eval:n - { \l_@@_unit_prefix_current_tl * \l_@@_tmpa_tl } - } - \tl_set:Nx \l_@@_tmpa_tl - { per- \int_use:N \l_@@_unit_int } - \prop_if_in:NVTF \l_@@_unit_prop \l_@@_tmpa_tl - { - \int_set:Nn \l_@@_unit_prefix_int - { - \l_@@_unit_prefix_int - - \l_@@_unit_prefix_current_tl - } - } - { - \int_set:Nn \l_@@_unit_prefix_int - { - \l_@@_unit_prefix_int - + \l_@@_unit_prefix_current_tl - } - } -} -\cs_new_protected:Npn \@@_unit_format_prefix_symbol: { - \tl_set_eq:NN \l_@@_unit_current_tl - \l_@@_unit_prefix_current_tl -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_format_qualifier:} -%\begin{macro}{ -% \@@_unit_format_qualifier_brackets: , -% \@@_unit_format_qualifier_phrase: , -% \@@_unit_format_qualifier_space: , -% \@@_unit_format_qualifier_subscript: , -% \@@_unit_format_qualifier_text: -%} -% Four methods for showing qualifiers, each with its own sub-function. -% For the \texttt{space} methods, a warning is set in the property list -% as if there is a power then some brackets will be needed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_qualifier: { - \tl_set:Nx \l_@@_tmpa_tl - { qualifier- \int_use:N \l_@@_unit_int } - \prop_get:NVNT \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl - { - \use:c - { - @@_unit_format_qualifier_ - \l_@@_qualifier_mode_tl : - } - } -} -\cs_new_protected:Npn \@@_unit_format_qualifier_brackets: { - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_bracket_open_tl - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_tmpa_tl - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_bracket_close_tl -} -\cs_new_protected:Npn \@@_unit_format_qualifier_phrase: +\NewDocumentCommand \complexqty { O { } m m } { - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_qualifier_phrase_tl - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_tmpa_tl - \tl_set:Nx \l_@@_tmpa_tl - { bracket- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl { true } - } -\char_set_catcode_active:N \~ -\cs_new_protected:Npn \@@_unit_format_qualifier_space: { - \tl_put_right:Nn \l_@@_unit_current_tl { \text { ~ } } - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_tmpa_tl - \tl_set:Nx \l_@@_tmpa_tl - { bracket- \int_use:N \l_@@_unit_int } - \prop_put:NVn \l_@@_unit_prop \l_@@_tmpa_tl { true } -} -\char_set_catcode_space:N \~ -\cs_new_protected:Npn \@@_unit_format_qualifier_subscript: { - \tl_put_right:Nx \l_@@_unit_current_tl - { \exp_not:N \PrintSubscript { \exp_not:V \l_@@_tmpa_tl } } -} -\cs_new_protected:Npn \@@_unit_format_qualifier_text: { - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_tmpa_tl -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% \begin{macro}{\@@_unit_format_sorted:} -% For when the powers are sorted with the positive ones first. The only -% slight issue is making sure that the additional space is included -% between the two units, if needed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_sorted: - { - \tl_set:Nx \l_@@_unit_tl - { - \exp_not:V \l_@@_unit_numerator_tl - \bool_lazy_or:nnF - { \tl_if_empty_p:N \l_@@_unit_numerator_tl } - { \tl_if_empty_p:N \l_@@_unit_denominator_tl } - { - \exp_not:N \l_@@_unit_product_tl - } - \exp_not:V \l_@@_unit_denominator_tl - } + \mode_leave_vertical: + \group_begin: + \siunitx_unit_options_apply:n {#3} + \keys_set:nn { siunitx } {#1} + \siunitx_complex_quantity:nn {#2} {#3} + \group_end: } % \end{macrocode} % \end{macro} % -%\begin{macro}{\@@_unit_format_symbol:} -%\begin{macro}{ -% \@@_unit_format_symbol_aux: , -% \@@_unit_format_symbol_aux_alt: -%} -% If there is no symbol, something is wrong! The only exception is -% when the code is inside the \cs{si} function (or similar) and there -% is only a prefix with nothing else present at all. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_format_symbol: { - \tl_set:Nx \l_@@_tmpa_tl - { symbol- \int_use:N \l_@@_unit_int } - \prop_get:NVNTF \l_@@_unit_prop \l_@@_tmpa_tl - \l_@@_tmpa_tl - { - \tl_put_right:NV \l_@@_unit_current_tl \l_@@_tmpa_tl - } - { \@@_unit_format_symbol_aux: } -} -\cs_new_protected:Npn \@@_unit_format_symbol_aux: { - \msg_error:nn { siunitx } { prefix-only } -} -\cs_new_protected:Npn \@@_unit_format_symbol_aux_alt: { - \int_compare:nNnTF { \l_@@_unit_int } = { 1 } - { - \prop_remove:Nn \l_@@_unit_prop { prefix-1 } - \prop_remove:Nn \l_@@_unit_prop { prefix-symbol-1 } - \prop_remove:Nn \l_@@_unit_prop { prefix-base-1 } - \prop_remove:Nn \l_@@_unit_prop { total-units } - \prop_if_empty:NF \l_@@_unit_prop - { \msg_error:nn { siunitx } { prefix-only } } - } - { \msg_error:nn { siunitx } { prefix-only } } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Unit output} -% -% A collection of the internal parts of various user functions. -% -%\begin{macro}{\l_@@_multi_brackets_bool} -%\begin{macro}{\l_@@_multi_repeat_bool} -% Flags for multi-part numbers. -% \begin{macrocode} -\bool_new:N \l_@@_multi_brackets_bool -\bool_new:N \l_@@_multi_repeat_bool -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\l_@@_product_brackets_bool} -%\begin{macro}{\l_@@_product_power_bool} -%\begin{macro}{\l_@@_number_unit_repeat_bool} -% Flags for product units. -% \begin{macrocode} -\bool_new:N \l_@@_product_brackets_bool -\bool_new:N \l_@@_product_power_bool -\bool_new:N \l_@@_product_repeat_bool -\bool_new:N \l_@@_number_unit_repeat_bool -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\l_@@_number_unit_breaks_bool} -%\begin{macro}{\l_@@_number_unit_product_tl} -% Options for printing units or units with numbers. -% \begin{macrocode} -\keys_define:nn { siunitx } { - allow-number-unit-breaks .bool_set:N = - \l_@@_number_unit_breaks_bool, - multi-part-units .choice:, - multi-part-units - / brackets .code:n = - { - \bool_set_true:N \l_@@_multi_brackets_bool - \bool_set_false:N \l_@@_multi_repeat_bool - }, - multi-part-units - / repeat .code:n = - { - \bool_set_false:N \l_@@_multi_brackets_bool - \bool_set_true:N \l_@@_multi_repeat_bool - }, - multi-part-units - / single .code:n = - { - \bool_set_false:N \l_@@_multi_brackets_bool - \bool_set_false:N \l_@@_multi_repeat_bool - }, - number-unit-product .tl_set:N = - \l_@@_number_unit_product_tl, - number-unit-separator .tl_set:N = - \l_@@_number_unit_product_tl, - product-units .choice:, - product-units - / brackets .code:n = - { - \bool_set_true:N \l_@@_product_brackets_bool - \bool_set_false:N \l_@@_product_power_bool - \bool_set_false:N \l_@@_product_repeat_bool - }, - product-units - / brackets-power .code:n = - { - \bool_set_true:N \l_@@_product_brackets_bool - \bool_set_true:N \l_@@_product_power_bool - \bool_set_false:N \l_@@_product_repeat_bool - }, - product-units - / power .code:n = - { - \bool_set_false:N \l_@@_product_brackets_bool - \bool_set_true:N \l_@@_product_power_bool - \bool_set_false:N \l_@@_product_repeat_bool - }, - product-units - / repeat .code:n = - { - \bool_set_false:N \l_@@_product_brackets_bool - \bool_set_false:N \l_@@_product_power_bool - \bool_set_true:N \l_@@_product_repeat_bool - }, - product-units - / single .code:n = - { - \bool_set_false:N \l_@@_product_brackets_bool - \bool_set_false:N \l_@@_product_power_bool - \bool_set_false:N \l_@@_product_repeat_bool - }, -} -\keys_set:nn { siunitx } { - multi-part-units = brackets, - number-unit-product = \, , - product-units = repeat -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_output:nn} -%\begin{macro}{\@@_unit_output:Vn} -% For typesetting a unit directly: used by \cs{si} and the \texttt{s} -% column. The second argument is any options to set locally. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_output:nn #1#2 { - \cs_set_eq:NN \@@_unit_format_symbol_aux: - \@@_unit_format_symbol_aux_alt: - \cs_set_eq:NN \@@_unit_format_fraction_symbol_aux_ii: - \@@_unit_format_fraction_symbol_aux_alt: - \@@_unit_in:nn {#1} {#2} - \int_compare:nNnTF { \l_@@_unit_prefix_int } = { 0 } - { - \str_if_eq:VnT \l_@@_per_mode_tl { symbol } - { - \int_compare:nNnT { \l_@@_unit_numerator_int } = { 0 } - { - \bool_if:NT \l_@@_unit_parse_bool - { \@@_print:nn { unit } { 1 } } - } - } - } - { - \tl_set:Nx \l_@@_tmpa_tl - { - \int_use:N \l_@@_unit_prefix_base_int - \exp_not:N \PrintSuperscript - { \int_use:N \l_@@_unit_prefix_int } - } - \@@_print:nV { number } \l_@@_tmpa_tl - \@@_unit_output_number_sep: - } - \@@_print:nV { unit } \l_@@_unit_tl -} -\cs_generate_variant:Nn \@@_unit_output:nn { V } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_output_number_sep:} -%\begin{macro}{\@@_unit_output_number_sep_aux:} -% For printing the number separator. The \cs{tex_mathchoice:D} code -% deals with the \opt{symbol-or-fraction} setting for \opt{per-mode}, -% as in that case omission of the space between a number and unit -% depends on the current math style. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_output_number_sep: { - \bool_if:NTF \l_@@_number_unit_breaks_bool - { \penalty \binoppenalty } { \nobreak } - \bool_if:NTF \l_@@_per_auto_bool - { - \mode_if_math:TF - { - \tex_mathchoice:D - { \l_@@_number_unit_product_tl } - { \@@_unit_output_number_sep_aux: } - { \@@_unit_output_number_sep_aux: } - { \@@_unit_output_number_sep_aux: } - } - { \@@_unit_output_number_sep_aux: } - } - { \@@_unit_output_number_sep_aux: } -} -\cs_new_protected:Npn \@@_unit_output_number_sep_aux: { - \bool_if:NF \l_@@_omit_unit_space_bool - { \l_@@_number_unit_product_tl } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_unit_output_pre_print:} -%\begin{macro}{\@@_unit_output_print:} -% The printing functions for units do some simple tests then -% actually print there output. -% \begin{macrocode} -\cs_new_protected:Npn \@@_unit_output_pre_print: { - \tl_if_empty:NF \l_@@_pre_unit_tl - { - \nobreak - \@@_print:nV { unit } \l_@@_pre_unit_tl - } -} -\cs_new_protected:Npn \@@_unit_output_print: { - \int_compare:nNnF { \l_@@_unit_prefix_int } = { 0 } - { - \tl_set:Nx \l_@@_tmpa_tl - { - \bool_if:NTF \l_@@_tight_bool - { - \exp_not:N \ensuremath - { { \exp_not:V \l_@@_exponent_product_tl } } - } - { - \exp_not:N \ensuremath - { { } \exp_not:V \l_@@_exponent_product_tl { } } - } - \int_use:N \l_@@_unit_prefix_base_int - ^ { \int_use:N \l_@@_unit_prefix_int } - } - \@@_print:nV { number } \l_@@_tmpa_tl - } - \tl_if_empty:NF \l_@@_unit_tl - { - \@@_unit_output_number_sep: - \@@_print:nV { unit } \l_@@_unit_tl - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Numbers with units} -% -% Numbers with units have to be formatted in a more complex way than -% simply sticking the two together. -% -%\begin{macro}{\l_@@_preunit_tl} -% A pre-unit is optional, so can be handled using the setting system. -% \begin{macrocode} -\keys_define:nn { siunitx } { - preunit .tl_set:N = \l_@@_preunit_tl , -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_pre_unit_tl} -% When there is a pre-unit, it gets stored here. -% \begin{macrocode} -\tl_new:N \l_@@_pre_unit_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_number_product_int} -% Used to count up the number of product tokens in a number. -% \begin{macrocode} -\int_new:N \l_@@_number_product_int -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_combined:nnnn} -% Printing numbers and units means first processing the units, then -% handing off this information to the combined number and unit -% processor. -% \begin{macrocode} -\cs_new_protected:Npn \@@_combined:nnnn #1#2#3#4 { - \IfNoValueTF {#3} - { \tl_clear:N \l_@@_pre_unit_tl } - { - \group_begin: - \@@_unit_in:nn {#3} {#1} - \cs_set_eq:NN \l_@@_pre_unit_tl \l_@@_unit_tl - \exp_args:NNNo \group_end: - \tl_set:Nn \l_@@_pre_unit_tl { \l_@@_unit_tl } - } - \cs_set_eq:NN \l_@@_brackets_bool - \l_@@_multi_brackets_bool - \@@_combined_unit:nnn {#2} {#4} {#1} - \@@_combined_output:n {#2} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_combined_output:n} -% Printing the combination of a number and a unit means checking for -% parsing then parsing the number part. +% \begin{macro}{\tablenum} +% Slightly odd set up at present: we have to have the |\ignorespaces|. % \begin{macrocode} -\cs_new_protected:Npn \@@_combined_output:n #1 { - \bool_if:NTF \l_@@_number_parse_bool - { - \tl_clear:N \l_@@_number_out_tl - \bool_set_false:N \l_@@_number_compound_bool - \@@_number_output_parse:n {#1} - } - { - \@@_unit_output_pre_print: - \@@_print:nn { number } { \ensuremath {#1} } - \@@_unit_output_print: - } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_combined_unit:nnn} -% In most cases, sorting out the main unit is easy: simply set up for -% printing using \cs{@@_unit_in:nn}. However, if there are multiple -% parts to the number, and they are to be combined into the unit, then -% there is more work to do. In either case, the result is the -% correctly-prepared unit stored in \cs{l_@@_unit_tl}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_combined_unit:nnn #1#2#3 { - \bool_if:NTF \l_@@_product_power_bool - { - \@@_combined_product_count:n {#1} - \int_compare:nNnTF { \l_@@_number_product_int } > { 0 } - { - \int_incr:N \l_@@_number_product_int - \tl_set:Nn \l_@@_tmpa_tl {#2} - \tl_set:Nx \l_@@_tmpb_tl - { \tothe { \exp_not:V \l_@@_number_product_int } } - \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl - \@@_unit_in:Vn \l_@@_tmpa_tl {#3} - } - { \@@_unit_in:nn {#2} {#3} } - } - { \@@_unit_in:nn {#2} {#3} } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_combined_product_count:n} -%\begin{macro}{\@@_combined_product_count_aux:n} -% For counting how many products are in a number, so that the unit -% can be adjusted if needed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_combined_product_count:n #1 { - \int_zero:N \l_@@_number_product_int - \tl_set:Nn \l_@@_tmpa_tl {#1} - \tl_map_function:NN \l_@@_input_product_tl - \@@_combined_product_count_aux:N -} -\cs_new_protected:Npn \@@_combined_product_count_aux:N #1 { - \tl_if_in:NnT \l_@@_tmpa_tl {#1} - { - \int_incr:N \l_@@_number_product_int - \tl_remove_once:Nn \l_@@_tmpa_tl {#1} - \@@_combined_product_count_aux:N #1 - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Lists of numbers} -% -%\begin{macro}{\l_@@_list_brackets_bool} -%\begin{macro}{\l_@@_list_repeat_bool} -% For storing the behaviour of list items with respect to units. -% \begin{macrocode} -\bool_new:N \l_@@_list_brackets_bool -\bool_new:N \l_@@_list_repeat_bool -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\l_@@_list_current_tl} -%\begin{macro}{\l_@@_list_tl} -% Two token list variables used to store the list for output. -% \begin{macrocode} -\tl_new:N \l_@@_list_current_tl -\tl_new:N \l_@@_list_tl -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% \begin{variable} -% { -% \l_@@_list_separator_pair_tl , -% \l_@@_list_separator_final_tl , -% \l_@@_list_separator_tl, -% } -% Settings for lists. -% \begin{macrocode} -\keys_define:nn { siunitx } +\NewDocumentCommand \tablenum { O { } m } { - list-final-separator .tl_set:N = \l_@@_list_separator_final_tl , - list-pair-separator .tl_set:N = \l_@@_list_separator_pair_tl , - list-separator .tl_set:N = \l_@@_list_separator_tl , - list-units .choice:, - list-units - / brackets .code:n = - { - \bool_set_true:N \l_@@_list_brackets_bool - \bool_set_false:N \l_@@_list_repeat_bool - }, - list-units - / repeat .code:n = - { - \bool_set_false:N \l_@@_list_brackets_bool - \bool_set_true:N \l_@@_list_repeat_bool - }, - list-units - / single .code:n = - { - \bool_set_false:N \l_@@_list_brackets_bool - \bool_set_false:N \l_@@_list_repeat_bool - } + \mode_leave_vertical: + \group_begin: + \keys_set:nn { siunitx } {#1} + \siunitx_cell_begin:w + \ignorespaces #2 + \siunitx_cell_end: + \group_end: } -\keys_set:nn { siunitx } - { - list-final-separator = { ~ and ~ } , - list-pair-separator = { ~ and ~ } , - list-separator = { , ~ } , - list-units = repeat -} % \end{macrocode} -% \end{variable} +% \end{macro} % -% \begin{macro}{\@@_list_numbers:n} -% \begin{macro} -% {\@@_list_numbers_aux_i:n, \@@_list_numbers_aux_ii:n} -% \begin{macro}{\@@_list_numbers_aux:nn} -% Setting up lists is made slightly complicated by the need to handle the -% case of exactly two items and the case of the very last separator -% differently from everything else. Beyond that, there is not too much -% to any of this code. +% \begin{macro}{\sisetup} +% A very thin wrapper. % \begin{macrocode} -\cs_new_protected:Npn \@@_list_numbers:n #1 - { - \tl_clear:N \l_@@_unit_tl - \tl_clear:N \l_@@_preunit_tl - \@@_list_numbers_aux_i:n {#1} - } -\cs_new_protected:Npn \@@_list_numbers_aux_i:n #1 - { - \bool_set_true:N \l_@@_list_first_bool - \tl_clear:N \l_@@_list_current_tl - \int_compare:nNnTF { \tl_count:n {#1} } > 2 - { - \tl_map_function:nN {#1} \@@_list_numbers_aux_ii:n - \l_@@_list_tl - \l_@@_list_separator_final_tl - \l_@@_list_current_tl - } - { - \int_compare:nNnTF { \tl_count:n {#1} } = 2 - { \@@_list_numbers_aux:nn #1 } - { \@@_combined_output:n #1 } - } - } -\cs_new_protected:Npn \@@_list_numbers_aux_ii:n #1 - { - \tl_if_empty:NTF \l_@@_list_tl - { \tl_set_eq:NN \l_@@_list_tl \l_@@_list_current_tl } - { - \tl_put_right:NV \l_@@_list_tl \l_@@_list_separator_tl - \tl_put_right:NV \l_@@_list_tl \l_@@_list_current_tl - } - \tl_set:Nn \l_@@_list_current_tl { \@@_combined_output:n {#1} } - } -\cs_new_protected:Npn \@@_list_numbers_aux:nn #1#2 - { - \@@_combined_output:n {#1} - \l_@@_list_separator_pair_tl - \@@_combined_output:n {#2} - } +\NewDocumentCommand \sisetup { m } + { \keys_set:nn { siunitx } {#1} } % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} % -% \begin{macro}{\@@_list_units:nnn} -% For a list of items with units, the method is to first parse the -% unit when repeating (to save time), then to use the number loop above -% for the actual work. On the other hand, when the unit is only printed -% once life is easier as the normal unit printer can operate. +% \subsection{\enquote{Glue} commands} +% +% \begin{macro}{\@@_angle:nnn} +% The document level interface for \cs{ang} needs some \enquote{glue} to +% work with the code-level API. % \begin{macrocode} -\cs_new_protected:Npn \@@_list_units:nnn #1#2#3 +\cs_new_protected:Npn \@@_angle:nnn #1#2#3 { - \@@_unit_parse_options:nn {#2} {#3} - \bool_if:NTF \l_@@_list_repeat_bool - { - \@@_unit_in:nn {#2} {#3} - \@@_list_numbers_aux_i:n {#1} - } + \tl_if_novalue:nTF {#2} + { \siunitx_angle:n {#1} } { - \bool_if:NT \l_@@_process_fixed_bool - { \bool_set_true:N \l_@@_process_drop_exponent_bool } - \bool_if:NT \l_@@_list_brackets_bool - { \@@_print:nV { number } \l_@@_bracket_open_tl } - \@@_list_numbers:n {#1} - \bool_if:NT \l_@@_list_brackets_bool - { \@@_print:nV { number } \l_@@_bracket_close_tl } - \@@_range_exponent: - \@@_unit_output_number_sep: - \@@_unit_output:nn {#2} {#3} + \tl_if_novalue:nTF {#3} + { \siunitx_angle:nnn {#1} {#2} { } } + { \siunitx_angle:nnn {#1} {#2} {#3} } } } % \end{macrocode} % \end{macro} % -%\subsection{Ranges} +% \subsection{Table column} % -%\begin{macro}{\l_@@_range_brackets_bool} -%\begin{macro}{\l_@@_range_repeat_bool} -% Settings for ranges with units. +% User interfaces in tabular constructs are provided using the mechanisms from +% the \pkg{array} package. % \begin{macrocode} -\bool_new:N \l_@@_range_brackets_bool -\bool_new:N \l_@@_range_repeat_bool +\RequirePackage { array } % \end{macrocode} -%\end{macro} -%\end{macro} % -%\begin{macro}{\l_@@_range_phrase_tl} -% Simple settings for ranges. +% \begin{macro}{\@@_declare_column:Nnn} +% Creating numerical columns requires that these are declared before anything +% else in \cs{NC@list}: this is necessary to work with optional arguments. +% This means a bit of manual effort after the simple declaration of a new +% column type. The token assigned to the column type is not fixed as this +% allows the same code to be used in compatibility with version~$2$. % \begin{macrocode} -\keys_define:nn { siunitx } { - range-phrase .tl_set:N = \l_@@_range_phrase_tl, - range-units .choice:, - range-units - / brackets .code:n = - { - \bool_set_true:N \l_@@_range_brackets_bool - \bool_set_false:N \l_@@_range_repeat_bool - }, - range-units - / repeat .code:n = - { - \bool_set_false:N \l_@@_range_brackets_bool - \bool_set_true:N \l_@@_range_repeat_bool - }, - range-units - / single .code:n = - { - \bool_set_false:N \l_@@_range_brackets_bool - \bool_set_false:N \l_@@_range_repeat_bool - }, -} -\keys_set:nn { siunitx } { - range-phrase = { ~ to ~ }, - range-units = repeat, -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_range_numbers:nn} -% \begin{macro}{\@@_range_numbers_core:nn} -% \begin{macro}{\@@_range_numbers_aux:n} -% A range of numbers. This is more restrictive than the \cs{num} -% function: nothing compound. -% \begin{macrocode} -\cs_new_protected:Npn \@@_range_numbers:nn #1#2 - { - \@@_range_numbers_aux:n {#1} - \l_@@_range_phrase_tl - \@@_range_numbers_aux:n {#2} - } -\cs_new_protected:Npn \@@_range_numbers_aux:n #1 +\cs_new_protected:Npn \@@_declare_column:Nnn #1#2#3 { - \bool_if:NTF \l_@@_number_parse_bool + \cs_if_exist:cT { NC@find@ #1 } { - \tl_clear:N \l_@@_number_out_tl - \tl_clear:N \l_@@_number_out_saved_tl - \bool_set_false:N \l_@@_number_compound_bool - \@@_number_output_parse:n {#1} - \bool_if:NT \l_@@_number_compound_bool - { \msg_error:nnx { siunitx } { multi-part-range } {#1} } + \cs_undefine:c { NC@find@ #1 } + \msg_warning:nnn { siunitx } { column-overwritten } {#1} } + \newcolumntype {#1} { } + \cs_set_protected:Npn \@@_tmp:w \NC@do ##1##2 \NC@do #1 + { \NC@list { \NC@do ##1 \NC@do #1 ##2 } } + \exp_after:wN \@@_tmp:w \the \NC@list + \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ] { - \@@_unit_output_pre_print: - \@@_print:nn { number } {#1} - \@@_unit_output_print: - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -%\begin{macro}{\@@_range_unit:nnnn} -% Unit printing is also simple: basically a past-up job. The only compl -% \begin{macrocode} -\cs_new_protected:Npn \@@_range_unit:nnnn #1#2#3#4 { - \@@_unit_parse_options:nn {#1} {#2} - \bool_if:NTF \l_@@_range_repeat_bool - { - \@@_unit_in:nn {#1} {#2} - \@@_range_numbers_aux:n {#3} - \l_@@_range_phrase_tl - \@@_range_numbers_aux:n {#4} - } - { - \bool_if:NT \l_@@_process_fixed_bool - { \bool_set_true:N \l_@@_process_drop_exponent_bool } - \bool_if:NT \l_@@_range_brackets_bool - { \@@_print:nV { number } \l_@@_bracket_open_tl } - \@@_range_numbers:nn {#3} {#4} - \bool_if:NT \l_@@_range_brackets_bool - { \@@_print:nV { number } \l_@@_bracket_close_tl } - \@@_range_exponent: - \@@_unit_output_number_sep: - \@@_unit_output:nn {#1} {#2} - } -} -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\@@_range_exponent:} -% The idea here is to construct and print an exponent if this is fixed, -% and thus removed from the range. This function is also used by the -% related list concept. -% \begin{macrocode} -\cs_new_protected:Npn \@@_range_exponent: - { - \bool_if:NT \l_@@_process_fixed_bool - { - \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_exponent_product_tl - \bool_if:NT \l_@@_tight_bool + \@temptokena \expandafter { - \tl_set:Nx \l_@@_tmpa_tl - { \exp_not:N \mathord \exp_not:o \l_@@_tmpa_tl } + \the \@temptokena + > {#2} c < {#3} } - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath { { } \exp_not:o \l_@@_tmpa_tl { } } - 10 \exp_not:N \PrintSuperscript - { \int_use:N \l_@@_process_fixed_int } - } - \@@_print:nV { number } \l_@@_tmpa_tl + \NC@find } } +\msg_new:nnn { siunitx } { column-overwritten } + { Tabular~column~type~"#1"~overwritten~with~siunitx~definition. } % \end{macrocode} -% \end{macro} -% -%\subsection{Setting up tables} -% -% There is a slight problem with the \pkg{cellspace} package: it also -% uses \texttt{S} for a column type Here, \texttt{S} seems to make -% more sense for \pkg{siunitx}, with \texttt{C} used for -% \pkg{cellspace}. To enable this to work well, the column -% rewriting code happens \cs{AtBeginDocument}. The \texttt{S} column -% is deleted from \cs{NC@list} so that no warning appears. -% \begin{macrocode} -\AtBeginDocument { - \@ifpackageloaded { cellspace } - { - \cs_if_exist:NT \NC@find@S - { - \newcolumntype { C } [1] - { > { \bcolumn #1 \@nil } #1 < { \ecolumn } } - \cs_set:Npn \@@_tmp:w #1 \NC@do S #2 \q_stop - { \NC@list { #1 #2 } } - \exp_after:wN \@@_tmp:w \tex_the:D \NC@list \q_stop - \cs_undefine:N \NC@find@S - \msg_new:nnn { siunitx } { moved-cellspace-column } - { Column~type~for~cellspace~package~moved~to~'#1'. } - \msg_warning:nnn { siunitx } { moved-cellspace-column } { C } - \ifcellspace@m - \def \env@matrix - { - \hskip -\arraycolsep - \let \@ifnextchar \new@ifnextchar - \array - { - * { \c@MaxMatrixCols } - { > { \bcolumn c \@nil $ } c < { $ \ecolumn } } @ { } - } - } - \fi - } - } - { } -} -% \end{macrocode} -% -%\begin{macro}{\@@_table_rewrite_create:N} -%\begin{macro}{\@@_table_rewrite_create_aux:w} -% The \texttt{s} and \texttt{S} column types are both created using -% the \pkg{array} package, but with the internal macros redefined -% to work with optional argument. First, there is a need to do a -% quick shuffle with the \cs{NC@list} macro. The \pkg{siunitx} -% columns have to be listed first, as otherwise the optional -% arguments do not work correctly. So they are added \enquote{by hand} -% to the appropriate macro. +% When \pkg{mdwtab} is loaded the syntax required is slightly different. % \begin{macrocode} -\cs_new_protected:Npn \@@_table_rewrite_create:N #1 { - \newcolumntype {#1} { } - \cs_set_protected:Npn - \@@_table_rewrite_create_aux:w \NC@do ##1##2 \NC@do #1 - { \NC@list { \NC@do ##1 \NC@do #1 ##2 } } - \exp_after:wN \@@_table_rewrite_create_aux:w \tex_the:D \NC@list - \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [1] [ ] - { - \@temptokena \exp_after:wN - { - \tex_the:D \@temptokena - > { \@@_table_collect_begin:Nn #1 {##1} } - c - < { \@@_table_print: } - } - \NC@find - } -} \AtBeginDocument { \@ifpackageloaded { mdwtab } { - \cs_set_protected:Npn \@@_table_rewrite_create:N #1 + \cs_set_protected:Npn \@@_declare_column:Nnn #1#2#3 { - \newcolumntype {#1} [1] [] - { - > { \@@_table_collect_begin:Nn #1 {##1} } - c - < { \@@_table_print: } - } + \cs_if_exist:cT { NC@find@ #1 } + { + \cs_undefine:c { NC@find@ #1 } + \msg_warning:nnn { siunitx } { column-overwritten } {#1} + } + \newcolumntype {#1} [ 1 ] [ ] + { > {#2} c < {#3} } } } { } - } -\cs_new_protected:Npn \@@_table_rewrite_create_aux:w { } -\AtBeginDocument { \@@_table_rewrite_create:N s } -\AtBeginDocument { \@@_table_rewrite_create:N S } -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Collecting tokens in tables} -% -% The table system is in two parts, collecting tokens and typesetting -% the result. The collection routine tries to ensure that the -% typesetting part only receives real cell contents. -% -%\begin{macro}{\l_@@_table_collect_tl} -%\begin{macro}{\l_@@_table_collect_pre_tl} -%\begin{macro}{\l_@@_table_collect_post_tl} -% Three storage areas. -% \begin{macrocode} -\tl_new:N \l_@@_table_collect_tl -\tl_new:N \l_@@_table_collect_pre_tl -\tl_new:N \l_@@_table_collect_post_tl -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\l_@@_number_valid_tl} -% As the \texttt{S} column has to make a judgement about tokens which -% can be part of a number, there is a need to have a list of valid -% tokens. -% \begin{macrocode} -\tl_new:N \l_@@_number_valid_tl -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_table_math_bool} -% A flag used inside the table cell to track math mode: there is -% a need to do things by hand as otherwise the grouping goes -% wrong. -% \begin{macrocode} -\bool_new:N \l_@@_table_math_bool -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\l_@@_table_collect_pre_bool} -%\begin{macro}{\l_@@_table_collect_post_bool} -% Flags for having found a number in an \texttt{S} column. -% \begin{macrocode} -\bool_new:N \l_@@_table_collect_pre_bool -\bool_new:N \l_@@_table_collect_post_bool -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_begin:Nn} -%\begin{macro}{\@@_table_collect_begin:Nw} -%\begin{macro}{\@@_table_collect_begin_s:} -%\begin{macro}{\@@_table_collect_begin_S:} -% The collector starts by setting up local options, then clears and -% initialises the storage and testing system. Font detection for the -% \texttt{S} column happens here as this ensures that it is not inside -% a box, which will give the wrong result for \opt{detect-mode}. The -% |\use_i:nn| removes the |\ignorespaces| from the cell preamble. -% In the basic \LaTeXe{} template there is only an |\ignorespaces| -% before the content, but to deal with any other material we use -% a delimited approach. It's important to grab everything up to the -% end of the template-before-|#| to allow the Appendix~D trick to work -% inside the |peek| code. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_begin:Nn #1#2 - { - \keys_set:nn { siunitx } {#2} - \@@_table_collect_begin:Nw #1 - } -\cs_new_protected:Npn \@@_table_collect_begin:Nw #1#2 \ignorespaces - { \use:c { @@_table_collect_begin_ #1 : } #2 } -\cs_new_protected:Npn \@@_table_collect_begin_s: { - \cs_set_eq:NN \@@_table_collect_token:N - \@@_table_collect_token_s:N - \cs_set_eq:NN \@@_table_print: \@@_table_print_s: - \@@_table_collect_init_s: - \@@_table_collect_get: -} -\cs_new_protected:Npn \@@_table_collect_begin_S: { - \cs_set_eq:NN \@@_table_collect_token:N - \@@_table_collect_token_S:N - \cs_set_eq:NN \@@_table_print: \@@_table_print_S: - \@@_table_collect_init_S: - \@@_detect_font: - \bool_if:NTF \l_@@_number_parse_bool - { \@@_table_collect_get: } - { \@@_table_print_S_direct: } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_braced:n} -% The collection of braced items depends on the column type. So we -% start of with an empty definition. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_braced:n #1 { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_expand:N} -%\begin{macro}{\@@_table_collect_expand_math:N} -% The idea here is to expand content if possible. There are a few -% things to note. Only macros which are not long or protected are -% expanded. There is the possibility that the macro may need the -% contents of the pre-numeral part to be executed, for example see -% \cref{tab:xmpl:calc} in the user part of the documentation. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_expand:N #1 { - \cs_if_eq:NNTF #1 \color - { - \bool_if:NTF \l_@@_table_collect_pre_bool - { - \tl_clear:N \l_@@_number_color_tl - \tl_clear:N \l_@@_unit_color_tl - \tl_put_right:Nn \l_@@_table_collect_pre_tl {#1} - } - { - \bool_set_true:N \l_@@_table_collect_post_bool - \tl_put_right:Nn \l_@@_table_collect_post_tl {#1} - } - } - { - \@@_cs_if_tl:NTF #1 - { - \tl_use:N \l_@@_table_collect_pre_tl - \tl_clear:N \l_@@_table_collect_pre_tl - \cs_set:Npn \@@_table_collect_next: - { \exp_after:wN \@@_table_collect_get: #1 } - } - { - \bool_if:NTF \l_@@_table_collect_pre_bool - { - \tl_put_right:Nn \l_@@_table_collect_pre_tl {#1} - \@@_table_collect_expand_math:N #1 - } - { - \bool_set_true:N \l_@@_table_collect_post_bool - \tl_put_right:Nn \l_@@_table_collect_post_tl {#1} - } - } - } -} -% \end{macrocode} -% There is a need to keep a track of math mode, so that there are no -% disasters when the tokens are boxed up later. The ideal is to know -% the math state of the collected tokens so that appropriate -% steps can be taken to insert math shift tokens later. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_expand_math:N #1 { - \token_if_math_toggle:NTF #1 - { - \bool_if:NTF \l_@@_table_math_bool - { \bool_set_false:N \l_@@_table_math_bool } - { \bool_set_true:N \l_@@_table_math_bool } - } - { - \cs_if_eq:NNTF #1 \( % \) - { \bool_set_true:N \l_@@_table_math_bool } - { % \( - \cs_if_eq:NNT #1 \) - { \bool_set_false:N \l_@@_table_math_bool } - } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_get:} -% The token collection system first has to check that the next argument -% does not start with an opening-brace character. If it does, the -% testing is skipped and the braced token is stored. Otherwise, a check -% is made against various ignored tokens. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_get: - { - \cs_set_eq:NN \@@_table_collect_next: - \@@_table_collect_get: - \peek_catcode_ignore_spaces:NTF \c_group_begin_token - { \@@_table_collect_braced:n } - { \@@_table_collect_not_braced:N } - } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_init:} -% The usual spin-out of basics. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_init: { - \tl_clear:N \l_@@_table_collect_tl - \tl_clear:N \l_@@_table_collect_pre_tl - \tl_clear:N \l_@@_table_collect_post_tl - \bool_set_false:N \l_@@_table_collect_post_bool - \bool_set_false:N \l_@@_table_math_bool -} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@@_table_collect_init_s:} -%\begin{macro}{\@@_table_collect_init_S:} -% Some type-specific definitions. In the \texttt{S} case, the -% initialisation function for numbers is used to set -% \cs{l_@@_number_valid_tl} correctly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_init_s: { - \@@_table_collect_init: - \bool_set_false:N \l_@@_table_collect_pre_bool - \cs_set_protected:Npn \@@_table_collect_braced:n ##1 - { - \tl_put_right:Nn \l_@@_table_collect_tl { {##1} } - \@@_table_collect_next: - } -} -\cs_new_protected:Npn \@@_table_collect_init_S: { - \@@_number_in_init: - \tl_set:Nx \l_@@_number_valid_tl - { - \exp_not:V \l_@@_input_complex_tl - \exp_not:V \l_@@_input_decimal_tl - \exp_not:V \l_@@_input_digit_tl - \exp_not:V \l_@@_input_exponent_tl - \exp_not:V \l_@@_input_ignore_tl - \exp_not:V \l_@@_input_comparator_tl - \exp_not:V \l_@@_input_uncert_close_tl - \exp_not:V \l_@@_input_uncert_open_tl - \exp_not:V \l_@@_input_sign_tl - \exp_not:V \l_@@_input_symbol_tl - } - \bool_set_true:N \l_@@_table_collect_pre_bool - \cs_set_protected:Npn \@@_table_collect_braced:n ##1 - { - \bool_if:NTF \l_@@_table_collect_pre_bool - { \tl_put_right:Nn \l_@@_table_collect_pre_tl { {##1} } } - { - \bool_set_true:N \l_@@_table_collect_post_bool - \tl_put_right:Nn \l_@@_table_collect_post_tl { {##1} } - } - \@@_table_collect_next: - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_next:} -% A holder for the next thing to do. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_next: { } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_newline:} -% The end macro needs to come before the new line is called. The -% print function is redefined so that it only actually does stuff once. -% As each cell is a group anyway, there is no need to save the -% definition of \cs{@@_table_print:}, as it will re-appear on its -% own. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_newline: { - \@@_table_print: - \cs_set_eq:NN \@@_table_print: \prg_do_nothing: - \tabularnewline -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_end:} -% The same concept applies to the \cs{end} macro. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_end: { - \@@_table_print: - \cs_set_eq:NN \@@_table_print: \prg_do_nothing: - \end -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_not_braced:N} -%\begin{macro}{\@@_table_collect_not_braced_aux_i:N} -%\begin{macro}{\@@_table_collect_not_braced_aux_ii:N} -% A few macros are simply passed through to be executed; this is mainly -% so that the table actually works. The newline function needs its own -% function, which is picked up by hand. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_not_braced:N #1 - { - \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D - { - \token_if_eq_meaning:NNF #1 \tex_unskip:D - { \@@_table_collect_not_braced_aux_i:N #1 } - } - \@@_table_collect_next: - } -\AtBeginDocument - { - \@ifpackageloaded { mdwtab } + \tl_map_inline:Nn \l_@@_column_type_tl { - \cs_set_protected:Npn \@@_table_collect_not_braced:N #1 + \@@_declare_column:Nnn #1 { - \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D - { - \token_if_eq_meaning:NNF #1 \tex_unskip:D - { - \token_if_eq_meaning:NNF #1 \tab@setcr - { - \token_if_eq_meaning:NNF #1 \@maybe@unskip - { \@@_table_collect_not_braced_aux_i:N #1 } - } - } - } - \@@_table_collect_next: + \keys_set:nn { siunitx } {##1} + \siunitx_cell_begin:w } + { \siunitx_cell_end: } } - { } } -\cs_new_protected:Npn \@@_table_collect_not_braced_aux_i:N #1 { - \cs_set:Npn \@@_table_collect_not_braced_aux_ii:N ##1 - { - \token_if_eq_meaning:NNT #1 ##1 - { \cs_set_eq:NN \@@_table_collect_next: ##1 } - } - \tl_map_function:nN - { \cs:w \scan_stop: \@@_table_print: } - \@@_table_collect_not_braced_aux_ii:N - \token_if_eq_meaning:NNT \@@_table_collect_next: - \@@_table_collect_get: - { - \token_if_eq_meaning:NNTF #1 \tabularnewline - { - \cs_set_eq:NN \@@_table_collect_next: - \@@_table_collect_newline: - } - { - \token_if_eq_meaning:NNTF #1 \end - { - \cs_set_eq:NN \@@_table_collect_next: - \@@_table_collect_end: - } - { \@@_table_collect_token:N #1 } - } - } -} -\cs_new_protected:Npn \@@_table_collect_not_braced_aux_ii:N #1 { } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\@@_table_collect_token:N} -%\begin{macro}{\@@_table_collect_token_s:N} -% For the \texttt{s} column, every token is added to the same storage -% area, so life is simple. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_token:N #1 { } -\cs_new_protected:Npn \@@_table_collect_token_s:N #1 { - \tl_put_right:Nn \l_@@_table_collect_tl {#1} -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\begin{macro}{\@@_table_collect_token_S:N} -% Not so easy for the \texttt{S} column type. If the content is after -% a number, things are easy. On the other hand, if the token might be -% a number, then a check is made. It the token is still unmatched, then -% it is passed on to the expansion handler. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_collect_token_S:N #1 { - \bool_if:NTF \l_@@_table_collect_post_bool - { \tl_put_right:Nn \l_@@_table_collect_post_tl {#1} } - { - \tl_if_in:NnTF \l_@@_number_valid_tl {#1} - { - \bool_set_false:N \l_@@_table_collect_pre_bool - \tl_put_right:Nn \l_@@_table_collect_tl {#1} - } - { \@@_table_collect_expand:N #1 } - } -} % \end{macrocode} -%\end{macro} -% -% \subsection{Table printing: general code} +% \end{macro} % -% Getting the general alignment correct in tables is made more -% complex than one would like by the \pkg{colortbl} package. In the -% original \LaTeXe{} definition, cell material is centred by a -% construction of the (primitive) form -% \begin{verbatim} -% \hfil -% # -% \hfil -% \end{verbatim} -% which only uses \texttt{fil} stretch. That is altered by -% \pkg{colortbl} to broadly -% \begin{verbatim} -% \hskip 0 pt plus 0.5 fill -% \kern 0 pt -% # -% \hskip 0 pt plus 0.5 fill -% \end{verbatim} -% which means there is \texttt{fill} stretch to worry about and -% the kern as well. +% \subsection{Document commands in bookmarks} % -% \begin{variable}{\c_@@_one_fill_skip} -% A fixed skip of one \texttt{fill}. -% \begin{macrocode} -\skip_const:Nn \c_@@_one_fill_skip { 0pt plus 1fill } -% \end{macrocode} -% \end{variable} +% In bookmarks, the \pkg{siunitx} document commands need to produce simple +% strings that represent their input as far a possible. % -% \begin{macro}{\@@_table_colortbl_correction:} -% If the package \pkg{colortbl} is loaded, there is a need to allow -% that it changes how centring is carried out. +% \begin{macro}{\@@_bookmark_cmd:Nn} +% To keep things fast, expandable versions of the document command are +% created only once. As here we are at the top-level for internal names, +% we can use the various parts of \pkg{siunitx-compound} that would otherwise +% be inaccessible. % \begin{macrocode} -\AtBeginDocument +\cs_new_protected:Npn \@@_bookmark_cmd:Nnn #1#2#3 { - \@ifpackageloaded { colortbl } - { - \cs_new_protected:Npn \@@_table_colortbl_correction: - { - \skip_horizontal:n { 0pt plus -0.5fill } - \tex_kern:D \c_zero_skip - } - } - { \cs_new_protected:Npn \@@_table_colortbl_correction: { } } + \exp_args:Nc \DeclareExpandableDocumentCommand + { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) } + {#2} {#3} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_align_left:n} -% \begin{macro}{\@@_table_align_right:n} -% These are simple shortcuts to keep life clearer in the rest of the -% code. The idea is that the kern acts as a \enquote{stop} for the -% horizontal skip. The correction for \pkg{colortbl} is separate as the -% spacing needs to be explicitly deleted. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_align_left:n #1 +\@@_bookmark_cmd:Nnn \qty { o m m } { #2 ~ #3 } +\@@_bookmark_cmd:Nnn \ang { m } { \@@_angle:n {#1} } +\@@_bookmark_cmd:Nnn \num { o m } { #2 } +\@@_bookmark_cmd:Nnn \unit { o m } { #2 } +\@@_bookmark_cmd:Nnn \numlist { o m } { - \@@_table_colortbl_correction: - \skip_horizontal:n {#1} - \tex_kern:D \c_zero_skip + \@@_list_use:nnVVV {#2} { } + \l_siunitx_list_separator_pair_tl + \l_siunitx_list_separator_tl + \l_siunitx_list_separator_final_tl } -\cs_new_protected:Npn \@@_table_align_right:n #1 +\@@_bookmark_cmd:Nnn \qtylist { o m m } { - \skip_horizontal:n { \c_@@_one_fill_skip - #1 } - \tex_kern:D \c_zero_skip - \@@_table_colortbl_correction: + \@@_list_use:nnVVV {#2} {#3} + \l_siunitx_list_separator_pair_tl + \l_siunitx_list_separator_tl + \l_siunitx_list_separator_final_tl } +\@@_bookmark_cmd:Nnn \numproduct { o m } { } +\@@_bookmark_cmd:Nnn \qtyproduct { o m m } { } +\@@_bookmark_cmd:Nnn \numrange { o m m } + { #2 \tl_use:N \l_siunitx_range_phrase_tl #3 } +\@@_bookmark_cmd:Nnn \qtyrange { o m m m } + { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 } % \end{macrocode} % \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_table_column_begin:} -% \begin{macro}{\@@_table_column_end:} -% \begin{macrocode} -\cs_new_eq:NN \@@_table_column_begin:n \@@_table_align_left:n -\cs_new_eq:NN \@@_table_column_end:n \@@_table_align_right:n -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% Setting up for a fixed column width is done so that the check is -% made at the key-setting stage. In that way, there will be some -% speed gained if the key is set before the table, as the comparison -% is not made for every cell. +% We also need the v2 names. % \begin{macrocode} -\keys_define:nn { siunitx } +\@@_bookmark_cmd:Nnn \si { o m } { #2 } +\@@_bookmark_cmd:Nnn \SI { o m O { } m } { #3 #2 ~ #4 } +\@@_bookmark_cmd:Nnn \SIlist { o m m } { - table-column-width .code:n = - { - \dim_compare:nNnTF {#1} = { \c_zero_dim } - { - \cs_set_eq:NN \@@_table_column_begin:n - \@@_table_align_left:n - \cs_set_eq:NN \@@_table_column_end:n - \@@_table_align_right:n - } - { - \cs_set_protected:Npn \@@_table_column_begin:n ##1 - { - \@@_table_colortbl_correction: - \tex_hbox:D to \dim_eval:n {#1} - \c_group_begin_token - \skip_horizontal:n {##1} - \tex_kern:D \c_zero_skip - } - \cs_set_protected:Npn \@@_table_column_end:n ##1 - { - \skip_horizontal:n { \c_@@_one_fill_skip - ##1 } - \tex_kern:D \c_zero_skip - \c_group_end_token - \@@_table_colortbl_correction: - } - } - } - } -% \end{macrocode} -% -% \subsection{Printing units in \texttt{s} columns} -% -% The easiest type of printing is the \texttt{s} column. Here, there is -% no real problem with alignment. All that has to happen is to print the -% collected input as the argument to the internal part of an \cs{si} -% function. -% -% \begin{variable}{\l_@@_table_unit_align_skip} -% The spacing used is stored as a skip, which needs to be set up first. -% \begin{macrocode} -\skip_new:N \l_@@_table_unit_align_skip -% \end{macrocode} -% \end{variable} -% -% \begin{macrocode} -\keys_define:nn { siunitx } - { - table-unit-alignment .choice:, - table-unit-alignment / - center .code:n = - { - \skip_set:Nn \l_@@_table_unit_align_skip - { 0pt plus 0.5fill } - }, - table-unit-alignment / - left .code:n = - { \skip_set:Nn \l_@@_table_unit_align_skip { \c_zero_skip } }, - table-unit-alignment / - right .code:n = - { - \skip_set:Nn \l_@@_table_unit_align_skip - { 0pt plus 1fill } - } + \@@_list_use:nnVVV {#2} {#3} + \l_siunitx_list_separator_pair_tl + \l_siunitx_list_separator_tl + \l_siunitx_list_separator_final_tl } -\keys_set:nn { siunitx } { table-unit-alignment = center } +\@@_bookmark_cmd:Nnn \SIrange { o m m m } + { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 } % \end{macrocode} % -% \begin{macro}{\@@_table_print_s:} -% Actually printing an \texttt{s} column is not very complex. There is -% some spacing to do at each side, with the main part of the job being -% to print the material using the internal version of \cs{si}. +% \begin{variable}{\c_@@_bookmark_seq} +% Commands usable in bookmarks % \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_s: +\seq_const_from_clist:Nn \c_@@_bookmark_seq { - \@@_table_column_begin:n { \l_@@_table_unit_align_skip } - \tl_if_empty:NF \l_@@_table_collect_tl - { \@@_unit_output:Vn \l_@@_table_collect_tl { } } - \@@_table_column_end:n { \l_@@_table_unit_align_skip } + \ang , \qty , \num , \unit , + \numlist , \qtylist , + \numrange , \qtyrange , + \si , \SI , \SIlist , \SIrange } % \end{macrocode} -% \end{macro} -% -% \subsection{Formatting and printing in tables} -% -% With the content grabbed, the next stage is to turn it into formatted -% output then print it. Most of the formatting is done elsewhere, so -% most of the work here is in printing. -% -% \begin{variable}{\l_@@_table_model_prop} -% A place to store the model for reserved-space table columns. -% \begin{macrocode} -\prop_new:N \l_@@_table_model_prop -% \end{macrocode} -% \end{variable} -% -% \begin{variable} -% { -% \l_@@_table_exponent_dim , -% \l_@@_table_integer_dim , -% \l_@@_table_mantissa_dim , -% \l_@@_table_marker_dim , -% \l_@@_table_result_dim , -% \l_@@_table_uncert_dim -% } -% Dimensions to track the various spaces needed. -% \begin{macrocode} -\dim_new:N \l_@@_table_exponent_dim -\dim_new:N \l_@@_table_integer_dim -\dim_new:N \l_@@_table_mantissa_dim -\dim_new:N \l_@@_table_marker_dim -\dim_new:N \l_@@_table_result_dim -\dim_new:N \l_@@_table_uncert_dim -% \end{macrocode} -%\end{variable} -% -% \begin{variable} -% {\l_@@_table_fill_pre_dim, \l_@@_table_fill_post_dim} -% Calculating the fill needed can be a bit complicated, so is best -% done using a dedicated dimension. There is a second one for cases dealing -% with fill at the end of a number, where there may be some rearrangement. -% \begin{macrocode} -\dim_new:N \l_@@_table_fill_pre_dim -\dim_new:N \l_@@_table_fill_post_dim -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_table_fill_mid_dim} -% For the reserved space approach there is also the need for a third -% piece of fill, which may or may not be used. -% \begin{macrocode} -\dim_new:N \l_@@_table_fill_mid_dim -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_table_pre_box, \l_@@_table_post_box} -% Boxes for the content before and after the numerical part. -% \begin{macrocode} -\box_new:N \l_@@_table_pre_box -\box_new:N \l_@@_table_post_box -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_table_mantissa_box} -% When printing with space reserved, the mantissa needs to hang around -% for a while. This is best done by storing the typeset result in a box. -% \begin{macrocode} -\box_new:N \l_@@_table_mantissa_box -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_table_result_box} -% The box which is actually needed for printing. -% \begin{macrocode} -\box_new:N \l_@@_table_result_box -% \end{macrocode} -% \end{variable} -% -% \begin{variable} -% {\l_@@_table_number_align_skip, \l_@@_table_text_align_skip} -% Skips for aligning text and numbers. -% \begin{macrocode} -\skip_new:N \l_@@_table_number_align_skip -\skip_new:N \l_@@_table_text_align_skip -% \end{macrocode} % \end{variable} % -% \begin{macro} -% { -% \@@_table_print_S_direct_main: , -% \@@_table_print_S_parsed: -% } -% \begin{macro}{\@@_table_print_S_reserved_store_fill:n} -% Various functions which are set up by the option system, and so are -% reserved here first for completeness. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_direct_main: { } -\cs_new_protected:Npn \@@_table_print_S_parsed: { } -\cs_new_protected:Npn \@@_table_print_S_reserved_store_fill:n #1 { } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{variable} -% { -% \l_@@_table_align_exponent_bool, -% \l_@@_table_align_text_pre_bool, -% \l_@@_table_align_text_post_bool, -% \l_@@_table_align_uncert_bool, -% \l_@@_table_auto_round_bool, -% \l_@@_table_omit_exponent_bool, -% \l_@@_table_parse_only_bool, -% \l_@@_table_pre_tl, -% \l_@@_table_post_tl -% } +% Activate the document commands here: the unit macros are handled in +% \pkg{siunitx-final}. % \begin{macrocode} -\keys_define:nn { siunitx } +\AtBeginDocument { - table-align-comparator .choice:, - table-align-comparator / - false .code:n = - { - \cs_set_eq:NN \@@_table_print_S_reserved_store_fill:n - \@@_table_print_S_reserved_store_fill_pre:n - }, - table-align-comparator / - true .code:n = - { - \cs_set_eq:NN \@@_table_print_S_reserved_store_fill:n - \@@_table_print_S_reserved_store_fill_mid:n - }, - table-align-comparator .default:n = true, - table-align-exponent .bool_set:N = - \l_@@_table_align_exponent_bool, - table-align-text-pre .bool_set:N = - \l_@@_table_align_text_pre_bool, - table-align-text-post .bool_set:N = - \l_@@_table_align_text_post_bool, - table-align-uncertainty .bool_set:N = \l_@@_table_align_uncert_bool, - table-auto-round .bool_set:N = \l_@@_table_auto_round_bool, - table-number-alignment .choice:, - table-number-alignment / - center .code:n = - { - \skip_set:Nn \l_@@_table_number_align_skip - { 0pt plus 0.5fill } - \cs_set_eq:NN \@@_table_print_S_direct_main: - \@@_table_print_S_direct_reserved: - \cs_set_eq:NN \@@_table_print_S_parsed: - \@@_table_print_S_reserved: - }, - table-number-alignment / - center-decimal-marker .code:n = - { - \skip_set:Nn \l_@@_table_number_align_skip - { 0pt plus 0.5fill } - \cs_set_eq:NN \@@_table_print_S_direct_main: - \@@_table_print_S_direct_centered: - \cs_set_eq:NN \@@_table_print_S_parsed: - \@@_table_print_S_centered: - }, - table-number-alignment / - left .code:n = - { - \skip_zero:N \l_@@_table_number_align_skip - \cs_set_eq:NN \@@_table_print_S_direct_main: - \@@_table_print_S_direct_reserved: - \cs_set_eq:NN \@@_table_print_S_parsed: - \@@_table_print_S_reserved: - }, - table-number-alignment / - right .code:n = - { - \skip_set:Nn \l_@@_table_number_align_skip - { 0pt plus 1fill } - \cs_set_eq:NN \@@_table_print_S_direct_main: - \@@_table_print_S_direct_reserved: - \cs_set_eq:NN \@@_table_print_S_parsed: - \@@_table_print_S_reserved: - }, - table-omit-exponent .bool_set:N = - \l_@@_table_omit_exponent_bool, - table-text-alignment .choice:, - table-text-alignment / - center .code:n = - { - \skip_set:Nn \l_@@_table_text_align_skip - { 0pt plus 0.5fill } - }, - table-text-alignment / - left .code:n = - { \skip_zero:N \l_@@_table_text_align_skip }, - table-text-alignment / - right .code:n = - { - \skip_set:Nn \l_@@_table_text_align_skip - { 0pt plus 1fill } - }, - table-comparator .choice:, - table-comparator / - false .code:n = - { \prop_remove:Nn \l_@@_table_model_prop { comparator } }, - table-comparator / - true .code:n = - { \prop_put:Nnn \l_@@_table_model_prop { comparator } { > } }, - table-comparator .default:n = true, - table-figures-decimal .code:n = + \@ifpackageloaded { hyperref } { - \int_compare:nNnTF {#1} = 0 + \pdfstringdefDisableCommands { - \prop_remove:Nn \l_@@_table_model_prop { mantissa-decimal } - \prop_remove:Nn \l_@@_table_model_prop { mantissa-decimal-raw } - \prop_remove:Nn \l_@@_table_model_prop - { mantissa-decimal-marker } - \prop_if_in:NnTF \l_@@_table_model_prop { mantissa-integer } + \seq_map_inline:Nn \c_@@_bookmark_seq { - \prop_put:Nnn \l_@@_table_model_prop { mantissa } - { true } + \cs_set_eq:Nc #1 + { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) } } - { \prop_remove:Nn \l_@@_table_model_prop { mantissa } } - } - { - \prop_put:Nnx \l_@@_table_model_prop { mantissa-decimal } - { \prg_replicate:nn {#1} { 8 } } - \prop_put:Nnn \l_@@_table_model_prop { mantissa-decimal-raw } - {#1} - \prop_put:Nnn \l_@@_table_model_prop { mantissa } { true } - \prop_put:NnV \l_@@_table_model_prop - { mantissa-decimal-marker } \l_@@_output_decimal_tl - } - }, - table-figures-exponent .code:n = - { - \int_compare:nNnTF {#1} = 0 - { \prop_remove:Nn \l_@@_table_model_prop { exponent-integer } } - { - \prop_put:Nnx \l_@@_table_model_prop { exponent-integer } - { \prg_replicate:nn {#1} { 8 } } - \prop_put:Nnn \l_@@_table_model_prop { exponent } { true } } - }, - table-figures-integer .code:n = - { - \int_compare:nNnTF {#1} = 0 + \pdfstringdefDisableCommands { - \prop_remove:Nn \l_@@_table_model_prop { mantissa-integer } - \prop_if_in:NnTF \l_@@_table_model_prop { mantissa-decimal } + \siunitx_unit_pdfstring_context: + \cs_if_exist:NT \FB@fg { \def \fg { \FB@fg } } + \edef \H { - \prop_put:Nnn \l_@@_table_model_prop { mantissa } - { true } + \exp_not:c { PU-cmd } + \exp_not:N \H + \exp_not:c { PU \token_to_str:N \H } } - { \prop_remove:Nn \l_@@_table_model_prop { mantissa } } - } - { - \prop_put:Nnx \l_@@_table_model_prop { mantissa-integer } - { \prg_replicate:nn {#1} { 8 } } - \prop_put:Nnn \l_@@_table_model_prop { mantissa } { true } - } - }, - table-figures-uncertainty .code:n = - { - \int_compare:nNnTF {#1} = 0 - { \prop_remove:Nn \l_@@_table_model_prop { mantissa-uncertainty } } - { - \prop_put:Nnx \l_@@_table_model_prop { mantissa-uncertainty } - { \prg_replicate:nn {#1} { 8 } } - } - }, - table-parse-only .bool_set:N = \l_@@_table_parse_only_bool, - table-space-text-pre .tl_set:N = \l_@@_table_pre_tl, - table-space-text-post .tl_set:N = \l_@@_table_post_tl, - table-sign-exponent .choice:, - table-sign-exponent / true .code:n = - { \prop_put:Nnn \l_@@_table_model_prop { exponent-sign } { - } }, - table-sign-exponent / false .code:n = - { \prop_remove:Nn \l_@@_table_model_prop { exponent-sign } }, - table-sign-exponent .default:n = true, - table-sign-mantissa .choice:, - table-sign-mantissa / true .code:n = - { \prop_put:Nnn \l_@@_table_model_prop { mantissa-sign } { - } }, - table-sign-mantissa / false .code:n = - { \prop_remove:Nn \l_@@_table_model_prop { mantissa-sign } }, - table-sign-mantissa .default:n = true, - } -% \end{macrocode} -% \end{variable} -% -% A meta-choice for all table alignment is also provided. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - table-alignment .meta:n = - { - table-number-alignment = #1, - table-text-alignment = #1, - table-unit-alignment = #1 - } - } -% \end{macrocode} -% -% Another special option. This converts a number format in compacted -% form into the various internal settings needed. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - table-format .code:n = - { - \bool_set_eq:NN \l_@@_process_plus_saved_bool \l_@@_process_plus_bool - \bool_set_true:N \l_@@_process_plus_bool - \@@_number_in_parse:n {#1} - \prop_set_eq:NN \l_@@_table_model_prop \l_@@_number_in_prop - \tl_clear:N \l_@@_tmpa_tl - \prop_get:NnNT \l_@@_number_in_prop { mantissa-integer } - \l_@@_tmpb_tl - { - \tl_set:Nx \l_@@_tmpa_tl - { table-figures-integer = \l_@@_tmpb_tl } - } - \prop_get:NnNT \l_@@_number_in_prop { mantissa-decimal } - \l_@@_tmpb_tl - { - \clist_put_right:Nx \l_@@_tmpa_tl - { table-figures-decimal = \l_@@_tmpb_tl } - } - \prop_get:NnNT \l_@@_number_in_prop { mantissa-uncertainty } - \l_@@_tmpb_tl - { - \clist_put_right:Nx \l_@@_tmpa_tl - { table-figures-uncertainty = \l_@@_tmpb_tl } - } - \prop_if_in:NnTF \l_@@_number_in_prop { mantissa-sign } - { - \clist_put_right:Nn \l_@@_tmpa_tl - { table-sign-mantissa =true } - } - { - \clist_put_right:Nn \l_@@_tmpa_tl - { table-sign-mantissa =false } - } - \prop_get:NnNT \l_@@_number_in_prop { exponent-integer } - \l_@@_tmpb_tl - { - \clist_put_right:Nx \l_@@_tmpa_tl - { table-figures-exponent = \l_@@_tmpb_tl } - } - \prop_if_in:NnTF \l_@@_number_in_prop { exponent-sign } - { - \clist_put_right:Nn \l_@@_tmpa_tl - { table-sign-exponent =true } - } - { - \clist_put_right:Nn \l_@@_tmpa_tl - { table-sign-exponent =false } - } - \clist_put_right:Nn \l_@@_tmpa_tl - { table-number-alignment = center } - \keys_set:nV { siunitx } \l_@@_tmpa_tl - \bool_set_eq:NN \l_@@_process_plus_bool \l_@@_process_plus_saved_bool - } - } -\bool_new:N \l_@@_process_plus_saved_bool -% \end{macrocode} -% -% \begin{macro}{\@@_table_print_S:} -% The main printing function makes a choice depending on whether there is -% any numerical part to print at all. This affects which set of skips to -% insert. Font detection for the \texttt{S} column is included here as -% this is needed to do this work outside of an \cs{hbox}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S: - { - \bool_if:NTF \l_@@_table_collect_pre_bool - { - \@@_table_column_begin:n { \l_@@_table_text_align_skip } - \l_@@_table_collect_pre_tl - \@@_table_column_end:n { \l_@@_table_text_align_skip } - } - { - \@@_table_column_begin:n { \l_@@_table_number_align_skip } - \bool_if:NTF \l_@@_table_parse_only_bool - { \@@_table_print_S_no_alignment: } - { \@@_table_print_S_alignment: } - \bool_if:NTF \l_@@_table_align_text_pre_bool - { \@@_table_print_S_pre_aligned: } - { \@@_table_print_S_pre_not_aligned: } - \box_use:N \l_@@_table_result_box - \bool_if:NTF \l_@@_table_align_text_post_bool - { \@@_table_print_S_post_aligned: } - { \@@_table_print_S_post_not_aligned: } - \@@_table_column_end:n { \l_@@_table_number_align_skip } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_no_alignment:} -% With no alignment to do, the code can be pretty simple. The collected -% number is simply printed between the two non-numerical parts. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_no_alignment: - { - \l_@@_table_collect_pre_tl - \@@_number_output:V \l_@@_table_collect_tl - \l_@@_table_collect_post_tl - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_alignment:} -% This is a pass-through, so that the appropriate alignment mode is -% retained without needing to retest on each use. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_alignment: - { \@@_table_print_S_parsed: } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_parse:} -% A modified version of the number parser for tables. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_parse: - { - \bool_set_false:N \l_@@_error_bool - \@@_number_in_parse:V \l_@@_table_collect_tl - \bool_if:NF \l_@@_error_bool - { - \bool_if:NTF \l_@@_table_omit_exponent_bool - { - \bool_set_true:N \l_@@_process_fixed_bool - \@@_number_process: - \prop_remove:Nn \l_@@_number_in_prop { exponent } - \prop_remove:Nn \l_@@_number_in_prop { exponent-integer } - } - { \@@_number_process: } - \@@_number_format: - \@@_number_output_color: - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_measure:NN} -% A short routine to measure up whatever has been extracted from the -% storage system. Boxing up is avoided for the empty cases, as this saves -% a little time(the print routine is relatively slow). -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_measure:NN #1#2 - { - \tl_if_empty:NTF #1 - { \dim_zero:N #2 } - { - \group_begin: - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } #1 } - \exp_args:NNNo \group_end: - \dim_set:Nn #2 { \dim_use:N \box_wd:N \l_@@_tmp_box } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \@@_table_print_S_pre_aligned: , -% \@@_table_print_S_pre_not_aligned: , -% \@@_table_print_S_post_aligned: , -% \@@_table_print_S_post_not_aligned: -% } -% The non-numerical material is inserted along with the filler needed -% to maintain alignment. The order in which the two are inserted depends -% on whether those parts are also aligned. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_pre_aligned: - { - \box_use:N \l_@@_table_pre_box - \hbox_to_wd:nn { \l_@@_table_fill_pre_dim } { \tex_hfil:D } - } -\cs_new_protected:Npn \@@_table_print_S_pre_not_aligned: - { - \hbox_to_wd:nn { \l_@@_table_fill_pre_dim } { \tex_hfil:D } - \box_use:N \l_@@_table_pre_box - } -\cs_new_protected:Npn \@@_table_print_S_post_aligned: - { - \hbox_to_wd:nn { \l_@@_table_fill_post_dim } { \tex_hfil:D } - \box_use:N \l_@@_table_post_box - } -\cs_new_protected:Npn \@@_table_print_S_post_not_aligned: - { - \box_use:N \l_@@_table_post_box - \hbox_to_wd:nn { \l_@@_table_fill_post_dim } { \tex_hfil:D } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Printing the \texttt{S} column with the decimal marker centred} -% -% \begin{macro}{\@@_table_print_S_centered:} -% The main routine for decimal-centred alignment works by boxing up the -% entire output, the integer part and the decimal marker. It then works -% out which part is bigger and calculates the fill correction accordingly. -% Once all of that is done, the various boxes and fill can be inserted. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_centered: - { - \@@_table_print_S_centered_ends: - \bool_if:NT \l_@@_table_math_bool { \c_math_toggle_token } - \@@_table_print_S_parse: - \bool_if:NF \l_@@_error_bool - { - \@@_table_print_S_centered_measure: - \bool_if:NT \l_@@_table_math_bool { \c_math_toggle_token } - \dim_set:Nn \l_@@_table_fill_pre_dim - { - \l_@@_table_result_dim - - \l_@@_table_integer_dim - - \l_@@_table_marker_dim - } - \dim_compare:nNnTF \l_@@_table_integer_dim > - \l_@@_table_fill_pre_dim - { \@@_table_print_S_centered_integer: } - { \@@_table_print_S_centered_decimal: } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_centered_ends:} -% To deal with the material outside of the number, the first step is to -% box up both parts. If the pre-numeral part has no width, the tokens are -% inserted into the input stream to cover cases where they make a change -% to the colour, font or so forth. After that, the narrower of the two -% boxes is made the same size as the wider: this maintains the alignment. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_centered_ends: - { - \hbox_set:Nn \l_@@_table_pre_box - { - { - \l_@@_table_collect_pre_tl - \bool_if:NT \l_@@_table_math_bool - { - \scan_stop: - \c_math_toggle_token - } - } - } - \dim_compare:nNnT - { \box_wd:N \l_@@_table_pre_box } = \c_zero_dim - { - \box_clear:N \l_@@_table_pre_box - \l_@@_table_collect_pre_tl - \bool_set_false:N \l_@@_font_set_bool - } - \hbox_set:Nn \l_@@_table_post_box - { - \bool_if:NT \l_@@_table_math_bool - { - \c_math_toggle_token - \scan_stop: - } - \l_@@_table_collect_post_tl - } - \dim_compare:nNnTF - { \box_wd:N \l_@@_table_pre_box } > - { \box_wd:N \l_@@_table_post_box } - { - \hbox_set_to_wd:Nnn \l_@@_table_post_box - { \box_wd:N \l_@@_table_pre_box } - { - \hbox_unpack:N \l_@@_table_post_box - \tex_hfil:D - } - } - { - \hbox_set_to_wd:Nnn \l_@@_table_pre_box - { \box_wd:N \l_@@_table_post_box } - { - \tex_hfil:D - \hbox_unpack:N \l_@@_table_pre_box - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_centered_measure:} -% \begin{macro} -% { -% \@@_table_print_S_centered_measure_int_part: , -% \@@_table_print_S_centered_measure_marker: , -% \@@_table_print_S_centered_measure_result: -% } -% Here, there are three parts of the number to measure: the integer part, -% the decimal marker and the entire number. Most of the work consists -% of collecting up parts of the number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_centered_measure: - { - \@@_table_print_S_centered_measure_int_part: - \@@_table_print_S_centered_measure_marker: - \@@_table_print_S_centered_measure_result: - } -\cs_new_protected:Npn \@@_table_print_S_centered_measure_int_part: - { - \prop_get:NnNF \l_@@_number_out_prop { comparator } \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNT \l_@@_number_out_prop { mantissa-sign } - \l_@@_tmpb_tl - { \tl_put_right:No \l_@@_tmpa_tl \l_@@_tmpb_tl } - \prop_get:NnNT \l_@@_number_out_prop { mantissa-integer } - \l_@@_tmpb_tl - { \tl_put_right:No \l_@@_tmpa_tl \l_@@_tmpb_tl } - \@@_table_print_S_measure:NN \l_@@_tmpa_tl - \l_@@_table_integer_dim - } -\cs_new_protected:Npn \@@_table_print_S_centered_measure_marker: - { - \@@_table_print_S_measure:NN \l_@@_output_decimal_tl - \l_@@_table_marker_dim - } -% \end{macrocode} -% As the overall result will be needed later, the boxing up here is done -% using a named box that will be retained. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_centered_measure_result: - { - \prop_get:NnN \l_@@_number_out_prop { result } \l_@@_tmpa_tl - \hbox_set:Nn \l_@@_table_result_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \dim_set:Nn \l_@@_table_result_dim - { \box_wd:N \l_@@_table_result_box } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro} -% { -% \@@_table_print_S_centered_integer: , -% \@@_table_print_S_centered_decimal: -% } -% The appropriate place to insert the fill is determined by whether the -% integer or decimal part of the number is bigger. Two dimensions are -% therefore set, for fill before the number and after it. One of these -% will always be zero. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_centered_integer: - { - \dim_set:Nn \l_@@_table_fill_post_dim - { \l_@@_table_integer_dim - \l_@@_table_fill_pre_dim } - \dim_zero:N \l_@@_table_fill_pre_dim - } -\cs_new_protected:Npn \@@_table_print_S_centered_decimal: - { - \dim_sub:Nn \l_@@_table_fill_pre_dim - { \l_@@_table_integer_dim } - \dim_zero:N \l_@@_table_fill_post_dim - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Printing the \texttt{S} column with space reserved} -% -% \begin{macro}{\@@_table_print_S_reserved:} -% The procedure for inserting a number with space reserved requires a model -% for each part of the number. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved: - { - \@@_table_print_S_reserved_init: - \@@_table_print_S_reserved_ends: - \bool_if:NT \l_@@_table_auto_round_bool - { \@@_table_print_S_reserved_round_auto: } - \@@_table_print_S_parse: - \bool_if:NF \l_@@_error_bool - { - \bool_if:NT \l_@@_table_math_bool { \c_math_toggle_token } - \@@_table_print_S_reserved_comparator: - \@@_table_print_S_reserved_mantissa: - \@@_table_print_S_reserved_exponent: - \bool_if:NT \l_@@_table_math_bool { \c_math_toggle_token } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_reserved_init:} -% The creation of a model for the cell to follow. Creation of the finalised -% model is done here so that all of the other options will apply without -% needing complex internal tracking. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_init: - { - \dim_zero:N \l_@@_table_fill_mid_dim - \dim_zero:N \l_@@_table_fill_post_dim - \prop_set_eq:NN \l_@@_number_in_prop \l_@@_table_model_prop - \@@_number_process_sign: - \@@_number_process_zero_fill: - \@@_number_process_mantissa: - \prop_if_in:NnF \l_@@_number_in_prop { symbolic } - { \@@_number_process_uncertainty: } - \@@_number_format: - \prop_get:NnNT \l_@@_table_model_prop { mantissa-decimal-raw } - \l_@@_tmpa_tl - { - \prop_put:NnV \l_@@_number_out_prop { mantissa-decimal-raw } - \l_@@_tmpa_tl - } - \prop_set_eq:NN \l_@@_table_model_prop \l_@@_number_out_prop - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_reserved_ends:} -% The end material here is boxed up into the space already reserved. -% That means doing two boxing ups: one for the model, and one for the -% real thing. As in the centred case, if the pre-numeral part has no -% width then the tokens are inserted \enquote{as is}. To avoid any issues -% with people forgetting to reserve space for the pre-numeral part, it is -% boxed up first at natural width so that the measurement is accurate. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_ends: - { - \hbox_set:Nn \l_@@_table_pre_box - { - { - \l_@@_table_collect_pre_tl - \bool_if:NT \l_@@_table_math_bool - { - \scan_stop: - \c_math_toggle_token - } - } - } - \dim_compare:nNnT - { \box_wd:N \l_@@_table_pre_box } = \c_zero_dim - { - \box_clear:N \l_@@_table_pre_box - \l_@@_table_collect_pre_tl - \bool_set_false:N \l_@@_font_set_bool - } - \hbox_set:Nn \l_@@_tmp_box { { \l_@@_table_pre_tl } } - \hbox_set_to_wd:Nnn \l_@@_table_pre_box - { \box_wd:N \l_@@_tmp_box } - { - \tex_hfil:D - \hbox_unpack:N \l_@@_table_pre_box - } - \hbox_set:Nn \l_@@_tmp_box { \l_@@_table_post_tl } - \hbox_set_to_wd:Nnn \l_@@_table_post_box - { \box_wd:N \l_@@_tmp_box } - { - { - \bool_if:NT \l_@@_table_math_bool - { - \c_math_toggle_token - \scan_stop: - } - \l_@@_table_collect_post_tl - } - \tex_hfil:D - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_reserved_round_auto:} -% For auto-rounding, the approach is to find how many decimal digits are -% allowed for, and if there are none to simply set the rounding value to -% zero. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_round_auto: - { - \prop_get:NnNTF \l_@@_table_model_prop { mantissa-decimal-raw } - \l_@@_tmpa_tl - { \int_set:Nn \l_@@_process_precision_int { \l_@@_tmpa_tl } } - { \int_zero:N \l_@@_process_precision_int } - \tl_set:Nn \l_@@_round_tl { places } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_table_print_S_reserved_comparator:} -% The comparator is quite simple to deal with. Assuming that there is a -% comparator in the model, this is measured for the reserved width. The -% real comparator can then simply be typeset in a box of the same size. -% If there is no comparator in the real case, then the space added to -% that for filling: this is needed so that any pre-note can be aligned -% freely. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_comparator: - { - \prop_get:NnNTF \l_@@_table_model_prop { comparator } - \l_@@_tmpa_tl - { - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \prop_get:NnNTF \l_@@_number_out_prop { comparator } - \l_@@_tmpa_tl - { - \hbox_set_to_wd:Nnn \l_@@_table_result_box - { \box_wd:N \l_@@_tmp_box } - { \@@_print:nV { number } \l_@@_tmpa_tl } - } - { - \dim_add:Nn \l_@@_table_fill_pre_dim - { \box_wd:N \l_@@_tmp_box } - \cs_set_eq:NN \@@_table_print_S_reserved_store_fill:n - \@@_table_print_S_reserved_store_fill_pre:n - } - } - { - \cs_set_eq:NN \@@_table_print_S_reserved_store_fill:n - \@@_table_print_S_reserved_store_fill_pre:n - \prop_if_in:NnT \l_@@_number_out_prop { comparator } - { - \msg_error:nnx { siunitx } { table-partial-number } - { a~comparator } } } + { } } % \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \@@_table_print_S_reserved_store_fill_pre:n , -% \@@_table_print_S_reserved_store_fill_mid:n -% } -% To allow for the various alignment options, fill is stored in a -% flexible way. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_store_fill_pre:n - { \dim_add:Nn \l_@@_table_fill_pre_dim } -\cs_new_protected:Npn \@@_table_print_S_reserved_store_fill_mid:n - { \dim_add:Nn \l_@@_table_fill_mid_dim } -% \end{macrocode} -% \end{macro} % -% \begin{macro}{\@@_table_print_S_reserved_mantissa:} -% \begin{macro} -% { -% \@@_table_print_S_reserved_mantissa_parts: , -% \@@_table_print_S_reserved_mantissa_integer: -% } -% The mantissa of a number may contain a sign, an integer part, a -% decimal marker, a decimal part and a non-separated uncertainty. That -% means that there are two ways to deal with the alignment. Each part -% could be done separately, or a correction can be made after setting -% the combined mantissa. Here, the later approach is taken. The first -% step is to deal with the mantissa as a whole: work out show much space -% to reserve, and see if there is anything at all to put in it. The -% complexity only starts if there is a mantissa in the current cell. +% \begin{macro}[EXP]{\@@_angle:n} +% \begin{macro}[EXP]{\@@_angle:w} +% Expandable splitting of the angle: simply enough, also outputs the % \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_mantissa: +\cs_new:Npn \@@_angle:n #1 + { \@@_angle:w #1 ; ; ; \q_stop } +\cs_new:Npn \@@_angle:w #1 ; #2 ; #3 ; #4 \q_stop { - \prop_get:NnNTF \l_@@_table_model_prop { mantissa } - \l_@@_tmpa_tl - { - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \prop_get:NnNTF \l_@@_number_out_prop { mantissa } - \l_@@_tmpa_tl - { - \dim_set:Nn \l_@@_table_mantissa_dim - { \box_wd:N \l_@@_tmp_box } - \hbox_set:Nn \l_@@_table_mantissa_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \@@_table_print_S_reserved_mantissa_parts: - } - { - \@@_table_print_S_reserved_store_fill:n - { \box_wd:N \l_@@_tmp_box } - } - } - { - \prop_if_in:NnT \l_@@_number_out_prop { mantissa } - { - \msg_error:nnx { siunitx } { table-partial-number } - { a~mantissa } - } - } - } -% \end{macrocode} -% The aim here is to deal with the mantissa with as few measurements as -% possible. The integer part is therefore measured, with the real and model -% versions compared. This allows appropriate fill to be calculated to -% add the mantissa to the result box, after any comparator and with -% the appropriate width. Once that is done, the amount of filler needed -% \emph{after} the integer can be calculated: this is the size of the -% model mantissa, minus the size of the real mantissa and the amount of -% filler needed in the integer part. That is stored in the intermediate -% dimension for the present, although it may get moved. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_mantissa_parts: - { - \@@_table_print_S_reserved_mantissa_integer: - \hbox_set:Nn \l_@@_table_result_box - { - \hbox_unpack:N \l_@@_table_result_box - \hbox_to_wd:nn { \l_@@_table_fill_mid_dim } { \tex_hfil:D } - \hbox_unpack:N \l_@@_table_mantissa_box - } - \dim_set:Nn \l_@@_table_fill_mid_dim - { - \l_@@_table_mantissa_dim - - \box_wd:N \l_@@_table_mantissa_box - - \l_@@_table_integer_dim - } - \@@_table_print_S_reserved_mantissa_uncert: - } -% \end{macrocode} -% For the integer part, there is a need to measure both the sign and -% the integer itself in the model and in the real number. If there is -% no integer part in the real number, then fill is stored to add either -% before or after any comparator. If there is an integer part, the -% size is measured and the any fill needed is stored for re-insertion. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_mantissa_integer: - { - \prop_get:NnNF \l_@@_table_model_prop { mantissa-sign } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNT \l_@@_table_model_prop { mantissa-integer } - \l_@@_tmpb_tl - { \tl_put_right:No \l_@@_tmpa_tl \l_@@_tmpb_tl } - \@@_table_print_S_measure:NN \l_@@_tmpa_tl - \l_@@_table_integer_dim - \prop_get:NnNF \l_@@_number_out_prop { mantissa-sign } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \prop_get:NnNT \l_@@_number_out_prop { mantissa-integer } - \l_@@_tmpb_tl - { \tl_put_right:No \l_@@_tmpa_tl \l_@@_tmpb_tl } - \tl_if_empty:NF \l_@@_tmpa_tl - { - \@@_table_print_S_measure:NN \l_@@_tmpa_tl - \l_@@_tmp_dim - \dim_sub:Nn \l_@@_table_integer_dim { \l_@@_tmp_dim } - } - \@@_table_print_S_reserved_store_fill:n - { \l_@@_table_integer_dim } - } -% \end{macrocode} -% Here, a separated uncertainty is handled. If there is one, then there must -% be a \cs{pm} part to add. Once the space calculation is done, a flexible -% auxiliary does the spacing and pasting up. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_mantissa_uncert: - { - \prop_get:NnNT \l_@@_table_model_prop { mantissa-uncertainty } - \l_@@_tmpa_tl - { - \@@_number_format_join_uncert_pm:N \l_@@_tmpa_tl - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \prop_get:NnNTF \l_@@_number_out_prop { mantissa-uncertainty } - \l_@@_tmpa_tl - { - \dim_set:Nn \l_@@_table_uncert_dim - { \box_wd:N \l_@@_tmp_box } - \@@_number_format_join_uncert_pm:N \l_@@_tmpa_tl - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \bool_if:NTF \l_@@_table_align_uncert_bool - { \@@_table_print_S_reserved_mantissa_uncert_aligned: } - { \@@_table_print_S_reserved_mantissa_uncert_not_aligned: } - } - { - \cs_set_eq:NN \@@_table_print_S_reserved_store_fill:n - \@@_table_print_S_reserved_store_fill_mid:n - \@@_table_print_S_reserved_store_fill:n - { \box_wd:N \l_@@_tmp_box } - } - } - } -% \end{macrocode} -% Two auxiliaries, one to place the uncertainty directly next to the rest -% of the mantissa, one to maintain alignment. In both cases, any fill ends -% up in the middle fill store, but in the alignment case this also removes -% any previous fill. The temporary box here contains the uncertainty part. -% \begin{macrocode} -\cs_new_protected:Npn - \@@_table_print_S_reserved_mantissa_uncert_aligned: - { - \hbox_set:Nn \l_@@_table_result_box - { - \hbox_unpack:N \l_@@_table_result_box - \hbox_to_wd:nn { \l_@@_table_fill_mid_dim } { \tex_hfil:D } - \hbox_unpack:N \l_@@_tmp_box - } - \dim_set:Nn \l_@@_table_fill_mid_dim - { \l_@@_table_uncert_dim - \box_wd:N \l_@@_tmp_box } - } -\cs_new_protected:Npn - \@@_table_print_S_reserved_mantissa_uncert_not_aligned: - { - \hbox_set:Nn \l_@@_table_result_box + \tl_if_blank:nF {#1} + { #1 \degree } + \tl_if_blank:nF {#2} { - \hbox_unpack:N \l_@@_table_result_box - \hbox_unpack:N \l_@@_tmp_box + \tl_if_blank:nF {#1} { \c_space_tl } + #2 \arcminute } - \dim_add:Nn \l_@@_table_fill_mid_dim + \tl_if_blank:nF {#3} { - \l_@@_table_uncert_dim - - \box_wd:N \l_@@_tmp_box + \tl_if_blank:nF {#1#2} { \c_space_tl } + #3 \arcsecond } } % \end{macrocode} % \end{macro} % \end{macro} % -% \begin{macro}{\@@_table_print_S_reserved_exponent:} -% \begin{macro} -% { -% \@@_table_print_S_reserved_exponent_product: , -% \@@_table_print_S_reserved_exponent_product_correction: , -% \@@_table_print_S_reserved_exponent_aligned: , -% \@@_table_print_S_reserved_exponent_not_aligned: -% } -% Printing the exponent needs to deal with the exponent product. This -% is easiest to do by simply re-checking for a mantissa. If there is no -% exponent, then any space which needs to be added must be moved from -% the mid space to the post space at this stage. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_exponent: - { - \prop_get:NnNTF \l_@@_table_model_prop { exponent-result } - \l_@@_tmpa_tl - { - \prop_if_in:NnT \l_@@_table_model_prop { mantissa } - { \@@_table_print_S_reserved_exponent_product: } - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \prop_get:NnNTF \l_@@_number_out_prop { exponent-result } - \l_@@_tmpa_tl - { - \dim_set:Nn \l_@@_table_exponent_dim - { \box_wd:N \l_@@_tmp_box } - \tl_if_empty:NT \l_@@_output_exponent_tl - { - \prop_if_in:NnTF \l_@@_number_out_prop { mantissa } - { \@@_table_print_S_reserved_exponent_product: } - { \@@_table_print_S_reserved_exponent_product_correction: } - } - \hbox_set:Nn \l_@@_tmp_box - { \@@_print:nV { number } \l_@@_tmpa_tl } - \bool_if:NTF \l_@@_table_align_exponent_bool - { \@@_table_print_S_reserved_exponent_aligned: } - { \@@_table_print_S_reserved_exponent_not_aligned: } - } - { - \dim_set:Nn \l_@@_table_fill_post_dim - { \l_@@_table_fill_mid_dim + \box_wd:N \l_@@_tmp_box } - } - } - { - \prop_if_in:NnT \l_@@_number_out_prop { exponent-result } - { - \msg_error:nnx { siunitx } { table-partial-number } - { an~exponent } - } - \dim_set_eq:NN \l_@@_table_fill_post_dim - \l_@@_table_fill_mid_dim - } - } -% \end{macrocode} -% A short sub-function to deal with the appearance of the exponent product -% for both the real number and the model. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_exponent_product: - { - \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_exponent_product_tl - \bool_if:NT \l_@@_tight_bool - { - \tl_set:Nx \l_@@_tmpb_tl - { \exp_not:N \mathord \exp_not:o \l_@@_tmpb_tl } - } - \tl_set:Nx \l_@@_tmpa_tl - { - \exp_not:N \ensuremath { { } \exp_not:o \l_@@_tmpb_tl { } } - \exp_not:o \l_@@_tmpa_tl - } - } -% \end{macrocode} -% If there is no mantissa, then some additional space is needed for the -% location where the product symbol would have been. +% \begin{macro}[EXP] +% {\@@_list_use:nnnnn, \@@_list_use:nnVVV, \@@_list_use_aux:nnnnn} +% \begin{macro}[EXP]{\@@_list_use_auxi:w} +% \begin{macro}[EXP]{\@@_list_use_auxii:nnw, \@@_list_use_auxiii:nnw} +% \begin{macro}[EXP]{\@@_list_count:n} +% \begin{macro}[EXP]{\@@_list_count:w} +% Copies of the ideas in the \pkg{l3clist} module but using |;| as a list +% separator. The functions have to be extended to allow for a unit argument. % \begin{macrocode} -\cs_new_protected:Npn - \@@_table_print_S_reserved_exponent_product_correction: +\cs_new:Npn \@@_list_use:nnnnn #1#2#3#4#5 { - \group_begin: - \tl_clear:N \l_@@_tmpa_tl - \@@_table_print_S_reserved_exponent_product: - \tl_set:Nx \l_@@_tmpa_tl - { { } \exp_not:o \l_@@_tmpa_tl { } } - \@@_table_print_S_measure:NN \l_@@_tmpa_tl \l_@@_tmp_dim - \exp_args:NNNo \group_end: - \dim_set:Nn \l_@@_tmp_dim { \dim_use:N \l_@@_tmp_dim } - \@@_table_print_S_reserved_store_fill:n { \l_@@_tmp_dim } - \dim_sub:Nn \l_@@_table_exponent_dim { \l_@@_tmp_dim } + \tl_if_blank:nTF {#2} + { \@@_list_use_aux:nnnnn {#1} { } } + { \@@_list_use_aux:nnnnn {#1} { ~ #2 } } + {#3} {#4} {#5} } -% \end{macrocode} -% There are two cases for adding the exponent to the result box, one -% with additional space to maintain alignment, and one with no space. -% The space needed after the exponent then can be set to either include -% or exclude the mid fill space. Doing that here avoids one extra assignment -% (to clear the mid fill in the aligned case). -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_reserved_exponent_aligned: +\cs_generate_variant:Nn \@@_list_use:nnnnn { nnVVV } +\cs_new:Npn \@@_list_use_aux:nnnnn #1#2#3#4#5 { - \hbox_set:Nn \l_@@_table_result_box + \int_case:nnF { \@@_list_count:n {#1} } { - \hbox_unpack:N \l_@@_table_result_box - \hbox_to_wd:nn { \l_@@_table_fill_mid_dim } { \tex_hfil:D } - \hbox_unpack:N \l_@@_tmp_box + { 0 } { } + { 1 } { \@@_list_use_auxi:nw {#2} #1 ; ; { } } + { 2 } { \@@_list_use_auxi:nw {#2} #1 ; {#3} } } - \dim_set:Nn \l_@@_table_fill_post_dim { - \l_@@_table_exponent_dim - - \box_wd:N \l_@@_tmp_box + \@@_list_use_auxii:nnw {#2} { } #1 ; + \q_mark ; { \@@_list_use_auxii:nnw {#2} {#4} } + \q_mark ; { \@@_list_use_auxiii:nnw {#2} {#5} } + \q_stop { } } } -\cs_new_protected:Npn - \@@_table_print_S_reserved_exponent_not_aligned: +\cs_new:Npn \@@_list_use_auxi:nw #1#2 ; #3 ; #4 + { #2 #1 #4 #3 \tl_if_blank:nF {#3} {#1} } +\cs_new:Npn \@@_list_use_auxii:nnw + #1#2#3 ; #4 ; #5 ; #6 \q_mark ; #7#8 \q_stop #9 + { #7 {#4} ; {#5} ; #6 \q_mark ; {#7} #8 \q_stop { #9 #2 #3 #1 } } +\cs_new:Npn \@@_list_use_auxiii:nnw #1#2#3 ; #4 \q_stop #5 + { #5 #2 #3 #1 } +\cs_new:Npx \@@_list_count:n #1 { - \hbox_set:Nn \l_@@_table_result_box - { - \hbox_unpack:N \l_@@_table_result_box - \hbox_unpack:N \l_@@_tmp_box - } - \dim_set:Nn \l_@@_table_fill_post_dim + \exp_not:N \int_eval:n { - \l_@@_table_fill_mid_dim - + \l_@@_table_exponent_dim - - \box_wd:N \l_@@_tmp_box + 0 + \exp_not:N \@@_list_count:w \c_space_tl + #1 \exp_not:n { ; \q_recursion_tail ; \q_recursion_stop } } } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Direct printing in \texttt{S} columns} -% -% When number parsing is turned off the usual approach to printing -% tabular material is not suitable. Instead, the strategy used by -% \pkg{dcolumn} can be applied, which requires the decimal marker to -% be made active in math mode. -% -% \begin{macro}{\@@_table_print_S_direct:} -% \begin{macro}{\@@_table_print_S_direct_text:n} -% Test to see if the very first item -% in the cell is a |{|. If it is, then we use the same approach as for -% parsed columns and set the material as text. Otherwise, switch to math -% mode and hand off to the main routine. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_direct: - { - \peek_catcode_ignore_spaces:NTF \c_group_begin_token - { \@@_table_print_S_direct_text:n } - { \@@_table_print_S_direct_main: } - } -\cs_new_protected:Npn \@@_table_print_S_direct_text:n #1 +\cs_new:Npx \@@_list_count:w #1 ; { - \@@_table_column_begin:n { \l_@@_table_text_align_skip } - #1 - \@@_table_column_end:n { \l_@@_table_text_align_skip } + \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1} + \exp_not:N \tl_if_blank:nF {#1} { + 1 } + \exp_not:N \@@_list_count:w \c_space_tl } % \end{macrocode} % \end{macro} % \end{macro} -% -% \begin{macro} -% { -% \@@_table_print_S_direct_centered: , -% @@_table_print_S_direct_centered_begin:, -% \@@_table_print_S_direct_centered_end: -% } -% \begin{macro}{\@@_table_print_S_direct_centered_aux:N} -% When centring the content about a decimal marker, the trick is -% to collect everything into two boxes and then compare the sizes. -% In that sense this is very similar to the normal method, except that -% it will work with non-numerical input. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_direct_centered: - { - \cs_set_eq:NN \@@_table_print: - \@@_table_print_S_direct_centered_end: - \hbox_set:Nn \l_@@_tmp_box - { \ensuremath { \l_@@_output_decimal_tl } } - \hbox_set_to_wd:Nnn \l_@@_table_post_box - { \box_wd:N \l_@@_tmp_box } - { \tex_hfil:D } - \hbox_set:Nw \l_@@_table_pre_box - \c_math_toggle_token - \tl_map_function:NN \l_@@_input_decimal_tl - \@@_table_print_S_direct_centered_aux:N - } -\cs_new_protected:Npn \@@_table_print_S_direct_centered_aux:N #1 - { - \char_set_active_eq:NN #1 \@@_table_print_S_direct_centered_begin: - \char_set_mathcode:nn { `#1 } { "8000 } - } -\cs_new_protected:Npn \@@_table_print_S_direct_centered_begin: - { - \c_math_toggle_token - \hbox_set_end: - \hbox_set:Nw \l_@@_table_post_box - \c_math_toggle_token - \l_@@_output_decimal_tl - } -\cs_new_protected:Npn \@@_table_print_S_direct_centered_end: - { - \c_math_toggle_token - \hbox_set_end: - \dim_compare:nNnTF - { \box_wd:N \l_@@_table_pre_box } > - { \box_wd:N \l_@@_table_post_box } - { - \hbox_set_to_wd:Nnn \l_@@_table_post_box - { \box_wd:N \l_@@_table_pre_box } - { - \hbox_unpack:N \l_@@_table_post_box - \tex_hfil:D - } - } - { - \hbox_set_to_wd:Nnn \l_@@_table_pre_box - { \box_wd:N \l_@@_table_post_box } - { - \tex_hfil:D - \hbox_unpack:N \l_@@_table_pre_box - } - } - \box_use:N \l_@@_table_pre_box - \box_use:N \l_@@_table_post_box - } -% \end{macrocode} % \end{macro} % \end{macro} -% -% \begin{macro} -% { -% \@@_table_print_S_direct_reserved: , -% \@@_table_print_S_direct_reserved_begin:, -% \@@_table_print_S_direct_reserved_end: -% } -% \begin{macro}{\@@_table_print_S_direct_reserved_aux:N} -% The plan here is to box up the entire number using the information -% available about the size of the two parts. Relatively easy, -% but needs a bit of measuring. The first box here does need to use -% \cs{tex_hill:D} as \texttt{fil} glue will not work. -% \begin{macrocode} -\cs_new_protected:Npn \@@_table_print_S_direct_reserved: - { - \cs_set_eq:NN \@@_table_print: - \@@_table_print_S_direct_reserved_end: - \prop_get:NnNF \l_@@_table_model_prop { mantissa-integer } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \hbox_set:Nn \l_@@_tmp_box - { - \ensuremath - { - \prop_get:NnNT \l_@@_table_model_prop { mantissa-sign } - \l_@@_tmpb_tl - { \l_@@_tmpb_tl } - \l_@@_tmpa_tl - } - } - \dim_set:Nn \l_@@_table_integer_dim - { \box_wd:N \l_@@_tmp_box } - \prop_get:NnNF \l_@@_table_model_prop { mantissa-decimal } - \l_@@_tmpa_tl - { \tl_clear:N \l_@@_tmpa_tl } - \hbox_set:Nn \l_@@_tmp_box - { - \ensuremath - { - \l_@@_output_decimal_tl - \l_@@_tmpa_tl - } - } - \hbox_set_to_wd:Nnn \l_@@_table_post_box - { \box_wd:N \l_@@_tmp_box } - { \tex_hfil:D } - \tex_setbox:D \l_@@_table_pre_box \tex_hbox:D to \l_@@_table_integer_dim - \c_group_begin_token - \c_math_toggle_token - \tl_map_function:NN \l_@@_input_decimal_tl - \@@_table_print_S_direct_reserved_aux:N - \tex_hfill:D - } -\cs_new_protected:Npn \@@_table_print_S_direct_reserved_aux:N #1 - { - \char_set_active_eq:NN #1 \@@_table_print_S_direct_reserved_begin: - \char_set_mathcode:nn { `#1 } { "8000 } - } -\cs_new_protected:Npn \@@_table_print_S_direct_reserved_begin: - { - \c_math_toggle_token - \c_group_end_token - \tex_setbox:D \l_@@_table_post_box \tex_hbox:D to \box_wd:N \l_@@_tmp_box - \c_group_begin_token - \c_math_toggle_token - \l_@@_output_decimal_tl - } -\cs_new_protected:Npn \@@_table_print_S_direct_reserved_end: - { - \c_math_toggle_token - \tex_hfil:D - \c_group_end_token - \@@_table_align_left:n { \l_@@_table_number_align_skip } - \box_use:N \l_@@_table_pre_box - \box_use:N \l_@@_table_post_box - \@@_table_align_right:n { \l_@@_table_number_align_skip } - } -% \end{macrocode} % \end{macro} -% \end{macro} -% -% \subsection{Table settings} -% -% To allow for the construction above, the table settings are given here. % % \begin{macrocode} -\keys_set:nn { siunitx } - { - table-align-comparator = true, - table-align-exponent = true, - table-align-text-pre = true, - table-align-text-post = true, - table-align-uncertainty = true, - table-omit-exponent = false, - table-parse-only = false, - table-number-alignment = center-decimal-marker, - table-text-alignment = center, - table-figures-decimal = 2, - table-figures-integer = 3 - } -% \end{macrocode} -% -%\subsection{Symbols} -% -% Not all units use letters alone for their symbol. This raises two -% problems. First, the symbols need to work in math and in text mode. -% Second, the user needs to be able to adjust each symbol. -% -%\begin{macro}{\l_@@_redefine_symbols_bool} -% Only one setting applies here! -% \begin{macrocode} -\keys_define:nn { siunitx } - { redefine-symbols .bool_set:N = \l_@@_redefine_symbols_bool } -\keys_set:nn { siunitx } { redefine-symbols = true } -% \end{macrocode} -%\end{macro} -% -% The redefinition of symbols has to do a number of checks to ensure -% that there are no clashes. -% \begin{macrocode} -\AtBeginDocument - { - \bool_if:NT \l_@@_redefine_symbols_bool - { - \@ifpackageloaded { fourier } - { - \@@_option_unchanged:Nnn \l_@@_ohm_text_tl - { \textohm } - { \text { \ensuremath { \l_@@_ohm_math_tl } } } - } - { } - \@ifpackageloaded { mathptmx } - { - \@@_option_unchanged:Nnn \l_@@_ohm_text_tl - { \textohm } - { \text { \ensuremath { \l_@@_ohm_math_tl } } } - } - { } - \str_if_eq:VnT \encodingdefault { OT1 } - { - \@@_option_unchanged:Nnn \l_@@_angstrom_math_tl - { \text { \AA } } - { \text { \capitalring { A } } } - \@@_option_unchanged:Nnn \l_@@_angstrom_text_tl - { \AA } - { \capitalring { A } } - } - \@ifpackageloaded { unicode-math } - { - \exp_args:NNnx - \@@_option_unchanged:Nnn \l_@@_ohm_math_tl - { \text { \ensuremath { \Omega } } } - { \char_generate:nn { "03A9 } { 12 } } - } - { } - \@ifpackageloaded { upgreek } - { - \@@_option_unchanged:Nnn \l_@@_ohm_math_tl - { \text { \ensuremath { \Omega } } } - { \text { \ensuremath { \Upomega } } } - } - { - \cs_if_exist:NT \upOmega - { - \@@_option_unchanged:Nnn \l_@@_ohm_math_tl - { \text { \ensuremath { \Omega } } } - { \text { \ensuremath { \upOmega } } } - } - } - } - } -% \end{macrocode} -% -%\begin{macro}{\l_@@_angstrom_math_tl} -%\begin{macro}{\l_@@_arcminute_math_tl} -%\begin{macro}{\l_@@_arcsecond_math_tl} -%\begin{macro}{\l_@@_celsius_math_tl} -%\begin{macro}{\l_@@_degree_math_tl} -%\begin{macro}{\l_@@_micro_math_tl} -%\begin{macro}{\l_@@_ohm_math_tl} -% The symbol storage macros are created separately for math and text -% mode, although this is all pretty similar. The default definitions use -% what is generally available, except for those for micro, where -% Computer Modern does not have the appropriate symbol at all. For the -% math mode omega option, the "\text{\ensuremath{...}}" construction -% deals with the case where \cs{mathnormal} has the wrong symbol. -% \begin{macrocode} -\keys_define:nn { siunitx } { - math-angstrom .tl_set:N = \l_@@_angstrom_math_tl, - math-arcminute .tl_set:N = \l_@@_arcminute_math_tl, - math-arcsecond .tl_set:N = \l_@@_arcsecond_math_tl, - math-celsius .tl_set:N = \l_@@_celsius_math_tl, - math-degree .tl_set:N = \l_@@_degree_math_tl, - math-micro .tl_set:N = \l_@@_micro_math_tl, - math-ohm .tl_set:N = \l_@@_ohm_math_tl -} -\keys_set:nn { siunitx } { - math-angstrom = \text { \AA }, - math-arcminute = { } ^ { \prime }, - math-arcsecond = { } ^ { \prime \prime }, - math-celsius = \text { \textdegree } \@@_unit_mathrm:n { C } , - math-degree = \text { \textdegree }, - math-micro = \text { \textmu }, - math-ohm = \text { \ensuremath { \Omega } }, -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\begin{macro}{\l_@@_angstrom_text_tl} -%\begin{macro}{\l_@@_arcminute_text_tl} -%\begin{macro}{\l_@@_arcsecond_text_tl} -%\begin{macro}{\l_@@_celsius_text_tl} -%\begin{macro}{\l_@@_degree_text_tl} -%\begin{macro}{\l_@@_micro_text_tl} -%\begin{macro}{\l_@@_ohm_text_tl} -% Text versions are similar. -% \begin{macrocode} -\keys_define:nn { siunitx } { - text-angstrom .tl_set:N = \l_@@_angstrom_text_tl, - text-arcminute .tl_set:N = \l_@@_arcminute_text_tl, - text-arcsecond .tl_set:N = \l_@@_arcsecond_text_tl, - text-celsius .tl_set:N = \l_@@_celsius_text_tl, - text-degree .tl_set:N = \l_@@_degree_text_tl, - text-micro .tl_set:N = \l_@@_micro_text_tl, - text-ohm .tl_set:N = \l_@@_ohm_text_tl, -} -\keys_set:nn { siunitx } { - text-angstrom = \AA, - text-arcminute = \ensuremath { { } ^ { \prime } }, - text-arcsecond = \ensuremath { { } ^ { \prime \prime } }, - text-celsius = \text { \textdegree } C, - text-degree = \text { \textdegree }, - text-micro = \textmu , - text-ohm = \textohm -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -% \begin{macro}{\@@_symbol_new:n} -% For creating the outer symbol macro. -% \begin{macrocode} -\cs_new_protected:Npn \@@_symbol_new:n #1 - { - \cs_set_protected:cpn { SIUnitSymbol #1 } - { - \use:c - { - l__@@_ - \str_foldcase:n {#1} - _ - \mode_if_math:TF { math } { text } - _tl - } - } - } -% \end{macrocode} -% \end{macro} -% -%\begin{macro}{\SIUnitSymbolAngstrom} -%\begin{macro}{\SIUnitSymbolArcminute} -%\begin{macro}{\SIUnitSymbolArcsecond} -%\begin{macro}{\SIUnitSymbolCelsius} -%\begin{macro}{\SIUnitSymbolDegree} -%\begin{macro}{\SIUnitSymbolMicro} -%\begin{macro}{\SIUnitSymbolOhm} -% The wrapper macros are created. -% \begin{macrocode} -\@@_symbol_new:n { Angstrom } -\@@_symbol_new:n { Arcminute } -\@@_symbol_new:n { Arcsecond } -\@@_symbol_new:n { Celsius } -\@@_symbol_new:n { Degree } -\@@_symbol_new:n { Micro } -\@@_symbol_new:n { Ohm } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\subsection{Working with other packages} -% -%\begin{macro}{\l_@@_pgf_link_clist} -%\begin{macro}{\@@_pgf_link:} -% Here, the settings used by \pkg{siunitx} are translated into those for -% \pkg{pgf}. Things could be done more efficiently, but the logic would -% be more difficult to follow. -% \begin{macrocode} -\clist_new:N \l_@@_pgf_link_clist -\cs_new_protected:Npn \@@_pgf_link: { - \clist_clear:N \l_@@_pgf_link_clist - \str_if_eq:VnT \l_@@_round_tl { figure } - { - \clist_put_right:Nn \l_@@_pgf_link_clist { fixed } - \clist_put_right:Nn \l_@@_pgf_link_clist - { fixed~zerofill = true } - } - \clist_put_right:Nx \l_@@_pgf_link_clist - { precision = \int_use:N \l_@@_process_precision_int } - \clist_put_right:Nx \l_@@_pgf_link_clist - { - set~decimal~separator = - { { \exp_not:V \l_@@_output_decimal_tl } } - } - \clist_put_right:Nx \l_@@_pgf_link_clist - { set~thousands~separator = { \exp_not:V \l_@@_group_sep_tl } } - \clist_put_right:Nx \l_@@_pgf_link_clist - { - min~exponent~for~1000~sep = \int_eval:n { \l_@@_group_min_int - 1 } - } - \bool_lazy_or:nnF - { \l_@@_group_decimal_bool } { \l_@@_group_integer_bool } - { - \clist_put_right:Nn \l_@@_pgf_link_clist - { min~exponent~for~1000~sep = 999 } - } - \bool_if:NTF \l_@@_process_integer_zero_bool - { - \clist_put_right:Nn \l_@@_pgf_link_clist - { skip~0. = false } - } - { - \clist_put_right:Nn \l_@@_pgf_link_clist - { skip~0. = true } - } - \str_if_eq:VnTF \l_@@_process_sign_tl { + } - { - \clist_put_right:Nn \l_@@_pgf_link_clist - { showpos = true } - } - { - \clist_put_right:Nn \l_@@_pgf_link_clist - { showpos = false } - } - \use:x - { - \exp_not:N \pgfqkeys - { /pgf/number~format } - { \exp_not:V \l_@@_pgf_link_clist } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Messages} -% -% Lots of messages, all of them together in one block to make life -% easier. -% \begin{macrocode} -\msg_new:nnnn { siunitx } { bad-arc-sign } - { Incorrect~use~of~sign~in~degree-minute-second~angle. } - { Only~the~highest~value~part~of~an~angle~can~have~a~sign. } -\msg_new:nnnn { siunitx } { color-not-loaded } - { Package~"color"~not~loaded. } - { The~command~\token_to_str:N \color \ is~not~available. } -\msg_new:nnnn { siunitx } { duplicate-complex-root-token } - { Duplicate~complex~root~token~'#1'~in~input. } - { Only~one~complex~root~token~can~appear~in~a~single~number. } -\msg_new:nnnn { siunitx } { duplicate-decimal-token } - { Duplicate~decimal~marker~token~'#1'~in~input. } - { Only~one~decimal~marker~token~can~appear~in~a~single~number. } -\msg_new:nnnn { siunitx } { duplicate-exponent-token } - { Duplicate~exponent~marker~token~'#1'~in~input. } - { Only~one~exponent~marker~token~can~appear~in~a~single~number. } -\msg_new:nnnn { siunitx } { duplicate-quotient-token } - { Duplicate~quotient~token. } - { Only~one~quotient~token~can~appear~in~a~single~number. } -\msg_new:nnnn { siunitx } { duplicate-sticky-per } - { Duplicate~\token_to_str:N \per. } - { - When~the~'sticky-per'~option~is~active,~only~one - \token_to_str:N \per may~appear~in~a~unit. - } -\msg_new:nnnn { siunitx } { empty-arc } - { Empty~degree-minute-second~angle. } - { The~angle~given~does~not~contain~any~numbers. } -\msg_new:nnnn { siunitx } { empty-uncertainty } - { Empty~uncertainty~given~in~'#1'. } - { The~number~given~contains~an~empty~uncertainty. } -\msg_new:nnnn { siunitx } { ending-product-token } - { Misplaced~product~token. } - { A~number~cannot~end~with~a~product~token. } -\msg_new:nnnn { siunitx } { ending-quotient-token } - { Misplaced~quotient~token. } - { A~number~cannot~end~with~a~quotient~token. } -\msg_new:nnnn { siunitx } { invalid-arc-format } - { Invalid~degree-minute-second angle~'#1'. } - { - Angles~given~in~degree-minute-second~format~should~contain~two~';' - symbols~to~divide~up~the~parts~of~the~input. - } -\msg_new:nnnn { siunitx } { invalid-number } - { Invalid~numerical~input~'#1'. } - { - The~input~given~as~a~number~does~not~make~logical~sense.~ - This~happens,~for~example,~if~a~number~only~contains~a~sign. - } -\msg_new:nnnn { siunitx } { invalid-token-in-exponent } - { Invalid~exponent~in~numerical~input~'#1'. } - { - The~exponent~part~of~a~number~cannot~contain~an~uncertainty~or~ - complex~part: \\ - the~input~given~appears~to~contain~one~of~these~in~the~exponent. - } -\msg_new:nnnn { siunitx } { invalid-token-in-number } - { Invalid~token~'#1'~in~numerical~input. } - { - Numbers~can~only~contain~tokens~defined~using~the~ - 'input-...'~options:\\ - the~token~'#1'~is~not~set~up~as~a~valid~part~of~a~number. - } -\msg_new:nnnn { siunitx } { invalid-token-in-uncertainty } - { Invalid~uncertainty~in~numerical~input~'#1'. } - { - The~uncertainty~part~of~a~number~may~only~contain~digits~or~ - symbols. - } -\msg_new:nnnn { siunitx } { literal-unit } - { Literal~units~disabled. } - { - You~gave~the~literal~input~'#1'~ - but~literal~unit~output~is~disabled. - } -\msg_new:nnnn { siunitx } { misplaced-sign-token } - { Misplaced~sign~token~'#1'. } - { Sign~tokens~can~only~come~at~the~beginning~of~a~number. } -\msg_new:nnnn { siunitx } { misplaced-complex-root-token } - { Misplaced~complex~token~in~numerical~input~'#1'. } - { - The~root~token~must~come~either~before~or~after~the~real~digits~ - of~the~complex~part. - } -\msg_new:nnnn { siunitx } { misplaced-uncertainty-token } - { Misplaced~uncertainty~token~'#1'. } - { - The~uncertainty~in~a~number~must~be~given~between~a~set~of~ - delimiters~as~defined~by~the\\ - \ \ 'input-open-uncertainty'~and~'input-close-uncertainty'~ - options. - } -\msg_new:nnnn { siunitx } { multi-part-range } - { Numerical~range~with~multiple~parts. } - { - The~input~'#1'~is~a~number~which~has~more~than~one~part: \\ - ranges~can~only~contain~one~number~in~each~part. - } -\msg_new:nnn { siunitx } { non-convertible-exponent } - { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. } -\msg_new:nnn { siunitx } { option-not-available } - { Option~'#1'~not~available~in~strict~mode. } -\msg_new:nnn { siunitx } { option-preamble-only } - { Option~'#1'~only~available~in~the~preamble. } -\msg_new:nnnn { siunitx } { prefix-base-mismatch } - { Prefix~bases~do~not~match. } - { - You~have~asked~for~prefixes~to~be~converted~into~a~power,~ - but~the~bases~do~not~match. - } -\msg_new:nnn { siunitx } { prefix-only } - { Prefix~with~no~unit. } -\msg_new:nnnn { siunitx } { qualifier-before-unit } - { Qualifier~before~unit. } - { Unit~qualifiers~have~to~follow~after~units,~not~before~them. } -\msg_new:nnnn { siunitx } { restricted-number } - { Token~'#1'~forbidden~in~restricted~numerical~input. } - { - The~current~input~must~be~a~real~number~and~cannot~contain: \\ - \ -~an~exponent; \\ - \ -~an~uncertainty; \\ - \ -~a~complex~part. - } -\msg_new:nnnn { siunitx } { starting-product-token } - { Misplaced~product~token. } - { A~number~cannot~begin~with~a~product~token. } -\msg_new:nnnn { siunitx } { starting-quotient-token } - { Misplaced~quotient~token. } - { A~number~cannot~begin~with~a~quotient~token. } -\msg_new:nnnn { siunitx } { table-partial-number } - { No~space~reserved~for~#1~\msg_line_context:. } - { - The~number~in~the~current~table~cell~contains~#1~part, - but~you~did~not~reserve~any~space~to~print~it: \\ - it~will~be~missing~in~the~output. - } -\msg_new:nnnn { siunitx } { unknown-option } - { Unknown~option~'#1'. } - { - The~option~file~'#1'~is~not~known~by~siunitx: - perhaps~it~is~spelled~incorrectly. - } -\msg_new:nnnn { siunitx } { version-1-option } - { Version~1~option~'#1'~detected. } - { - Use: \\ - \ \ \token_to_str:N \usepackage [ version-1-compatibility ] - \iow_char:N \{ siunitx \token_to_str:N \iow_char:N \} \\ - in~the~preamble~to~load~the~appropriate~code. - } -% \end{macrocode} -% -%\subsection{Design-level macros} -% -%\begin{macro}{\DeclareBinaryPrefix} -%\begin{macro}{\DeclareSIPostPower} -%\begin{macro}{\DeclareSIPrefix} -%\begin{macro}{\DeclareSIPrePower} -%\begin{macro}{\DeclareSIQualifier} -%\begin{macro}{\DeclareSIUnit} -%\begin{macro}{\DeclareSIUnitWithOptions} -% The macros for creating units and so on are in design name space. -% Basically, a set of shuffles for arguments. -% \begin{macrocode} -\NewDocumentCommand \DeclareBinaryPrefix { m m m } { - \@@_declare_prefix:Nnnn #1 {#2} { 2 } {#3} -} -\NewDocumentCommand \DeclareSIPostPower { m m } { - \@@_declare_power_after:Nn #1 {#2} -} -\NewDocumentCommand \DeclareSIPrefix { m m m } { - \@@_declare_prefix:Nnnn #1 {#2} { 10 } {#3} -} -\NewDocumentCommand \DeclareSIPrePower { m m } { - \@@_declare_power_before:Nn #1 {#2} -} -\NewDocumentCommand \DeclareSIQualifier { m m } { - \@@_declare_qualifier:Nn #1 {#2} -} -\NewDocumentCommand \DeclareSIUnit { O { } m m } { - \@@_declare_unit:Nnn #2 {#3} {#1} -} -\NewDocumentCommand \DeclareSIUnitWithOptions { m m m } { - \@@_declare_unit:Nnn #1 {#2} {#3} -} -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -% None of this should be done after the preamble. -% \begin{macrocode} -\@onlypreamble \DeclareBinaryPrefix -\@onlypreamble \DeclareSIPostPower -\@onlypreamble \DeclareSIPrefix -\@onlypreamble \DeclareSIPrePower -\@onlypreamble \DeclareSIQualifier -\@onlypreamble \DeclareSIUnit -\@onlypreamble \DeclareSIUnitWithOptions -% \end{macrocode} -% -%\begin{macro}{\SendSettingsToPgf} -% A settings transfer function. -% \begin{macrocode} -\cs_new_protected:Npn \SendSettingsToPgf { \@@_pgf_link: } -% \end{macrocode} -%\end{macro} -% -%\subsection{Document macros} -% -% The user document macros are all collected together here for ease. -% -%\begin{macro}{\ang} -% The \cs{ang} function does very little beyond setting the local -% keys and passing on the input. -% \begin{macrocode} -\NewDocumentCommand \ang { o > { \SplitArgument { 2 } { ; } } m } { - \group_begin: - \IfNoValueF {#1} - { \keys_set:nn { siunitx } {#1} } - \@@_angle_output:nnn #2 - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\num} -% The \cs{num} macro is quite simple: read the number, check it is -% correct then print it. -% \begin{macrocode} -\NewDocumentCommand \num { o m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueF {#1} - { \keys_set:nn { siunitx } {#1} } - \@@_number_output:n {#2} - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\numlist} -% Lists of numbers are trivially easy to work with. -% \begin{macrocode} -\NewDocumentCommand \numlist { o > { \SplitList { ; } } m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueF {#1} - { \keys_set:nn { siunitx } {#1} } - \@@_list_numbers:n {#2} - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\numrange} -% A very simple approach is taken here: this is not intended for -% anything complicated. -% \begin{macrocode} -\NewDocumentCommand \numrange { o m m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueF {#1} - { \keys_set:nn { siunitx } {#1} } - \@@_range_numbers:nn {#2} {#3} - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \SIlist , -% \SIrange -%} -% Lists and range of values are handled in a very similar way. -% Everything is kept relatively simple, and so there is not too much -% complexity. In theory the two could be combined together, but -% the differences between the two make this less desirable. -% \begin{macrocode} -\NewDocumentCommand \SIlist { o > { \SplitList { ; } } m m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueTF {#1} - { \@@_list_units:nnn {#2} {#3} { } } - { - \keys_set:nn { siunitx } {#1} - \@@_list_units:nnn {#2} {#3} {#1} - } - \group_end: -} -\NewDocumentCommand \SIrange { o m m m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueTF {#1} - { \@@_range_unit:nnnn {#4} { } {#2} {#3} } - { - \keys_set:nn { siunitx } {#1} - \@@_range_unit:nnnn {#4} {#1} {#2} {#3} - } - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\SI} -% The main \cs{SI} function follows the same pattern as the previous -% ones. -% \begin{macrocode} -\NewDocumentCommand \SI { o m o m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueTF {#1} - { \@@_combined:nnnn { } {#2} {#3} {#4} } - { - \keys_set:nn { siunitx } {#1} - \@@_combined:nnnn {#1} {#2} {#3} {#4} - } - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\sisetup} -% The set up macro simply moves to the correct path and executes -% whatever has been passed. -% \begin{macrocode} -\NewDocumentCommand \sisetup { m } { - \keys_set:nn { siunitx } {#1} -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\tablenum} -% A variation on the \cs{num} macro that will retain alignment within -% \cs{multicolumn} and \cs{multirow} situations. The slightly odd code -% for the non-parsed case is needed to reinsert the appropriate tokens -% after \enquote{collection}. -% \begin{macrocode} -\NewDocumentCommand \tablenum { o m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueF {#1} - { \keys_set:nn { siunitx } {#1} } - \bool_if:NTF \l_@@_number_parse_bool - { - \tl_set:Nn \l_@@_table_collect_tl {#2} - \bool_set_false:N \l_@@_table_collect_pre_bool - \@@_table_print_S: - } - { \@@_table_print_S_direct: #2 \@@_table_print: } - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\si} -% The \cs{si} macro needs to pass options through to the internal -% function as well as setting them here. This is used so that options -% set for a unit can be overridden on a one-off basis. -% \begin{macrocode} -\NewDocumentCommand \si { o m } { - \leavevmode - \group_begin: - \bool_set_false:N \l_@@_font_set_bool - \IfNoValueTF {#1} - { \@@_unit_output:nn {#2} { } } - { - \keys_set:nn { siunitx } {#1} - \@@_unit_output:nn {#2} {#1} - } - \group_end: -} -% \end{macrocode} -%\end{macro} -% -%\subsection{Precautions for section headings} -% -% There are two issues to be handled for section headings, \emph{etc}. -% First, within the \cs{addcontentline} macro the various unit functions -% need to be \cs{protected}. Secondly, there is a need to worry about -% \pkg{hyperref}, and ensure that everything works cleanly and with -% no unnecessary warnings. -% -% \begin{macro}{\@@_contents_bookmarks:} -% The idea here is two-fold. First, all of the unit macros are set -% up to simply print their literal interpretation: this is hopefully -% good enough for most bookmark situations. Secondly, the document -% commands are made expandable. This allows a bit of re-arrangement -% of the input, removes any set up options (which are being ignored) -% and stops \pkg{hyperref} issuing a warning. -% \begin{macrocode} -\cs_new_protected:Npn \@@_contents_bookmarks: - { - \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq - { \@@_unit_print_literal_aux:N ##1 } - \cs_if_exist:NT \FB@fg - { \cs_set_eq:NN \fg \FB@fg } - \msg_redirect_name:nnn { xparse } { redefine-command } { none } - \cs_set_eq:NN \num \numInBookmark - \cs_set_eq:NN \numrange \numrangeInBookmark - \cs_set_eq:NN \si \siInBookmark - \cs_set_eq:NN \SI \SIInBookmark - \cs_set_eq:NN \SIrange \SIrangeInBookmark - \cs_set_eq:NN \si \siInBookmark - \cs_set_eq:NN \highlight \use_ii:nn - \cs_set_eq:NN \@@_textsuperscript:n \use:n - \cs_set:Npn \SIUnitSymbolAngstrom { \AA } - \cs_set:Npn \SIUnitSymbolArcminute { ' } - \cs_set:Npn \SIUnitSymbolArcsecond { '' } - \cs_set:Npn \SIUnitSymbolCelsius { \textcelsius } - \cs_set:Npn \SIUnitSymbolDegree { \textdegree } - \cs_set:Npn \SIUnitSymbolMicro { \textmu } - \cs_set:Npn \SIUnitSymbolOhm { \textohm } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \numInBookmark , -% \numrangeInBookmark , -% \SIlistInBookmark , -% \SIrangeInBookmark , -% \SIInBookmark , -% \siInBookmark -% } -% To keep things fast, expandable versions of the document commands -% are created only once. These are then used if necessary to remove -% and re-order arguments in an expandable fashion. -% \begin{macrocode} -\DeclareExpandableDocumentCommand \numInBookmark { o m } {#2} -\DeclareExpandableDocumentCommand \numrangeInBookmark { o m m } - { #2 \l_@@_range_phrase_tl #3 } -\DeclareExpandableDocumentCommand \SIInBookmark { o m o m } - { \IfNoValueF {#3} {#3} #2 ~ #4 } -\DeclareExpandableDocumentCommand \SIlistInBookmark - { o m m } { \@@_bookmark_SIlist_map:nn {#1} {#2} } -\DeclareExpandableDocumentCommand \SIrangeInBookmark - { o m m m } { #2 ~ #4 \l_@@_range_phrase_tl #3 ~ #4 } -\DeclareExpandableDocumentCommand \siInBookmark { o m } {#2} -% \end{macrocode} -% \end{macro} -% -%\begin{macro}{\@@_bookmark_SIlist_map:nn} -%\begin{macro}{\@@_bookmark_SIlist_map_aux:nw} -% An expandable mapping to replace the list separator in the -% input by appropriate output version. -% \begin{macrocode} -\cs_new:Npn \@@_bookmark_SIlist_map:nn #1#2 { - \@@_bookmark_SIlist_map_aux:nw {#2} #1 ; \q_recursion_tail ; - \q_recursion_tail ; \q_recursion_stop -} -\cs_new:Npn \@@_bookmark_SIlist_map_aux:nw #1#2 ; #3 ; #4 { - #2 ~ #1 - \quark_if_recursion_tail_stop:n {#3} - \quark_if_recursion_tail_stop_do:nn {#4} - { - \l_@@_list_separator_final_tl - #3 ~ #1 - } - \l_@@_list_separator_tl - \@@_bookmark_SIlist_map_aux:nw {#1} #3 ; #4 -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -% A short check to get things working. -% \begin{macrocode} -\AtBeginDocument { - \@ifpackageloaded { hyperref } - { \pdfstringdefDisableCommands { \@@_contents_bookmarks: } } - { } -} -% \end{macrocode} -% -%\subsection{Physical units} -% -%\begin{macro}{\kilogram} -%\begin{macro}{\metre} -%\begin{macro}{\meter} -%\begin{macro}{\mole} -%\begin{macro}{\kelvin} -%\begin{macro}{\candela} -%\begin{macro}{\second} -%\begin{macro}{\ampere} -% The basic SI units are always defined, including both variants for -% metre. -% \begin{macrocode} -\DeclareSIUnit \kilogram { \kilo \gram } -\DeclareSIUnit \metre { m } -\DeclareSIUnit \meter { \metre } -\DeclareSIUnit \mole { mol } -\DeclareSIUnit \second { s } -\DeclareSIUnit \ampere { A } -\DeclareSIUnit \kelvin { K } -\DeclareSIUnit \candela { cd } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\gram} -% The gram is an odd unit as it is needed for the base unit kilogram. -% \begin{macrocode} -\DeclareSIUnit \gram { g } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\yocto} -%\begin{macro}{\zepto} -%\begin{macro}{\atto} -%\begin{macro}{\femto} -%\begin{macro}{\pico} -%\begin{macro}{\nano} -%\begin{macro}{\micro} -%\begin{macro}{\milli} -%\begin{macro}{\centi} -%\begin{macro}{\deci} -% The various SI multiple prefixes are defined here: first the small -% ones. -% \begin{macrocode} -\DeclareSIPrefix \yocto { y } { -24 } -\DeclareSIPrefix \zepto { z } { -21 } -\DeclareSIPrefix \atto { a } { -18 } -\DeclareSIPrefix \femto { f } { -15 } -\DeclareSIPrefix \pico { p } { -12 } -\DeclareSIPrefix \nano { n } { -9 } -\DeclareSIPrefix \micro { \SIUnitSymbolMicro } { -6 } -\DeclareSIPrefix \milli { m } { -3 } -\DeclareSIPrefix \centi { c } { -2 } -\DeclareSIPrefix \deci { d } { -1 } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\begin{macro}{\deca} -%\begin{macro}{\deka} -%\begin{macro}{\hecto} -%\begin{macro}{\kilo} -%\begin{macro}{\mega} -%\begin{macro}{\giga} -%\begin{macro}{\tera} -%\begin{macro}{\peta} -%\begin{macro}{\exa} -%\begin{macro}{\zetta} -%\begin{macro}{\yotta} -% Now the large ones. -% \begin{macrocode} -\DeclareSIPrefix \deca { da } { 1 } -\DeclareSIPrefix \deka { da } { 1 } -\DeclareSIPrefix \hecto { h } { 2 } -\DeclareSIPrefix \kilo { k } { 3 } -\DeclareSIPrefix \mega { M } { 6 } -\DeclareSIPrefix \giga { G } { 9 } -\DeclareSIPrefix \tera { T } { 12 } -\DeclareSIPrefix \peta { P } { 15 } -\DeclareSIPrefix \exa { E } { 18 } -\DeclareSIPrefix \zetta { Z } { 21 } -\DeclareSIPrefix \yotta { Y } { 24 } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\becquerel} -%\begin{macro}{\celsius} -%\begin{macro}{\degreeCelsius} -%\begin{macro}{\coulomb} -%\begin{macro}{\farad} -%\begin{macro}{\gray} -%\begin{macro}{\hertz} -%\begin{macro}{\henry} -%\begin{macro}{\joule} -%\begin{macro}{\katal} -%\begin{macro}{\lumen} -%\begin{macro}{\lux} -% A number of derived units with defined names and symbols. -% \begin{macrocode} -\DeclareSIUnit \becquerel { Bq } -\DeclareSIUnit \celsius { \SIUnitSymbolCelsius } -\DeclareSIUnit \degreeCelsius { \SIUnitSymbolCelsius } -\DeclareSIUnit \coulomb { C } -\DeclareSIUnit \farad { F } -\DeclareSIUnit \gray { Gy } -\DeclareSIUnit \hertz { Hz } -\DeclareSIUnit \henry { H } -\DeclareSIUnit \joule { J } -\DeclareSIUnit \katal { kat } -\DeclareSIUnit \lumen { lm } -\DeclareSIUnit \lux { lx } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\begin{macro}{\newton} -%\begin{macro}{\ohm} -%\begin{macro}{\pascal} -%\begin{macro}{\radian} -%\begin{macro}{\siemens} -%\begin{macro}{\sievert} -%\begin{macro}{\steradian} -%\begin{macro}{\tesla} -%\begin{macro}{\volt} -%\begin{macro}{\watt} -%\begin{macro}{\weber} -% More units. -% \begin{macrocode} -\DeclareSIUnit \newton { N } -\DeclareSIUnit \ohm { \SIUnitSymbolOhm } -\DeclareSIUnit \pascal { Pa } -\DeclareSIUnit \radian { rad } -\DeclareSIUnit \siemens { S } -\DeclareSIUnit \sievert { Sv } -\DeclareSIUnit \steradian { sr } -\DeclareSIUnit \tesla { T } -\DeclareSIUnit \volt { V } -\DeclareSIUnit \watt { W } -\DeclareSIUnit \weber { Wb } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\arcminute} -%\begin{macro}{\arcsecond} -%\begin{macro}{\day} -%\begin{macro}{\degree} -%\begin{macro}{\hectare} -%\begin{macro}{\hour} -%\begin{macro}{\litre} -%\begin{macro}{\liter} -%\begin{macro}{\minute} -%\begin{macro}{\percent} -%\begin{macro}{\tonne} -% Non-SI, but accepted for general use. -% \begin{macrocode} -\DeclareSIUnit [ number-unit-product = ] \arcmin { \arcminute } -\DeclareSIUnit [ number-unit-product = ] - \arcminute { \SIUnitSymbolArcminute } -\DeclareSIUnit [ number-unit-product = ] - \arcsecond { \SIUnitSymbolArcsecond } -\DeclareSIUnit \day { d } -\DeclareSIUnit[ number-unit-product = ] \degree { \SIUnitSymbolDegree } -\DeclareSIUnit \hectare { ha } -\DeclareSIUnit \hour { h } -\DeclareSIUnit \litre { l } -\DeclareSIUnit \liter { L } -\DeclareSIUnit \minute { min } -\DeclareSIUnit \percent { \char 37 } -\DeclareSIUnit \tonne { t } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\astronomicalunit} -%\begin{macro}{\atomicmassunit} -%\begin{macro}{\electronvolt} -%\begin{macro}{\dalton} -% A few units based on physical measurements exist. -% \begin{macrocode} -\DeclareSIUnit \astronomicalunit { au } -\DeclareSIUnit \atomicmassunit { u } -\DeclareSIUnit \electronvolt { eV } -\DeclareSIUnit \dalton { Da } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\begin{macro}{\clight} -%\begin{macro}{\electronmass} -%\begin{macro}{\planckbar} -% A set of \enquote{natural units}. -% \begin{macrocode} -\group_begin: -\cs_set_eq:NN \endgroup \group_end: -\char_set_catcode_math_subscript:N \_ -\use:n - { - \endgroup - \DeclareSIUnit \clight { \text { \ensuremath { c _ { 0 } } } } - \DeclareSIUnit \electronmass - { \text { \ensuremath { m _ { \textup { e } } } } } - } -\DeclareSIUnit \planckbar { \text { \ensuremath { \hbar } } } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\begin{macro}{\elementarycharge} -%\begin{macro}{\bohr} -%\begin{macro}{\hartree} -% A set of \enquote{atomic units}. -% \begin{macrocode} -\DeclareSIUnit \elementarycharge { \text { \ensuremath { e } } } -\group_begin: -\cs_set_eq:NN \endgroup \group_end: -\char_set_catcode_math_subscript:N \_ -\use:n - { - \endgroup - \DeclareSIUnit \bohr { \text { \ensuremath { a _ { 0 } } } } - \DeclareSIUnit \hartree - { \text { \ensuremath { E _ { \textup { h } } } } } - } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\angstrom} -%\begin{macro}{\bar} -%\begin{macro}{\barn} -%\begin{macro}{\bel} -%\begin{macro}{\decibel} -%\begin{macro}{\knot} -%\begin{macro}{\mmHg} -%\begin{macro}{\nauticalmile} -%\begin{macro}{\neper} -% There are then some day-to-day units which are accepted for use -% with SI, but are not part of the official specification. -% \begin{macrocode} -\DeclareSIUnit \angstrom { \SIUnitSymbolAngstrom } -\DeclareSIUnit \bar { bar } -\DeclareSIUnit \barn { b } -\DeclareSIUnit \bel { B } -\DeclareSIUnit \decibel { \deci \bel } -\DeclareSIUnit \knot { kn } -\DeclareSIUnit \mmHg { mmHg } -\DeclareSIUnit \nauticalmile { M } -\DeclareSIUnit \neper { Np } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\begin{macro}{\square} -%\begin{macro}{\squared} -%\begin{macro}{\cubic} -%\begin{macro}{\cubed} -% The basic powers are also defined. -% \begin{macrocode} -\DeclareSIPrePower \square { 2 } -\DeclareSIPostPower \squared { 2 } -\DeclareSIPrePower \cubic { 3 } -\DeclareSIPostPower \cubed { 3 } -% \end{macrocode} -%\end{macro} -%\end{macro} -%\end{macro} -%\end{macro} -% -%\subsection{Strict application of the rules} -% -%\begin{macro}{\@@_strict_option:n} -%\begin{macro}{\@@_strict_option_aux:n} -% When sticking to the rules closely, a few options are not available. -% \begin{macrocode} -\keys_define:nn { siunitx } { - strict .code:n = - { - \keys_set:nn { siunitx } - { - bracket-numbers = true, - detect-family = false, - detect-mode = false, - detect-shape = false, - detect-weight = false, - multi-part-units = brackets, - parse-numbers = true, - parse-units = true, - product-units = repeat - } - \@@_strict_option:n - { - bracket-numbers , - detect-family , - detect-italic , - detect-mode , - detect-shape , - detect-weight , - multi-part-units , - parse-numbers , - parse-units , - product-units - } - \keys_define:nn { siunitx } - { - per-mode / repeated-symbol .code:n = - { - \msg_warning:nnx { siunitx } { option-not-available } - { per-mode~=~repeated-symbol } - } - } - } -} -\@@_option_deactivate:n { strict } -\cs_new_protected:Npn \@@_strict_option:n #1 { - \clist_map_function:nN {#1} \@@_strict_option_aux:n -} -\cs_new_protected:Npn \@@_strict_option_aux:n #1 { - \keys_define:nn { siunitx } - { #1 .code:n = - { \msg_warning:nnx { siunitx } { option-not-available } {#1} } - } -} -% \end{macrocode} -%\end{macro} -%\end{macro} -% -%\subsection{Locales} -% -% The basics for defining locales are easy: these are just meta keys. -% The US locale is simply an alias for the UK one, which is the default. -% \begin{macrocode} -\keys_define:nn { siunitx } { - locale .choice:, - locale / - DE .meta:n = - { - exponent-product = \ensuremath { \cdot } , - inter-unit-product = \, , - output-decimal-marker = { , } - }, - locale / - FR .meta:n = - { - exponent-product = \ensuremath { \times } , - inter-unit-product = \, , - output-decimal-marker = { , } - }, - locale / - UK .meta:n = - { - exponent-product = \ensuremath { \times } , - inter-unit-product = \, , - output-decimal-marker = . - }, - locale / - US .meta:n = { locale = UK }, - locale / - USA .meta:n = { locale = UK }, - locale / - ZA .meta:n = - { - exponent-product = \ensuremath { \times } , - inter-unit-product = \ensuremath { \cdot } , - output-decimal-marker = { , } - }, -} -% \end{macrocode} -% -%\subsection{Localisation} -% -% Localisation makes use of the \pkg{translator} package. This only -% happens if it is available, and is transparent to the user. -% \begin{macrocode} -\file_if_exist:nT { translator.sty } - { - \RequirePackage { translator } - \usedictionary { translator-basic-dictionary } - \providetranslation [ to = English ] - { to~(numerical~range) } { to } - \providetranslation [ to = French ] - { to~(numerical~range) } { \`a } - \providetranslation [ to = German ] - { to~(numerical~range) } { bis } - \providetranslation [ to = Spanish ] - { to~(numerical~range) } { a } - \sisetup - { - list-final-separator = { ~ \translate { and } ~ }, - list-pair-separator = { ~ \translate { and } ~ }, - range-phrase = { ~ \translate { to~(numerical~range) } ~ } - } - } -% \end{macrocode} -% -% \subsection{Loading additional configurations} -% -% \begin{variable}{\c_@@_configuration_ext_tl} -% Logical mark-up for the file extension. -% \begin{macrocode} -\tl_const:Nn \c_@@_configuration_ext_tl { cfg } -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\@@_load_abbreviations:} -% \begin{macro}{\@@_load_binary:} -% Loading abbreviations is on by default, which therefore requires a bit -% of juggling. The idea here is that the abbreviations will be loaded unless -% specifically turned off. This can occur anywhere in the preamble. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - abbreviations .choice:, - abbreviations / - true .code:n = { \@@_load_abbreviations: }, - abbreviations / - false .code:n = - { \cs_set_eq:NN \@@_load_abbreviations: \prg_do_nothing: } , - abbreviations .default:n = true , - binary-units .choice:, - binary-units / - true .code:n = { \AtBeginDocument { \@@_load_binary: } }, - binary-units / - false .code:n = - { \cs_set_eq:NN \@@_load_binary: \prg_do_nothing: } , - binary-units .default:n = true - } -\cs_new_protected:Npn \@@_load_abbreviations: - { - \@onefilewithoptions { siunitx-abbreviations } [ ] [ ] - \c_@@_configuration_ext_tl - } -\cs_new_protected:Npn \@@_load_binary: - { - \@onefilewithoptions { siunitx-binary } [ ] [ ] - \c_@@_configuration_ext_tl - } -\AtBeginDocument { \@@_load_abbreviations: } -\@@_option_deactivate:n { abbreviations , binary } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% The version 1 options are not loaded as standard. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - version-1-compatibility .choice: , - version-1-compatibility / - true .code:n = - { - \@onefilewithoptions { siunitx-version-1 } [ ] [ ] - \c_@@_configuration_ext_tl - }, - version-1-compatibility / - false .code:n = { } , - version-1-compatibility .default:n = true - } -\@@_option_deactivate:n { version-1-compatibility } -% \end{macrocode} -% -% Dealing with the old \opt{load-configurations} option is pretty easy, as -% only one choice is important. -% \begin{macrocode} -\keys_define:nn { siunitx } { - load-configurations .code:n = - { - \clist_if_in:nnT {#1} { version-1 } - { - \@onefilewithoptions { siunitx-version-1 } [ ] [ ] - \c_@@_configuration_ext_tl - } - } -} -\@@_option_deactivate:n { load-configurations } -% \end{macrocode} -% -% Load any local configuration file. -% \begin{macrocode} -\file_if_exist:nT { siunitx . \c_@@_configuration_ext_tl } - { - \@onefilewithoptions { siunitx } [ ] [ ] - \c_@@_configuration_ext_tl - } -% \end{macrocode} -% -% Finally apply the settings given at load time. -% \begin{macrocode} -\ProcessKeysOptions { siunitx } -% \end{macrocode} -% -% Creating document commands has to happen here so it is after any load-time -% changes to the units available. -% \begin{macrocode} -\AtBeginDocument { - \bool_if:NTF \l_@@_create_free_bool - { \@@_unit_create_functions: } - { \@@_unit_create_empty_functions: } -} +%</interfaces> % \end{macrocode} % % \begin{macrocode} %</package> % \end{macrocode} % -%\subsection{Support for version one} -% -% \begin{macrocode} -%<*version-1> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplFile {siunitx-version-1.cfg} {2021-04-17} {2.8e} - {siunitx: Version 1 settings} -% \end{macrocode} -% -% The re-arrangements made to the code in version two, and in particular -% the new option names, mean that support for version one needs to be -% included explicitly. -% -% \begin{macrocode} -\keys_define:nn { siunitx } { - addsign .choice: , - addsign / - all .meta:n = { explicit-sign = + }, - addsign / - exp .meta:n = { explicit-sign = + }, - addsign / - false .meta:n = { explicit-sign = }, - addsign / - mant .meta:n = { explicit-sign = + }, - addsign / - none .meta:n = { explicit-sign = }, - addsign / - true .meta:n = { explicit-sign = + }, - addsign .default:n = { true }, - allowlitunits .meta:n = { free-standing-units = #1 }, - allowlitunits .default:n = { true }, - allowoptarg .meta:n = { unit-optional-argument = #1 }, - allowoptargs .default:n = { true }, - allowzeroexp .meta:n = { retain-zero-exponent = #1 }, - allowzeroexp .default:n = { true }, - alsoload .code:n = , - angformat .code:n = , - anglesep .choice: , - anglesep / - cdot .meta:n = - { arc-separator = \ensuremath { { } \cdot { } } }, - anglesep / - comma .meta:n = { arc-separator = \ensuremath { { {,} } } }, - anglesep / - fullstop .meta:n = { arc-separator = \ensuremath { { { . } } } }, - anglesep / - med .meta:n = { arc-separator = \ensuremath { \: } }, - anglesep / - medium .meta:n = { arc-separator = \ensuremath { \: } }, - anglesep / - none .meta:n = { arc-separator = }, - anglesep / - period .meta:n = { arc-separator = \ensuremath { { { . } } } }, - anglesep / - space .meta:n = { arc-separator = \text { ~ } }, - anglesep / - stop .meta:n = { arc-separator = \ensuremath { { { . } } } }, - anglesep / - thick .meta:n = { arc-separator = \ensuremath { \; } }, - anglesep / - thin .meta:n = { arc-separator = \ensuremath { \, } }, - anglesep / - tightcdot .meta:n = - { arc-separator = \ensuremath { \bgroup \cdot \egroup } }, - anglesep / - tighttimes .meta:n = - { arc-separator = \ensuremath { \bgroup \times \egroup } }, - anglesep / - times .meta:n = { arc-separator = \ensuremath { \times } }, - anglesep / - unknown .meta:n = { arc-separator = \ensuremath {#1} }, - astroang .meta:n = - { angle-symbol-over-decimal = #1 }, - astroang .default:n = { true }, - closeerr .meta:n = { close-bracket = \ensuremath {#1} }, - closefrac .meta:n = { close-bracket = \ensuremath {#1} }, - closerange .meta:n = { close-bracket = \ensuremath {#1} }, - colour .code:n = { color = #1 }, - colorall .code:n = , - colourall .code:n = , - colorneg .code:n = , - colourneg .code:n = , - colorunits .meta:n = , - colourunits .meta:n = , - colorvalues .meta:n = , - colourvalues .meta:n = , - decimalsymbol .choice: , - decimalsymbol / - cdot .meta:n = - { output-decimal-marker = \ensuremath { { } \cdot { } } }, - decimalsymbol / - comma .meta:n = { output-decimal-marker = { \ensuremath { { , } } } }, - decimalsymbol / - fullstop .meta:n = { output-decimal-marker = { \ensuremath { { . } } } }, - decimalsymbol / - period .meta:n = { output-decimal-marker = { \ensuremath { { . } } } }, - decimalsymbol / - stop .meta:n = { output-decimal-marker = { \ensuremath { { . } } } }, - decimalsymbol / - tightcdot .code:n = - { output-decimal-marker = \ensuremath { \bgroup \cdot \egroup } }, - decimalsymbol / - unknown .meta:n = { output-decimal-marker = \ensuremath {#1} }, - debug .code:n = , - detectdisplay .meta:n = { detect-display-math = #1 }, - detectdisplay .default:n = { true }, - digitsep .choice: , - digitsep / - cdot .meta:n = - { group-separator = \ensuremath { { } \cdot { } } }, - digitsep / - comma .meta:n = { group-separator = \ensuremath { { , } } }, - digitsep / - fullstop .meta:n = { group-separator = \ensuremath { . } }, - digitsep / - med .meta:n = { group-separator = \ensuremath { \: } }, - digitsep / - medium .meta:n = { group-separator = \ensuremath { \: } }, - digitsep / - none .meta:n = { group-separator = }, - digitsep / - period .meta:n = { group-separator = \ensuremath { . } }, - digitsep / - space .meta:n = { group-separator = \text { ~ } }, - digitsep / - stop .meta:n = { group-separator = \ensuremath { . } }, - digitsep / - thick .meta:n = { group-separator = \ensuremath { \; } }, - digitsep / - thin .meta:n = { group-separator = \ensuremath { \, } }, - digitsep / - tightcdot .meta:n = - { group-separator = \ensuremath { \bgroup \cdot \egroup } }, - digitsep / - tighttimes .meta:n = - { group-separator = \ensuremath { \bgroup \times \egroup } }, - digitsep / - times .meta:n = { group-separator = \ensuremath { \times } }, - digitsep / - unknown .meta:n = { group-separator = \ensuremath {#1} }, - dp .meta:n = - { - round-mode = places, - round-precision = #1, - }, - emulate .code:n = , - errspace .choice: , - errspace / - med .meta:n = { uncertainty-separator = \ensuremath { \: } }, - errspace / - medium .meta:n = { uncertainty-separator = \ensuremath { \: } }, - errspace / - none .meta:n = { uncertainty-separator = }, - errspace / - space .meta:n = { uncertainty-separator = \text { ~ } }, - errspace / - thick .meta:n = { uncertainty-separator = \ensuremath { \; } }, - errspace / - thin .meta:n = { uncertainty-separator = \ensuremath { \, } }, - errspace / - unknown .meta:n = { uncertainty-separator = \ensuremath {#1} }, - eVcorra .code:n = , - eVcorrb .code:n = , - expbase .choice: , - expbase / - ten .meta:n = { exponent-base = 10 }, - expbase / - two .meta:n = { exponent-base = 2 }, - expbase / - unknown .meta:n = { exponent-base = #1 }, - expproduct .choice: , - expproduct / - cdot .meta:n = - { exponent-product = \ensuremath { { } \cdot { } } }, - expproduct / - tightcdot .meta:n = - { exponent-product = \ensuremath { \bgroup \cdot \egroup } }, - expproduct / - tighttimes .meta:n = - { exponent-product = \ensuremath { \bgroup \times \egroup } }, - expproduct / - times .meta:n = { exponent-product = \ensuremath { \times } }, - expproduct / - unknown .meta:n = { exponent-product = \ensuremath {#1} }, - fixdp .choice:, - fixdp / - false .meta:n = { round-mode = none }, - fixdp / - true .meta:n = { round-mode = places }, - fixdp .default:n = { true }, - fixsf .choice: , - fixsf / - false .meta:n = { round-mode = none }, - fixsf / - true .meta:n = { round-mode = figures }, - fixsf .default:n = { true }, - fraction .choice: , - fraction / - frac .meta:n = { fraction-function = \frac }, - fraction / - nice .meta:n = { fraction-function = \frac }, - fraction / - sfrac .meta:n = { fraction-function = \sfrac }, - fraction / - ugly .meta:n = - { - fraction-function = \frac , - per-mode = symbol-or-fraction - }, - inlinebold .meta:n = { detect-inline-weight = #1 }, - log .code:n = , - load .code:n = , - loctolang .code:n = , - mathOmega .meta:n = { math-ohm = #1 }, - mathcelsius .meta:n = { math-celsius = #1 }, - mathdegree .meta:n = { math-degree = #1 }, - mathminute .meta:n = { math-arcminute = #1 }, - mathmu .meta:n = { math-micro = #1 }, - mathringA .meta:n = { math-angstrom = #1 }, - mathrm .code:n = - { \use:x { \keys_set:nn { siunitx } { math-rm = \exp_not:c {#1} } } }, - mathsOmega .meta:n = { math-ohm = #1 }, - mathscelsius .meta:n = { math-celsius = #1 }, - mathsdegree .meta:n = { math-degree = #1 }, - mathsecond .meta:n = { math-arcsecond = #1 }, - mathsf .code:n = - { \use:x { \keys_set:nn { siunitx } { math-sf = \exp_not:c {#1} } } }, - mathsminute .meta:n = { math-arcminute = #1 }, - mathsmu .meta:n = { math-micro = #1 }, - mathsringA .meta:n = { math-angstrom = #1 }, - mathsrm .code:n = - { \use:x { \keys_set:nn { siunitx } { math-rm= \exp_not:c {#1} } } }, - mathssecond .meta:n = { math-arcsecond = #1 }, - mathssf .code:n = - { \use:x { \keys_set:nn { siunitx } { math-sf = \exp_not:c {#1} } } }, - mathstt .code:n = - { \use:x { \keys_set:nn { siunitx } { math-tt = \exp_not:c {#1} } } }, - mathtt .code:n = - { \use:x { \keys_set:nn { siunitx } { math-tt = \exp_not:c {#1} } } }, - negcolor .meta:n = { negative-color = #1 }, - negcolour .meta:n = { negative-color = #1 }, - noload .code:n = , - numaddn .meta:n = { input-symbols = #1 }, - numcloseerr .meta:n = { input-close-uncertainty = #1 }, - numdecimal .meta:n = { input-decimal-markers = #1 }, - numdigits .meta:n = { input-digits = #1 }, - numdiv .meta:n = { input-quotient = #1 }, - numexp .meta:n = { input-exponent-markers = #1 }, - numgobble .meta:n = { input-ignore = #1 }, - numopenerr .meta:n = { input-open-uncertainty = #1 }, - numprod .meta:n = { input-product = #1 }, - numsign .meta:n = { input-signs = #1 }, - obeyall .meta:n = { detect-all = #1 }, - obeyall .default:n = { true }, - obeybold .meta:n = { detect-weight = #1 }, - obeybold .default:n = { true }, - obeyfamily .meta:n = { detect-family = #1 }, - obeyfamily .default:n = { true }, - obeyitalic .meta:n = { detect-shape = #1 }, - obeyitalic .default:n = { true }, - obeymode .meta:n = { detect-mode = #1 }, - obeymode .default:n = { true }, - openerr .meta:n = { open-bracket = \ensuremath {#1} }, - openfrac .meta:n = { open-bracket = \ensuremath {#1} }, - openrange .meta:n = { open-bracket = \ensuremath {#1} }, - padangle .choice: , - padangle / - all .meta:n = - { - add-arc-degree-zero = true, - add-arc-minute-zero = true, - add-arc-second-zero = true - }, - padangle / - both .meta:n = - { - add-arc-degree-zero = true, - add-arc-minute-zero = true, - add-arc-second-zero = true - }, - padangle / - false .meta:n = - { - add-arc-degree-zero = false, - add-arc-minute-zero = false, - add-arc-second-zero = false - }, - padangle / - large .meta:n = - { - add-arc-degree-zero = true, - add-arc-minute-zero = true, - add-arc-second-zero = false - }, - padangle / - none .meta:n = - { - add-arc-degree-zero = false, - add-arc-minute-zero = false, - add-arc-second-zero = false - }, - padangle / - small .meta:n = - { - add-arc-degree-zero = false, - add-arc-minute-zero = true, - add-arc-second-zero = true - }, - true .meta:n = - { - add-arc-degree-zero = true, - add-arc-minute-zero = true, - add-arc-second-zero = true - }, - padnumber .choice: , - padnumber / - all .meta:n = - { - add-decimal-zero = true, - add-integer-zero = true - }, - padnumber / - both .meta:n = - { - add-decimal-zero = true, - add-integer-zero = true - }, - padnumber / - false .meta:n = - { - add-decimal-zero = false, - add-integer-zero = false - }, - padnumber / - leading .meta:n = - { - add-decimal-zero = true, - add-integer-zero = false - }, - padnumber / - none .meta:n = - { - add-decimal-zero = false, - add-integer-zero = false - }, - padnumber / - trailing .meta:n = - { - add-decimal-zero = false, - add-integer-zero = true - }, - padnumber / - true .meta:n = - { - add-decimal-zero = true, - add-integer-zero = true - }, - per .choice: , - per / - frac .meta:n = { per-mode = fraction }, - per / - fraction .meta:n = { per-mode = fraction }, - per / - reciprocal .meta:n = { per-mode = reciprocal }, - per / - slash .meta:n = { per-mode = symbol }, - prefixbase .code:n = , - prefixproduct .code:n = , - prefixsymbolic .meta:n = { prefixes-as-symbols = #1 }, - prefixsymbolic .default:n = { true }, - prespace .meta:n = { space-before-unit = #1 }, - prespace .default:n = { true }, - redefsymbols .meta:n = { redefine-symbols = #1 }, - redefsymbols .default:n = { true }, - repeatunits .choice: , - repeatunits / - false .meta:n = - { - multi-part-units = single, - product-units = single, - range-units = single - }, - repeatunits / - power .meta:n = - { - multi-part-units = repeat, - product-units = power, - range-units = repeat - }, - repeatunits / - true .meta:n = - { - multi-part-units = repeat, - product-units = repeat, - range-units = repeat - }, - repeatunits .default:n = { true }, - retainplus .meta:n = { retain-explicit-plus = #1 }, - retainplus .default:n = { true }, - seperr .meta:n = { separate-uncertainty = #1 }, - seperr .default:n = { true }, - sepfour .meta:n = { group-four-digits = true }, - sepfour .default:n = { true }, - sf .meta:n = - { - round-mode = figures, - round-precision = #1, - }, - sign .meta:n = { explicit-sign = #1 }, - slash .choice: , - slash / - slash .meta:n = { per-symbol = \ensuremath { / } }, - slash / - unknown .meta:n = { per-symbol = \ensuremath {#1} }, - stickyper .meta:n = { sticky-per = #1 }, - stickyper .default:n = { true }, - strictarc .code:n = , - tabalign .code:n = - { - \str_if_eq:nnTF {#1} { centre } - { \keys_set:nn { siunitx } { table-alignment = center } } - { \keys_set:nn { siunitx } { table-alignment = #1 } } - }, - tabalignexp .code:n = { table-align-exponent = #1 }, - tabautofit .meta:n = { table-auto-round = #1 }, - tabautofit .default:n = { true }, - tabexpalign .code:n = { table-align-exponent = #1 }, - tabformat .meta:n = { table-format = #1 }, - tabnumalign .code:n = - { - \str_if_eq:nnTF {#1} { centre } - { \keys_set:nn { siunitx } { table-number-alignment = center } } - { - \str_if_eq:nnTF {#1} { centredecimal } - { - \keys_set:nn { siunitx } - { table-number-alignment = center-decimal-marker } - } - { - \str_if_eq:nnTF {#1} { centerdecimal } - { - \keys_set:nn { siunitx } - { table-number-alignment = center-decimal-marker } - } - { - \keys_set:nn { siunitx } - { table-number-alignment = #1 } - } - } - } - }, - tabparseonly .meta:n = { table-parse-only = #1 }, - tabparseonly .default:n = { true }, - tabtextalign .code:n = - { - \str_if_eq:nnTF {#1} { centre } - { \keys_set:nn { siunitx } { table-text-alignment = center } } - { \keys_set:nn { siunitx } { table-text-alignment = #1 } } - }, - tabunitalign .code:n = - { - \str_if_eq:nnTF {#1} { centre } - { \keys_set:nn { siunitx } { table-unit-alignment = center } } - { \keys_set:nn { siunitx } { table-unit-alignment = #1 } } - }, - textOmega .meta:n = { text-ohm = #1 }, - textcelsius .meta:n = { text-celsius = #1 }, - textdegree .meta:n = { text-degree = #1 }, - textminute .meta:n = { text-arcminute = #1 }, - textmode .choice: , - textmode / - true .meta:n = { mode = text }, - textmode / - false .meta:n = { mode = math }, - textmode .default:n = { true }, - textmu .meta:n = { text-micro = #1 }, - textringA .meta:n = { text-angstrom = #1 }, - textrm .code:n = - { \use:x { \keys_set:nn { siunitx } { text-rm = \exp_not:c {#1} } } }, - textsecond .meta:n = { text-arcsecond = #1 }, - textsf .code:n = - { \use:x { \keys_set:nn { siunitx } { text-sf = \exp_not:c {#1} } } }, - texttt .code:n = - { \use:x { \keys_set:nn { siunitx } { text-tt = \exp_not:c {#1} } } }, - tightpm .meta:n = { tight-spacing = #1 }, - tightpm .default:n = { true }, - tophrase .meta:n = { range-phrase = #1 }, - trapambigerr .choice: , - trapambigerr - / false .meta:n = { multi-part-units = single }, - trapambigerr - / true .meta:n = { multi-part-units = brackets }, - trapambigerr .default:n = { true }, - trapambigfrac .meta:n = { bracket-numbers = #1 }, - trapambigfrac .default:n = { true }, - trapambigrange .choice: , - trapambigrange - / false .meta:n = { range-units = single }, - trapambigrange - / true .meta:n = { range-units = brackets }, - trapambigrange .default:n = { true }, - unitcolor .meta:n = { unit-color = #1 }, - unitcolour .meta:n = { unit-color = #1 }, - unitmathrm .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-rm = \exp_not:c {#1} } } }, - unitmathsf .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-sf = \exp_not:c {#1} } } }, - unitmathsrm .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-rm = \exp_not:c {#1} } } }, - unitmathssf .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-sf = \exp_not:c {#1} } } }, - unitmathstt .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-tt = \exp_not:c {#1} } } }, - unitmathtt .code:n = - { \use:x { \keys_set:nn { siunitx } { unit-math-tt = \exp_not:c {#1} } } }, - unitmode .meta:n = { unit-mode = #1 }, - unitsep .choice: , - unitsep / - cdot .meta:n = - { inter-unit-product = \ensuremath { { } \cdot { } } }, - unitsep / - comma .meta:n = { inter-unit-product = { {,} } }, - unitsep / - fullstop .meta:n = { inter-unit-product = { { . } } }, - unitsep / - med .meta:n = { inter-unit-product = \ensuremath { \: } }, - unitsep / - medium .meta:n = { inter-unit-product = \ensuremath { \: } }, - unitsep / - none .meta:n = { inter-unit-product = }, - unitsep / - period .meta:n = { inter-unit-product = { { . } } }, - unitsep / - space .meta:n = { inter-unit-product = \text { ~ } }, - unitsep / - stop .meta:n = { inter-unit-product = { { . } } }, - unitsep / - thick .meta:n = { inter-unit-product = \ensuremath { \; } }, - unitsep / - thin .meta:n = { inter-unit-product = \, }, - unitsep / - tightcdot .meta:n = - { inter-unit-product = \ensuremath { \bgroup \cdot \egroup } }, - unitsep / - tighttimes .meta:n = - { inter-unit-product = \ensuremath { \bgroup \times \egroup } }, - unitsep / - times .meta:n = { inter-unit-product = \ensuremath { \times } }, - unitsep / - unknown .meta:n = { inter-unit-product = \ensuremath {#1} }, - unitspace .choice: , - unitspace / - med .meta:n = { inter-unit-product = \ensuremath { \: } }, - unitspace / - medium .meta:n = { inter-unit-product = \ensuremath { \: } }, - unitspace / - none .meta:n = { inter-unit-product = }, - unitspace / - space .meta:n = { inter-unit-product = \text { ~ } }, - unitspace / - thick .meta:n = { inter-unit-product = \ensuremath { \; } }, - unitspace / - thin .meta:n = { inter-unit-product = \, }, - unitspace / - unknown .meta:n = { inter-unit-product = \ensuremath {#1} }, - valuecolor .meta:n = { number-color = #1 }, - valuecolour .meta:n = { number-color = #1 }, - valuemathrm .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-rm = \exp_not:c {#1} } } }, - valuemathsf .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-sf = \exp_not:c {#1} } } }, - valuemathsrm .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-rm = \exp_not:c {#1} } } }, - valuemathssf .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-sf = \exp_not:c {#1} } } }, - valuemathstt .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-tt = \exp_not:c {#1} } } }, - valuemathtt .code:n = - { \use:x { \keys_set:nn { siunitx } { number-math-tt = \exp_not:c {#1} } } }, - valuemode .meta:n = { number-mode = #1 }, - valuesep .choice: , - valuesep / - cdot .meta:n = - { number-unit-product = \ensuremath { { } \cdot { } } }, - valuesep / - comma .meta:n = { number-unit-product = { {,} } }, - valuesep / - fullstop .meta:n = { number-unit-product = { { . } } }, - valuesep / - med .meta:n = { number-unit-product = \ensuremath { \: } }, - valuesep / - medium .meta:n = { number-unit-product = \ensuremath { \: } }, - valuesep / - none .meta:n = { number-unit-product = }, - valuesep / - period .meta:n = { number-unit-product = { { . } } }, - valuesep / - space .meta:n = { number-unit-product = \text { ~ } }, - valuesep / - stop .meta:n = { number-unit-product = { { . } } }, - valuesep / - thick .meta:n = { number-unit-product = \ensuremath { \; } }, - valuesep / - thin .meta:n = { number-unit-product = \, }, - valuesep / - tightcdot .meta:n = - { number-unit-product = \ensuremath { \bgroup \cdot \egroup } }, - valuesep / - tighttimes .meta:n = - { number-unit-product = \ensuremath { \bgroup \times \egroup } }, - valuesep / - times .meta:n = { number-unit-product = \ensuremath { \times } }, - valuesep / - unknown .meta:n = { number-unit-product = \ensuremath {#1} }, - xspace .meta:n = { use-xspace = #1 }, - xspace .default:n = { true }, -} -% \end{macrocode} -% -% The error can be simplified here: if the option is not known, then -% it really is an error. -% \begin{macrocode} -\keys_define:nn { siunitx } { - unknown .code:n = - { - \msg_error:nnx { siunitx } { unknown-option } - { \exp_not:V \l_keys_key_tl } - } -} -% \end{macrocode} -% -% A couple of settings which are slightly different by default in -% version 1. -% \begin{macrocode} -\keys_set:nn { siunitx } {free-standing-units = true} -% \end{macrocode} -% -%\begin{macro}{ -% \newunit , -% \renewunit , -% \provideunit -%} -% The functions for creating units from version one are easy to create. -% \begin{macrocode} -\cs_new_eq:NN \newunit \DeclareSIUnit -\cs_new_eq:NN \renewunit \DeclareSIUnit -\cs_new_eq:NN \provideunit \DeclareSIUnit -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \newpower , -% \renewpower , -% \providepower -%} -% Slightly more complex: an optional argument to check. A simple -% assumption is made that it will be \texttt{post}: anything else -% would not make sense anyway. -% \begin{macrocode} -\NewDocumentCommand \newpower { o m m } { - \IfNoValueTF {#1} - { \DeclareSIPrePower #2 {#3} } - { \DeclareSIPostPower #2 {#3} } -} -\NewDocumentCommand \renewpower { o m m } { - \IfNoValueTF {#1} - { \DeclareSIPrePower #2 {#3} } - { \DeclareSIPostPower #2 {#3} } -} -\NewDocumentCommand \providepower { o m m } { - \IfNoValueTF {#1} - { \DeclareSIPrePower #2 {#3} } - { \DeclareSIPostPower #2 {#3} } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \newprefix , -% \renewprefix , -% \provideprefix -%} -% Slightly more complex: an optional argument to check. A simple -% assumption is made that it will be \texttt{post}: anything else -% would not make sense anyway. -% \begin{macrocode} -\NewDocumentCommand \newprefix { o m m m } { - \IfNoValueTF {#1} - { \DeclareSIPrefix #2 {#3} {#4} } - { \DeclareBinaryPrefix #2 {#3} {#4} } -} -\NewDocumentCommand \renewprefix { o m m m } { - \IfNoValueTF {#1} - { \DeclareSIPrefix #2 {#3} {#4} } - { \DeclareBinaryPrefix #2 {#3} {#4} } -} -\NewDocumentCommand \provideprefix { o m m m } { - \IfNoValueTF {#1} - { \DeclareSIPrefix #2 {#3} {#4} } - { \DeclareBinaryPrefix #2 {#3} {#4} } -} -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \newqualifier , -% \renewqualifier , -% \providequalifier -%} -% The functions for creating qualifiers are easy to create again. -% \begin{macrocode} -\NewDocumentCommand \newqualifier { m m } { - \@@_declare_qualifier:Nn #1 {#2} -} -\cs_new_eq:NN \renewqualifier \newqualifier -\cs_new_eq:NN \providequalifier \newqualifier -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \Square , -% \ssquare -%} -% In version 1, \cs{square} is not used with these two alternatives -% preferred. -% \begin{macrocode} -\DeclareSIPrePower \Square { 2 } -\DeclareSIPrePower \ssquare { 2 } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \BAR , -% \bbar , -% \Day , -% \dday , -% \Gray , -% \ggray -%} -% Units which are given awkward names in version one. -% \begin{macrocode} -\DeclareSIUnit \BAR { \bar } -\DeclareSIUnit \bbar { \bar } -\DeclareSIUnit \Day { \day } -\DeclareSIUnit \dday { \day } -\DeclareSIUnit \Gray { \gray } -\DeclareSIUnit \ggray { \gray } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \atomicmass , -% \arcmin , -% \arcsec -%} -% Slightly different: given more complete names in version two. -% \begin{macrocode} -\DeclareSIUnit \atomicmass { \atomicmassunit } -\DeclareSIUnit \arcmin { \arcminute } -\DeclareSIUnit \arcsec { \arcsecond } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \are , -% \curie , -% \gal , -% \millibar , -% \rad , -% \rem , -% \roentgen -%} -% Units which were defined in version one but are no longer listed -% by the \textsc{bipm} as acceptable. -% \begin{macrocode} -\DeclareSIUnit \are { a } -\DeclareSIUnit \curie { Ci } -\DeclareSIUnit \gal { Gal } -\DeclareSIUnit \millibar { \milli \bar } -\DeclareSIUnit \rad { rad } -\DeclareSIUnit \rem { rem } -\DeclareSIUnit \roentgen { R } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \micA , -% \micmol , -% \micl , -% \micL , -% \nanog , -% \micg , -% \picm , -% \micm , -% \Sec , -% \mics , -% \cmc , -% \dmc , -% \cms -%} -% A few abbreviations which have been renamed. -% \begin{macrocode} -\DeclareSIUnit \micA { \micro \ampere } -\DeclareSIUnit \micmol { \micro \mole } -\DeclareSIUnit \micl { \micro \litre } -\DeclareSIUnit \micL { \micro \liter } -\DeclareSIUnit \nanog { \nano \gram } -\DeclareSIUnit \micg { \micro \gram } -\DeclareSIUnit \picm { \pico \metre } -\DeclareSIUnit \micm { \micro \metre } -\DeclareSIUnit \Sec { \second } -\DeclareSIUnit \mics { \micro \second } -\DeclareSIUnit \cmc { \centi \metre \cubed } -\DeclareSIUnit \dmc { \deci \metre \cubed } -\DeclareSIUnit \cms { \centi \metre \squared } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \centimetrecubed , -% \centimetresquared , -% \cubiccentimetre , -% \cubicdecimetre , -% \squarecentimetre , -% \squaremetre , -% \squarekilometre -%} -% Units from version one that did not seem like a good idea to retain. -% \begin{macrocode} -\DeclareSIUnit \centimetrecubed { \centi \metre \cubed } -\DeclareSIUnit \centimetresquared { \centi \metre \squared } -\DeclareSIUnit \cubiccentimetre { \centi \metre \cubed } -\DeclareSIUnit \cubicdecimetre { \deci \metre \cubed } -\DeclareSIUnit \squarecentimetre { \centi \metre \squared } -\DeclareSIUnit \squaremetre { \metre \squared } -\DeclareSIUnit \squarekilometre { \kilo \metre \squared } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \parsec , -% \lightyear -%} -% A few units for astronomy that version 1 provided. -% \begin{macrocode} -\DeclareSIUnit \parsec { pc } -\DeclareSIUnit \lightyear { ly } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \gmol , -% \kgmol , -% \lbmol -%} -% Slightly odd chemical engineering units, again provided in version 1. -% \begin{macrocode} -\DeclareSIUnit \gmol { g \text { - } mol } -\DeclareSIUnit \kgmol { kg \text { - } mol } -\DeclareSIUnit \lbmol { lb \text { - } mol } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \molar , -% \Molar , -% \torr -%} -% A few common units for chemistry from version 1. \cs{molar} is -% simply a handy abbreviation: \cs{Molar} is common but rather -% questionable. -% \begin{macrocode} -\DeclareSIUnit \molar { \mole \per \cubic \deci \metre } -\DeclareSIUnit \Molar { \textsc { m } } -\DeclareSIUnit \torr { Torr } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\gon} -% A single unit for geophysics that version 1 included. -% \begin{macrocode} -\DeclareSIUnit \gon { gon } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{\clight} -% Version one had a different definition for \cs{clight}. -% \begin{macrocode} -\DeclareSIUnit \clight { \text { \ensuremath { c } } } -% \end{macrocode} -%\end{macro} -% -%\begin{macro}{ -% \micron , -% \mrad , -% \gauss , -% \eVperc , -% \nanobarn , -% \picobarn , -% \femptobarn , -% \attobarn , -% \zeptobarn , -% \yoctobarn , -% \nb , -% \pb , -% \fb , -% \ab , -% \zb -%} -% High-energy physics units from version one. -% \begin{macrocode} -\DeclareSIUnit \micron { \micro \metre } -\DeclareSIUnit \mrad { \milli \rad } -\DeclareSIUnit \gauss { G } -\DeclareSIUnit \eVperc { \eV \per \clight } -\DeclareSIUnit \nanobarn { \nano \barn } -\DeclareSIUnit \picobarn { \pico \barn } -\DeclareSIUnit \femtobarn { \femto \barn } -\DeclareSIUnit \attobarn { \atto \barn } -\DeclareSIUnit \zeptobarn { \zepto \barn } -\DeclareSIUnit \yoctobarn { \yocto \barn } -\DeclareSIUnit \nb { \nano \barn } -\DeclareSIUnit \pb { \pico \barn } -\DeclareSIUnit \fb { \femto \barn } -\DeclareSIUnit \ab { \atto \barn } -\DeclareSIUnit \zb { \zepto \barn } -\DeclareSIUnit \yb { \yocto \barn } -% \end{macrocode} -%\end{macro} -% -% \begin{macro}{\requiresiconfigs} -% Version one provides this, and it might pop up so should not -% cause errors. -% \begin{macrocode} -\NewDocumentCommand \requiresiconfigs { m } - { \keys_set:nn { siunitx } { version-1-compatibility } } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</version-1> -% \end{macrocode} -% -% \subsection{Abbreviated units} -% -% \begin{macrocode} -%<*abbreviations> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplFile {siunitx-abbreviations.cfg} {2021-04-17} {2.8e} - {siunitx: Abbreviated units} -% \end{macrocode} -% -% The abbreviation file contains a number of short (mainly two or -% three letter) versions of the usual long names. They are divided up -% into related groups, mainly to avoid an overly long list in one -% place. -% -% \begin{macro}{\A, \pA, \nA, \uA, \mA, \kA} -% Currents. -% \begin{macrocode} -\DeclareSIUnit \A { \ampere } -\DeclareSIUnit \pA { \pico \ampere } -\DeclareSIUnit \nA { \nano \ampere } -\DeclareSIUnit \uA { \micro \ampere } -\DeclareSIUnit \mA { \milli \ampere } -\DeclareSIUnit \kA { \kilo \ampere } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\Hz, \mHz, \kHz, \MHz, \GHz, \THz} -% Then frequencies. -% \begin{macrocode} -\DeclareSIUnit \Hz { \hertz } -\DeclareSIUnit \mHz { \milli \hertz } -\DeclareSIUnit \kHz { \kilo \hertz } -\DeclareSIUnit \MHz { \mega \hertz } -\DeclareSIUnit \GHz { \giga \hertz } -\DeclareSIUnit \THz { \tera \hertz } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mol, \fmol, \pmol, \nmol, \umol, \mmol, \kmol} -% Amounts of substance (moles). -% \begin{macrocode} -\DeclareSIUnit \mol { \mole } -\DeclareSIUnit \fmol { \femto \mole } -\DeclareSIUnit \pmol { \pico \mole } -\DeclareSIUnit \nmol { \nano \mole } -\DeclareSIUnit \umol { \micro \mole } -\DeclareSIUnit \mmol { \milli \mole } -\DeclareSIUnit \kmol { \kilo \mole } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\V, \pV, \nV, \uV, \mV, \kV} -% Potentials. -% \begin{macrocode} -\DeclareSIUnit \V { \volt } -\DeclareSIUnit \pV { \pico \volt } -\DeclareSIUnit \nV { \nano \volt } -\DeclareSIUnit \uV { \micro \volt } -\DeclareSIUnit \mV { \milli \volt } -\DeclareSIUnit \kV { \kilo \volt } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\hl, \l, \ml, \ul, \hL, \L, \mL, \uL} -% Volumes. -% \begin{macrocode} -\DeclareSIUnit \hl { \hecto \litre } -\DeclareSIUnit \l { \litre } -\DeclareSIUnit \ml { \milli \litre } -\DeclareSIUnit \ul { \micro \litre } -\DeclareSIUnit \hL { \hecto \liter } -\DeclareSIUnit \L { \liter } -\DeclareSIUnit \mL { \milli \liter } -\DeclareSIUnit \uL { \micro \liter } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\fg, \pg, \ng, \ug, \mg, \g, \kg, \amu} -% Masses. -% \begin{macrocode} -\DeclareSIUnit \fg { \femto \gram } -\DeclareSIUnit \pg { \pico \gram } -\DeclareSIUnit \ng { \nano \gram } -\DeclareSIUnit \ug { \micro \gram } -\DeclareSIUnit \mg { \milli \gram } -\DeclareSIUnit \g { \gram } -\DeclareSIUnit \kg { \kilo \gram } -\DeclareSIUnit \amu { \atomicmassunit } -% \end{macrocode} -% \end{macro} -% \begin{macro} -% {\W, \uW, \mW, \kW, \MW, \GW, \kJ, \J, \mJ, \uJ, \eV, \meV, \keV, \MeV, \GeV, \TeV, \kWh} -% Energies. -% \begin{macrocode} -\DeclareSIUnit \W { \watt } -\DeclareSIUnit \uW { \micro \watt } -\DeclareSIUnit \mW { \milli \watt } -\DeclareSIUnit \kW { \kilo \watt } -\DeclareSIUnit \MW { \mega \watt } -\DeclareSIUnit \GW { \giga \watt } -\DeclareSIUnit \J { \joule } -\DeclareSIUnit \uJ { \micro \joule } -\DeclareSIUnit \mJ { \milli \joule } -\DeclareSIUnit \kJ { \kilo \joule } -\DeclareSIUnit \eV { \electronvolt } -\DeclareSIUnit \meV { \milli \electronvolt } -\DeclareSIUnit \keV { \kilo \electronvolt } -\DeclareSIUnit \MeV { \mega \electronvolt } -\DeclareSIUnit \GeV { \giga \electronvolt } -\DeclareSIUnit \TeV { \tera \electronvolt } -\DeclareSIUnit [ inter-unit-product = ] \kWh { \kilo \watt \hour } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\m, \pm, \nm, \um, \mm, \cm, \dm, \km} -% Lengths. -% \begin{macrocode} -\DeclareSIUnit \m { \metre } -\DeclareSIUnit \pm { \pico \metre } -\DeclareSIUnit \nm { \nano \metre } -\DeclareSIUnit \um { \micro \metre } -\DeclareSIUnit \mm { \milli \metre } -\DeclareSIUnit \cm { \centi \metre } -\DeclareSIUnit \dm { \deci \metre } -\DeclareSIUnit \km { \kilo \metre } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\K} -% Temperatures. -% \begin{macrocode} -\DeclareSIUnit \K { \kelvin } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\dB} -% \begin{macrocode} -\DeclareSIUnit \dB { \deci \bel } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\F, \fF, \pF} -% \begin{macrocode} -\DeclareSIUnit \F { \farad } -\DeclareSIUnit \fF { \femto \farad } -\DeclareSIUnit \pF { \pico \farad } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\N, \mN, \kN, \MN} -% Forces. -% \begin{macrocode} -\DeclareSIUnit \N { \newton } -\DeclareSIUnit \mN { \milli \newton } -\DeclareSIUnit \kN { \kilo \newton } -\DeclareSIUnit \MN { \mega \newton } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\Pa, \kPa, \MPa, \GPa} -% Pressures. -% \begin{macrocode} -\DeclareSIUnit \Pa { \pascal } -\DeclareSIUnit \kPa { \kilo \pascal } -\DeclareSIUnit \MPa { \mega \pascal } -\DeclareSIUnit \GPa { \giga \pascal } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mohm, \kohm, \Mohm} -% Resistances. -% \begin{macrocode} -\DeclareSIUnit \mohm { \milli \ohm } -\DeclareSIUnit \kohm { \kilo \ohm } -\DeclareSIUnit \Mohm { \mega \ohm } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\s, \as, \fs, \ps, \ns, \us, \ms} -% Finally, times. -% \begin{macrocode} -\DeclareSIUnit \s { \second } -\DeclareSIUnit \as { \atto \second } -\DeclareSIUnit \fs { \femto \second } -\DeclareSIUnit \ps { \pico \second } -\DeclareSIUnit \ns { \nano \second } -\DeclareSIUnit \us { \micro \second } -\DeclareSIUnit \ms { \milli \second } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</abbreviations> -% \end{macrocode} -% -% \subsection{Binary units} -% -% \begin{macrocode} -%<*binary> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplFile {siunitx-binary.cfg} {2021-04-17} {2.8e} - {siunitx: Binary units} -% \end{macrocode} -% -% \begin{macro}{\kibi, \mebi, \gibi, \tebi, \pebi, \exbi, \zebi, \yobi} -% The binary units as specified by the IEC. -% \begin{macrocode} -\DeclareBinaryPrefix \kibi { Ki } { 10 } -\DeclareBinaryPrefix \mebi { Mi } { 20 } -\DeclareBinaryPrefix \gibi { Gi } { 30 } -\DeclareBinaryPrefix \tebi { Ti } { 40 } -\DeclareBinaryPrefix \pebi { Pi } { 50 } -\DeclareBinaryPrefix \exbi { Ei } { 60 } -\DeclareBinaryPrefix \zebi { Zi } { 70 } -\DeclareBinaryPrefix \yobi { Yi } { 80 } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\bit, \byte} -% Now the units. -% \begin{macrocode} -\DeclareSIUnit \bit { bit } -\DeclareSIUnit \byte { B } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</binary> -% \end{macrocode} -% % \end{implementation} % -% \begin{thebibliography}{1} -% -% \bibitem{BIPM} -% \emph{The International System of Units (SI)}, -% \url{http://www.bipm.org/en/measurement-units/}. -% -% \bibitem{NIST} -% \emph{International System of Units from NIST}, -% \url{http://physics.nist.gov/cuu/Units/index.html}. -% -% \bibitem{SI:2.1} -% \emph{SI base units}, -% \url{http://www.bipm.org/en/publications/si-brochure/section2-1.html}. -% -% \bibitem{SI:2.2.2} -% \emph{Units with special names and symbols; units that -% incorporate special names and symbols}, -% \url{http://www.bipm.org/en/publications/si-brochure/section2-2-2.html}. -% -% \bibitem{SI:3.1} -% \emph{SI Prefixes}, -% \url{http://www.bipm.org/en/publications/si-brochure/chapter3.html}. -% -% \bibitem{SI:4.1.T6} -% \emph{Non-SI units accepted for use with the International -% System of Units}, -% \url{http://www.bipm.org/en/publications/si-brochure/table6.html}. -% -% \bibitem{SI:4.1.T7} -% \emph{Non-SI units whose values in SI units must be obtained -% experimentally}, -% \url{http://www.bipm.org/en/publications/si-brochure/table7.html}. -% -% \bibitem{SI:4.1.T8} -% \emph{Other non-SI units}, -% \url{http://www.bipm.org/en/publications/si-brochure/table8.html}. -% -% \bibitem{SI:5.3.3} -% \emph{Formatting the value of a quantity}, -% \url{http://www.bipm.org/en/publications/si-brochure/section5-3-3.html}. -% -% \end{thebibliography} -% -% \PrintChanges -% -% \newpage -% % \PrintIndex |