diff options
author | Karl Berry <karl@freefriends.org> | 2018-05-03 21:02:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-05-03 21:02:51 +0000 |
commit | 3bdba37dd5619bcbc46b0e684507cbb0f661eb8b (patch) | |
tree | badcc270fdf874e08aa0fe7a85048a5037cef25a /Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx | |
parent | 43cc6b933ec42794dc802aed3ef8ca8dbec6c70e (diff) |
siunitx (3may18)
git-svn-id: svn://tug.org/texlive/trunk@47596 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx | 2516 |
1 files changed, 0 insertions, 2516 deletions
diff --git a/Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx b/Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx deleted file mode 100644 index ea19c017b68..00000000000 --- a/Master/texmf-dist/source/latex/siunitx/siunitx-unit.dtx +++ /dev/null @@ -1,2516 +0,0 @@ -% \iffalse meta-comment -% -% File: siunitx-unit.dtx Copyright (C) 2014-2018 Joseph Wright -% -% 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 -% -% https://www.latex-project.org/lppl.txt -% -% This file is part of the "siunitx bundle" (The Work in LPPL) -% and all files in that bundle must be distributed together. -% -% The released version of this bundle is available from CTAN. -% -% ----------------------------------------------------------------------- -% -% The development version of the bundle can be found at -% -% https://github.com/josephwright/siunitx -% -% for those people who are interested. -% -% ----------------------------------------------------------------------- -% -%<*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 -% -% \GetFileInfo{siunitx.sty} -% -% \title{^^A -% \pkg{siunitx-unit} -- Parsing and formatting units^^A -% \thanks{This file describes \fileversion, -% last revised \filedate.}^^A -% } -% -% \author{^^A -% Joseph Wright^^A -% \thanks{^^A -% E-mail: -% \href{mailto:joseph.wright@morningstar2.co.uk} -% {joseph.wright@morningstar2.co.uk}^^A -% }^^A -% } -% -% \date{Released \filedate} -% -% \maketitle -% -% \begin{documentation} -% -% This submodule is dedicated to formatting physical units. The main function, -% \cs{siunitx_unit_format:nN}, takes user input specify physical units and -% converts it into a formatted token list suitable for typesetting in math -% mode. While the formatter will deal correctly with \enquote{literal} user -% input, the key strength of the module is providing a method to describe -% physical units in a \enquote{symbolic} manner. The output format of these -% symbolic units can then be controlled by a number of key--value options -% made available by the module. -% -% A small number of \LaTeXe{} math mode commands are assumed to be available -% as part of the formatted output. The \cs{mathchoice} command -% (normally the \TeX{} primitive) is needed when using -% |per-mode = symbol-or-fraction|. The command \cs{mathrm} is used for -% wrapping the text (letter) part of units. The commands \cs{frac}, -% \cs{mbox}, \verb*|\ | and \cs{,} are used by the standard module settings, -% and \cs{ensuremath}, \cs{hbar}, \cs{mathit} and \cs{mathrm} in some standard -% unit definitions (for atomic and natural units). For the display of colored -% (highlighted) and cancelled units, the commands \cs{textcolor} and -% \cs{cancel} are assumed to be available. -% -% \section{Formatting units} -% -% \begin{function}{\siunitx_unit_format:nN} -% \begin{syntax} -% \cs{siunitx_unit_format:nN} \Arg{units} \meta{tl~var} -% \end{syntax} -% This function converts the input \meta{units} into a processed -% \meta{tl~var} which can then be inserted in math mode to typeset the -% material. Where the \meta{units} are given in symbolic form, described -% elsewhere, this formatting process takes place in two stages: the -% \meta{units} are parsed into a structured form before the generation -% of the appropriate output form based on the active settings. When the -% \meta{units} are given as literals, processing is minimal: the -% characters |.| and |~| are converted to unit products (boundaries). -% In both cases, the result is a series of tokens intended to be typeset -% in math mode with appropriate choice of font for typesetting of the -% textual parts. -% -% For example, -% \begin{verbatim} -% \siunitx_unit_format:nN { \kilo \metre \per \second } \l_tmpa_tl -% \end{verbatim} -% will, with standard settings, result in \cs{l_tmpa_tl} being set to -% \begin{verbatim} -% \mathrm{km}\,\mathrm{s}^{-1} -% \end{verbatim} -% \end{function} -% -% \begin{function}{\siunitx_unit_format:nNN} -% \begin{syntax} -% \cs{siunitx_unit_format:nNN} \Arg{units} \meta{tl~var} \meta{fp~var} -% \end{syntax} -% This function formats the \meta{units} in the same way as described for -% \cs{siunitx_unit_format:nN}. When the input is given in symbolic form, -% any decimal unit prefixes will be extracted and the overall power of -% ten that these represent will be stored in the \meta{fp~var}. -% -% For example, -% \begin{verbatim} -% \siunitx_unit_format:nNN { \kilo \metre \per \second } -% \l_tmpa_tl \l_tmpa_fp -% \end{verbatim} -% will, with standard settings, result in \cs{l_tmpa_tl} being set to -% \begin{verbatim} -% \mathrm{m}\,\mathrm{s}^{-1} -% \end{verbatim} -% with \cs{l_tmpa_fp} taking value~$3$. Note that the latter is a floating -% point variable: it is possible for non-integer values to be obtained here. -% \end{function} -% -% \section{Defining symbolic units} -% -% \begin{function}{\siunitx_declare_prefix:Nnn} -% \begin{syntax} -% \cs{siunitx_declare_prefix:Nnn} \meta{prefix} \Arg{symbol} \Arg{power} -% \end{syntax} -% Defines a symbolic \meta{prefix} (which should be a control sequence -% such as |\kilo|) to be converted by the parser to the \meta{symbol}. -% The latter should consist of literal content (\emph{e.g.}~|k|). -% In literal mode the \meta{symbol} will be typeset directly. The prefix -% should represent an integer \meta{power} of $10$, and this information -% may be used to convert from one or more \meta{prefix} symbols to an -% overall power applying to a unit. See also -% \cs{siunitx_declare_prefix:Nn}. -% \end{function} -% -% \begin{function}{\siunitx_declare_prefix:Nn} -% \begin{syntax} -% \cs{siunitx_declare_prefix:Nn} \meta{prefix} \Arg{symbol} -% \end{syntax} -% Defines a symbolic \meta{prefix} (which should be a control sequence -% such as |\kilo|) to be converted by the parser to the \meta{symbol}. -% The latter should consist of literal content (\emph{e.g.}~|k|). -% In literal mode the \meta{symbol} will be typeset directly. In contrast -% to \cs{siunitx_declare_prefix:Nnn}, there is no assumption about the -% mathematical nature of the \meta{prefix}, \emph{i.e.}~the prefix may -% represent a power of any base. As a result, no conversion of the -% \meta{prefix} to a numerical power will be possible. -% \end{function} -% -% \begin{function}{\siunitx_declare_power:NNn} -% \begin{syntax} -% \cs{siunitx_declare_power:NnN} \meta{pre-power} \meta{post-power} \Arg{value} -% \end{syntax} -% Defines \emph{two} symbolic \meta{powers} (which should be control -% sequences such as |\squared|) to be converted by the parser to the -% \meta{value}. The latter should be an integer or floating point number in -% the format defined for \pkg{l3fp}. Powers may precede a unit or be give -% after it: both forms are declared at once, as indicated by the argument -% naming. In literal mode, the \meta{value} will be applied as -% a superscript to either the next token in the input (for the -% \meta{pre-power}) or appended to the previously-typeset material -% (for the \meta{post-power}). -% \end{function} -% -% \begin{function}{\siunitx_declare_qualifier:Nn} -% \begin{syntax} -% \cs{siunitx_declare_qualifier:Nn} \meta{qualifier} \Arg{meaning} -% \end{syntax} -% Defines a symbolic \meta{qualifier} (which should be a control sequence -% such as |\catalyst|) to be converted by the parser to the \meta{meaning}. -% The latter should consist of literal content (\emph{e.g.}~|cat|). In -% literal mode the \meta{meaning} will be typeset following a space after -% the unit to which it applies. -% \end{function} -% -% \begin{function}{\siunitx_declare_unit:Nn, \siunitx_declare_unit:Nx} -% \begin{syntax} -% \cs{siunitx_declare_unit:Nn} \meta{unit} \Arg{meaning} -% \end{syntax} -% Defines a symbolic \meta{unit} (which should be a control sequence -% such as |\kilogram|) to be converted by the parser to the \meta{meaning}. -% The latter may consist of literal content (\emph{e.g.}~|kg|), other -% symbolic unit commands (\emph{e.g.}~|\kilo\gram|) or a mixture of the two. -% In literal mode the \meta{meaning} will be typeset directly. -% \end{function} -% -% \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} -% -% \section{Pre-defined symbolic unit components} -% -% The unit parser is defined to recognise a number of pre-defined units, -% prefixes and powers, and also interpret a small selection of -% \enquote{generic} symbolic parts. -% -% Broadly, the pre-defined units are those defined by the \textsc{bipm} in the -% documentation for the \emph{International System of Units} (SI)~\cite{BIPM}. -% As far as possible, the names given to the command names for units are those -% used by the \textsc{bipm}, omitting spaces and using only \textsc{ascii} -% characters. The standard symbols are also taken from the same documentation. -% In the following documentation, the order of the description of units -% broadly follows the SI~Brochure. -% -% \begin{function} -% { -% \kilogram , -% \metre , -% \meter , -% \mole , -% \kelvin , -% \candela , -% \second , -% \ampere -% } -% The base units as defined in Section~2.1 of the SI Brochure~\cite{SI:2.1}. -% Notice that \cs{meter} is defined as an alias for \cs{metre} as the former -% spelling is common in the US (although the latter is the official spelling). -% \end{function} -% -% \begin{function}{\gram} -% The base unit \cs{kilogram} is defined using an SI prefix: as such the -% (derived) unit \cs{gram} is required by the module to correctly produce -% output for the \cs{kilogram}. -% \end{function} -% -% \begin{function} -% { -% \yocto , -% \zepto , -% \atto , -% \femto , -% \pico , -% \nano , -% \micro , -% \milli , -% \centi , -% \deci , -% \deca , -% \deka , -% \hecto , -% \kilo , -% \mega , -% \giga , -% \tera , -% \peta , -% \exa , -% \zetta , -% \yotta -% } -% Prefixes, all of which are integer powers of $10$: the powers are stored -% internally by the module and can be used for conversion from prefixes to -% their numerical equivalent. These prefixes are documented in Section~3.1 -% of the SI~Brochure~\cite{SI:3.1}. -% -% Note that the \cs{kilo} prefix is required to -% define the base \cs{kilogram} unit. Also note the two spellings available -% for \cs{deca}/\cs{deka}. -% \end{function} -% -% \begin{function} -% { -% \becquerel , -% \degreeCelsius , -% \coulomb , -% \farad , -% \gray , -% \hertz , -% \henry , -% \joule , -% \katal , -% \lumen , -% \lux , -% \newton , -% \ohm , -% \pascal , -% \radian , -% \siemens , -% \sievert , -% \steradian , -% \tesla , -% \volt , -% \watt , -% \weber -% } -% The defined SI~units with defined names and symbols, as given in -% Section~2.2.2 of the SI~Brochure~\cite{SI:2.2.2}. Notice that the names -% of the units are lower case with the exception of \cs{degreeCelsius}, and -% that this unit name includes \enquote{degree}. -% \end{function} -% -% \begin{function} -% { -% \day , -% \hectare , -% \hour , -% \litre , -% \liter , -% \minute , -% \tonne -% } -% Units accepted for use with the SI: here \cs{minute} is a unit of time -% not of plane angle. These units are taken from Table~4.1 of the -% SI~Brochure~\cite{SI:T6}. -% -% For the unit \cs{litre}, both |l| and |L| are listed -% as acceptable symbols: the latter is the standard setting of the module. -% The alternative spelling \cs{liter} is also given for this unit for US -% users (as with \cs{metre}, the official spelling is \enquote{re}). -% \end{function} -% -% \begin{function} -% { -% \arcminute , -% \arcsecond , -% \degree -% } -% Units for plane angles accepted for use with the SI: to avoid a clash -% with units for time, here \cs{arcminute} and \cs{arcsecond} are used in -% place of \cs{minute} and \cs{second}. These units are taken from Table~4.1 -% of the SI~Brochure~\cite{SI:T6}. -% \end{function} -% -% \begin{function} -% { -% \astronomicalunit , -% \atomicmassunit , -% \auaction , -% \aucharge , -% \auenergy , -% \aulength , -% \aumass , -% \autime , -% \bohr , -% \dalton , -% \electronvolt , -% \hartree , -% \nuaction , -% \numass , -% \nuspeed , -% \nutime -% } -% Non-SI where values must be determined experimentally. These units are taken from -% Table~7 of the SI~Brochure~\cite{SI:T7}. Where no better name is given for -% the unit in the SI~Brochure, the prefixes |nu| (natural unit) and |au| (atomic -% unit) are used. -% -% Note that the value of the natural unit of speed (the speed of light) is used -% to define the second and is thus not determined by experiment: it is however -% included in this set of units. -% \end{function} -% -% \begin{function} -% { -% \angstrom , -% \bar , -% \barn , -% \bel , -% \decibel , -% \knot , -% \millimetremercury , -% \nauticalmile , -% \neper -% } -% Non-SI units accepted for use with the SI. These units are taken from -% Table~8 of the SI~Brochure~\cite{SI:T8}. -% \end{function} -% -% \begin{function} -% { -% \dyne , -% \erg , -% \gal , -% \gauss , -% \maxwell , -% \oersted , -% \phot , -% \poise , -% \stilb , -% \stokes -% } -% Non-SI units associated with the CGS and the CGS-Gaussian system of units. -% These units are taken from Table~9 of the SI~Brochure~\cite{SI:T9}. -% \end{function} -% -% \begin{function}{\percent} -% The mathematical concept of percent, usable with the SI as detailed in -% Section~5.3.7 of the SI~Brochure~\cite{SI:5.3.7}. -% \end{function} -% -% \begin{function}{\square, \cubic} -% \begin{syntax} -% \cs{square} \meta{prefix} \meta{unit} -% \cs{cubic} \meta{prefix} \meta{unit} -% \end{syntax} -% Pre-defined unit powers which apply to the next \meta{prefix}/\meta{unit} -% combination. -% \end{function} -% -% \begin{function}{\squared, \cubed} -% \begin{syntax} -% \meta{prefix} \meta{unit} \cs{squared} -% \meta{prefix} \meta{unit} \cs{cubed} -% \end{syntax} -% Pre-defined unit powers which apply to the preceding -% \meta{prefix}/\meta{unit} combination. -% \end{function} -% -% \begin{function}{\per} -% \begin{syntax} -% \cs{per} \meta{prefix} \meta{unit} \meta{power} -% \end{syntax} -% Indicates that the next \meta{prefix}/\meta{unit}/\meta{power} combination -% is reciprocal, \emph{i.e.}~raises it to the power $-1$. This symbolic -% representation may be applied in addition to a \cs{power}, and will work -% correctly if the \cs{power} itself is negative. In literal mode \cs{per} -% will print a slash (\enquote{$/$}). -% \end{function} -% -% \begin{function}{\cancel} -% \begin{syntax} -% \cs{cancel} \meta{prefix} \meta{unit} \meta{power} -% \end{syntax} -% Indicates that the next \meta{prefix}/\meta{unit}/\meta{power} combination -% should be \enquote{cancelled out}. In the parsed output, the entire unit -% combination will be given as the argument to a function \cs{cancel}, which -% is assumed to be available at a higher level. In literal mode, the same -% higher-level \cs{cancel} will be applied to the next token. It is the -% responsibility of the calling code to provide an appropriate definition -% for \cs{cancel} outside of the scope of the unit parser. -% \end{function} -% -% \begin{function}{\highlight} -% \begin{syntax} -% \cs{highlight} \Arg{color} \meta{prefix} \meta{unit} \meta{power} -% \end{syntax} -% Indicates that the next \meta{prefix}/\meta{unit}/\meta{power} combination -% should be highlighted in the specified \meta{color}. In the parsed output, -% the entire unit combination will be given as the argument to a function -% \cs{textcolor}, which is assumed to be available at a higher level. In -% literal mode, the same higher-level \cs{textcolor} will be applied to the -% next token. It is the responsibility of the calling code to provide an -% appropriate definition for \cs{textcolor} outside of the scope of the unit -% parser. -% \end{function} -% -% \begin{function}{\of} -% \begin{syntax} -% \meta{prefix} \meta{unit} \meta{power} \cs{of} \Arg{qualifier} -% \end{syntax} -% Indicates that the \meta{qualifier} applies to the current -% \meta{prefix}/\meta{unit}/\meta{power} combination. In parsed mode, the -% display of the result will depend upon module options. In literal mode, -% the \meta{qualifier} will be printed in parentheses following the preceding -% \meta{unit} and a full-width space. -% \end{function} -% -% \begin{function}{\raiseto, \tothe} -% \begin{syntax} -% \cs{raiseto} \Arg{power} \meta{prefix} \meta{unit} -% \meta{prefix} \meta{unit} \cs{tothe} \Arg{power} -% \end{syntax} -% Indicates that the \meta{power} applies to the current -% \meta{prefix}/\meta{unit} combination. As shown, \cs{raiseto} applies to -% the next \meta{unit} whereas \cs{tothe} applies to the preceding unit. In -% literal mode the \cs{power} will be printed as a superscript attached to -% the next token (\cs{raiseto}) or preceding token (\cs{tothe}) as -% appropriate. -% \end{function} -% -% \subsection{Key--value options} -% -% The options defined by this submodule are available within the \pkg{l3keys} -% |siunitx| tree. -% -% \begin{function}{bracket-denominator} -% \begin{syntax} -% |bracket-denominator| = |true|\verb"|"|false| -% \end{syntax} -% Switch to determine whether brackets are added to the denominator part of -% a unit when printed using inline fractional form (with |per-mode| as -% |repeated-symbol|, |symbol| or |symbol-or-fraction|). The standard setting -% is |true|. -% \end{function} -% -% \begin{function}{fraction-command} -% \begin{syntax} -% |fraction-command| = \meta{command} -% \end{syntax} -% Command used to create fractional output when |per-mode| is set to -% |fraction|. The standard setting is |\frac|. -% \end{function} -% -% \begin{function}{parse-units} -% \begin{syntax} -% |parse-units| = |true|\verb"|"|false| -% \end{syntax} -% Determines whether parsing of unit symbols is attempted or literal -% mode is used directly. The standard setting is |true|. -% \end{function} -% -% \begin{function}{per-mode} -% \begin{syntax} -% |per-mode| = \meta{choice} -% \end{syntax} -% Selects how the negative powers (\cs{per}) are formatted: a choice from -% the options |fraction|, |power|, |power-positive-first|, |repeated-symbol|, -% |symbol| and |symbol-or-fraction|. The option |fraction| generates -% fractional output when appropriate using the command specified by -% the |fraction-command| option. The setting |power| uses reciprocal powers -% leaving the units in the order of input, while |power-positive-first| uses -% the same display format but sorts units such that the positive powers -% come before negative ones. The |symbol| setting uses a symbol (specified -% by |per-symbol|) between positive and negative powers, while -% |repeated-symbol| uses the same symbol but places it before \emph{every} -% unit with a negative power (this is mathematically \enquote{wrong} but -% often seen in real work). Finally, |symbol-or-fraction| acts like -% |symbol| for inline output and like |fraction| when the output is used -% in a display math environment. The standard setting is |power|. -% \end{function} -% -% \begin{function}{per-symbol} -% \begin{syntax} -% |per-symbol| = \meta{symbol} -% \end{syntax} -% Specifies the symbol to be used to denote negative powers when the option -% |per-mode| is set to |repeated-symbol|, |symbol| or |symbol-or-fraction|. -% The standard setting is |/|. -% \end{function} -% -% \begin{function}{qualifier-mode} -% \begin{syntax} -% |qualifier-mode| = \meta{choice} -% \end{syntax} -% Selects how qualifiers are formatted: a choice from the options |brackets|, -% |combine|, |phrase| and |subscript|. The option |bracket| wraps -% the qualifier in parenthesis, |combine| joins the qualifier with the unit -% directly, |phrase| inserts the content stored by the option -% |qualifier-phrase| between the unit and qualifier, and |subscript| formats -% the qualifier as a subscript. The standard setting is |subscript|. -% \end{function} -% -% \begin{function}{qualifier-phrase} -% \begin{syntax} -% |qualifier-phrase| = \meta{choice} -% \end{syntax} -% Defines the text to be inserted between a unit and qualifier when -% |qualifier-mode| is set to |phrase|. This material is inserted without -% any font control and so if text mode is required it should be -% included in the setting, for example \verb*|\ \mbox{of}\ |. The -% standard setting is a full width space (\verb*|\ |). -% \end{function} -% -% \begin{function}{sticky-per} -% \begin{syntax} -% |sticky-per| = |true|\verb"|"|false| -% \end{syntax} -% Used to determine whether \cs{per} should be applied one a unit-by-unit -% basis (when |false|) or should apply to all following units -% (when |true|). The latter mode is somewhat akin conceptually to the -% \TeX{} \cs{over} primitive. The standard setting is |false|. -% \end{function} -% -% \begin{function}{unit-close-bracket} -% \begin{syntax} -% |unit-close-bracket| = \meta{symbol} -% \end{syntax} -% Bracket symbol used to close a matched pair around units when once is -% required to maintain mathematical logic. The standard setting is ^^A ( -% |)|. -% \end{function} -% -% \begin{function}{unit-open-bracket} -% \begin{syntax} -% |unit-open-bracket| = \meta{symbol} -% \end{syntax} -% Bracket symbol used to open a matched pair around units when once is -% required to maintain mathematical logic. The standard setting is |(|. ^^A ) -% \end{function} -% -% \begin{function}{unit-product} -% \begin{syntax} -% |unit-product| = \meta{separator} -% \end{syntax} -% Inserted between unit combinations in parsed mode, and used to replace -% |.| and |~| in literal mode. The standard setting is |\,|. -% \end{function} -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{\pkg{siunitx-unit} implementation} -% -% Start the \pkg{DocStrip} guards. -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% Identify the internal prefix (\LaTeX3 \pkg{DocStrip} convention): only -% internal material in this \emph{submodule} should be used directly. -% \begin{macrocode} -%<@@=siunitx_unit> -% \end{macrocode} -% -% \subsection{Initial set up} -% -% The mechanisms defined here need a few variables to exist and to be -% correctly set: these don't belong to one subsection and so are created -% in a small general block. -% -% Variants not provided by \pkg{expl3}. -% \begin{macrocode} -\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV } -% \end{macrocode} -% -% \begin{variable}{\l_@@_tmp_fp} -% \begin{variable}{\l_@@_tmp_int} -% \begin{variable}{\l_@@_tmp_tl} -% Scratch space. -% \begin{macrocode} -\fp_new:N \l_@@_tmp_fp -\int_new:N \l_@@_tmp_int -\tl_new:N \l_@@_tmp_tl -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\c_@@_math_subscript_tl} -% Useful tokens with awkward category codes. -% \begin{macrocode} -\tl_const:Nx \c_@@_math_subscript_tl - { \char_generate:nn { `\_ } { 8 } } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_parsing_bool} -% A boolean is used to indicate when the symbolic unit functions should -% produce symbolic or literal output. This is used when the symbolic names -% are used along with literal input, and ensures that there is a sensible -% fall-back for these cases. -% \begin{macrocode} -\bool_new:N \l_@@_parsing_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_test_bool} -% A switch used to indicate that the code is testing the input to find -% if there is any typeset output from individual unit macros. This is needed -% to allow the \enquote{base} macros to be found, and also to pick up the -% difference between symbolic and literal unit input. -% \begin{macrocode} -\bool_new:N \l_@@_test_bool -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\@@_if_symbolic:nTF} -% The test for symbolic units is needed in two places. First, there is the -% case of \enquote{pre-parsing} input to check if it can be parsed. Second, -% when parsing there is a need to check if the current unit is built up -% from others (symbolic) or is defined in terms of some literals. To do this, -% the approach used is to set all of the symbolic unit commands expandable -% and to do nothing, with the few special cases handled manually. If -% an \texttt{f}-type definition then yields nothing at all then the -% assumption is that the input is symbolic. (We use \texttt{f}-type -% expansion since it will turn the symbolic unit names into nothing at -% all but doesn't require them to be expandable.) -% \begin{macrocode} -\prg_new_protected_conditional:Npnn \@@_if_symbolic:n #1 { TF } - { - \group_begin: - \bool_set_true:N \l_@@_test_bool - \tl_set:Nf \l_@@_tmp_tl {#1} - \exp_args:NNV \group_end: - \tl_if_blank:nTF \l_@@_tmp_tl - { \prg_return_true: } - { \prg_return_false: } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Defining symbolic unit} -% -% Unit macros and related support are created here. These exist only within -% the scope of the unit processor code, thus not polluting document-level -% namespace and allowing overlap with other areas in the case of useful short -% names (for example \cs{pm}). Setting up the mechanisms to allow this requires -% a few additional steps on top of simply saving the data given by the user -% in creating the unit. -% -% \begin{variable}{\l_siunitx_unit_symbolic_seq} -% A list of all of the symbolic units, \emph{etc.}, set up. This is needed -% to allow the symbolic names to be defined within the scope of the unit -% parser but not elsewhere using simple mappings. -% \begin{macrocode} -\seq_new:N \l_siunitx_unit_symbolic_seq -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\@@_set_symbolic:Nnn} -% \begin{macro}{\@@_set_symbolic:Npnn} -% \begin{macro}{\@@_set_symbolic:NNpnn} -% The majority of the work for saving each symbolic definition is the same -% irrespective of the item being defined (unit, prefix, power, qualifier). -% This is therefore all carried out in a single internal function which -% does the common tasks. The three arguments here are the symbolic macro -% name, the literal output and the code to insert when doing full unit -% parsing. To allow for the \enquote{special cases} (where arguments are -% required) the entire mechanism is set up in a two-part fashion allowing -% for flexibility at the slight cost of additional functions. -% -% Importantly, notice that the unit macros are declared as expandable. This -% is required so that literals can be correctly converted into a token list -% of material which does not depend on local redefinitions for the unit -% macros. That is required so that the unit formatting system can be grouped. -% \begin{macrocode} -\cs_new_protected:Npn \@@_set_symbolic:Nnn #1 - { \@@_set_symbolic:NNnnn \cs_set:cpn #1 { } } -\cs_new_protected:Npn \@@_set_symbolic:Npnn #1#2# - { \@@_set_symbolic:NNnnn \cs_set:cpn #1 {#2} } -\cs_new_protected:Npn \@@_set_symbolic:NNnnn #1#2#3#4#5 - { - \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#2} - #1 { units ~ > ~ \token_to_str:N #2 } #3 - { - \bool_if:NF \l_@@_test_bool - { - \bool_if:NTF \l_@@_parsing_bool - {#5} - {#4} - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\siunitx_declare_power:NNn} -% Powers can come either before or after the unit. As they always come -% (logically) in matching, we handle this by declaring two commands, -% and setting each up separately. -% \begin{macrocode} -\cs_new_protected:Npn \siunitx_declare_power:NNn #1#2#3 - { - \@@_set_symbolic:Nnn #1 - { \@@_literal_power:nN {#1} } - { \@@_parse_power:nnN {#1} {#3} \c_true_bool } - \@@_set_symbolic:Nnn #2 - { ^ {#3} } - { \@@_parse_power:nnN {#2} {#3} \c_false_bool } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\siunitx_declare_prefix:Nn} -% \begin{macro}{\siunitx_declare_prefix:Nnn} -% \begin{variable} -% {\l_@@_prefixes_forward_prop, \l_@@_prefixes_reverse_prop} -% For prefixes there are a couple of options. In all cases, the basic -% requirement is to set up to parse the prefix using the appropriate -% internal function. For prefixes which are powers of $10$, there is also -% the need to be able to do conversion to/from the numerical equivalent. -% That is handled using two properly lists which can be used to supply -% the conversion data later. -% \begin{macrocode} -\cs_new_protected:Npn \siunitx_declare_prefix:Nn #1#2 - { - \@@_set_symbolic:Nnn #1 - {#2} - { \@@_parse_prefix:Nn #1 {#2} } - } -\cs_new_protected:Npn \siunitx_declare_prefix:Nnn #1#2#3 - { - \siunitx_declare_prefix:Nn #1 {#2} - \prop_put:Nnn \l_@@_prefixes_forward_prop {#2} {#3} - \prop_put:Nnn \l_@@_prefixes_reverse_prop {#3} {#2} - } -\prop_new:N \l_@@_prefixes_forward_prop -\prop_new:N \l_@@_prefixes_reverse_prop -% \end{macrocode} -% \end{variable} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\siunitx_declare_qualifier:Nn} -% Qualifiers are relatively easy to handle: nothing to do other than save -% the input appropriately. -% \begin{macrocode} -\cs_new_protected:Npn \siunitx_declare_qualifier:Nn #1#2 - { - \@@_set_symbolic:Nnn #1 - { \ ( #2 ) } - { \@@_parse_qualifier:nn {#1} {#2} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\siunitx_declare_unit:Nn, \siunitx_declare_unit:Nx} -% For the unit parsing, allowing for variations in definition order requires -% that a test is made for the output of each unit at point of use. -% \begin{macrocode} -\cs_new_protected:Npn \siunitx_declare_unit:Nn #1#2 - { - \@@_set_symbolic:Nnn #1 - {#2} - { - \@@_if_symbolic:nTF {#2} - {#2} - { \@@_parse_unit:Nn #1 {#2} } - } - } -\cs_generate_variant:Nn \siunitx_declare_unit:Nn { Nx } -% \end{macrocode} -% \end{macro} -% -% \subsection{Non-standard symbolic units} -% -% A few of the symbolic units require non-standard definitions: these are -% created here. They all use parts of the more general code but have particular -% requirements which can only be addressed by hand. Some of these could in -% principle be used in place of the dedicated definitions above, but at point -% of use that would then require additional expansions for each unit parsed: -% as the macro names would still be needed, this does not offer any real -% benefits. -% -% \begin{macro}{\per} -% The \cs{per} symbolic unit is a bit special: it has a mechanism entirely -% different from everything else, so has to be set up by hand. In literal -% mode it is represented by a very simple symbol! -% \begin{macrocode} -\@@_set_symbolic:Nnn \per - { / } - { \@@_parse_per: } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cancel} -% \begin{macro}{\highlight} -% The two special cases, \cs{cancel} and \cs{highlight}, are easy to deal -% with when parsing. When not parsing, a precaution is taken to ensure that -% the user level equivalents always get a braced argument. -% \begin{macrocode} -\@@_set_symbolic:Npnn \cancel - { \@@_literal_special:nN { \cancel } } - { \@@_parse_special:n { \cancel } } -\@@_set_symbolic:Npnn \highlight #1 - { \@@_literal_special:nN { \textcolor {#1} } } - { \@@_parse_special:n { \textcolor {#1} } } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\of} -% The generic qualifier is simply the same as the dedicated ones except for -% needing to grab an argument. -% \begin{macrocode} -\@@_set_symbolic:Npnn \of #1 - { \ ( #1 ) } - { \@@_parse_qualifier:nn { \of {#1} } {#1} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\raiseto, \tothe} -% Generic versions of the pre-defined power macros. These require an -% argument and so cannot be handled using the general approach. Other than -% that, the code here is very similar to that in -% \cs{siunitx_unit_power_set:NnN}. -% \begin{macrocode} -\@@_set_symbolic:Npnn \raiseto #1 - { \@@_literal_power:nN {#1} } - { \@@_parse_power:nnN { \raiseto {#1} } {#1} \c_true_bool } -\@@_set_symbolic:Npnn \tothe #1 - { ^ {#1} } - { \@@_parse_power:nnN { \tothe {#1} } {#1} \c_false_bool } -% \end{macrocode} -% \end{macro} -% -% \subsection{Main formatting routine} -% -% Unit input can take two forms, \enquote{literal} units (material to be -% typeset directly) or \enquote{symbolic} units (macro-based). Before any -% parsing or typesetting is carried out, a small amount of pre-parsing has to -% be carried out to decide which of these cases applies. -% -% \begin{variable}{\l_@@_product_tl} -% Options which apply to the main formatting routine, and so are not tied -% to either symbolic or literal input. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - unit-product .tl_set:N = \l_@@_product_tl - } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_formatted_tl} -% A token list for the final formatted result: may or may not be generated -% by the parser, depending on the nature of the input. -% \begin{macrocode} -\tl_new:N \l_@@_formatted_tl -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\siunitx_unit_format:nN} -% \begin{macro}{\siunitx_unit_format:nNN} -% \begin{macro}{\@@_format:nNN} -% \begin{macro}{\@@_format_aux:} -% Formatting parsed units can take place either with the prefixes printed or -% separated out into a power of ten. This variation is handled using two -% separate functions: as this submodule does not really deal with numbers, -% formatting the numeral part here would be tricky and it is better therefore -% to have a mechanism to return a simple numerical power. At the same time, -% most uses will no want this more complex return format and so a version of -% the code which does not do this is also provided. -% -% The main unit formatting routine groups all of the parsing/formatting, so -% that the only value altered will be the return token list. As definitions -% for the various unit macros are not globally created, the first step is to -% map over the list of names and active the unit definitions: these do -% different things depending on the switches set. There is then a decision to -% be made: is the unit input one that can be parsed (\enquote{symbolic}), or -% is is one containing one or more literals. In the latter case, there is a -% still the need to convert the input into an expanded token list as some -% parts of the input could still be using unit macros. -% -% Notice that for \cs{siunitx_unit_format:nN} a second return value from the -% auxiliary has to be allowed for, but is simply discarded. -% \begin{macrocode} -\cs_new_protected:Npn \siunitx_unit_format:nN #1#2 - { - \bool_set_false:N \l_@@_prefix_power_bool - \@@_format:nNN {#1} #2 \l_@@_tmp_fp - } -\cs_new_protected:Npn \siunitx_unit_format:nNN #1#2#3 - { - \bool_set_true:N \l_@@_prefix_power_bool - \@@_format:nNN {#1} #2 #3 - } -\cs_new_protected:Npn \@@_format:nNN #1#2#3 - { - \group_begin: - \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq - { \cs_set_eq:Nc ##1 { units ~ > ~ \token_to_str:N ##1 } } - \tl_clear:N \l_@@_formatted_tl - \fp_zero:N \l_@@_prefix_fp - \bool_if:NTF \l_@@_parse_bool - { - \@@_if_symbolic:nTF {#1} - { - \@@_parse:n {#1} - \prop_if_empty:NF \l_@@_parsed_prop - { \@@_format_parsed: } - } - { \@@_format_literal:n {#1} } - } - { \@@_format_literal:n {#1} } - \cs_set_protected:Npx \@@_format_aux: - { - \tl_set:Nn \exp_not:N #2 - { \exp_not:V \l_@@_formatted_tl } - \fp_set:Nn \exp_not:N #3 - { \fp_use:N \l_@@_prefix_fp } - } - \exp_after:wN \group_end: - \@@_format_aux: - } -\cs_new_protected:Npn \@@_format_aux: { } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsection{Formatting literal units} -% -% While in literal mode no parsing occurs, there is a need to provide a few -% auxiliary functions to handle one or two special cases. -% -% \begin{macro}{\@@_literal_power:nN} -% For printing literal units which are given before the unit they apply to, -% there is a slight rearrangement. -% \begin{macrocode} -\cs_new_protected:Npn \@@_literal_power:nN #1#2 { #2 ^ {#1} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_literal_special:nN} -% When dealing with the special cases, there is an argument to absorb. This -% should be braced to be passed up to the user level, which is dealt with -% here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_literal_special:nN #1#2 { #1 {#2} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_format_literal:n} -% \begin{macro}{\@@_format_literal_auxi:w} -% \begin{macro}{\@@_format_literal_auxii:w} -% \begin{macro}{\@@_format_literal_auxiii:w} -% \begin{macro}{\@@_format_literal_auxiv:w} -% \begin{macro}{\@@_format_literal_auxv:w} -% \begin{variable}{\l_@@_separator_tl} -% To format literal units, there are two tasks to do. The input is -% \texttt{x}-type expanded to force any symbolic units to be converted into -% their literal representation: this requires setting the appropriate -% switch. In the resulting token list, all |.| and |~| tokens are then -% replaced by the current unit product token list. To enable this to happen -% correctly with a normal (active) |~|, a small amount of -% \enquote{protection} is needed first. -% -% As with other code dealing with user input, \cs{protected@edef} is used -% here rather than \cs{tl_set:Nx} as \LaTeXe{} robust commands may be -% present. -% \begin{macrocode} -\group_begin: - \char_set_catcode_active:n { `\~ } - \cs_new_protected:Npx \@@_format_literal:n #1 - { - \group_begin: - \exp_not:n { \bool_set_false:N \l_@@_parsing_bool } - \tl_set:Nn \exp_not:N \l_@@_tmp_tl {#1} - \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl - { \exp_not:N ~ } { . } - \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl - { \token_to_str:N ^ } { ^ } - \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl - { \token_to_str:N _ } { \c_@@_math_subscript_tl } - \exp_not:n - { - \protected@edef \l_@@_tmp_tl - { \l_@@_tmp_tl } - \tl_clear:N \l_@@_formatted_tl - \tl_if_empty:NF \l_@@_tmp_tl - { - \exp_after:wN \@@_format_literal_auxi:w - \l_@@_tmp_tl . - \q_recursion_tail . \q_recursion_stop - } - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_formatted_tl - \l_@@_formatted_tl - } - } -\group_end: -% \end{macrocode} -% To introduce the font changing commands while still allowing for line -% breaks in literal units, a loop is needed to replace one |.| at a time. -% To also allow for division, a second loop is used within that to handle -% |/|: as a result, the separator between parts has to be tracked. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_literal_auxi:w #1 . - { - \quark_if_recursion_tail_stop:n {#1} - \@@_format_literal_auxii:n {#1} - \tl_set_eq:NN \l_@@_separator_tl \l_@@_product_tl - \@@_format_literal_auxi:w - } -\cs_set_protected:Npn \@@_format_literal_auxii:n #1 - { - \@@_format_literal_auxiii:w - #1 / \q_recursion_tail / \q_recursion_stop - } -\cs_new_protected:Npn \@@_format_literal_auxiii:w #1 / - { - \quark_if_recursion_tail_stop:n {#1} - \@@_format_literal_auxiv:w #1 ^ ^ \q_stop - \tl_set:Nn \l_@@_separator_tl { / } - \@@_format_literal_auxiii:w - } -% \end{macrocode} -% Within each unit any sub- and superscript parts need to be separated out: -% wrapping everything in the font command is incorrect. The superscript part -% is relatively easy as there is no catcode issue or font command to add, -% while the subscript part needs a bit more work. As the user might have the -% two parts in either order, picking up the subscript needs to look in two -% places. We assume that only one is given: odd input here is simply accepted. -% \begin{macrocode} -\use:x - { - \cs_new_protected:Npn \exp_not:N \@@_format_literal_auxiv:w - ##1 ^ ##2 ^ ##3 \exp_not:N \q_stop - { - \exp_not:N \@@_format_literal_auxv:w - ##1 - \c_@@_math_subscript_tl - \c_@@_math_subscript_tl - \exp_not:N \q_mark - ##2 - \c_@@_math_subscript_tl - \c_@@_math_subscript_tl - \exp_not:N \q_stop - } - \cs_new_protected:Npn \exp_not:N \@@_format_literal_auxv:w - ##1 \c_@@_math_subscript_tl - ##2 \c_@@_math_subscript_tl ##3 - \exp_not:N \q_mark - ##4 \c_@@_math_subscript_tl - ##5 \c_@@_math_subscript_tl ##6 - \exp_not:N \q_stop - { - \tl_set:Nx \exp_not:N \l_@@_formatted_tl - { - \exp_not:N \exp_not:V - \exp_not:N \l_@@_formatted_tl - \exp_not:N \tl_if_empty:NF - \exp_not:N \l_@@_formatted_tl - { - \exp_not:N \exp_not:V - \exp_not:N \l_@@_separator_tl - } - \exp_not:N \tl_if_blank:nF {##1} - { - \exp_not:N \exp_not:N - \exp_not:N \mathrm - { \exp_not:N \exp_not:n {##1} } - } - \exp_not:N \tl_if_blank:nF {##4} - { ^ { \exp_not:N \exp_not:n {##4} } } - \exp_not:N \tl_if_blank:nF {##2##5} - { - \c_@@_math_subscript_tl - { - \exp_not:N \exp_not:N - \exp_not:N \mathrm - { \exp_not:N \exp_not:n {##2##5} } - } - } - } - } - } -\tl_new:N \l_@@_separator_tl -% \end{macrocode} -% \end{variable} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsection{Parsing symbolic units} -% -% Parsing units takes place by storing information about each unit in a -% \texttt{prop}. As well as the unit itself, there are various other optional -% data points, for example a prefix or a power. Some of these can come before -% the unit, others only after. The parser therefore tracks the number of units -% read and uses the current position to allocate data to individual units. -% -% The result of parsing is a property list (\cs{l_@@_parsed_prop}) which -% contains one or more entries for each unit: -% \begin{itemize} -% \item \texttt{prefix-$n$} The symbol for the prefix which applies to this -% unit, \emph{e.g.} for \cs{kilo} with (almost certainly) would be -% |k|. -% \item \texttt{unit-$n$} The symbol for the unit itself, \emph{e.g.}~for -% \cs{metre} with (almost certainly) would be |m|. -% \item \texttt{power-$n$} The power which a unit is raised to. During -% initial parsing this will (almost certainly) be positive, but is combined -% with \texttt{per-$n$} to give a \enquote{fully qualified} power before -% any formatting takes place -% \item \texttt{per-$n$} Indicates that \texttt{per} applies to the current -% unit: stored during initial parsing then combined with \texttt{power-$n$} -% (and removed from the list) before further work. -% \item \texttt{qualifier-$n$} Any qualifier which applies to the current -% unit. -% \item \texttt{special-$n$} Any \enquote{special effect} to apply to the -% current unit. -% \end{itemize} -% -% \begin{variable}{\l_@@_sticky_per_bool} -% There is one option when \emph{parsing} the input (as opposed to -% \emph{formatting} for output): how to deal with \cs{per}. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - sticky-per .bool_set:N = \l_@@_sticky_per_bool - } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_parsed_prop} -% \begin{variable}{\l_@@_per_bool} -% \begin{variable}{\l_@@_position_int} -% Parsing units requires a small number of variables are available: a -% \texttt{prop} for the parsed units themselves, a \texttt{bool} to -% indicate if \cs{per} is active and an \texttt{int} to track how many units -% have be parsed. -% \begin{macrocode} -\prop_new:N \l_@@_parsed_prop -\bool_new:N \l_@@_per_bool -\int_new:N \l_@@_position_int -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{macro}{\@@_parse:n} -% The main parsing function is quite simple. After initialising the variables, -% each symbolic unit is set up. The input is then simply inserted into the -% input stream: the symbolic units themselves then do the real work of -% placing data into the parsing system. There is then a bit of tidying up to -% ensure that later stages can rely on the nature of the data here. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse:n #1 - { - \prop_clear:N \l_@@_parsed_prop - \bool_set_true:N \l_@@_parsing_bool - \bool_set_false:N \l_@@_per_bool - \bool_set_false:N \l_@@_test_bool - \int_zero:N \l_@@_position_int - #1 - \int_step_inline:nnnn 1 1 \l_@@_position_int - { \@@_parse_finalise:n {##1} } - \@@_parse_finalise: - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_add:nnnn} -% In all cases, storing a data item requires setting a temporary \texttt{tl} -% which will be used as the key, then using this to store the value. The -% \texttt{tl} is set using \texttt{x}-type expansion as this will expand the -% unit index and any additional calculations made for this. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_add:nnnn #1#2#3#4 - { - \tl_set:Nx \l_@@_tmp_tl { #1 - #2 } - \prop_if_in:NVTF \l_@@_parsed_prop - \l_@@_tmp_tl - { - \msg_error:nnxx { siunitx } { unit / duplicate-part } - { \exp_not:n {#1} } { \token_to_str:N #3 } - } - { - \prop_put:NVn \l_@@_parsed_prop - \l_@@_tmp_tl {#4} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_prefix:Nn} -% \begin{macro}{\@@_parse_power:nnN} -% \begin{macro}{\@@_parse_qualifier:nn} -% \begin{macro}{\@@_parse_special:n} -% Storage of the various optional items follows broadly the same pattern -% in each case. The data to be stored is passed along with an appropriate -% key name to the underlying storage system. The details for each type of -% item should be relatively clear. For example, prefixes have to come before -% their \enquote{parent} unit and so there is some adjustment to do to add -% them to the correct unit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_prefix:Nn #1#2 - { - \int_set:Nn \l_@@_tmp_int { \l_@@_position_int + 1 } - \@@_parse_add:nnnn { prefix } - { \int_use:N \l_@@_tmp_int } {#1} {#2} - } -\cs_new_protected:Npn \@@_parse_power:nnN #1#2#3 - { - \tl_set:Nx \l_@@_tmp_tl - { unit- \int_use:N \l_@@_position_int } - \bool_lazy_or:nnTF - {#3} - { - \prop_if_in_p:NV - \l_@@_parsed_prop \l_@@_tmp_tl - } - { - \@@_parse_add:nnnn { power } - { - \int_eval:n - { \l_@@_position_int \bool_if:NT #3 { + 1 } } - } - {#1} {#2} - } - { - \msg_error:nnxx { siunitx } - { unit / part-before-unit } { power } { \token_to_str:N #1 } - } - } -\cs_new_protected:Npn \@@_parse_qualifier:nn #1#2 - { - \tl_set:Nx \l_@@_tmp_tl - { unit- \int_use:N \l_@@_position_int } - \prop_if_in:NVTF \l_@@_parsed_prop \l_@@_tmp_tl - { - \@@_parse_add:nnnn { qualifier } - { \int_use:N \l_@@_position_int } {#1} {#2} - } - { - \msg_error:nnnn { siunitx } - { unit / part-before-unit } { qualifier } { \token_to_str:N #1 } - } - } -% \end{macrocode} -% Special (exceptional) items should always come before the relevant units. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_special:n #1 - { - \@@_parse_add:nnnn { special } - { \int_eval:n { \l_@@_position_int + 1 } } - {#1} {#1} - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_parse_unit:Nn} -% Parsing units is slightly more involved than the other cases: this is the -% one place where the tracking value is incremented. If the switch -% \cs{l_@@_per_bool} is set true then the current unit is also -% reciprocal: this can only happen if \cs{l_@@_sticky_per_bool} is also -% true, so only one test is required. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_unit:Nn #1#2 - { - \int_incr:N \l_@@_position_int - \@@_parse_add:nnnn { unit } - { \int_use:N \l_@@_position_int } - {#1} {#2} - \bool_if:NT \l_@@_per_bool - { - \@@_parse_add:nnnn { per } - { \int_use:N \l_@@_position_int } - { \per } { true } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_per:} -% Storing the \cs{per} command requires adding a data item separate from -% the power which applies: this makes later formatting much more -% straight-forward. This data could in principle be combined with the -% \texttt{power}, but depending on the output format required that may make -% life more complex. Thus this information is stored separately for later -% retrieval. If \cs{per} is set to be \enquote{sticky} then after parsing -% the first occurrence, any further uses are in error. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_per: - { - \bool_if:NTF \l_@@_sticky_per_bool - { - \bool_set_true:N \l_@@_per_bool - \cs_set_protected:Npn \per - { \msg_error:nn { siunitx } { unit / duplicate-sticky-per } } - } - { - \@@_parse_add:nnnn - { per } { \int_eval:n { \l_@@_position_int + 1 } } - { \per } { true } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_finalise:n} -% If \cs{per} applies to the current unit, the power needs to be multiplied -% by $-1$. That is done using an \texttt{fp} operation so that non-integer -% powers are supported. The flag for \cs{per} is also removed as this means -% we don't have to check that the original power was positive. To be on -% the safe side, there is a check for a trivial power at this stage. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_finalise:n #1 - { - \tl_set:Nx \l_@@_tmp_tl { per- #1 } - \prop_if_in:NVT \l_@@_parsed_prop \l_@@_tmp_tl - { - \prop_remove:NV \l_@@_parsed_prop - \l_@@_tmp_tl - \tl_set:Nx \l_@@_tmp_tl { power- #1 } - \prop_get:NVNTF - \l_@@_parsed_prop - \l_@@_tmp_tl - \l_@@_part_tl - { - \tl_set:Nx \l_@@_part_tl - { \fp_eval:n { \l_@@_part_tl * -1 } } - \fp_compare:nNnTF \l_@@_part_tl = 1 - { - \prop_remove:NV \l_@@_parsed_prop - \l_@@_tmp_tl - } - { - \prop_put:NVV \l_@@_parsed_prop - \l_@@_tmp_tl \l_@@_part_tl - } - } - { - \prop_put:NVn \l_@@_parsed_prop - \l_@@_tmp_tl { -1 } - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_finalise:} -% The final task is to check that there is not a \enquote{dangling} power -% or prefix: these are added to the \enquote{next} unit so are easy to -% test for. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_finalise: - { - \clist_map_inline:nn { per , power , prefix } - { - \tl_set:Nx \l_@@_tmp_tl - { ##1 - \int_eval:n { \l_@@_position_int + 1 } } - \prop_if_in:NVT \l_@@_parsed_prop \l_@@_tmp_tl - { \msg_error:nnn { siunitx } { unit / dangling-part } { ##1 } } - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Formatting parsed units} -% -% \begin{variable} -% { -% \l_@@_denominator_bracket_bool , -% \l_@@_fraction_function_tl , -% \l_@@_bracket_close_tl , -% \l_@@_bracket_open_tl , -% \l_@@_parse_bool , -% \l_@@_per_symbol_tl , -% \l_@@_qualifier_mode_tl , -% \l_@@_qualifier_phrase_tl -% } -% Set up the options which apply to formatting. -% \begin{macrocode} -\keys_define:nn { siunitx } - { - bracket-denominator .bool_set:N = - \l_@@_denominator_bracket_bool , - fraction-command .tl_set:N = - \l_@@_fraction_function_tl , - parse-units .bool_set:N = - \l_@@_parse_bool , - per-mode .choice: , - per-mode / fraction .code:n = - { - \bool_set_false:N \l_@@_autofrac_bool - \bool_set_false:N \l_@@_per_symbol_bool - \bool_set_true:N \l_@@_powers_positive_bool - \bool_set_true:N \l_@@_two_part_bool - } , - per-mode / power .code:n = - { - \bool_set_false:N \l_@@_autofrac_bool - \bool_set_false:N \l_@@_per_symbol_bool - \bool_set_false:N \l_@@_powers_positive_bool - \bool_set_false:N \l_@@_two_part_bool - } , - per-mode / power-positive-first .code:n = - { - \bool_set_false:N \l_@@_autofrac_bool - \bool_set_false:N \l_@@_per_symbol_bool - \bool_set_false:N \l_@@_powers_positive_bool - \bool_set_true:N \l_@@_two_part_bool - } , - per-mode / repeated-symbol .code:n = - { - \bool_set_false:N \l_@@_autofrac_bool - \bool_set_true:N \l_@@_per_symbol_bool - \bool_set_true:N \l_@@_powers_positive_bool - \bool_set_false:N \l_@@_two_part_bool - } , - per-mode / symbol .code:n = - { - \bool_set_false:N \l_@@_autofrac_bool - \bool_set_true:N \l_@@_per_symbol_bool - \bool_set_true:N \l_@@_powers_positive_bool - \bool_set_true:N \l_@@_two_part_bool - } , - per-mode / symbol-or-fraction .code:n = - { - \bool_set_true:N \l_@@_autofrac_bool - \bool_set_true:N \l_@@_per_symbol_bool - \bool_set_true:N \l_@@_powers_positive_bool - \bool_set_true:N \l_@@_two_part_bool - } , - per-symbol .tl_set:N = - \l_@@_per_symbol_tl , - qualifier-mode .choice: , - qualifier-mode / bracket .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { bracket } } , - qualifier-mode / combine .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { combine } } , - qualifier-mode / phrase .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { phrase } } , - qualifier-mode / subscript .code:n = - { \tl_set:Nn \l_@@_qualifier_mode_tl { subscript } } , - qualifier-phrase .tl_set:N = - \l_@@_qualifier_phrase_tl , - unit-close-bracket .tl_set:N = - \l_@@_bracket_close_tl , - unit-open-bracket .tl_set:N = - \l_@@_bracket_open_tl - } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_bracket_bool} -% A flag to indicate that the unit currently under construction will require -% brackets if a power is added. -% \begin{macrocode} -\bool_new:N \l_@@_bracket_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_font_bool} -% A flag to control when font wrapping is applied to the output. -% \begin{macrocode} -\bool_new:N \l_@@_font_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable} -% { -% \l_@@_autofrac_bool , -% \l_@@_powers_positive_bool , -% \l_@@_per_symbol_bool , -% \l_@@_two_part_bool -% } -% Dealing with the various ways that reciprocal (\cs{per}) can be handled -% requires a few different switches. -% \begin{macrocode} -\bool_new:N \l_@@_autofrac_bool -\bool_new:N \l_@@_per_symbol_bool -\bool_new:N \l_@@_powers_positive_bool -\bool_new:N \l_@@_two_part_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_numerator_bool} -% Indicates that the current unit should go into the numerator when splitting -% into two parts (fractions or other \enquote{sorted} styles). -% \begin{macrocode} -\bool_new:N \l_@@_numerator_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_qualifier_mode_tl} -% For storing the text of options which are best handled by picking -% function names. -% \begin{macrocode} -\tl_new:N \l_@@_qualifier_mode_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_prefix_power_bool} -% Used to determine if prefixes are converted into powers. Note that -% while this may be set as an option \enquote{higher up}, at this point it -% is handled as an internal switch (see the two formatting interfaces for -% reasons). -% \begin{macrocode} -\bool_new:N \l_@@_prefix_power_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_prefix_fp} -% When converting prefixes to powers, the calculations are done as an -% \texttt{fp}. -% \begin{macrocode} -\fp_new:N \l_@@_prefix_fp -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_current_tl, \l_@@_part_tl} -% Building up the (partial) formatted unit requires some token list storage. -% Each part of the unit combination that is recovered also has to be -% placed in a token list: this is a dedicated one to leave the scratch -% variables available. -% \begin{macrocode} -\tl_new:N \l_@@_current_tl -\tl_new:N \l_@@_part_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_denominator_tl} -% For fraction-like units, space is needed for the denominator as well as -% the numerator (which is handled using \cs{l_@@_formatted_tl}). -% \begin{macrocode} -\tl_new:N \l_@@_denominator_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_total_int} -% The formatting routine needs to know both the total number of units and -% the current unit. Thus an \texttt{int} is required in addition to -% \cs{l_@@_position_int}. -% \begin{macrocode} -\int_new:N \l_@@_total_int -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\@@_format_parsed:} -% \begin{macro}{\@@_format_parsed_aux:n} -% The main formatting routine is essentially a loop over each position, -% reading the various parts of the unit to build up complete unit -% combination. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_parsed: - { - \int_set_eq:NN \l_@@_total_int \l_@@_position_int - \tl_clear:N \l_@@_denominator_tl - \tl_clear:N \l_@@_formatted_tl - \fp_zero:N \l_@@_prefix_fp - \int_zero:N \l_@@_position_int - \int_do_while:nNnn - \l_@@_position_int < \l_@@_total_int - { - \bool_set_false:N \l_@@_bracket_bool - \tl_clear:N \l_@@_current_tl - \bool_set_false:N \l_@@_font_bool - \bool_set_true:N \l_@@_numerator_bool - \int_incr:N \l_@@_position_int - \clist_map_inline:nn { prefix , unit , qualifier , power , special } - { \@@_format_parsed_aux:n {##1} } - \@@_format_output: - } - \@@_format_finalise: - } -\cs_new_protected:Npn \@@_format_parsed_aux:n #1 - { - \tl_set:Nx \l_@@_tmp_tl - { #1 - \int_use:N \l_@@_position_int } - \prop_get:NVNT \l_@@_parsed_prop - \l_@@_tmp_tl \l_@@_part_tl - { \use:c { @@_format_ #1 : } } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}[EXP]{\@@_format_bracket:N} -% A quick utility function which wraps up a token list variable in brackets -% if they are required. -% \begin{macrocode} -\cs_new:Npn \@@_format_bracket:N #1 - { - \bool_if:NTF \l_@@_bracket_bool - { - \exp_not:V \l_@@_bracket_open_tl - \exp_not:V #1 - \exp_not:V \l_@@_bracket_close_tl - } - { \exp_not:V #1 } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_format_power:} -% \begin{macro}[EXP]{\@@_format_power_aux:wTF} -% \begin{macro} -% { -% \@@_format_power_positive: , -% \@@_format_power_negative: -% } -% \begin{macro}[EXP]{\@@_format_power_negative_aux:w} -% \begin{macro}{\@@_format_power_superscript:} -% Formatting powers requires a test for negative numbers and depending on -% output format requests some adjustment to the stored value. This could be -% done using an \texttt{fp} function, but that would be slow compared to -% a dedicated if lower-level approach based on delimited arguments. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_power: - { - \@@_format_font: - \exp_after:wN \@@_format_power_aux:wTF - \l_@@_part_tl - \q_stop - { \@@_format_power_negative: } - { \@@_format_power_positive: } - } -\cs_new:Npn \@@_format_power_aux:wTF #1 - #2 \q_stop - { \tl_if_empty:nTF {#1} } -% \end{macrocode} -% In the case of positive powers, there is little to do: add the power -% as a subscript (must be required as the parser ensures it's $\neq 1$). -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_power_positive: - { \@@_format_power_superscript: } -% \end{macrocode} -% Dealing with negative powers starts by flipping the switch used to track -% where in the final output the current part should get added to. For the -% case where the output is fraction-like, strip off the |~| then ensure that -% the result is not the trivial power~$1$. Assuming all is well, addition -% to the current unit combination goes ahead. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_power_negative: - { - \bool_set_false:N \l_@@_numerator_bool - \bool_if:NTF \l_@@_powers_positive_bool - { - \tl_set:Nx \l_@@_part_tl - { - \exp_after:wN \@@_format_power_negative_aux:w - \l_@@_part_tl \q_stop - } - \str_if_eq_x:nnF { \exp_not:V \l_@@_part_tl } { 1 } - { \@@_format_power_superscript: } - } - { \@@_format_power_superscript: } - } -\cs_new:Npn \@@_format_power_negative_aux:w - #1 \q_stop - { \exp_not:n {#1} } -% \end{macrocode} -% Adding the power as a superscript has the slight complication that there -% is the possibility of needing some brackets. The superscript itself uses -% \cs{sp} as that avoids any category code issues and also allows redirection -% at a higher level more readily. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_power_superscript: - { - \tl_set:Nx \l_@@_current_tl - { - \@@_format_bracket:N \l_@@_current_tl - ^ { \exp_not:V \l_@@_part_tl } - } - \bool_set_false:N \l_@@_bracket_bool - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_format_prefix:} -% \begin{macro}{\@@_format_prefix_power:, \@@_format_prefix_symbol:} -% Formatting for prefixes depends on whether they are to be expressed as -% symbols or collected up to be returned as a power of $10$. The latter -% case requires a bit of processing, which includes checking that the -% conversion is possible and allowing for any power that applies to the -% current unit. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_prefix: - { - \bool_if:NTF \l_@@_prefix_power_bool - { \@@_format_prefix_power: } - { \@@_format_prefix_symbol: } - } -\cs_new_protected:Npn \@@_format_prefix_power: - { - \prop_get:NVNTF \l_@@_prefixes_forward_prop - \l_@@_part_tl \l_@@_part_tl - { - \tl_set:Nx \l_@@_tmp_tl - { power- \int_use:N \l_@@_position_int } - \prop_get:NVNF \l_@@_parsed_prop - \l_@@_tmp_tl \l_@@_tmp_tl - { \tl_set:Nn \l_@@_tmp_tl { 1 } } - \fp_add:Nn \l_@@_prefix_fp - { \l_@@_tmp_tl * \l_@@_part_tl } - } - { \@@_format_prefix_symbol: } - } -\cs_new_protected:Npn \@@_format_prefix_symbol: - { \tl_set_eq:NN \l_@@_current_tl \l_@@_part_tl } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_format_qualifier:} -% \begin{macro} -% { -% \@@_format_qualifier_bracket : , -% \@@_format_qualifier_combine: , -% \@@_format_qualifier_phrase: , -% \@@_format_qualifier_subscript: -% } -% There are various ways that a qualifier can be added to the output. The -% idea here is to modify the \enquote{base} text appropriately and then add -% to the current unit. In the case that a linking phrase is in use, the -% addition of spaces means that the unit may end up ambiguous, and brackets -% are therefore required \emph{if} there is a power. Notice that when the -% qualifier is just treated as \enquote{text}, the auxiliary is actually -% a no-op. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_qualifier: - { - \use:c - { - @@_format_qualifier_ - \l_@@_qualifier_mode_tl : - } - \tl_put_right:NV \l_@@_current_tl \l_@@_part_tl - } -\cs_new_protected:Npn \@@_format_qualifier_bracket: - { - \@@_format_font: - \tl_set:Nx \l_@@_part_tl - { - \exp_not:V \l_@@_bracket_open_tl - \exp_not:N \mathrm - { \exp_not:V \l_@@_part_tl } - \exp_not:V \l_@@_bracket_close_tl - } - } -\cs_new_protected:Npn \@@_format_qualifier_combine: { } -\cs_new_protected:Npn \@@_format_qualifier_phrase: - { - \@@_format_font: - \tl_set:Nx \l_@@_part_tl - { - \exp_not:V \l_@@_qualifier_phrase_tl - \exp_not:N \mathrm - { \exp_not:V \l_@@_part_tl } - } - } -\cs_new_protected:Npn \@@_format_qualifier_subscript: - { - \@@_format_font: - \tl_set:Nx \l_@@_part_tl - { - \c_@@_math_subscript_tl - { - \exp_not:N \mathrm - { \exp_not:V \l_@@_part_tl } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_format_special:} -% Any special odds and ends are handled by simply making the current -% combination into an argument for the recovered code. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_special: - { - \tl_set:Nx \l_@@_current_tl - { - \exp_not:V \l_@@_part_tl - { \exp_not:V \l_@@_current_tl } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_format_unit:} -% A very simple task: add the unit to the output currently being -% constructed. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_unit: - { - \tl_put_right:NV - \l_@@_current_tl \l_@@_part_tl - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_format_output:} -% \begin{macro} -% {\@@_format_output_aux:, \@@_format_output_denominator:} -% \begin{macro} -% { -% \@@_format_output_aux:nn , -% \@@_format_output_aux:nV , -% \@@_format_output_aux:nv -% } -% The first step here is to make a choice based on whether the current -% part should be stored as part of the numerator or denominator of a -% fraction. In all cases, if the switch \cs{l_@@_numerator_bool} is -% true then life is simple: add the current part to the numerator with -% a standard separator -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_output: - { - \@@_format_font: - \bool_set_false:N \l_@@_bracket_bool - \use:c - { - @@_format_output_ - \bool_if:NTF \l_@@_numerator_bool - { aux: } - { denominator: } - } - } -\cs_new_protected:Npn \@@_format_output_aux: - { - \@@_format_output_aux:nV { formatted } - \l_@@_product_tl - } -% \end{macrocode} -% There are a few things to worry about at this stage if the current part -% is in the denominator. Powers have already been dealt with and some -% formatting outcomes only need a branch at the final point of building -% the entire unit. That means that there are three possible outcomes here: -% if collecting two separate parts, add to the denominator with a product -% separator, or if only building one token list there may be a need to use -% a symbol separator. When the |repeated-symbol| option is in use there may -% be a need to add a leading |1| to the output in the case where the -% first unit is in the denominator: that can be picked up by looking for -% empty output in combination with the flag for using a symbol in the output -% but not a two-part strategy. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_output_denominator: - { - \bool_if:NTF \l_@@_two_part_bool - { - \bool_lazy_and:nnT - { \l_@@_denominator_bracket_bool } - { ! \tl_if_empty_p:N \l_@@_denominator_tl } - { \bool_set_true:N \l_@@_bracket_bool } - \@@_format_output_aux:nV { denominator } - \l_@@_product_tl - } - { - \bool_lazy_and:nnT - { \l_@@_per_symbol_bool } - { \tl_if_empty_p:N \l_@@_formatted_tl } - { \tl_set:Nn \l_@@_formatted_tl { 1 } } - \@@_format_output_aux:nv { formatted } - { - l_@@_ - \bool_if:NTF \l_@@_per_symbol_bool - { per_symbol } - { product } - _tl - } - } - } -\cs_new_protected:Npn \@@_format_output_aux:nn #1#2 - { - \tl_set:cx { l_@@_ #1 _tl } - { - \exp_not:v { l_@@_ #1 _tl } - \tl_if_empty:cF { l_@@_ #1 _tl } - { \exp_not:n {#2} } - \exp_not:V \l_@@_current_tl - } - } -\cs_generate_variant:Nn \@@_format_output_aux:nn { nV , nv } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_format_font:} -% A short auxiliary which checks if the font has been applied to the -% main part of the output: if not, add it and set the flag. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_font: - { - \bool_if:NF \l_@@_font_bool - { - \tl_set:Nx \l_@@_current_tl - { - \exp_not:N \mathrm - { \exp_not:V \l_@@_current_tl } - } - \bool_set_true:N \l_@@_font_bool - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_format_finalise:} -% \begin{macro} -% { -% \@@_format_finalise_autofrac: , -% \@@_format_finalise_fractional: , -% \@@_format_finalise_power: -% } -% Finalising the unit format is really about picking up the cases involving -% fractions: these require assembly of the parts with the need to add -% additional material in some cases -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_finalise: - { - \tl_if_empty:NF \l_@@_denominator_tl - { - \bool_if:NTF \l_@@_powers_positive_bool - { \@@_format_finalise_fractional: } - { \@@_format_finalise_power: } - } - } -% \end{macrocode} -% For fraction-like output, there are three possible choices and two -% actual styles. In all cases, if the numerator is empty then it is set -% here to |1|. To deal with the \enquote{auto-format} case, the two -% styles (fraction and symbol) are handled in auxiliaries: this allows both -% to be used at the same time! Beyond that, the key here is to use a -% single \cs{tl_set:Nx} to keep down the number of assignments. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_finalise_fractional: - { - \tl_if_empty:NT \l_@@_formatted_tl - { \tl_set:Nn \l_@@_formatted_tl { 1 } } - \bool_if:NTF \l_@@_autofrac_bool - { \@@_format_finalise_autofrac: } - { - \bool_if:NTF \l_@@_per_symbol_bool - { \@@_format_finalise_symbol: } - { \@@_format_finalise_fraction: } - } - } -% \end{macrocode} -% For the \enquote{auto-selected} fraction method, the two other auxiliary -% functions are used to do both forms of formatting. So that everything -% required is available, this needs one group so that the second auxiliary -% receives the correct input. After that it is just a case of applying -% \cs{mathchoice} to the formatted output. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_finalise_autofrac: - { - \group_begin: - \@@_format_finalise_fraction: - \exp_args:NNNV \group_end: - \tl_set:Nn \l_@@_tmp_tl \l_@@_formatted_tl - \@@_format_finalise_symbol: - \tl_set:Nx \l_@@_formatted_tl - { - \mathchoice - { \exp_not:V \l_@@_tmp_tl } - { \exp_not:V \l_@@_formatted_tl } - { \exp_not:V \l_@@_formatted_tl } - { \exp_not:V \l_@@_formatted_tl } - } - } -% \end{macrocode} -% When using a fraction function the two parts are now assembled. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_finalise_fraction: - { - \tl_set:Nx \l_@@_formatted_tl - { - \exp_not:V \l_@@_fraction_function_tl - { \exp_not:V \l_@@_formatted_tl } - { \exp_not:V \l_@@_denominator_tl } - } - } -\cs_new_protected:Npn \@@_format_finalise_symbol: - { - \tl_set:Nx \l_@@_formatted_tl - { - \exp_not:V \l_@@_formatted_tl - \exp_not:V \l_@@_per_symbol_tl - \@@_format_bracket:N \l_@@_denominator_tl - } - } -% \end{macrocode} -% In the case of sorted powers, there is a test to make sure there was -% at least one positive power, and if so a simple join of the two parts -% with the appropriate product. -% \begin{macrocode} -\cs_new_protected:Npn \@@_format_finalise_power: - { - \tl_if_empty:NTF \l_@@_formatted_tl - { - \tl_set_eq:NN - \l_@@_formatted_tl - \l_@@_denominator_tl - } - { - \tl_set:Nx \l_@@_formatted_tl - { - \exp_not:V \l_@@_formatted_tl - \exp_not:V \l_@@_product_tl - \exp_not:V \l_@@_denominator_tl - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Pre-defined unit components} -% -% Quite a number of units can be predefined: while this is a code-level module, -% there is little point having a unit parser which does not start off able to -% parse any units! -% -% \begin{macro} -% { -% \kilogram , -% \metre , -% \meter , -% \mole , -% \kelvin , -% \candela , -% \second , -% \ampere -% } -% The basic SI units: technically the correct spelling is \cs{metre} but -% US users tend to use \cs{meter}. -% \begin{macrocode} -\siunitx_declare_unit:Nn \kilogram { \kilo \gram } -\siunitx_declare_unit:Nn \metre { m } -\siunitx_declare_unit:Nn \meter { \metre } -\siunitx_declare_unit:Nn \mole { mol } -\siunitx_declare_unit:Nn \second { s } -\siunitx_declare_unit:Nn \ampere { A } -\siunitx_declare_unit:Nn \kelvin { K } -\siunitx_declare_unit:Nn \candela { cd } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\gram} -% The gram is an odd unit as it is needed for the base unit kilogram. -% \begin{macrocode} -\siunitx_declare_unit:Nn \gram { g } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \yocto , -% \zepto , -% \atto , -% \femto , -% \pico , -% \nano , -% \micro , -% \milli , -% \centi , -% \deci -% } -% The various SI multiple prefixes are defined here: first the small -% ones. -% \begin{macrocode} -\siunitx_declare_prefix:Nnn \yocto { y } { -24 } -\siunitx_declare_prefix:Nnn \zepto { z } { -21 } -\siunitx_declare_prefix:Nnn \atto { a } { -18 } -\siunitx_declare_prefix:Nnn \femto { f } { -15 } -\siunitx_declare_prefix:Nnn \pico { p } { -12 } -\siunitx_declare_prefix:Nnn \nano { n } { -9 } -\siunitx_declare_prefix:Nnn \micro { [micro] } { -6 } -\siunitx_declare_prefix:Nnn \milli { m } { -3 } -\siunitx_declare_prefix:Nnn \centi { c } { -2 } -\siunitx_declare_prefix:Nnn \deci { d } { -1 } -% \end{macrocode} -% \end{macro} -% \begin{macro} -% { -% \deca , -% \deka , -% \hecto , -% \kilo , -% \mega , -% \giga , -% \tera , -% \peta , -% \exa , -% \zetta , -% \yotta -% } -% Now the large ones. -% \begin{macrocode} -\siunitx_declare_prefix:Nnn \deca { da } { 1 } -\siunitx_declare_prefix:Nnn \deka { da } { 1 } -\siunitx_declare_prefix:Nnn \hecto { h } { 2 } -\siunitx_declare_prefix:Nnn \kilo { k } { 3 } -\siunitx_declare_prefix:Nnn \mega { M } { 6 } -\siunitx_declare_prefix:Nnn \giga { G } { 9 } -\siunitx_declare_prefix:Nnn \tera { T } { 12 } -\siunitx_declare_prefix:Nnn \peta { P } { 15 } -\siunitx_declare_prefix:Nnn \exa { E } { 18 } -\siunitx_declare_prefix:Nnn \zetta { Z } { 21 } -\siunitx_declare_prefix:Nnn \yotta { Y } { 24 } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \becquerel , -% \degreeCelsius , -% \coulomb , -% \farad , -% \gray , -% \hertz , -% \henry , -% \joule , -% \katal , -% \lumen , -% \lux -% } -% Named derived units: first half of alphabet. -% \begin{macrocode} -\siunitx_declare_unit:Nn \becquerel { Bq } -\siunitx_declare_unit:Nn \degreeCelsius - { \ensuremath { { } ^ { \circ } } \kern -\scriptspace C } -\siunitx_declare_unit:Nn \coulomb { C } -\siunitx_declare_unit:Nn \farad { F } -\siunitx_declare_unit:Nn \gray { Gy } -\siunitx_declare_unit:Nn \hertz { Hz } -\siunitx_declare_unit:Nn \henry { H } -\siunitx_declare_unit:Nn \joule { J } -\siunitx_declare_unit:Nn \katal { kat } -\siunitx_declare_unit:Nn \lumen { lm } -\siunitx_declare_unit:Nn \lux { lx } -% \end{macrocode} -% \end{macro} -% \begin{macro} -% { -% \newton , -% \ohm , -% \pascal , -% \radian , -% \siemens , -% \sievert , -% \steradian , -% \tesla , -% \volt , -% \watt , -% \weber -% } -% Named derived units: second half of alphabet. -% \begin{macrocode} -\siunitx_declare_unit:Nn \newton { N } -\siunitx_declare_unit:Nn \ohm { \ensuremath { \Omega } } -\siunitx_declare_unit:Nn \pascal { Pa } -\siunitx_declare_unit:Nn \radian { rad } -\siunitx_declare_unit:Nn \siemens { S } -\siunitx_declare_unit:Nn \sievert { Sv } -\siunitx_declare_unit:Nn \steradian { sr } -\siunitx_declare_unit:Nn \tesla { T } -\siunitx_declare_unit:Nn \volt { V } -\siunitx_declare_unit:Nn \watt { W } -\siunitx_declare_unit:Nn \weber { Wb } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \day , -% \hectare , -% \hour , -% \litre , -% \liter , -% \minute , -% \tonne -% } -% Non-SI, but accepted for general use. Once again there are two -% spellings, here for litre and with different output in this case. -% \begin{macrocode} -\siunitx_declare_unit:Nn \day { d } -\siunitx_declare_unit:Nn \hectare { ha } -\siunitx_declare_unit:Nn \hour { h } -\siunitx_declare_unit:Nn \litre { L } -\siunitx_declare_unit:Nn \liter { \litre } -\siunitx_declare_unit:Nn \minute { min } -\siunitx_declare_unit:Nn \tonne { t } -% \end{macrocode} -% \end{macro} -% \begin{macro} -% { -% \arcminute , -% \arcsecond , -% \degree -% } -% Arc units: again, non-SI, but accepted for general use. -% \begin{macrocode} -\siunitx_declare_unit:Nn \arcminute { \ensuremath { ^ { \prime } } } -\siunitx_declare_unit:Nn \arcsecond { \ensuremath { ^ { \prime \prime } } } -\siunitx_declare_unit:Nn \degree { \ensuremath { ^ { \circ } } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\astronomicalunit, \atomicmassunit, \dalton, \electronvolt} -% A few units based on physical measurements exist: these ones are accepted -% for use with the International System. -% \begin{macrocode} -\siunitx_declare_unit:Nn \astronomicalunit { au } -\siunitx_declare_unit:Nn \atomicmassunit { u } -\siunitx_declare_unit:Nn \dalton { Da } -\siunitx_declare_unit:Nn \electronvolt { eV } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\nuaction, \numass, \nuspeed, \nutime} -% Natural units based on physical constants. -% \begin{macrocode} -\siunitx_declare_unit:Nn \nuaction { \ensuremath { \mathit { \hbar } } } -\siunitx_declare_unit:Nx \numass - { - \exp_not:N \ensuremath - { - \exp_not:N \mathit { m } - \c_@@_math_subscript_tl { \exp_not:N \mathrm { e } } - } - } -\siunitx_declare_unit:Nx \nuspeed - { - \exp_not:N \ensuremath - { \exp_not:N \mathit { c } \c_@@_math_subscript_tl { 0 } } - } -\siunitx_declare_unit:Nn \nutime - { \numass \per \numass \per \nuspeed \squared } -% \end{macrocode} -% \end{macro} -% \begin{macro} -% { -% \auaction , -% \aucharge , -% \auenergy , -% \aulength , -% \aumass , -% \autime , -% \bohr , -% \hartree -% } -% Atomic units based on physical constants. -% \begin{macrocode} -\siunitx_declare_unit:Nn \auaction { \ensuremath { \mathit { \hbar } } } -\siunitx_declare_unit:Nn \aucharge { \ensuremath { \mathit { e } } } -\siunitx_declare_unit:Nx \auenergy - { - \exp_not:N \ensuremath - { - \exp_not:N \mathit { E } - \c_@@_math_subscript_tl { \exp_not:N \mathrm { h } } - } - } -\siunitx_declare_unit:Nx \aulength - { - \exp_not:N \ensuremath - { \exp_not:N \mathit { a } \c_@@_math_subscript_tl { 0 } } - } -\siunitx_declare_unit:Nx \aumass - { - \exp_not:N \ensuremath - { - \exp_not:N \mathit { m } - \c_@@_math_subscript_tl { \exp_not:N \mathrm { e } } - } - } -\siunitx_declare_unit:Nn \autime { \auaction \per \auenergy } -\siunitx_declare_unit:Nn \bohr { \aulength } -\siunitx_declare_unit:Nn \hartree { \auenergy } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \angstrom , -% \bar , -% \barn , -% \bel , -% \decibel , -% \knot , -% \millimetremercury , -% \nauticalmile , -% \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} -\siunitx_declare_unit:Nn \angstrom { \mbox { \AA } } -\siunitx_declare_unit:Nn \bar { bar } -\siunitx_declare_unit:Nn \barn { b } -\siunitx_declare_unit:Nn \bel { B } -\siunitx_declare_unit:Nn \decibel { \deci \bel } -\siunitx_declare_unit:Nn \knot { kn } -\siunitx_declare_unit:Nn \millimetremercury { mmHg } -\siunitx_declare_unit:Nn \nauticalmile { M } -\siunitx_declare_unit:Nn \neper { Np } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \dyne , -% \erg , -% \gal , -% \gauss , -% \maxwell , -% \oersted , -% \phot , -% \poise , -% \stilb , -% \stokes -% } -% \textsc{cgs} units: similar to the set immediately above, these may be used -% for specific applications. -% \begin{macrocode} -\siunitx_declare_unit:Nn \dyne { dyn } -\siunitx_declare_unit:Nn \erg { erg } -\siunitx_declare_unit:Nn \gal { Gal } -\siunitx_declare_unit:Nn \gauss { G } -\siunitx_declare_unit:Nn \maxwell { Mx } -\siunitx_declare_unit:Nn \oersted { Oe } -\siunitx_declare_unit:Nn \phot { ph } -\siunitx_declare_unit:Nn \poise { P } -\siunitx_declare_unit:Nn \stilb { sb } -\siunitx_declare_unit:Nn \stokes { St } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\percent} -% For percent, the raw character is the most flexible way of handling output. -% \begin{macrocode} -\siunitx_declare_unit:Nn \percent { \char "25 ~ } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\square, \squared, \cubic, \cubed} -% Basic powers. -% \begin{macrocode} -\siunitx_declare_power:NNn \square \squared { 2 } -\siunitx_declare_power:NNn \cubic \cubed { 3 } -% \end{macrocode} -% \end{macro} -% -% \subsection{Messages} -% -% \begin{macrocode} -\msg_new:nnnn { siunitx } { unit / dangling-part } - { Found~#1~part~with~no~unit. } - { - Each~#1~part~must~be~associated~with~a~unit:~a~#1~part~was~found~ - but~no~following~unit~was~given. - } -\msg_new:nnnn { siunitx } { unit / duplicate-part } - { Duplicate~#1~part:~#2. } - { - Each~unit~may~have~only~one~#1:\\ - the~additional~#1~part~'#2'~will~be~ignored. - } -\msg_new:nnnn { siunitx } { unit / 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 } { unit / part-before-unit } - { Found~#1~part~before~first~unit:~#2. } - { - The~#1~part~'#2'~must~follow~after~a~unit:~ - it~cannot~appear~before~any~units~and~will~therefore~be~ignored. - } -% \end{macrocode} -% -% \subsection{Standard settings for module options} -% -% Some of these follow naturally from the point of definition -% (\emph{e.g.}~boolean variables are always |false| to begin with), -% but for clarity everything is set here. -% \begin{macrocode} -\keys_set:nn { siunitx } - { - bracket-denominator = true , - fraction-command = \frac , - parse-units = true , - per-mode = power , - per-symbol = / , - qualifier-mode = subscript , - qualifier-phrase = \ , - sticky-per = false , - unit-close-bracket = ) , % ( - unit-open-bracket = ( , % ) - unit-product = \, - } -% \end{macrocode} -% -% \begin{macrocode} -%</package> -% \end{macrocode} -% -% \end{implementation} -% -% \begin{thebibliography}{1} -% \bibitem{BIPM} -% \emph{The International System of Units (SI)}, -% \url{https://www.bipm.org/en/measurement-units/}. -% \bibitem{SI:2.1} -% \emph{SI base units}, -% \url{https://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{https://www.bipm.org/en/publications/si-brochure/section2-2-2.html}. -% \bibitem{SI:3.1} -% \emph{SI Prefixes}, -% \url{https://www.bipm.org/en/publications/si-brochure/chapter3.html}. -% \bibitem{SI:5.3.7} -% \emph{Stating values of dimensionless quantities, or quantities of -% dimension one}, -% \url{https://www.bipm.org/en/publications/si-brochure/section5-3-7.html}. -% \bibitem{SI:T6} -% \emph{Non-SI units accepted for use with the International -% System of Units}, -% \url{https://www.bipm.org/en/publications/si-brochure/table6.html}. -% \bibitem{SI:T7} -% \emph{Non-SI units whose values in SI units must be obtained -% experimentally}, -% \url{https://www.bipm.org/en/publications/si-brochure/table7.html}. -% \bibitem{SI:T8} -% \emph{Other non-SI units}, -% \url{https://www.bipm.org/en/publications/si-brochure/table8.html}. -% \bibitem{SI:T9} -% \emph{Non-SI units associated with the CGS and the CGS-Gaussian -% system of units}, -% \url{https://www.bipm.org/en/publications/si-brochure/table9.html}. -% \end{thebibliography} -% -% \PrintIndex |