From cd08665896fd28bcf3597c5e45969b3a5209a794 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Mon, 14 Nov 2016 22:34:47 +0000
Subject: cooking-units (14nov16)

git-svn-id: svn://tug.org/texlive/trunk@42507 c570f23f-e606-0410-a88d-b1316a301751
---
 .../tex/latex/cooking-units/cooking-units.sty      | 698 +++++++++++++++------
 1 file changed, 512 insertions(+), 186 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty')

diff --git a/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty b/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
index efbc1d03db3..701f8c3a718 100644
--- a/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
+++ b/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
@@ -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,16 +90,24 @@
 \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 { -- }
 \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@TS1 }
     {
@@ -121,12 +132,15 @@
 }
 \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 }
 \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,35 +333,35 @@
     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 \
     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,24 +439,73 @@
     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}
       { \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: }
   }
@@ -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,19 +682,27 @@
     \__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
   {
     \__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
-  {
-%%    \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 }
+\NewDocumentCommand \cunum { d<> 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
+  {
+    \__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 {#4}
+    \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,32 +992,32 @@
           }
         \__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} }
     \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
       }
       { \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,9 +1217,25 @@
     \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
   {
@@ -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,18 +1339,11 @@
   {
     \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}
-  }
-\cs_new:Npn \__cooking_units_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__cooking_units_minus_tl
-    #1
+    \__cooking_units_cutext_print_output:Nn \l__cooking_units_tmpb_tl {#1}
   }
-\cs_new_protected:Npn \__cooking_units_cutext_print_nummerical_output:Nn #1#2
+\cs_new_protected:Npn \__cooking_units_cutext_print_output:Nn #1#2
   {
     \bool_if:NTF \g__cooking_units_load_if_opt_numeral_bool
       {
@@ -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_parse_range_aux:ww #1 \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_star_parse_range_aux:ww #1 \q_nil
+    \__cooking_units_cuam_old_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_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 } { }
-- 
cgit v1.2.3

