texlive[42507] Master/texmf-dist: cooking-units (14nov16)

commits+karl at tug.org commits+karl at tug.org
Mon Nov 14 23:34:47 CET 2016


Revision: 42507
          http://tug.org/svn/texlive?view=revision&revision=42507
Author:   karl
Date:     2016-11-14 23:34:47 +0100 (Mon, 14 Nov 2016)
Log Message:
-----------
cooking-units (14nov16)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/cooking-units/cooking-units.pdf
    trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.dtx
    trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty

Modified: trunk/Master/texmf-dist/doc/latex/cooking-units/cooking-units.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.dtx	2016-11-14 07:21:02 UTC (rev 42506)
+++ trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.dtx	2016-11-14 22:34:47 UTC (rev 42507)
@@ -158,13 +158,40 @@
 \labelformat{table}{table~#1}
 \labelformat{section}{section~#1}
 
-\newcommand\mycs[1]{\cs{\textcolor{blue}{#1}}}
+\ExplSyntaxOn
+
+\clist_new:N \l_cooking_units_list_of_defined_befehlen_clist
+\clist_set:Nn \l_cooking_units_list_of_defined_befehlen_clist
+  {
+    cunum,
+    cutext,
+    Cutext,
+    cuam,
+    newcookingunit,
+    declarecookingunit,
+    providecookingunit,
+    cudefinename,
+    cudefinesymbol,
+    cusetup,
+    cudefinekeys,
+    cudefinesinglekey,
+    cuaddkeys,
+    cuaddsinglekeys,
+    cuaddtokeys,
+    culabel,
+    curef,
+  }
+
+\NewDocumentCommand \mycs { m }
+  {
+    \clist_if_in:NnTF \l_cooking_units_list_of_defined_befehlen_clist {#1}
+      { \cs{\textcolor{blue}{#1}} }
+      { \ERROR }
+  }
 \newcommand\opt{\texttt}
 \newcommand\true{\opt{true}}
 \newcommand\false{\opt{false}}
 
-\ExplSyntaxOn
-
 \NewDocumentCommand \PrintUnit { m }
   {
     \translate{ #1 (cu-unitname) } & #1 & \translate{ #1 ( cu-unit ) } 
@@ -181,13 +208,14 @@
   {
     \textcolor{white} {#1} \\
   }
-
+\newcommand\eatthewhitespace{}
 \NewEnviron { cuexamplecode }[1][]
   { 
     \begin{center}
     \begin{minipage}{0.4\linewidth}
     \tl_replace_all:Nnn \BODY { @ } { \dothewhitespace }
-    \tl_replace_all:Nnn \BODY { ! } {  }
+    \tl_replace_all:Nnn \BODY { ! } { }
+    \tl_replace_all:Nnn \BODY { & } { \ignorespaces }
     \BODY
     \end{minipage}
     
@@ -199,6 +227,8 @@
       {
         \char_set_catcode_other:N \{ %
         \char_set_catcode_other:N \} %
+        \char_set_catcode_other:N \_ %
+        \char_set_catcode_other:N \~ %
 %        \char_set_catcode_other:N \# %
       }
       { \BODY }
@@ -218,20 +248,23 @@
                 \textbackslash \textcolor{blue}{\l_tmpb_tl}
               }
           }
-          {
+          { 
             \bool_if:nTF 
               { 
-                \tl_if_eq_p:NN ##1 @ ||
-                \tl_if_eq_p:NN ##1 ! 
+                \str_if_eq_p:nn {##1} { @ } ||
+                \str_if_eq_p:nn {##1} { ! } ||
+                \str_if_eq_p:nn {##1} { & } 
               }
-              { \\ }
+              { 
+                \str_if_eq:nnTF {##1} { & } { \space } { \\ }
+              }
               {
                 \token_if_active:NTF ##1 
-                  { \string ##1 }
+                  {##1}
                   {
                     \token_if_parameter:NTF ##1
                       { 
-                        \int_compare:nTF { \l_tmpa_int == 0 }
+                        \int_compare:nNnTF { \l_tmpa_int } = { \c_zero }
                           { 
                             \c_hash_str 
                             \int_incr:N \l_tmpa_int
@@ -340,6 +373,8 @@
 
 \ExplSyntaxOff
 
+\newcommand\cCutext{\mycs{cutext} and \mycs{Cutext}}
+
 \lstset
   {
     basicstyle   = \ttfamily,
@@ -355,6 +390,8 @@
         Cutext,
         cuam,
         newcookingunit,
+        declarecookingunit,
+        providecookingunit,
         cudefinename,
         cudefinesymbol,
         cusetup,
@@ -363,20 +400,24 @@
         cuaddkeys,
         cuaddsinglekeys,
         cuaddtokeys,
+        culabel,
+        curef,
       }
   }
 
 \newcookingunit {st}
 
-\cuaddkeys {lb}  %% adding t to g (could also add to kg, dag and oz)
+\cuaddkeys {lb}  
   { 
     {st} { 1/14 }  %% 1 lb are 1/14 st
   }        
-    
+
+
 \newcookingunit [\ensuremath{ {} ^ { \circ } }\kern-\scriptspace R{\o}] {Ro}
+
 \cuaddsinglekeys {C}
   {
-    {Ro} { #1*21/40 + 7.5}
+    {Ro} { #1*21/40 + 7.5 }
   }
 \cusetup 
   {
@@ -437,7 +478,7 @@
 % \changes {2016/09/03} {1.01} {Added units 'ssp', 'csp', 'dsp'}
 % \changes {2016/09/03} {1.01} {English unit: litre (and only litre) uses the curly l \protect\ensuremath{\protect\ell} now }
 % \changes {2016/09/03} {1.01} {British English: 'pinch' is written in full}
-% \changes {2016/09/03} {1.01} {Separated Messerpsitze and pinch}
+% \changes {2016/09/03} {1.01} {Separated Messerspitze and pinch}
 % \changes {2016/09/05} {1.02} {Replaced \cs{cufrac} by \cs{cuam}}
 % \changes {2016/09/05} {1.02} {New message: 'obsolete-command'}
 % \changes {2016/09/09} {1.02a} {Changed name from \cs{@@_parse_fraction_in_input:www} to \cs{@@_parse_mixed_fraction_in_input:www}}
@@ -448,7 +489,7 @@
 % \changes {2016/09/09} {1.02d} {Add 'single' to property list of singlekeys.}
 % \changes {2016/09/16} {1.02e} {Only use \cs{phantom} if the argument (for \cs{phantom}) is not empty.}
 % \changes {2016/09/09} {1.02i} {Delete 'single' from property lists of singlekeys cause it is not as safe as I thought.}
-% \changes {2016/09/09} {1.02f} {Corrected mistake: 'ELektronenvolt' (note upperacse L) to 'Elektronenvolt' in german.}
+% \changes {2016/09/09} {1.02f} {Corrected mistake: 'ELektronenvolt' (note uppercase L) to 'Elektronenvolt' in german.}
 % \changes {2016/09/26} {1.03} {New option  (and needed macros): add-temperature-to-check.}
 % \changes {2016/09/26} {1.03a} {\cs{cuaddsinglekeys} now tests if the unit exists (it didn't before).}
 % \changes {2016/09/26} {1.03b} {Replaced \cs{prop_clear_new:c} by \cs{prop_clear:c}.}
@@ -458,6 +499,18 @@
 % \changes {2016/10/19} {1.04} {'convert-to-eV' now also as optional argument available.}
 % \changes {2016/10/19} {1.04} {Option 'load-time-option' now spells 'available' correct.}
 % \changes {2016/10/19} {1.04} {Update of documentation.}
+% \changes {2016/10/28} {1.10alpha} {Start implementation of \enquote{Change recipe from $n$ to $m$ persons.}.}
+% \changes {2016/10/28} {1.10alpha} {\cs{cutext} (and \cs{Cutext}) and \cs{cuam} now parse their input like \cs{cunum}. This is needed as they also need to be changed.}
+% \changes {2016/10/29} {1.10alpha} {Tiding code: Now every command is separated into a \enquote{calc} function, a \enquote{print numeric value} and a \enquote{print unit} (if there) function. At least, that's the plan.}
+% \changes {2016/10/30} {1.10} {Fractions should now deal correctly with minus signs.}
+% \changes {2016/11/07} {1.10} {Finished writing v1.10.}
+% \changes {2016/11/13} {1.10} {Change amounts for specific number of persons.}
+% \changes {2016/11/13} {1.10} {\cs{cutext}, \cs{Cutext} and \cs{cuam} check their input, allows conversion of units.}
+% \changes {2016/11/13} {1.10} {New commands: \cs{culabel} and \cs{curef}.}
+% \changes {2016/11/13} {1.10} {New commands: \cs{declarecookingunit} and \cs{providecookingunit}.}
+% \changes {2016/11/13} {1.10} {New options: \opt{cutext-to-cunum}, \opt{cutext-change-unit} and \opt{cutext-space}.}
+% \changes {2016/11/13} {1.10} {New options: \opt{cuam-version} and \opt{cutext-version}}
+% \changes {2016/11/13} {1.10} {New options: \opt{recalculate-amount} and \opt{set-number-of-persons}, \opt{label}, \opt{get-label}, \opt{ref}.}
 % 
 %
 % \GetFileInfo{\jobname.sty}
@@ -471,11 +524,11 @@
 % 
 %
 % \begin{documentation}
-%
-%
 % \begin{abstract}
-%   This package enables user to globally format units and to switch
-%   between them. It should be used for light-hearted things like
+%   This package enables user to globally format units, to switch
+%   between them and since v1.10 you can also change your recipes for a given
+%   number of persons.
+%   It should be used for light-hearted things like
 %   cookery books (and not e.g. scientific texts).\footnote{I did hide  some 
 %   grammatical and spelling errors for easter egg hunters \Winkey.}
 % \end{abstract}
@@ -539,17 +592,19 @@
 %  \item French (currently suboptimal\footnote{You can only get limited information from the internet.})
 % \end{itemize}
 % Have another language to add or a correction of an existing one? 
-% See \vref{sec:bug-feed} for more details.
+% See \vref{sec:bug-feed} for more details. Wanna just check the existing
+% translations? See \vref{sec:Translations}.
 %
 % \section {The Commands}
+% \label{sec:commands}
 %
 % This package offers the following commands for unit printing (and converting):
 %
 % \begin{itemize}
-%   \item \mycs{cunum}\oarg{options}\marg{amount}\oarg{space}\marg{unit-key}
-%   \item \mycs{cutext}\oarg{options}\marg{amount}\marg{unit-key}
-%   \item \mycs{Cutext}\oarg{options}\marg{amount}\marg{unit-key}
-%   \item \mycs{cuam}\oarg{options} \marg{amount}
+%   \item \mycs{cunum}\meta{label}\oarg{options}\marg{amount}\oarg{space}\marg{unit-key}
+%   \item \mycs{cutext}\meta{label}\oarg{options}\marg{amount}\marg{unit-key}
+%   \item \mycs{Cutext}\meta{label}\oarg{options}\marg{amount}\marg{unit-key}
+%   \item \mycs{cuam}\meta{label}\oarg{options} \marg{amount}
 % \end{itemize}
 %
 % Numbers and units are printed using \mycs{cunum}. The numerical part
@@ -564,7 +619,9 @@
 % customize this behavior, see \vref{sec:options}}. \oarg{space} adds
 % a space between the number and the unit using \lstinline|\phantom|.
 %
-% For a list of predefined units have a look at \vref{tab:def-units}.
+% For a list of predefined units have a look at \vref{tab:def-units}. 
+%
+% \meta{label} is explained in \vref{sec:labeletref}.
 % 
 %
 % \begin{cuexamplecode}
@@ -590,14 +647,17 @@
 % \texttt{Re}) are automatically rounded to integers.\footnote{You can
 % -- of course -- change this behavior, see \vref{sec:options}.}
 % 
-% \lstinline|\cutext| and \lstinline|\Cutext| print the number and the
-% written name of the unit. Furthermore, if the package option
+%
+% \cCutext\ print the number and the written name of the unit. Since v1.10
+% it works similar\footnote{One could also say \enquote{exactly like}.} to \mycs{cunum}: it allows the conversion between units
+% and interprets the numerical part (again |_| and |/| 
+% are used for (mixed) fractions and |--| for ranges).
+% Furthermore, if the package option
 % \opt{use-numerals} is used, integers below a specific integer (by
-% default 13; see \opt{use-numerals-below}) are also written out with
+% default 13; see \opt{use-numerals-below}) are written out with
 % \lstinline|\Cutext| capitalizing the first letter (using package \pkg{fmtcount}).
-% Conversion between
-% units is not supported. Without \opt{use-numerals}:
 %
+%
 % \begin{cuexamplecode}
 %   \cutext{1}{l} \\
 %   \Cutext{1}{l} \\
@@ -607,27 +667,32 @@
 % and using package option \opt{use-numerals=true}
 % \cusetup{use-numerals-below=13}
 % \begin{cuexamplecode}
-%   \cutext{1}{l} \\
+%   \cutext{1--2}{l} \\
 %   \Cutext{1}{l} \\
 %   \cutext{12}{l} \\
 %   \Cutext{13}{l} 
-%^^A   \cutext{23}{kg} \\
-%^^A   \Cutext{23}{kg}\\
-%^^A   \cutext{1}{l}\\
-%^^A   \Cutext{2}{l}\\
-%^^A   \cutext{1}{C} \\
-%^^A   \cutext{180}{C} \\
-%^^A   \Cutext{1}{C} \\
-%^^A   \Cutext{180}{C} \\
-%^^A   \Cutext{1.4}{C} \\
 % \end{cuexamplecode}
 % \cusetup{use-numerals-below=0}
+% Furthermore,
+% since v1.10 \cCutext\ also allows their units to be changed (this behavior
+% can be altered using \opt{cutext-change-unit}):
+% \begin{cuexamplecode}
+%   \cutext[l=ml]{1}{l} \\
+%   \Cutext[l=ml]{1}{l} \\
+%   \cutext[l=ml]{12}{l} \\
+%   \Cutext[l=ml]{13}{l} \\
+%   \Cutext[l=ml]{?}{l} \\
+%   \Cutext[l=ml]{1/2}{l} 
+% \end{cuexamplecode}
 %
 %
-% \lstinline|\cuam| works like a more primitive version \mycs{cunum}
-% which doesn't need a unit, but doesn't check the input like \mycs{cunum}. 
-% Like in \lstinline|\cunum| \texttt{\_} and \texttt{/} are used to imply a (mixed) fraction and \texttt{-{}-} is
-% used to print ranges\footnote{Note that since v1.02 \mycs{cufrac} is obsolete.}:
+% \lstinline|\cuam| works like \mycs{cunum}, but without a unit, so
+% changing units doesn't affect it. Like \mycs{cunum} \texttt{\_} and \texttt{/}
+% are used to imply a (mixed) fraction and |--| is used to print ranges.
+%^^A works like a more primitive version \mycs{cunum}
+%^^A which doesn't need a unit, but doesn't check the input like \mycs{cunum}. 
+%^^A Like in \lstinline|\cunum| \texttt{\_} and \texttt{/} are used to imply a (mixed) fraction and \texttt{-{}-} is
+%^^A used to print ranges\footnote{Note that since v1.02 \mycs{cufrac} is obsolete.}:
 %
 % \begin{cuexamplecode}
 %   \cuam{3} \\
@@ -637,6 +702,82 @@
 % \end{cuexamplecode}
 %
 %
+% \section{Label \& refs: Changing the amount of the recipe}
+% \label{sec:labeletref}
+%
+%^^A You may write or have a recipe for a specific number of persons
+%^^A (e.g. for 4), but you would like to have this recipe for another number
+%^^A (e.g. only for two). Using labels  you can write your recipes and change
+%^^A the number of persons they are for. There are also two commands helping:
+%
+%^^A To change your recipe \emph{from} a specific number of persons (e.g. 4)
+%^^A \emph{to} another number of persons (e.g. 3) the following commands will
+%^^A prove helpfull:
+%
+% What if you don't want to change units, but the amounts of the recipe because
+% you cook not for 4 persons, but for 2 and don't like to do the math? 
+% Simple, use the following commands:
+%
+% \begin{itemize}
+%   \item \mycs{culabel} \marg{label} \marg{number of persons}
+%   \item \mycs{curef} \marg{label}
+% \end{itemize}
+%
+%^^A The first one is the important one: With its help you can define a \meta{label}
+%^^A which tells this package that the recipe is originally for \meta{number of persons}
+%^^A persons. This \meta{label} is then available for the commands introduced in 
+%^^A \vref{sec:commands} to be used. 
+%
+% The first one is the important one: It defines a \meta{label} for a recipe
+% which is initially for  \meta{number of persons}. Afterwards \meta{label}
+% can be used to tell the commands from \vref{sec:commands} that the given
+% amounts are for \meta{number of persons} people.
+% Each \meta{label} must be unique and an error is raised if a \meta{label}
+% is already defined.
+%  
+% If you would like to print the number of persons this recipe is for, use 
+% \mycs{curef}.
+%^^A \mycs{curef} does print the number of people the recipe (\meta{label}) is for.
+%
+% The following example uses \mycs{culabel} to specify that the recipe is
+% initially intended for 2 persons:
+% \begin{cuexamplecode}
+%   \culabel{recipe}{2} @
+%   recipe & for & \curef{recipe} & persons: \\
+%   \cunum<recipe>{10--20}{dag} & flour, \\
+%   \cunum<recipe>{1/2}{l} & water, \\
+%   \cutext[ref=recipe]{10}{g} & nuts, \\
+%   \cuam<recipe>{2--3} & eggs, \\
+%   \cunum{180}{C} & open & fire
+% \end{cuexamplecode}
+%
+% Now with combination of the option \opt{set-number-of-persons}
+% and setting \opt{recalculate-amount} to \opt{true} you can have this recipe
+% changed to four persons:
+%
+% \begin{lstlisting}
+%   \culabel{recipe}{2}
+%   %% adding options:
+%   \cusetup{set-number-of-persons=4,recalculate-amount=true}
+% \end{lstlisting}
+% \cusetup{set-number-of-persons=4,recalculate-amount=true}
+%
+% \begin{cuexamplecode}
+%   recipe & for & \curef{recipe} & persons: \\
+%   \cunum<recipe>{10--20}{dag} & flour, \\
+%   \cunum<recipe>{1/2}{l} & water, \\
+%   \cutext[ref=recipe]{10}{g} & nuts, \\
+%   \cuam<recipe>{2--3} & eggs, \\
+%   \cunum{180}{C} & open & fire
+% \end{cuexamplecode}
+% \cusetup{recalculate-amount=false}
+%
+% Note that fractions are automatically evaluated and that only values
+% with a \meta{label} are changed (\lstinline|\cunum{180}{C}| for example
+% stays the same which also makes sense as the heat should be the same).
+%
+%
+%
 % \section{Predefined units \& some notes}
 % \label{sec:pred-units}
 %
@@ -747,24 +888,32 @@
 % \section{Defining units}
 % \label{sec:def-units}
 %
-% New units can be defined using \lstinline|\newcookingunit|:
+% New units can be defined using \lstinline|\declarecookingunit|, 
+% \lstinline|\newcookingunit| and \lstinline|\providecookingunit|:
 %
-% \begin{function}{\newcookingunit}
+% \begin{function}{\declarecookingunit,\newcookingunit,\providecookingunit}
 %   \begin{syntax}
+%     \lstinline|\declarecookingunit|\oarg{symbol}\marg{unit-key}
 %     \lstinline|\newcookingunit|\oarg{symbol}\marg{new-unit-key}
+%     \lstinline|\providecookingunit|\oarg{symbol}\marg{new-unit-key}
 %   \end{syntax}
-%   This command defines the new unit  \meta{new-unit-key}. If the 
+%   These commands define the unit  \meta{unit-key}. If the 
 %   key is not the same as the printed symbol use \oarg{symbol}.
 %
+%   \mycs{newcookingunit} raises an error if the unit is already defined,
+%   \mycs{declarecookingunit} overwrites \meta{symbol} (if given)
+%   and \mycs{providecookingunit} does nothing if the unit is already
+%   defined.
+%
 % Some examples (note: the definition of the printed degree Celsius is
 % directly copied \& pasted from [a maybe older version of] \pkg{siunitx}):
 %
 % \begin{center}
 % \begin{tabular}{ll}
-%   \lstinline|\newcookingunit{kg}| \\
-%   \lstinline|\newcookingunit{g}| \\
-%   \lstinline|\newcookingunit[Msp.] {Msp}| \\
-%   \lstinline|\newcookingunit[\ensuremath{{}^{\circ}}\kern-\scriptspace C] {C} |
+%   \lstinline|\declarecookingunit{kg}| \\
+%   \lstinline|\declarecookingunit{g}| \\
+%   \lstinline|\declarecookingunit[Msp.] {Msp}| \\
+%   \lstinline|\declarecookingunit[\ensuremath{{}^{\circ}}\kern-\scriptspace C] {C} |
 % \end{tabular}
 % \end{center}
 %
@@ -783,9 +932,9 @@
 %   \item \lstinline|\cuaddsinglekeys|
 %   \item \lstinline|\cuaddtokeys|
 % \end{itemize}
+% I apologize for the inconsistency between \lstinline|\cudefinekeys| and
+% \lstinline|\cudefinesinglekey|.
 %
-%
-%
 % \begin{function}{\cudefinekeys,\cudefinesinglekey}
 %   \begin{syntax}
 %     \mycs{cudefinekeys}\marg{unit-key-1}
@@ -855,6 +1004,7 @@
 %      {oz} { 35.27399 }  %% 1 kg are 35.27399 oz
 %      {lb} { 2.204 622 6 } %% 1 kg are  2.204 622 6 lb
 %    }
+%
 %  \cudefinekeys {d}
 %    {
 %      {h}  { 24 } %% 1 day are 24 hours
@@ -870,7 +1020,6 @@
 %   T_K &= ( T_F - 459.67 ) \cdot \frac{5}{9} \\
 %   T_{Re} &= ( T_F - 32 ) \cdot \frac{4}{9} 
 % \end{align*}
-%
 % with $T_F$ being the input temperature in degree Fahrenheit and 
 % $T_C$ being the same temperature in degree Celsius, etc. Using 
 % \lstinline|\cudefinesinglekey| the  key \texttt{F} and  the values \texttt{C}, \texttt{K} and \texttt{Re} 
@@ -1012,7 +1161,8 @@
 % \cunum[st=lb]{1}{st} \\
 % \cunum[st=g]{1}{st} \\
 % \cunum[st=kg]{1}{st} \\
-% \cunum[kg=st]{1}{kg} 
+% \cunum[kg=st]{1}{kg} \\
+% \cunum[st=kg]{16}{st} 
 % \end{cuexamplecode}
 % \end{cuexample}
 %
@@ -1165,8 +1315,8 @@
 %     \cs{usepackage}[use-numerals=\meta{true/false}]\{cooking-units\}
 %   \end{syntax}
 %   If set to \true\ loads package \pkg{fmtcount} and uses 
-%   \mycs{numberstringnum}  for \mycs{cutext}
-%   and \mycs{Numberstringnum} for \mycs{Cutext} to  write-out numbers below
+%   \cs{numberstringnum}  for \mycs{cutext}
+%   and \cs{Numberstringnum} for \mycs{Cutext} to  write-out numbers below
 %   \opt{use-numerals-below} (13 by default), integers above are
 %   printed as numbers. Please note the keys \opt{one(m)}, \opt{one(f)}
 %   and \opt{one(n)} to change the printed \enquote{one} (as
@@ -1195,7 +1345,8 @@
 %   Options can be set  globally using \lstinline|\cusetup|.
 % \end{function}
 % 
-% 
+% \subsubsection{Unit Specific options} 
+%
 % \begin{function}{unit}
 %   \begin{syntax}
 %     \meta{unit-key-1} = \meta{unit-key-2}
@@ -1242,26 +1393,201 @@
 % an empty value for a specific \meta{unit-key} (or use
 % \opt{erase-all-options} to erase all options for all \meta{unit-key}s)
 %
+% \subsubsection{Command behavior}
 %
-% \begin{function}{eval-fraction}
-%  \begin{syntax}
-%    eval-fraction = \meta{true/false}
-%  \end{syntax}
-%   This option takes \texttt{true} or \texttt{false} as values.
-%   If set to \texttt{true} fractions are evaluated. Please note that divisions
-%  through zero are not allowed.
+% \begin{function}{cutext-to-cunum}
+%   \begin{syntax}
+%     cutext-to-cunum = \meta{true/false}
+%   \end{syntax}
+%   Want to get rid of all \cCutext? Set this option to \opt{true} and all
+%   \cCutext\ are changed into \mycs{cunum}.
 % \end{function}
+% \begin{cuexamplecode}
+%   \cutext{1}{kg} \\
+%   \Cutext{2}{kg} \\
+%   \cutext{1/2}{kg} \\
+%   \cutext{?}{kg} \\
+%   \cutext[kg=g]{1--2}{kg} \\
+%   \cusetup{cutext-to-cunum = true } @
+%   \cutext{1}{kg} \\
+%   \Cutext{2}{kg} \\
+%   \cutext{1/2}{kg} \\
+%   \cutext{?}{kg} \\
+%   \cutext[kg=g]{1--2}{kg}
+% \end{cuexamplecode}
 %
+% \begin{function}{cuam-version,cutext-version}
+%   \begin{syntax}
+%     cuam-version = \meta{old/new}
+%     cutext-version = \meta{old/new}
+%   \end{syntax}
+%   Since v1.10 this package also parses and checks the input of \cCutext\ and
+%   \mycs{cuam}. If you want to restore the old behavior, set this option to \opt{old},
+%    but note that then you can neither change the amounts for a given number of persons
+%   nor change the unit of \cCutext. Both of them are set to \opt{new} by default.
+% \end{function}
+%
+% \begin{function}{cutext-change-unit}
+%   \begin{syntax}
+%     cutext-change-unit = \meta{true/false}
+%   \end{syntax}
+%   Set this option to \opt{true} if you do \emph{not} want the units of \cCutext\
+%  to be changed.
+% \end{function}
 % \begin{cuexamplecode}
-%   \cusetup{eval-fraction=true} @
-%   \cunum{1/3}{kg} \\
+%   \cutext[kg=g]{1}{kg} \\
+%   \cutext[kg=g]{1/2}{kg} \\
+%   \cutext[kg=g]{1--2}{kg} \\
+%   \cusetup{cutext-change-unit=false } @
+%   \cutext[kg=g]{1}{kg} \\
+%   \cutext[kg=g]{1/2}{kg} \\
+%   \cutext[kg=g]{1--2}{kg}
+% \end{cuexamplecode}
+%
+%
+% \subsubsection{Input and signs}
+%
+% \begin{function}{set-special-sign,add-special-sign}
+%   \begin{syntax}
+%     set-special-sign = \meta{character(s)}
+%     add-special-sign = \meta{character(s)}
+%   \end{syntax}
+%   Allows \meta{character(s)} to be used in the first mandatory argument of 
+%  \lstinline!\cunum! without raising an error (you can customize this
+%  behavior, see \opt{set-unknown-message}). By default it is set to \texttt{?}.
+% \end{function}
+%
+% \begin{cuexamplecode}
+%   \cunum{?}{kg} \\
+%   \cunum[g=kg]{10?--20?}{kg} \\
+%   \cusetup{add-special-sign={xX} } @
+%   \cunum{x}{kg} \\
+%   \cunum{X--?}{kg} \\
+%   \cusetup{set-special-sign={} } @
+%   \cunum{1}{kg} \\
+%   \cunum{1--2}{kg} 
+% \end{cuexamplecode}
+%
+% \begin{function}{set-unknown-message}
+%   \begin{syntax}
+%     set-unknown-message = \meta{error/warning/none}
+%   \end{syntax}
+%   Using a special sign (\texttt{?} by default) causes a warning to
+%   be raised. Set this option to \opt{error} if you want an error
+%   (as an extra emphasis), \opt{warning} if you want a warning
+%   (default) and \opt{none} if you don't want to know anything about it.
+% \end{function}
+%
+%
+% \begin{function}{use-numerals-below}
+%   \begin{syntax}
+%     use-numerals-below = \meta{integer}
+%   \end{syntax}
+%   Only usable if the package option \opt{use-numerals} is active. Prints the name of
+%   the numbers for integers used in \mycs{cutext} and \mycs{Cutext} 
+%   smaller than \meta{integer}. \meta{integer}  is by default
+%   13. Package pkg{fmtcount} is used for this purpose.
+% \end{function}
+% \cusetup{ use-numerals-below=13 }
+% \begin{cuexamplecode}
+%   \cutext{1}{kg} \\
+%   \cutext{2}{kg} \\
+%   \cutext{12}{kg} \\
+%   \cutext{13}{kg} \\
+%   \cusetup{ use-numerals-below=10 } @
+%   \cutext{1}{kg} \\
+%   \cutext{2}{kg} \\
+%   \cutext{12}{kg} \\
+%   \cutext{13}{kg} \\
+%   \cusetup{ use-numerals-below=0 } @
+%   \cutext{1}{kg} \\
+%   \cutext{2}{kg} \\
+%   \cutext{12}{kg} \\
+%   \cutext{13}{kg} \\
+%   \cusetup{ use-numerals-below=12001 } @
+%   \cutext[kg=g]{1}{kg} \\
+%   \cutext[kg=g]{2}{kg} \\
+%   \cutext[kg=g]{12}{kg} \\
+%   \cutext[kg=g]{13}{kg}
+% \end{cuexamplecode}
+% \cusetup{ use-numerals-below=0 } 
+%
+%
+% \begin{function}{parse-number}
+%   \begin{syntax}
+%     parse-number = \meta{true/false}
+%   \end{syntax}
+%   If set to \texttt{false} prints the number of \lstinline!\cunum!, 
+%   \lstinline!\cutext!, \lstinline!\Cutext! and \mycs{cuam}
+%   as they are (after some \dots\ well \dots\ parsing due to \enquote{\lstinline|_|}). It is  \texttt{true} by default.
+% \end{function}
+%
+% \begin{cuexamplecode}
+%   \cusetup{ parse-number=false } @
+%   \cunum[kg=g]{1}{kg} \\
+%   \cunum{1--2}{kg} \\
+%   \cunum{1----------2}{kg} \\
+%   \cunum{1.2}{kg} \\
+%   \cunum[kg=g]{1,2}{kg} \\
 %   \cunum{1/2}{kg} \\
-%   \cunum[kg=g]{1/2}{kg} \\
-%   \cunum{1_1/2}{kg} \\
-%   \cunum[kg=g]{1_1/2}{kg} 
+%   \cunum{1_2/3}{kg} \\
+%   \cunum{1/2_3}{kg} \\
+%   \cunum{qwertzuiop}{kg} \\
+%   \cutext{1}{kg} \\
+%   \cutext{100}{kg} \\
+%   \cutext{gjfak}{kg} \\
+%   \cuam{1----------2} \\
+%   \cuam{1,2} \\
+%   \cuam{1_1/2} \\
+%   \cuam{kwflk} \\
 % \end{cuexamplecode}
 %
 %
+%
+% \begin{function}{range-sign}
+%   \begin{syntax}
+%     range-sign = \meta{string}
+%     cunum-range-sign = \meta{string}
+%     cutext-range-sign = \meta{string}
+%   \end{syntax}
+%^^A   Sets the \emph{printed} range-sign equal to \meta{string}.
+%   The second sets the \emph{printed} range-sign used in \mycs{cunum}
+%   (and \mycs{cuam}) to 
+%   \meta{string}, the third sets the printed range-sign used in 
+%   \mycs{cutext}/\mycs{Cutext} to \meta{string}. 
+%
+%^^A   If you want to change to the same range-sign for all commands
+%^^A use the first option.
+% Use \opt{range-sign} to set the printed range-signs for both
+% \mycs{cunum} (and \mycs{cuam}) and \mycs{cutext}/\mycs{Cutext} to \meta{string}.
+%
+%  The default for \meta{string} is \texttt{-{}-} (for both).
+% \end{function}
+%
+% \begin{cuexamplecode}
+%   \cusetup{cunum-range-sign={~to~}} @
+%   \cunum{1--2}{kg} \\
+%   \cuam{1--2} \\
+%   \cutext{1--2}{kg} \\
+%   \Cutext{1--2}{kg} 
+% \end{cuexamplecode}
+% \begin{cuexamplecode}
+%   \cusetup{cutext-range-sign={~to~}} @
+%   \cunum{1--2}{kg} \\
+%   \cuam{1--2} \\
+%   \cutext{1--2}{kg} \\
+%   \Cutext{1--2}{kg} 
+% \end{cuexamplecode}
+% \begin{cuexamplecode}
+%   \cusetup{range-sign={~to~}} @
+%   \cunum{1--2}{kg} \\
+%   \cuam{1--2} \\
+%   \cutext{1--2}{kg} \\
+%   \Cutext{1--2}{kg} 
+% \end{cuexamplecode}
+%
+% \subsubsection{Rounding options}
+%
 % \begin{function}{round-precision}
 %  \begin{syntax}
 %    round-precision = \meta{integer}
@@ -1331,54 +1657,31 @@
 %   \cusetup{round-half=commercial} @
 %   \cunum{0.005}{kg} \\
 %   \cunum{-0.005}{kg} \\
-%   \cunum{1.245}{kg} 
+%   \cunum{1.245}{kg} @
 % \end{cuexamplecode}
 %
 %
-% \begin{function}{range-sign}
-%   \begin{syntax}
-%     range-sign = \meta{string}
-%     cunum-range-sign = \meta{string}
-%     cutext-range-sign = \meta{string}
-%   \end{syntax}
-%^^A   Sets the \emph{printed} range-sign equal to \meta{string}.
-%   The second sets the \emph{printed} range-sign used in \mycs{cunum}
-%   (and \mycs{cuam}) to 
-%   \meta{string}, the third sets the printed range-sign used in 
-%   \mycs{cutext}/\mycs{Cutext} to \meta{string}. 
 %
-%^^A   If you want to change to the same range-sign for all commands
-%^^A use the first option.
-% Use the \opt{range-sign} to set the printed range-signs for both
-% \mycs{cunum} (and \mycs{cuam}) and \mycs{cutext}/\mycs{Cutext} to \meta{string}.
+% \subsubsection{Fractions}
 %
-%  The default for \meta{string} is \texttt{-{}-} (for both).
+% \begin{function}{eval-fraction}
+%  \begin{syntax}
+%    eval-fraction = \meta{true/false}
+%  \end{syntax}
+%   This option takes \texttt{true} or \texttt{false} as values.
+%   If set to \texttt{true} fractions are evaluated. Please note that divisions
+%  through zero are not allowed.
 % \end{function}
 %
 % \begin{cuexamplecode}
-%   \cusetup{cunum-range-sign={~to~}} @
-%   \cunum{1--2}{kg} \\
-%   \cuam{1--2} \\
-%   \cutext{1--2}{kg} \\
-%   \Cutext{1--2}{kg} 
+%   \cusetup{eval-fraction=true} @
+%   \cunum{1/3}{kg} \\
+%   \cunum{1/2}{kg} \\
+%   \cunum[kg=g]{1/2}{kg} \\
+%   \cunum{1_1/2}{kg} \\
+%   \cunum[kg=g]{1_1/2}{kg} 
 % \end{cuexamplecode}
-% \begin{cuexamplecode}
-%   \cusetup{cutext-range-sign={~to~}} @
-%   \cunum{1--2}{kg} \\
-%   \cuam{1--2} \\
-%   \cutext{1--2}{kg} \\
-%   \Cutext{1--2}{kg} 
-% \end{cuexamplecode}
-% \begin{cuexamplecode}
-%   \cusetup{range-sign={~to~}} @
-%   \cunum{1--2}{kg} \\
-%   \cuam{1--2} \\
-%   \cutext{1--2}{kg} \\
-%   \Cutext{1--2}{kg} 
-% \end{cuexamplecode}
 %
-%
-%
 % \begin{function}{fraction-command}
 %   \begin{syntax}
 %     fraction-command = \meta{\cs{command}}
@@ -1426,6 +1729,7 @@
 %   \cunum{1_2/3}{kg} 
 % \end{cuexamplecode}
 %
+% \subsubsection{spaces}
 %
 % \begin{function}{mixed-fraction-space}
 %   \begin{syntax}
@@ -1434,118 +1738,148 @@
 %   Sets the length between the fraction and the number in a mixed-fraction,
 %   default is \texttt{0.1em} (because I said so).
 % \end{function}
-%
 % \begin{cuexamplecode}
-%   \cuam{1_2/3}{kg} \\
+%   \cuam{1_2/3} \\
 %   \cunum{1_2/3}{kg} \\
 %   \cunum{10_2/3}{kg} \\
 %   \cusetup{mixed-fraction-space=1em } @
-%   \cuam{1_2/3}{kg} \\
+%   \cuam{1_2/3} \\
 %   \cunum{1_2/3}{kg} \\
 %   \cunum{10_2/3}{kg} \\
 %   \cusetup{mixed-fraction-space=0em } @
-%   \cuam{1_2/3}{kg} \\
+%   \cuam{1_2/3} \\
 %   \cunum{1_2/3}{kg} \\
 %   \cunum{10_2/3}{kg} 
 % \end{cuexamplecode}
 %
-%
-% \begin{function}{set-special-sign,add-special-sign}
+% \begin{function}{cutext-space}
 %   \begin{syntax}
-%     set-special-sign = \meta{character(s)}
-%     add-special-sign = \meta{character(s)}
+%     cutext-space = \meta{string}
 %   \end{syntax}
-%   Allows \meta{character(s)} to be used in the first mandatory argument of 
-%  \lstinline!\cunum! without raising an error (you can customize this
-%  behavior, see \opt{set-unknown-message}). By default it is set to \texttt{?}.
+%   \meta{string} is inserted between the numeral part and the unit part
+%   when using \cCutext. By default it is set to \cs{space}. Use this option
+%  if you want to e.g. insert an unbreakable space.
 % \end{function}
-%
 % \begin{cuexamplecode}
-%   \cunum{?}{kg} \\
-%   \cunum[g=kg]{10?--20?}{kg} \\
-%   \cusetup{add-special-sign={xX} } @
-%   \cunum{x}{kg} \\
-%   \cunum{X--?}{kg} \\
-%   \cusetup{set-special-sign={} } @
-%   \cunum{1}{kg} \\
-%   \cunum{1--2}{kg} 
+%   \cutext{1}{kg}\\
+%   \Cutext{10}{kg}\\ 
+%   \cusetup { cutext-space = ~ } @
+%   \cutext{1}{kg}\\
+%   \Cutext{10}{kg}\\
+%   \cusetup { cutext-space = {} } @
+%   \cutext{1}{kg}\\
+%   \Cutext{10}{kg}\\
+%   \cusetup { cutext-space = {qwe} } @
+%   \cutext{1}{kg}\\
+%   \Cutext{10}{kg}\\
 % \end{cuexamplecode}
 %
 %
 %
+% \subsubsection{label \& refs for People}
 %
+% \begin{function}{recalculate-amount}
+%   \begin{syntax}
+%     recalculate-amount = \meta{true/false}
+%   \end{syntax}
+%   Set this option to \opt{true} if you want to change your recipes to the given
+%   number of people set by \opt{set-number-of-persons}. Note that only those
+%   values who have a label are changed.
+% \end{function}
 %
-% \begin{function}{parse-number}
+% \begin{function}{set-number-of-persons}
 %   \begin{syntax}
-%     parse-number = \meta{true/false}
+%     set-number-of-persons = \meta{integer}
 %   \end{syntax}
-%   If set to \texttt{false} prints the number of \lstinline!\cunum!, 
-%   \lstinline!\cutext! and \lstinline!\Cutext!
-%   as they are (after some \dots\ well \dots\ parsing due to \enquote{\lstinline|_|}). It is  \texttt{true} by default.
+%   With this option you can determine the number of people your recipes
+%   are. Note that this option only has an effect on those who have a \meta{label}
+%   given. It is set to \opt{4} by default.
 % \end{function}
+% \begin{cuexamplecode}
+%   \culabel{anotherrecipe}{2} @
+%   \curef{anotherrecipe}~persons \\ @
+%   \cusetup{ recalculate-amount = true } @
+%   \curef{anotherrecipe}~persons \\ 
+%   \cunum<anotherrecipe>{1}{kg}\\
+%   \cuam<anotherrecipe>{1}\\
+%   \cutext<anotherrecipe>{1}{kg}\\
+%   \Cutext[ref=anotherrecipe]{10}{kg}\\ @
+%   \cusetup { set-number-of-persons = 3 } @
+%   \curef{anotherrecipe}~persons \\ 
+%   \cunum<anotherrecipe>{1}{kg}\\
+%   \cuam<anotherrecipe>{1}\\
+%   \cutext<anotherrecipe>{1}{kg}\\
+%   \Cutext[ref=anotherrecipe]{10}{kg}\\ @
+%   \cusetup { set-number-of-persons = 2 } @
+%   \curef{anotherrecipe}~persons \\ 
+%   \cunum<anotherrecipe>{1}{kg}\\
+%   \cuam<anotherrecipe>{1}\\
+%   \cutext<anotherrecipe>{1}{kg}\\
+%   \Cutext[ref=anotherrecipe]{10}{kg}\\ @
+%   \cusetup { set-number-of-persons = 1 } @
+%   \curef{anotherrecipe}~person \\ 
+%   \cunum<anotherrecipe>{1}{kg}\\
+%   \cuam<anotherrecipe>{1}\\
+%   \cutext<anotherrecipe>{1}{kg}\\
+%   \Cutext[ref=anotherrecipe]{10}{kg}\\ 
+% \end{cuexamplecode}
+% 
 %
-%
+% \begin{function}{label}
+%   \begin{syntax}
+%     label = \meta{string}*\meta{integer}
+%   \end{syntax}
+%   The key-value version of \mycs{culabel}. It defines the label \meta{string}
+%   which is originally for \meta{integer} people. Please note that the \texttt{*}
+%   is mandatory as it separates the string from the integer. Note that each
+%   label is defined globally and must be unique.
+% \end{function}
 % \begin{cuexamplecode}
-%   \cusetup{ parse-number=false } @
-%   \cunum[kg=g]{1}{kg} \\
-%   \cunum{1--2}{kg} \\
-%   \cunum{1----------2}{kg} \\
-%   \cunum{1.2}{kg} \\
-%   \cunum[kg=g]{1,2}{kg} \\
-%   \cunum{1/2}{kg} \\
-%   \cunum{1_2/3}{kg} \\
-%   \cunum{1/2_3}{kg} \\
-%   \cunum{qwertzuiop}{kg} \\
-%   \cutext{1}{kg} \\
-%   \cutext{100}{kg} \\
-%   \cutext{gjfak}{kg}
+%   \cusetup{label=Toast*1} @
+%   \curef{Toast}~person \\
+%   \cuam<Toast>{2} \\
+%   \cunum<Toast>{2}{dag} \\
+%   \cusetup { recalculate-amount = true } @
+%   \curef{Toast}~persons \\
+%   \cuam<Toast>{2} \\
+%   \cunum<Toast>{2}{dag}
 % \end{cuexamplecode}
 %
 %
-%
-%
-%
-% \begin{function}{use-numerals-below}
+% \begin{function}{get-label}
 %   \begin{syntax}
-%     use-numerals-below = \meta{integer}
+%     get-label = \meta{label}
 %   \end{syntax}
-%   Only usable if the package option \opt{use-numerals} is active. Prints the name of
-%   the numbers for integers used in \mycs{cutext} and \mycs{Cutext} 
-%   smaller than \meta{integer}. \meta{integer} it is by default
-%   13.
+%   The key-value version of \mycs{curef}. Note that this key doesn't save the value
+%   inside a macro but rather prints it directly into the document.
 % \end{function}
-%
-% \cusetup{ use-numerals-below=13 }
 % \begin{cuexamplecode}
-%   \cutext{1}{kg} \\
-%   \cutext{2}{kg} \\
-%   \cutext{12}{kg} \\
-%   \cutext{13}{kg} \\
-%   \cusetup{ use-numerals-below=10 } @
-%   \cutext{1}{kg} \\
-%   \cutext{2}{kg} \\
-%   \cutext{12}{kg} \\
-%   \cutext{13}{kg} \\
-%   \cusetup{ use-numerals-below=0 } @
-%   \cutext{1}{kg} \\
-%   \cutext{2}{kg} \\
-%   \cutext{12}{kg} \\
-%   \cutext{13}{kg}
+%   \culabel{Schinken}{3} @
+%   \cusetup{get-label=Schinken} \\
+%   \curef{Schinken} \\
+%   \cusetup { recalculate-amount = true } @
+%   \cusetup{get-label=Schinken} \\
+%   \curef{Schinken} \\
 % \end{cuexamplecode}
-% \cusetup{ use-numerals-below=0 } 
 %
-% \begin{function}{set-unknown-message}
+%
+% \begin{function}{ref}
 %   \begin{syntax}
-%     set-unknown-message = \meta{error/warning/none}
+%     ref = \meta{label}
 %   \end{syntax}
-%   Using a special sign (\texttt{?} by default) causes a warning to
-%   be raised. Set this option to \opt{error} if you want an error
-%   (as an extra emphasis), \opt{warning} if you want a warning
-%   (default) and \opt{none} if you don't want to know anything about it.
+%   Instead of using the first optional arguments of the commands in \vref{sec:commands}
+%   you may use this option. It requires a valid value and throws an error if \meta{label}
+%   is not defined.
 % \end{function}
+% \begin{cuexamplecode}
+%   \culabel{Kaese}{3} @
+%   \cunum<Kaese>[m=dm]{1}{m} \\
+%   \cunum[ref=Kaese,m=dm]{1}{m} \\
+%   \cusetup { recalculate-amount = true } @
+%   \cunum<Kaese>[m=dm]{1}{m} \\
+%   \cunum[ref=Kaese,m=dm]{1}{m} 
+% \end{cuexamplecode}
 %
-%
-%
 % \subsection{Weird options}
 %
 % \begin{function}{check-temperature}
@@ -1815,6 +2149,16 @@
 %^^A &= 
 %^^A \end{align}
 %
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
 % \end{documentation}
 %  
 % \begin{implementation}
@@ -1834,6 +2178,9 @@
 %
 %
 % Na dann, auf gehts!
+%
+% PS. The whole code-section needs more attention. Not the code itself, but
+% the written text which never saw a spell-checker and has partly become obsolete.
 %    \begin{macrocode}
 \@ifpackageloaded {xparse} 
   { } 
@@ -1847,11 +2194,11 @@
 %    \begin{macrocode}
 \ProvidesExplPackage
   {cooking-units}
-  {2016/10/19}
-  {1.04}
+  {2016/11/13}
+  {1.10}
   {Ein Paket fuer Kocheinheiten}
 %    \end{macrocode}
-% Chekcing if \pkg{expl3} is uptodate, otherwise abort the loading of the package.
+% Checking if \pkg{expl3} is uptodate, otherwise abort the loading of the package.
 %    \begin{macrocode}
 \@ifpackagelater { expl3 } { 2016/05/18 }
   { }
@@ -1904,7 +2251,7 @@
 %  \tl_replace_once:NVn ,
 %  \tl_if_in:nVTF ,
 %  \tl_if_in:NVT ,
-%  \fp_compare:cNnT ,
+%  \fp_compare:vNnT ,
 %  \fp_eval:c,
 %  }
 % Some commands we will need later.
@@ -1917,6 +2264,9 @@
 \cs_generate_variant:Nn \fp_compare:nNnT { cNnT }
 \cs_generate_variant:Nn \fp_eval:n { c }
 \cs_generate_variant:Nn \prop_get:cVN { cVc }
+\cs_generate_variant:Nn \int_abs:n { c }
+\cs_generate_variant:Nn \tl_show:n { f , x }
+\cs_generate_variant:Nn \fp_compare:nNnTF { v }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1982,6 +2332,11 @@
 \tl_new:N \l_@@_allowed_special_signs_tl 
 \tl_new:N \c_@@_str_hash_one_tl 
 \tl_new:N \l_@@_input_range_sign_tl
+\tl_new:N \l_@@_input_for_persons_sign
+\tl_new:N \l_@@_input_times_persons_sign
+\tl_new:N \l_@@_cutext_space_tl
+\tl_new:N \l_@@_translation_tmpa_tl
+\tl_new:N \l_@@_cutext_tmp_tl
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1994,6 +2349,8 @@
 \tl_set:Nn \l_@@_cutext_range_sign_tl { -- }
 \tl_set:Nn \l_@@_value_unit_space_tl { \thinspace }
 \tl_set:Nn \l_@@_input_digits_tl { 0123456789 }
+\tl_set:Nn \l_@@_input_for_persons_sign { @ }
+\tl_set:Nn \l_@@_input_times_persons_sign { * }
 \tl_set:Nn \l_@@_decimal_mark_tl { . , }
 \tl_set:Nn \l_@@_value_signs_tl { + - }
 \tl_set:Nn \l_@@_input_range_sign_tl { -- }
@@ -2000,6 +2357,7 @@
 \tl_set:Nn \l_@@_allowed_special_signs_tl { ? }
 \tl_set_rescan:Nnn \c_@@_str_hash_one_tl
   { \char_set_catcode_letter:N \# } {#1}
+\tl_set:Nn \l_@@_cutext_space_tl { \space }
 %    \end{macrocode}
 %
 % Flat out stolen from \pkg{siunitx}
@@ -2043,6 +2401,12 @@
 % \end{macro}
 %
 %
+% \begin{macro}{ \l_@@_persons_tmp_int }
+%    \begin{macrocode}
+\int_new:N \l_@@_persons_tmp_int
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{ \l_@@_significant_figures_plus_one_int }
 %   Stores the round-precision inside. Not sure if 'significant
 %   figures' is the correct therm for this. Also computes the number
@@ -2067,8 +2431,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{ \l_@@_calc_for_number_of_persons_int }
+%    \begin{macrocode}
+\int_new:N \l_@@_calc_for_number_of_persons_int
+\int_set:Nn \l_@@_calc_for_number_of_persons_int { 4 }
+%    \end{macrocode}
+% \end{macro}
 %
 %
+%
 % \begin{macro}{ \l_@@_list_of_defined_keys_clist , \g_@@_list_of_defined_units_clist }
 %   List of defined units and keys.
 %    \begin{macrocode}
@@ -2111,7 +2482,6 @@
 %     \l_@@_cutext_uppercase_word_bool,
 %     \l_@@_error_for_unknown_value_bool,
 %     \l_@@_parse_range_bool,
-% ^^A    \l_@@_round_special_bool
 %   }
 % Some booleans we need later.
 %    \begin{macrocode}
@@ -2128,8 +2498,15 @@
 \bool_new:N \l_@@_cutext_uppercase_word_bool
 \bool_new:N \l_@@_error_for_unknown_value_bool
 \bool_new:N \l_@@_parse_range_bool
-%\bool_new:N \l_@@_round_special_bool
-%\bool_new:N \l_@@_unit_is_singlekey_bool
+\bool_new:N \l_@@_using_cutext_bool
+\bool_new:N \l_@@_cuam_old_bool
+\bool_new:N \l_@@_calc_for_persons_bool
+\bool_new:N \l_@@_calc_because_ref_was_given_bool
+\bool_new:N \l_@@_calc_persons_tmp_bool
+\bool_new:N \l_@@_cutext_to_cunum_bool
+\bool_new:N \l_@@_cutext_old_bool
+\bool_new:N \l_@@_cutext_change_unit_bool
+\bool_new:N \l_@@_round_commercial_bool
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2136,6 +2513,7 @@
 % Setting some of them to \texttt{true}.
 %    \begin{macrocode}
 \bool_set_true:N \l_@@_parse_input_bool
+\bool_set_true:N \l_@@_cutext_change_unit_bool
 %    \end{macrocode}
 %
 %
@@ -2180,7 +2558,7 @@
 %
 % Let's define some keys.
 %    \begin{macrocode}
-\keys_define:nn { cooking - units }
+\keys_define:nn { cooking-units }
   {
 %    \end{macrocode}
 %
@@ -2287,7 +2665,7 @@
 %
 %
 % \begin{macro}{ input-range-sign }
-% Don't wanna use \verb|--| as a range sperator in \mycs{cunum}? Set
+% Don't wanna use \verb|--| as a range sperator in \mycs{cunum}? 
 % Use this option.
 %    \begin{macrocode}
     input-range-sign .tl_set:N = \l_@@_input_range_sign_tl ,
@@ -2316,6 +2694,7 @@
       },
     temperature-to-check .value_required:n = { true } ,
 %    \end{macrocode}
+% \end{macro} 
 %
 %\begin{macro}{ convert-to-eV }
 %  Another weird option, converts pretty much any unit defined by this
@@ -2361,8 +2740,8 @@
           }
         },
 %    \end{macrocode}
+% \end{macro}
 %
-%
 % \begin{macro}{ round-half }
 %  Choosing between \enquote{normal} rounding to even and commercial rounding.
 %  If 'default' is chosen nothing is added, if 'commercial' is used it adds a comma
@@ -2371,40 +2750,114 @@
     round-half .choices:nn =
       { default , commercial }
       {
-%        \bool_set_true:N \l_@@_round_special_bool
-        \cs_set:Npx \@@_round_setup:n ####1
+        \int_case:nn { \l_keys_choice_int }
           {
-            \exp_not:N \l_@@_significant_figures_int
-            \int_case:nn { \l_keys_choice_int }
-              {
-                { 1 } { } 
-                { 2 } { \exp_not:N, ####1 }
-              }
+            { 1 } { \bool_set_false:N \l_@@_round_commercial_bool }
+            { 2 } { \bool_set_true:N \l_@@_round_commercial_bool }
           }
       },
     round-half .default:n = { default },
 %    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{ set-number-of-persons }
+%    \begin{macrocode}
+    set-number-of-persons .int_set:N = \l_@@_calc_for_number_of_persons_int ,
+    set-number-of-persons .default:n = { 4 } ,
+%    \end{macrocode}
+% \end{macro}
 %
 % \begin{macro}{ label }
 %    \begin{macrocode}
-    label .code:n = { \label{cooking-units-#1} } ,
+    label .code:n = 
+      { 
+        \@@_label_and_persons:n {#1} 
+      } ,
+    label .value_required:n = { true } ,
 %    \end{macrocode}
+% \end{macro}
 %
-% \begin{macro}{ for-persons }
+% \begin{macro}{ get-label }
 %    \begin{macrocode}
-    for-persons .int_set:N = \l_@@_number_of_persons_int ,
-    for-persons .default:n = { 4 } ,
+    get-label .code:n = 
+      { 
+        \@@_curef:n {#1}
+      } ,
+    label .value_required:n = { true } ,
 %    \end{macrocode}
+% \end{macro}
 %
-% Ending the definition of keys.
+% \begin{macro}{ ref }
+%    \begin{macrocode}
+    ref .code:n = 
+      { 
+        \@@_reference_label_and_persons:n {#1} 
+      } ,
+    ref .value_required:n = { true } ,
+%    \end{macrocode}
 % \end{macro}
-  }
+%
+% \begin{macro}{ cuam-version  , cutext-version}
 %    \begin{macrocode}
+    cuam-version .choices:nn = 
+      { new , old }
+      {
+        \int_case:nn { \l_keys_choice_int }
+          {
+            { 1 } { \bool_set_false:N \l_@@_cuam_old_bool } 
+            { 2 } { \bool_set_true:N \l_@@_cuam_old_bool }
+          }
+      } ,
+    cuam-version .default:n = { new } ,
+    cutext-version .choices:nn = 
+      { new , old }
+      {
+        \int_case:nn { \l_keys_choice_int }
+          {
+            { 1 } { \bool_set_false:N \l_@@_cutext_old_bool } 
+            { 2 } { \bool_set_true:N \l_@@_cutext_old_bool }
+          }
+      } ,
+    cutext-version .default:n = { new } ,
 %    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{ recalculate-amount }
+%    \begin{macrocode}
+    recalculate-amount .bool_set:N = \l_@@_calc_for_persons_bool ,
+    recalculate-amount .default:n = { false } ,
+%    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{ recalculate-amount }
+%    \begin{macrocode}
+    cutext-to-cunum .bool_set:N = \l_@@_cutext_to_cunum_bool ,
+    cutext-to-cunum .default:n = { false } ,
+%    \end{macrocode}
+% \end{macro}
 %
+% \begin{macro}{ cutext-space }
+%    \begin{macrocode}
+    cutext-space .tl_set:N = \l_@@_cutext_space_tl ,
+    cutext-space .default:n = { \space } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ cutext-change-unit }
+%    \begin{macrocode}
+    cutext-change-unit .bool_set:N = \l_@@_cutext_change_unit_bool ,
+    cutext-change-unit .default:n = { true } ,
+%    \end{macrocode}
+% \end{macro}
+%
+% Ending the definition of keys.
+%    \begin{macrocode}
+  }
+%    \end{macrocode}
+% \end{macro}
+% 
+%
+%
 % \subsection {Messages}
 %
 % Defining messages. 
@@ -2449,7 +2902,7 @@
 %    \end{macrocode}
 % Error if unit is already defined.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { unit-already-defined } 
+\msg_new:nnnn { cooking-units } { unit-already-defined } 
   { The\ unit \ '#1' \ is \ already \ defined. } 
   { 
     The \ unit-key \ is \ already \ defined. \ Please \ use \ a \ different \
@@ -2460,7 +2913,7 @@
 % 
 % Missing argument in \lstinline|\cudefinesymbols| (et all).
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { missing-argument } 
+\msg_new:nnnn { cooking-units } { missing-argument } 
   { There \ is \ an \ missing \ argument. } 
   { 
     You \ probably \ have \ forgotten \ a \ curly-brace \ pair.
@@ -2469,13 +2922,13 @@
 %    \end{macrocode}
 % If fractions are evaluated division by zero is not allowed.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Division-by-zero } 
+\msg_new:nnnn { cooking-units } { Division-by-zero } 
   { Division\ by \ zero \ is \ not \ allowed. } 
   { See \ a \ math \ book \ of \ your \ choice \ or \ for \ example \ Wikipedia. }
 %    \end{macrocode}
 % Showing the not allowed token in the input. Hope this helps.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Token-not-allowed } 
+\msg_new:nnnn { cooking-units } { Token-not-allowed } 
   { The \ token \ '#1' \ is \ not \ allowed. } 
   { 
     The \ command \ accepts \ only \ a \ fixed \ number \ of \ tokens. 
@@ -2484,7 +2937,7 @@
 %    \end{macrocode}
 % A second decimal sign is not allowed (No na net).
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Second - decimal -sign - not - allowed } 
+\msg_new:nnnn { cooking-units } { Second - decimal -sign - not - allowed } 
   { A \ second \ decimal \ sign \ is \ not \ allowed. } 
   { 
     Perhaps \ you \ didn't \ type \ it \ correctly.
@@ -2493,7 +2946,7 @@
 %    \end{macrocode}
 % Error message for an undefined key.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Key - not -defined } 
+\msg_new:nnnn { cooking-units } { Key - not -defined } 
   { 
     The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys or \
     \cudefinesinglekey to \ define \ keys. 
@@ -2505,7 +2958,7 @@
 %    \end{macrocode}
 % If the temperature is too low print this error message.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Temperature-to-low } 
+\msg_new:nnnn { cooking-units } { Temperature-to-low } 
   { 
     The \ temperature \ '#1' \ is \ to \ low.\ It \ cannot \ be \
     below \ the \ absolute \ zero - point \ of \ '#2'. \ Note \ that \ 
@@ -2519,7 +2972,7 @@
 %    \end{macrocode}
 % If for an unit-key the value is wrong the following error message is shown.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { key-choice-unknown } 
+\msg_new:nnnn { cooking-units } { key-choice-unknown } 
   { 
     The \ key \ '#1' \ only \ accepts \ only \ 
     '#3' \ as \ a \ set \ of \ choices \ and \ '#2' \ is \ non \ of \ these.
@@ -2536,7 +2989,7 @@
 %\changes {v0.99} {2016/06/12} {Renamed option: 'amount-not-known'.}
 % An info message that there are unknown values.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { amount-not-known } 
+\msg_new:nnnn { cooking-units } { amount-not-known } 
   { 
     The \ amount \ of \ #1 \ is \ not \ known \ at \ line \ 
     \msg_line_number: .
@@ -2552,7 +3005,7 @@
 % If a load time option not used as a package option, but later, this
 % message is shown.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { load-time-option } 
+\msg_new:nnnn { cooking-units } { load-time-option } 
   { 
     The \ option \ '#1' \ is \ only \ available \ as \ a \ load-time-option. \
     Please \ set \ it \ as \ a \ package \ option.
@@ -2567,7 +3020,7 @@
 % If a load time option not used as a package option, but later, this
 % message is shown.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { obsolete-command } 
+\msg_new:nnnn { cooking-units } { obsolete-command } 
   { 
     Command \ #1 is \ obsolete. \ Please \ use \ #2 instead.
   } 
@@ -2580,7 +3033,7 @@
 % Error message if a new temperature to check is defined and no
 % minimal value is given.
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { No-Value-given } 
+\msg_new:nnnn { cooking-units } { No-Value-given } 
   { 
     Please \ input \ a \ number \ to \ check \ for \ 
     'check-temperature'.
@@ -2594,7 +3047,7 @@
 %
 % 
 %    \begin{macrocode}
-\msg_new:nnnn { cooking - units } { Minimum-already-defined } 
+\msg_new:nnnn { cooking-units } { Minimum-already-defined } 
   { 
     A \ minimum \ for \ '#1' \ has \ already \ been \  defined.
   } 
@@ -2603,6 +3056,64 @@
     \msg_see_documentation_text:n { cooking-units } 
   }
 %    \end{macrocode}
+% 
+%    \begin{macrocode}
+\msg_new:nnnn { cooking-units } { Number-of-persons-missing } 
+  { 
+    Please \ add \ the \ number \ of \ persons \ this \ recipe \ is \ for \ in \ '#1'. \
+    Note \ that\ the \ number \ must \ be \ given \ after \ a \ '*'.
+  } 
+  { 
+    Write \ 'Schweinsbraten*4' \ to \ create \ the \ label \ 'Schweinsbraten' \
+    which \ is \ initially \ for \ 4 \ persons.
+    \msg_see_documentation_text:n { cooking-units } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\msg_new:nnnn { cooking-units } { Number-of-persons-is-not-an-integer } 
+  { 
+    The \ number \ of \ persons \ the \ recipe \ is \ for \ must \ be \ an \
+    integer.
+  } 
+  { 
+    The \ number \ '#1' \ is \ not \ allowed.
+    \msg_see_documentation_text:n { cooking-units } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\msg_new:nnnn { cooking-units } { label-already-defined } 
+  { 
+    The \ label \ '#1' \ has \ already \ been \ defined.
+  } 
+  { 
+    Each \ label \ must \ be \ unique.
+    \msg_see_documentation_text:n { cooking-units } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\msg_new:nnnn { cooking-units } { label-not-defined } 
+  { 
+    The \ label \ is \ not \ defined. \ Please \ note \ that \ a \ label
+    \ has \ to \ defined \ before \ it \ is \ referenced.
+  } 
+  { 
+    Define \ the \ label \ before \ using \ it.
+    \msg_see_documentation_text:n { cooking-units } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\msg_new:nnnn { cooking-units } { redefine-unit } 
+  { 
+    The \ unit \ '#1' \ is \ redefined \ by \ \declarecookingunit at \ \msg_line_context: . 
+  } 
+  { 
+    \msg_see_documentation_text:n { cooking-units } 
+  }
+%    \end{macrocode}
 % \end{macro}
 %
 % \section {Helper Macros}
@@ -2630,24 +3141,31 @@
 %
 %
 %
-% \begin{macro}{\@@_if_integer_and_parse:n}
+% \begin{macro}{ \@@_if_integer:n , \@@_if_integer_and_parse:n}
 %   Checking if the input consists only of numbers. Furthermore tests if
 %   the input should be parsed at all.
 %
 %    \begin{macrocode}
 %\cs_new:Npn \@@_if_number_and_parse_aux: { }
+\prg_new_protected_conditional:Npnn \@@_if_integer:n #1 { TF }
+  {
+    \tl_map_inline:nn {#1} 
+      {
+        \tl_if_in:NnF \l_@@_input_digits_tl {##1}
+          { 
+            \tl_map_break:n { \use_iii:nnn }
+          }
+      }
+    \use_i:nn \prg_return_true: \prg_return_false:
+  }
+%
 \prg_new_protected_conditional:Npnn \@@_if_integer_and_parse:n #1 { TF }
   {
     \bool_if:NTF \l_@@_parse_input_bool
       {
-        \tl_map_inline:nn {#1} 
-          {
-            \tl_if_in:NnF \l_@@_input_digits_tl {##1}
-              { 
-                \tl_map_break:n { \use_iii:nnn }
-              }
-          }
-        \use_i:nn \prg_return_true: \prg_return_false:
+        \@@_if_integer:nTF {#1}
+          { \prg_return_true: } 
+          { \prg_return_false: }
       }
       { \prg_return_false: }
   }
@@ -2692,15 +3210,6 @@
         cl= (chbareV-1)3 ,
         ml= (chbareV-1)3 ,
       }
-      \prop_get:NVN \l_@@_change_unit_prop \l_@@_tmp_unit_tl \l_@@_option_unit_tl
-      \quark_if_no_value:NT \l_@@_option_unit_tl  
-        { 
-          \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_tmp_unit_tl
-        }
-      \keys_set_filter:nnv 
-        { cooking-units } 
-        { change-unit } 
-        { l_@@_predefined_option_ \l_@@_option_unit_tl _clist }
   }
 %    \end{macrocode}
 %\end{macro}
@@ -2709,12 +3218,23 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_deftranslation:Nnn #1#2#3
   {
-    \deftranslation [ to=#1 ] { #2 } {#3}
+    \deftranslation [ to=#1 ] {#2} {#3}
   }
 \cs_generate_variant:Nn \@@_deftranslation:Nnn { Vnn , Vnv }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_tl_set_fp_and_eval:Nn}
+% I am using this construction often enough, so \dots\ yeah.
+%    \begin{macrocode}
+\cs_new:Npn \@@_tl_set_fp_and_eval:Nn #1#2
+  {
+    \tl_set:Nf #1 { \fp_eval:n {#2} }
+  }
+\cs_generate_variant:Nn \@@_tl_set_fp_and_eval:Nn { Nc }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_deftranslation:Nnn}
 % Commands used in the option \texttt{temperature-to-check}.
 % If no value is given (first command) it raises an error. If a value
@@ -2729,7 +3249,7 @@
   {
     \@@_error_if_unit_not_defined:n {#1}
     \fp_if_exist:cTF { c_@@_ #1 _min_fp }
-      { \msg_error:nnn { cooking-units } { Minimum-already-defined } {#1} }
+      { \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1} }
       {
         \clist_put_right:Nn \l_@@_temperatures_to_check_clist {#1}
         \fp_const:cn { c_@@_ #1 _min_fp } {#2}      
@@ -2738,18 +3258,143 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_deftranslation:Nnn}
-% Commands used in the option \texttt{temperature-to-check}.
-% If no value is given (first command) it raises an error. If a value
-% is given the  unit is added to a check-list and a new 
-% constant is defined.
+% \begin{macro}{\@@_rounding_function:n}
 %    \begin{macrocode}
-\cs_new:Npn \@@_round_setup:n #1 { \l_@@_significant_figures_int }
+\cs_new:Npn \@@_rounding_function:n #1 
+  { 
+    #1
+      \bool_if:NTF \l_@@_round_commercial_bool
+        { 
+          \bool_if:NTF \l_@@_round_to_int_bool 
+            { , \c_zero_fp } 
+            { , \l_@@_significant_figures_int } 
+          , #1 
+        }
+        { \bool_if:NF \l_@@_round_to_int_bool { , \l_@@_significant_figures_int } }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection {Parsing and cheking numbers}
+% \begin{macro}{\@@_label_and_persons:n}
+%    \begin{macrocode}
+\cs_new:Npn \@@_label_and_persons:n #1 
+  { 
+    \tl_if_in:nnTF {#1} { @ }
+      {
+        \@@_label_and_persons_for_persons:ww #1 \q_stop
+      }{
+        \tl_if_in:nnTF {#1} { * }
+          {
+            \@@_label_and_persons_times_persons:ww #1 \q_stop
+          }{
+            \msg_error:nnn { cooking-units} { Number-of-persons-missing } {#1}
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
 %
+%    \begin{macrocode}
+\cs_new:Npn \@@_label_and_persons_for_persons:ww #1 @ #2 \q_stop
+  { 
+    \@@_culabel:nnn {#1} {#2} { }
+  }
+%    \end{macrocode}
+%    \begin{macrocode}
+\cs_new:Npn \@@_label_and_persons_times_persons:ww #1 * #2 \q_stop
+  { 
+    \@@_culabel:nnn {#1} {#2} { - }
+  }
+%    \end{macrocode}
+%
+% \begin{macro}{ \@@_reference_label_and_persons:n }
+%    \begin{macrocode}
+\cs_new:Npn \@@_reference_label_and_persons:n #1
+  { 
+    \int_if_exist:cTF { l_@@_persons_ #1 _int }
+      { 
+        \bool_set_true:N \l_@@_calc_because_ref_was_given_bool
+        \int_set:Nn \l_@@_persons_tmp_int
+          { 
+            \int_abs:c { l_@@_persons_ #1 _int }
+          }
+      }
+      { \msg_error:nnn { cooking-units } { label-not-defined } {#1} }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_culabel:nn , \@@_curef:n }
+%    \begin{macrocode}
+\cs_new:Npn \@@_culabel:nnn #1#2#3
+  { 
+    \int_if_exist:cTF { l_@@_persons_ #1 _int }
+      {
+        \msg_error:nnn { cooking-units } { label-already-defined } {#1}
+      }{
+        \@@_if_integer:nTF {#2}
+          {
+            \int_new:c { l_@@_persons_ #1 _int }
+            \int_gset:cn { l_@@_persons_ #1 _int } { #3 #2 }
+          }
+          { \msg_error:nnn { cooking-units } { Number-of-persons-is-not-an-integer } {#2} }      
+      }
+  }
+\cs_new:Npn \@@_curef:n #1
+  { 
+    \int_if_exist:cTF { l_@@_persons_ #1 _int }
+      {
+        \bool_if:NTF \l_@@_calc_for_persons_bool
+          { \int_use:N \l_@@_calc_for_number_of_persons_int }
+          { \int_abs:c { l_@@_persons_ #1 _int } }
+      }{ \msg_error:nnn { cooking-units } { label-not-defined } {#1} }
+  }
+\NewDocumentCommand \culabel { m m } { \@@_culabel:nnn {#1} {#2} {} }
+\DeclareExpandableDocumentCommand \curef { m } { \@@_curef:n {#1} }
+%    \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{ \@@_tl_if_in_remove_and_set_bool:NnN }
+%    \begin{macrocode}
+\cs_new:Npn \@@_tl_if_in_remove_and_set_bool:NnN #1#2#3
+  {
+    \tl_if_in:NnTF #1 {#2}
+      {
+        \bool_set_true:N #3
+        \tl_remove_once:Nn #1 {#2}
+      }{
+        \bool_set_false:N #3
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_tl_if_in_remove_and_reverse_bool:NnN }
+%    \begin{macrocode}
+\cs_new:Npn \@@_tl_if_in_remove_and_reverse_bool:NnN #1#2#3
+  {
+    \tl_if_in:NnT #1 {#2}
+      {
+        \bool_if:NTF #3
+          { \bool_set_false:N #3 }
+          { \bool_set_true:N #3 }
+        \tl_remove_once:Nn #1 {#2}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsection {Parsing and checking numbers}
+%
 % This section contains macros helping an checking the input.
 %
 % \begin{macro}{ \@@_cunum_parse_input:N, \@@_cunum_parse_input:V }
@@ -2799,7 +3444,9 @@
     \@@_parse_input_and_safe_in:nN {#1} \l_@@_tmpa_tl
     \@@_parse_input_and_safe_in:nN {#2} \l_@@_tmpb_tl    
     \@@_calculate_and_print_input:N \l_@@_tmpa_tl
-    \tl_use:N \l_@@_cunum_range_sign_tl
+    \bool_if:NTF \l_@@_using_cutext_bool
+      { \tl_use:N \l_@@_cutext_range_sign_tl }
+      { \tl_use:N \l_@@_cunum_range_sign_tl }
     \@@_calculate_and_print_input:N \l_@@_tmpb_tl
   }
 %    \end{macrocode}
@@ -2811,7 +3458,7 @@
 %   If fractions should be evaluated the input is \dots\ well, 
 %   evaluated and printed. Otherwise the input is given to 
 %   another function which prints the fractions. Note that the empty
-%   argument in \lstinline|\@@_formatiere_fractions:nnn| indicates a
+%   argument in \lstinline|\@@_formatiere_fractions:nNN| indicates a
 %   \enquote{normal} fraction.
 %    \begin{macrocode}
 \cs_new:Npn \@@_parse_fraction_in_input:ww #1/#2 \q_stop
@@ -2818,12 +3465,18 @@
   {
     \@@_parse_input_and_safe_in:nN {#1} \l_@@_tmpa_tl
     \@@_parse_input_and_safe_in:nN {#2} \l_@@_tmpb_tl
-    \bool_if:NTF \l_@@_eval_fractions_bool
+    \bool_if:nTF 
       {
+        \l_@@_calc_persons_tmp_bool ||
+        \l_@@_eval_fractions_bool
+      }
+      {
         \@@_calculate_and_print_input:n 
           { \l_@@_tmpa_tl / \l_@@_tmpb_tl }
       }{
-        \@@_formatiere_fractions:nnn 
+        \@@_tl_if_in_remove_and_set_bool:NnN \l_@@_tmpa_tl { - } \l_tmpb_bool
+        \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_tmpb_tl { - } \l_tmpb_bool
+        \@@_formatiere_fractions:nNN 
           { } 
           { \l_@@_tmpa_tl } 
           { \l_@@_tmpb_tl } 
@@ -2850,19 +3503,26 @@
     \@@_parse_input_and_safe_in:nN {#1} \l_@@_mixed_fraction_tl
     \@@_parse_input_and_safe_in:nN {#2} \l_@@_tmpa_tl
     \@@_parse_input_and_safe_in:nN {#3} \l_@@_tmpb_tl
-    \bool_if:NTF \l_@@_eval_fractions_bool
+    \@@_tl_if_in_remove_and_set_bool:NnN \l_@@_mixed_fraction_tl { - } \l_tmpb_bool
+    \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_tmpa_tl { - } \l_tmpb_bool
+    \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_tmpb_tl { - } \l_tmpb_bool
+    \bool_if:nTF 
       {
+        \l_@@_calc_persons_tmp_bool ||
+        \l_@@_eval_fractions_bool
+      }{
         \@@_calculate_and_print_input:n 
           { 
-            \l_@@_mixed_fraction_tl 
-            \fp_compare:nNnTF
-              { \l_@@_mixed_fraction_tl } < { \c_zero_fp } 
-              { - }
-              { + }
+            \bool_if:NTF \l_tmpb_bool
+%            \l_@@_mixed_fraction_tl 
+%            \fp_compare:nNnTF
+%              { \l_@@_mixed_fraction_tl } < { \c_zero_fp } 
+              { - \l_@@_mixed_fraction_tl - }
+              { \l_@@_mixed_fraction_tl + }
             \l_@@_tmpa_tl / \l_@@_tmpb_tl 
           }
       }{
-        \@@_formatiere_fractions:nnn 
+        \@@_formatiere_fractions:nNN 
           { \l_@@_mixed_fraction_tl } 
           { \l_@@_tmpa_tl } 
           { \l_@@_tmpb_tl }
@@ -2943,8 +3603,7 @@
                     \tl_if_in:nnTF { / _ } {#1}
                       { \msg_error:nnn { cooking-units } { fraction-not-allowed-with-range } {#1} }
                       { \msg_error:nnn { cooking-units } { Token-not-allowed } {#1} }
-                  }
-                  {
+                  }{
                     \tl_if_in:nnTF { _ } {#1}
                       { \msg_error:nnn { cooking-units } { missing-slash } {#1} }
                       { \msg_error:nnn { cooking-units } { Token-not-allowed } {#1} }
@@ -2960,7 +3619,7 @@
 %
 % \subsection {Formatiere \& Calculiere}
 %
-% \begin{macro}{ \@@_calculate_and_print_input:n , \@@_calculate_and_print_input:n }
+% \begin{macro}{ \@@_calculate_and_print_input:n , \@@_calculate_and_print_input:N }
 %   
 %   \changes {v0.98a} {2016/06/11} {Added warning to show if an unknown value is used.}
 %   
@@ -2982,10 +3641,16 @@
             \msg_warning:nnx { cooking-units } { amount-not-known } \l_tmpa_tl 
           }
           { 
-            \@@_calculate_input_and_store_in:nN {#1} \l_tmpa_tl 
+            \bool_if:nTF 
+              { \l_@@_using_cutext_bool && ! \l_@@_cutext_change_unit_bool }
+              { \tl_set:Nf \l_tmpa_tl {#1} }
+              { \@@_calculate_input_and_store_in:nN {#1} \l_tmpa_tl }
+            \bool_if:NT \l_@@_calc_persons_tmp_bool
+              { \@@_calc_for_number_of_persons_and_store_in:NN \l_tmpa_tl \l_tmpa_tl }
+            \@@_round_calculated_input:NV \l_tmpa_tl \l_tmpa_tl
             \@@_check_temperature_limit:N \l_tmpa_tl
           }
-        \@@_print_nummerical_output:N \l_tmpa_tl
+        \@@_print_output:N \l_tmpa_tl
       }
   }
 \cs_generate_variant:Nn \@@_calculate_and_print_input:n { N }
@@ -2995,7 +3660,6 @@
 % \begin{macro}
 %   { 
 %     \@@_calculate_input_and_store_in:nN ,
-%     \@@_calculate_input_and_store_in:VN
 %   }
 % Well \dots\ this function calculates the input. First checks if the
 % wanted conversion contains a \lstinline|\l_tmpa_fp| (ergo a \#1 in
@@ -3008,28 +3672,41 @@
     \fp_set:Nn \l_tmpa_fp {#1}
     \tl_if_in:cnTF { l_@@_tmpa_ \l_@@_tmp_unit_tl  _ tl } { \l_tmpa_fp }
       { 
-        \tl_set:Nf #2 
-          { 
-            \fp_eval:c { l_@@_tmpa_ \l_@@_tmp_unit_tl  _ tl }
-          } 
+        \@@_tl_set_fp_and_eval:Nc #2 { l_@@_tmpa_ \l_@@_tmp_unit_tl  _ tl }
       }{ 
-        \tl_set:Nf #2 
-          { 
-            \fp_eval:n 
-              { 
-                \l_tmpa_fp * 
-                \tl_use:c { l_@@_tmpa_ \l_@@_tmp_unit_tl  _ tl } 
-              } 
-          } 
+        \@@_tl_set_fp_and_eval:Nn #2 
+          { \l_tmpa_fp * \tl_use:c { l_@@_tmpa_ \l_@@_tmp_unit_tl _ tl }  }
+%        \tl_set:Nf #2
+%          {
+%            \fp_compare:vNnTF { l_@@_tmpa_ \l_@@_tmp_unit_tl  _ tl } = { \c_one_fp }
+%              {#1}
+%            \fp_eval:n { \l_tmpa_fp * \tl_use:c { l_@@_tmpa_ \l_@@_tmp_unit_tl _ tl } }
+%          }
       }
-    \@@_round_calculated_input:NV #2 #2
   }
-\cs_generate_variant:Nn \@@_calculate_input_and_store_in:nN { V }
 %    \end{macrocode}
 % \end{macro}
 %
 %
+%    \begin{macrocode}
+\cs_new:Npn \@@_calc_for_number_of_persons_and_store_in:NN #1#2
+  {
+    \int_compare:nNnF 
+      { \l_@@_calc_for_number_of_persons_int }
+      =
+      { \l_@@_persons_tmp_int }
+      {
+        \@@_tl_set_fp_and_eval:Nn #1
+          {
+            \l_@@_calc_for_number_of_persons_int /  
+            \l_@@_persons_tmp_int * 
+            #2
+          }
+      }
+  }
+%    \end{macrocode}
 %
+%
 % \begin{macro}{\@@_check_number_after_dot:n,\@@_check_number_after_dot_aux:w}
 %   Getting the number after the decimal point.  If it doesn't exist
 %   the boolean is set to false, otherwise it checks how many tokens
@@ -3046,8 +3723,12 @@
 \cs_new:Npn \@@_check_number_after_dot_aux:w #1. #2 .
   {
     \quark_if_recursion_tail_stop:n {#2}
-    \int_compare:nNnF 
-      { \tl_count:n {#2} } < { \l_@@_significant_figures_plus_one_int }
+    \bool_if:NTF \l_@@_round_to_int_bool
+      { \int_zero:N \l_tmpa_int }
+      { \int_set_eq:NN \l_tmpa_int \l_@@_significant_figures_plus_one_int }
+    \int_compare:nNnTF 
+      { \tl_count:n {#2} } < { \l_tmpa_int }
+      { \bool_set_false:N \l_tmpa_bool }
       { \bool_set_true:N \l_tmpa_bool }
     \use_none_delimit_by_q_recursion_stop:w
   }
@@ -3055,7 +3736,8 @@
 % \end{macro}
 %
 % \begin{macro}{ \@@_round_calculated_input:NN,\@@_round_calculated_input:NV }
-%   After calculating the numbers are rounded (if needed). We test at first  if
+%   After calculating the numbers are rounded (if needed, safed inside \cs{l_tmpa_bool}). 
+%   We test at first  if
 %   the input needs to be rounded by comparing the number of tokens after the 
 %   decimal with the number of significant figures plus one. Afterwards the 
 %   input is expanded and stored in \#1. If rounding needs to be done it happens now.
@@ -3062,32 +3744,12 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_round_calculated_input:NN #1#2
   {
-    \bool_set_false:N \l_tmpa_bool
     \@@_check_number_after_dot:n {#2}
     \tl_set:Nf #1 
       {  
-        \bool_if:NTF \l_@@_round_to_int_bool
-          {
-            \fp_eval:n { round (#2) }
-          }{
-            \bool_if:NTF \l_tmpa_bool
-              {
-                \fp_eval:n { round( #2 ,  \@@_round_setup:n {#2} ) }
-              }
-              {#2}
-          }
-%        \bool_if:nTF { \l_tmpa_bool || \l_@@_round_to_int_bool }
-%          { 
-%           \fp_eval:n
-%             {
-%               \bool_if:NTF \l_@@_round_to_int_bool
-%                 { round (#2) }
-%                 {
-%                   round( #2 ,  \@@_round_setup:n {#2} )
-%                 }
-%             }
-%         }
-%         {#2}
+        \bool_if:NTF \l_tmpa_bool
+          { \fp_eval:n { round ( \@@_rounding_function:n {#2} ) } }
+          {#2}
      }
   }
 \cs_generate_variant:Nn \@@_round_calculated_input:NN { NV }
@@ -3094,15 +3756,55 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{ \@@_formatiere_fractions:nnn }
+%
+%
+%
+% \begin{macro}{ \@@_print_output:N }
+%   Wrapper macro for printing the (not)calculated output. Note that if no
+%   calculation happens in \mycs{cutext} (and \mycs{Cutext}) \cs{l_@@_option_unit_tl}
+%   is set to \cs{l_@@_tmp_unit_tl} (the unit given in the second argument of 
+%   \mycs{cutext} or \mycs{Cutext}) by default.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_print_output:N #1
+  {
+    \bool_if:NTF \l_@@_using_cutext_bool
+      { 
+        \tl_set_eq:NN \l_@@_cutext_tmp_tl #1
+        \@@_cutext_print_output:NV #1 \l_@@_option_unit_tl
+      }
+      { \@@_print_nummerical_output:N #1 }  
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_print_nummerical_output:N }
+%   Prints the nummerical output (if it is not a fraction).
+%
+%   Changed \lstinline|\l_@@_tmpa_tl| by |\l_@@_translation_tmpa_tl|, it's better that way.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_print_nummerical_output:N #1
+  {
+    \translatelet \l_@@_translation_tmpa_tl { decimal-mark ( cu-unitname ) }
+    \tl_replace_once:NnV #1 { . } \l_@@_translation_tmpa_tl
+    \tl_replace_once:NnV #1 { - } \c_@@_minus_tl
+    #1
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{ \@@_formatiere_fractions:nNN }
 %   The name of this function is the name of the game: It prints fractions.
 %   Furthermore it sets the boolean \lstinline|fraction_in_input_bool| to true
 %   so that the correct unit is printed. Instead of \lstinline|\kern| I used the
 %   \lstinline|\hbox_to_wd:nn| command (I don't have a better idea).
+%
+%  Since v.1.10(alpha) it also prints the minus sign (hopefully correct).
 %    \begin{macrocode}
-\cs_new:Npn \@@_formatiere_fractions:nnn #1#2#3
+\cs_new:Npn \@@_formatiere_fractions:nNN #1#2#3
   {
     \bool_set_true:N \l_@@_fraction_in_input_bool
+    \bool_if:NT \l_tmpb_bool { \c_@@_minus_tl }
     \tl_if_empty:nF {#1} 
       { 
         #1 
@@ -3143,26 +3845,9 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{ \@@_print_nummerical_output:N }
-%   Prints the nummerical ouput (if it is not a fraction).
 %
-%   \lstinline|\l_@@_tmpa_tl| can be very dangerous because values are also stored
-%   within \lstinline|\l_@@_tmpa_tl|, but as long as the value stored inside
-%   this function is processed first all is fine.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_print_nummerical_output:N #1
-  {
-%%    \l_@@_tmpa_tl is sehr gefaehrlich hier.
-    \translatelet \l_@@_tmpa_tl { decimal-mark ( cu-unitname ) }
-    \tl_replace_once:NnV #1 { . } \l_@@_tmpa_tl
-    \tl_replace_once:NnV #1 { - } \c_@@_minus_tl
-    #1
-  }
-%    \end{macrocode}
-% \end{macro}
 %
 %
-%
 % \subsection {\mycs{cunum}}
 %
 %
@@ -3169,13 +3854,14 @@
 % \begin{macro}{ \cunum }
 % The main command of this package. 
 %    \begin{macrocode}
-\NewDocumentCommand \cunum { O{} m O{} m }
+\NewDocumentCommand \cunum { d<> O{} m O{} m }
   {
     \group_begin:
-    \@@_cunum_initialise:nnnn {#1} {#2} {#3} {#4}
+    \@@_cunum_initialise:nnnnn {#1} {#2} {#3} {#4} {#5}
     \bool_if:NTF \l_@@_parse_input_bool
-      { \@@_cunum:nnVV {#2} {#3} \l_@@_option_unit_tl \l_@@_tmp_unit_tl }
-      { \@@_cunum_do_not_parse:nnn {#2} {#3} {#4} }
+      { \@@_parse_and_evaluate_input:n {#3} }
+      { \@@_cunum_do_not_parse:nnn {#3} {#4} {#5} }
+    \@@_cunum_print_correct_unit:nVV {#4} \l_@@_option_unit_tl \l_@@_tmp_unit_tl
     \group_end:
   }
 %    \end{macrocode}
@@ -3193,30 +3879,57 @@
 %   set the 'normal' options given by the optional argument.
 %
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cunum_initialise:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_cunum_initialise:nnnnn #1#2#3#4#5
   {
-    \tl_set:Nn \l_@@_tmp_unit_tl {#4}
+    \@@_initialise_default:nnn {#1} {#2} {#5}
+    \@@_initialise_unit_change:nnn {#1} {#2} {#5}
+    \@@_initialise_after_unit_change:nnn {#1} {#2} {#5}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \@@_initialise_default:n }
+%   Function shared by all initialization functions:.
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_initialise_default:nnn #1#2#3
+  {
+    \tl_set:Nn \l_@@_tmp_unit_tl {#3}
     \@@_error_if_unit_not_defined:V \l_@@_tmp_unit_tl
-    \tl_if_empty:nF {#1}
-      { \keys_set_groups:nnn { cooking-units } { change-unit } {#1} }
-    \bool_if:NTF \l_@@_convert_to_eV_bool
+    \bool_set_false:N \l_@@_special_sign_bool
+    \bool_set_false:N \l_@@_error_bool
+    \bool_set_false:N \l_@@_parse_range_bool
+  }
+\cs_generate_variant:Nn \@@_initialise_default:nnn { nnV}
+%    \end{macrocode}
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_initialise_unit_change:nnn #1#2#3
+  {
+    \tl_if_empty:nF {#2}
+      { \keys_set_groups:nnn { cooking-units } { change-unit } {#2} }
+    \bool_if:NT \l_@@_convert_to_eV_bool
       { \@@_convert_to_eV: }
+    \prop_get:NVN \l_@@_change_unit_prop \l_@@_tmp_unit_tl \l_@@_option_unit_tl
+    \quark_if_no_value:NT \l_@@_option_unit_tl  
+      { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_tmp_unit_tl }
+  }
+%    \end{macrocode}
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_initialise_after_unit_change:nnn #1#2#3
+  {
+    \IfNoValueF {#1}
+      { \@@_reference_label_and_persons:n {#1} }
+    \clist_if_empty:cF { l_@@_predefined_option_ \l_@@_option_unit_tl _clist }
       {
-        \prop_get:NVN \l_@@_change_unit_prop \l_@@_tmp_unit_tl \l_@@_option_unit_tl
-        \quark_if_no_value:NT \l_@@_option_unit_tl  
-          { 
-            \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_tmp_unit_tl
-          }
         \keys_set_filter:nnv 
           { cooking-units } 
           { change-unit } 
           { l_@@_predefined_option_ \l_@@_option_unit_tl _clist }
-        \tl_if_empty:nF {#1}
-          { \keys_set_filter:nnn { cooking-units } { change-unit } {#1} }
       }
-    \bool_set_false:N \l_@@_special_sign_bool
-    \bool_set_false:N \l_@@_error_bool
-    \bool_set_false:N \l_@@_parse_range_bool
+    \tl_if_empty:nF {#2}
+      { \keys_set_filter:nnn { cooking-units } { change-unit } {#2} }
+    \bool_set:Nn \l_@@_calc_persons_tmp_bool 
+      { \l_@@_calc_because_ref_was_given_bool && \l_@@_calc_for_persons_bool }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3234,18 +3947,17 @@
         \char_set_catcode_ignore:N \ %
       } {#1}
     \l_tmpa_tl
-    \@@_cunum_print_correct_unit:nnn {#2} {#3} {#3}
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{ \@@_cunum:nnNN, \@@_cunum:nnVV }
+% \begin{macro}{ \@@_parse_and_evaluate_input:n }
 %   Rescans the input to get rid of spaces and  to make \_ and ? inactive
 %   (french with babel makes ? active and changes the definition of it).
 %   \lstinline|--| is replaced by \lstinline|\q_@@_range| and the input is parsed
 %   (if not empty). Afterwards the units are printed.
 %    \begin{macrocode}
-\cs_new:Npn \@@_cunum:nnNN #1#2#3#4
+\cs_new:Npn \@@_parse_and_evaluate_input:n #1
   {
     \tl_set_rescan:Nnn \l_tmpa_tl
       {
@@ -3262,9 +3974,7 @@
           }
         \@@_cunum_parse_input:V \l_tmpa_tl
       }
-    \@@_cunum_print_correct_unit:nnn {#2} {#3} {#4}
   }
-\cs_generate_variant:Nn \@@_cunum:nnNN { nnVV }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3281,12 +3991,14 @@
     \tl_use:N \l_@@_value_unit_space_tl
     \bool_if:nTF 
       {
+        ! \l_@@_parse_input_bool ||
         \l_@@_fraction_in_input_bool ||
-        \l_@@_special_sign_bool
+        \l_@@_special_sign_bool 
       }
       { \translate { #3 ( cu-unit ) } }
       { \translate { #2 ( cu-unit ) } }
   }
+\cs_generate_variant:Nn \@@_cunum_print_correct_unit:nnn { nVV }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3304,7 +4016,7 @@
 \NewDocumentCommand \cudefinekeys { m m }
   {
     \bool_set_false:N \l_@@_single_key_bool
-    \cukeys_define_keys_and_single_keys:nn {#1} {#2}
+    \@@_cukeys_define_keys_and_single_keys:nn {#1} {#2}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -3315,18 +4027,18 @@
 \NewDocumentCommand \cudefinesinglekey { m m }
   {
     \bool_set_true:N \l_@@_single_key_bool
-    \cukeys_define_keys_and_single_keys:nn {#1} {#2}
+    \@@_cukeys_define_keys_and_single_keys:nn {#1} {#2}
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{ \cukeys_define_keys_and_single_keys:nn }
+% \begin{macro}{ \@@_cukeys_define_keys_and_single_keys:nn }
 %   First checks whetever the unit is defined or not, then clears some macros
 %   which are needed later. Further procession depends on the boolean.
 %   If more than one key is created, the value \lstinline|\l_tmpa_fp| is set to one.
 %   This is important for adding keys where \lstinline|\l_tmpa_fp| is changed accordingly.
 %    \begin{macrocode}
-\cs_new:Npn \cukeys_define_keys_and_single_keys:nn #1#2
+\cs_new:Npn \@@_cukeys_define_keys_and_single_keys:nn #1#2
   {
     \@@_error_if_unit_not_defined:n {#1}
     \tl_if_blank:nF {#2}
@@ -3658,12 +4370,28 @@
 % \section {Creating New Units}
 %
 %
-%\begin{macro}{ \newcookingunit }
+%\begin{macro}{ \declarecookingunit , \newcookingunit , \providecookingunit }
 %    \begin{macrocode}
+\NewDocumentCommand \declarecookingunit { o m }
+  {
+    \clist_if_in:NnTF \g_@@_list_of_defined_units_clist {#2}
+      { \msg_info:nnn { cooking-units } { redefine-unit } {#2} }
+      { \@@_new_cooking_unit:nn {#1} {#2} }
+    \@@_set_cooking_unit:nn {#1} {#2}
+  }
 \NewDocumentCommand \newcookingunit { o m }
   {
     \@@_new_cooking_unit:nn {#1} {#2}
+    \@@_set_cooking_unit:nn {#1} {#2}
   }
+\NewDocumentCommand \providecookingunit { o m }
+  {
+    \clist_if_in:NnF \g_@@_list_of_defined_units_clist {#2}
+      { 
+        \@@_new_cooking_unit:nn {#1} {#2} 
+        \@@_set_cooking_unit:nn {#1} {#2}
+      }
+  }
 %    \end{macrocode}
 %\end{macro}
 %
@@ -3675,10 +4403,9 @@
       {
         \clist_put_right:Nn \g_@@_list_of_defined_units_clist {#2}
         \tl_new:c { l_@@_tmpa_  #2 _tl }
-%        \tl_set:cn { l_@@_tmpa_  #2 _tl } { \c_one_fp }
         \tl_set_eq:cN { l_@@_tmpa_  #2 _tl } \c_one_fp
         \clist_new:c { l_@@_predefined_option_#2_clist } 
-        \keys_define:nn { cooking - units }
+        \keys_define:nn { cooking-units }
           {
             set-option-for-#2 .clist_set:c = { l_@@_predefined_option_#2_clist } ,
             add-option-for-#2 .code:n = 
@@ -3686,46 +4413,84 @@
           }
         \prop_new:c { l_@@_cukeys_ #2 _prop }
         \tl_new:c { l_@@_cu_unit_ #2 _tl }
-        \IfNoValueTF {#1}
-          {
-            \tl_set:cn { l_@@_cu_unit_ #2 _tl } {#2}
-            \newtranslation { #2 ( cu-unit ) } {#2}
-          }{
-            \tl_set:cn { l_@@_cu_unit_ #2 _tl } {#1}
-            \newtranslation { #2 ( cu-unit ) } {#1}
-          }
       }
   }
+\cs_new:Npn \@@_set_cooking_unit:nn #1#2
+  {
+    \IfNoValueTF {#1}
+      {
+        \tl_set:cn { l_@@_cu_unit_ #2 _tl } {#2}
+        \deftranslation { #2 ( cu-unit ) } {#2}
+      }{
+        \tl_set:cn { l_@@_cu_unit_ #2 _tl } {#1}
+        \deftranslation { #2 ( cu-unit ) } {#1}
+      }
+  }
 %    \end{macrocode}
 %
 %
-%
 % \section { cutext \& Cutext }
 %
-% \end{macro}
 %
+% A quite primitive implentation of \opt{cutext-to-cunum}, but
+% sufficient for now.
 %    \begin{macrocode}
-\NewDocumentCommand \cutext { O{} m m }
+\NewDocumentCommand \cutext { d<> O{} m m }
   {
     \group_begin:
-      \bool_set_false:N \l_@@_cutext_uppercase_word_bool
-      \@@_cutext_default:nnn {#1} {#2} {#3}
-      \@@_cutext_print_correct_unitname:nn {#2} {#3}
+      \@@_cutext_initialise:nnn {#1} {#2} {#4}
+      \bool_if:NTF \l_@@_cutext_to_cunum_bool
+        { \cunum {#3} {#4} }
+        {
+          \bool_set_false:N \l_@@_cutext_uppercase_word_bool
+          \@@_cutext:nnnn {#1} {#2} {#3} {#4}
+        }
     \group_end:
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\NewDocumentCommand \Cutext { O{} m m }
+\NewDocumentCommand \Cutext { d<> O{} m m }
   {
     \group_begin:
-      \bool_set_true:N \l_@@_cutext_uppercase_word_bool
-      \@@_cutext_default:nnn {#1} {#2} {#3}
-      \@@_cutext_print_correct_unitname:nn {#2} {#3}
+      \@@_cutext_initialise:nnn {#1} {#2} {#4}
+      \bool_if:NTF \l_@@_cutext_to_cunum_bool
+        { \cunum {#3} {#4} }
+        {
+          \bool_set_true:N \l_@@_cutext_uppercase_word_bool
+          \@@_cutext:nnnn {#1} {#2} {#3} {#4}
+        }
     \group_end:
   }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cutext_initialise:nnn #1#2#3
+  {
+    \bool_set_true:N \l_@@_using_cutext_bool
+    \@@_initialise_default:nnn {#1} {#2} {#3}
+    \bool_if:NTF \l_@@_cutext_change_unit_bool
+      { \@@_initialise_unit_change:nnn {#1} {#2} {#3} }
+      { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_tmp_unit_tl }
+    \@@_initialise_after_unit_change:nnn {#1} {#2} {#3}
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new:Npn \@@_cutext:nnnn #1#2#3#4
+  {
+    \bool_if:nTF { \l_@@_cutext_old_bool || !\l_@@_parse_input_bool }
+      {
+        \@@_cutext_default:nnn {#2} {#3} {#4}
+        \@@_cutext_print_correct_unitname:nnn {#3} {#4} {#4}
+      }{
+        \@@_parse_and_evaluate_input:n {#3}
+        \@@_cutext_print_correct_unitname:VVV
+          \l_@@_cutext_tmp_tl \l_@@_option_unit_tl \l_@@_tmp_unit_tl
+      }
+  }
+%    \end{macrocode}
+%
 % \begin{macro} { \@@_cutext_default:nnn }
 % \changes {2016/06/11} {0.98a} { New command }
 %    \begin{macrocode}
@@ -3732,8 +4497,6 @@
 \cs_new:Npn \@@_cutext_default:nnn #1#2#3
   {
     \@@_error_if_unit_not_defined:n {#3}
-    \tl_if_empty:nF {#1}
-      { \keys_set:nn { cooking-units } {#1} }
     \bool_if:NT \l_@@_convert_to_eV_bool
       { \@@_convert_to_eV: }
     \bool_if:NTF \l_@@_parse_input_bool
@@ -3744,7 +4507,7 @@
             \tl_replace_once:NVn \l_tmpb_tl \l_@@_input_range_sign_tl { \q_@@_range } 
             \@@_cutext_parse_range:Vn \l_tmpb_tl {#3} 
           }{
-            \@@_cutext_print_nummerical_output:Nn \l_tmpb_tl {#3}
+            \@@_cutext_print_output:Nn \l_tmpb_tl {#3}
           }
       }
       {#2}
@@ -3762,26 +4525,16 @@
   {
     \tl_set:Nn \l_@@_tmpa_tl {#2}
     \tl_set:Nn \l_@@_tmpb_tl {#3}
-    \@@_cutext_print_nummerical_output:Nn \l_@@_tmpa_tl {#1}
+    \@@_cutext_print_output:Nn \l_@@_tmpa_tl {#1}
     \tl_use:N \l_@@_cutext_range_sign_tl
-    \@@_cutext_print_nummerical_output:Nn \l_@@_tmpb_tl {#1}
+    \@@_cutext_print_output:Nn \l_@@_tmpb_tl {#1}
   }
 %    \end{macrocode}
 %
-%    \begin{macrocode}
-\cs_new:Npn \@@_cutext_just_print_number_correctly:N #1
-  {
-    \translatelet \l_tmpa_tl { decimal-mark ( cu-unitname ) }
-    \tl_replace_once:NnV #1 { . } \l_tmpa_tl
-    \tl_replace_once:NnV #1 { - } \c_@@_minus_tl
-    #1
-  }
-%    \end{macrocode}
-%
-% \begin{macro} {\@@_cutext_print_nummerical_output:N}
+% \begin{macro} {\@@_cutext_print_output:Nn , \@@_cutext_print_output:NV}
 % \changes {2016/06/11} {0.99} {New.}
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cutext_print_nummerical_output:Nn #1#2
+\cs_new_protected:Npn \@@_cutext_print_output:Nn #1#2
   {
     \bool_if:NTF \g_@@_load_if_opt_numeral_bool
       {
@@ -3791,40 +4544,51 @@
               {
                 \fp_compare:nNnTF {#1} = { \c_one_fp }
                   { 
-                    \translatelet \l_tmpa_tl { #2 (cu-unitgender) } 
-                    \translatelet \l_tmpa_tl { one (\l_tmpa_tl) (cu-unitname) } 
+                    \translatelet \l_@@_translation_tmpa_tl { #2 (cu-unitgender) } 
+                    \translatelet \l_@@_translation_tmpa_tl 
+                      { one (\l_@@_translation_tmpa_tl) (cu-unitname) } 
                     \bool_if:NTF \l_@@_cutext_uppercase_word_bool
                       {
-                        \exp_args:Nf \tl_to_uppercase:n { \tl_head:V \l_tmpa_tl }
-                        \tl_tail:V \l_tmpa_tl
+                        \exp_args:Nf \tl_to_uppercase:n { \tl_head:V \l_@@_translation_tmpa_tl }
+                        \tl_tail:V \l_@@_translation_tmpa_tl
                       }
-                      { \l_tmpa_tl }
+                      { \l_@@_translation_tmpa_tl }
                   }{ 
                     \bool_if:NTF \l_@@_cutext_uppercase_word_bool
                       { \Numberstringnum {#1} }
                       { \numberstringnum {#1} }
                   }
-              }{ \@@_cutext_just_print_number_correctly:N #1 }
-          }{ \@@_cutext_just_print_number_correctly:N #1 }
+              }{ \@@_print_nummerical_output:N #1 }
+          }{ \@@_print_nummerical_output:N #1 }
       }
-      { \@@_cutext_just_print_number_correctly:N #1 }
+      { \@@_print_nummerical_output:N #1 }
   }
+\cs_generate_variant:Nn \@@_cutext_print_output:Nn { NV }
 %    \end{macrocode}
 % \end{macro}
 %
 %    \begin{macrocode}
-\cs_new:Npn \@@_cutext_print_correct_unitname:nn #1#2
+\cs_new:Npn \@@_cutext_print_correct_unitname:nnn #1#2#3
   {
-    \space
-    \@@_if_integer_and_parse:nTF {#1}
+    \l_@@_cutext_space_tl
+    \bool_if:nTF 
       {
-        \fp_compare:nNnTF {#1} = { \c_one_fp }
-          { \translate  { #2 (cu-unitname) } }
+        ! \l_@@_parse_input_bool ||
+        \l_@@_fraction_in_input_bool ||
+        \l_@@_special_sign_bool 
+      }
+      { \translate { #3 (cu-unitname pl) } }
+      {
+        \@@_if_integer:nTF {#1}
+          { 
+            \fp_compare:nNnTF {#1} = { \c_one_fp }
+              { \translate  { #2 (cu-unitname) } }
+              { \translate  { #2 (cu-unitname pl) } }
+          }
           { \translate  { #2 (cu-unitname pl) } }
-      }{
-        \translate { #2 (cu-unitname pl) }
       }
   }
+\cs_generate_variant:Nn \@@_cutext_print_correct_unitname:nnn { VVV }
 %    \end{macrocode}
 %
 %
@@ -3894,68 +4658,116 @@
 %
 % \section{cuam}
 %
+%    \begin{macrocode}
+\tl_new:N \l_@@_cuam_marker_tl
+\tl_set:Nn \l_@@_cuam_marker_tl { @@_cunum }
+\tl_new:c { l_@@_tmpa_ \l_@@_cuam_marker_tl  _ tl }
+\tl_set:cn { l_@@_tmpa_ \l_@@_cuam_marker_tl  _ tl } { \c_one_fp }
+\clist_new:c { l_@@_predefined_option_ \l_@@_cuam_marker_tl _clist }
+%    \end{macrocode}
+%
 % Replaces and extends \mycs{cufrac}.
 % \begin{macro}{\cuam}
-%    \begin{macrcode}
-\NewDocumentCommand \cuam { s O{} m }
+%    \begin{macrocode}
+\NewDocumentCommand \cuam { d<> O{} m }
   {
     \group_begin:
-    \tl_if_empty:nF {#2}
-      { \keys_set:nn { cooking-units } {#2} }
-    \IfBooleanTF {#1}
-      { \@@_cuam_star:n {#3} }
-      { \@@_cuam_star:n {#3} }
+    \@@_cuam_initialise:nnn {#1} {#2} {}
+    \bool_if:NTF \l_@@_parse_input_bool
+      {
+        \bool_if:NTF \l_@@_cuam_old_bool
+          { \@@_cuam_old:n {#3} }
+          { \@@_parse_and_evaluate_input:n {#3}  }
+      }
+      { \@@_cunum_do_not_parse:nnn {#3} {} {} }
     \group_end:
   }
-%    \end{macrcode}
+%    \end{macrocode}
 % \end{macro}
 %
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cuam_initialise:nnn #1#2#3
+  {
+    \tl_set_eq:NN \l_@@_tmp_unit_tl \l_@@_cuam_marker_tl
+    \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_cuam_marker_tl
+    \@@_initialise_after_unit_change:nnn {#1} {#2} {#3}
+  }
+%    \end{macrocode}
+%
 % \begin{macro}{\@@_cuam:n}
 %    \begin{macrocode}
-\cs_new:Npn \@@_cuam_star:n #1
+\cs_new:Npn \@@_cuam:n #1
   {
     \tl_set_rescan:Nnn \l_tmpa_tl
       {
         \char_set_catcode_letter:N \_ %
+        \char_set_catcode_ignore:N \ %
+        \char_set_catcode_other:N ? %
+      } {#1}
+    \@@_cuam_parse:V \l_tmpa_tl
+  }
+%
+\cs_new:Npn \@@_cuam_old:n #1
+  {
+    \tl_set_rescan:Nnn \l_tmpa_tl
+      {
+        \char_set_catcode_letter:N \_ %
         \char_set_catcode_ignore:N\ %
       } {#1}
-    \@@_cuam_star_parse:V \l_tmpa_tl
+    \@@_cuam_old_parse:V \l_tmpa_tl
   }
 %    \end{macrocode}
 % \end{macro}
 %
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_cuam_star_parse:n #1
+\cs_new_protected:Npn \@@_cuam_old_parse:n #1
   {
     \tl_if_in:nVTF {#1} \l_@@_input_range_sign_tl
       {
         \tl_set:Nn \l_tmpa_tl {#1}
         \tl_replace_once:NVn \l_tmpa_tl \l_@@_input_range_sign_tl { \q_@@_range }
-        \@@_cuam_star_parse_range:V \l_tmpa_tl
+        \@@_cuam_old_parse_range:V \l_tmpa_tl
       }{
         \tl_if_in:nnTF {#1} { / }
           {
             \tl_if_in:nnTF {#1} { _ }
-              { \@@_cuam_star_parse_mixed_frac:www #1 \q_stop }
-              { \@@_cuam_star_parse_frac:ww #1 \q_stop }
+              { \@@_cuam_old_parse_mixed_frac:www #1 \q_stop }
+              { \@@_cuam_old_parse_frac:ww #1 \q_stop }
           }{ 
             \tl_if_in:nnTF {#1} { _ }
               { \msg_error:nnn { cooking-units } { missing-slash } {#1} }
-              { \@@_cuam_star_parse_scale:n {#1} }
+              { \@@_cuam_old_parse_scale:n {#1} }
           }
       }
   }
-\cs_generate_variant:Nn \@@_cuam_star_parse:n { V }
+\cs_generate_variant:Nn \@@_cuam_old_parse:n { V }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\cs_new:Npn \@@_cuam_star_parse_range:n #1
+\cs_new:Npn \@@_cuam_parse_range:n #1
   {
-    \@@_cuam_star_parse_range_aux:ww #1 \q_nil
+    \@@_cuam_parse_range_aux:ww #1 \q_nil
   }
-\cs_generate_variant:Nn \@@_cuam_star_parse_range:n { V }
-\cs_new:Npn \@@_cuam_star_parse_range_aux:ww #1 \q_@@_range #2 \q_nil
+\cs_generate_variant:Nn \@@_cuam_parse_range:n { V }
+\cs_new:Npn \@@_cuam_parse_range_aux:ww #1 \q_@@_range #2 \q_nil
   {
+    \@@_parse_input_and_safe_in:nN {#1} \l_tmpa_tl
+    \@@_parse_input_and_safe_in:nN {#2} \l_tmpb_tl
+    \@@_print_nummerical_output:N \l_tmpa_tl
+    \l_@@_cunum_range_sign_tl 
+    \@@_print_nummerical_output:N \l_tmpb_tl
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new:Npn \@@_cuam_old_parse_range:n #1
+  {
+    \@@_cuam_old_parse_range_aux:ww #1 \q_nil
+  }
+\cs_generate_variant:Nn \@@_cuam_old_parse_range:n { V }
+\cs_new:Npn \@@_cuam_old_parse_range_aux:ww #1 \q_@@_range #2 \q_nil
+  {
     #1 \l_@@_cunum_range_sign_tl #2
   }
 %    \end{macrocode}
@@ -3962,16 +4774,16 @@
 %
 %
 %    \begin{macrocode}
-\cs_new:Npn \@@_cuam_star_parse_scale:n #1 {#1}
+\cs_new:Npn \@@_cuam_old_parse_scale:n #1 {#1}
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\cs_new:Npn \@@_cuam_star_parse_frac:ww #1/#2 \q_stop
+\cs_new:Npn \@@_cuam_old_parse_frac:ww #1/#2 \q_stop
   { \@@_frac:nn {#1} {#2} }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\cs_new:Npn \@@_cuam_star_parse_mixed_frac:www #1_#2/#3 \q_stop
+\cs_new:Npn \@@_cuam_old_parse_mixed_frac:www #1_#2/#3 \q_stop
   { 
     #1 
     \hbox_to_wd:nn { \l_@@_mixed_frac_dim } { } 

Modified: trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty	2016-11-14 07:21:02 UTC (rev 42506)
+++ trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty	2016-11-14 22:34:47 UTC (rev 42507)
@@ -30,8 +30,8 @@
   { \RequirePackage {expl3} }
 \ProvidesExplPackage
   {cooking-units}
-  {2016/10/19}
-  {1.04}
+  {2016/11/13}
+  {1.10}
   {Ein Paket fuer Kocheinheiten}
 \@ifpackagelater { expl3 } { 2016/05/18 }
   { }
@@ -70,6 +70,9 @@
 \cs_generate_variant:Nn \fp_compare:nNnT { cNnT }
 \cs_generate_variant:Nn \fp_eval:n { c }
 \cs_generate_variant:Nn \prop_get:cVN { cVc }
+\cs_generate_variant:Nn \int_abs:n { c }
+\cs_generate_variant:Nn \tl_show:n { f , x }
+\cs_generate_variant:Nn \fp_compare:nNnTF { v }
 \cs_new_eq:NN \__cooking_units_frac:nn \sfrac
 \prop_new:N \l__cooking_units_change_unit_prop
 \tl_new:N \l__cooking_units_tmpa_tl
@@ -87,10 +90,17 @@
 \tl_new:N \l__cooking_units_allowed_special_signs_tl
 \tl_new:N \c__cooking_units_str_hash_one_tl
 \tl_new:N \l__cooking_units_input_range_sign_tl
+\tl_new:N \l__cooking_units_input_for_persons_sign
+\tl_new:N \l__cooking_units_input_times_persons_sign
+\tl_new:N \l__cooking_units_cutext_space_tl
+\tl_new:N \l__cooking_units_translation_tmpa_tl
+\tl_new:N \l__cooking_units_cutext_tmp_tl
 \tl_set:Nn \l__cooking_units_cunum_range_sign_tl { -- }
 \tl_set:Nn \l__cooking_units_cutext_range_sign_tl { -- }
 \tl_set:Nn \l__cooking_units_value_unit_space_tl { \thinspace }
 \tl_set:Nn \l__cooking_units_input_digits_tl { 0123456789 }
+\tl_set:Nn \l__cooking_units_input_for_persons_sign { @ }
+\tl_set:Nn \l__cooking_units_input_times_persons_sign { * }
 \tl_set:Nn \l__cooking_units_decimal_mark_tl { . , }
 \tl_set:Nn \l__cooking_units_value_signs_tl { + - }
 \tl_set:Nn \l__cooking_units_input_range_sign_tl { -- }
@@ -97,6 +107,7 @@
 \tl_set:Nn \l__cooking_units_allowed_special_signs_tl { ? }
 \tl_set_rescan:Nnn \c__cooking_units_str_hash_one_tl
   { \char_set_catcode_letter:N \# } {#1}
+\tl_set:Nn \l__cooking_units_cutext_space_tl { \space }
 \AtBeginDocument {
   \cs_if_free:cT { T at TS1 }
     {
@@ -121,6 +132,7 @@
 }
 \dim_new:N \l__cooking_units_mixed_frac_dim
 \dim_set:Nn \l__cooking_units_mixed_frac_dim { 0.1 em }
+\int_new:N \l__cooking_units_persons_tmp_int
 \int_new:N \l__cooking_units_significant_figures_int
 \int_new:N \l__cooking_units_significant_figures_plus_one_int
 \int_set:Nn \l__cooking_units_significant_figures_int { 2 }
@@ -127,6 +139,8 @@
 \int_set:Nn \l__cooking_units_significant_figures_plus_one_int { 2 + 1 }
 \int_new:N \l__cooking_units_print_numerals_below_int
 \int_set:Nn \l__cooking_units_print_numerals_below_int { 13 }
+\int_new:N \l__cooking_units_calc_for_number_of_persons_int
+\int_set:Nn \l__cooking_units_calc_for_number_of_persons_int { 4 }
 \clist_new:N \l__cooking_units_list_of_defined_keys_clist
 \clist_new:N \g__cooking_units_list_of_defined_units_clist
 \clist_new:N \g__cooking_units_allowed_unit_phrases_clist
@@ -144,7 +158,17 @@
 \bool_new:N \l__cooking_units_cutext_uppercase_word_bool
 \bool_new:N \l__cooking_units_error_for_unknown_value_bool
 \bool_new:N \l__cooking_units_parse_range_bool
+\bool_new:N \l__cooking_units_using_cutext_bool
+\bool_new:N \l__cooking_units_cuam_old_bool
+\bool_new:N \l__cooking_units_calc_for_persons_bool
+\bool_new:N \l__cooking_units_calc_because_ref_was_given_bool
+\bool_new:N \l__cooking_units_calc_persons_tmp_bool
+\bool_new:N \l__cooking_units_cutext_to_cunum_bool
+\bool_new:N \l__cooking_units_cutext_old_bool
+\bool_new:N \l__cooking_units_cutext_change_unit_bool
+\bool_new:N \l__cooking_units_round_commercial_bool
 \bool_set_true:N \l__cooking_units_parse_input_bool
+\bool_set_true:N \l__cooking_units_cutext_change_unit_bool
 \quark_new:N \q__cooking_units_range
 \clist_gset:Nn \g__cooking_units_allowed_unit_phrases_clist
   {
@@ -161,7 +185,7 @@
 \newtranslation [ to=German ] { one (m) (cu-unitname) } { ein }
 \newtranslation [ to=German ] { one (f) (cu-unitname) } { eine }
 \newtranslation [ to=German ] { one (n) (cu-unitname) } { ein }
-\keys_define:nn { cooking - units }
+\keys_define:nn { cooking-units }
   {
     eval-fraction .bool_set:N = \l__cooking_units_eval_fractions_bool ,
     eval-fraction .default:n = { false } ,
@@ -230,20 +254,58 @@
     round-half .choices:nn =
       { default , commercial }
       {
-        \cs_set:Npx \__cooking_units_round_setup:n ####1
+        \int_case:nn { \l_keys_choice_int }
           {
-            \exp_not:N \l__cooking_units_significant_figures_int
-            \int_case:nn { \l_keys_choice_int }
-              {
-                { 1 } { }
-                { 2 } { \exp_not:N, ####1 }
-              }
+            { 1 } { \bool_set_false:N \l__cooking_units_round_commercial_bool }
+            { 2 } { \bool_set_true:N \l__cooking_units_round_commercial_bool }
           }
       },
     round-half .default:n = { default },
-    label .code:n = { \label{cooking-units-#1} } ,
-    for-persons .int_set:N = \l__cooking_units_number_of_persons_int ,
-    for-persons .default:n = { 4 } ,
+    set-number-of-persons .int_set:N = \l__cooking_units_calc_for_number_of_persons_int ,
+    set-number-of-persons .default:n = { 4 } ,
+    label .code:n =
+      {
+        \__cooking_units_label_and_persons:n {#1}
+      } ,
+    label .value_required:n = { true } ,
+    get-label .code:n =
+      {
+        \__cooking_units_curef:n {#1}
+      } ,
+    label .value_required:n = { true } ,
+    ref .code:n =
+      {
+        \__cooking_units_reference_label_and_persons:n {#1}
+      } ,
+    ref .value_required:n = { true } ,
+    cuam-version .choices:nn =
+      { new , old }
+      {
+        \int_case:nn { \l_keys_choice_int }
+          {
+            { 1 } { \bool_set_false:N \l__cooking_units_cuam_old_bool }
+            { 2 } { \bool_set_true:N \l__cooking_units_cuam_old_bool }
+          }
+      } ,
+    cuam-version .default:n = { new } ,
+    cutext-version .choices:nn =
+      { new , old }
+      {
+        \int_case:nn { \l_keys_choice_int }
+          {
+            { 1 } { \bool_set_false:N \l__cooking_units_cutext_old_bool }
+            { 2 } { \bool_set_true:N \l__cooking_units_cutext_old_bool }
+          }
+      } ,
+    cutext-version .default:n = { new } ,
+    recalculate-amount .bool_set:N = \l__cooking_units_calc_for_persons_bool ,
+    recalculate-amount .default:n = { false } ,
+    cutext-to-cunum .bool_set:N = \l__cooking_units_cutext_to_cunum_bool ,
+    cutext-to-cunum .default:n = { false } ,
+    cutext-space .tl_set:N = \l__cooking_units_cutext_space_tl ,
+    cutext-space .default:n = { \space } ,
+    cutext-change-unit .bool_set:N = \l__cooking_units_cutext_change_unit_bool ,
+    cutext-change-unit .default:n = { true } ,
   }
 \msg_new:nnnn { cooking-units } { fraction-not-allowed-with-range }
   {
@@ -271,7 +333,7 @@
     unit-key \ is \ written \ correctly.
     \msg_see_documentation_text:n { cooking-units }
   }
-\msg_new:nnnn { cooking - units } { unit-already-defined }
+\msg_new:nnnn { cooking-units } { unit-already-defined }
   { The\ unit \ '#1' \ is \ already \ defined. }
   {
     The \ unit-key \ is \ already \ defined. \ Please \ use \ a \ different \
@@ -278,28 +340,28 @@
     key \ for \ a \ new \ unit.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { missing-argument }
+\msg_new:nnnn { cooking-units } { missing-argument }
   { There \ is \ an \ missing \ argument. }
   {
     You \ probably \ have \ forgotten \ a \ curly-brace \ pair.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { Division-by-zero }
+\msg_new:nnnn { cooking-units } { Division-by-zero }
   { Division\ by \ zero \ is \ not \ allowed. }
   { See \ a \ math \ book \ of \ your \ choice \ or \ for \ example \ Wikipedia. }
-\msg_new:nnnn { cooking - units } { Token-not-allowed }
+\msg_new:nnnn { cooking-units } { Token-not-allowed }
   { The \ token \ '#1' \ is \ not \ allowed. }
   {
     The \ command \ accepts \ only \ a \ fixed \ number \ of \ tokens.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { Second - decimal -sign - not - allowed }
+\msg_new:nnnn { cooking-units } { Second - decimal -sign - not - allowed }
   { A \ second \ decimal \ sign \ is \ not \ allowed. }
   {
     Perhaps \ you \ didn't \ type \ it \ correctly.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { Key - not -defined }
+\msg_new:nnnn { cooking-units } { Key - not -defined }
   {
     The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys or \
     \cudefinesinglekey to \ define \ keys.
@@ -308,7 +370,7 @@
     This \ key \ is \ not \ defined, \ perhaps \ you  \ misspelled \ it.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { Temperature-to-low }
+\msg_new:nnnn { cooking-units } { Temperature-to-low }
   {
     The \ temperature \ '#1' \ is \ to \ low.\ It \ cannot \ be \
     below \ the \ absolute \ zero - point \ of \ '#2'. \ Note \ that \
@@ -319,7 +381,7 @@
     disable \ this \ error.
   }
   { See \ for \ example \ Wikipedia. }
-\msg_new:nnnn { cooking - units } { key-choice-unknown }
+\msg_new:nnnn { cooking-units } { key-choice-unknown }
   {
     The \ key \ '#1' \ only \ accepts \ only \
     '#3' \ as \ a \ set \ of \ choices \ and \ '#2' \ is \ non \ of \ these.
@@ -330,7 +392,7 @@
     and \ \cuaddtokeys.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { amount-not-known }
+\msg_new:nnnn { cooking-units } { amount-not-known }
   {
     The \ amount \ of \ #1 \ is \ not \ known \ at \ line \
     \msg_line_number: .
@@ -341,7 +403,7 @@
     reminds\  you\  about\  that\  fact.
     \msg_see_documentation_text:n {cooking-units}
   }
-\msg_new:nnnn { cooking - units } { load-time-option }
+\msg_new:nnnn { cooking-units } { load-time-option }
   {
     The \ option \ '#1' \ is \ only \ available \ as \ a \ load-time-option. \
     Please \ set \ it \ as \ a \ package \ option.
@@ -351,7 +413,7 @@
     but \ only \ as \ a \ package \ option.
     \msg_see_documentation_text:n { cooking-units }
   }
-\msg_new:nnnn { cooking - units } { obsolete-command }
+\msg_new:nnnn { cooking-units } { obsolete-command }
   {
     Command \ #1 is \ obsolete. \ Please \ use \ #2 instead.
   }
@@ -359,7 +421,7 @@
     Don't \ use \ this \ old \ command \ ...
     \msg_see_documentation_text:n { cooking-units }
   }
-\msg_new:nnnn { cooking - units } { No-Value-given }
+\msg_new:nnnn { cooking-units } { No-Value-given }
   {
     Please \ input \ a \ number \ to \ check \ for \
     'check-temperature'.
@@ -369,7 +431,7 @@
     'check-temperature' \ is \ active.
     \msg_see_documentation_text:n { cooking-units }
   }
-\msg_new:nnnn { cooking - units } { Minimum-already-defined }
+\msg_new:nnnn { cooking-units } { Minimum-already-defined }
   {
     A \ minimum \ for \ '#1' \ has \ already \ been \  defined.
   }
@@ -377,6 +439,49 @@
     You \ cannot \ redefine \ it.
     \msg_see_documentation_text:n { cooking-units }
   }
+\msg_new:nnnn { cooking-units } { Number-of-persons-missing }
+  {
+    Please \ add \ the \ number \ of \ persons \ this \ recipe \ is \ for \ in \ '#1'. \
+    Note \ that\ the \ number \ must \ be \ given \ after \ a \ '*'.
+  }
+  {
+    Write \ 'Schweinsbraten*4' \ to \ create \ the \ label \ 'Schweinsbraten' \
+    which \ is \ initially \ for \ 4 \ persons.
+    \msg_see_documentation_text:n { cooking-units }
+  }
+\msg_new:nnnn { cooking-units } { Number-of-persons-is-not-an-integer }
+  {
+    The \ number \ of \ persons \ the \ recipe \ is \ for \ must \ be \ an \
+    integer.
+  }
+  {
+    The \ number \ '#1' \ is \ not \ allowed.
+    \msg_see_documentation_text:n { cooking-units }
+  }
+\msg_new:nnnn { cooking-units } { label-already-defined }
+  {
+    The \ label \ '#1' \ has \ already \ been \ defined.
+  }
+  {
+    Each \ label \ must \ be \ unique.
+    \msg_see_documentation_text:n { cooking-units }
+  }
+\msg_new:nnnn { cooking-units } { label-not-defined }
+  {
+    The \ label \ is \ not \ defined. \ Please \ note \ that \ a \ label
+    \ has \ to \ defined \ before \ it \ is \ referenced.
+  }
+  {
+    Define \ the \ label \ before \ using \ it.
+    \msg_see_documentation_text:n { cooking-units }
+  }
+\msg_new:nnnn { cooking-units } { redefine-unit }
+  {
+    The \ unit \ '#1' \ is \ redefined \ by \ \declarecookingunit at \ \msg_line_context: .
+  }
+  {
+    \msg_see_documentation_text:n { cooking-units }
+  }
 \cs_new:Npn \__cooking_units_error_if_unit_not_defined:n #1
   {
     \clist_if_in:NnF \g__cooking_units_list_of_defined_units_clist {#1}
@@ -383,19 +488,25 @@
       { \msg_error:nnn { cooking-units } { unknown-unit } {#1} }
   }
 \cs_generate_variant:Nn \__cooking_units_error_if_unit_not_defined:n { V }
-\prg_new_protected_conditional:Npnn \__cooking_units_if_integer_and_parse:n #1 { TF }
+\prg_new_protected_conditional:Npnn \__cooking_units_if_integer:n #1 { TF }
   {
-    \bool_if:NTF \l__cooking_units_parse_input_bool
+    \tl_map_inline:nn {#1}
       {
-        \tl_map_inline:nn {#1}
+        \tl_if_in:NnF \l__cooking_units_input_digits_tl {##1}
           {
-            \tl_if_in:NnF \l__cooking_units_input_digits_tl {##1}
-              {
-                \tl_map_break:n { \use_iii:nnn }
-              }
+            \tl_map_break:n { \use_iii:nnn }
           }
-        \use_i:nn \prg_return_true: \prg_return_false:
       }
+    \use_i:nn \prg_return_true: \prg_return_false:
+  }
+\prg_new_protected_conditional:Npnn \__cooking_units_if_integer_and_parse:n #1 { TF }
+  {
+    \bool_if:NTF \l__cooking_units_parse_input_bool
+      {
+        \__cooking_units_if_integer:nTF {#1}
+          { \prg_return_true: }
+          { \prg_return_false: }
+      }
       { \prg_return_false: }
   }
 \cs_generate_variant:Nn \__cooking_units_if_integer_and_parse:nTF { V }
@@ -430,21 +541,17 @@
         cl= (chbareV-1)3 ,
         ml= (chbareV-1)3 ,
       }
-      \prop_get:NVN \l__cooking_units_change_unit_prop \l__cooking_units_tmp_unit_tl \l__cooking_units_option_unit_tl
-      \quark_if_no_value:NT \l__cooking_units_option_unit_tl
-        {
-          \tl_set_eq:NN \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl
-        }
-      \keys_set_filter:nnv
-        { cooking-units }
-        { change-unit }
-        { l__cooking_units_predefined_option_ \l__cooking_units_option_unit_tl _clist }
   }
 \cs_new:Npn \__cooking_units_deftranslation:Nnn #1#2#3
   {
-    \deftranslation [ to=#1 ] { #2 } {#3}
+    \deftranslation [ to=#1 ] {#2} {#3}
   }
 \cs_generate_variant:Nn \__cooking_units_deftranslation:Nnn { Vnn , Vnv }
+\cs_new:Npn \__cooking_units_tl_set_fp_and_eval:Nn #1#2
+  {
+    \tl_set:Nf #1 { \fp_eval:n {#2} }
+  }
+\cs_generate_variant:Nn \__cooking_units_tl_set_fp_and_eval:Nn { Nc }
 \cs_new:Npn \__cooking_units_temperature_to_check_print_error:n #1
   {
     \msg_error:nn { cooking-units } { No-Value-given }
@@ -453,13 +560,103 @@
   {
     \__cooking_units_error_if_unit_not_defined:n {#1}
     \fp_if_exist:cTF { c__cooking_units_ #1 _min_fp }
-      { \msg_error:nnn { cooking-units } { Minimum-already-defined } {#1} }
+      { \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1} }
       {
         \clist_put_right:Nn \l__cooking_units_temperatures_to_check_clist {#1}
         \fp_const:cn { c__cooking_units_ #1 _min_fp } {#2}
       }
   }
-\cs_new:Npn \__cooking_units_round_setup:n #1 { \l__cooking_units_significant_figures_int }
+\cs_new:Npn \__cooking_units_rounding_function:n #1
+  {
+    #1
+      \bool_if:NTF \l__cooking_units_round_commercial_bool
+        {
+          \bool_if:NTF \l__cooking_units_round_to_int_bool
+            { , \c_zero_fp }
+            { , \l__cooking_units_significant_figures_int }
+          , #1
+        }
+        { \bool_if:NF \l__cooking_units_round_to_int_bool { , \l__cooking_units_significant_figures_int } }
+  }
+\cs_new:Npn \__cooking_units_label_and_persons:n #1
+  {
+    \tl_if_in:nnTF {#1} { @ }
+      {
+        \__cooking_units_label_and_persons_for_persons:ww #1 \q_stop
+      }{
+        \tl_if_in:nnTF {#1} { * }
+          {
+            \__cooking_units_label_and_persons_times_persons:ww #1 \q_stop
+          }{
+            \msg_error:nnn { cooking-units} { Number-of-persons-missing } {#1}
+          }
+      }
+  }
+\cs_new:Npn \__cooking_units_label_and_persons_for_persons:ww #1 @ #2 \q_stop
+  {
+    \__cooking_units_culabel:nnn {#1} {#2} { }
+  }
+\cs_new:Npn \__cooking_units_label_and_persons_times_persons:ww #1 * #2 \q_stop
+  {
+    \__cooking_units_culabel:nnn {#1} {#2} { - }
+  }
+\cs_new:Npn \__cooking_units_reference_label_and_persons:n #1
+  {
+    \int_if_exist:cTF { l__cooking_units_persons_ #1 _int }
+      {
+        \bool_set_true:N \l__cooking_units_calc_because_ref_was_given_bool
+        \int_set:Nn \l__cooking_units_persons_tmp_int
+          {
+            \int_abs:c { l__cooking_units_persons_ #1 _int }
+          }
+      }
+      { \msg_error:nnn { cooking-units } { label-not-defined } {#1} }
+  }
+\cs_new:Npn \__cooking_units_culabel:nnn #1#2#3
+  {
+    \int_if_exist:cTF { l__cooking_units_persons_ #1 _int }
+      {
+        \msg_error:nnn { cooking-units } { label-already-defined } {#1}
+      }{
+        \__cooking_units_if_integer:nTF {#2}
+          {
+            \int_new:c { l__cooking_units_persons_ #1 _int }
+            \int_gset:cn { l__cooking_units_persons_ #1 _int } { #3 #2 }
+          }
+          { \msg_error:nnn { cooking-units } { Number-of-persons-is-not-an-integer } {#2} }
+      }
+  }
+\cs_new:Npn \__cooking_units_curef:n #1
+  {
+    \int_if_exist:cTF { l__cooking_units_persons_ #1 _int }
+      {
+        \bool_if:NTF \l__cooking_units_calc_for_persons_bool
+          { \int_use:N \l__cooking_units_calc_for_number_of_persons_int }
+          { \int_abs:c { l__cooking_units_persons_ #1 _int } }
+      }{ \msg_error:nnn { cooking-units } { label-not-defined } {#1} }
+  }
+\NewDocumentCommand \culabel { m m } { \__cooking_units_culabel:nnn {#1} {#2} {} }
+\DeclareExpandableDocumentCommand \curef { m } { \__cooking_units_curef:n {#1} }
+\cs_new:Npn \__cooking_units_tl_if_in_remove_and_set_bool:NnN #1#2#3
+  {
+    \tl_if_in:NnTF #1 {#2}
+      {
+        \bool_set_true:N #3
+        \tl_remove_once:Nn #1 {#2}
+      }{
+        \bool_set_false:N #3
+      }
+  }
+\cs_new:Npn \__cooking_units_tl_if_in_remove_and_reverse_bool:NnN #1#2#3
+  {
+    \tl_if_in:NnT #1 {#2}
+      {
+        \bool_if:NTF #3
+          { \bool_set_false:N #3 }
+          { \bool_set_true:N #3 }
+        \tl_remove_once:Nn #1 {#2}
+      }
+  }
 \cs_new:Npn \__cooking_units_cunum_parse_input:N #1
   {
     \bool_if:NTF \l__cooking_units_parse_range_bool
@@ -485,7 +682,9 @@
     \__cooking_units_parse_input_and_safe_in:nN {#1} \l__cooking_units_tmpa_tl
     \__cooking_units_parse_input_and_safe_in:nN {#2} \l__cooking_units_tmpb_tl
     \__cooking_units_calculate_and_print_input:N \l__cooking_units_tmpa_tl
-    \tl_use:N \l__cooking_units_cunum_range_sign_tl
+    \bool_if:NTF \l__cooking_units_using_cutext_bool
+      { \tl_use:N \l__cooking_units_cutext_range_sign_tl }
+      { \tl_use:N \l__cooking_units_cunum_range_sign_tl }
     \__cooking_units_calculate_and_print_input:N \l__cooking_units_tmpb_tl
   }
 \cs_new:Npn \__cooking_units_parse_fraction_in_input:ww #1/#2 \q_stop
@@ -492,12 +691,18 @@
   {
     \__cooking_units_parse_input_and_safe_in:nN {#1} \l__cooking_units_tmpa_tl
     \__cooking_units_parse_input_and_safe_in:nN {#2} \l__cooking_units_tmpb_tl
-    \bool_if:NTF \l__cooking_units_eval_fractions_bool
+    \bool_if:nTF
       {
+        \l__cooking_units_calc_persons_tmp_bool ||
+        \l__cooking_units_eval_fractions_bool
+      }
+      {
         \__cooking_units_calculate_and_print_input:n
           { \l__cooking_units_tmpa_tl / \l__cooking_units_tmpb_tl }
       }{
-        \__cooking_units_formatiere_fractions:nnn
+        \__cooking_units_tl_if_in_remove_and_set_bool:NnN \l__cooking_units_tmpa_tl { - } \l_tmpb_bool
+        \__cooking_units_tl_if_in_remove_and_reverse_bool:NnN \l__cooking_units_tmpb_tl { - } \l_tmpb_bool
+        \__cooking_units_formatiere_fractions:nNN
           { }
           { \l__cooking_units_tmpa_tl }
           { \l__cooking_units_tmpb_tl }
@@ -508,19 +713,23 @@
     \__cooking_units_parse_input_and_safe_in:nN {#1} \l__cooking_units_mixed_fraction_tl
     \__cooking_units_parse_input_and_safe_in:nN {#2} \l__cooking_units_tmpa_tl
     \__cooking_units_parse_input_and_safe_in:nN {#3} \l__cooking_units_tmpb_tl
-    \bool_if:NTF \l__cooking_units_eval_fractions_bool
+    \__cooking_units_tl_if_in_remove_and_set_bool:NnN \l__cooking_units_mixed_fraction_tl { - } \l_tmpb_bool
+    \__cooking_units_tl_if_in_remove_and_reverse_bool:NnN \l__cooking_units_tmpa_tl { - } \l_tmpb_bool
+    \__cooking_units_tl_if_in_remove_and_reverse_bool:NnN \l__cooking_units_tmpb_tl { - } \l_tmpb_bool
+    \bool_if:nTF
       {
+        \l__cooking_units_calc_persons_tmp_bool ||
+        \l__cooking_units_eval_fractions_bool
+      }{
         \__cooking_units_calculate_and_print_input:n
           {
-            \l__cooking_units_mixed_fraction_tl
-            \fp_compare:nNnTF
-              { \l__cooking_units_mixed_fraction_tl } < { \c_zero_fp }
-              { - }
-              { + }
+            \bool_if:NTF \l_tmpb_bool
+              { - \l__cooking_units_mixed_fraction_tl - }
+              { \l__cooking_units_mixed_fraction_tl + }
             \l__cooking_units_tmpa_tl / \l__cooking_units_tmpb_tl
           }
       }{
-        \__cooking_units_formatiere_fractions:nnn
+        \__cooking_units_formatiere_fractions:nNN
           { \l__cooking_units_mixed_fraction_tl }
           { \l__cooking_units_tmpa_tl }
           { \l__cooking_units_tmpb_tl }
@@ -570,8 +779,7 @@
                     \tl_if_in:nnTF { / _ } {#1}
                       { \msg_error:nnn { cooking-units } { fraction-not-allowed-with-range } {#1} }
                       { \msg_error:nnn { cooking-units } { Token-not-allowed } {#1} }
-                  }
-                  {
+                  }{
                     \tl_if_in:nnTF { _ } {#1}
                       { \msg_error:nnn { cooking-units } { missing-slash } {#1} }
                       { \msg_error:nnn { cooking-units } { Token-not-allowed } {#1} }
@@ -593,10 +801,16 @@
             \msg_warning:nnx { cooking-units } { amount-not-known } \l_tmpa_tl
           }
           {
-            \__cooking_units_calculate_input_and_store_in:nN {#1} \l_tmpa_tl
+            \bool_if:nTF
+              { \l__cooking_units_using_cutext_bool && ! \l__cooking_units_cutext_change_unit_bool }
+              { \tl_set:Nf \l_tmpa_tl {#1} }
+              { \__cooking_units_calculate_input_and_store_in:nN {#1} \l_tmpa_tl }
+            \bool_if:NT \l__cooking_units_calc_persons_tmp_bool
+              { \__cooking_units_calc_for_number_of_persons_and_store_in:NN \l_tmpa_tl \l_tmpa_tl }
+            \__cooking_units_round_calculated_input:NV \l_tmpa_tl \l_tmpa_tl
             \__cooking_units_check_temperature_limit:N \l_tmpa_tl
           }
-        \__cooking_units_print_nummerical_output:N \l_tmpa_tl
+        \__cooking_units_print_output:N \l_tmpa_tl
       }
   }
 \cs_generate_variant:Nn \__cooking_units_calculate_and_print_input:n { N }
@@ -605,23 +819,27 @@
     \fp_set:Nn \l_tmpa_fp {#1}
     \tl_if_in:cnTF { l__cooking_units_tmpa_ \l__cooking_units_tmp_unit_tl  _ tl } { \l_tmpa_fp }
       {
-        \tl_set:Nf #2
-          {
-            \fp_eval:c { l__cooking_units_tmpa_ \l__cooking_units_tmp_unit_tl  _ tl }
-          }
+        \__cooking_units_tl_set_fp_and_eval:Nc #2 { l__cooking_units_tmpa_ \l__cooking_units_tmp_unit_tl  _ tl }
       }{
-        \tl_set:Nf #2
+        \__cooking_units_tl_set_fp_and_eval:Nn #2
+          { \l_tmpa_fp * \tl_use:c { l__cooking_units_tmpa_ \l__cooking_units_tmp_unit_tl _ tl }  }
+      }
+  }
+\cs_new:Npn \__cooking_units_calc_for_number_of_persons_and_store_in:NN #1#2
+  {
+    \int_compare:nNnF
+      { \l__cooking_units_calc_for_number_of_persons_int }
+      =
+      { \l__cooking_units_persons_tmp_int }
+      {
+        \__cooking_units_tl_set_fp_and_eval:Nn #1
           {
-            \fp_eval:n
-              {
-                \l_tmpa_fp *
-                \tl_use:c { l__cooking_units_tmpa_ \l__cooking_units_tmp_unit_tl  _ tl }
-              }
+            \l__cooking_units_calc_for_number_of_persons_int /
+            \l__cooking_units_persons_tmp_int *
+            #2
           }
       }
-    \__cooking_units_round_calculated_input:NV #2 #2
   }
-\cs_generate_variant:Nn \__cooking_units_calculate_input_and_store_in:nN { V }
 \cs_new:Npn \__cooking_units_check_number_after_dot:n #1
   {
     \__cooking_units_check_number_after_dot_aux:w #1 . \q_recursion_tail .
@@ -630,33 +848,46 @@
 \cs_new:Npn \__cooking_units_check_number_after_dot_aux:w #1. #2 .
   {
     \quark_if_recursion_tail_stop:n {#2}
-    \int_compare:nNnF
-      { \tl_count:n {#2} } < { \l__cooking_units_significant_figures_plus_one_int }
+    \bool_if:NTF \l__cooking_units_round_to_int_bool
+      { \int_zero:N \l_tmpa_int }
+      { \int_set_eq:NN \l_tmpa_int \l__cooking_units_significant_figures_plus_one_int }
+    \int_compare:nNnTF
+      { \tl_count:n {#2} } < { \l_tmpa_int }
+      { \bool_set_false:N \l_tmpa_bool }
       { \bool_set_true:N \l_tmpa_bool }
     \use_none_delimit_by_q_recursion_stop:w
   }
 \cs_new:Npn \__cooking_units_round_calculated_input:NN #1#2
   {
-    \bool_set_false:N \l_tmpa_bool
     \__cooking_units_check_number_after_dot:n {#2}
     \tl_set:Nf #1
       {
-        \bool_if:NTF \l__cooking_units_round_to_int_bool
-          {
-            \fp_eval:n { round (#2) }
-          }{
-            \bool_if:NTF \l_tmpa_bool
-              {
-                \fp_eval:n { round( #2 ,  \__cooking_units_round_setup:n {#2} ) }
-              }
-              {#2}
-          }
+        \bool_if:NTF \l_tmpa_bool
+          { \fp_eval:n { round ( \__cooking_units_rounding_function:n {#2} ) } }
+          {#2}
      }
   }
 \cs_generate_variant:Nn \__cooking_units_round_calculated_input:NN { NV }
-\cs_new:Npn \__cooking_units_formatiere_fractions:nnn #1#2#3
+\cs_new_protected:Npn \__cooking_units_print_output:N #1
   {
+    \bool_if:NTF \l__cooking_units_using_cutext_bool
+      {
+        \tl_set_eq:NN \l__cooking_units_cutext_tmp_tl #1
+        \__cooking_units_cutext_print_output:NV #1 \l__cooking_units_option_unit_tl
+      }
+      { \__cooking_units_print_nummerical_output:N #1 }
+  }
+\cs_new_protected:Npn \__cooking_units_print_nummerical_output:N #1
+  {
+    \translatelet \l__cooking_units_translation_tmpa_tl { decimal-mark ( cu-unitname ) }
+    \tl_replace_once:NnV #1 { . } \l__cooking_units_translation_tmpa_tl
+    \tl_replace_once:NnV #1 { - } \c__cooking_units_minus_tl
+    #1
+  }
+\cs_new:Npn \__cooking_units_formatiere_fractions:nNN #1#2#3
+  {
     \bool_set_true:N \l__cooking_units_fraction_in_input_bool
+    \bool_if:NT \l_tmpb_bool { \c__cooking_units_minus_tl }
     \tl_if_empty:nF {#1}
       {
         #1
@@ -684,47 +915,56 @@
           }
       }
     }
-\cs_new_protected:Npn \__cooking_units_print_nummerical_output:N #1
+\NewDocumentCommand \cunum { d<> O{} m O{} m }
   {
-%%    \l_@@_tmpa_tl is sehr gefaehrlich hier.
-    \translatelet \l__cooking_units_tmpa_tl { decimal-mark ( cu-unitname ) }
-    \tl_replace_once:NnV #1 { . } \l__cooking_units_tmpa_tl
-    \tl_replace_once:NnV #1 { - } \c__cooking_units_minus_tl
-    #1
-  }
-\NewDocumentCommand \cunum { O{} m O{} m }
-  {
     \group_begin:
-    \__cooking_units_cunum_initialise:nnnn {#1} {#2} {#3} {#4}
+    \__cooking_units_cunum_initialise:nnnnn {#1} {#2} {#3} {#4} {#5}
     \bool_if:NTF \l__cooking_units_parse_input_bool
-      { \__cooking_units_cunum:nnVV {#2} {#3} \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl }
-      { \__cooking_units_cunum_do_not_parse:nnn {#2} {#3} {#4} }
+      { \__cooking_units_parse_and_evaluate_input:n {#3} }
+      { \__cooking_units_cunum_do_not_parse:nnn {#3} {#4} {#5} }
+    \__cooking_units_cunum_print_correct_unit:nVV {#4} \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl
     \group_end:
   }
-\cs_new_protected:Npn \__cooking_units_cunum_initialise:nnnn #1#2#3#4
+\cs_new_protected:Npn \__cooking_units_cunum_initialise:nnnnn #1#2#3#4#5
   {
-    \tl_set:Nn \l__cooking_units_tmp_unit_tl {#4}
+    \__cooking_units_initialise_default:nnn {#1} {#2} {#5}
+    \__cooking_units_initialise_unit_change:nnn {#1} {#2} {#5}
+    \__cooking_units_initialise_after_unit_change:nnn {#1} {#2} {#5}
+  }
+\cs_new_protected:Npn \__cooking_units_initialise_default:nnn #1#2#3
+  {
+    \tl_set:Nn \l__cooking_units_tmp_unit_tl {#3}
     \__cooking_units_error_if_unit_not_defined:V \l__cooking_units_tmp_unit_tl
-    \tl_if_empty:nF {#1}
-      { \keys_set_groups:nnn { cooking-units } { change-unit } {#1} }
-    \bool_if:NTF \l__cooking_units_convert_to_eV_bool
+    \bool_set_false:N \l__cooking_units_special_sign_bool
+    \bool_set_false:N \l__cooking_units_error_bool
+    \bool_set_false:N \l__cooking_units_parse_range_bool
+  }
+\cs_generate_variant:Nn \__cooking_units_initialise_default:nnn { nnV}
+\cs_new_protected:Npn \__cooking_units_initialise_unit_change:nnn #1#2#3
+  {
+    \tl_if_empty:nF {#2}
+      { \keys_set_groups:nnn { cooking-units } { change-unit } {#2} }
+    \bool_if:NT \l__cooking_units_convert_to_eV_bool
       { \__cooking_units_convert_to_eV: }
+    \prop_get:NVN \l__cooking_units_change_unit_prop \l__cooking_units_tmp_unit_tl \l__cooking_units_option_unit_tl
+    \quark_if_no_value:NT \l__cooking_units_option_unit_tl
+      { \tl_set_eq:NN \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl }
+  }
+\cs_new_protected:Npn \__cooking_units_initialise_after_unit_change:nnn #1#2#3
+  {
+    \IfNoValueF {#1}
+      { \__cooking_units_reference_label_and_persons:n {#1} }
+    \clist_if_empty:cF { l__cooking_units_predefined_option_ \l__cooking_units_option_unit_tl _clist }
       {
-        \prop_get:NVN \l__cooking_units_change_unit_prop \l__cooking_units_tmp_unit_tl \l__cooking_units_option_unit_tl
-        \quark_if_no_value:NT \l__cooking_units_option_unit_tl
-          {
-            \tl_set_eq:NN \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl
-          }
         \keys_set_filter:nnv
           { cooking-units }
           { change-unit }
           { l__cooking_units_predefined_option_ \l__cooking_units_option_unit_tl _clist }
-        \tl_if_empty:nF {#1}
-          { \keys_set_filter:nnn { cooking-units } { change-unit } {#1} }
       }
-    \bool_set_false:N \l__cooking_units_special_sign_bool
-    \bool_set_false:N \l__cooking_units_error_bool
-    \bool_set_false:N \l__cooking_units_parse_range_bool
+    \tl_if_empty:nF {#2}
+      { \keys_set_filter:nnn { cooking-units } { change-unit } {#2} }
+    \bool_set:Nn \l__cooking_units_calc_persons_tmp_bool
+      { \l__cooking_units_calc_because_ref_was_given_bool && \l__cooking_units_calc_for_persons_bool }
   }
 \cs_new:Npn \__cooking_units_cunum_do_not_parse:nnn #1#2#3
   {
@@ -734,9 +974,8 @@
         \char_set_catcode_ignore:N \ %
       } {#1}
     \l_tmpa_tl
-    \__cooking_units_cunum_print_correct_unit:nnn {#2} {#3} {#3}
   }
-\cs_new:Npn \__cooking_units_cunum:nnNN #1#2#3#4
+\cs_new:Npn \__cooking_units_parse_and_evaluate_input:n #1
   {
     \tl_set_rescan:Nnn \l_tmpa_tl
       {
@@ -753,9 +992,7 @@
           }
         \__cooking_units_cunum_parse_input:V \l_tmpa_tl
       }
-    \__cooking_units_cunum_print_correct_unit:nnn {#2} {#3} {#4}
   }
-\cs_generate_variant:Nn \__cooking_units_cunum:nnNN { nnVV }
 \cs_new:Npn \__cooking_units_cunum_print_correct_unit:nnn #1#2#3
   {
     \tl_if_empty:nF {#1} { \phantom {#1} }
@@ -762,6 +999,7 @@
     \tl_use:N \l__cooking_units_value_unit_space_tl
     \bool_if:nTF
       {
+        ! \l__cooking_units_parse_input_bool ||
         \l__cooking_units_fraction_in_input_bool ||
         \l__cooking_units_special_sign_bool
       }
@@ -768,17 +1006,18 @@
       { \translate { #3 ( cu-unit ) } }
       { \translate { #2 ( cu-unit ) } }
   }
+\cs_generate_variant:Nn \__cooking_units_cunum_print_correct_unit:nnn { nVV }
 \NewDocumentCommand \cudefinekeys { m m }
   {
     \bool_set_false:N \l__cooking_units_single_key_bool
-    \cukeys_define_keys_and_single_keys:nn {#1} {#2}
+    \__cooking_units_cukeys_define_keys_and_single_keys:nn {#1} {#2}
   }
 \NewDocumentCommand \cudefinesinglekey { m m }
   {
     \bool_set_true:N \l__cooking_units_single_key_bool
-    \cukeys_define_keys_and_single_keys:nn {#1} {#2}
+    \__cooking_units_cukeys_define_keys_and_single_keys:nn {#1} {#2}
   }
-\cs_new:Npn \cukeys_define_keys_and_single_keys:nn #1#2
+\cs_new:Npn \__cooking_units_cukeys_define_keys_and_single_keys:nn #1#2
   {
     \__cooking_units_error_if_unit_not_defined:n {#1}
     \tl_if_blank:nF {#2}
@@ -978,10 +1217,26 @@
     \prop_get:cnN { l__cooking_units_cukeys_ #1 _prop } { Erstes Ding } \l__cooking_units_tmp_unit_tl
     \prop_get:cVN { l__cooking_units_cukeys_ #1 _prop } \l__cooking_units_tmp_unit_tl \l_tmpa_fp
   }
+\NewDocumentCommand \declarecookingunit { o m }
+  {
+    \clist_if_in:NnTF \g__cooking_units_list_of_defined_units_clist {#2}
+      { \msg_info:nnn { cooking-units } { redefine-unit } {#2} }
+      { \__cooking_units_new_cooking_unit:nn {#1} {#2} }
+    \__cooking_units_set_cooking_unit:nn {#1} {#2}
+  }
 \NewDocumentCommand \newcookingunit { o m }
   {
     \__cooking_units_new_cooking_unit:nn {#1} {#2}
+    \__cooking_units_set_cooking_unit:nn {#1} {#2}
   }
+\NewDocumentCommand \providecookingunit { o m }
+  {
+    \clist_if_in:NnF \g__cooking_units_list_of_defined_units_clist {#2}
+      {
+        \__cooking_units_new_cooking_unit:nn {#1} {#2}
+        \__cooking_units_set_cooking_unit:nn {#1} {#2}
+      }
+  }
 \cs_new:Npn \__cooking_units_new_cooking_unit:nn #1#2
   {
     \clist_if_in:NnTF \g__cooking_units_list_of_defined_units_clist {#2}
@@ -991,7 +1246,7 @@
         \tl_new:c { l__cooking_units_tmpa_  #2 _tl }
         \tl_set_eq:cN { l__cooking_units_tmpa_  #2 _tl } \c_one_fp
         \clist_new:c { l__cooking_units_predefined_option_#2_clist }
-        \keys_define:nn { cooking - units }
+        \keys_define:nn { cooking-units }
           {
             set-option-for-#2 .clist_set:c = { l__cooking_units_predefined_option_#2_clist } ,
             add-option-for-#2 .code:n =
@@ -999,37 +1254,67 @@
           }
         \prop_new:c { l__cooking_units_cukeys_ #2 _prop }
         \tl_new:c { l__cooking_units_cu_unit_ #2 _tl }
-        \IfNoValueTF {#1}
-          {
-            \tl_set:cn { l__cooking_units_cu_unit_ #2 _tl } {#2}
-            \newtranslation { #2 ( cu-unit ) } {#2}
-          }{
-            \tl_set:cn { l__cooking_units_cu_unit_ #2 _tl } {#1}
-            \newtranslation { #2 ( cu-unit ) } {#1}
-          }
       }
   }
-\NewDocumentCommand \cutext { O{} m m }
+\cs_new:Npn \__cooking_units_set_cooking_unit:nn #1#2
   {
+    \IfNoValueTF {#1}
+      {
+        \tl_set:cn { l__cooking_units_cu_unit_ #2 _tl } {#2}
+        \deftranslation { #2 ( cu-unit ) } {#2}
+      }{
+        \tl_set:cn { l__cooking_units_cu_unit_ #2 _tl } {#1}
+        \deftranslation { #2 ( cu-unit ) } {#1}
+      }
+  }
+\NewDocumentCommand \cutext { d<> O{} m m }
+  {
     \group_begin:
-      \bool_set_false:N \l__cooking_units_cutext_uppercase_word_bool
-      \__cooking_units_cutext_default:nnn {#1} {#2} {#3}
-      \__cooking_units_cutext_print_correct_unitname:nn {#2} {#3}
+      \__cooking_units_cutext_initialise:nnn {#1} {#2} {#4}
+      \bool_if:NTF \l__cooking_units_cutext_to_cunum_bool
+        { \cunum {#3} {#4} }
+        {
+          \bool_set_false:N \l__cooking_units_cutext_uppercase_word_bool
+          \__cooking_units_cutext:nnnn {#1} {#2} {#3} {#4}
+        }
     \group_end:
   }
-\NewDocumentCommand \Cutext { O{} m m }
+\NewDocumentCommand \Cutext { d<> O{} m m }
   {
     \group_begin:
-      \bool_set_true:N \l__cooking_units_cutext_uppercase_word_bool
-      \__cooking_units_cutext_default:nnn {#1} {#2} {#3}
-      \__cooking_units_cutext_print_correct_unitname:nn {#2} {#3}
+      \__cooking_units_cutext_initialise:nnn {#1} {#2} {#4}
+      \bool_if:NTF \l__cooking_units_cutext_to_cunum_bool
+        { \cunum {#3} {#4} }
+        {
+          \bool_set_true:N \l__cooking_units_cutext_uppercase_word_bool
+          \__cooking_units_cutext:nnnn {#1} {#2} {#3} {#4}
+        }
     \group_end:
   }
+\cs_new_protected:Npn \__cooking_units_cutext_initialise:nnn #1#2#3
+  {
+    \bool_set_true:N \l__cooking_units_using_cutext_bool
+    \__cooking_units_initialise_default:nnn {#1} {#2} {#3}
+    \bool_if:NTF \l__cooking_units_cutext_change_unit_bool
+      { \__cooking_units_initialise_unit_change:nnn {#1} {#2} {#3} }
+      { \tl_set_eq:NN \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl }
+    \__cooking_units_initialise_after_unit_change:nnn {#1} {#2} {#3}
+  }
+\cs_new:Npn \__cooking_units_cutext:nnnn #1#2#3#4
+  {
+    \bool_if:nTF { \l__cooking_units_cutext_old_bool || !\l__cooking_units_parse_input_bool }
+      {
+        \__cooking_units_cutext_default:nnn {#2} {#3} {#4}
+        \__cooking_units_cutext_print_correct_unitname:nnn {#3} {#4} {#4}
+      }{
+        \__cooking_units_parse_and_evaluate_input:n {#3}
+        \__cooking_units_cutext_print_correct_unitname:VVV
+          \l__cooking_units_cutext_tmp_tl \l__cooking_units_option_unit_tl \l__cooking_units_tmp_unit_tl
+      }
+  }
 \cs_new:Npn \__cooking_units_cutext_default:nnn #1#2#3
   {
     \__cooking_units_error_if_unit_not_defined:n {#3}
-    \tl_if_empty:nF {#1}
-      { \keys_set:nn { cooking-units } {#1} }
     \bool_if:NT \l__cooking_units_convert_to_eV_bool
       { \__cooking_units_convert_to_eV: }
     \bool_if:NTF \l__cooking_units_parse_input_bool
@@ -1040,7 +1325,7 @@
             \tl_replace_once:NVn \l_tmpb_tl \l__cooking_units_input_range_sign_tl { \q__cooking_units_range }
             \__cooking_units_cutext_parse_range:Vn \l_tmpb_tl {#3}
           }{
-            \__cooking_units_cutext_print_nummerical_output:Nn \l_tmpb_tl {#3}
+            \__cooking_units_cutext_print_output:Nn \l_tmpb_tl {#3}
           }
       }
       {#2}
@@ -1054,19 +1339,12 @@
   {
     \tl_set:Nn \l__cooking_units_tmpa_tl {#2}
     \tl_set:Nn \l__cooking_units_tmpb_tl {#3}
-    \__cooking_units_cutext_print_nummerical_output:Nn \l__cooking_units_tmpa_tl {#1}
+    \__cooking_units_cutext_print_output:Nn \l__cooking_units_tmpa_tl {#1}
     \tl_use:N \l__cooking_units_cutext_range_sign_tl
-    \__cooking_units_cutext_print_nummerical_output:Nn \l__cooking_units_tmpb_tl {#1}
+    \__cooking_units_cutext_print_output:Nn \l__cooking_units_tmpb_tl {#1}
   }
-\cs_new:Npn \__cooking_units_cutext_just_print_number_correctly:N #1
+\cs_new_protected:Npn \__cooking_units_cutext_print_output:Nn #1#2
   {
-    \translatelet \l_tmpa_tl { decimal-mark ( cu-unitname ) }
-    \tl_replace_once:NnV #1 { . } \l_tmpa_tl
-    \tl_replace_once:NnV #1 { - } \c__cooking_units_minus_tl
-    #1
-  }
-\cs_new_protected:Npn \__cooking_units_cutext_print_nummerical_output:Nn #1#2
-  {
     \bool_if:NTF \g__cooking_units_load_if_opt_numeral_bool
       {
         \__cooking_units_if_integer_and_parse:VTF #1
@@ -1075,36 +1353,47 @@
               {
                 \fp_compare:nNnTF {#1} = { \c_one_fp }
                   {
-                    \translatelet \l_tmpa_tl { #2 (cu-unitgender) }
-                    \translatelet \l_tmpa_tl { one (\l_tmpa_tl) (cu-unitname) }
+                    \translatelet \l__cooking_units_translation_tmpa_tl { #2 (cu-unitgender) }
+                    \translatelet \l__cooking_units_translation_tmpa_tl
+                      { one (\l__cooking_units_translation_tmpa_tl) (cu-unitname) }
                     \bool_if:NTF \l__cooking_units_cutext_uppercase_word_bool
                       {
-                        \exp_args:Nf \tl_to_uppercase:n { \tl_head:V \l_tmpa_tl }
-                        \tl_tail:V \l_tmpa_tl
+                        \exp_args:Nf \tl_to_uppercase:n { \tl_head:V \l__cooking_units_translation_tmpa_tl }
+                        \tl_tail:V \l__cooking_units_translation_tmpa_tl
                       }
-                      { \l_tmpa_tl }
+                      { \l__cooking_units_translation_tmpa_tl }
                   }{
                     \bool_if:NTF \l__cooking_units_cutext_uppercase_word_bool
                       { \Numberstringnum {#1} }
                       { \numberstringnum {#1} }
                   }
-              }{ \__cooking_units_cutext_just_print_number_correctly:N #1 }
-          }{ \__cooking_units_cutext_just_print_number_correctly:N #1 }
+              }{ \__cooking_units_print_nummerical_output:N #1 }
+          }{ \__cooking_units_print_nummerical_output:N #1 }
       }
-      { \__cooking_units_cutext_just_print_number_correctly:N #1 }
+      { \__cooking_units_print_nummerical_output:N #1 }
   }
-\cs_new:Npn \__cooking_units_cutext_print_correct_unitname:nn #1#2
+\cs_generate_variant:Nn \__cooking_units_cutext_print_output:Nn { NV }
+\cs_new:Npn \__cooking_units_cutext_print_correct_unitname:nnn #1#2#3
   {
-    \space
-    \__cooking_units_if_integer_and_parse:nTF {#1}
+    \l__cooking_units_cutext_space_tl
+    \bool_if:nTF
       {
-        \fp_compare:nNnTF {#1} = { \c_one_fp }
-          { \translate  { #2 (cu-unitname) } }
+        ! \l__cooking_units_parse_input_bool ||
+        \l__cooking_units_fraction_in_input_bool ||
+        \l__cooking_units_special_sign_bool
+      }
+      { \translate { #3 (cu-unitname pl) } }
+      {
+        \__cooking_units_if_integer:nTF {#1}
+          {
+            \fp_compare:nNnTF {#1} = { \c_one_fp }
+              { \translate  { #2 (cu-unitname) } }
+              { \translate  { #2 (cu-unitname pl) } }
+          }
           { \translate  { #2 (cu-unitname pl) } }
-      }{
-        \translate { #2 (cu-unitname pl) }
       }
   }
+\cs_generate_variant:Nn \__cooking_units_cutext_print_correct_unitname:nnn { VVV }
 \NewDocumentCommand \cufrac { O{} m }
   {
     \msg_error:nnnn { cooking-units } { obsolete-command } { \cufrac } { \cuam }
@@ -1146,59 +1435,96 @@
     \hbox_to_wd:nn { \l__cooking_units_mixed_frac_dim } { }
     \__cooking_units_frac:nn {#2} {#3}
   }
-\NewDocumentCommand \cuam { s O{} m }
+\tl_new:N \l__cooking_units_cuam_marker_tl
+\tl_set:Nn \l__cooking_units_cuam_marker_tl { __cooking_units_cunum }
+\tl_new:c { l__cooking_units_tmpa_ \l__cooking_units_cuam_marker_tl  _ tl }
+\tl_set:cn { l__cooking_units_tmpa_ \l__cooking_units_cuam_marker_tl  _ tl } { \c_one_fp }
+\clist_new:c { l__cooking_units_predefined_option_ \l__cooking_units_cuam_marker_tl _clist }
+\NewDocumentCommand \cuam { d<> O{} m }
   {
     \group_begin:
-    \tl_if_empty:nF {#2}
-      { \keys_set:nn { cooking-units } {#2} }
-    \IfBooleanTF {#1}
-      { \__cooking_units_cuam_star:n {#3} }
-      { \__cooking_units_cuam_star:n {#3} }
+    \__cooking_units_cuam_initialise:nnn {#1} {#2} {}
+    \bool_if:NTF \l__cooking_units_parse_input_bool
+      {
+        \bool_if:NTF \l__cooking_units_cuam_old_bool
+          { \__cooking_units_cuam_old:n {#3} }
+          { \__cooking_units_parse_and_evaluate_input:n {#3}  }
+      }
+      { \__cooking_units_cunum_do_not_parse:nnn {#3} {} {} }
     \group_end:
   }
-\cs_new:Npn \__cooking_units_cuam_star:n #1
+\cs_new_protected:Npn \__cooking_units_cuam_initialise:nnn #1#2#3
   {
+    \tl_set_eq:NN \l__cooking_units_tmp_unit_tl \l__cooking_units_cuam_marker_tl
+    \tl_set_eq:NN \l__cooking_units_option_unit_tl \l__cooking_units_cuam_marker_tl
+    \__cooking_units_initialise_after_unit_change:nnn {#1} {#2} {#3}
+  }
+\cs_new:Npn \__cooking_units_cuam:n #1
+  {
     \tl_set_rescan:Nnn \l_tmpa_tl
       {
         \char_set_catcode_letter:N \_ %
+        \char_set_catcode_ignore:N \ %
+        \char_set_catcode_other:N ? %
+      } {#1}
+    \__cooking_units_cuam_parse:V \l_tmpa_tl
+  }
+\cs_new:Npn \__cooking_units_cuam_old:n #1
+  {
+    \tl_set_rescan:Nnn \l_tmpa_tl
+      {
+        \char_set_catcode_letter:N \_ %
         \char_set_catcode_ignore:N\ %
       } {#1}
-    \__cooking_units_cuam_star_parse:V \l_tmpa_tl
+    \__cooking_units_cuam_old_parse:V \l_tmpa_tl
   }
-\cs_new_protected:Npn \__cooking_units_cuam_star_parse:n #1
+\cs_new_protected:Npn \__cooking_units_cuam_old_parse:n #1
   {
     \tl_if_in:nVTF {#1} \l__cooking_units_input_range_sign_tl
       {
         \tl_set:Nn \l_tmpa_tl {#1}
         \tl_replace_once:NVn \l_tmpa_tl \l__cooking_units_input_range_sign_tl { \q__cooking_units_range }
-        \__cooking_units_cuam_star_parse_range:V \l_tmpa_tl
+        \__cooking_units_cuam_old_parse_range:V \l_tmpa_tl
       }{
         \tl_if_in:nnTF {#1} { / }
           {
             \tl_if_in:nnTF {#1} { _ }
-              { \__cooking_units_cuam_star_parse_mixed_frac:www #1 \q_stop }
-              { \__cooking_units_cuam_star_parse_frac:ww #1 \q_stop }
+              { \__cooking_units_cuam_old_parse_mixed_frac:www #1 \q_stop }
+              { \__cooking_units_cuam_old_parse_frac:ww #1 \q_stop }
           }{
             \tl_if_in:nnTF {#1} { _ }
               { \msg_error:nnn { cooking-units } { missing-slash } {#1} }
-              { \__cooking_units_cuam_star_parse_scale:n {#1} }
+              { \__cooking_units_cuam_old_parse_scale:n {#1} }
           }
       }
   }
-\cs_generate_variant:Nn \__cooking_units_cuam_star_parse:n { V }
-\cs_new:Npn \__cooking_units_cuam_star_parse_range:n #1
+\cs_generate_variant:Nn \__cooking_units_cuam_old_parse:n { V }
+\cs_new:Npn \__cooking_units_cuam_parse_range:n #1
   {
-    \__cooking_units_cuam_star_parse_range_aux:ww #1 \q_nil
+    \__cooking_units_cuam_parse_range_aux:ww #1 \q_nil
   }
-\cs_generate_variant:Nn \__cooking_units_cuam_star_parse_range:n { V }
-\cs_new:Npn \__cooking_units_cuam_star_parse_range_aux:ww #1 \q__cooking_units_range #2 \q_nil
+\cs_generate_variant:Nn \__cooking_units_cuam_parse_range:n { V }
+\cs_new:Npn \__cooking_units_cuam_parse_range_aux:ww #1 \q__cooking_units_range #2 \q_nil
   {
+    \__cooking_units_parse_input_and_safe_in:nN {#1} \l_tmpa_tl
+    \__cooking_units_parse_input_and_safe_in:nN {#2} \l_tmpb_tl
+    \__cooking_units_print_nummerical_output:N \l_tmpa_tl
+    \l__cooking_units_cunum_range_sign_tl
+    \__cooking_units_print_nummerical_output:N \l_tmpb_tl
+  }
+\cs_new:Npn \__cooking_units_cuam_old_parse_range:n #1
+  {
+    \__cooking_units_cuam_old_parse_range_aux:ww #1 \q_nil
+  }
+\cs_generate_variant:Nn \__cooking_units_cuam_old_parse_range:n { V }
+\cs_new:Npn \__cooking_units_cuam_old_parse_range_aux:ww #1 \q__cooking_units_range #2 \q_nil
+  {
     #1 \l__cooking_units_cunum_range_sign_tl #2
   }
-\cs_new:Npn \__cooking_units_cuam_star_parse_scale:n #1 {#1}
-\cs_new:Npn \__cooking_units_cuam_star_parse_frac:ww #1/#2 \q_stop
+\cs_new:Npn \__cooking_units_cuam_old_parse_scale:n #1 {#1}
+\cs_new:Npn \__cooking_units_cuam_old_parse_frac:ww #1/#2 \q_stop
   { \__cooking_units_frac:nn {#1} {#2} }
-\cs_new:Npn \__cooking_units_cuam_star_parse_mixed_frac:www #1_#2/#3 \q_stop
+\cs_new:Npn \__cooking_units_cuam_old_parse_mixed_frac:www #1_#2/#3 \q_stop
   {
     #1
     \hbox_to_wd:nn { \l__cooking_units_mixed_frac_dim } { }



More information about the tex-live-commits mailing list