texlive[53403] Master/texmf-dist: cooking-units (14jan20)
commits+karl at tug.org
commits+karl at tug.org
Tue Jan 14 22:51:33 CET 2020
Revision: 53403
http://tug.org/svn/texlive?view=revision&revision=53403
Author: karl
Date: 2020-01-14 22:51:33 +0100 (Tue, 14 Jan 2020)
Log Message:
-----------
cooking-units (14jan20)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/cooking-units/README.md
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/source/latex/cooking-units/cooking-units.ins
trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
Modified: trunk/Master/texmf-dist/doc/latex/cooking-units/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/cooking-units/README.md 2020-01-14 21:51:18 UTC (rev 53402)
+++ trunk/Master/texmf-dist/doc/latex/cooking-units/README.md 2020-01-14 21:51:33 UTC (rev 53403)
@@ -55,7 +55,7 @@
-------
This material is subject to the LaTeX Project Public License 1.3c or later. See
- https://ctan.org/license/lppl1.3c
+ https://www.latex-project.org/lppl/
for the details of that license.
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 2020-01-14 21:51:18 UTC (rev 53402)
+++ trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.dtx 2020-01-14 21:51:33 UTC (rev 53403)
@@ -1,8 +1,8 @@
% \iffalse meta-comment
% !TEX encoding = UTF-8 Unicode
% !TEX program = pdfLaTeX
+%^^A PdfLaTeX-dev
%
-%
%<*internal>
\iffalse
%</internal>
@@ -65,7 +65,7 @@
-------
This material is subject to the LaTeX Project Public License 1.3c or later. See
- https://ctan.org/license/lppl1.3c
+ https://www.latex-project.org/lppl/
for the details of that license.
@@ -82,7 +82,7 @@
%\keepsilent
\askforoverwritefalse
\preamble
-Copyright (C) 2016--2018 by Ben Vitecek (current Maintainer)
+Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -89,7 +89,7 @@
version 1.3c of this license or (at your option) any later
version. The latest version of this license is in:
- https://ctan.org/license/lppl1.3c
+ https://www.latex-project.org/lppl/
and version 1.3c or later is part of all distributions of
LaTeX version 2008-05-04 or later.
@@ -136,7 +136,7 @@
]{l3doc}
\usepackage[utf8]{inputenc}
\usepackage[main=english]{babel}
-\usepackage[use-numerals=true]{cooking-units}
+\usepackage[use-fmtcount-numerals=true]{cooking-units}
\usepackage{tikzsymbols}
\usepackage{listings}
\usepackage{environ}
@@ -146,6 +146,7 @@
\usepackage{siunitx}
\usepackage{totalcount}
\usepackage{microtype}
+\usepackage{enumitem}
\newcounter{CookingUnitsCounter}
@@ -168,15 +169,21 @@
\DeclareSIUnit{\stone}{st}
\DeclareSIUnit{\st}{\stone}
\DeclareSIUnit{\stick}{st}
+\DeclareSIUnit{\inch}{in}
\cusetup{print-numerals=false}
%\EnableCrossrefs
+\newcommand\US{$^{\mathrm{U.S.}}$}
-%\newcommand\TODO[1]{\footnote{\textcolor{red}{#1}}}
+
\ExplSyntaxOn
+\NewDocumentCommand \cookingunitsToDo { m }
+ {
+% \marginpar { \textcolor{red}{#1} }
+ }
\clist_new:N \l_cookingunits_list_of_defined_befehlen_clist
@@ -200,13 +207,21 @@
culabel,
curef,
cudefinephrase,
+ declarecookingderivatives ,
+ cufrac ,
+ cusetoptionfor, cuaddoptionfor, cuclearoptionfor,
+ cudeclareunitgroup, cuaddtounitgroup, cuclearunitgroup
}
\NewDocumentCommand \mycs { m }
{
\clist_if_in:NnTF \l_cookingunits_list_of_defined_befehlen_clist {#1}
- { \cs{\textcolor{blue}{#1}} }
- { \ERROR }
+ {
+ \cs_if_exist:cTF {#1}
+ { \cs{\textcolor{blue}{#1}} }
+ { \mycsERRORII }
+ }
+ { \mycsERROR }
}
\newcommand\opt{\texttt}
\newcommand\myunit{\texttt}
@@ -235,7 +250,7 @@
\NewDocumentCommand \PrintGroup { m }
{
\mygroup {#1} &
- \seq_use:cn { l__cookingunits_group_ #1 _seq } { ,~ }
+ \texttt{\seq_use:cn { l__cookingunits_group_ #1 _seq } { \textrm{,~} }}
}
\NewDocumentCommand \DeactivateForbiddenUnitError { }
@@ -247,7 +262,8 @@
%% Allyourwhitespacearebelongtous (too long)
%% 42
%% Miep!
-\NewDocumentCommand \dothewhitespace { O{ Ducks } }
+%% Ducks
+\NewDocumentCommand \dothewhitespace { O{ cup~of~tea } }
{
\textcolor{white} {#1} \\
}
@@ -331,6 +347,7 @@
\ProvideDocumentEnvironment{cuexamplecode}{}{}{}{}
+
\NewDocumentEnvironment { cuexample } { }
{
\paragraph{Example:}
@@ -346,7 +363,14 @@
\paragraph{Note:}
}{ }
+\NewEnviron { cuenumnote }
+ {
+ \begin{enumerate}[label={Note \space \arabic*:}]
+ \BODY
+ \end{enumerate}
+ }
+
\NewDocumentEnvironment { cuinterest } { m }
{
\par \bigskip
@@ -569,9 +593,15 @@
culabel,
curef,
cudefinephrase,
+ declarecookingderivatives
}
}
+\newcommand\eneunit[3]{\sfrac{#1\,#2${}^2$}{#3${}^2$}}
+%% Can overflow and takes too long, hard code it
+%\declarecookingderivatives{kg,m,s}{#1*#2-#3}{ (#1)*(#2)^2/(#3)^2 } {\eneunit{#1}{#2}{#3}}
+\newcookingunit[\eneunit{kg}{m}{s}]{kg*m-s}
+\newcookingunit[\eneunit{oz}{in}{min}]{oz*in-min}
\newcookingunit {st}
\newcookingunit [\ensuremath{ {} ^ { \circ } }\kern-\scriptspace R{\text{\o}}] {Ro}
\newcookingunit {ft}
@@ -585,6 +615,9 @@
{
{Ro} { #1*21/40 + 7.5 }
}
+
+
+
\cusetup
{
commands-add-hook = {\stepcounter{CookingUnitsCounter}} ,
@@ -592,7 +625,7 @@
cutext-add-hook = {\stepcounter{cutextCounter}} ,
Cutext-add-hook = {\stepcounter{CutextCounter}} ,
cuam-add-hook = {\stepcounter{cuamCounter}} ,
- set-option-for-Ro = { round-to-int = true } ,
+ set-option-for-Ro = { round-precision= 0 } ,
% add-unit-to-group = { weight = {st} , temperature = {Ro} }
}
@@ -768,11 +801,14 @@
% \begin{documentation}
% \begin{abstract}
% 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
+% between them and change your recipes to a given
% number of persons.
+%
+% For not implemented units or differences between Imperial and U.S.\ unit
+% you may have a look at \cref{sec:other-units}.
+%
% 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.}
+% cookery books (and not e.g. scientific texts; use e.g.\ \pkg{siunitx} for those).
%
% Please read through the section \enquote{Important Changes}
% \end{abstract}
@@ -779,49 +815,10 @@
%
% \tableofcontents
%
-% \begin{comment}
-% \begin{myde}
-% \cusetup{print-numerals=true,use-phrases=true}
-% \cunum[convert-to-eV=true]{1}{m} \\
-% \cunum[convert-to-eV=true]{1}{m} \\
-% \cuam{6} Eier \\
-% \cuam{12} Eier \\
-% \cuam{18} Eier \\
-% \cuam{132--168} Eier \\
-% \cuam{12--60} Eier \\
-% \cuam{12--24} Eier \\
-% \cuam{12--24.2} Eier \\
-% \cuam{24--12} Eier \\
-% \cuam{18--6} Eier \\
-% \cuam[recalculate-amount=true, set-number-of-persons=10, label=Hallo*4, ref=Hallo]{24} Eier \\
-% \cuam[recalculate-amount=true, set-number-of-persons=10, ref=Hallo, use-phrases=false]{24} Eier (phrase-false)\\
-% \cuam[recalculate-amount=true, set-number-of-persons=10, ref=Hallo, parse-number=false]{12--24} Eier (no parse)\\
-% \cuam{23} Eier \\
-% \cuam{60} Eier \\
-% \cuam{62} Eier \\
-% \cuam{12--60} Eier \\
-% \cuam{288} Eier \\
-% \end{myde}
-%
-% \begingroup
-% \cusetup{print-numerals=true}
-% \cutext[convert-to-eV=true]{1}{m} \\
-% \cunum[convert-to-eV=true]{1}{m} \\
-% \cuam{6} Eier \\
-% \cuam{12} Eier \\
-% \cuam{18} Eier \\
-% \cuam[recalculate-amount=true, set-number-of-persons=10, ref=Hallo]{24} Eier \\
-% \cuam[recalculate-amount=true, set-number-of-persons=10, ref=Hallo, use-phrases=false]{24} Eier \\
-% \cuam{23} Eier \\
-% \cuam{60} Eier \\
-% \cuam{62} Eier \\
-% \endgroup
-% \end{comment}
-%
% \section{Introduction}
%
%
-% While writing on a cookery book I used -- for reasons whatsoever --
+% While writing on a cookery book I used -- for some reasons whatsoever --
% three different units for weight: kilogram (kg), gram (g) and
% decagram (dag, or older: dkg). Later my mother told me that she
% doesn't like it if a cookery book uses more than two different units
@@ -828,13 +825,13 @@
% (for weight in this case). Happily I hardly used Decagram and
% therefore didn't have many problems changing the units. But, well
% \dots\ I am using \LaTeX\ and changing those units by hand seemed
-% not very \LaTeX\-like, so I started writing some code to convert
+% not very \LaTeX-like, so I started writing some code to convert
% units. I expanded the code, rewrote it in \LaTeX3 (which is much
% more pleasant than \LaTeXe) and here it is.
%
%
-% \subsection{Important Changes}
-%
+% \begin{comment}
+% \subsection{Overview}
% \begin{description}
% \item[Language] I am now using the \pkg{translations} package
% and I hope it makes things easier. As such, declaring the used language
@@ -851,23 +848,25 @@
% tries to \enquote{fix} this idea (at least make it work). If any problems occur
% (for this specific case or in general) please feel free to contact me.
% \end{description}
+% \end{comment}
%
%
+%
% \subsection{Supported languages}
-%
+% \cookingunitsToDo{Passt.}
% \begin{itemize}
% \item German
% \item English
% \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?
+% Want to contribute a new language or make a correction to an existing one?
% See \cref{sec:bug-feed} for more details. Wanna just check the
% existing translations? See \cref{sec:Translations}.
%
% \section {The Commands}
% \label{sec:commands}
+% \cookingunitsToDo{Passt.}
%
-%
% This package offers the following commands for unit printing (and
% converting):
%
@@ -924,11 +923,14 @@
% 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 written out with
-% \lstinline|\Cutext| capitalizing the first letter (using package
-% \pkg{fmtcount}).
+% (mixed) fractions and |--| for ranges). Furthermore, \cCutext\ allow
+% the usages of numerals (see \cref{sec:load-time-options} for more information).
+%^^A if the package
+%^^A option \opt{use-fmtcount-numerals} (see \cref{sec:load-time-options})
+%^^A is used, integers below a specific integer
+%^^A (by default 13; see \opt{use-numerals-below}) are written out with
+%^^A \lstinline|\Cutext| capitalizing the first letter (using package
+%^^A \pkg{fmtcount}).
%
%
% \begin{cuexamplecode}
@@ -938,7 +940,7 @@
% \cutext{12}{l} \\
% \Cutext{13}{l}
% \end{cuexamplecode}
-% and using package option \opt{use-numerals=true}
+% and using (e.g.) package option \opt{use-fmtcount-numerals=true}
% \cusetup{print-numerals=true}
% \begin{cuexamplecode}
% \cutext{1}{l} \\
@@ -949,6 +951,9 @@
% \Cutext{13}{l}
% \end{cuexamplecode}
% \cusetup{print-numerals=false}
+% You can customize the numeral functions used with \opt{numeral-function} and
+% \opt{Numeral-function}.
+%
% Furthermore,
% since v1.10 \cCutext\ also allow their units to be changed (this behavior
% can be altered using \opt{cutext-change-unit}):
@@ -976,7 +981,7 @@
% \end{cuexamplecode}
%
% Furthermore it allows the concept of \enquote{phrases} (replacing a positive integer
-% by a word, such as \enquote{12} becoming \enquote{dozen}\footnote{At least I think})
+% by a word; such as \enquote{12} becoming \enquote{dozen}\footnote{At least I think})
% which can be activated by the option \opt{use-phrases}
% (as I don't know any english phrases, I switched the language to german for the following examples)
% \begin{myde}
@@ -996,8 +1001,8 @@
%
% \section{Label \& refs: Changing the amount of the recipe}
% \label{sec:labeletref}
+% \cookingunitsToDo{Also not much to change}
%
-%
% 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:
@@ -1056,22 +1061,22 @@
%
%
%
-%
+% \begin{comment}
% \section{Some Interesting options}
-%
+% \cookingunitsToDo{This section is horrible, change or delete as a whole, but later}
% This package has some options which might be of interest and to highlight them, this section exists. All options can be
% found in \cref{sec:options}.
%
%
%\subsection{Numerals}
-% \begin{cuinterest}{use-numerals, use-numerals-below, print-numerals}
+% \begin{cuinterest}{use-fmtcount-numerals, use-numerals-below, print-numerals}
% As seen above, you can use the \emph{package}-option
-% \opt{use-numerals} to print integers used by \cCutext{} below
+% \opt{use-fmtcount-numerals} to print integers used by \cCutext{} below
% \opt{use-numerals-below} (13 by default) by \pkg{fmtcount}.
% You can still decide if numerals should be printed or not with \opt{print-numerals}.
%
% \begin{cunote}
-% \opt{use-numerals} is a package option as it needs to load
+% \opt{use-fmtcount-numerals} is a package option as it needs to load
% \pkg{fmtcount} which is not loaded by default.
% \end{cunote}
%
@@ -1100,7 +1105,7 @@
% \cuam{60}
% \end{cuexamplecode}
% \end{myde}
-% This of course also works with the \emph{package}-option \opt{use-numerals}:
+% This of course also works with the \emph{package}-option \opt{use-fmtcount-numerals}:
% \begin{myde}
% \cusetup{print-numerals=true}
% \begin{cuexamplecode}
@@ -1116,30 +1121,38 @@
%
%
% \begin{cunote}
-% Currently only the lower-case variant for \opt{use-numerals} is
+% Currently only the lower-case variant for \opt{use-fmtcount-numerals} is
% supported. Furthermore this feature is only available for \mycs{cuam}.
% \end{cunote}
%
% \end{cuinterest}
%
+% \end{comment}
%
+%
+%
+%
+%
+%
+%
%\subsection{Rounding temperatures}
%
-% By default temperatures are rounded to integers (using \opt{round-to-int = true}).
+% By default temperatures are rounded to integers (using \opt{round-precision=0}).
% Since 1.30 it is possible to round amounts to a negative precision.
% If you want to round temperatures to the tens see the following
% example (\opt{set-option-for-\meta{unit}} is described in \cref{sec:opt:unit-spec}).
%
% \begin{cuexamplecode}
-% \cunum{180}{C} \\
+% \cunum{182}{C} \\
% \cunum[C=F]{180}{C} \\
% \cunum[C=Re]{180}{C} \\
% \cunum[C=K]{180}{C} \\
-% \cusetup{set-option-for-C = { round-precision = -1 } } @
-% \cusetup{set-option-for-F = { round-precision = -1 } } @
-% \cusetup{set-option-for-Re = { round-precision = -1 } } @
-% \cusetup{set-option-for-K = { round-precision = -1 } } @
-% \cunum{180}{C} \\
+% \cusetoptionfor{C,F,K,Re}{ round-precision = -1 } @
+%^^A \cusetup{set-option-for-C = { round-precision = -1 } } @
+%^^A \cusetup{set-option-for-F = { round-precision = -1 } } @
+%^^A \cusetup{set-option-for-Re = { round-precision = -1 } } @
+%^^A \cusetup{set-option-for-K = { round-precision = -1 } } @
+% \cunum{182}{C} \\
% \cunum[C=F]{180}{C} \\
% \cunum[C=Re]{180}{C} \\
% \cunum[C=K]{180}{C} \\
@@ -1147,7 +1160,7 @@
%
% \section{Predefined units \& some notes}
% \label{sec:pred-units}
-%
+% \cookingunitsToDo{Passt.}
% \begin{comment}
% In \cref{tab:def-units} and \cref{tab:some-more-units} (and \cref{tab:strange-units})
% you can find
@@ -1248,12 +1261,12 @@
%
% \section{Defining units}
% \label{sec:def-units}
-%
+% \cookingunitsToDo{Passt.}
% New units can be defined using
% \begin{itemize}
-% \item \mycs{declarecookingunit}
-% \item \mycs{newcookingunit}
-% \item \mycs{providecookingunit}
+% \item \mycs{declarecookingunit}\oarg{symbol}\marg{unit-key}
+% \item \mycs{newcookingunit}\oarg{symbol}\marg{new-unit-key}
+% \item \mycs{providecookingunit}\oarg{symbol}\marg{new-unit-key}
% \end{itemize}
%
% \begin{function}{\declarecookingunit,\newcookingunit,\providecookingunit}
@@ -1260,12 +1273,17 @@
% \begin{syntax}
% \mycs{declarecookingunit}\oarg{symbol}\marg{unit-key}
% \mycs{newcookingunit}\oarg{symbol}\marg{new-unit-key}
-% \mycs{providecookingunit}\oarg{symbol}\marg{new-unit-key}
+% \mycs{providecookingunit}\oarg{symbol}\marg{unit-key}
% \end{syntax}
% These commands define the unit \meta{unit-key}. If the
% key is not the same as the printed symbol use \oarg{symbol}.
-% Note that \meta{unit-key} should neither contain |/| nor |,|.
+% Note that \meta{unit-key} can neither contain |/| nor |,|.
%
+% Please note due to the current implementation catcodes may cause
+% trouble. For example using |:| inside \meta{unit-key} may cause
+% the key to \enquote{not be defined} in the document. If that happens
+% try removing or changing the \meta{unit-key}.
+%
% \mycs{newcookingunit} raises an error if the unit is already defined,
% \mycs{declarecookingunit} creates or (if given) overwrites \meta{symbol}
% and \mycs{providecookingunit} does nothing if the unit is already
@@ -1274,7 +1292,6 @@
% All units have male gender |m| by default.
%
% Some examples:
-%
% \begin{lstlisting}
% \declarecookingunit{kg}
% \declarecookingunit{g}
@@ -1282,18 +1299,61 @@
% \declarecookingunit[\ensuremath{{}^{\circ}}\kern-\scriptspace C] {C}
% \end{lstlisting}
%
+% \end{function}
% \begin{cunote}
% The definition of the printed degree Celsius is
-% directly copied and pasted from (a maybe older version of) \pkg{siunitx}
+% copied and pasted from (a maybe older version of) \pkg{siunitx}.
% \end{cunote}
%
%
+%
+% \begin{function}{\declarecookingderivatives}
+% \begin{syntax}
+% \mycs{declarecookingderivatives} \marg{unit-list} \marg{unit-key}
+% \ \ \marg{mathematical-relation} \marg{unit-symbol}
+% \end{syntax}
+%
+% \emph{This function is experimental}. Defines new units which are a combination
+% of the units given in \meta{unit-list} \emph{and} their linked-units.
+% \meta{unit-key}, \meta{mathematical-relation} and \meta{unit-symbol}
+% accept |#1| to |#n| as arguments with $n$ being the number of units
+% given in \meta{unit-list}. $n$ \emph{cannot} be greater than $8$ (and it will
+% probably compile for quite a while). Also note that this command doesn't work/isn't
+% tested for single keys.
+%
+% Also note that it is quite possible that an \enquote{overflow-error} will
+% occur if there are too many units.
+%
% \end{function}
%
+% \begin{cunote}
+% Due to catcodes (and my inability to deal with them properly)
+% there can be problems when using |:|
+% (and probably other signs) inside \meta{unit-key}.
+% \end{cunote}
%
+% \begin{cuexample}
+% Your homework is to change the unit of energy \si{\kg\m\squared\per\s\squared}
+% into \si{\ounce\inch\squared\per\minute\squared}. To check if you are correct
+% you use \mycs{declarecookingderivatives}:
+% \begin{lstlisting}
+% \declarecookingderivatives{kg,m,s}{#1*#2-#3}
+% { (#1)*(#2)^2/(#3)^2 } {\sfrac{#1\,#2${}^2$}{#3${}^2$}}
+% \end{lstlisting}
+%
+% Using |\cunum[kg*m-s=oz*in-min]{1}{kg*m-s}| shows that
+% \cunum{1}{kg*m-s} is equal to \cunum{196829101.34}{oz*in-min}.
+% (Note: This is \emph{really} experimental and it can easily happen that
+% an \enquote{overflow-error} occurs) (like for me which is why I hard-coded the
+% results after testing).
+%
+% \end{cuexample}
+%
+%
+%
% \section{Defining options to change units}
% \label{sec:defining-opt}
-%
+% \cookingunitsToDo{Passt.}
% Options (to change units) can be newly defined or added to already existing keys (units)
% using
% \begin{itemize}
@@ -1304,22 +1364,22 @@
% \item \mycs{cuaddtokeys}
% \end{itemize}
% I apologize for the (name) inconsistency between \mycs{cudefinekeys} and
-% \mycs{cudefinesinglekey} (although they are named similarly, they work different).
+% \mycs{cudefinesinglekey} (although they are named similarly, they work differently).
%
% \begin{function}{\cudefinekeys,\cudefinesinglekey}
% \begin{syntax}
% \mycs{cudefinekeys}\marg{unit-key-1}
% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{1 unit-key-1 are \dots\ unit-key-2}
-% \ \ \ \ \marg{unit-key-3} \marg{1 unit-key-1 are \dots\ unit-key-3}
-% \ \ \ \ \marg{unit-key-4} \marg{1 unit-key-1 are \dots\ unit-key-4}
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
+% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
% \ \ \ \ \dots
% \ \ \}
%
% \mycs{cudefinesinglekey}\marg{unit-key-1}
% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{1 unit-key-2 are \dots\ unit-key-1}
-% \ \ \ \ \marg{unit-key-3} \marg{1 unit-key-3 are \dots\ unit-key-1}
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-3 are \dots\ unit-key-1}
% \ \ \ \ \dots
% \ \ \}
% \end{syntax}
@@ -1326,7 +1386,7 @@
%
% If you define new units (see \cref{sec:def-units}) and cannot add
% them to already existing keys you can use
-% \lstinline|\cudefinekeys| bzw. \lstinline|\cudefinesinglekey| to
+% \lstinline|\cudefinekeys| or \lstinline|\cudefinesinglekey| respectively to
% define new keys.
%
% \lstinline|\cudefinekeys| takes \marg{unit-key-1} as a
@@ -1365,8 +1425,6 @@
% \myunit{min} and \myunit{s}
% \item \dots
% \end{itemize}
-%
-%
% \begin{align*}
% \SI{1}{\kg}&= \SI{1}{\kg} &
% \SI{1}{\kg}&= \SI{100}{\deka\g} &
@@ -1374,7 +1432,6 @@
% \SI{1}{\kg}&= \SI{35.27399}{\ounce} &
% \SI{1}{\kg}&= \SI{2.204 622 6}{\pound}
% \end{align*}
-%
% \begin{lstlisting}
% \cudefinekeys {kg}
% {
@@ -1425,16 +1482,16 @@
% \begin{syntax}
% \mycs{cuaddkeys}\marg{unit-key-1}
% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{1 unit-key-1 are \dots\ unit-key-2}
-% \ \ \ \ \marg{unit-key-3} \marg{1 unit-key-1 are \dots\ unit-key-3}
-% \ \ \ \ \marg{unit-key-4} \marg{1 unit-key-1 are \dots\ unit-key-4}
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-1 are \dots\ unit-key-2}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-1 are \dots\ unit-key-3}
+% \ \ \ \ \marg{unit-key-4} \marg{$1$ unit-key-1 are \dots\ unit-key-4}
% \ \ \ \ \dots
% \ \ \}
%
% \mycs{cuaddsinglekeys}\marg{unit-key-1}
% \ \ \{
-% \ \ \ \ \marg{unit-key-2} \marg{1 unit-key-2 are \dots\ unit-key-1}
-% \ \ \ \ \marg{unit-key-3} \marg{1 unit-key-3 are \dots\ unit-key-1}
+% \ \ \ \ \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
+% \ \ \ \ \marg{unit-key-3} \marg{$1$ unit-key-3 are \dots\ unit-key-1}
% \ \ \ \ \dots
% \ \ \}
% \end{syntax}
@@ -1447,11 +1504,11 @@
% \meta{unit-key-2}, \meta{unit-key-3}, etc. to its
% values. Furthermore it adds those new values to other keys linked
% to \meta{unit-key-1} and defines the new keys \meta{unit-key-2},
-% etc. with the same values as \meta{unit-key-1}.
+% etc.\ with the same values as \meta{unit-key-1}.
%
%
% If the conversion is more complicated use
-% \lstinline|\cuaddsinglekeys|. It adds \meta{unit-key-2}, etc. as
+% \lstinline|\cuaddsinglekeys|. It adds \meta{unit-key-2}, etc.\ as
% values to \meta{unit-key-1}. The numerical input can be placed
% using \myunit{\#1} (see \lstinline|\cudefinesinglekey|). This
% command neither defines new keys nor does it add values to other
@@ -1504,7 +1561,7 @@
% }
% \cusetup %% round to integer automatically
% {
-% set-option-for-Ro = { round-to-int = true }
+% set-option-for-Ro = { round-precision = 0 }
% }
% \end{lstlisting}
% \begin{cuexamplecode}
@@ -1525,7 +1582,7 @@
%
% \begin{function}{\cuaddtokeys}
% \begin{syntax}
-% \mycs{cuaddtokeys} \marg{unit-key-1} \marg{unit-key-2} \marg{1 unit-key-2 are \dots\ unit-key-1}
+% \mycs{cuaddtokeys} \marg{unit-key-1} \marg{unit-key-2} \marg{$1$ unit-key-2 are \dots\ unit-key-1}
% \end{syntax}
% Works similar to \mycs{cuaddkeys} regarding the definition of keys.
% \end{function}
@@ -1579,15 +1636,16 @@
%
% \section{Language support}
% \label{sec:language}
+% \cookingunitsToDo{Passt.}
%
% Unit names and symbols depend on the language. To change the
-% name depending on the language you can use \lstinline|\cudefinename|
-% and to only change symbols use \lstinline|\cudefinesymbol|.
+% name and symbol for given language you can use \lstinline|\cudefinename|;
+% to only change symbols use \lstinline|\cudefinesymbol|.
%
% \begin{function}{decimal-mark,cutext-range-sign, one(m),one(f),one(n)}
% Those are special keys (as they cannot be used as units). Not only
% are printed units language depending, but as is the decimal mark
-% (\enquote{.} or \enquote{,}) and the text which substitutes the range-sign.
+% (|.| or |,|) and the text which substitutes the range-sign.
% To set the decimal mark use
% \opt{decimal-mark} (see examples below), to set the range-sign for \cCutext\
% use \opt{cutext-range-sign}.
@@ -1596,14 +1654,14 @@
% \opt{cutext-range-sign}. If the \emph{option} is set, then the language symbol
% will be ignored.
%
-% Furthermore if you are using the package-option \opt{use-numerals}
+% Furthermore if you are using numerals
% you may also use the keys \opt{one(m)}, \opt{one(f)} and
-% \opt{one(n)}. If you use this option, integers below a certain
+% \opt{one(n)}. Integers below a certain
% value (see option \opt{use-numerals-below}) are written-out. The
% only problem is the written-out \enquote{1} mostly depends on the
-% gender of the following word (e.g. \enquote{ein Baum} (m),
+% gender of the word following (e.g. \enquote{ein Baum} (m),
% \enquote{eine Pflanze} (f) and \enquote{ein Auto} (n)). To set the
-% written-out 1 to be correct with the gender of the used unit, use
+% written-out \enquote{1} to be correct with the gender of the used unit, use
% these keys (see also examples below)
% \end{function}
%
@@ -1624,10 +1682,10 @@
% \pkg{translations} documentation.
%
% If the plural form of the name differs from the singular form use
-% \oarg{plural} to specify the plural form, if no \oarg{plural} is
-% given the plural will be set equal to its singular. The singular form
+% \oarg{plural} to specify the plural form, else it will be equal to its singular
+% form. The singular form
% is only used if the number in \lstinline|\cutext| and
-% \lstinline|\Cutext| is equal to 1.
+% \lstinline|\Cutext| is equal to $1$.
%
% \meta{gender} can be \texttt{m} (maskulin), \texttt{f} (feminin) or
% \texttt{n} (neutrum). If not given \texttt{m} is used as default.
@@ -1676,9 +1734,9 @@
% \end{syntax}
%
% This command defines the symbols of the units printed in
-% \lstinline|\cunum| for the specific \meta{language}. It works
+% \lstinline|\cunum| for the specific \meta{Language}. It works
% similar as \lstinline|\cudefinename|, but only the symbols (and no
-% names) can be set. For details regarding \meta{language} see
+% names) can be set. For details regarding \meta{Language} see
% the \pkg{translations} documentation.
%
% \end{function}
@@ -1775,12 +1833,10 @@
% the phrase with the highest number is used (if used at all).
%
% Furthermore, it chooses star (|*|) phrases over non-star phrases.
-%
% \begin{cunote}
% Numbers with the optional star |*| are stored as negative numbers.
% \end{cunote}
% \end{function}
-%
% \begin{cuexample}
% The following example creates some phrases for the language
% \enquote{German}:
@@ -1824,6 +1880,8 @@
% \section{Options}
% \label{sec:options}
%
+% \cookingunitsToDo{Done. Passr.}
+%
% Options in \pkg{cooking-units} can mostly be set globally using
% \lstinline|\cusetup| or locally using the optional argument of the
% respective command (but \emph{not} as a package option). The only
@@ -1830,34 +1888,74 @@
% exception is the option given in \cref{sec:load-time-options} which
% needs to be used as a package option.
%
+% \begin{function}{\cusetup}
+% \begin{syntax}
+% \mycs{cusetup}\marg{options}
+% \end{syntax}
+% Options can be set using \mycs{cusetup}\Arg{options}.
+% \end{function}
+%
+%
+% \begin{function}{\cusetoptionfor,\cuaddoptionfor,\cuclearoptionfor}
+%
+% \begin{syntax}
+% \mycs{cusetoptionfor}\marg{unit-list}\marg{options}
+% \mycs{cuaddoptionfor}\marg{unit-list}\marg{options}
+% \mycs{cuclearoptionfor}\marg{unit-list}
+% \end{syntax}
+% \pkg{cooking-units} allows you to attach options to units.
+% Those
+% options are activated if (and only if) the specific unit is used \emph{or}
+% if another unit is converted
+% into it. Those options allow you to e.g.\ round temperatures to
+% integers automatically. Furthermore, those added options are
+% overwritten by local options.
+%
+% \mycs{cusetoptionfor} \emph{sets} \meta{options} to each unit in \meta{unit-list}
+% overwriting the old ones.
+%
+% \mycs{cuaddoptionfor} \emph{add}s \meta{options} to each unit in \meta{unit-list}.
+%
+% \mycs{cuclearoptionfor} clears all options given to each unit in \meta{unit-list}.
+% \end{function}
+% \begin{cuexample}
+% Temperatures \myunit{C}, \myunit{F}, \myunit{K} and \myunit{Re} are
+% by default rounded to integers.
+% \begin{cuexamplecode}
+% \cunum{75.23}{C} \\
+% \cunum{75.23}{F} \\
+% \cunum{75.23}{K} \\
+% \cunum{75.23}{Re} \\
+% \cusetoptionfor{C,F,K,Re}{round-precision=-1} @
+% \cunum{75.23}{C} \\
+% \cunum{75.23}{F} \\
+% \cunum{75.23}{K} \\
+% \cunum{75.23}{Re} \\
+% \cuclearoptionfor{C,F,K,Re} @
+% \cunum{75.23}{C} \\
+% \cunum{75.23}{F} \\
+% \cunum{75.23}{K} \\
+% \cunum{75.23}{Re}
+% \end{cuexamplecode}
+% \end{cuexample}
+%
% \subsection{Load time options}
% \label{sec:load-time-options}
-%
-% \begin{function}{use-numerals}
+% \begin{function}{use-fmtcount-numerals}
% \begin{syntax}
-% \cs{usepackage}[use-numerals=\meta{true/false}]\{cooking-units\}
+% \cs{usepackage}[use-fmtcount-numerals=\meta{true/false}]\{cooking-units\}
% \end{syntax}
% If set to \true\ loads package \pkg{fmtcount} and uses
% \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
+% \opt{use-numerals-below} ($13$ by default), integers above are
% printed as numbers.
% You can decide to not print any numerals by setting \opt{print-numerals}
% to \false.
%
-% \begin{cunote}
-% \opt{use-numerals} is a package option as it needs to load
-% \pkg{fmtcount} which is not loaded by default.
-% \end{cunote}
-%
-% \begin{cunote}
-% Please note the keys \opt{one(m)}, \opt{one(f)}
-% and \opt{one(n)} to change the printed \enquote{one} (as
-% \enquote{one} is in many languages dependent on the gender of the
-% following word. E.g in German: Masculine: ein Baum,
-% Feminin: eine Pflanze, Neutrum: ein Auto).
-% \end{cunote}
-%
+% Note: You don't need to use this function to use numerals. Using
+% \opt{print-numerals} and setting \opt{numeral-function} and \opt{Numeral-function}
+% also works.
% \end{function}
%
% \cusetup{print-numerals=true}
@@ -1867,6 +1965,7 @@
% \cutext{2}{kg} \\
% \Cutext{2}{kg} \\
% \cutext{12}{kg} \\
+% \Cutext{12}{kg} \\
% \cutext{13}{kg} \\
% \cutext{13}{kg} \\
% \Cutext{14}{kg}
@@ -1873,15 +1972,30 @@
% \end{cuexamplecode}
% \cusetup{print-numerals=false}
%
+% \begin{cunote}
+% \opt{use-fmtcount-numerals} is a package option as it needs to load
+% \pkg{fmtcount} which is not loaded by default.
+% \end{cunote}
+%
+% \begin{cunote}
+% Please note the keys \opt{one(m)}, \opt{one(f)}
+% and \opt{one(n)} to change the printed \enquote{one} (as
+% \enquote{one} is in many languages dependent on the gender of the
+% following word. E.g in German: Masculine: ein Baum,
+% Feminin: eine Pflanze, Neutrum: ein Auto).
+% \end{cunote}
+%
+% \begin{cunote}
+% You can always change the functions used to print numerals with
+% \opt{numeral-function} and \opt{Numeral-function}.
+% \end{cunote}
+%
% \subsection{Normal options}
%
% Options in this subsection can only be set as local options or using
% \lstinline|\cusetup|, but \emph{not} as load time options.
%
-% \begin{function}{\cusetup}
-% Options can be set using \mycs{cusetup}\Arg{options}.
-% \end{function}
-%
+%
% \subsubsection{Unit Specific options}
% \label{sec:opt:unit-spec}
%
@@ -1924,9 +2038,49 @@
% \cunum{1}{stick} \\
% \end{cuexamplecode}
%
+% You can define new groups using \mycs{cudeclareunitgroup}:
+% \begin{function} {\cudeclareunitgroup}
+% \begin{syntax}
+% \mycs{cudeclareunitgroup} \marg{group-name} \marg{unit-list}
+% \end{syntax}
+% Defines the group \meta{group-name} containing the list \meta{unit-list}.
+% This allows the usage of |\meta{group-name}=\meta{unit-key}| to
+% change all units in the group \meta{group-name} to \meta{unit-key}
+% (which has to be part of \meta{unit-list}).
+% \end{function}
%
+% \begin{cuexample}
+% Define the group \enquote{weight}:
+% \begin{lstlisting}
+% \cudeclareunitgroup {weight} { kg , dag, g, oz, lb, stick }
+% \end{lstlisting}
+% Now \lstinline|\cusetup{weight=dag}| can be used to change all units
+% contained in |weight| to |dag|.
+% \end{cuexample}
%
%
+% \begin{function}{\cuaddtounitgroup}
+% \begin{syntax}
+% \mycs{cuaddtounitgroup}\marg{group}\marg{unit-list}
+% \end{syntax}
+% Adds \meta{unit-list} to an already existing \meta{group} (both need to exist).
+% \end{function}
+% \begin{cuexample}
+% Adding \myunit{st} to the group \mygroup{weight}
+% \begin{cuexamplecode}
+% \cuaddtounitgroup {weight} {st} @
+% \cusetup{weight = g } @
+% \cunum{1}{kg} \\
+% \cunum{1}{dag} \\
+% \cunum{1}{g} \\
+% \cunum{1}{oz} \\
+% \cunum{1}{lb} \\
+% \cunum{1}{stick} \\
+% \cunum{1}{st}
+% \end{cuexamplecode}
+% \end{cuexample}
+%
+%
% \begin{function}{add-unit-to-group}
% \begin{syntax}
% add-unit-to-group =
@@ -1937,8 +2091,10 @@
% \ \}
% \end{syntax}
% Adds each \meta{unit-key} in \meta{unit-keys-list} to \meta{group}.
+% The key-val equivalent of \mycs{cuaddtounitgroup}.
% \end{function}
% \begin{cuexample}
+% The same as above:
% This example adds the unit \myunit{st} to the group \mygroup{weight}
% and \myunit{Ro} to \mygroup{temperature}.
% \begin{lstlisting}
@@ -1962,6 +2118,7 @@
% \end{cuexamplecode}
% \end{cuexample}
%
+%
%
% \begin{function}{set-option-for-<unit-key>,add-option-for-<unit-key>}
% \begin{syntax}
@@ -1973,16 +2130,20 @@
% \opt{erase-all-options} (see below) is used to erase all options for all
% \meta{unit-key}s.
%
-% You may want to attach some options to a special
-% \meta{unit-key}. Those options are automatically activated if (and
-% only if) the specific \meta{unit-key} is used (or changed into this
-% unit). Setting options overwrites old options. Adding options, well
-% \dots\ adds the options to the old ones.
+% The less flexible key-value version of \mycs{cusetoptionfor} and
+% \mycs{cuaddoptionfor}.
+%
+%
+%^^A You may want to attach some options to a special
+%^^A \meta{unit-key}. Those options are automatically activated if (and
+%^^A only if) the specific \meta{unit-key} is used (or changed into this
+%^^A unit). Setting options overwrites old options. Adding options, well
+%^^A \dots\ adds the options to the old ones.
%
-% You can \enquote{delete} the options by setting
-% an empty value for a specific \meta{unit-key} (or use
-% \opt{erase-all-options} (or \opt{erase-all-options-for} )
-% (see below) to erase all options for all \meta{unit-key}s)
+%^^A You can \enquote{delete} the options by setting
+%^^A an empty value for a specific \meta{unit-key} (or use
+%^^A \opt{erase-all-options} (or \opt{erase-all-options-for} )
+%^^A (see below) to erase all options for all \meta{unit-key}s)
%
% \end{function}
%
@@ -1992,23 +2153,17 @@
% \begin{lstlisting}
% \cusetup
% {
-% set-option-for-F = { round-to-int = true } ,
-% set-option-for-C = { round-to-int = true } ,
-% set-option-for-K = { round-to-int = true } ,
-% set-option-for-Re = { round-to-int = true }
+% set-option-for-F = { round-precision = 0 } ,
+% set-option-for-C = { round-precision = 0 } ,
+% set-option-for-K = { round-precision = 0 } ,
+% set-option-for-Re = { round-precision = 0 }
% }
% \end{lstlisting}
+% although note that it would be easier to simply write
+% \begin{lstlisting}
+% \cusetoptionfor {F,C,K,Re} { round-precision = 0 }
+% \end{lstlisting}
%
-%^^A The following code rounds the units to the tens:
-%^^A \begin{lstlisting}
-%^^A \cusetup
-%^^A {
-%^^A set-option-for-F = { round-precision = -1 } ,
-%^^A set-option-for-C = { round-precision = -1 } ,
-%^^A set-option-for-K = { round-precision = -1 } ,
-%^^A set-option-for-Re = { round-precision = -1 }
-%^^A }
-%^^A \end{lstlisting}
% \end{cuexample}
%
%
@@ -2031,6 +2186,8 @@
% the same way their \opt{set-option-for-\meta{unit-key}} and
% \opt{add-option-for-\meta{unit-key}} counterparts.
%
+% The less flexible versions of the commands \mycs{cusetoptionfor} and
+% \mycs{cuaddoptionfor}.
% \end{function}
%
% \begin{cuexample}
@@ -2040,10 +2197,10 @@
% {
% set-option-for =
% {
-% F = { round-to-int = true } ,
-% C = { round-to-int = true } ,
-% K = { round-to-int = true } ,
-% Re = { round-to-int = true }
+% F = { round-precision = 0 } ,
+% C = { round-precision = 0 } ,
+% K = { round-precision = 0 } ,
+% Re = { round-precision = 0 }
% }
% }
% \end{lstlisting}
@@ -2061,7 +2218,7 @@
%^^A use \opt{erase-all-options-for}.
%
% \opt{erase-all-options-for} is used to remove added options from
-% the specified \meta{unit-key}s.
+% the specified \meta{unit-key}s (key-value version of \mycs{cuclearoptionfor}).
%
% \end{function}
%
@@ -2072,6 +2229,10 @@
% \begin{lstlisting}
% \cusetup{ erase-all-options-for = {C, F, K, Re} }
% \end{lstlisting}
+% It's the same as
+% \begin{lstlisting}
+% \cuclearoptionfor {C, F, K, Re}
+% \end{lstlisting}
% \end{cuexample}
%
%
@@ -2104,7 +2265,7 @@
% \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\
+% Set this option to \opt{false} if you do \emph{not} want the units of \cCutext\
% to be changed. Set to \true\ by default
% \end{function}
% \begin{cuexamplecode}
@@ -2187,11 +2348,11 @@
% \end{syntax}
% By default the commands \mycs{cunum}, \cCutext{} and \mycs{cunum}
% do \emph{not} expand their input. You can change the expansion behavior of
-% the \meta{amount} and/or \meta{unit-key} using the options specified
+% \meta{amount} and/or \meta{unit-key} using the options specified
% above. The meaning of the available values are the same as specified
% in the \LaTeX3\ document \enquote{interface3}.
%
-% It is set to \texttt{n} by default.
+% It is set to \texttt{n} (no expansion) by default.
%
% \end{function}
%
@@ -2244,12 +2405,23 @@
% \begin{syntax}
% print-numerals = \meta{true/false}
% \end{syntax}
-% If the package option \opt{use-numerals} is set to \true\ you can
-% deactivate the printing of numerals by setting \opt{print-numerals} to
-% \false\ and activate them by setting it to \true.
%
-% Note that this option is automatically set to \opt{true} if \opt{use-numerals} is used.
+% Prints numerals for integers smaller then \opt{use-numerals-below} if
+% set to \true. If set to \false\ no numerals are printed.
+%
+% If you use the package option \opt{use-fmtcount-numerals} this option
+% is automatically set to \true.
+%
+% If you want to use another package, just set this option to \true\ and
+% use \opt{numeral-function} and \opt{Numeral-function}.
+%
+%^^A If the package option \opt{use-fmtcount-numerals} is set to \true\ you can
+%^^A deactivate the printing of numerals by setting \opt{print-numerals} to
+%^^A \false\ and activate them by setting it to \true.
+%
% \end{function}
+% \begin{cuexample}
+% (Using the package option \opt{use-fmtcount-numerals}:
% \cusetup{ print-numerals=true }
% \begin{cuexamplecode}
% \cutext{1}{kg} \\
@@ -2263,16 +2435,15 @@
% \cutext{13}{kg} \\
% \end{cuexamplecode}
% \cusetup{ print-numerals=false }
+% \end{cuexample}
%
% \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.
+% If \opt{print-numerals} is \true, prints the numerals in
+% \mycs{cutext} and \mycs{Cutext} for integers smaller than
+% \meta{integer}. \meta{integer} is by default 13.
% You can deactivate the printing of numerals by \opt{print-numerals=false}.
% \end{function}
% \cusetup{ print-numerals=true }
@@ -2299,7 +2470,29 @@
% \end{cuexamplecode}
% \cusetup{ print-numerals=false }
%
+% \begin{function}{numeral-function, Numeral-function }
+% \begin{syntax}
+% numeral-function = \meta{function}
+% Numeral-function = \meta{function}
+% \end{syntax}
+% Sets the functions used for printing numerals.
+% \opt{numeral-function} is used for lowercase, \opt{Numeral-function}
+% for capitalized cases.
+% \end{function}
+% \begin{cuexample}
+% Using the commands from \pkg{fmtcount} you can set the
+% numeral function equal to
+% \begin{lstlisting}
+% \cusetup{
+% numeral-function = \numberstringnum ,
+% Numeral-function = \Numberstringnum
+% }
+% \end{lstlisting}
+% (this happens if you use the package option \opt{use-fmtcount-numerals})
+% \end{cuexample}
%
+%
+%
% \begin{function}{parse-number}
% \begin{syntax}
% parse-number = \meta{true/false}
@@ -2339,10 +2532,10 @@
% cunum-range-sign = \marg{string}
% cutext-range-sign = \marg{string}
% \end{syntax}
-% The second sets the \emph{printed} range sign used in \mycs{cunum}
-% (and \mycs{cuam}) to \meta{string}, the third sets the printed
+% \opt{cunum-range-sign} sets the \emph{printed} range sign used in \mycs{cunum}
+% (and \mycs{cuam}) to \meta{string}, \opt{cutext-range-sign} sets the printed
% range sign used in \cCutext{} to \meta{string}.
-% Using the first option sets the
+% Using \opt{range-sign} sets the
% range signs for both \mycs{cunum} (and \mycs{cuam}) and
% \mycs{cutext}/\mycs{Cutext} to \meta{string}.
%
@@ -2440,9 +2633,7 @@
% \begin{cunote}
% Also negative numbers are allowed.
% \begin{cuexamplecode}
-% \cusetup{erase-all-options} @
-% \cusetup{set-option-for-C={round-precision=-1}} @
-% \cusetup{set-option-for-F={round-precision=-1}} @
+% \cusetoptionfor{C,F}{round-precision=-1} @
% \cunum{-271,2}{C} \\
% \cunum[K=C]{0.0012}{K} \\
% \cunum{185}{C} \\
@@ -2454,17 +2645,18 @@
% \begin{syntax}
% round-to-int = \meta{true/false}
% \end{syntax}
-% Rounds the amount to an integer if set \true.
+% \emph{This option is deprecated.} Rounds the amount to an integer if set \true.
+% Use \opt{round-precision=0} instead.
% \end{function}
%
%
-% \begin{cuexamplecode}
-% \cusetup{round-to-int=true} @
-% \cunum{1.23456789}{kg} \\
-% \cunum{12.58}{kg} \\
-% \cunum[g=kg]{194--294}{g} \\
-% \cunum[kg=g]{1.23456789}{kg}
-% \end{cuexamplecode}
+%^^A \begin{cuexamplecode}
+%^^A \cusetup{round-to-int=true} @
+%^^A \cunum{1.23456789}{kg} \\
+%^^A \cunum{12.58}{kg} \\
+%^^A \cunum[g=kg]{194--294}{g} \\
+%^^A \cunum[kg=g]{1.23456789}{kg}
+%^^A \end{cuexamplecode}
%
% \begin{function}{round-half}
% \begin{syntax}
@@ -2506,7 +2698,7 @@
% eval-fraction = \meta{true/false}
% \end{syntax}
% This option takes \true\ or \false\ as values.
-% If set to \true\ fractions are evaluated. Please note that divisions
+% If set to \true\ all fractions are evaluated. Please note that divisions
% through zero are not allowed.
% \end{function}
%
@@ -2521,12 +2713,36 @@
% \cunum[kg=g]{1_?/2}{kg} \\
% \end{cuexamplecode}
%
+%
+%
+% \begin{function}{convert-fraction}
+% \begin{syntax}
+% convert-fraction = \meta{true/false}
+% \end{syntax}
+% By default units of fractions are not converted into another unit.
+% Setting this option to \true\
+% allows fractions to be evaluated when a change of units is requested
+% (and \emph{only} if a change of unit is requested).
+% \end{function}
+%
+% \begin{cuexamplecode}
+% \cusetup{convert-fraction=true} @
+% \cunum{1/3}{kg} \\
+% \cunum[kg=g]{1/3}{kg} \\
+% \cunum{1_1/2}{kg} \\
+% \cunum[kg=g]{1_1/2}{kg} \\
+% \cunum[kg=g]{1_?/2}{kg} \\
+% \end{cuexamplecode}
+%
+%
+%
+%
% \begin{function}{fraction-command}
% \begin{syntax}
-% fraction-command = \meta{\cs{command}}
+% fraction-command = \cs{command}
% \end{syntax}
-% Sets the command used for printing fractions equal to \meta{\cs{command}}.
-% \meta{\cs{command}} has to take two arguments. By default
+% Sets the command used for printing fractions equal to \cs{command}.
+% \cs{command} has to take two arguments. By default
% it is equal to |\sfrac| from \pkg{xfrac}.
%
% Please note that the amount is \emph{not} printed inside a math
@@ -2651,7 +2867,6 @@
% \end{function}
%
% \begin{cuexamplecode}
-% \selectlanguage{ngerman} @
% \cunum{1}{kg}\\
% \cunum{1/2}{kg}\\
% \cunum{1--2}{kg}\\
@@ -2799,7 +3014,7 @@
%^^A by the label \& ref system. Of course, you can also remove units or clear the whole list.
%
% There are units which do not depend on the number of folks you are cooking for, units measuring
-% the temperature are for example some of them. Changing those units with the label \& ref
+% the temperature are an example. Changing those units with the label \& ref
% system would be accidental and in the best case throw an error. With the following options
% you can add units to the \enquote{forbidden unit list}, remove them and clear the whole list
% entirely.
@@ -3004,7 +3219,7 @@
%
%
%
-% \clearpage
+%\clearpage
%
% \section{Bens Einheitensammelsurium (Bens unit Almanac)}
%
@@ -3152,7 +3367,6 @@
%
%
%
-% \clearpage
% \appendix
%
% \section{Translations}
@@ -3168,7 +3382,7 @@
%
% \small
%
-% \newpage
+%\clearpage
% \subsection{English}
% \begin{tabular}{ l l l l l }
% \toprule
@@ -3176,7 +3390,7 @@
% \end{tabular}
%
%
-% \newpage
+%\clearpage
% \subsection{american}
%
% \begin{tabular}{ l l l l l }
@@ -3184,7 +3398,7 @@
% \CreateTableForLanguages{ american }
% \end{tabular}
%
-% \newpage
+%\clearpage
% \subsection{German}
% \begin{tabular}{ l l l l l }
% \toprule
@@ -3212,7 +3426,7 @@
%
% Note that Gro{\ss}gros has other (probably more common) synonyms.
%
-% \newpage
+%\clearpage
% \subsection{French}
% \begin{tabular}{ l l l l l }
% \toprule
@@ -3225,8 +3439,123 @@
% \item cuill\`{e}re \`{a} caf\'{e} rase
% \end{itemize}
%
-% \clearpage
+%\clearpage
%
+%
+%
+%
+%
+%
+%
+%
+% \section{US, Imperial and Other units}
+% \label{sec:other-units}
+%
+% As source \cite{WM1985} has been used for imperial units, while \cite{Nist2006}
+% and \cite{Nist2008} were used for U.S.\ units. I hope someone will find this
+% bringing together useful.
+%
+%\begin{center}
+%\begin{tabular}{ l @{ } l }
+%\toprule
+% 1 yard &= \SI{0.9144}{\m} (exact) \\
+% 1 yard &= 3 foot \\
+% 1 yard &= 36 Inch \\ \midrule
+% 1 Inch &= \SI{0.0254}{\m} (also exact) \\
+% \bottomrule
+%\end{tabular}
+%\end{center}
+%
+%\begin{center}
+%\begin{tabular}{r@{ }l r@{ }l}
+%\toprule
+% \multicolumn{4}{c}{ 1 liter = \SI{1}{\cubic\deci\meter} } \\ \midrule
+% 1 gallon &= \SI{4.54609}{liter} (exact) & 1 U.S.\ gallon &= 231\,Inch$^3$ $=$
+% $231\times \num{0,016387064}$ liter \\
+% 1 gallon &= 4 Quart & 1 U.S.\ gallon &= 4 Quart\US\\
+% 1 gallon &= 8 Pint & 1 U.S.\ gallon &= 8 Pint\US\\
+% 1 gallon &= 32 Gill & 1 U.S.\ gallon &= 32 Gill\US\\
+% 1 gallon &= 160\,fl.\,oz & 1 U.S.\ gallon &= 128\,fl.\,oz\US \\\midrule
+% 1 \,fl.\,oz&= \num{0.0284130625} liter & 1\,fl.\,oz\US & = \num{0.0295735295625} liter
+% \\ \bottomrule
+%\end{tabular}\\ \footnotesize\raggedright
+%\begin{cuenumnote}
+% \item I think the American fl.\,oz\US\ is more common. Maybe. Most bottles
+% have something like 10\,fl.\,oz, which they say is equal to \SI{30}{\ml}. This would
+% work really well with fl.\,oz\US.
+% \item Sometimes \enquote{fl.\,oz} is written without the dot. I am also not sure what
+% kind of spacing has to be between \enquote{fl.} and \enquote{oz} (currently
+% using \cs{thinspace}).
+% \item This maybe sounds stupid, but could we introduce something like
+% \enquote{flouz}, \enquote{floiz} and \enquote{floez}? \enquote{flouz} would be
+% \enquote{fl.\,oz\US}, \enquote{floiz} would be \enquote{Imperial fl.\,oz} and
+% \enquote{floez} would simply be equal to \SI{30}{\ml}?
+%\end{cuenumnote}
+%\end{center}
+%
+%
+% For \enquote{stick} see \cite{StickSource}.
+%\begin{center}
+%\begin{tabular} { l @{ } l }
+% \toprule
+% 1\,lb &= \SI{0.453 592 37}{\kg} (exact) \\
+% 1\,lb &= 16\,oz \\
+% 1\,lb &= \sfrac{1}{14}\,st \\
+% 1\,lb &= \sfrac{175}{12}\,ounce~troy \\
+% 1\,lb &= 4 stick \\
+% \bottomrule
+%\end{tabular}
+%\end{center}
+%
+%
+%
+%\begin{center}
+%\begin{tabular} { r @{ } l @{ }l r @{ } l }
+% \toprule
+% 1 cup &$\approx$ \num{0.25} litre &= \SI{250}{\ml} &1 cup\US &= 8\, fl.\,oz\US \\
+% 1 tablespoon &$\approx$ \num{0.015} litre&= \SI{15}{\ml} & 1 tablespoon\US &= \sfrac{1}{2}\, fl.\,oz\US \\
+% 1 teaspoon &$\approx$ \num{0.005} litre &= \SI{5}{\ml} & 1 teaspoon\US&= \sfrac{1}{6}\, fl.\,oz\US \\
+% \bottomrule
+%\end{tabular} \footnotesize \\ \raggedright
+%\begin{cuenumnote}
+% \item I tested the approximation for tablespoon with water
+% ($\SI{1}{\mg} \approx \SI{1}{\mg}$) and the approximation looks good enough.
+% It of course depends on how full you fill your spoon.
+%\end{cuenumnote}
+%\end{center}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
% \begin{comment}
%^^A \section{Notes and other stuff}
%^^A This section contains stuff which might or might not be interesting.
@@ -3370,8 +3699,8 @@
% \begin{macrocode}
\ProvidesExplPackage
{cooking-units}
- {2018/09/24}
- {1.45}
+ {2020/01/13}
+ {1.46}
{Ein Paket fuer Kocheinheiten}
% \end{macrocode}
%
@@ -3410,14 +3739,28 @@
}
% \end{macrocode}
%
-% Define the only load-time option for this package. If it is set,
-% load package \pkg{fmtcount}.
% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { Option-deprecated }
+ {
+ The \ option \ '#1' \ is \ deprecated \ and \ should \ be \
+ replaced \ by \ '#2'.
+ }{
+ Please \ replace \ the \ option.
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
+% \begin{macrocode}
\bool_new:N \g_@@_opt_numeral_bool
\keys_define:nn { cooking-units }
{
- use-numerals .bool_gset:N = \g_@@_opt_numeral_bool ,
+ use-numerals .code:n =
+ {
+ \msg_warning:nnnn { cooking-units } { Option-deprecated } { use-numerals } { use-fmtcount-numerals }
+ \keys_set:nn { cooking-units } { use-fmtcount-numerals = #1 }
+ } ,
use-numerals .default:n = { false },
+ use-fmtcount-numerals .bool_gset:N = \g_@@_opt_numeral_bool ,
+ use-fmtcount-numerals .default:n = { false },
}
% \end{macrocode}
% Now process the package options \dots
@@ -3432,7 +3775,12 @@
% \begin{macrocode}
\keys_define:nn { cooking-units }
{
- use-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { fmtcount } } ,
+ use-numerals .code:n =
+ {
+ \msg_warning:nnnn { cooking-units } { Option-deprecated } { use-numerals } { use-fmtcount-numerals }
+ \msg_error:nnn { cooking-units } { load-time-option } { fmtcount }
+ } ,
+ use-fmtcount-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { fmtcount } } ,
}
% \end{macrocode}
%
@@ -3443,14 +3791,15 @@
% \begin{macro}
% {
% \tl_replace_all:NVn,
-% \tl_replace_once:NnV , \tl_replace_once:NVn ,
+% \tl_replace_once:NVn ,
% \tl_if_in:nVTF ,
% \tl_if_in:NVTF ,
% \tl_if_in:NVT ,
% \fp_compare:vNnT ,
-% \fp_eval:c ,
% \prop_get:cVc ,
-% \int_abs:c ,
+% \tl_set_rescan:NnV,
+% \msg_error:nnnV, \msg_error:nnV, \msg_warning:nnV,
+% \prop_put:cnx
% }
% Some variations of commands we will need later.
% \begin{macrocode}
@@ -3465,20 +3814,14 @@
\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
\cs_generate_variant:Nn \msg_error:nnn { nnV }
\cs_generate_variant:Nn \msg_warning:nnn { nnV }
+\cs_generate_variant:Nn \prop_put:Nnn { cnx }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{ \@@_dim_horizontal:N }
-% Using this command (which is essential |\tex_kern:D| until an official
-% command exists.
-% \begin{macrocode}
-\cs_new:Npn \@@_dim_horizontal:N #1 { \tex_kern:D #1 }
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\@@_frac:nn}
-% This command is used to print the fractions and can be changed
+% This command is used to print fractions and can be changed
% accordingly.
% \begin{macrocode}
\cs_new_eq:NN \@@_frac:nn \sfrac
@@ -3486,6 +3829,7 @@
% \end{macro}
%
% \begin{macro}{\@@_set_amount:Nn,\@@_set_unit:Nn}
+% Allows for potential parsing of amount and or unit.
% \begin{macrocode}
\cs_new_eq:NN \@@_set_amount:Nn \tl_set:Nn
\cs_new_eq:NN \@@_set_unit:Nn \tl_set:Nn
@@ -3494,11 +3838,12 @@
%
%
% \begin{macro}{\@@_print_numeral:n , \@@_print_Numeral:n}
-% This command is used to print the fractions and can be changed
-% accordingly.
+% Commands to print numerals. Either use default or set yourself.
% \begin{macrocode}
-\cs_new:Npn \@@_print_numeral:n #1 { }
-\cs_new:Npn \@@_print_Numeral:n #1 { }
+\cs_new:Npn \@@_print_numeral:n #1
+ { \msg_error:nnn {cooking-units} { define-numeral-function } }
+\cs_new:Npn \@@_print_Numeral:n #1
+ { \msg_error:nnn {cooking-units} { define-Numeral-function } }
\bool_if:NT \g_@@_opt_numeral_bool
{
\cs_set_eq:NN \@@_print_numeral:n \numberstringnum
@@ -3520,40 +3865,60 @@
% \end{macro}
%
%
+%
+% \begin{macro} { \g_@@_master_changer_prop }
+% Similar to |\l_@@_change_unit_prop|, but doesn't store the requested
+% unit change, but the values needed for conversion. Either a numerical
+% value is stored or a formula (using |#1| to insert the original value).
+%
+% Put and get values via \cs{\@@_prop_gput_master:nnn}
+% and \cs{@@_prop_get_master:nnNTF}.
+% \begin{macrocode}
+\prop_new:N \g_@@_master_changer_prop
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
% \begin{macro}
% {
-% \l_@@_number_tmpa_tl,
-% \l_@@_number_tmpb_tl,
-% \l_@@_tmpa_tl,
-% \l_@@_tmpb_tl,
-% \l_@@_mixed_fraction_tl,
-% \l_@@_given_unit_tl,
-% \l_@@_option_unit_tl,
-% \l_@@_language_tl,
-% \l_@@_cunum_range_sign_tl,
-% \l_@@_cutext_range_sign_tl,
-% \l_@@_value_unit_space_tl,
-% \l_@@_input_digits_tl ,
-% \l_@@_input_decimal_mark_tl,
-% \l_@@_input_value_signs_tl,
-% \l_@@_input_allowed_special_signs_tl ,
-% \c_@@_input_str_hash_one_tl ,
-% \l_@@_input_range_sign_tl,
-% \l_@@_cutext_space_tl,
-% \l_@@_cuphrase_space_tl,
-% \l_@@_translation_tmpa_tl,
-% \l_@@_cutext_last_value_tl,
-% \l_@@_phrase_phrase_tl ,
+% \l_@@_number_tmpa_tl,
+% \l_@@_number_tmpb_tl,
+% \l_@@_mixed_fraction_tl,
+% \l_@@_original_amount_tl,
+% \l_@@_original_unit_tl,
+% \l_@@_option_unit_tl,
+% \l_@@_language_tl,
+% \l_@@_cunum_range_sign_tl,
+% \l_@@_cutext_range_sign_tl,
+% \l_@@_value_unit_space_tl,
+% \l_@@_input_digits_tl ,
+% \l_@@_input_decimal_mark_tl,
+% \l_@@_input_value_signs_tl,
+% \l_@@_input_allowed_special_signs_tl ,
+% \g_@@_input_str_hash_one_tl ,
+% \l_@@_input_range_sign_tl,
+% \l_@@_cutext_space_tl,
+% \l_@@_cuphrase_space_tl,
+% \l_@@_translation_tmpa_tl,
+% \l_@@_cutext_last_value_tl,
+% \l_@@_phantom_tl,
+% \l_@@_phrase_phrase_tl,
+% \l_@@_unit_letter_not_allowed_tl,
+% \l_@@_input_fraction_sign_tl,
+% \l_@@_input_mixed_fraction_sign_tl,
+% \l_@@_list_of_units_tl,
+% \l_@@_list_of_values_tl,
+% \l_@@_cunum_hook_tl , \l_@@_cutext_hook_tl ,
+% \l_@@_Cutext_hook_tl , \l_@@_cuam_hook_tl
% }
% Quite a lot of tl's.
% \begin{macrocode}
\tl_new:N \l_@@_number_tmpa_tl
\tl_new:N \l_@@_number_tmpb_tl
-\tl_new:N \l_@@_tmpa_tl
-\tl_new:N \l_@@_tmpb_tl
\tl_new:N \l_@@_mixed_fraction_tl
-\tl_new:N \l_@@_given_amount_tl
-\tl_new:N \l_@@_given_unit_tl
+\tl_new:N \l_@@_original_amount_tl
+\tl_new:N \l_@@_original_unit_tl
\tl_new:N \l_@@_option_unit_tl
\tl_new:N \l_@@_language_tl
\tl_new:N \l_@@_cunum_range_sign_tl
@@ -3563,7 +3928,7 @@
\tl_new:N \l_@@_input_decimal_mark_tl
\tl_new:N \l_@@_input_value_signs_tl
\tl_new:N \l_@@_input_allowed_special_signs_tl
-\tl_new:N \c_@@_input_str_hash_one_tl
+\tl_new:N \g_@@_input_str_hash_one_tl
\tl_new:N \l_@@_input_range_sign_tl
\tl_new:N \l_@@_cutext_space_tl
\tl_new:N \l_@@_cuphrase_space_tl
@@ -3574,6 +3939,8 @@
\tl_new:N \l_@@_unit_letter_not_allowed_tl
\tl_new:N \l_@@_input_fraction_sign_tl
\tl_new:N \l_@@_input_mixed_fraction_sign_tl
+\tl_new:N \l_@@_list_of_units_tl
+\tl_new:N \l_@@_list_of_values_tl
% \end{macrocode}
% \begin{macrocode}
\tl_new:N \l_@@_cunum_hook_tl
@@ -3585,8 +3952,8 @@
%
%
% Setting some token lists to their default value.
-% \lstinline|str_hash_one_tl| is used for defining single keys.
-% (You will see, I didn't have a better idea)
+% \cs{c_@@_input_str_hash_one_tl} is used for defining single keys.
+% (As you will see, I didn't have a better idea)
% \begin{macrocode}
\tl_set:Nn \l_@@_input_digits_tl { 0123456789 }
\tl_set:Nn \l_@@_input_range_sign_tl { -- }
@@ -3595,12 +3962,12 @@
\tl_set:Nn \l_@@_input_decimal_mark_tl { . , }
\tl_set:Nn \l_@@_input_value_signs_tl { + - }
\tl_set:Nn \l_@@_input_allowed_special_signs_tl { ? }
-\tl_set_rescan:Nnn \c_@@_input_str_hash_one_tl
+\tl_gset_rescan:Nnn \g_@@_input_str_hash_one_tl
{ \char_set_catcode_letter:N \# } {#1}
% \end{macrocode}
% \begin{macrocode}
\tl_set:Nn \l_@@_cunum_range_sign_tl { -- }
-\tl_set:Nn \l_@@_cutext_range_sign_tl {}
+\tl_set:Nn \l_@@_cutext_range_sign_tl { }
\tl_set:Nn \l_@@_value_unit_space_tl { \thinspace }
\tl_set:Nn \l_@@_cutext_space_tl { \space }
\tl_set:Nn \l_@@_cuphrase_space_tl { \space }
@@ -3607,7 +3974,7 @@
\tl_set:Nn \l_@@_unit_letter_not_allowed_tl { , / }
% \end{macrocode}
%
-% Flat out stolen from \pkg{siunitx}
+% Flat out stolen from \pkg{siunitx}.
% \begin{macrocode}
\AtBeginDocument {
\cs_if_free:cT { T at TS1 }
@@ -3649,7 +4016,7 @@
%
%
% \begin{macro}{ \l_@@_round_precision_int }
-% Stores the round-precision inside.
+% Stores the round-precision inside. Can also take negative values.
% \begin{macrocode}
\int_new:N \l_@@_round_precision_int
\int_set:Nn \l_@@_round_precision_int { 2 }
@@ -3657,7 +4024,7 @@
% \end{macro}
%
% \begin{macro}{ \l_@@_print_numerals_below_int }
-% Used if option 'use-numerals' is active. Uses numerals for
+% Used if option \opt{use-numerals} is active. Uses numerals for
% integers smaller than this number. I learned this number
% at school.
% \begin{macrocode}
@@ -3670,7 +4037,7 @@
% \begin{macro}{ \l_@@_local_number_of_persons_int }
% Each recipe defined by \cs{culabel} defines a counter to
% store the number of persons the recipe is for. For calculation
-% the value is retrived and stored inside this temporal counter.
+% the value is retrieved and stored inside this temporal integer variable.
% \begin{macrocode}
\int_new:N \l_@@_local_number_of_persons_int
% \end{macrocode}
@@ -3679,7 +4046,7 @@
% \begin{macro}{ \l_@@_wanted_number_of_persons_int }
% Not only the number of persons are recipe is for is needed
% for calculation, but also the number of persons you want
-% the recipe to be. This information is stored here.
+% the recipe to be. This information is stored here.
% \begin{macrocode}
\int_new:N \l_@@_wanted_number_of_persons_int
\int_set:Nn \l_@@_wanted_number_of_persons_int { 4 }
@@ -3686,11 +4053,15 @@
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{ \l_@@_phrase_number_tl }
+% Stores the current \enquote{phrase number}. For \enquote{Dutzend} this would
+% be \enquote{12}, etc.
% \begin{macrocode}
\int_new:N \l_@@_phrase_number_tl
% \end{macrocode}
+% \end{macro}
%
-%
% \begin{macro}{ \l_@@_list_of_defined_keys_clist , \g_@@_list_of_defined_units_clist }
% Sequence of defined units and keys. Units are defined
% globally as they create new commands, keys do not do that
@@ -3715,12 +4086,35 @@
% \begin{macro} { \l_@@_phrase_numbers_seq }
% Inside this list the numbers for which a phrase is defined
% is stored in. As this is language specific, the list is stored
-% inside a language-sensitive command and retrived when needed.
+% inside a language-sensitive command and retrieved when needed.
% \begin{macrocode}
\seq_new:N \l_@@_phrase_numbers_seq
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{\l_@@_number_of_iterations_seq, \l_@@_derivative_unit_list_seq ,
+% \l_@@_derivative_symbol_list_seq , \l_@@_derivative_value_list_seq
+% }
+% Variables used in \mycs{declarecookingderivatives}.
+% \begin{macrocode}
+\seq_new:N \l_@@_number_of_iterations_seq
+\seq_new:N \l_@@_derivative_unit_list_seq
+\seq_new:N \l_@@_derivative_symbol_list_seq
+\seq_new:N \l_@@_derivative_value_list_seq
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_max_depth_int, \l_@@_curr_depth_int}
+% Also some variables used in \mycs{declarecookingderivatives}.
+% \begin{macrocode}
+\int_new:N \l_@@_max_depth_int
+\int_new:N \l_@@_curr_depth_int
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
% \begin{macro} { \l_@@_temperatures_to_check_seq }
% \changes {1.02h} {New.}
% Stores units which should be tested if \opt{check-temperature} equals true.
@@ -3746,31 +4140,40 @@
% \end{macro}
%
%
+%
% \begin{macro}
% {
% \l_@@_minus_bool,
-% \l_@@_round_number_bool,
-% \l_@@_error_bool,
-% \l_@@_eval_fractions_bool,
-% \l_@@_draft_bool,
-% \l_@@_round_to_int_bool,
-% \l_@@_special_sign_bool,
-% \l_@@_single_key_bool,
-% \l_@@_check_temperature_bool,
-% \l_@@_convert_to_eV_bool,
-% \l_@@_cutext_uppercase_word_bool,
-% \l_@@_error_for_unknown_value_bool,
-% \l_@@_using_cutext_bool,
-% \l_@@_cuam_old_bool,
-% \l_@@_change_number_of_persons_bool,
-% \l_@@_calc_because_ref_was_given_bool,
-% \l_@@_lokal_persons_bool,
-% \l_@@_cutext_to_cunum_bool,
-% \l_@@_cutext_old_bool,
-% \l_@@_cutext_keep_unit_bool,
-% \l_@@_round_commercial_bool,
-% \l_@@_use_phrases_bool,
-% \l_@@_lokal_phrase_bool
+% \l_@@_round_number_bool,
+% \l_@@_error_bool,
+% \l_@@_unit_error_bool,
+% \l_@@_eval_fractions_bool,
+% \l_@@_convert_fractions_bool,
+% \l_@@_draft_bool,
+% \l_@@_round_to_int_bool,
+% \l_@@_special_sign_bool,
+% \l_@@_single_key_bool,
+% \l_@@_check_temperature_bool,
+% \l_@@_convert_to_eV_bool,
+% \l_@@_cutext_uppercase_word_bool,
+% \l_@@_using_cutext_bool,
+% \l_@@_cuam_old_bool,
+% \l_@@_change_number_of_persons_bool,
+% \l_@@_calc_because_ref_was_given_bool,
+% \l_@@_lokal_persons_bool,
+% \l_@@_cutext_to_cunum_bool,
+% \l_@@_cutext_old_bool,
+% \l_@@_cutext_keep_unit_bool,
+% \l_@@_round_commercial_bool,
+% \l_@@_use_phrases_bool,
+% \l_@@_lokal_phrase_bool,
+% \l_@@_print_numeral_bool,
+% \l_@@_lokal_numeral_bool,
+% \l_@@_round_precision_negative_bool,
+% \l_@@_fourty_two_bool,
+% \l_@@_phrase_negative_bool ,
+% \l_@@_range_in_input_bool, \l_@@_lokal_fraction_bool ,
+% \l_@@_print_fraction_bool, \l_@@_check_decimal_bool ,
% }
% Some booleans we need later.
% \begin{macrocode}
@@ -3777,7 +4180,9 @@
\bool_new:N \l_@@_minus_bool
\bool_new:N \l_@@_round_number_bool
\bool_new:N \l_@@_error_bool
+\bool_new:N \l_@@_unit_error_bool
\bool_new:N \l_@@_eval_fractions_bool
+\bool_new:N \l_@@_convert_fractions_bool
\bool_new:N \l_@@_draft_bool
\bool_new:N \l_@@_round_to_int_bool
\bool_new:N \l_@@_special_sign_bool
@@ -3785,7 +4190,6 @@
\bool_new:N \l_@@_check_temperature_bool
\bool_new:N \l_@@_convert_to_eV_bool
\bool_new:N \l_@@_cutext_uppercase_word_bool
-\bool_new:N \l_@@_error_for_unknown_value_bool
\bool_new:N \l_@@_using_cutext_bool
\bool_new:N \l_@@_cuam_old_bool
\bool_new:N \l_@@_change_number_of_persons_bool
@@ -3799,7 +4203,7 @@
\bool_new:N \l_@@_lokal_phrase_bool
\bool_new:N \l_@@_print_numeral_bool
\bool_new:N \l_@@_lokal_numeral_bool
-\bool_new:N \l_@@_round_precision_positive_bool
+\bool_new:N \l_@@_round_precision_negative_bool
\bool_new:N \l_@@_fourty_two_bool
\bool_new:N \l_@@_phrase_negative_bool
% \end{macrocode}
@@ -3810,7 +4214,6 @@
\bool_new:N \l_@@_range_in_input_bool
\bool_new:N \l_@@_lokal_fraction_bool
\bool_new:N \l_@@_print_fraction_bool
-\bool_new:N \l_@@_lokal_mixed_fraction_bool
\bool_new:N \l_@@_check_decimal_bool
% \end{macrocode}
% \end{macro}
@@ -3832,28 +4235,26 @@
%\end{macro}
%
% \begin{macro}{ \q_@@_no_translation }
+% Checking value if a translation is avaiable.
% \begin{macrocode}
\quark_new:N \q_@@_no_translation
% \end{macrocode}
%\end{macro}
%
-% \begin{macro}{ \q_@@_decimal , \q_@@_fraction , \q_@@_mixed_fraction }
-% \begin{macrocode}
-\quark_new:N \q_@@_decimal
-\quark_new:N \q_@@_fraction
-\quark_new:N \q_@@_mixed_fraction
-% \end{macrocode}
-%\end{macro}
%
% \begin{macro}{
+% \l_@@_tmpa_tl , \l_@@_tmpb_tl , \l_@@_tmp_unit_tl ,
% \l_@@_tmpa_fp ,
% \l_@@_tmpa_clist ,
-% \l_@@_tmpa_prop ,
-% \l_@@_tmpb_prop ,
+% \l_@@_tmpa_prop , \l_@@_tmpb_prop ,
% \l_@@_tmpa_seq ,
+% \l_@@_tmpa_int , \l_@@_tmpb_int ,
% }
% Some temporal stores which are used throughout the code.
% \begin{macrocode}
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\tl_new:N \l_@@_tmp_unit_tl
\fp_new:N \l_@@_tmpa_fp
\clist_new:N \l_@@_tmpa_clist
\prop_new:N \l_@@_tmpa_prop
@@ -3881,8 +4282,8 @@
add-unit-to-group .code:n =
{
\keyval_parse:NNn
- \@@_unit_group_add_unit_error:n
- \@@_unit_group_add_unit:nn
+ \@@_add_to_unit_group_error:n
+ \@@_add_to_unit_group:nn
{#1}
} ,
add-unit-to-group .default:n = {} ,
@@ -3916,14 +4317,12 @@
% \end{macro}
%
% \begin{macro}{ erase-all-options }
-% Erasing all preset options.
+% Erasing all preset options. Again not the best approach \dots\ maybe I need a lower
+% level \enquote{clear} option.
% \begin{macrocode}
erase-all-options .code:n =
{
- \seq_map_inline:Nn \g_@@_list_of_defined_units_seq
- {
- \clist_clear:c { l_@@_predefined_option_ ##1 _clist }
- }
+ \exp_args:Nx \cuclearoptionfor { \seq_use:Nn \g_@@_list_of_defined_units_seq { , } }
},
erase-all-options .value_forbidden:n = { true } ,
% \end{macrocode}
@@ -3930,14 +4329,16 @@
% \end{macro}
%
%\begin{macro}{ erase-all-options-for }
-% Erasing options.
+% Erasing options. As this simply clears the unit options the argument |#1|
+% is simply a clist, as such no keyval parsing is needed.
% \begin{macrocode}
erase-all-options-for .code:n =
{
- \keyval_parse:NNn
- \@@_erase_options_for:n
- \@@_erase_options_for_error:nn
- {#1}
+ \cuclearoptionfor {#1}
+% \keyval_parse:NNn
+% \@@_erase_options_for:n
+% \@@_erase_options_for_error:nn
+% {#1}
},
erase-all-options-for .value_required:n = { true } ,
% \end{macrocode}
@@ -4027,7 +4428,7 @@
%
%
%\begin{macro}{ set-special-sign }
-% Doing the same as above but also overrides the old signs.
+% Setting allowd special signs. Note that |<| is not allowed.
% \begin{macrocode}
set-special-sign .code:n =
{
@@ -4152,8 +4553,9 @@
{
\int_set:Nn \l_@@_round_precision_int {#1}
\int_compare:nNnTF {#1} < { 0 }
- { \bool_set_false:N \l_@@_round_precision_positive_bool }
- { \bool_set_true:N \l_@@_round_precision_positive_bool }
+ { \bool_set_true:N }
+ { \bool_set_false:N }
+ \l_@@_round_precision_negative_bool
} ,
round-precision .default:n = { 2 } ,
% \end{macrocode}
@@ -4163,6 +4565,18 @@
% Rounding the results to an integer.
% \begin{macrocode}
round-to-int .bool_set:N = \l_@@_round_to_int_bool ,
+ round-to-int .choices:nn =
+ { true , false }
+ {
+ \msg_error:nnnn { cooking-units } { Option-deprecated } { round-to-int } { round-precision = 0 }
+ \int_compare:nNnTF { \l_keys_choice_int } = { 1 }
+ {
+ \int_set:Nn \l_@@_round_precision_int { 0 }
+ }{
+
+ }
+ \use:c { bool_set_ \l_keys_choice_tl :N } \l_@@_round_to_int_bool
+ } ,
round-to-int .default:n = { false } ,
% \end{macrocode}
%\end{macro}
@@ -4192,6 +4606,15 @@
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{ convert-fraction }
+% If set to true the fractions are evaluated \emph{if} the unit is transformed!
+% \begin{macrocode}
+ convert-fraction .bool_set:N = \l_@@_convert_fractions_bool ,
+ convert-fraction .default:n = { true } ,
+% \end{macrocode}
+%\end{macro}
+%
+%
%\begin{macro}{ fraction-command }
% Setting the fraction command
% \begin{macrocode}
@@ -4270,7 +4693,7 @@
% \end{macro}
%
% \begin{macro}{ label }
-% Defines a label \dots\ is \mycs{culabel} as a key.
+% Defines a label. Is \mycs{culabel} in key form.
% \begin{macrocode}
label .code:n = \@@_label_and_persons:n {#1} ,
label .value_required:n = { true } ,
@@ -4338,10 +4761,15 @@
% \begin{macrocode}
add-natural-unit .code:n =
{
- \@@_error_if_unit_not_defined:n {#1}
\seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_concat:NNN \g_@@_natural_units_seq \g_@@_natural_units_seq \l_@@_tmpa_seq
- \seq_remove_duplicates:N \g_@@_natural_units_seq
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnF \g_@@_natural_units_seq {##1}
+ { \seq_gput_right:Nn \g_@@_natural_units_seq {##1} }
+ }
+ }
} ,
add-natural-unit .value_required:n = { true } ,
% \end{macrocode}
@@ -4393,7 +4821,12 @@
%
%
%
-% \begin{macro}{hooks}
+% \begin{macro}{
+% commands-add-hook ,
+% cunum-add-hook ,
+% cutext-add-hook , Cutext-add-hook ,
+% cuam-add-hook ,
+% }
% \begin{macrocode}
commands-add-hook .meta:n =
{
@@ -4425,34 +4858,19 @@
%
%
%
-% \begin{macro}{curef-add-forbidden-unit, curef-remove-forbidden-unit, curef-clear-forbidden-units}
+% \begin{macro}{
+% curef-add-forbidden-unit,
+% curef-remove-forbidden-unit,
+% curef-clear-forbidden-units
+% }
% \begin{macrocode}
- curef-add-forbidden-unit .code:n =
- {
- \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \seq_if_in:NnF \l_@@_curef_do_not_change_seq {##1}
- { \seq_put_right:Nn \l_@@_curef_do_not_change_seq {##1} }
- }
- } ,
+ curef-add-forbidden-unit .code:n = { \@@_add_forbidden_unit:n {#1} } ,
curef-add-forbidden-unit .default:n = { } ,
- curef-remove-forbidden-unit .code:n =
- {
- \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \seq_if_in:NnTF \l_@@_curef_do_not_change_seq {##1}
- { \seq_remove_all:Nn \l_@@_curef_do_not_change_seq {##1} }
- {
- \msg_warning:nnn { cooking-units } { curef-not-inside-list } {##1}
- { \seq_use:Nnnn \l_@@_curef_do_not_change_seq { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
- }
- }
- } ,
+ curef-remove-forbidden-unit .code:n = { \@@_remove_forbidden_unit:n {#1} } ,
curef-remove-forbidden-unit .default:n = { } ,
+%
curef-clear-forbidden-units .choice: ,
- curef-clear-forbidden-units/true .code:n = { \seq_clear:N \l_@@_curef_do_not_change_seq } ,
+ curef-clear-forbidden-units/true .code:n = { \@@_clear_forbidden_unit: } ,
curef-clear-forbidden-units/false .code:n = { } ,
curef-clear-forbidden-units .value_required:n = true,
% \end{macrocode}
@@ -4466,7 +4884,6 @@
%
%
%
-%
% Ending the definition of keys.
% \begin{macrocode}
}
@@ -4520,7 +4937,7 @@
\msg_new:nnnn { cooking-units } { unknown-unit }
{
The \ unit \ '#1' \ is \ not \ defined. \ Use \
- \newcookingunit ~ (or \ one \ of \ the \ others) \ to \
+ \newcookingunit (or \ one \ of \ the \ others) \ to \
define \ new \ units.
}{
Define \ units \ before \ using \ or \ check \ if \ the \
@@ -4606,8 +5023,8 @@
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { Key-not-defined }
{
- The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys ~ or \
- \cudefinesinglekey ~ to \ define \ keys.
+ The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys or \
+ \cudefinesinglekey to \ define \ keys.
}
{
This \ key \ is \ not \ defined, \ perhaps \ you \ misspelled \ it.
@@ -4623,8 +5040,7 @@
The \ temperature \ '#1' \ is \ too \ low.\ It \ cannot \ be \
below \ the \ absolute \ zero - point \ of \ '#2'. \ Note \ that \
the \ temperatures \
- '\seq_use:Nnnn \l_@@_temperatures_to_check_seq
- { ', ~ ' } { ', ~ ' } { ' ~ and ~ ' }' \
+ '\@@_seq_use_msg:N \l_@@_temperatures_to_check_seq' \
are \ rounded \ to \ integers \ by \ default.
\\\\
You \ can \ disable \ the \ option \ 'check-temperature' \ to \
@@ -4640,8 +5056,8 @@
'#3' \ as \ a \ set \ of \ choices \ and \ '#2' \ is \ non \ of \ these.
}{
The \ key \ accepts \ only \ a \ fixed \ set \ of \ choices. \
- You \ can \ add \ new \ choices \ via \ \cuaddkeys, ~ \cuaddsinglekeys ~
- and \ \cuaddtokeys.
+ You \ can \ add \ new \ choices \ via \ \token_to_str:N \cuaddkeys, ~
+ \token_to_str:N \cuaddsinglekeys ~ and \ \token_to_str:N \cuaddtokeys.
\msg_see_documentation_text:n {cooking-units}
}
% \end{macrocode}
@@ -4666,8 +5082,7 @@
{
The \ amount \ '#1' \ is \ not \ known \ at \ line \
\msg_line_number: .
- }
- {
+ }{
You \ used\ a\ special\ sign\ indicating\ that\ the\ true\ amount\ of\ the\
specific\ ingredient\ is\ (was) \ not\ known\ to\ you. This\ message\
reminds\ you\ about\ that\ fact.
@@ -4693,8 +5108,7 @@
{
The \ option \ '#1' \ is \ only \ available \ as \ a \ load-time-option. \
Please \ set \ it \ as \ a \ package \ option.
- }
- {
+ }{
You \ cannot \ set \ this \ option \ using \ \cusetup ~
but \ only \ as \ a \ package \ option.
\msg_see_documentation_text:n { cooking-units }
@@ -4716,8 +5130,7 @@
\msg_new:nnnn { cooking-units } { No-Value-given }
{
Please \ input \ a \ value \ for \ the \ key-value \ list \ in \ '#1'
- }
- {
+ }{
Each \ element \ of \ the \ list \ needs \ a \ value.
\msg_see_documentation_text:n { cooking-units }
}
@@ -4727,8 +5140,7 @@
\msg_new:nnnn { cooking-units } { Value-not-allowed }
{
The \ key-list \ in \ '#1' \ does \ not \ take \ a \ value.
- }
- {
+ }{
This \ key-list \ does \ not \ take \ a \ value. \ The \
given \ value \ will \ be \ ignored.
\msg_see_documentation_text:n { cooking-units }
@@ -4753,8 +5165,7 @@
{
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 }
@@ -4767,8 +5178,7 @@
{
The \ number \ of \ persons \ the \ recipe \ is \ for \ must \ be \ an \
integer. \ '#1' \ is \ not \ allowed.
- }
- {
+ }{
The \ number \ '#1' \ is \ not \ allowed.
\msg_see_documentation_text:n { cooking-units }
}
@@ -4826,11 +5236,10 @@
\msg_new:nnnn { cooking-units } { cutext-no-translation-available }
{
For \ the \ unit \ '#1' \ there \ exists \ no \ translation \ to \ be \ used \
- for \ \cutext ~ and \ \Cutext. \
+ for \ \cutext ~ and \ \token_to_str:N \Cutext. \
You \ can \ define \ new \ translations \ for \ a \ given \ language \ using \
\cudefinename.
- }
- {
+ }{
\cunum ~ is \ used \ instead.
\msg_see_documentation_text:n { cooking-units }
}
@@ -4841,9 +5250,8 @@
\msg_new:nnnn { cooking-units } { Translation-not-available }
{
The \ translation \ for \ #1 \ does \ not \ exist.
- Please \ define \ it \ using \ \cudefinename.
- }
- {
+ Please \ define \ it \ using \ \token_to_str:N\cudefinename.
+ }{
And \ you \ may \ send \ me \ the \ translation \ as \ it \ is \
not \ available \ yet.
\msg_see_documentation_text:n { cooking-units }
@@ -4856,8 +5264,7 @@
{
Currently \ (and \ probably \ forever) \ the \ sign \ '<' \
is \ not \ allowed \ to \ be \ used \ as \ a \ special \ sign.
- }
- {
+ }{
I \ apologize \ for \ the \ inconvenience.
\msg_see_documentation_text:n { cooking-units }
}
@@ -4891,7 +5298,8 @@
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { curef-forbidden-unit }
{
- The \ amount \ of \ '#1' \ cannot \ be \ changed \ using \ cooking-units` \ label \ \& \ ref \ feature.
+ The \ amount \ of \ '#1' \ cannot \ be \ changed \ using \ cooking-units`
+ \ label \ and \ ref \ feature.
}{
You \ can \ remove \ the \ unit \ using \ 'curef-remove-forbidden-unit'.
\msg_see_documentation_text:n { cooking-units }
@@ -4899,6 +5307,31 @@
% \end{macrocode}
%
% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { define-numeral-function }
+ {
+ You \ are \ using \ numerals \ (lowercase) \ without \ the \ load-time \ option \
+ 'use-fmtcount-numerals' \ as \ such \ you \ need \ to \ define \
+ which \ function \ is \ to \ be \ used \ for \ numerals. \ You \ can
+ \ do \ that \ via \ 'numeral-function' \ and \ 'Numeral-function'
+ }{
+ Please \ specify\ which \ function \ should \ be \ used \ to \ print \
+ numerals (lowercase \ and \ uppercase).
+ \msg_see_documentation_text:n { cooking-units }
+ }
+\msg_new:nnnn { cooking-units } { define-Numeral-function }
+ {
+ You \ are \ using \ numerals \ (capitalized) \ without \ the \ load-time \ option \
+ 'use-fmtcount-numerals' \ as \ such \ you \ need \ to \ define \
+ which \ function \ is \ to \ be \ used \ for \ numerals. \ You \ can
+ \ do \ that \ via \ 'numeral-function' \ and \ 'Numeral-function'
+ }{
+ Please \ specify\ which \ function \ should \ be \ used \ to \ print \
+ numerals (lowercase \ and \ uppercase).
+ \msg_see_documentation_text:n { cooking-units }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\msg_new:nnnn { cooking-units } { 42-is-...-wrong? }
{
You \ requested \ to \ set \ 42 \ to \ 'false'. \ This \ doesn't \ make
@@ -4911,14 +5344,34 @@
Phew ... \ this \ might \ have \ ended \ disastrous.
\msg_see_documentation_text:n { cooking-units }
}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\msg_new:nnnn { cooking-units } { empty-amount }
+ {
+ The \ amount \ given \ is \ empty \ ( spaces \ are \ removed ).
+ }{
+ The \ amount \ given \ is \ empty.
+ \msg_see_documentation_text:n { cooking-units }
+ }
+%
+\msg_new:nnnn { cooking-units } { unknown-option }
+ {
+ The \ option \ '#1' \ is \ not \ defined.
+ }{
+ Perhaps \ you \ misspelled \ the \ option.
+ \msg_see_documentation_text:n { cooking-units }
+ }
% \end{macrocode}
%
+%
% \begin{macrocode}
\msg_new:nnnn { cooking-units } { internal-error }
{
This \ error \ shouldn't \ show. \ This \ means \ I
\ (the \ package \ author) \ screwed
- \ up.
+ \ up. \ The \ error \ code \ is \ '#1'.
}{
Please \ send \ me \ a \ bug \ report.
\msg_see_documentation_text:n { cooking-units }
@@ -4933,24 +5386,35 @@
%\begin{macro}
% {
% \@@_error_if_unit_not_defined:n,
-% \@@_error_if_unit_not_defined:V,
+% \@@_error_if_unit_not_defined:nTF,
+% \@@_error_if_unit_not_defined:VTF,
% }
% A little helper macro. Checks if the unit is defined, if not raise an error.
% \begin{macrocode}
-\cs_new:Npn \@@_error_if_unit_not_defined:n #1
+\prg_new_protected_conditional:Npnn \@@_error_if_unit_not_defined:n #1 { TF, T, F }
{
- \seq_if_in:NnF \g_@@_list_of_defined_units_seq {#1}
- { \msg_error:nnn { cooking-units } { unknown-unit } {#1} }
+ \seq_if_in:NnTF \g_@@_list_of_defined_units_seq {#1}
+ { \prg_return_false: }
+ {
+ \msg_error:nnn { cooking-units } { unknown-unit } {#1}
+ \prg_return_true:
+ }
}
-\cs_generate_variant:Nn \@@_error_if_unit_not_defined:n { V }
+\cs_new:Npn \@@_error_if_unit_not_defined:n #1
+ { \@@_error_if_unit_not_defined:nTF {#1} { } { } }
+\cs_generate_variant:Nn \@@_error_if_unit_not_defined:nTF { V }
% \end{macrocode}
%\end{macro}
%
%
+% \begin{macrocode}
+\cs_new:Npn \@@_seq_use_msg:N #1
+ { \seq_use:Nnnn #1 { ' , ~ ' } { ' , ~ ' } { ' ~ and ~ ' } }
+\cs_generate_variant:Nn \@@_seq_use_msg:N { c }
+% \end{macrocode}
%
%
%
-%
% \begin{macro}{ \@@_if_integer:n }
% Checking if the input consists only of numbers.
% \begin{macrocode}
@@ -4991,7 +5455,7 @@
%
%
% \begin{macro}[TF]{ \@@_fp_if_equal_one:n}
-% \begin{macro}[TF]{ \@@_int_if_equal_one:n}f
+% \begin{macro}[TF]{ \@@_int_if_equal_one:n}
% \begin{macrocode}
\prg_new_conditional:Npnn \@@_fp_if_equal_one:n #1 { TF }
{
@@ -5024,6 +5488,20 @@
%
% \begin{macro}{ \@@_check_if_correct_gender_input:n }
% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_gender_error:n #1 { TF }
+ {
+ \str_case:nnTF {#1}
+ {
+ { m } { }
+ { f } { }
+ { n } { }
+ }
+ { \prg_return_false: }
+ {
+ \msg_error:nnn { cooking-units } { unknown-gender } {#1}
+ \prg_return_true:
+ }
+ }
\cs_new:Npn \@@_check_if_correct_gender_input:n #1
{
\str_case:nnF {#1}
@@ -5036,12 +5514,11 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_define_unit_group:nn}
+% \begin{macro}{\@@_define_clear_unit_group:nn,\@@_add_to_unit_group_error:n,\@@_add_to_unit_group:nn}
% \begin{macrocode}
-\cs_new:Npn \@@_define_unit_group:nn #1#2
+\cs_new:Npn \@@_define_clear_unit_group:nn #1#2
{
- \seq_new:c { l_@@_group_ #1 _seq }
- \seq_set_from_clist:cn { l_@@_group_ #1 _seq } {#2}
+ \seq_clear_new:c { l_@@_group_ #1 _seq }
\keys_define:nn { cooking-units }
{
#1 .code:n = { \@@_unit_group_convert_units:nn {#1} {##1} } ,
@@ -5048,65 +5525,68 @@
#1 .groups:n = { change-unit } ,
}
}
+%
+\cs_new:Npn \@@_add_to_unit_group_error:n #1
+ { \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group } }
+%
+\cs_new:Npn \@@_add_to_unit_group:nn #1#2
+ {
+ \@@_error_if_group_not_defined:nF {#1}
+ {
+ \clist_map_inline:nn {#2}
+ {
+ \@@_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:cnF { l_@@_group_ #1 _seq } {##1}
+ { \seq_put_right:cn { l_@@_group_ #1 _seq } {##1} }
+ }
+ }
+ }
+ }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_error_if_group_not_defined:n}
% \begin{macrocode}
-\cs_new:Npn \@@_error_if_group_not_defined:n #1
+\prg_new_conditional:Npnn \@@_error_if_group_not_defined:n #1 { F }
{
- \seq_if_exist:cF { l_@@_group_ #1 _seq }
- { \msg_error:nn { cooking-units} { group-key-unknown } }
+ \seq_if_exist:cTF { l_@@_group_ #1 _seq }
+ { \prg_return_false: }
+ {
+ \msg_error:nn { cooking-units} { group-key-unknown }
+ \prg_return_true:
+ }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_unit_group_convert_units:nn}
+% Didn't feel like intending the groups, as such use |\use_none:nnnnn(nnn)|.
+% (Always wanted to use those |\use_none:|)
% \begin{macrocode}
\cs_new:Npn \@@_unit_group_convert_units:nn #1#2
{
- \@@_error_if_group_not_defined:n {#1}
- \@@_error_if_unit_not_defined:n {#2}
- \seq_if_in:cnTF { l_@@_group_ #1 _seq } {#2}
+ \@@_error_if_group_not_defined:nF {#1}
{
- \seq_map_inline:cn { l_@@_group_ #1 _seq }
- { \@@_keys_set:nnn { cooking-units } {##1} {#2} }
- }{
- \msg_error:nnxxx
- { cooking-units }
- { group-choice-not-allowed }
- {#1}
- {#2}
- { \seq_use:cnnn { l_@@_group_ #1 _seq } { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
+ \@@_error_if_unit_not_defined:nF {#2}
+ {
+ \seq_if_in:cnTF { l_@@_group_ #1 _seq } {#2}
+ {
+ \seq_map_inline:cn { l_@@_group_ #1 _seq }
+ { \@@_keys_set:nnn { cooking-units } {##1} {#2} }
+ }{
+ \msg_error:nnxxx
+ { cooking-units }
+ { group-choice-not-allowed }
+ {#1} {#2}
+ { \@@_seq_use_msg:c { l_@@_group_ #1 _seq } }
+ }
+ }
}
}
-\@@_define_unit_group:nn { weight } { kg , dag, g, oz, lb, stick }
-\@@_define_unit_group:nn { length } { m , dm , cm , mm , in }
-\@@_define_unit_group:nn { volume } { l , dl , cl , ml }
-\@@_define_unit_group:nn { temperature } { C , F , K , Re }
-\@@_define_unit_group:nn { energy } { cal, kcal , J , kJ , eV }
-\@@_define_unit_group:nn { time } { d , h , min , s }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_unit_group_add_unit_error:n , \@@_unit_group_add_unit:nn }
-% \begin{macrocode}
-\cs_new:Npn \@@_unit_group_add_unit_error:n #1
- {
- \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group }
- }
-\cs_new:Npn \@@_unit_group_add_unit:nn #1#2
- {
- \@@_error_if_group_not_defined:n {#1}
- \clist_map_inline:nn {#2}
- {
- \@@_error_if_unit_not_defined:n {##1}
- \seq_if_in:cnF { l_@@_group_ #1 _seq } {##1}
- { \seq_put_right:cn { l_@@_group_ #1 _seq } {##1} }
- }
- }
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\@@_convert_to_eV:}
% Still work in progress. Will probably forever be. Changes all
@@ -5116,7 +5596,7 @@
% \begin{macrocode}
\seq_new:N \g_@@_natural_units_seq
\prop_new:N \g_@@_convert_to_eV_remember_prop
-\seq_set_from_clist:Nn \g_@@_natural_units_seq
+\seq_gset_from_clist:Nn \g_@@_natural_units_seq
{
eV ,
eVc-2 ,
@@ -5125,20 +5605,18 @@
(chbareV-1)3 ,
}
\cs_new:Npn \@@_keys_set:nnn #1#2#3
- {
- \keys_set:nn {#1} { #2 = #3 }
- }
+ { \keys_set:nn {#1} { #2 = #3 } }
\cs_generate_variant:Nn \@@_keys_set:nnn { nVV , nVn }
\cs_new:Npn \@@_convert_to_eV:
{
- \prop_if_exist:cT { l_@@_cukeys_ \l_@@_given_unit_tl _prop }
+ \tl_set_eq:Nc \l_@@_tmp_unit_tl { l_@@_base_key_unit_ \l_@@_original_unit_tl _tl }
+ \tl_if_empty:NF \l_@@_tmp_unit_tl
{
\prop_get:NVNTF \g_@@_convert_to_eV_remember_prop
- \l_@@_given_unit_tl \l_@@_tmpa_tl
+ \l_@@_original_unit_tl \l_@@_tmpa_tl
+ { \@@_keys_set:nVV { cooking-units } \l_@@_original_unit_tl \l_@@_tmpa_tl }
{
- \@@_keys_set:nVV { cooking-units } \l_@@_given_unit_tl \l_@@_tmpa_tl
- }{
- \prop_get:cnNT { l_@@_cukeys_ \l_@@_given_unit_tl _prop } { Liste } \l_@@_tmpa_seq
+ \prop_get:cnNTF { l_@@_cukeys_ \l_@@_tmp_unit_tl _prop } { Liste } \l_@@_tmpa_seq
{
\seq_map_inline:Nn \g_@@_natural_units_seq
{
@@ -5145,12 +5623,13 @@
\seq_if_in:NnT \l_@@_tmpa_seq {##1}
{
\prop_gput:NVn \g_@@_convert_to_eV_remember_prop
- \l_@@_given_unit_tl {##1}
- \@@_keys_set:nVn { cooking-units } \l_@@_given_unit_tl {##1}
+ \l_@@_original_unit_tl {##1}
+ \@@_keys_set:nVn { cooking-units } \l_@@_original_unit_tl {##1}
\seq_map_break:
}
}
- }
+ }
+ { \msg_error:nnn { cooking-units } { internal-error } { convert-to-eV } }
}
}
}
@@ -5172,8 +5651,9 @@
%
% \begin{macro}{ }
% I am using this construction often enough, so \dots\ yeah.
+% Note that if the evaluation is |true|, the path taken is the |false| one.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_change_unit: { TF }
+\prg_new_conditional:Npnn \@@_change_unit: { TF , T }
{
\bool_lazy_any:nTF
{
@@ -5201,32 +5681,22 @@
}
\cs_new:Npn \@@_temperatures_to_check_define:nn #1#2
{
- \@@_error_if_unit_not_defined:n {#1}
- \fp_if_exist:cTF { c_@@_ #1 _min_fp }
- { \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1} }
+ \@@_error_if_unit_not_defined:nF {#1}
{
- \seq_put_right:Nn \l_@@_temperatures_to_check_seq {#1}
- \fp_const:cn { c_@@_ #1 _min_fp } {#2}
+ \fp_if_exist:cTF { l_@@_ #1 _min_fp }
+ {
+% \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1}
+ \fp_set:cn { l_@@_ #1 _min_fp } {#2}
+ }{
+ \seq_put_right:Nn \l_@@_temperatures_to_check_seq {#1}
+ \fp_new:c { l_@@_ #1 _min_fp }
+ \fp_set:cn { l_@@_ #1 _min_fp } {#2}
+ }
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_erase_options_for:n , \@@_erase_options_for_error:nn }
-% \begin{macrocode}
-\cs_new:Npn \@@_erase_options_for:n #1
- {
- \@@_error_if_unit_not_defined:n {#1}
- \clist_clear:c { l_@@_predefined_option_ ##1 _clist }
- }
-\cs_new:Npn \@@_erase_options_for_error:nn #1#2
- {
- \@@_error_if_unit_not_defined:n {#1}
- \msg_error:nnn { cooking-units } { Value-not-allowed } { erase-all-options-for }
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{ \@@_set_options_for_error:n , \@@_set_options_for:nn }
% \begin{macrocode}
\cs_new:Npn \@@_set_options_for_error:n #1
@@ -5235,10 +5705,7 @@
\msg_error:nnn { cooking-units } { No-Value-given } { set-option-for }
}
\cs_new:Npn \@@_set_options_for:nn #1#2
- {
- \@@_error_if_unit_not_defined:n {#1}
- \clist_set:cn { l_@@_predefined_option_#1_clist } {#2}
- }
+ { \cusetoptionfor {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -5250,10 +5717,7 @@
\msg_error:nnn { cooking-units } { No-Value-given } { add-option-for }
}
\cs_new:Npn \@@_add_options_for:nn #1#2
- {
- \@@_error_if_unit_not_defined:n {#1}
- \clist_put_right:cn { l_@@_predefined_option_ #1 _clist } {#2}
- }
+ { \cuaddoptionfor {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -5263,9 +5727,7 @@
\cs_new:Npn \@@_rounding_function:n #1
{
#1
- \bool_if:NTF \l_@@_round_to_int_bool
- { , 0 }
- { , \l_@@_round_precision_int }
+ , \l_@@_round_precision_int
\bool_if:NT \l_@@_round_commercial_bool
{ , #1 }
}
@@ -5351,32 +5813,27 @@
%
%
%
-% \begin{macro}{ \@@_tl_if_in_remove_and_set_bool:NnN }
+% \begin{macro}{ \@@_bool_reverse:N, \@@_check_minus_remove_and_reverse:NN }
% Can probably optimize this as the sign is always at the first place
-% (this is done after cheking the input, so the asumption is safe), but yeah \dots
+% (this is done after cheking the input, so the assumption is safe), but yeah \dots
% \begin{macrocode}
-\cs_new:Npn \@@_tl_if_in_remove_and_set_bool:NnN #1#2#3
+\cs_new:Npn \@@_bool_reverse:N #1
{
- \tl_if_in:NnTF #1 {#2}
- {
- \bool_set_true:N #3
- \tl_remove_once:Nn #1 {#2}
- }
- { \bool_set_false:N #3 }
+ \bool_if:NTF #1
+ { \bool_set_false:N }
+ { \bool_set_true:N }
+ #1
}
-% \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
+\cs_new:Npn \@@_check_minus_remove_and_reverse:NN #1#2
{
- \tl_if_in:NnT #1 {#2}
+ \quark_if_nil:NF #2
{
- \bool_if:NTF #3
- { \bool_set_false:N #3 }
- { \bool_set_true:N #3 }
- \tl_remove_once:Nn #1 {#2}
+ \tl_if_in:NnT #2 { - }
+ {
+ \tl_remove_once:Nn #2 { - }
+ \@@_bool_reverse:N #1
+ }
+ \@@_check_minus_remove_and_reverse:NN #1
}
}
% \end{macrocode}
@@ -5395,8 +5852,8 @@
\tl_const:Nn \c_@@_postfix_phrase_tl { ( cu-unitphrase ) }
% \end{macrocode}
%
-% \begin{macro}{ \@@_deftranslation:nn }
-% \begin{macro}{ \@@_deftranslation:xxn , \@@_deftranslation:Vnv}
+% \begin{macro}{\@@_deftranslation_base:nnn, \@@_deftranslation_base:xVn }
+% \begin{macro}{\@@_deftranslation_to:nnnn , \@@_deftranslation_to:VxVv,\@@_deftranslation_to:VxVV,\@@_deftranslation_to:VxVn}
% \begin{macrocode}
\cs_new:Npn \@@_deftranslation_base:nnn #1#2#3
{
@@ -5406,8 +5863,8 @@
{
\declaretranslation {#1} { #2 #3 } {#4}
}
-\cs_generate_variant:Nn \@@_deftranslation_base:nnn { xx , xxV }
-\cs_generate_variant:Nn \@@_deftranslation_to:nnnn { Vxxv, VxxV , Vxxn, Vxxx,Vxxo,Vxxf }
+\cs_generate_variant:Nn \@@_deftranslation_base:nnn { xV }
+\cs_generate_variant:Nn \@@_deftranslation_to:nnnn { VxVv, VxVV , VxVn }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -5547,13 +6004,18 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_initialise_default:n #1
{
- \@@_set_unit:Nn \l_@@_given_unit_tl {#1}
- \@@_error_if_unit_not_defined:V \l_@@_given_unit_tl
+ \@@_set_unit:Nn \l_@@_original_unit_tl {#1}
+ \bool_set_false:N \l_@@_error_bool
+ \@@_error_if_unit_not_defined:VTF \l_@@_original_unit_tl
+ {
+ \bool_set_true:N \l_@@_unit_error_bool
+ \cs_set_eq:NN \@@_print_correct_unit: \@@_print_default_unit:
+ }
+ { \bool_set_false:N \l_@@_unit_error_bool }
\bool_set_false:N \l_@@_special_sign_bool
- \bool_set_false:N \l_@@_error_bool
\bool_set_false:N \l_@@_range_in_input_bool
\bool_set_false:N \l_@@_lokal_fraction_bool
- \bool_set_false:N \l_@@_lokal_mixed_fraction_bool
+ \bool_set_false:N \l_@@_minus_bool
}
% \end{macrocode}
% Some units have options added to them. To get those options it is first
@@ -5569,8 +6031,8 @@
{ \keys_set_groups:nnn { cooking-units } { change-unit } {#1} }
\bool_if:NT \l_@@_convert_to_eV_bool
{ \@@_convert_to_eV: }
- \prop_get:NVNF \l_@@_change_unit_prop \l_@@_given_unit_tl \l_@@_option_unit_tl
- { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_given_unit_tl }
+ \prop_get:NVNF \l_@@_change_unit_prop \l_@@_original_unit_tl \l_@@_option_unit_tl
+ { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
}
% \end{macrocode}
% \begin{macrocode}
@@ -5578,12 +6040,12 @@
{
\IfNoValueF {#1}
{ \@@_reference_label_and_persons:n {#1} }
- \clist_if_empty:cF { l_@@_predefined_option_ \l_@@_option_unit_tl _clist }
+ \clist_if_empty:cF { l_@@_unit_option_ \l_@@_option_unit_tl _clist }
{
\keys_set_filter:nnv
{ cooking-units }
{ change-unit }
- { l_@@_predefined_option_ \l_@@_option_unit_tl _clist }
+ { l_@@_unit_option_ \l_@@_option_unit_tl _clist }
}
\tl_if_empty:nF {#2}
{ \keys_set_filter:nnn { cooking-units } { change-unit } {#2} }
@@ -5591,10 +6053,7 @@
{ \l_@@_calc_because_ref_was_given_bool } { \l_@@_change_number_of_persons_bool }
{ \bool_set_true:N \l_@@_lokal_persons_bool }
{ \bool_set_false:N \l_@@_lokal_persons_bool }
- \bool_lazy_and:nnTF
- { \g_@@_opt_numeral_bool } { \l_@@_print_numeral_bool }
- { \bool_set_true:N \l_@@_lokal_numeral_bool }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ \bool_set_eq:NN \l_@@_lokal_numeral_bool \l_@@_print_numeral_bool
}
% \end{macrocode}
% \end{macro}
@@ -5604,7 +6063,7 @@
% \@@_post_process_input:NN , \@@_pre_process_input:NN}
% 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_@@_given_unit_tl} (the unit given in the second argument of
+% is set to \cs{l_@@_original_unit_tl} (the unit given in the second argument of
% \mycs{cutext} or \mycs{Cutext}) by default.
% \begin{macrocode}
\cs_new_protected:Npn \@@_print_input:N #1 { }
@@ -5670,20 +6129,28 @@
% \end{macro}
%
%
-% \begin{macro}{ \@@_print_fractions:nnn }
+% \begin{macro}{ \@@_print_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.
+% The minus sign is always put in front of the fraction.
%
+% The first argument regards the mixed fraction part. It is either empty
+% or not empty. If empty, do nothing. Else insert and add space.
+%
+% The 2nd and 3rd argument are the nominator and denominator, they are
+% used in the fraction command directly.
+%
+% All three arguments are currently tl varables, but only the first is a dedicated
+% \enquote{can only take one token}.
+%
% Since v.1.10(alpha) it also prints the minus sign (hopefully correct).
% \begin{macrocode}
-\cs_new:Npn \@@_print_fractions:nnn #1#2#3
+\cs_new:Npn \@@_print_fractions:Nnn #1#2#3
{
\bool_if:NT \l_@@_minus_bool { \c_@@_minus_tl }
- \tl_if_empty:nF {#1}
+ \tl_if_empty:NF #1
{
#1
- \@@_dim_horizontal:N \l_@@_mixed_frac_dim
+ \skip_horizontal:N \l_@@_mixed_frac_dim
}
\@@_frac:nn {#2} {#3}
}
@@ -5723,22 +6190,47 @@
\cs_new:Npn \@@_create_error:n #1
{
\bool_set_true:N \l_@@_error_bool
- \msg_error:nnV { cooking-units } {#1} \l_@@_given_amount_tl
+ \msg_error:nnV { cooking-units } {#1} \l_@@_original_amount_tl
}
\cs_new:Npn \@@_create_error_and_stop:n #1
{
\bool_set_true:N \l_@@_error_bool
- \msg_error:nnV { cooking-units } {#1} \l_@@_given_amount_tl
+ \msg_error:nnV { cooking-units } {#1} \l_@@_original_amount_tl
\use_none_delimit_by_q_nil:w
}
\cs_new:Npn \@@_create_error:nn #1#2
{
\bool_set_true:N \l_@@_error_bool
- \msg_error:nnnV { cooking-units } {#1} {#2} \l_@@_given_amount_tl
+ \msg_error:nnnV { cooking-units } {#1} {#2} \l_@@_original_amount_tl
}
% \end{macrocode}
% \end{macro}
%
+% The following command is needed after the parsing. It further processes
+% the parsed input and prints. The actual parsing and printing process (|\@@_process_tmp|)
+% depends on the command (|\cunum|, etc.) used.
+% \begin{macrocode}
+\cs_new:Npn \@@_process_tmp: { }
+\cs_new:Npn \@@_process_and_print_input:
+ {
+ \bool_lazy_or:nnTF
+ { \l_@@_error_bool }
+ { \l_@@_unit_error_bool }
+ { \l_@@_original_amount_tl }
+ { \@@_process_tmp: }
+ }
+% \end{macrocode}
+% If there is an error or there is a special case (like \opt{42=true}) these commands
+% are used.
+% \begin{macrocode}
+\cs_new:Npn \@@_process_default: { \l_@@_original_amount_tl }
+\cs_new:Npn \@@_print_default_unit:
+ {
+ \tl_if_empty:NF \l_@@_phantom_tl { \phantom { \l_@@_phantom_tl } }
+ \,\l_@@_original_unit_tl
+ }
+% \end{macrocode}
+%
% \begin{macro}{ \@@_parse_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).
@@ -5747,26 +6239,27 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_input:n #1
{
- \bool_if:NTF \l_@@_fourty_two_bool
- { \tl_clear:N \l_@@_given_amount_tl }
- { \@@_set_amount:Nn \l_@@_given_amount_tl {#1} }
- \tl_set_rescan:NnV \l_@@_given_amount_tl
+ \@@_set_amount:Nn \l_@@_original_amount_tl {#1}
+ \tl_set_rescan:NnV \l_@@_original_amount_tl
{
\char_set_catcode_letter:N \_ %
\char_set_catcode_ignore:N \ %
\char_set_catcode_other:N ? %
- } \l_@@_given_amount_tl
- \bool_lazy_or:nnTF
- { \l_@@_draft_bool }
- { \tl_if_empty_p:N \l_@@_given_amount_tl }
+ } \l_@@_original_amount_tl
+ \bool_lazy_any:nTF
{
- \bool_if:NTF \l_@@_fourty_two_bool
- { 42 }
- { \l_@@_given_amount_tl }
+ { \l_@@_fourty_two_bool }
+ { \l_@@_draft_bool }
+ { \tl_if_empty_p:N \l_@@_original_amount_tl }
}{
- \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_given_amount_tl
+ \cs_set_eq:NN \@@_process_tmp: \@@_process_default:
+ \tl_if_empty:NT \l_@@_original_amount_tl
+ { \msg_error:nnV { cooking-units } { empty-amount } \l_@@_original_amount_tl }
+ \bool_if:NT \l_@@_fourty_two_bool
+ { \tl_set:Nn \l_@@_original_amount_tl { 42 } }
+ }{
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_original_amount_tl
\@@_split_input:N \l_@@_tmpa_tl
- \@@_process_and_print_input:
}
}
% \end{macrocode}
@@ -5789,27 +6282,10 @@
\bool_if:NT \l_@@_range_in_input_bool
{ \@@_create_error_and_stop:n { fraction-not-allowed-with-range } }
}
- \tl_if_in:NnT #1 { _ }
- {
- \bool_set_true:N \l_@@_lokal_mixed_fraction_bool
- \bool_if:NF \l_@@_lokal_fraction_bool
- { \@@_create_error_and_stop:n { missing-slash } }
- }
\@@_split:N #1
\use_none_delimit_by_q_nil:w \q_nil
}
% \end{macrocode}
-% If an error was raised during parsing, just print the input. Else, go to the next set
-% of commands.
-% \begin{macrocode}
-\cs_new:Npn \@@_process_tmp: { }
-\cs_new:Npn \@@_process_and_print_input:
- {
- \bool_if:NTF \l_@@_error_bool
- { \l_@@_given_amount_tl }
- { \@@_process_tmp: }
- }
-% \end{macrocode}
% \end{macro}
%
% \begin{macro}{ \@@_split_input:}
@@ -5850,20 +6326,35 @@
% \begin{macrocode}
\cs_new:Npn \@@_split_fraction:n #1
{
- \bool_if:NTF \l_@@_lokal_mixed_fraction_bool
- {
- \cs_set_eq:NN \@@_process_tmp: \@@_process_mixed_fraction_in_input:
- \@@_split_fraction_mixed:ww
- }{
- \cs_set_eq:NN \@@_process_tmp: \@@_process_fraction_in_input:
- \@@_split_fraction_frac:ww
- }
- #1 \q_stop / \q_recursion_tail \q_stop
- \q_recursion_stop
+ \cs_set_eq:NN \@@_process_tmp: \@@_process_generel_fraction_in_input:
+ \@@_split_fraction_mixed:ww
+ #1 \q_stop / \q_recursion_tail _ \q_nil \q_stop
+ \q_recursion_stop
+% \end{macrocode}
+% At this point we have all information we need to determine whatever or not
+% the fractions should be evaluated or if the units should be changed.
+% \begin{macrocode}
\bool_lazy_or:nnT
{ \l_@@_lokal_persons_bool }{ \l_@@_eval_fractions_bool }
{ \bool_set_false:N \l_@@_lokal_fraction_bool }
+ \bool_if:NT \l_@@_convert_fractions_bool
+ {
+ \tl_if_eq:NNF \l_@@_original_unit_tl \l_@@_option_unit_tl
+ { \bool_set_false:N \l_@@_lokal_fraction_bool }
+ }
}
+%
+\cs_new:Npn \@@_split_fraction_mixed:ww #1 _ #2 \q_stop
+ {
+ \quark_if_nil:nTF {#2}
+ {
+ \tl_clear:N \l_@@_mixed_fraction_tl
+ \@@_split_fraction_frac:ww #1 \q_stop
+ }{
+ \@@_parse_input_and_safe_in:nN {#1} \l_@@_mixed_fraction_tl
+ \@@_split_fraction_frac:ww #2 \q_stop
+ }
+ }
\cs_new:Npn \@@_split_fraction_frac:ww #1 / #2 \q_stop
{
\quark_if_recursion_tail_stop_do:nn {#2}
@@ -5872,11 +6363,6 @@
\@@_parse_input_and_safe_in:nN {#2} \l_@@_number_tmpb_tl
\use_none_delimit_by_q_recursion_stop:w
}
-\cs_new:Npn \@@_split_fraction_mixed:ww #1 _ #2 \q_stop
- {
- \@@_parse_input_and_safe_in:nN {#1} \l_@@_mixed_fraction_tl
- \@@_split_fraction_frac:ww #2 \q_stop
- }
% \end{macrocode}
% \begin{macrocode}
\cs_generate_variant:Nn \@@_split_number:n { V }
@@ -5897,7 +6383,7 @@
\cs_set_eq:NN \@@_parse:N \@@_start_loop:N
\tl_map_function:nN {#1} \@@_parse:N
\bool_if:NTF \l_@@_error_bool
- { \use_none_delimit_by_q_nil:w }
+ { }
{ \tl_set_eq:NN #2 \l_@@_tmpa_tl }
}
% \end{macrocode}
@@ -5967,7 +6453,11 @@
{ \@@_create_error:n { Second-fraction-sign-not-allowed } }
{
\tl_if_in:NnTF \l_@@_input_mixed_fraction_sign_tl {#1}
- { \@@_create_error:n { Second-mixed-fraction-sign-not-allowed } }
+ {
+ \bool_if:NTF \l_@@_lokal_fraction_bool
+ { \@@_create_error:n { Second-mixed-fraction-sign-not-allowed } }
+ { \@@_create_error:n { missing-slash } }
+ }
{ \@@_create_error:nn { Token-not-allowed } {#1} }
}
}
@@ -6023,75 +6513,61 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_process_fraction_in_input: }
-% If a \lstinline|/| (but no \lstinline|_|) is found inside the input.
-% Well \dots\ does the same as the functions before.
-% 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|\@@_print_fractions:nnn| indicates a
-% \enquote{normal} fraction.
-% \begin{macrocode}
-\cs_new:Npn \@@_process_fraction_in_input:
- {
- \bool_lazy_or:nnTF
- { \l_@@_lokal_fraction_bool }
- { \l_@@_special_sign_bool }
- {
- \@@_tl_if_in_remove_and_set_bool:NnN \l_@@_number_tmpa_tl { - } \l_@@_minus_bool
- \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_number_tmpb_tl { - } \l_@@_minus_bool
- \@@_print_fractions:nnn
- { }
- { \l_@@_number_tmpa_tl }
- { \l_@@_number_tmpb_tl }
- }{
- \fp_compare:nNnT { \l_@@_number_tmpb_tl } = { 0 }
- { \msg_error:nnV { cooking-units } { Division-by-zero } \l_@@_given_amount_tl }
- \@@_tl_eval:Nn \l_@@_number_tmpa_tl
- { \l_@@_number_tmpa_tl / \l_@@_number_tmpb_tl }
- \@@_process_and_print_number_in_input:N \l_@@_number_tmpa_tl
- }
- }
-% \end{macrocode}
-% \end{macro}
+% \begin{macro}{ \@@_process_generel_fraction_in_input: }
+% This function prints both mixed and normal fractions. Those was done
+% by two functions beforehand, but they shared mostly the same code, so I
+% managed to fuse them.
%
-% \begin{macro}{ \@@_process_mixed_fraction_in_input: }
-% The same procedure as last function? The same procedure as every
-% function!
-%
-% If it should be evaluated it is important to check if the mixed-fraction
-% part is positive or negative. That's why the minuses are removed \emph{before}
-% checking if there is a fraction (in opposite to the command before).
+% The first part removes the minus sign. It cycles through the variables
+% (|\l_@@_mixed_fraction_tl| can be emtpy) and removes the minus signs.
+% It furthermore saves how many minuses are used by reversing a bool.
+% If a minus sign is found, the bool is reversed to true (from false). Another
+% minus: minus and minus is plus, reverse bool again (to false this time), etc.
%
+% Afterwards: Is a fraciton printed, or is the input evaluated. Printing is
+% straight forward.
+%
+% Due to how mixed fractions are evaluated, one can just evaluate the
+% absolute values of the inputs and add a minus sign on the left side afterwards
+% (if necessary).
% \begin{align}
% \cuam{1_2/3} &= 1 + 2/3 \\
-% \cuam{-1_2/3} &= -1 - 2/3
+% \cuam{-1_2/3} &= -1 - 2/3 = - ( 1 + 2/3 )
% \end{align}
-%
+%
+% If |\l_@@_mixed_fraction_tl| is empty the calculation just evaluates to
+% |+\l_@@_number_tmpa_tl / \l_@@_number_tmpb_tl|, which is also valid.
+%
% \begin{macrocode}
-\cs_new:Npn \@@_process_mixed_fraction_in_input:
+\cs_new:Npn \@@_process_generel_fraction_in_input:
{
- \@@_tl_if_in_remove_and_set_bool:NnN \l_@@_mixed_fraction_tl { - } \l_@@_minus_bool
- \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_number_tmpa_tl { - } \l_@@_minus_bool
- \@@_tl_if_in_remove_and_reverse_bool:NnN \l_@@_number_tmpb_tl { - } \l_@@_minus_bool
+ \@@_check_minus_remove_and_reverse:NN
+ \l_@@_mixed_fraction_tl
+ \l_@@_number_tmpa_tl
+ \l_@@_number_tmpb_tl
+ \q_nil
\bool_lazy_or:nnTF
{ \l_@@_lokal_fraction_bool }
{ \l_@@_special_sign_bool }
{
- \@@_print_fractions:nnn
- { \l_@@_mixed_fraction_tl }
+ \bool_if:NT \l_@@_special_sign_bool
+ {
+ \msg_warning:nnV { cooking-units } { amount-not-known } \l_@@_original_amount_tl
+ }
+ \@@_print_fractions:Nnn
+ \l_@@_mixed_fraction_tl
{ \l_@@_number_tmpa_tl }
- { \l_@@_number_tmpb_tl }
+ { \l_@@_number_tmpb_tl }
}{
\fp_compare:nNnT { \l_@@_number_tmpb_tl } = { 0 }
- { \msg_error:nnV { cooking-units } { Division-by-zero } \l_@@_given_amount_tl }
+ { \msg_error:nnV { cooking-units } { Division-by-zero } \l_@@_original_amount_tl }
\@@_tl_eval:Nn \l_@@_number_tmpa_tl
{
- \bool_if:NTF \l_@@_minus_bool
- { - \l_@@_mixed_fraction_tl - }
- { \l_@@_mixed_fraction_tl + }
+ \l_@@_mixed_fraction_tl +
\l_@@_number_tmpa_tl / \l_@@_number_tmpb_tl
}
+ \bool_if:NT \l_@@_minus_bool
+ { \tl_put_left:Nn \l_@@_number_tmpa_tl { - } }
\@@_process_and_print_number_in_input:N \l_@@_number_tmpa_tl
}
}
@@ -6098,11 +6574,11 @@
% \end{macrocode}
% \end{macro}
%
+%
%
%
%
%
-%
% \subsection {Formatiere \& Calculiere}
%
% \begin{macro}{ \@@_calculate_and_store_in:N }
@@ -6145,12 +6621,12 @@
\cs_new:Npn \@@_calculate_input_and_store_in:nN #1#2
{
\fp_set:Nn \l_@@_tmpa_fp {#1}
- \tl_if_in:cnTF { l_@@_unit_change_ \l_@@_given_unit_tl _tl } { \l_@@_tmpa_fp }
+ \tl_if_in:cnTF { l_@@_unit_change_ \l_@@_original_unit_tl _tl } { \l_@@_tmpa_fp }
{
- \@@_tl_eval:Nv #2 { l_@@_unit_change_ \l_@@_given_unit_tl _tl }
+ \@@_tl_eval:Nv #2 { l_@@_unit_change_ \l_@@_original_unit_tl _tl }
}{
\@@_tl_eval:Nn #2
- { \l_@@_tmpa_fp * \tl_use:c { l_@@_unit_change_ \l_@@_given_unit_tl _tl } }
+ { \l_@@_tmpa_fp * \tl_use:c { l_@@_unit_change_ \l_@@_original_unit_tl _tl } }
}
}
% \end{macrocode}
@@ -6170,10 +6646,7 @@
=
{ \l_@@_local_number_of_persons_int }
{
-% \@@_change_unit:TF
-% { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_option_unit_tl }
-% { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_given_unit_tl }
- \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_given_unit_tl
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_original_unit_tl
\seq_if_in:NVTF \l_@@_curef_do_not_change_seq \l_@@_tmpb_tl
{ \msg_error:nnV { cooking-units } { curef-forbidden-unit } \l_@@_tmpb_tl }
{ \@@_calc_references_aux:NN #1 #2 }
@@ -6215,18 +6688,12 @@
{
\quark_if_recursion_tail_stop_do:nn {#2}
{
- \bool_lazy_or:nnF
- { \l_@@_round_precision_positive_bool }
- { \l_@@_round_to_int_bool }
+ \bool_if:NT \l_@@_round_precision_negative_bool
{ \bool_set_true:N \l_@@_round_number_bool }
}
\int_compare:nNnT
{ \tl_count:n {#2} } >
- {
- \bool_if:NTF \l_@@_round_to_int_bool
- { 0 }
- { \l_@@_round_precision_int }
- }
+ { \l_@@_round_precision_int }
{ \bool_set_true:N \l_@@_round_number_bool }
\use_none_delimit_by_q_recursion_stop:w
}
@@ -6246,12 +6713,6 @@
\bool_if:NTF \l_@@_round_number_bool
{ \@@_tl_eval:Nn #1 { round ( \@@_rounding_function:n {#2} ) } }
{ \tl_set:Nn #1 {#2} }
-% \tl_set:Nf #1
-% {
-% \bool_if:NTF \l_@@_round_number_bool
-% { \fp_eval:n { round ( \@@_rounding_function:n {#2} ) } }
-% {#2}
-% }
}
\cs_generate_variant:Nn \@@_round_calculated_input:Nn { NV }
% \end{macrocode}
@@ -6277,13 +6738,13 @@
\seq_if_in:NVT \l_@@_temperatures_to_check_seq \l_@@_option_unit_tl
{
\fp_compare:vNnT
- { c_@@_ \l_@@_option_unit_tl _min_fp } > {#1}
+ { l_@@_ \l_@@_option_unit_tl _min_fp } > {#1}
{
\msg_error:nnxx { cooking-units }
{ Temperature-too-low }
{ #1 \space \l_@@_option_unit_tl }
{
- \fp_use:c { c_@@_ \l_@@_option_unit_tl _min_fp }
+ \fp_use:c { l_@@_ \l_@@_option_unit_tl _min_fp }
\space \l_@@_option_unit_tl
}
}
@@ -6360,6 +6821,7 @@
\@@_cunum_initialise:nnnnn {#1} {#2} {#3} {#4} {#5}
\l_@@_cunum_hook_tl
\@@_parse_input:n {#3}
+ \@@_process_and_print_input:
\@@_print_correct_unit:
}
% \end{macrocode}
@@ -6404,7 +6866,7 @@
\tl_use:N \l_@@_value_unit_space_tl
\@@_change_unit:TF
{ \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unit_tl }
- { \@@_translate:VV \l_@@_given_unit_tl \c_@@_postfix_unit_tl }
+ { \@@_translate:VV \l_@@_original_unit_tl \c_@@_postfix_unit_tl }
}
% \end{macrocode}
% \end{macro}
@@ -6459,7 +6921,7 @@
\@@_initialise_default:n {#3}
\@@_initialise_unit_change:n {#2}
\bool_if:NT \l_@@_cutext_keep_unit_bool
- { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_given_unit_tl }
+ { \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl }
\@@_initialise_after_unit_change:nn {#1} {#2}
\bool_if:NT \l_@@_fourty_two_bool
{ \tl_set:Nn \l_@@_cutext_last_value_tl { 42 } }
@@ -6466,7 +6928,7 @@
}
% \end{macrocode}
%
-% #1: label, #2: Options, #3: Values, #4: unit
+%^^A #1: label, #2: Options, #3: Values, #4: unit
% \begin{macrocode}
\cs_new:Npn \@@_cutext:nnnn #1#2#3#4
{
@@ -6476,7 +6938,10 @@
{ \l_@@_cutext_hook_tl }
\bool_if:NTF \l_@@_cutext_old_bool
{ \@@_old_cutext:nnn {#2} {#3} {#4} }
- { \@@_parse_input:n {#3} }
+ {
+ \@@_parse_input:n {#3}
+ \@@_process_and_print_input:
+ }
\@@_print_correct_unit:
}
% \end{macrocode}
@@ -6514,7 +6979,7 @@
{
\@@_change_unit:TF
{ \@@_cutext_print_input:NV #1 \l_@@_option_unit_tl }
- { \@@_cutext_print_input:NV #1 \l_@@_given_unit_tl }
+ { \@@_cutext_print_input:NV #1 \l_@@_original_unit_tl }
}
% \end{macrocode}
% \end{macro}
@@ -6529,7 +6994,7 @@
{ \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unitname_tl }
{ \@@_translate:VV \l_@@_option_unit_tl \c_@@_postfix_unitname_pl_tl }
}
- { \@@_translate:VV \l_@@_given_unit_tl \c_@@_postfix_unitname_pl_tl }
+ { \@@_translate:VV \l_@@_original_unit_tl \c_@@_postfix_unitname_pl_tl }
}
% \end{macrocode}
%
@@ -6538,7 +7003,7 @@
{
\@@_change_unit:TF
{ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_option_unit_tl }
- { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_given_unit_tl }
+ { \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_original_unit_tl }
\@@_unitname_get:NxF \l_@@_tmpa_tl \l_@@_tmpb_tl
{
\msg_warning:nnx
@@ -6584,7 +7049,7 @@
{ \bool_set_false:N \l_@@_lokal_numeral_bool }
}{
\int_compare:nNnF {#1} < { \l_@@_print_numerals_below_int }
- { \bool_set_false:N \l_@@_lokal_numeral_bool }
+ { \bool_set_false:N \l_@@_lokal_numeral_bool }
}
}
{ \bool_set_false:N \l_@@_lokal_numeral_bool }
@@ -6605,7 +7070,7 @@
\tl_const:Nn \c_@@_cuam_marker_tl { @@_cunum }
\tl_new:c { l_@@_unit_change_ \c_@@_cuam_marker_tl _tl }
\tl_set:cn { l_@@_unit_change_ \c_@@_cuam_marker_tl _tl } { 1.0 }
-\clist_new:c { l_@@_predefined_option_ \c_@@_cuam_marker_tl _clist }
+\clist_new:c { l_@@_unit_option_ \c_@@_cuam_marker_tl _clist }
% \end{macrocode}
%
% Replaces and extends \mycs{cufrac}.
@@ -6633,6 +7098,7 @@
{ \@@_cuam_old:n {#3} }
{
\@@_parse_input:n {#3}
+ \@@_process_and_print_input:
\@@_print_correct_unit:
}
}
@@ -6642,7 +7108,7 @@
\cs_new_protected:Npn \@@_cuam_initialise:nn #1#2
{
\@@_set_process_and_print_for_cuam:
- \tl_set_eq:NN \l_@@_given_unit_tl \c_@@_cuam_marker_tl
+ \tl_set_eq:NN \l_@@_original_unit_tl \c_@@_cuam_marker_tl
\tl_set_eq:NN \l_@@_option_unit_tl \c_@@_cuam_marker_tl
\bool_set_false:N \l_@@_lokal_phrase_bool
\@@_initialise_after_unit_change:nn {#1} {#2}
@@ -6860,17 +7326,22 @@
% \begin{macrocode}
\cs_new:Npn \@@_cukeys_define_keys_and_single_keys:nn #1#2
{
- \@@_error_if_unit_not_defined:n {#1}
+ \@@_error_if_unit_not_defined:nTF {#1}
+ { \bool_set_true:N } { \bool_set_false:N }
+ \l_@@_unit_error_bool
\tl_if_blank:nF {#2}
{
+ \prop_gclear:N \g_@@_master_changer_prop
+ \prop_gclear:N \g_@@_convert_to_eV_remember_prop
\seq_clear:N \l_@@_tmpa_seq
\prop_clear:N \l_@@_tmpa_prop
+ \prop_clear_new:c { l_@@_cukeys_ #1 _prop }
\bool_if:NTF \l_@@_single_key_bool
{
\@@_cukeys_parse_and_create_single_key:nn {#1} {#2}
}{
\fp_set:Nn \l_@@_tmpa_fp { 1.0 }
- \tl_set:Nn \l_@@_given_unit_tl {#1}
+ \tl_set:Nn \l_@@_original_unit_tl {#1}
\@@_cukeys_parse_and_create_keys:nn {#1}
{
{#1} { 1.0 } #2
@@ -6890,10 +7361,14 @@
{
\@@_cukeys_parse_input:nn #2
\q_recursion_tail \q_recursion_tail \q_recursion_stop
- \@@_cukeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
- \@@_cukeys_define_keys:V \l_@@_tmpa_clist
+ \bool_if:NF \l_@@_unit_error_bool
+ {
+ \@@_cukeys_create_key_prop:n {#1}
+ \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
+ \@@_cukeys_define_keys:V \l_@@_tmpa_clist
+ }
}
+\cs_generate_variant:Nn \@@_cukeys_parse_and_create_keys:nn { Vn }
% \end{macrocode}
% \end{macro}
%
@@ -6908,11 +7383,15 @@
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:n {#1}
- \seq_put_right:Nn \l_@@_tmpa_seq {#1}
- \prop_put:Nnx \l_@@_tmpa_prop {#1} { \fp_eval:n { (#2) / \l_@@_tmpa_fp } }
+ \@@_error_if_unit_not_defined:nF {#1}
+ {
+ \seq_if_in:NnF \l_@@_tmpa_seq {#1}
+ { \seq_put_right:Nn \l_@@_tmpa_seq {#1} }
+ \prop_put:Nnx \l_@@_tmpa_prop {#1} { \fp_eval:n { (#2) * \l_@@_tmpa_fp } }
+ }
\@@_cukeys_parse_input:nn
}
+
% \end{macrocode}
% \end{macro}
%
@@ -6973,27 +7452,13 @@
% \begin{macrocode}
\cs_new:Npn \@@_cukeys_create_key_prop:n #1
{
- \prop_clear:N \l_@@_tmpb_prop
- \prop_put:NnV \l_@@_tmpb_prop { Liste } \l_@@_tmpa_seq
- \prop_put:NnV \l_@@_tmpb_prop { prop } \l_@@_tmpa_prop
- \prop_put:NnV \l_@@_tmpb_prop { Erstes Ding } \l_@@_given_unit_tl
+ \prop_set_eq:cN { l_@@_cukeys_ #1 _prop } \l_@@_tmpa_prop
+ \prop_put:cnV { l_@@_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
\seq_map_inline:Nn \l_@@_tmpa_seq
{
- \prop_set_eq:cN { l_@@_cukeys_ ##1 _prop } \l_@@_tmpb_prop
+ \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_original_unit_tl
\tl_set:cn { l_@@_unit_change_ ##1 _tl } { 1.0 }
- \seq_map_inline:Nn \l_@@_tmpa_seq
- {
- \prop_put:cnx { l_@@_cukeys_ ##1 _prop }
- {####1}
- {
- \fp_eval:n
- {
- ( \prop_item:Nn \l_@@_tmpa_prop {####1} ) /
- ( \prop_item:Nn \l_@@_tmpa_prop {##1} )
- }
- }
- }
- }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -7006,43 +7471,78 @@
{
\seq_map_inline:Nn \l_@@_tmpa_seq
{
- \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {##1}
- { \seq_put_right:Nn \l_@@_list_of_defined_keys_seq {##1} }
- \keys_define:nn { cooking-units }
- {
- ##1 .choices:Vn =
- \l_@@_tmpa_clist
- {
- \@@_cukeys_define_keys_and_single_key_aux:n {##1}
- } ,
- ##1 / unknown .code:n=
- {
- \seq_set_split:Nnn \l_tmpa_seq { , } {#1}
- \msg_error:nnxxx
- { cooking-units }
- { key-choice-unknown }
- {##1}
- {####1}
- { \seq_use:Nnnn \l_tmpa_seq { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
- } ,
- ##1 .default:n = {##1} ,
- ##1 .groups:n = { change-unit }
- }
+ \@@_cukeys_keys_define:nn {##1} {#1}
}
}
+\cs_new:Npn \@@_cukeys_keys_define:nn #1#2
+ {
+ \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
+ { \seq_put_right:Nn \l_@@_list_of_defined_keys_seq {#1} }
+ \keys_define:nn { cooking-units }
+ {
+ #1 .choices:nn =
+ {#2}
+ {
+ \@@_cukeys_define_keys_and_single_key_aux:n {#1}
+ } ,
+ #1 / unknown .code:n=
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
+ \msg_error:nnxxx
+ { cooking-units }
+ { key-choice-unknown }
+ {#1}
+ {##1}
+ { \@@_seq_use_msg:N \l_tmpa_seq }
+ } ,
+ #1 .default:n = {#1} ,
+ #1 .groups:n = { change-unit }
+ }
+ }
\cs_generate_variant:Nn \@@_cukeys_define_keys:n { V }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_cukeys_define_keys_and_single_key_aux:n}
-%
+%^^A <<
% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_prop_get_master:nnN #1#2#3 { F }
+ {
+ \prop_get:NnNTF \g_@@_master_changer_prop { #1 ~->~ #2 } #3
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \@@_prop_get_master:nnNF { nVc }
+%
+\cs_new:Npn \@@_prop_gput_master:nnn #1#2#3
+ {
+ \prop_gput:Nnn \g_@@_master_changer_prop { #1 ~->~ #2 } {#3}
+ }
+\cs_generate_variant:Nn \@@_prop_gput_master:nnn { nVV, nVv }
+%
\cs_new:Npn \@@_cukeys_define_keys_and_single_key_aux:n #1
{
- \prop_get:cVc
- { l_@@_cukeys_#1_prop }
- \l_keys_choice_tl
- { l_@@_unit_change_ #1_tl }
+ \@@_prop_get_master:nVcF {#1} \l_keys_choice_tl { l_@@_unit_change_ #1_tl }
+ {
+ \prop_if_exist:cTF { l_@@_cukeys_ #1 _prop }
+ {
+ \prop_get:cVc
+ { l_@@_cukeys_ #1 _prop }
+ \l_keys_choice_tl
+ { l_@@_unit_change_ #1_tl }
+ \@@_prop_gput_master:nVv {#1} \l_keys_choice_tl { l_@@_unit_change_ #1_tl }
+ }{
+ \tl_set_eq:Nc \l_@@_tmpa_tl { l_@@_base_key_unit_ #1 _tl }
+ \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_tmpa_tl _prop }
+ \@@_tl_eval:Nn \l_@@_tmpb_tl
+ {
+ (\exp_args:NNV\prop_item:Nn \l_@@_tmpa_prop \l_keys_choice_tl) /
+ (\prop_item:Nn \l_@@_tmpa_prop {#1})
+ }
+ \@@_prop_gput_master:nVV {#1} \l_keys_choice_tl \l_@@_tmpb_tl
+ \tl_set:cV { l_@@_unit_change_ #1 _tl } \l_@@_tmpb_tl
+ }
+ }
\prop_put:NnV \l_@@_change_unit_prop {#1} \l_keys_choice_tl
}
% \end{macrocode}
@@ -7058,9 +7558,12 @@
\char_set_catcode_ignore:N\ %
} { {#1} { 1.0 } #2 }
\@@_cusinglekeys_parse_input:V \l_@@_tmpa_tl
- \@@_cusinglekeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
- \@@_cukeys_define_singlekey:nV {#1} \l_@@_tmpa_clist
+ \bool_if:NF \l_@@_unit_error_bool
+ {
+ \@@_cusinglekeys_create_key_prop:n {#1}
+ \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_tmpa_seq
+ \@@_cukeys_define_singlekey:nV {#1} \l_@@_tmpa_clist
+ }
}
% \end{macrocode}
%
@@ -7077,11 +7580,14 @@
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:n {#1}
- \seq_put_right:Nn \l_@@_tmpa_seq {#1}
- \tl_set:Nn \l_@@_tmpa_tl {#2}
- \tl_replace_all:NVn \l_@@_tmpa_tl \c_@@_input_str_hash_one_tl { \l_@@_tmpa_fp }
- \prop_put:NnV \l_@@_tmpa_prop {#1} \l_@@_tmpa_tl
+ \@@_error_if_unit_not_defined:nF {#1}
+ {
+ \seq_if_in:NnF \l_@@_tmpa_seq {#1}
+ { \seq_put_right:Nn \l_@@_tmpa_seq {#1} }
+ \tl_set:Nn \l_@@_tmpa_tl {#2}
+ \tl_replace_all:NVn \l_@@_tmpa_tl \g_@@_input_str_hash_one_tl { \l_@@_tmpa_fp }
+ \prop_put:NnV \l_@@_tmpa_prop {#1} \l_@@_tmpa_tl
+ }
\@@_cusinglekeys_parse_input_aux:nn
}
% \end{macrocode}
@@ -7090,10 +7596,9 @@
\cs_new:Npn \@@_cusinglekeys_create_key_prop:n #1
{
\tl_set:cn { l_@@_unit_change_ #1 _tl } { 1.0 }
+ \tl_set:cn { l_@@_base_key_unit_ #1 _tl } {#1}
\prop_set_eq:cN { l_@@_cukeys_ #1 _prop } \l_@@_tmpa_prop
- \prop_put:cnn { l_@@_cukeys_ #1 _prop } { Erstes Ding } {#1}
\prop_put:cnV { l_@@_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
- \prop_put:cnV { l_@@_cukeys_ #1 _prop } { prop } \l_@@_tmpa_prop
}
% \end{macrocode}
%
@@ -7100,28 +7605,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_cukeys_define_singlekey:nn #1#2
{
- \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
- { \seq_put_right:Nn \l_@@_list_of_defined_keys_seq {#1} }
- \keys_define:nn { cooking-units }
- {
- #1 .choices:Vn =
- \l_@@_tmpa_clist
- {
- \@@_cukeys_define_keys_and_single_key_aux:n {#1}
- } ,
- #1 / unknown .code:n=
- {
- \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
- \msg_error:nnxxx
- { cooking-units }
- { key-choice-unknown }
- {#1}
- {##1}
- { \seq_use:Nnnn \l_tmpa_seq { ',' } { ',' } { ' ~ and ~ ' } }
- } ,
- #1 .default:n = {#1} ,
- #1 .groups:n = { change-unit } ,
- }
+ \@@_cukeys_keys_define:nn {#1} {#2}
}
\cs_generate_variant:Nn \@@_cukeys_define_singlekey:nn { nV }
% \end{macrocode}
@@ -7129,8 +7613,6 @@
%
% \section {Adding Keys}
%
-% Question to me: Why do we need \cs{l_tmpa(b)_tl}?
-% Maybe due to \cs{cuaddtokeys}?
% \begin{macrocode}
\NewDocumentCommand \cuaddkeys { m m }
{
@@ -7161,28 +7643,39 @@
% \begin{macrocode}
\cs_new:Npn \@@_cukeys_add_keys_or_single_keys:nn #1#2
{
- \@@_error_if_unit_not_defined:n {#1}
- \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
- { \msg_error:nnn { cooking-units } { Key-not-defined } {#1} }
- \tl_if_blank:nF {#2}
+ \@@_error_if_unit_not_defined:nF {#1}
{
- \@@_cukeys_add_keys_and_single_key_aux:n {#1}
- \bool_if:NTF \l_@@_single_key_bool
- { \@@_cukeys_parse_and_create_single_key:nn {#1} {#2} }
- { \@@_cukeys_parse_and_create_keys:nn {#1} {#2} }
+ \seq_if_in:NnF \l_@@_list_of_defined_keys_seq {#1}
+ { \msg_error:nnn { cooking-units } { Key-not-defined } {#1} }
+ \tl_if_blank:nF {#2}
+ {
+ \prop_gclear:N \g_@@_master_changer_prop
+ \@@_cukeys_add_keys_and_single_key_aux:n {#1}
+ \bool_if:NTF \l_@@_single_key_bool
+ { \@@_cukeys_parse_and_create_single_key:nn {#1} {#2} }
+ { \@@_cukeys_parse_and_create_keys:Vn \l_@@_original_unit_tl {#2} }
+ }
}
}
\cs_generate_variant:Nn \@@_cukeys_add_keys_or_single_keys:nn { nV }
% \end{macrocode}
%
-%
+%^^A ((((
+% Now this does the following: 1) get the \enquote{original unit} (the unit used
+% in the first argument of |\cudefinekeys|) 2) Get the list of units already in the
+% list (It is important that the units are alway in the same order and one cannot
+% rely on the order of the property-lists 3) Get the property list of the
+% \enquote{original unit}. In the old code I simply stored the whole property list inside
+% another property list, but this shouldn't be done this way. So \dots\ simply
+% copy the original one. 4) As there is a unit added the unit it is added to
+% might not be the \enquote{original unit}. As such we need the conversion factor.
% \begin{macrocode}
\cs_new:Npn \@@_cukeys_add_keys_and_single_key_aux:n #1
{
- \prop_get:cnN { l_@@_cukeys_ #1 _prop } { Liste } \l_@@_tmpa_seq
- \prop_get:cnN { l_@@_cukeys_ #1 _prop } { prop } \l_@@_tmpa_prop
- \prop_get:cnN { l_@@_cukeys_ #1 _prop } { Erstes Ding } \l_@@_given_unit_tl
- \prop_get:cVN { l_@@_cukeys_ #1 _prop } \l_@@_given_unit_tl \l_@@_tmpa_fp
+ \tl_set_eq:Nc \l_@@_original_unit_tl { l_@@_base_key_unit_ #1 _tl }
+ \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
+ \prop_get:NnN\l_@@_tmpa_prop { Liste } \l_@@_tmpa_seq
+ \prop_get:NnN \l_@@_tmpa_prop {#1} \l_@@_tmpa_fp
}
% \end{macrocode}
%
@@ -7226,17 +7719,16 @@
\tl_if_in:NnT \l_@@_unit_letter_not_allowed_tl {##1}
{ \msg_error:nnn { cooking-units } { character-not-allowed } {#2} }
}
- \seq_put_right:Nn \g_@@_list_of_defined_units_seq {#2}
+ \seq_gput_right:Nn \g_@@_list_of_defined_units_seq {#2}
\tl_new:c { l_@@_unit_change_ #2 _tl }
\tl_set:cn { l_@@_unit_change_ #2 _tl } { 1.0 }
- \clist_new:c { l_@@_predefined_option_#2_clist }
+ \clist_new:c { l_@@_unit_option_ #2 _clist }
\keys_define:nn { cooking-units }
{
- set-option-for-#2 .clist_set:c = { l_@@_predefined_option_#2_clist } ,
- add-option-for-#2 .code:n =
- { \clist_put_right:cn { l_@@_predefined_option_#2_clist } {##1} },
+ set-option-for-#2 .code:n = { \cusetoptionfor {#2} {##1} } ,
+ add-option-for-#2 .code:n = { \cuaddoptionfor {#2} {##1} },
}
- \prop_new:c { l_@@_cukeys_ #2 _prop }
+ \tl_new:c { l_@@_base_key_unit_ #2 _tl }
\tl_new:c { l_@@_default_unit_ #2 _tl }
}
}
@@ -7245,19 +7737,186 @@
\IfNoValueTF {#1}
{
\tl_set:cn { l_@@_default_unit_ #2 _tl } {#2}
- \@@_deftranslation_base:xxn {#2} \c_@@_postfix_unit_tl {#2}
+ \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unit_tl {#2}
}{
\tl_set:cn { l_@@_default_unit_ #2 _tl } {#1}
- \@@_deftranslation_base:xxn {#2} \c_@@_postfix_unit_tl {#1}
+ \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unit_tl {#1}
}
- \@@_deftranslation_base:xxn {#2} \c_@@_postfix_unitname_tl { \q_@@_no_translation }
- \@@_deftranslation_base:xxn {#2} \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
- \@@_deftranslation_base:xxn {#2} \c_@@_postfix_gender_tl { m }
+ \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unitname_tl { \q_@@_no_translation }
+ \@@_deftranslation_base:xVn {#2} \c_@@_postfix_unitname_pl_tl { \q_@@_no_translation }
+ \@@_deftranslation_base:xVn {#2} \c_@@_postfix_gender_tl { m }
}
% \end{macrocode}
%
%
%
+% \begin{macro}{\declarecookingderivatives}
+% Now this is an experimental command. The idea is simple: Combine units
+% (like meter and second giving meter per second or in any way possible).
+% The first argument contains a list of the units that should be connected, one of every type is enough.
+% Second is the unit-key, containing |#1|, \dots\ |#(number of units in first argument)|.
+% Third is the calculation. The formula for the new unit should be written in here.
+% And last, but not least: The last argument contains the unit-symbol.
+%
+% Now this command simply defines a bunch of units, declaring them makes things easier.
+% \begin{macrocode}
+\NewDocumentCommand \declarecookingderivatives { m m m m }
+ {
+ \@@_declare_cooking_derivative:nnnn {#1} {#2} {#3} {#4}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% The idea is the following. The relation between the units are given as
+% |(#1)/(#2)| (e.g.). The idea is the following:
+% \begin{enumerate}
+% \item The derivative contains two units.
+% \item The mathematical relationship is given by |(#1)/(#2)|
+% \item Define |\@@_tmp:w| to be |(#1)/(#2)|.
+% \item Parse through all values and store them in a list (e.g. |\l_tmpa_t|) as | {value-1}{value-2} |
+% \item Use |\exp_after:wN \@@_tmp:w \l_tmpa_t | to expand to |\@@_tmp:w {value-1} {value-2} |
+% \item Let |\@@_tmp:w| do its job.
+% \end{enumerate}
+%
+% \begin{macro}{\@@_tl_set_list:Nnn, \@@_tl_set_list:NnV, \@@_tl_set_list:NVV, \@@_tl_set_list_aux:Nnnnnnnnn }
+% The following argument creates the list. I am a bit lazy here and don't quite know how
+% to do it \enquote{correctly}. And I know, there are too many |\q_nil|.
+% \begin{macrocode}
+\cs_new:Npn \@@_tl_set_list:Nnn #1#2#3
+ {
+ \@@_tl_set_list_aux:Nnnnnnnnn #1 {#2} #3
+ \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil
+ \q_recursion_stop
+ }
+\cs_generate_variant:Nn \@@_tl_set_list:Nnn { NnV, NVV }
+\cs_new:Npn \@@_tl_set_list_aux:Nnnnnnnnn #1#2#3#4#5#6#7#8#9
+ {
+ \tl_set:Nf #1
+ {
+ \int_case:nn { \l_@@_curr_depth_int }
+ {
+ { 1 } { }
+ { 2 } { {#3} }
+ { 3 } { {#3}{#4} }
+ { 4 } { {#3}{#4}{#5} }
+ { 5 } { {#3}{#4}{#5}{#6} }
+ { 6 } { {#3}{#4}{#5}{#6}{#7} }
+ { 7 } { {#3}{#4}{#5}{#6}{#7}{#8} }
+ { 8 } { {#3}{#4}{#5}{#6}{#7}{#8}{#9} }
+ }
+ {#2}
+ }
+ \use_none_delimit_by_q_recursion_stop:w
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro} { \@@_declare_cooking_derivative:nnnn }
+% This command has the following parts:
+% \begin{enumerate}
+% \item Get list of units in |#1|, count their number and store in |\l_@@_max_depth_int|
+% \item Use |\cs_generate_from_arg_count:NNnn| to create the commands
+% \item Define lists |l_@@_tmp_ 1 ... \l_@@_max_depth_int |, same for prop. I know
+% that there is a better way to do it, but this \emph{is} experimental. In the end, it
+% safes a bit of brain-power for me.
+% \item The main part: Map trough all units in the |l_@@_cukeys_ <unit> _prop| lists.
+% \item Create key-porperty and define keys.
+% \end{enumerate}
+% \begin{macrocode}
+\cs_new:Npn \@@_declare_cooking_derivative:nnnn #1#2#3#4
+ {
+ \prop_gclear:N \g_@@_master_changer_prop
+ \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
+ \seq_clear:N \l_@@_number_of_iterations_seq
+ \seq_clear:N \l_@@_derivative_unit_list_seq
+ \seq_clear:N \l_@@_derivative_symbol_list_seq
+ \seq_clear:N \l_@@_derivative_value_list_seq
+ \int_set:Nn \l_@@_max_depth_int { \seq_count:N \l_@@_tmpa_seq }
+ \int_set:Nn \l_@@_curr_depth_int { 1 }
+% \end{macrocode}
+% \begin{macrocode}
+ \cs_generate_from_arg_count:NNnn \@@_tmp_unit_and_symbol_list:w \cs_set:Npn
+ { \l_@@_max_depth_int }
+ {
+ \seq_put_right:Nn \l_@@_derivative_unit_list_seq {#2}
+ \seq_put_right:Nn \l_@@_derivative_symbol_list_seq {#4}
+ }
+ \cs_generate_from_arg_count:NNnn \@@_tmp_value_list:w \cs_set:Npn
+ { \l_@@_max_depth_int }
+ { \seq_put_right:Nx \l_@@_derivative_value_list_seq { \fp_eval:n {#3} } }
+% \end{macrocode}
+% \begin{macrocode}
+ \int_step_inline:nn { \l_@@_max_depth_int }
+ {
+ \tl_set_eq:Nc \l_@@_original_unit_tl
+ { l_@@_base_key_unit_ \seq_item:Nn \l_@@_tmpa_seq {##1} _tl }
+ \prop_set_eq:Nc \l_@@_tmpa_prop { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
+ \prop_get:NnN \l_@@_tmpa_prop { Liste } \l_@@_tmpb_seq
+ \int_set:Nn \l_@@_tmpa_int { \seq_count:N \l_@@_tmpb_seq }
+% \end{macrocode}
+% \begin{macrocode}
+ \seq_put_right:NV \l_@@_number_of_iterations_seq \l_@@_tmpa_int
+ \seq_clear_new:c { l_@@_tmp_ ##1 _seq }
+ \prop_clear_new:c { l_@@_tmp_ ##1 _prop }
+ \seq_set_eq:cN { l_@@_tmp_ ##1 _seq } \l_@@_tmpb_seq
+ \prop_set_eq:cN { l_@@_tmp_ ##1 _prop } \l_@@_tmpa_prop
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \seq_map_function:cN
+ { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _seq }
+ \@@_seq_step_function:n
+% \end{macrocode}
+% \begin{macrocode}
+ \seq_get_left:NN \l_@@_derivative_unit_list_seq \l_@@_original_unit_tl
+ \prop_clear_new:c { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
+% \end{macrocode}
+% \begin{macrocode}
+ \int_zero:N \l_@@_tmpa_int
+ \clist_set_from_seq:NN \l_@@_tmpa_clist \l_@@_derivative_unit_list_seq
+ \seq_map_inline:Nn \l_@@_derivative_unit_list_seq
+ {
+ \int_incr:N \l_@@_tmpa_int
+ \tl_set:Nx \l_@@_tmpa_tl { \seq_item:Nn \l_@@_derivative_symbol_list_seq { \l_@@_tmpa_int } }
+ \exp_after:wN \declarecookingunit \exp_after:wN [ \l_@@_tmpa_tl ] {##1}
+ \prop_put:cnx
+ { l_@@_cukeys_ \l_@@_original_unit_tl _prop }
+ {##1}
+ { \seq_item:Nn \l_@@_derivative_value_list_seq { \l_@@_tmpa_int } }
+ \tl_clear_new:c { l_@@_base_key_unit_ ##1 _tl }
+ \tl_set_eq:cN { l_@@_base_key_unit_ ##1 _tl } \l_@@_original_unit_tl
+ \exp_args:NnV \@@_cukeys_keys_define:nn {##1} \l_@@_tmpa_clist
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\cs_new:Npn \@@_seq_step_function:n #1
+ {
+ \@@_tl_set_list:NnV \l_@@_list_of_units_tl {#1} \l_@@_list_of_units_tl
+ \prop_get:cnN { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _prop } {#1} \l_@@_tmpa_tl
+ \@@_tl_set_list:NVV \l_@@_list_of_values_tl \l_@@_tmpa_tl \l_@@_list_of_values_tl
+ \int_compare:nNnTF { \l_@@_curr_depth_int } = { \l_@@_max_depth_int }
+ {
+ \exp_after:wN \@@_tmp_unit_and_symbol_list:w \l_@@_list_of_units_tl
+ \exp_after:wN \@@_tmp_value_list:w \l_@@_list_of_values_tl
+ }{
+ \int_incr:N \l_@@_curr_depth_int
+ \seq_map_function:cN
+ { l_@@_tmp_ \int_use:N \l_@@_curr_depth_int _seq }
+ \@@_seq_step_function:n
+ \int_decr:N \l_@@_curr_depth_int
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+%
+%
% \section {Names}
%
% Stolen from \pkg{l3keys.dtx}
@@ -7358,15 +8017,16 @@
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \@@_error_if_unit_not_defined:n {#1}
+ \@@_error_if_unit_not_defined:nT {#1}
+ { \use_none_delimit_by_q_recursion_stop:w }
\quark_if_no_value:nTF {#2}
{
- \@@_deftranslation_to:Vxxv
+ \@@_deftranslation_to:VxVv
\l_@@_language_tl {#1}
\c_@@_postfix_unit_tl
{ l_@@_default_unit_ #1 _tl }
}{
- \@@_deftranslation_to:Vxxn
+ \@@_deftranslation_to:VxVn
\l_@@_language_tl {#1}
\c_@@_postfix_unit_tl {#2}
}
@@ -7382,8 +8042,11 @@
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
\seq_if_in:NnF \g_@@_allowed_special_keys_seq {#1}
- { \@@_error_if_unit_not_defined:n {#1} }
- \@@_deftranslation_to:Vxxn
+ {
+ \@@_error_if_unit_not_defined:nT {#1}
+ { \use_none_delimit_by_q_recursion_stop:w }
+ }
+ \@@_deftranslation_to:VxVn
\l_@@_language_tl {#1}
\c_@@_postfix_unitname_tl {#2}
\peek_meaning_ignore_spaces:NTF [
@@ -7397,7 +8060,7 @@
{
\seq_if_in:NnF \g_@@_allowed_special_keys_seq {#1}
{
- \@@_deftranslation_to:Vxxn \l_@@_language_tl {#1}
+ \@@_deftranslation_to:VxVn \l_@@_language_tl {#1}
\c_@@_postfix_unitname_pl_tl {#2}
}
\peek_meaning_ignore_spaces:NTF <
@@ -7409,10 +8072,20 @@
% \begin{macrocode}
\cs_new:Npn \@@_cuname_parse_gender:nw #1 <#2>
{
- \@@_check_if_correct_gender_input:n {#2}
- \@@_deftranslation_to:Vxxn
- \l_@@_language_tl {#1}
- \c_@@_postfix_gender_tl {#2}
+% \@@_check_if_correct_gender_input:n {#2}
+% \@@_deftranslation_to:VxVn
+% \l_@@_language_tl {#1}
+% \c_@@_postfix_gender_tl {#2}
+ \@@_if_gender_error:nTF {#2}
+ {
+ \@@_deftranslation_to:VxVn
+ \l_@@_language_tl {#1}
+ \c_@@_postfix_gender_tl { m }
+ }{
+ \@@_deftranslation_to:VxVn
+ \l_@@_language_tl {#1}
+ \c_@@_postfix_gender_tl {#2}
+ }
\@@_cuname_parse_input:n
}
% \end{macrocode}
@@ -7439,13 +8112,15 @@
{ \msg_error:nn { cooking-units } { missing-argument } }
\seq_if_in:NnTF \g_@@_allowed_special_keys_seq {#1}
{
- \@@_deftranslation_to:Vxxn \l_@@_language_tl {#1}
+ \@@_deftranslation_to:VxVn \l_@@_language_tl {#1}
\c_@@_postfix_unitname_tl {#2}
}{
- \@@_error_if_unit_not_defined:n {#1}
- \@@_deftranslation_to:Vxxn
- \l_@@_language_tl {#1}
- \c_@@_postfix_unit_tl {#2}
+ \@@_error_if_unit_not_defined:nF {#1}
+ {
+ \@@_deftranslation_to:VxVn
+ \l_@@_language_tl {#1}
+ \c_@@_postfix_unit_tl {#2}
+ }
}
\@@_cuprint_define_printed_unit:nn
}
@@ -7520,11 +8195,11 @@
}
% \end{macrocode}
% \begin{macrocode}
- \@@_deftranslation_to:VxxV
+ \@@_deftranslation_to:VxVV
\l_@@_language_tl { phrase-prop }
\c_@@_postfix_phrase_tl
\l_@@_phrase_prop
- \@@_deftranslation_to:VxxV
+ \@@_deftranslation_to:VxVV
\l_@@_language_tl { phrase-clist }
\c_@@_postfix_phrase_tl \l_@@_phrase_numbers_seq
}
@@ -7582,10 +8257,16 @@
% \begin{macrocode}
\cs_new:Npn \@@_chuphrase_parse_gender:nw #1 <#2>
{
- \@@_check_if_correct_gender_input:n {#2}
- \@@_deftranslation_to:Vxxn
- \l_@@_language_tl { #1-phrase-gender }
- \c_@@_postfix_gender_tl {#2}
+ \@@_if_gender_error:nTF {#2}
+ {
+ \@@_deftranslation_to:VxVn
+ \l_@@_language_tl { #1-phrase-gender }
+ \c_@@_postfix_gender_tl { m }
+ }{
+ \@@_deftranslation_to:VxVn
+ \l_@@_language_tl { #1-phrase-gender }
+ \c_@@_postfix_gender_tl {#2}
+ }
\@@_cuphrase_parse:n
}
% \end{macrocode}
@@ -7599,7 +8280,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_old_cutext:nnn #1#2#3
{
- \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_given_unit_tl
+ \tl_set_eq:NN \l_@@_option_unit_tl \l_@@_original_unit_tl
\@@_old_cutext_default:nnn {#1} {#2} {#3}
}
% \end{macrocode}
@@ -7752,7 +8433,7 @@
\cs_new:Npn \@@_cuam_old_parse_mixed_frac:www #1_#2/#3 \q_stop
{
#1
- \@@_dim_horizontal:N \l_@@_mixed_frac_dim
+ \skip_horizontal:N \l_@@_mixed_frac_dim
\@@_frac:nn {#2} {#3}
}
% \end{macrocode}
@@ -7800,14 +8481,148 @@
\cs_new:Npn \@@_cufrac_parse_mixed_frac:www #1_#2/#3 \q_stop
{
#1
- \@@_dim_horizontal:N \l_@@_mixed_frac_dim
+ \skip_horizontal:N \l_@@_mixed_frac_dim
\@@_frac:nn {#2} {#3}
}
% \end{macrocode}
%
%
+%
%
+% \begin{macrocode}
+\cs_new:Npn \@@_add_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnF \l_@@_curef_do_not_change_seq {##1}
+ { \seq_put_right:Nn \l_@@_curef_do_not_change_seq {##1} }
+ }
+ }
+ }
+\cs_new:Npn \@@_remove_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l_@@_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \@@_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnTF \l_@@_curef_do_not_change_seq {##1}
+ { \seq_remove_all:Nn \l_@@_curef_do_not_change_seq {##1} }
+ {
+ \msg_warning:nnnn { cooking-units } { curef-not-inside-list } {##1}
+ { \@@_seq_use_msg:N \l_@@_curef_do_not_change_seq }
+ }
+ }
+ }
+ }
+\cs_new:Npn \@@_clear_forbidden_unit:
+ { \seq_clear:N \l_@@_curef_do_not_change_seq }
+% \end{macrocode}
%
+%
+%
+%
+%
+%
+% \begin{macrocode}
+\NewDocumentCommand \cudeclareunitgroup { m m }
+ {
+ \@@_define_clear_unit_group:nn {#1} {#2}
+ \@@_add_to_unit_group:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuaddtounitgroup { m m }
+ {
+ \@@_add_to_unit_group:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuclearunitgroup { m }
+ {
+ \@@_error_if_group_not_defined:nF {#1}
+ { \@@_define_clear_unit_group:nn {#1} { } }
+ }
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% Works better now.
+% \begin{macrocode}
+\NewDocumentCommand \cusetoptionfor { m m }
+ {
+ \@@_map_trough_valid_unit_options:nnn {#1} {#2}
+ { \clist_set:cn { l_@@_unit_option_ ##1 _clist } {##2} }
+ }
+\NewDocumentCommand \cuaddoptionfor { m m }
+ {
+ \@@_map_trough_valid_unit_options:nnn {#1} {#2}
+ { \clist_put_right:cn { l_@@_unit_option_ ##1 _clist } {##2} }
+ }
+\NewDocumentCommand \cuclearoptionfor { m }
+ {
+ \@@_map_trough_valid_unit_options:nnn {#1} { }
+ { \clist_clear:c { l_@@_unit_option_ ##1 _clist } }
+ }
+% \end{macrocode}
+% The reason I map trough the units twice is simply: I think it makes more
+% sense if an \enquote{unknown unit} error is shown before an
+% \enquote{unknown option} error (at least for me).
+% It is kinda stupid, but this is not really a heavily used function, so \dots\ yeah.
+%
+% Note: I cannot check if |\l_@@_tmpa_clist| is empty because one could
+% use |\cusetoptionfor{F,C,Re,K}{}| to clear the options of the given units.
+% \begin{macrocode}
+\cs_new:Npn \@@_tmp:w { }
+\cs_new:Npn \@@_map_trough_valid_unit_options:nnn #1#2 #3
+ {
+ \seq_clear:N \l_@@_tmpa_seq
+ \clist_clear:N \l_@@_tmpa_clist
+ \cs_set:Npn \@@_tmp:w ##1##2 {#3}
+ \clist_map_inline:nn {#1}
+ {
+ \@@_error_if_unit_not_defined:nF {##1}
+ { \seq_put_right:Nn \l_@@_tmpa_seq {##1} }
+ }
+ \tl_if_empty:nF {#2}
+ { \@@_unit_options_check_validity:n {#2} }
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ { \exp_args:NnV \@@_tmp:w {##1} \l_@@_tmpa_clist }
+ }
+\cs_new:Npn \@@_unit_options_check_validity:n #1
+ {
+ \keyval_parse:NNn
+ \@@_unit_options_check_validity_aux_i:n
+ \@@_unit_options_check_validity_aux_ii:nn
+ {#1}
+ }
+\cs_new:Npn \@@_unit_options_check_validity_aux_i:n #1
+ {
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \clist_put_right:Nn \l_@@_tmpa_clist {#1} }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
+ }
+\cs_new:Npn \@@_unit_options_check_validity_aux_ii:nn #1#2
+ {
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \clist_put_right:Nn \l_@@_tmpa_clist { #1={#2} } }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
+ }
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+%
% \subsection {cusetup}
%
% \begin{macrocode}
@@ -7821,6 +8636,9 @@
%
% \subsection{Definitions et all}
%
+% Plase note that at his point we are still inside the Expl3 \enquote{Environment}
+% and that spaces are ignored!
+%
% \begin{macrocode}
\newcookingunit { kg }
\newcookingunit { dag }
@@ -8091,9 +8909,9 @@
{
{ dag }{ 100 }
{ g } { 1000 }
- { oz } { 35.27399 }
- { lb } { 2.2046226 } %% 2.204 622 6
- { stick } { 8.81849 }
+ { lb } { 1/0.45359237 }
+ { oz } { 16/0.45359237 }
+ { stick } { 4/0.45359237 }
{ eVc-2 } { 560958865.0e+27 } %% 560958865.0 +- 3.5 e+27
}
% \end{macrocode}
@@ -8113,7 +8931,7 @@
{ dm } { 10 }
{ cm } { 100 }
{ mm } { 1000 }
- { in } { 39.370079 }
+ { in } { 36/0.9144 }
{ chbareV-1 } { 5067730.759 } %% 5067730.759 +- 0.070
}
%\cuaddtokeys { m } { chbareV-1 } { 1.97326972e-7 }
@@ -8186,12 +9004,15 @@
% \subsection{Finish}
%
% \begin{macrocode}
+\cudeclareunitgroup { weight } { kg , dag, g, oz, lb, stick }
+\cudeclareunitgroup { length } { m , dm , cm , mm , in }
+\cudeclareunitgroup { volume } { l , dl , cl , ml }
+\cudeclareunitgroup { temperature } { C , F , K , Re }
+\cudeclareunitgroup { energy } { cal, kcal , J , kJ , eV }
+\cudeclareunitgroup { time } { d , h , min , s }
+\cusetoptionfor { F , C , K , Re } { round-precision = 0 }
\cusetup
{
- set-option-for-F = { round-to-int = true } ,
- set-option-for-C = { round-to-int = true } ,
- set-option-for-K = { round-to-int = true } ,
- set-option-for-Re = { round-to-int = true } ,
curef-add-forbidden-unit = { F , C , K , Re } ,
add-temperature-to-check =
{
@@ -8223,14 +9044,25 @@
%
% \begin{thebibliography}{}
% \bibitem{Gattopardo}
-% Guiseppe Tomasi di Lampedusa, \enquote{Der Gattopardo},
+% Guiseppe Tomasi di Lampedusa, \emph{Der Gattopardo},
% Piper, Volume~8 (2018), ISBN~978-3-492-24586-9
%
% \bibitem{Sh:3}
-% Sir Arthur Conan Doyle, \enquote{Sherlock Holmes The Complete Novels and Stories Volume~II},
+% Sir Arthur Conan Doyle, \emph{Sherlock Holmes The Complete Novels and Stories Volume~II},
% Bantam Books
-%
%
+% \bibitem{Nist2008} \emph{Guide for the Use of the International System of Units (SI)},
+% NIST Special Publication 811, 2008 Edition, Ambler Thompson and Barry N. Taylor
+%
+% \bibitem{Nist2006} \emph{The International System of Units (SI) – Conversion Factors
+% for General Use}, NIST Special Publication 1038, May 2006,
+% Kenneth Butcher, Linda Crown and Elizabeth J. Gentry
+%
+% \bibitem{WM1985} \emph{Weights and Measures Act 1985},
+% \url{https://www.legislation.gov.uk/ukpga/1985/72}
+%
+% \bibitem{StickSource} \url{https://cooking.stackexchange.com/questions/784/translating-cooking-terms-between-us-uk-au-ca-nz}
+%
% \end{thebibliography}
%
%
Modified: trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.ins 2020-01-14 21:51:18 UTC (rev 53402)
+++ trunk/Master/texmf-dist/source/latex/cooking-units/cooking-units.ins 2020-01-14 21:51:33 UTC (rev 53403)
@@ -5,7 +5,7 @@
%% The original source files were:
%%
%% cooking-units.dtx (with options: `install')
-%% Copyright (C) 2016--2018 by Ben Vitecek (current Maintainer)
+%% Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -12,7 +12,7 @@
%% version 1.3c of this license or (at your option) any later
%% version. The latest version of this license is in:
%%
-%% https://ctan.org/license/lppl1.3c
+%% https://www.latex-project.org/lppl/
%%
%% and version 1.3c or later is part of all distributions of
%% LaTeX version 2008-05-04 or later.
@@ -25,7 +25,7 @@
\input l3docstrip.tex
\askforoverwritefalse
\preamble
-Copyright (C) 2016--2018 by Ben Vitecek (current Maintainer)
+Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -32,7 +32,7 @@
version 1.3c of this license or (at your option) any later
version. The latest version of this license is in:
-https://ctan.org/license/lppl1.3c
+ https://www.latex-project.org/lppl/
and version 1.3c or later is part of all distributions of
LaTeX version 2008-05-04 or later.
Modified: trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty 2020-01-14 21:51:18 UTC (rev 53402)
+++ trunk/Master/texmf-dist/tex/latex/cooking-units/cooking-units.sty 2020-01-14 21:51:33 UTC (rev 53403)
@@ -5,7 +5,7 @@
%% The original source files were:
%%
%% cooking-units.dtx (with options: `package')
-%% Copyright (C) 2016--2018 by Ben Vitecek (current Maintainer)
+%% Copyright (C) 2016--2020 by Ben Vitecek (current Maintainer)
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -12,7 +12,7 @@
%% version 1.3c of this license or (at your option) any later
%% version. The latest version of this license is in:
%%
-%% https://ctan.org/license/lppl1.3c
+%% https://www.latex-project.org/lppl/
%%
%% and version 1.3c or later is part of all distributions of
%% LaTeX version 2008-05-04 or later.
@@ -30,8 +30,8 @@
{ \RequirePackage {expl3} }
\ProvidesExplPackage
{cooking-units}
- {2018/09/24}
- {1.45}
+ {2020/01/13}
+ {1.46}
{Ein Paket fuer Kocheinheiten}
\@ifpackagelater { expl3 } { 2018/08/23 }
{ }
@@ -57,11 +57,25 @@
}
\tex_endinput:D
}
+\msg_new:nnnn { cooking-units } { Option-deprecated }
+ {
+ The \ option \ '#1' \ is \ deprecated \ and \ should \ be \
+ replaced \ by \ '#2'.
+ }{
+ Please \ replace \ the \ option.
+ \msg_see_documentation_text:n { cooking-units }
+ }
\bool_new:N \g__cookingunits_opt_numeral_bool
\keys_define:nn { cooking-units }
{
- use-numerals .bool_gset:N = \g__cookingunits_opt_numeral_bool ,
+ use-numerals .code:n =
+ {
+ \msg_warning:nnnn { cooking-units } { Option-deprecated } { use-numerals } { use-fmtcount-numerals }
+ \keys_set:nn { cooking-units } { use-fmtcount-numerals = #1 }
+ } ,
use-numerals .default:n = { false },
+ use-fmtcount-numerals .bool_gset:N = \g__cookingunits_opt_numeral_bool ,
+ use-fmtcount-numerals .default:n = { false },
}
\ProcessKeysOptions { cooking-units }
\bool_if:NT \g__cookingunits_opt_numeral_bool
@@ -70,7 +84,12 @@
}
\keys_define:nn { cooking-units }
{
- use-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { fmtcount } } ,
+ use-numerals .code:n =
+ {
+ \msg_warning:nnnn { cooking-units } { Option-deprecated } { use-numerals } { use-fmtcount-numerals }
+ \msg_error:nnn { cooking-units } { load-time-option } { fmtcount }
+ } ,
+ use-fmtcount-numerals .code:n = { \msg_error:nnn { cooking-units } { load-time-option } { fmtcount } } ,
}
\cs_generate_variant:Nn \tl_replace_all:Nnn { NVn }
\cs_generate_variant:Nn \tl_replace_once:Nnn { NVn }
@@ -83,12 +102,14 @@
\cs_generate_variant:Nn \msg_error:nnnn { nnnV }
\cs_generate_variant:Nn \msg_error:nnn { nnV }
\cs_generate_variant:Nn \msg_warning:nnn { nnV }
-\cs_new:Npn \__cookingunits_dim_horizontal:N #1 { \tex_kern:D #1 }
+\cs_generate_variant:Nn \prop_put:Nnn { cnx }
\cs_new_eq:NN \__cookingunits_frac:nn \sfrac
\cs_new_eq:NN \__cookingunits_set_amount:Nn \tl_set:Nn
\cs_new_eq:NN \__cookingunits_set_unit:Nn \tl_set:Nn
-\cs_new:Npn \__cookingunits_print_numeral:n #1 { }
-\cs_new:Npn \__cookingunits_print_Numeral:n #1 { }
+\cs_new:Npn \__cookingunits_print_numeral:n #1
+ { \msg_error:nnn {cooking-units} { define-numeral-function } }
+\cs_new:Npn \__cookingunits_print_Numeral:n #1
+ { \msg_error:nnn {cooking-units} { define-Numeral-function } }
\bool_if:NT \g__cookingunits_opt_numeral_bool
{
\cs_set_eq:NN \__cookingunits_print_numeral:n \numberstringnum
@@ -95,13 +116,12 @@
\cs_set_eq:NN \__cookingunits_print_Numeral:n \Numberstringnum
}
\prop_new:N \l__cookingunits_change_unit_prop
+\prop_new:N \g__cookingunits_master_changer_prop
\tl_new:N \l__cookingunits_number_tmpa_tl
\tl_new:N \l__cookingunits_number_tmpb_tl
-\tl_new:N \l__cookingunits_tmpa_tl
-\tl_new:N \l__cookingunits_tmpb_tl
\tl_new:N \l__cookingunits_mixed_fraction_tl
-\tl_new:N \l__cookingunits_given_amount_tl
-\tl_new:N \l__cookingunits_given_unit_tl
+\tl_new:N \l__cookingunits_original_amount_tl
+\tl_new:N \l__cookingunits_original_unit_tl
\tl_new:N \l__cookingunits_option_unit_tl
\tl_new:N \l__cookingunits_language_tl
\tl_new:N \l__cookingunits_cunum_range_sign_tl
@@ -111,7 +131,7 @@
\tl_new:N \l__cookingunits_input_decimal_mark_tl
\tl_new:N \l__cookingunits_input_value_signs_tl
\tl_new:N \l__cookingunits_input_allowed_special_signs_tl
-\tl_new:N \c__cookingunits_input_str_hash_one_tl
+\tl_new:N \g__cookingunits_input_str_hash_one_tl
\tl_new:N \l__cookingunits_input_range_sign_tl
\tl_new:N \l__cookingunits_cutext_space_tl
\tl_new:N \l__cookingunits_cuphrase_space_tl
@@ -122,6 +142,8 @@
\tl_new:N \l__cookingunits_unit_letter_not_allowed_tl
\tl_new:N \l__cookingunits_input_fraction_sign_tl
\tl_new:N \l__cookingunits_input_mixed_fraction_sign_tl
+\tl_new:N \l__cookingunits_list_of_units_tl
+\tl_new:N \l__cookingunits_list_of_values_tl
\tl_new:N \l__cookingunits_cunum_hook_tl
\tl_new:N \l__cookingunits_cutext_hook_tl
\tl_new:N \l__cookingunits_Cutext_hook_tl
@@ -133,10 +155,10 @@
\tl_set:Nn \l__cookingunits_input_decimal_mark_tl { . , }
\tl_set:Nn \l__cookingunits_input_value_signs_tl { + - }
\tl_set:Nn \l__cookingunits_input_allowed_special_signs_tl { ? }
-\tl_set_rescan:Nnn \c__cookingunits_input_str_hash_one_tl
+\tl_gset_rescan:Nnn \g__cookingunits_input_str_hash_one_tl
{ \char_set_catcode_letter:N \# } {#1}
\tl_set:Nn \l__cookingunits_cunum_range_sign_tl { -- }
-\tl_set:Nn \l__cookingunits_cutext_range_sign_tl {}
+\tl_set:Nn \l__cookingunits_cutext_range_sign_tl { }
\tl_set:Nn \l__cookingunits_value_unit_space_tl { \thinspace }
\tl_set:Nn \l__cookingunits_cutext_space_tl { \space }
\tl_set:Nn \l__cookingunits_cuphrase_space_tl { \space }
@@ -177,6 +199,12 @@
\seq_new:N \g__cookingunits_list_of_defined_units_seq
\seq_new:N \g__cookingunits_allowed_special_keys_seq
\seq_new:N \l__cookingunits_phrase_numbers_seq
+\seq_new:N \l__cookingunits_number_of_iterations_seq
+\seq_new:N \l__cookingunits_derivative_unit_list_seq
+\seq_new:N \l__cookingunits_derivative_symbol_list_seq
+\seq_new:N \l__cookingunits_derivative_value_list_seq
+\int_new:N \l__cookingunits_max_depth_int
+\int_new:N \l__cookingunits_curr_depth_int
\seq_new:N \l__cookingunits_temperatures_to_check_seq
\seq_new:N \l__cookingunits_curef_do_not_change_seq
\prop_new:N \l__cookingunits_phrase_prop
@@ -183,7 +211,9 @@
\bool_new:N \l__cookingunits_minus_bool
\bool_new:N \l__cookingunits_round_number_bool
\bool_new:N \l__cookingunits_error_bool
+\bool_new:N \l__cookingunits_unit_error_bool
\bool_new:N \l__cookingunits_eval_fractions_bool
+\bool_new:N \l__cookingunits_convert_fractions_bool
\bool_new:N \l__cookingunits_draft_bool
\bool_new:N \l__cookingunits_round_to_int_bool
\bool_new:N \l__cookingunits_special_sign_bool
@@ -191,7 +221,6 @@
\bool_new:N \l__cookingunits_check_temperature_bool
\bool_new:N \l__cookingunits_convert_to_eV_bool
\bool_new:N \l__cookingunits_cutext_uppercase_word_bool
-\bool_new:N \l__cookingunits_error_for_unknown_value_bool
\bool_new:N \l__cookingunits_using_cutext_bool
\bool_new:N \l__cookingunits_cuam_old_bool
\bool_new:N \l__cookingunits_change_number_of_persons_bool
@@ -205,21 +234,20 @@
\bool_new:N \l__cookingunits_lokal_phrase_bool
\bool_new:N \l__cookingunits_print_numeral_bool
\bool_new:N \l__cookingunits_lokal_numeral_bool
-\bool_new:N \l__cookingunits_round_precision_positive_bool
+\bool_new:N \l__cookingunits_round_precision_negative_bool
\bool_new:N \l__cookingunits_fourty_two_bool
\bool_new:N \l__cookingunits_phrase_negative_bool
\bool_new:N \l__cookingunits_range_in_input_bool
\bool_new:N \l__cookingunits_lokal_fraction_bool
\bool_new:N \l__cookingunits_print_fraction_bool
-\bool_new:N \l__cookingunits_lokal_mixed_fraction_bool
\bool_new:N \l__cookingunits_check_decimal_bool
\bool_set_false:N \l__cookingunits_cutext_keep_unit_bool
\bool_set_eq:NN \l__cookingunits_print_numeral_bool \g__cookingunits_opt_numeral_bool
\quark_new:N \q__cookingunits_range
\quark_new:N \q__cookingunits_no_translation
-\quark_new:N \q__cookingunits_decimal
-\quark_new:N \q__cookingunits_fraction
-\quark_new:N \q__cookingunits_mixed_fraction
+\tl_new:N \l__cookingunits_tmpa_tl
+\tl_new:N \l__cookingunits_tmpb_tl
+\tl_new:N \l__cookingunits_tmp_unit_tl
\fp_new:N \l__cookingunits_tmpa_fp
\clist_new:N \l__cookingunits_tmpa_clist
\prop_new:N \l__cookingunits_tmpa_prop
@@ -232,8 +260,8 @@
add-unit-to-group .code:n =
{
\keyval_parse:NNn
- \__cookingunits_unit_group_add_unit_error:n
- \__cookingunits_unit_group_add_unit:nn
+ \__cookingunits_add_to_unit_group_error:n
+ \__cookingunits_add_to_unit_group:nn
{#1}
} ,
add-unit-to-group .default:n = {} ,
@@ -253,18 +281,12 @@
},
erase-all-options .code:n =
{
- \seq_map_inline:Nn \g__cookingunits_list_of_defined_units_seq
- {
- \clist_clear:c { l__cookingunits_predefined_option_ ##1 _clist }
- }
+ \exp_args:Nx \cuclearoptionfor { \seq_use:Nn \g__cookingunits_list_of_defined_units_seq { , } }
},
erase-all-options .value_forbidden:n = { true } ,
erase-all-options-for .code:n =
{
- \keyval_parse:NNn
- \__cookingunits_erase_options_for:n
- \__cookingunits_erase_options_for_error:nn
- {#1}
+ \cuclearoptionfor {#1}
},
erase-all-options-for .value_required:n = { true } ,
cutext-to-cunum .bool_set:N = \l__cookingunits_cutext_to_cunum_bool ,
@@ -373,11 +395,24 @@
{
\int_set:Nn \l__cookingunits_round_precision_int {#1}
\int_compare:nNnTF {#1} < { 0 }
- { \bool_set_false:N \l__cookingunits_round_precision_positive_bool }
- { \bool_set_true:N \l__cookingunits_round_precision_positive_bool }
+ { \bool_set_true:N }
+ { \bool_set_false:N }
+ \l__cookingunits_round_precision_negative_bool
} ,
round-precision .default:n = { 2 } ,
round-to-int .bool_set:N = \l__cookingunits_round_to_int_bool ,
+ round-to-int .choices:nn =
+ { true , false }
+ {
+ \msg_error:nnnn { cooking-units } { Option-deprecated } { round-to-int } { round-precision = 0 }
+ \int_compare:nNnTF { \l_keys_choice_int } = { 1 }
+ {
+ \int_set:Nn \l__cookingunits_round_precision_int { 0 }
+ }{
+
+ }
+ \use:c { bool_set_ \l_keys_choice_tl :N } \l__cookingunits_round_to_int_bool
+ } ,
round-to-int .default:n = { false } ,
round-half .choices:nn =
{ default , commercial }
@@ -391,6 +426,8 @@
round-half .default:n = { default },
eval-fraction .bool_set:N = \l__cookingunits_eval_fractions_bool ,
eval-fraction .default:n = { false } ,
+ convert-fraction .bool_set:N = \l__cookingunits_convert_fractions_bool ,
+ convert-fraction .default:n = { true } ,
fraction-command .code:n = { \cs_set_eq:NN \__cookingunits_frac:nn #1 } ,
fraction-command .default:n = { \sfrac } ,
fraction-inline .code:n = { \cs_set:Npn \__cookingunits_frac:nn ##1##2 {#1} } ,
@@ -428,10 +465,15 @@
convert-to-eV .groups:n = { change-unit } ,
add-natural-unit .code:n =
{
- \__cookingunits_error_if_unit_not_defined:n {#1}
\seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
- \seq_concat:NNN \g__cookingunits_natural_units_seq \g__cookingunits_natural_units_seq \l__cookingunits_tmpa_seq
- \seq_remove_duplicates:N \g__cookingunits_natural_units_seq
+ \seq_map_inline:Nn \l__cookingunits_tmpa_seq
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnF \g__cookingunits_natural_units_seq {##1}
+ { \seq_gput_right:Nn \g__cookingunits_natural_units_seq {##1} }
+ }
+ }
} ,
add-natural-unit .value_required:n = { true } ,
42 .choice: ,
@@ -453,32 +495,12 @@
cutext-add-hook .code:n = { \tl_put_right:Nn \l__cookingunits_cutext_hook_tl {#1} } ,
Cutext-add-hook .code:n = { \tl_put_right:Nn \l__cookingunits_Cutext_hook_tl {#1} } ,
cuam-add-hook .code:n = { \tl_put_right:Nn \l__cookingunits_cuam_hook_tl {#1} } ,
- curef-add-forbidden-unit .code:n =
- {
- \seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
- \seq_map_inline:Nn \l__cookingunits_tmpa_seq
- {
- \seq_if_in:NnF \l__cookingunits_curef_do_not_change_seq {##1}
- { \seq_put_right:Nn \l__cookingunits_curef_do_not_change_seq {##1} }
- }
- } ,
+ curef-add-forbidden-unit .code:n = { \__cookingunits_add_forbidden_unit:n {#1} } ,
curef-add-forbidden-unit .default:n = { } ,
- curef-remove-forbidden-unit .code:n =
- {
- \seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
- \seq_map_inline:Nn \l__cookingunits_tmpa_seq
- {
- \seq_if_in:NnTF \l__cookingunits_curef_do_not_change_seq {##1}
- { \seq_remove_all:Nn \l__cookingunits_curef_do_not_change_seq {##1} }
- {
- \msg_warning:nnn { cooking-units } { curef-not-inside-list } {##1}
- { \seq_use:Nnnn \l__cookingunits_curef_do_not_change_seq { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
- }
- }
- } ,
+ curef-remove-forbidden-unit .code:n = { \__cookingunits_remove_forbidden_unit:n {#1} } ,
curef-remove-forbidden-unit .default:n = { } ,
curef-clear-forbidden-units .choice: ,
- curef-clear-forbidden-units/true .code:n = { \seq_clear:N \l__cookingunits_curef_do_not_change_seq } ,
+ curef-clear-forbidden-units/true .code:n = { \__cookingunits_clear_forbidden_unit: } ,
curef-clear-forbidden-units/false .code:n = { } ,
curef-clear-forbidden-units .value_required:n = true,
}
@@ -509,7 +531,7 @@
\msg_new:nnnn { cooking-units } { unknown-unit }
{
The \ unit \ '#1' \ is \ not \ defined. \ Use \
- \newcookingunit ~ (or \ one \ of \ the \ others) \ to \
+ \newcookingunit (or \ one \ of \ the \ others) \ to \
define \ new \ units.
}{
Define \ units \ before \ using \ or \ check \ if \ the \
@@ -567,8 +589,8 @@
}
\msg_new:nnnn { cooking-units } { Key-not-defined }
{
- The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys ~ or \
- \cudefinesinglekey ~ to \ define \ keys.
+ The \ key \ '#1' \ is \ not \ defined. \ Use \ \cudefinekeys or \
+ \cudefinesinglekey to \ define \ keys.
}
{
This \ key \ is \ not \ defined, \ perhaps \ you \ misspelled \ it.
@@ -579,8 +601,7 @@
The \ temperature \ '#1' \ is \ too \ low.\ It \ cannot \ be \
below \ the \ absolute \ zero - point \ of \ '#2'. \ Note \ that \
the \ temperatures \
- '\seq_use:Nnnn \l__cookingunits_temperatures_to_check_seq
- { ', ~ ' } { ', ~ ' } { ' ~ and ~ ' }' \
+ '\__cookingunits_seq_use_msg:N \l__cookingunits_temperatures_to_check_seq' \
are \ rounded \ to \ integers \ by \ default.
\\\\
You \ can \ disable \ the \ option \ 'check-temperature' \ to \
@@ -593,8 +614,8 @@
'#3' \ as \ a \ set \ of \ choices \ and \ '#2' \ is \ non \ of \ these.
}{
The \ key \ accepts \ only \ a \ fixed \ set \ of \ choices. \
- You \ can \ add \ new \ choices \ via \ \cuaddkeys, ~ \cuaddsinglekeys ~
- and \ \cuaddtokeys.
+ You \ can \ add \ new \ choices \ via \ \token_to_str:N \cuaddkeys, ~
+ \token_to_str:N \cuaddsinglekeys ~ and \ \token_to_str:N \cuaddtokeys.
\msg_see_documentation_text:n {cooking-units}
}
\msg_new:nnnn { cooking-units } { group-choice-not-allowed }
@@ -610,8 +631,7 @@
{
The \ amount \ '#1' \ is \ not \ known \ at \ line \
\msg_line_number: .
- }
- {
+ }{
You \ used\ a\ special\ sign\ indicating\ that\ the\ true\ amount\ of\ the\
specific\ ingredient\ is\ (was) \ not\ known\ to\ you. This\ message\
reminds\ you\ about\ that\ fact.
@@ -629,8 +649,7 @@
{
The \ option \ '#1' \ is \ only \ available \ as \ a \ load-time-option. \
Please \ set \ it \ as \ a \ package \ option.
- }
- {
+ }{
You \ cannot \ set \ this \ option \ using \ \cusetup ~
but \ only \ as \ a \ package \ option.
\msg_see_documentation_text:n { cooking-units }
@@ -645,8 +664,7 @@
\msg_new:nnnn { cooking-units } { No-Value-given }
{
Please \ input \ a \ value \ for \ the \ key-value \ list \ in \ '#1'
- }
- {
+ }{
Each \ element \ of \ the \ list \ needs \ a \ value.
\msg_see_documentation_text:n { cooking-units }
}
@@ -653,8 +671,7 @@
\msg_new:nnnn { cooking-units } { Value-not-allowed }
{
The \ key-list \ in \ '#1' \ does \ not \ take \ a \ value.
- }
- {
+ }{
This \ key-list \ does \ not \ take \ a \ value. \ The \
given \ value \ will \ be \ ignored.
\msg_see_documentation_text:n { cooking-units }
@@ -670,8 +687,7 @@
{
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 }
@@ -680,8 +696,7 @@
{
The \ number \ of \ persons \ the \ recipe \ is \ for \ must \ be \ an \
integer. \ '#1' \ is \ not \ allowed.
- }
- {
+ }{
The \ number \ '#1' \ is \ not \ allowed.
\msg_see_documentation_text:n { cooking-units }
}
@@ -717,11 +732,10 @@
\msg_new:nnnn { cooking-units } { cutext-no-translation-available }
{
For \ the \ unit \ '#1' \ there \ exists \ no \ translation \ to \ be \ used \
- for \ \cutext ~ and \ \Cutext. \
+ for \ \cutext ~ and \ \token_to_str:N \Cutext. \
You \ can \ define \ new \ translations \ for \ a \ given \ language \ using \
\cudefinename.
- }
- {
+ }{
\cunum ~ is \ used \ instead.
\msg_see_documentation_text:n { cooking-units }
}
@@ -728,9 +742,8 @@
\msg_new:nnnn { cooking-units } { Translation-not-available }
{
The \ translation \ for \ #1 \ does \ not \ exist.
- Please \ define \ it \ using \ \cudefinename.
- }
- {
+ Please \ define \ it \ using \ \token_to_str:N\cudefinename.
+ }{
And \ you \ may \ send \ me \ the \ translation \ as \ it \ is \
not \ available \ yet.
\msg_see_documentation_text:n { cooking-units }
@@ -739,8 +752,7 @@
{
Currently \ (and \ probably \ forever) \ the \ sign \ '<' \
is \ not \ allowed \ to \ be \ used \ as \ a \ special \ sign.
- }
- {
+ }{
I \ apologize \ for \ the \ inconvenience.
\msg_see_documentation_text:n { cooking-units }
}
@@ -762,11 +774,34 @@
}
\msg_new:nnnn { cooking-units } { curef-forbidden-unit }
{
- The \ amount \ of \ '#1' \ cannot \ be \ changed \ using \ cooking-units` \ label \ \& \ ref \ feature.
+ The \ amount \ of \ '#1' \ cannot \ be \ changed \ using \ cooking-units`
+ \ label \ and \ ref \ feature.
}{
You \ can \ remove \ the \ unit \ using \ 'curef-remove-forbidden-unit'.
\msg_see_documentation_text:n { cooking-units }
}
+\msg_new:nnnn { cooking-units } { define-numeral-function }
+ {
+ You \ are \ using \ numerals \ (lowercase) \ without \ the \ load-time \ option \
+ 'use-fmtcount-numerals' \ as \ such \ you \ need \ to \ define \
+ which \ function \ is \ to \ be \ used \ for \ numerals. \ You \ can
+ \ do \ that \ via \ 'numeral-function' \ and \ 'Numeral-function'
+ }{
+ Please \ specify\ which \ function \ should \ be \ used \ to \ print \
+ numerals (lowercase \ and \ uppercase).
+ \msg_see_documentation_text:n { cooking-units }
+ }
+\msg_new:nnnn { cooking-units } { define-Numeral-function }
+ {
+ You \ are \ using \ numerals \ (capitalized) \ without \ the \ load-time \ option \
+ 'use-fmtcount-numerals' \ as \ such \ you \ need \ to \ define \
+ which \ function \ is \ to \ be \ used \ for \ numerals. \ You \ can
+ \ do \ that \ via \ 'numeral-function' \ and \ 'Numeral-function'
+ }{
+ Please \ specify\ which \ function \ should \ be \ used \ to \ print \
+ numerals (lowercase \ and \ uppercase).
+ \msg_see_documentation_text:n { cooking-units }
+ }
\msg_new:nnnn { cooking-units } { 42-is-...-wrong? }
{
You \ requested \ to \ set \ 42 \ to \ 'false'. \ This \ doesn't \ make
@@ -779,21 +814,44 @@
Phew ... \ this \ might \ have \ ended \ disastrous.
\msg_see_documentation_text:n { cooking-units }
}
+\msg_new:nnnn { cooking-units } { empty-amount }
+ {
+ The \ amount \ given \ is \ empty \ ( spaces \ are \ removed ).
+ }{
+ The \ amount \ given \ is \ empty.
+ \msg_see_documentation_text:n { cooking-units }
+ }
+\msg_new:nnnn { cooking-units } { unknown-option }
+ {
+ The \ option \ '#1' \ is \ not \ defined.
+ }{
+ Perhaps \ you \ misspelled \ the \ option.
+ \msg_see_documentation_text:n { cooking-units }
+ }
\msg_new:nnnn { cooking-units } { internal-error }
{
This \ error \ shouldn't \ show. \ This \ means \ I
\ (the \ package \ author) \ screwed
- \ up.
+ \ up. \ The \ error \ code \ is \ '#1'.
}{
Please \ send \ me \ a \ bug \ report.
\msg_see_documentation_text:n { cooking-units }
}
-\cs_new:Npn \__cookingunits_error_if_unit_not_defined:n #1
+\prg_new_protected_conditional:Npnn \__cookingunits_error_if_unit_not_defined:n #1 { TF, T, F }
{
- \seq_if_in:NnF \g__cookingunits_list_of_defined_units_seq {#1}
- { \msg_error:nnn { cooking-units } { unknown-unit } {#1} }
+ \seq_if_in:NnTF \g__cookingunits_list_of_defined_units_seq {#1}
+ { \prg_return_false: }
+ {
+ \msg_error:nnn { cooking-units } { unknown-unit } {#1}
+ \prg_return_true:
+ }
}
-\cs_generate_variant:Nn \__cookingunits_error_if_unit_not_defined:n { V }
+\cs_new:Npn \__cookingunits_error_if_unit_not_defined:n #1
+ { \__cookingunits_error_if_unit_not_defined:nTF {#1} { } { } }
+\cs_generate_variant:Nn \__cookingunits_error_if_unit_not_defined:nTF { V }
+\cs_new:Npn \__cookingunits_seq_use_msg:N #1
+ { \seq_use:Nnnn #1 { ' , ~ ' } { ' , ~ ' } { ' ~ and ~ ' } }
+\cs_generate_variant:Nn \__cookingunits_seq_use_msg:N { c }
\prg_new_protected_conditional:Npnn \__cookingunits_if_integer:n #1 { TF , F }
{
\tl_map_inline:nn {#1}
@@ -838,6 +896,20 @@
{ \prg_return_true: }
{ \prg_return_false: }
}
+\prg_new_conditional:Npnn \__cookingunits_if_gender_error:n #1 { TF }
+ {
+ \str_case:nnTF {#1}
+ {
+ { m } { }
+ { f } { }
+ { n } { }
+ }
+ { \prg_return_false: }
+ {
+ \msg_error:nnn { cooking-units } { unknown-gender } {#1}
+ \prg_return_true:
+ }
+ }
\cs_new:Npn \__cookingunits_check_if_correct_gender_input:n #1
{
\str_case:nnF {#1}
@@ -847,10 +919,9 @@
{ n } { }
} { \msg_error:nnn { cooking-units } { unknown-gender } {#1} }
}
-\cs_new:Npn \__cookingunits_define_unit_group:nn #1#2
+\cs_new:Npn \__cookingunits_define_clear_unit_group:nn #1#2
{
- \seq_new:c { l__cookingunits_group_ #1 _seq }
- \seq_set_from_clist:cn { l__cookingunits_group_ #1 _seq } {#2}
+ \seq_clear_new:c { l__cookingunits_group_ #1 _seq }
\keys_define:nn { cooking-units }
{
#1 .code:n = { \__cookingunits_unit_group_convert_units:nn {#1} {##1} } ,
@@ -857,51 +928,54 @@
#1 .groups:n = { change-unit } ,
}
}
-\cs_new:Npn \__cookingunits_error_if_group_not_defined:n #1
+\cs_new:Npn \__cookingunits_add_to_unit_group_error:n #1
+ { \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group } }
+\cs_new:Npn \__cookingunits_add_to_unit_group:nn #1#2
{
- \seq_if_exist:cF { l__cookingunits_group_ #1 _seq }
- { \msg_error:nn { cooking-units} { group-key-unknown } }
+ \__cookingunits_error_if_group_not_defined:nF {#1}
+ {
+ \clist_map_inline:nn {#2}
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:cnF { l__cookingunits_group_ #1 _seq } {##1}
+ { \seq_put_right:cn { l__cookingunits_group_ #1 _seq } {##1} }
+ }
+ }
+ }
}
-\cs_new:Npn \__cookingunits_unit_group_convert_units:nn #1#2
+\prg_new_conditional:Npnn \__cookingunits_error_if_group_not_defined:n #1 { F }
{
- \__cookingunits_error_if_group_not_defined:n {#1}
- \__cookingunits_error_if_unit_not_defined:n {#2}
- \seq_if_in:cnTF { l__cookingunits_group_ #1 _seq } {#2}
+ \seq_if_exist:cTF { l__cookingunits_group_ #1 _seq }
+ { \prg_return_false: }
{
- \seq_map_inline:cn { l__cookingunits_group_ #1 _seq }
- { \__cookingunits_keys_set:nnn { cooking-units } {##1} {#2} }
- }{
- \msg_error:nnxxx
- { cooking-units }
- { group-choice-not-allowed }
- {#1}
- {#2}
- { \seq_use:cnnn { l__cookingunits_group_ #1 _seq } { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
+ \msg_error:nn { cooking-units} { group-key-unknown }
+ \prg_return_true:
}
}
-\__cookingunits_define_unit_group:nn { weight } { kg , dag, g, oz, lb, stick }
-\__cookingunits_define_unit_group:nn { length } { m , dm , cm , mm , in }
-\__cookingunits_define_unit_group:nn { volume } { l , dl , cl , ml }
-\__cookingunits_define_unit_group:nn { temperature } { C , F , K , Re }
-\__cookingunits_define_unit_group:nn { energy } { cal, kcal , J , kJ , eV }
-\__cookingunits_define_unit_group:nn { time } { d , h , min , s }
-\cs_new:Npn \__cookingunits_unit_group_add_unit_error:n #1
+\cs_new:Npn \__cookingunits_unit_group_convert_units:nn #1#2
{
- \msg_error:nnn { cooking-units } { No-Value-given } { add-unit-to-group }
+ \__cookingunits_error_if_group_not_defined:nF {#1}
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {#2}
+ {
+ \seq_if_in:cnTF { l__cookingunits_group_ #1 _seq } {#2}
+ {
+ \seq_map_inline:cn { l__cookingunits_group_ #1 _seq }
+ { \__cookingunits_keys_set:nnn { cooking-units } {##1} {#2} }
+ }{
+ \msg_error:nnxxx
+ { cooking-units }
+ { group-choice-not-allowed }
+ {#1} {#2}
+ { \__cookingunits_seq_use_msg:c { l__cookingunits_group_ #1 _seq } }
+ }
+ }
+ }
}
-\cs_new:Npn \__cookingunits_unit_group_add_unit:nn #1#2
- {
- \__cookingunits_error_if_group_not_defined:n {#1}
- \clist_map_inline:nn {#2}
- {
- \__cookingunits_error_if_unit_not_defined:n {##1}
- \seq_if_in:cnF { l__cookingunits_group_ #1 _seq } {##1}
- { \seq_put_right:cn { l__cookingunits_group_ #1 _seq } {##1} }
- }
- }
\seq_new:N \g__cookingunits_natural_units_seq
\prop_new:N \g__cookingunits_convert_to_eV_remember_prop
-\seq_set_from_clist:Nn \g__cookingunits_natural_units_seq
+\seq_gset_from_clist:Nn \g__cookingunits_natural_units_seq
{
eV ,
eVc-2 ,
@@ -910,20 +984,18 @@
(chbareV-1)3 ,
}
\cs_new:Npn \__cookingunits_keys_set:nnn #1#2#3
- {
- \keys_set:nn {#1} { #2 = #3 }
- }
+ { \keys_set:nn {#1} { #2 = #3 } }
\cs_generate_variant:Nn \__cookingunits_keys_set:nnn { nVV , nVn }
\cs_new:Npn \__cookingunits_convert_to_eV:
{
- \prop_if_exist:cT { l__cookingunits_cukeys_ \l__cookingunits_given_unit_tl _prop }
+ \tl_set_eq:Nc \l__cookingunits_tmp_unit_tl { l__cookingunits_base_key_unit_ \l__cookingunits_original_unit_tl _tl }
+ \tl_if_empty:NF \l__cookingunits_tmp_unit_tl
{
\prop_get:NVNTF \g__cookingunits_convert_to_eV_remember_prop
- \l__cookingunits_given_unit_tl \l__cookingunits_tmpa_tl
+ \l__cookingunits_original_unit_tl \l__cookingunits_tmpa_tl
+ { \__cookingunits_keys_set:nVV { cooking-units } \l__cookingunits_original_unit_tl \l__cookingunits_tmpa_tl }
{
- \__cookingunits_keys_set:nVV { cooking-units } \l__cookingunits_given_unit_tl \l__cookingunits_tmpa_tl
- }{
- \prop_get:cnNT { l__cookingunits_cukeys_ \l__cookingunits_given_unit_tl _prop } { Liste } \l__cookingunits_tmpa_seq
+ \prop_get:cnNTF { l__cookingunits_cukeys_ \l__cookingunits_tmp_unit_tl _prop } { Liste } \l__cookingunits_tmpa_seq
{
\seq_map_inline:Nn \g__cookingunits_natural_units_seq
{
@@ -930,18 +1002,19 @@
\seq_if_in:NnT \l__cookingunits_tmpa_seq {##1}
{
\prop_gput:NVn \g__cookingunits_convert_to_eV_remember_prop
- \l__cookingunits_given_unit_tl {##1}
- \__cookingunits_keys_set:nVn { cooking-units } \l__cookingunits_given_unit_tl {##1}
+ \l__cookingunits_original_unit_tl {##1}
+ \__cookingunits_keys_set:nVn { cooking-units } \l__cookingunits_original_unit_tl {##1}
\seq_map_break:
}
}
}
+ { \msg_error:nnn { cooking-units } { internal-error } { convert-to-eV } }
}
}
}
\cs_new:Npn \__cookingunits_tl_eval:Nn #1#2 { \tl_set:Nf #1 { \fp_eval:n {#2} } }
\cs_generate_variant:Nn \__cookingunits_tl_eval:Nn { Nv }
-\prg_new_conditional:Npnn \__cookingunits_change_unit: { TF }
+\prg_new_conditional:Npnn \__cookingunits_change_unit: { TF , T }
{
\bool_lazy_any:nTF
{
@@ -959,24 +1032,18 @@
}
\cs_new:Npn \__cookingunits_temperatures_to_check_define:nn #1#2
{
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \fp_if_exist:cTF { c__cookingunits_ #1 _min_fp }
- { \msg_warning:nnn { cooking-units } { Minimum-already-defined } {#1} }
+ \__cookingunits_error_if_unit_not_defined:nF {#1}
{
- \seq_put_right:Nn \l__cookingunits_temperatures_to_check_seq {#1}
- \fp_const:cn { c__cookingunits_ #1 _min_fp } {#2}
+ \fp_if_exist:cTF { l__cookingunits_ #1 _min_fp }
+ {
+ \fp_set:cn { l__cookingunits_ #1 _min_fp } {#2}
+ }{
+ \seq_put_right:Nn \l__cookingunits_temperatures_to_check_seq {#1}
+ \fp_new:c { l__cookingunits_ #1 _min_fp }
+ \fp_set:cn { l__cookingunits_ #1 _min_fp } {#2}
+ }
}
}
-\cs_new:Npn \__cookingunits_erase_options_for:n #1
- {
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \clist_clear:c { l__cookingunits_predefined_option_ ##1 _clist }
- }
-\cs_new:Npn \__cookingunits_erase_options_for_error:nn #1#2
- {
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \msg_error:nnn { cooking-units } { Value-not-allowed } { erase-all-options-for }
- }
\cs_new:Npn \__cookingunits_set_options_for_error:n #1
{
\__cookingunits_error_if_unit_not_defined:n {#1}
@@ -983,10 +1050,7 @@
\msg_error:nnn { cooking-units } { No-Value-given } { set-option-for }
}
\cs_new:Npn \__cookingunits_set_options_for:nn #1#2
- {
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \clist_set:cn { l__cookingunits_predefined_option_#1_clist } {#2}
- }
+ { \cusetoptionfor {#1} {#2} }
\cs_new:Npn \__cookingunits_add_options_for_error:n #1
{
\__cookingunits_error_if_unit_not_defined:n {#1}
@@ -993,16 +1057,11 @@
\msg_error:nnn { cooking-units } { No-Value-given } { add-option-for }
}
\cs_new:Npn \__cookingunits_add_options_for:nn #1#2
- {
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \clist_put_right:cn { l__cookingunits_predefined_option_ #1 _clist } {#2}
- }
+ { \cuaddoptionfor {#1} {#2} }
\cs_new:Npn \__cookingunits_rounding_function:n #1
{
#1
- \bool_if:NTF \l__cookingunits_round_to_int_bool
- { , 0 }
- { , \l__cookingunits_round_precision_int }
+ , \l__cookingunits_round_precision_int
\bool_if:NT \l__cookingunits_round_commercial_bool
{ , #1 }
}
@@ -1054,23 +1113,23 @@
}
\NewDocumentCommand \culabel { m m } { \__cookingunits_culabel:nn {#1} {#2} }
\NewExpandableDocumentCommand \curef { m } { \__cookingunits_curef:n {#1} }
-\cs_new:Npn \__cookingunits_tl_if_in_remove_and_set_bool:NnN #1#2#3
+\cs_new:Npn \__cookingunits_bool_reverse:N #1
{
- \tl_if_in:NnTF #1 {#2}
- {
- \bool_set_true:N #3
- \tl_remove_once:Nn #1 {#2}
- }
- { \bool_set_false:N #3 }
+ \bool_if:NTF #1
+ { \bool_set_false:N }
+ { \bool_set_true:N }
+ #1
}
-\cs_new:Npn \__cookingunits_tl_if_in_remove_and_reverse_bool:NnN #1#2#3
+\cs_new:Npn \__cookingunits_check_minus_remove_and_reverse:NN #1#2
{
- \tl_if_in:NnT #1 {#2}
+ \quark_if_nil:NF #2
{
- \bool_if:NTF #3
- { \bool_set_false:N #3 }
- { \bool_set_true:N #3 }
- \tl_remove_once:Nn #1 {#2}
+ \tl_if_in:NnT #2 { - }
+ {
+ \tl_remove_once:Nn #2 { - }
+ \__cookingunits_bool_reverse:N #1
+ }
+ \__cookingunits_check_minus_remove_and_reverse:NN #1
}
}
\tl_const:Nn \c__cookingunits_postfix_unit_tl { ( cu-unit ) }
@@ -1087,8 +1146,8 @@
{
\declaretranslation {#1} { #2 #3 } {#4}
}
-\cs_generate_variant:Nn \__cookingunits_deftranslation_base:nnn { xx , xxV }
-\cs_generate_variant:Nn \__cookingunits_deftranslation_to:nnnn { Vxxv, VxxV , Vxxn, Vxxx,Vxxo,Vxxf }
+\cs_generate_variant:Nn \__cookingunits_deftranslation_base:nnn { xV }
+\cs_generate_variant:Nn \__cookingunits_deftranslation_to:nnnn { VxVv, VxVV , VxVn }
\cs_new:Npn \__cookingunits_newtranslation_base:nnn #1#2#3
{
\definetranslationfallback { #1 #2 } {#3}
@@ -1160,13 +1219,18 @@
\__cookingunits_newtranslation_to:nnVn { English } { cutext-range-sign } \c__cookingunits_postfix_unitname_tl { ~to~ }
\cs_new_protected:Npn \__cookingunits_initialise_default:n #1
{
- \__cookingunits_set_unit:Nn \l__cookingunits_given_unit_tl {#1}
- \__cookingunits_error_if_unit_not_defined:V \l__cookingunits_given_unit_tl
+ \__cookingunits_set_unit:Nn \l__cookingunits_original_unit_tl {#1}
+ \bool_set_false:N \l__cookingunits_error_bool
+ \__cookingunits_error_if_unit_not_defined:VTF \l__cookingunits_original_unit_tl
+ {
+ \bool_set_true:N \l__cookingunits_unit_error_bool
+ \cs_set_eq:NN \__cookingunits_print_correct_unit: \__cookingunits_print_default_unit:
+ }
+ { \bool_set_false:N \l__cookingunits_unit_error_bool }
\bool_set_false:N \l__cookingunits_special_sign_bool
- \bool_set_false:N \l__cookingunits_error_bool
\bool_set_false:N \l__cookingunits_range_in_input_bool
\bool_set_false:N \l__cookingunits_lokal_fraction_bool
- \bool_set_false:N \l__cookingunits_lokal_mixed_fraction_bool
+ \bool_set_false:N \l__cookingunits_minus_bool
}
\cs_new_protected:Npn \__cookingunits_initialise_unit_change:n #1
{
@@ -1174,19 +1238,19 @@
{ \keys_set_groups:nnn { cooking-units } { change-unit } {#1} }
\bool_if:NT \l__cookingunits_convert_to_eV_bool
{ \__cookingunits_convert_to_eV: }
- \prop_get:NVNF \l__cookingunits_change_unit_prop \l__cookingunits_given_unit_tl \l__cookingunits_option_unit_tl
- { \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_given_unit_tl }
+ \prop_get:NVNF \l__cookingunits_change_unit_prop \l__cookingunits_original_unit_tl \l__cookingunits_option_unit_tl
+ { \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_original_unit_tl }
}
\cs_new_protected:Npn \__cookingunits_initialise_after_unit_change:nn #1#2
{
\IfNoValueF {#1}
{ \__cookingunits_reference_label_and_persons:n {#1} }
- \clist_if_empty:cF { l__cookingunits_predefined_option_ \l__cookingunits_option_unit_tl _clist }
+ \clist_if_empty:cF { l__cookingunits_unit_option_ \l__cookingunits_option_unit_tl _clist }
{
\keys_set_filter:nnv
{ cooking-units }
{ change-unit }
- { l__cookingunits_predefined_option_ \l__cookingunits_option_unit_tl _clist }
+ { l__cookingunits_unit_option_ \l__cookingunits_option_unit_tl _clist }
}
\tl_if_empty:nF {#2}
{ \keys_set_filter:nnn { cooking-units } { change-unit } {#2} }
@@ -1194,10 +1258,7 @@
{ \l__cookingunits_calc_because_ref_was_given_bool } { \l__cookingunits_change_number_of_persons_bool }
{ \bool_set_true:N \l__cookingunits_lokal_persons_bool }
{ \bool_set_false:N \l__cookingunits_lokal_persons_bool }
- \bool_lazy_and:nnTF
- { \g__cookingunits_opt_numeral_bool } { \l__cookingunits_print_numeral_bool }
- { \bool_set_true:N \l__cookingunits_lokal_numeral_bool }
- { \bool_set_false:N \l__cookingunits_lokal_numeral_bool }
+ \bool_set_eq:NN \l__cookingunits_lokal_numeral_bool \l__cookingunits_print_numeral_bool
}
\cs_new_protected:Npn \__cookingunits_print_input:N #1 { }
\cs_new_protected:Npn \__cookingunits_print_correct_unit: { }
@@ -1236,13 +1297,13 @@
\tl_replace_once:Nnn #1 { - } \c__cookingunits_minus_tl
#1
}
-\cs_new:Npn \__cookingunits_print_fractions:nnn #1#2#3
+\cs_new:Npn \__cookingunits_print_fractions:Nnn #1#2#3
{
\bool_if:NT \l__cookingunits_minus_bool { \c__cookingunits_minus_tl }
- \tl_if_empty:nF {#1}
+ \tl_if_empty:NF #1
{
#1
- \__cookingunits_dim_horizontal:N \l__cookingunits_mixed_frac_dim
+ \skip_horizontal:N \l__cookingunits_mixed_frac_dim
}
\__cookingunits_frac:nn {#2} {#3}
}
@@ -1262,41 +1323,57 @@
\cs_new:Npn \__cookingunits_create_error:n #1
{
\bool_set_true:N \l__cookingunits_error_bool
- \msg_error:nnV { cooking-units } {#1} \l__cookingunits_given_amount_tl
+ \msg_error:nnV { cooking-units } {#1} \l__cookingunits_original_amount_tl
}
\cs_new:Npn \__cookingunits_create_error_and_stop:n #1
{
\bool_set_true:N \l__cookingunits_error_bool
- \msg_error:nnV { cooking-units } {#1} \l__cookingunits_given_amount_tl
+ \msg_error:nnV { cooking-units } {#1} \l__cookingunits_original_amount_tl
\use_none_delimit_by_q_nil:w
}
\cs_new:Npn \__cookingunits_create_error:nn #1#2
{
\bool_set_true:N \l__cookingunits_error_bool
- \msg_error:nnnV { cooking-units } {#1} {#2} \l__cookingunits_given_amount_tl
+ \msg_error:nnnV { cooking-units } {#1} {#2} \l__cookingunits_original_amount_tl
}
+\cs_new:Npn \__cookingunits_process_tmp: { }
+\cs_new:Npn \__cookingunits_process_and_print_input:
+ {
+ \bool_lazy_or:nnTF
+ { \l__cookingunits_error_bool }
+ { \l__cookingunits_unit_error_bool }
+ { \l__cookingunits_original_amount_tl }
+ { \__cookingunits_process_tmp: }
+ }
+\cs_new:Npn \__cookingunits_process_default: { \l__cookingunits_original_amount_tl }
+\cs_new:Npn \__cookingunits_print_default_unit:
+ {
+ \tl_if_empty:NF \l__cookingunits_phantom_tl { \phantom { \l__cookingunits_phantom_tl } }
+ \,\l__cookingunits_original_unit_tl
+ }
\cs_new:Npn \__cookingunits_parse_input:n #1
{
- \bool_if:NTF \l__cookingunits_fourty_two_bool
- { \tl_clear:N \l__cookingunits_given_amount_tl }
- { \__cookingunits_set_amount:Nn \l__cookingunits_given_amount_tl {#1} }
- \tl_set_rescan:NnV \l__cookingunits_given_amount_tl
+ \__cookingunits_set_amount:Nn \l__cookingunits_original_amount_tl {#1}
+ \tl_set_rescan:NnV \l__cookingunits_original_amount_tl
{
\char_set_catcode_letter:N \_ %
\char_set_catcode_ignore:N \ %
\char_set_catcode_other:N ? %
- } \l__cookingunits_given_amount_tl
- \bool_lazy_or:nnTF
- { \l__cookingunits_draft_bool }
- { \tl_if_empty_p:N \l__cookingunits_given_amount_tl }
+ } \l__cookingunits_original_amount_tl
+ \bool_lazy_any:nTF
{
- \bool_if:NTF \l__cookingunits_fourty_two_bool
- { 42 }
- { \l__cookingunits_given_amount_tl }
+ { \l__cookingunits_fourty_two_bool }
+ { \l__cookingunits_draft_bool }
+ { \tl_if_empty_p:N \l__cookingunits_original_amount_tl }
}{
- \tl_set_eq:NN \l__cookingunits_tmpa_tl \l__cookingunits_given_amount_tl
+ \cs_set_eq:NN \__cookingunits_process_tmp: \__cookingunits_process_default:
+ \tl_if_empty:NT \l__cookingunits_original_amount_tl
+ { \msg_error:nnV { cooking-units } { empty-amount } \l__cookingunits_original_amount_tl }
+ \bool_if:NT \l__cookingunits_fourty_two_bool
+ { \tl_set:Nn \l__cookingunits_original_amount_tl { 42 } }
+ }{
+ \tl_set_eq:NN \l__cookingunits_tmpa_tl \l__cookingunits_original_amount_tl
\__cookingunits_split_input:N \l__cookingunits_tmpa_tl
- \__cookingunits_process_and_print_input:
}
}
\cs_new:Npn \__cookingunits_split_input:N #1
@@ -1312,22 +1389,9 @@
\bool_if:NT \l__cookingunits_range_in_input_bool
{ \__cookingunits_create_error_and_stop:n { fraction-not-allowed-with-range } }
}
- \tl_if_in:NnT #1 { _ }
- {
- \bool_set_true:N \l__cookingunits_lokal_mixed_fraction_bool
- \bool_if:NF \l__cookingunits_lokal_fraction_bool
- { \__cookingunits_create_error_and_stop:n { missing-slash } }
- }
\__cookingunits_split:N #1
\use_none_delimit_by_q_nil:w \q_nil
}
-\cs_new:Npn \__cookingunits_process_tmp: { }
-\cs_new:Npn \__cookingunits_process_and_print_input:
- {
- \bool_if:NTF \l__cookingunits_error_bool
- { \l__cookingunits_given_amount_tl }
- { \__cookingunits_process_tmp: }
- }
\cs_new:Npn \__cookingunits_split:N #1
{
\bool_if:NTF \l__cookingunits_lokal_fraction_bool
@@ -1356,20 +1420,30 @@
}
\cs_new:Npn \__cookingunits_split_fraction:n #1
{
- \bool_if:NTF \l__cookingunits_lokal_mixed_fraction_bool
- {
- \cs_set_eq:NN \__cookingunits_process_tmp: \__cookingunits_process_mixed_fraction_in_input:
- \__cookingunits_split_fraction_mixed:ww
- }{
- \cs_set_eq:NN \__cookingunits_process_tmp: \__cookingunits_process_fraction_in_input:
- \__cookingunits_split_fraction_frac:ww
- }
- #1 \q_stop / \q_recursion_tail \q_stop
- \q_recursion_stop
+ \cs_set_eq:NN \__cookingunits_process_tmp: \__cookingunits_process_generel_fraction_in_input:
+ \__cookingunits_split_fraction_mixed:ww
+ #1 \q_stop / \q_recursion_tail _ \q_nil \q_stop
+ \q_recursion_stop
\bool_lazy_or:nnT
{ \l__cookingunits_lokal_persons_bool }{ \l__cookingunits_eval_fractions_bool }
{ \bool_set_false:N \l__cookingunits_lokal_fraction_bool }
+ \bool_if:NT \l__cookingunits_convert_fractions_bool
+ {
+ \tl_if_eq:NNF \l__cookingunits_original_unit_tl \l__cookingunits_option_unit_tl
+ { \bool_set_false:N \l__cookingunits_lokal_fraction_bool }
+ }
}
+\cs_new:Npn \__cookingunits_split_fraction_mixed:ww #1 _ #2 \q_stop
+ {
+ \quark_if_nil:nTF {#2}
+ {
+ \tl_clear:N \l__cookingunits_mixed_fraction_tl
+ \__cookingunits_split_fraction_frac:ww #1 \q_stop
+ }{
+ \__cookingunits_parse_input_and_safe_in:nN {#1} \l__cookingunits_mixed_fraction_tl
+ \__cookingunits_split_fraction_frac:ww #2 \q_stop
+ }
+ }
\cs_new:Npn \__cookingunits_split_fraction_frac:ww #1 / #2 \q_stop
{
\quark_if_recursion_tail_stop_do:nn {#2}
@@ -1378,11 +1452,6 @@
\__cookingunits_parse_input_and_safe_in:nN {#2} \l__cookingunits_number_tmpb_tl
\use_none_delimit_by_q_recursion_stop:w
}
-\cs_new:Npn \__cookingunits_split_fraction_mixed:ww #1 _ #2 \q_stop
- {
- \__cookingunits_parse_input_and_safe_in:nN {#1} \l__cookingunits_mixed_fraction_tl
- \__cookingunits_split_fraction_frac:ww #2 \q_stop
- }
\cs_generate_variant:Nn \__cookingunits_split_number:n { V }
\cs_generate_variant:Nn \__cookingunits_split_range:n { V }
\cs_generate_variant:Nn \__cookingunits_split_fraction:n { V }
@@ -1393,7 +1462,7 @@
\cs_set_eq:NN \__cookingunits_parse:N \__cookingunits_start_loop:N
\tl_map_function:nN {#1} \__cookingunits_parse:N
\bool_if:NTF \l__cookingunits_error_bool
- { \use_none_delimit_by_q_nil:w }
+ { }
{ \tl_set_eq:NN #2 \l__cookingunits_tmpa_tl }
}
\cs_new:Npn \__cookingunits_start_loop:N #1
@@ -1432,7 +1501,11 @@
{ \__cookingunits_create_error:n { Second-fraction-sign-not-allowed } }
{
\tl_if_in:NnTF \l__cookingunits_input_mixed_fraction_sign_tl {#1}
- { \__cookingunits_create_error:n { Second-mixed-fraction-sign-not-allowed } }
+ {
+ \bool_if:NTF \l__cookingunits_lokal_fraction_bool
+ { \__cookingunits_create_error:n { Second-mixed-fraction-sign-not-allowed } }
+ { \__cookingunits_create_error:n { missing-slash } }
+ }
{ \__cookingunits_create_error:nn { Token-not-allowed } {#1} }
}
}
@@ -1461,49 +1534,35 @@
\__cookingunits_post_process_input:NN \l__cookingunits_number_tmpa_tl \l__cookingunits_number_tmpb_tl
\__cookingunits_print_ranges:NN \l__cookingunits_number_tmpa_tl \l__cookingunits_number_tmpb_tl
}
-\cs_new:Npn \__cookingunits_process_fraction_in_input:
+\cs_new:Npn \__cookingunits_process_generel_fraction_in_input:
{
+ \__cookingunits_check_minus_remove_and_reverse:NN
+ \l__cookingunits_mixed_fraction_tl
+ \l__cookingunits_number_tmpa_tl
+ \l__cookingunits_number_tmpb_tl
+ \q_nil
\bool_lazy_or:nnTF
{ \l__cookingunits_lokal_fraction_bool }
{ \l__cookingunits_special_sign_bool }
{
- \__cookingunits_tl_if_in_remove_and_set_bool:NnN \l__cookingunits_number_tmpa_tl { - } \l__cookingunits_minus_bool
- \__cookingunits_tl_if_in_remove_and_reverse_bool:NnN \l__cookingunits_number_tmpb_tl { - } \l__cookingunits_minus_bool
- \__cookingunits_print_fractions:nnn
- { }
+ \bool_if:NT \l__cookingunits_special_sign_bool
+ {
+ \msg_warning:nnV { cooking-units } { amount-not-known } \l__cookingunits_original_amount_tl
+ }
+ \__cookingunits_print_fractions:Nnn
+ \l__cookingunits_mixed_fraction_tl
{ \l__cookingunits_number_tmpa_tl }
{ \l__cookingunits_number_tmpb_tl }
}{
\fp_compare:nNnT { \l__cookingunits_number_tmpb_tl } = { 0 }
- { \msg_error:nnV { cooking-units } { Division-by-zero } \l__cookingunits_given_amount_tl }
+ { \msg_error:nnV { cooking-units } { Division-by-zero } \l__cookingunits_original_amount_tl }
\__cookingunits_tl_eval:Nn \l__cookingunits_number_tmpa_tl
- { \l__cookingunits_number_tmpa_tl / \l__cookingunits_number_tmpb_tl }
- \__cookingunits_process_and_print_number_in_input:N \l__cookingunits_number_tmpa_tl
- }
- }
-\cs_new:Npn \__cookingunits_process_mixed_fraction_in_input:
- {
- \__cookingunits_tl_if_in_remove_and_set_bool:NnN \l__cookingunits_mixed_fraction_tl { - } \l__cookingunits_minus_bool
- \__cookingunits_tl_if_in_remove_and_reverse_bool:NnN \l__cookingunits_number_tmpa_tl { - } \l__cookingunits_minus_bool
- \__cookingunits_tl_if_in_remove_and_reverse_bool:NnN \l__cookingunits_number_tmpb_tl { - } \l__cookingunits_minus_bool
- \bool_lazy_or:nnTF
- { \l__cookingunits_lokal_fraction_bool }
- { \l__cookingunits_special_sign_bool }
- {
- \__cookingunits_print_fractions:nnn
- { \l__cookingunits_mixed_fraction_tl }
- { \l__cookingunits_number_tmpa_tl }
- { \l__cookingunits_number_tmpb_tl }
- }{
- \fp_compare:nNnT { \l__cookingunits_number_tmpb_tl } = { 0 }
- { \msg_error:nnV { cooking-units } { Division-by-zero } \l__cookingunits_given_amount_tl }
- \__cookingunits_tl_eval:Nn \l__cookingunits_number_tmpa_tl
{
- \bool_if:NTF \l__cookingunits_minus_bool
- { - \l__cookingunits_mixed_fraction_tl - }
- { \l__cookingunits_mixed_fraction_tl + }
+ \l__cookingunits_mixed_fraction_tl +
\l__cookingunits_number_tmpa_tl / \l__cookingunits_number_tmpb_tl
}
+ \bool_if:NT \l__cookingunits_minus_bool
+ { \tl_put_left:Nn \l__cookingunits_number_tmpa_tl { - } }
\__cookingunits_process_and_print_number_in_input:N \l__cookingunits_number_tmpa_tl
}
}
@@ -1526,12 +1585,12 @@
\cs_new:Npn \__cookingunits_calculate_input_and_store_in:nN #1#2
{
\fp_set:Nn \l__cookingunits_tmpa_fp {#1}
- \tl_if_in:cnTF { l__cookingunits_unit_change_ \l__cookingunits_given_unit_tl _tl } { \l__cookingunits_tmpa_fp }
+ \tl_if_in:cnTF { l__cookingunits_unit_change_ \l__cookingunits_original_unit_tl _tl } { \l__cookingunits_tmpa_fp }
{
- \__cookingunits_tl_eval:Nv #2 { l__cookingunits_unit_change_ \l__cookingunits_given_unit_tl _tl }
+ \__cookingunits_tl_eval:Nv #2 { l__cookingunits_unit_change_ \l__cookingunits_original_unit_tl _tl }
}{
\__cookingunits_tl_eval:Nn #2
- { \l__cookingunits_tmpa_fp * \tl_use:c { l__cookingunits_unit_change_ \l__cookingunits_given_unit_tl _tl } }
+ { \l__cookingunits_tmpa_fp * \tl_use:c { l__cookingunits_unit_change_ \l__cookingunits_original_unit_tl _tl } }
}
}
\cs_new:Npn \__cookingunits_calc_references:NN #1#2
@@ -1543,7 +1602,7 @@
=
{ \l__cookingunits_local_number_of_persons_int }
{
- \tl_set_eq:NN \l__cookingunits_tmpb_tl \l__cookingunits_given_unit_tl
+ \tl_set_eq:NN \l__cookingunits_tmpb_tl \l__cookingunits_original_unit_tl
\seq_if_in:NVTF \l__cookingunits_curef_do_not_change_seq \l__cookingunits_tmpb_tl
{ \msg_error:nnV { cooking-units } { curef-forbidden-unit } \l__cookingunits_tmpb_tl }
{ \__cookingunits_calc_references_aux:NN #1 #2 }
@@ -1569,18 +1628,12 @@
{
\quark_if_recursion_tail_stop_do:nn {#2}
{
- \bool_lazy_or:nnF
- { \l__cookingunits_round_precision_positive_bool }
- { \l__cookingunits_round_to_int_bool }
+ \bool_if:NT \l__cookingunits_round_precision_negative_bool
{ \bool_set_true:N \l__cookingunits_round_number_bool }
}
\int_compare:nNnT
{ \tl_count:n {#2} } >
- {
- \bool_if:NTF \l__cookingunits_round_to_int_bool
- { 0 }
- { \l__cookingunits_round_precision_int }
- }
+ { \l__cookingunits_round_precision_int }
{ \bool_set_true:N \l__cookingunits_round_number_bool }
\use_none_delimit_by_q_recursion_stop:w
}
@@ -1599,13 +1652,13 @@
\seq_if_in:NVT \l__cookingunits_temperatures_to_check_seq \l__cookingunits_option_unit_tl
{
\fp_compare:vNnT
- { c__cookingunits_ \l__cookingunits_option_unit_tl _min_fp } > {#1}
+ { l__cookingunits_ \l__cookingunits_option_unit_tl _min_fp } > {#1}
{
\msg_error:nnxx { cooking-units }
{ Temperature-too-low }
{ #1 \space \l__cookingunits_option_unit_tl }
{
- \fp_use:c { c__cookingunits_ \l__cookingunits_option_unit_tl _min_fp }
+ \fp_use:c { l__cookingunits_ \l__cookingunits_option_unit_tl _min_fp }
\space \l__cookingunits_option_unit_tl
}
}
@@ -1651,6 +1704,7 @@
\__cookingunits_cunum_initialise:nnnnn {#1} {#2} {#3} {#4} {#5}
\l__cookingunits_cunum_hook_tl
\__cookingunits_parse_input:n {#3}
+ \__cookingunits_process_and_print_input:
\__cookingunits_print_correct_unit:
}
\cs_new_protected:Npn \__cookingunits_cunum_initialise:nnnnn #1#2#3#4#5
@@ -1667,7 +1721,7 @@
\tl_use:N \l__cookingunits_value_unit_space_tl
\__cookingunits_change_unit:TF
{ \__cookingunits_translate:VV \l__cookingunits_option_unit_tl \c__cookingunits_postfix_unit_tl }
- { \__cookingunits_translate:VV \l__cookingunits_given_unit_tl \c__cookingunits_postfix_unit_tl }
+ { \__cookingunits_translate:VV \l__cookingunits_original_unit_tl \c__cookingunits_postfix_unit_tl }
}
\NewDocumentCommand \cutext { d<> O{} m m }
{
@@ -1706,7 +1760,7 @@
\__cookingunits_initialise_default:n {#3}
\__cookingunits_initialise_unit_change:n {#2}
\bool_if:NT \l__cookingunits_cutext_keep_unit_bool
- { \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_given_unit_tl }
+ { \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_original_unit_tl }
\__cookingunits_initialise_after_unit_change:nn {#1} {#2}
\bool_if:NT \l__cookingunits_fourty_two_bool
{ \tl_set:Nn \l__cookingunits_cutext_last_value_tl { 42 } }
@@ -1719,7 +1773,10 @@
{ \l__cookingunits_cutext_hook_tl }
\bool_if:NTF \l__cookingunits_cutext_old_bool
{ \__cookingunits_old_cutext:nnn {#2} {#3} {#4} }
- { \__cookingunits_parse_input:n {#3} }
+ {
+ \__cookingunits_parse_input:n {#3}
+ \__cookingunits_process_and_print_input:
+ }
\__cookingunits_print_correct_unit:
}
\cs_new_protected:Npn \__cookingunits_cutext_print_input:Nn #1#2
@@ -1748,7 +1805,7 @@
{
\__cookingunits_change_unit:TF
{ \__cookingunits_cutext_print_input:NV #1 \l__cookingunits_option_unit_tl }
- { \__cookingunits_cutext_print_input:NV #1 \l__cookingunits_given_unit_tl }
+ { \__cookingunits_cutext_print_input:NV #1 \l__cookingunits_original_unit_tl }
}
\cs_new:Npn \__cookingunits_cutext_print_correct_unitname:
{
@@ -1759,13 +1816,13 @@
{ \__cookingunits_translate:VV \l__cookingunits_option_unit_tl \c__cookingunits_postfix_unitname_tl }
{ \__cookingunits_translate:VV \l__cookingunits_option_unit_tl \c__cookingunits_postfix_unitname_pl_tl }
}
- { \__cookingunits_translate:VV \l__cookingunits_given_unit_tl \c__cookingunits_postfix_unitname_pl_tl }
+ { \__cookingunits_translate:VV \l__cookingunits_original_unit_tl \c__cookingunits_postfix_unitname_pl_tl }
}
\cs_new:Npn \__cookingunits_cutext_pre_process_input:NN #1#2
{
\__cookingunits_change_unit:TF
{ \tl_set_eq:NN \l__cookingunits_tmpb_tl \l__cookingunits_option_unit_tl }
- { \tl_set_eq:NN \l__cookingunits_tmpb_tl \l__cookingunits_given_unit_tl }
+ { \tl_set_eq:NN \l__cookingunits_tmpb_tl \l__cookingunits_original_unit_tl }
\__cookingunits_unitname_get:NxF \l__cookingunits_tmpa_tl \l__cookingunits_tmpb_tl
{
\msg_warning:nnx
@@ -1812,7 +1869,7 @@
\tl_const:Nn \c__cookingunits_cuam_marker_tl { __cookingunits_cunum }
\tl_new:c { l__cookingunits_unit_change_ \c__cookingunits_cuam_marker_tl _tl }
\tl_set:cn { l__cookingunits_unit_change_ \c__cookingunits_cuam_marker_tl _tl } { 1.0 }
-\clist_new:c { l__cookingunits_predefined_option_ \c__cookingunits_cuam_marker_tl _clist }
+\clist_new:c { l__cookingunits_unit_option_ \c__cookingunits_cuam_marker_tl _clist }
\NewDocumentCommand \cuam { d<> O{} m }
{
\__cookingunits_if_arrow_grab_until_close_do:nnTF {#3} { }
@@ -1831,6 +1888,7 @@
{ \__cookingunits_cuam_old:n {#3} }
{
\__cookingunits_parse_input:n {#3}
+ \__cookingunits_process_and_print_input:
\__cookingunits_print_correct_unit:
}
}
@@ -1837,7 +1895,7 @@
\cs_new_protected:Npn \__cookingunits_cuam_initialise:nn #1#2
{
\__cookingunits_set_process_and_print_for_cuam:
- \tl_set_eq:NN \l__cookingunits_given_unit_tl \c__cookingunits_cuam_marker_tl
+ \tl_set_eq:NN \l__cookingunits_original_unit_tl \c__cookingunits_cuam_marker_tl
\tl_set_eq:NN \l__cookingunits_option_unit_tl \c__cookingunits_cuam_marker_tl
\bool_set_false:N \l__cookingunits_lokal_phrase_bool
\__cookingunits_initialise_after_unit_change:nn {#1} {#2}
@@ -1982,17 +2040,22 @@
}
\cs_new:Npn \__cookingunits_cukeys_define_keys_and_single_keys:nn #1#2
{
- \__cookingunits_error_if_unit_not_defined:n {#1}
+ \__cookingunits_error_if_unit_not_defined:nTF {#1}
+ { \bool_set_true:N } { \bool_set_false:N }
+ \l__cookingunits_unit_error_bool
\tl_if_blank:nF {#2}
{
+ \prop_gclear:N \g__cookingunits_master_changer_prop
+ \prop_gclear:N \g__cookingunits_convert_to_eV_remember_prop
\seq_clear:N \l__cookingunits_tmpa_seq
\prop_clear:N \l__cookingunits_tmpa_prop
+ \prop_clear_new:c { l__cookingunits_cukeys_ #1 _prop }
\bool_if:NTF \l__cookingunits_single_key_bool
{
\__cookingunits_cukeys_parse_and_create_single_key:nn {#1} {#2}
}{
\fp_set:Nn \l__cookingunits_tmpa_fp { 1.0 }
- \tl_set:Nn \l__cookingunits_given_unit_tl {#1}
+ \tl_set:Nn \l__cookingunits_original_unit_tl {#1}
\__cookingunits_cukeys_parse_and_create_keys:nn {#1}
{
{#1} { 1.0 } #2
@@ -2004,42 +2067,36 @@
{
\__cookingunits_cukeys_parse_input:nn #2
\q_recursion_tail \q_recursion_tail \q_recursion_stop
- \__cookingunits_cukeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l__cookingunits_tmpa_clist \l__cookingunits_tmpa_seq
- \__cookingunits_cukeys_define_keys:V \l__cookingunits_tmpa_clist
+ \bool_if:NF \l__cookingunits_unit_error_bool
+ {
+ \__cookingunits_cukeys_create_key_prop:n {#1}
+ \clist_set_from_seq:NN \l__cookingunits_tmpa_clist \l__cookingunits_tmpa_seq
+ \__cookingunits_cukeys_define_keys:V \l__cookingunits_tmpa_clist
+ }
}
+\cs_generate_variant:Nn \__cookingunits_cukeys_parse_and_create_keys:nn { Vn }
\cs_new:Npn \__cookingunits_cukeys_parse_input:nn #1#2
{
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \seq_put_right:Nn \l__cookingunits_tmpa_seq {#1}
- \prop_put:Nnx \l__cookingunits_tmpa_prop {#1} { \fp_eval:n { (#2) / \l__cookingunits_tmpa_fp } }
+ \__cookingunits_error_if_unit_not_defined:nF {#1}
+ {
+ \seq_if_in:NnF \l__cookingunits_tmpa_seq {#1}
+ { \seq_put_right:Nn \l__cookingunits_tmpa_seq {#1} }
+ \prop_put:Nnx \l__cookingunits_tmpa_prop {#1} { \fp_eval:n { (#2) * \l__cookingunits_tmpa_fp } }
+ }
\__cookingunits_cukeys_parse_input:nn
}
+
\cs_new:Npn \__cookingunits_cukeys_create_key_prop:n #1
{
- \prop_clear:N \l__cookingunits_tmpb_prop
- \prop_put:NnV \l__cookingunits_tmpb_prop { Liste } \l__cookingunits_tmpa_seq
- \prop_put:NnV \l__cookingunits_tmpb_prop { prop } \l__cookingunits_tmpa_prop
- \prop_put:NnV \l__cookingunits_tmpb_prop { Erstes Ding } \l__cookingunits_given_unit_tl
+ \prop_set_eq:cN { l__cookingunits_cukeys_ #1 _prop } \l__cookingunits_tmpa_prop
+ \prop_put:cnV { l__cookingunits_cukeys_ #1 _prop } { Liste } \l__cookingunits_tmpa_seq
\seq_map_inline:Nn \l__cookingunits_tmpa_seq
{
- \prop_set_eq:cN { l__cookingunits_cukeys_ ##1 _prop } \l__cookingunits_tmpb_prop
+ \tl_set_eq:cN { l__cookingunits_base_key_unit_ ##1 _tl } \l__cookingunits_original_unit_tl
\tl_set:cn { l__cookingunits_unit_change_ ##1 _tl } { 1.0 }
- \seq_map_inline:Nn \l__cookingunits_tmpa_seq
- {
- \prop_put:cnx { l__cookingunits_cukeys_ ##1 _prop }
- {####1}
- {
- \fp_eval:n
- {
- ( \prop_item:Nn \l__cookingunits_tmpa_prop {####1} ) /
- ( \prop_item:Nn \l__cookingunits_tmpa_prop {##1} )
- }
- }
- }
}
}
\cs_new:Npn \__cookingunits_cukeys_define_keys:n #1
@@ -2046,37 +2103,70 @@
{
\seq_map_inline:Nn \l__cookingunits_tmpa_seq
{
- \seq_if_in:NnF \l__cookingunits_list_of_defined_keys_seq {##1}
- { \seq_put_right:Nn \l__cookingunits_list_of_defined_keys_seq {##1} }
- \keys_define:nn { cooking-units }
- {
- ##1 .choices:Vn =
- \l__cookingunits_tmpa_clist
- {
- \__cookingunits_cukeys_define_keys_and_single_key_aux:n {##1}
- } ,
- ##1 / unknown .code:n=
- {
- \seq_set_split:Nnn \l_tmpa_seq { , } {#1}
- \msg_error:nnxxx
- { cooking-units }
- { key-choice-unknown }
- {##1}
- {####1}
- { \seq_use:Nnnn \l_tmpa_seq { ',~ ' } { ',~ ' } { ' ~ and ~ ' } }
- } ,
- ##1 .default:n = {##1} ,
- ##1 .groups:n = { change-unit }
- }
+ \__cookingunits_cukeys_keys_define:nn {##1} {#1}
}
}
+\cs_new:Npn \__cookingunits_cukeys_keys_define:nn #1#2
+ {
+ \seq_if_in:NnF \l__cookingunits_list_of_defined_keys_seq {#1}
+ { \seq_put_right:Nn \l__cookingunits_list_of_defined_keys_seq {#1} }
+ \keys_define:nn { cooking-units }
+ {
+ #1 .choices:nn =
+ {#2}
+ {
+ \__cookingunits_cukeys_define_keys_and_single_key_aux:n {#1}
+ } ,
+ #1 / unknown .code:n=
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
+ \msg_error:nnxxx
+ { cooking-units }
+ { key-choice-unknown }
+ {#1}
+ {##1}
+ { \__cookingunits_seq_use_msg:N \l_tmpa_seq }
+ } ,
+ #1 .default:n = {#1} ,
+ #1 .groups:n = { change-unit }
+ }
+ }
\cs_generate_variant:Nn \__cookingunits_cukeys_define_keys:n { V }
+\prg_new_conditional:Npnn \__cookingunits_prop_get_master:nnN #1#2#3 { F }
+ {
+ \prop_get:NnNTF \g__cookingunits_master_changer_prop { #1 ~->~ #2 } #3
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \__cookingunits_prop_get_master:nnNF { nVc }
+\cs_new:Npn \__cookingunits_prop_gput_master:nnn #1#2#3
+ {
+ \prop_gput:Nnn \g__cookingunits_master_changer_prop { #1 ~->~ #2 } {#3}
+ }
+\cs_generate_variant:Nn \__cookingunits_prop_gput_master:nnn { nVV, nVv }
\cs_new:Npn \__cookingunits_cukeys_define_keys_and_single_key_aux:n #1
{
- \prop_get:cVc
- { l__cookingunits_cukeys_#1_prop }
- \l_keys_choice_tl
- { l__cookingunits_unit_change_ #1_tl }
+ \__cookingunits_prop_get_master:nVcF {#1} \l_keys_choice_tl { l__cookingunits_unit_change_ #1_tl }
+ {
+ \prop_if_exist:cTF { l__cookingunits_cukeys_ #1 _prop }
+ {
+ \prop_get:cVc
+ { l__cookingunits_cukeys_ #1 _prop }
+ \l_keys_choice_tl
+ { l__cookingunits_unit_change_ #1_tl }
+ \__cookingunits_prop_gput_master:nVv {#1} \l_keys_choice_tl { l__cookingunits_unit_change_ #1_tl }
+ }{
+ \tl_set_eq:Nc \l__cookingunits_tmpa_tl { l__cookingunits_base_key_unit_ #1 _tl }
+ \prop_set_eq:Nc \l__cookingunits_tmpa_prop { l__cookingunits_cukeys_ \l__cookingunits_tmpa_tl _prop }
+ \__cookingunits_tl_eval:Nn \l__cookingunits_tmpb_tl
+ {
+ (\exp_args:NNV\prop_item:Nn \l__cookingunits_tmpa_prop \l_keys_choice_tl) /
+ (\prop_item:Nn \l__cookingunits_tmpa_prop {#1})
+ }
+ \__cookingunits_prop_gput_master:nVV {#1} \l_keys_choice_tl \l__cookingunits_tmpb_tl
+ \tl_set:cV { l__cookingunits_unit_change_ #1 _tl } \l__cookingunits_tmpb_tl
+ }
+ }
\prop_put:NnV \l__cookingunits_change_unit_prop {#1} \l_keys_choice_tl
}
\cs_new:Npn \__cookingunits_cukeys_parse_and_create_single_key:nn #1#2
@@ -2087,9 +2177,12 @@
\char_set_catcode_ignore:N\ %
} { {#1} { 1.0 } #2 }
\__cookingunits_cusinglekeys_parse_input:V \l__cookingunits_tmpa_tl
- \__cookingunits_cusinglekeys_create_key_prop:n {#1}
- \clist_set_from_seq:NN \l__cookingunits_tmpa_clist \l__cookingunits_tmpa_seq
- \__cookingunits_cukeys_define_singlekey:nV {#1} \l__cookingunits_tmpa_clist
+ \bool_if:NF \l__cookingunits_unit_error_bool
+ {
+ \__cookingunits_cusinglekeys_create_key_prop:n {#1}
+ \clist_set_from_seq:NN \l__cookingunits_tmpa_clist \l__cookingunits_tmpa_seq
+ \__cookingunits_cukeys_define_singlekey:nV {#1} \l__cookingunits_tmpa_clist
+ }
}
\cs_new:Npn \__cookingunits_cusinglekeys_parse_input:n #1
{
@@ -2102,45 +2195,26 @@
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \seq_put_right:Nn \l__cookingunits_tmpa_seq {#1}
- \tl_set:Nn \l__cookingunits_tmpa_tl {#2}
- \tl_replace_all:NVn \l__cookingunits_tmpa_tl \c__cookingunits_input_str_hash_one_tl { \l__cookingunits_tmpa_fp }
- \prop_put:NnV \l__cookingunits_tmpa_prop {#1} \l__cookingunits_tmpa_tl
+ \__cookingunits_error_if_unit_not_defined:nF {#1}
+ {
+ \seq_if_in:NnF \l__cookingunits_tmpa_seq {#1}
+ { \seq_put_right:Nn \l__cookingunits_tmpa_seq {#1} }
+ \tl_set:Nn \l__cookingunits_tmpa_tl {#2}
+ \tl_replace_all:NVn \l__cookingunits_tmpa_tl \g__cookingunits_input_str_hash_one_tl { \l__cookingunits_tmpa_fp }
+ \prop_put:NnV \l__cookingunits_tmpa_prop {#1} \l__cookingunits_tmpa_tl
+ }
\__cookingunits_cusinglekeys_parse_input_aux:nn
}
\cs_new:Npn \__cookingunits_cusinglekeys_create_key_prop:n #1
{
\tl_set:cn { l__cookingunits_unit_change_ #1 _tl } { 1.0 }
+ \tl_set:cn { l__cookingunits_base_key_unit_ #1 _tl } {#1}
\prop_set_eq:cN { l__cookingunits_cukeys_ #1 _prop } \l__cookingunits_tmpa_prop
- \prop_put:cnn { l__cookingunits_cukeys_ #1 _prop } { Erstes Ding } {#1}
\prop_put:cnV { l__cookingunits_cukeys_ #1 _prop } { Liste } \l__cookingunits_tmpa_seq
- \prop_put:cnV { l__cookingunits_cukeys_ #1 _prop } { prop } \l__cookingunits_tmpa_prop
}
\cs_new:Npn \__cookingunits_cukeys_define_singlekey:nn #1#2
{
- \seq_if_in:NnF \l__cookingunits_list_of_defined_keys_seq {#1}
- { \seq_put_right:Nn \l__cookingunits_list_of_defined_keys_seq {#1} }
- \keys_define:nn { cooking-units }
- {
- #1 .choices:Vn =
- \l__cookingunits_tmpa_clist
- {
- \__cookingunits_cukeys_define_keys_and_single_key_aux:n {#1}
- } ,
- #1 / unknown .code:n=
- {
- \seq_set_split:Nnn \l_tmpa_seq { , } {#2}
- \msg_error:nnxxx
- { cooking-units }
- { key-choice-unknown }
- {#1}
- {##1}
- { \seq_use:Nnnn \l_tmpa_seq { ',' } { ',' } { ' ~ and ~ ' } }
- } ,
- #1 .default:n = {#1} ,
- #1 .groups:n = { change-unit } ,
- }
+ \__cookingunits_cukeys_keys_define:nn {#1} {#2}
}
\cs_generate_variant:Nn \__cookingunits_cukeys_define_singlekey:nn { nV }
\NewDocumentCommand \cuaddkeys { m m }
@@ -2161,24 +2235,27 @@
}
\cs_new:Npn \__cookingunits_cukeys_add_keys_or_single_keys:nn #1#2
{
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \seq_if_in:NnF \l__cookingunits_list_of_defined_keys_seq {#1}
- { \msg_error:nnn { cooking-units } { Key-not-defined } {#1} }
- \tl_if_blank:nF {#2}
+ \__cookingunits_error_if_unit_not_defined:nF {#1}
{
- \__cookingunits_cukeys_add_keys_and_single_key_aux:n {#1}
- \bool_if:NTF \l__cookingunits_single_key_bool
- { \__cookingunits_cukeys_parse_and_create_single_key:nn {#1} {#2} }
- { \__cookingunits_cukeys_parse_and_create_keys:nn {#1} {#2} }
+ \seq_if_in:NnF \l__cookingunits_list_of_defined_keys_seq {#1}
+ { \msg_error:nnn { cooking-units } { Key-not-defined } {#1} }
+ \tl_if_blank:nF {#2}
+ {
+ \prop_gclear:N \g__cookingunits_master_changer_prop
+ \__cookingunits_cukeys_add_keys_and_single_key_aux:n {#1}
+ \bool_if:NTF \l__cookingunits_single_key_bool
+ { \__cookingunits_cukeys_parse_and_create_single_key:nn {#1} {#2} }
+ { \__cookingunits_cukeys_parse_and_create_keys:Vn \l__cookingunits_original_unit_tl {#2} }
+ }
}
}
\cs_generate_variant:Nn \__cookingunits_cukeys_add_keys_or_single_keys:nn { nV }
\cs_new:Npn \__cookingunits_cukeys_add_keys_and_single_key_aux:n #1
{
- \prop_get:cnN { l__cookingunits_cukeys_ #1 _prop } { Liste } \l__cookingunits_tmpa_seq
- \prop_get:cnN { l__cookingunits_cukeys_ #1 _prop } { prop } \l__cookingunits_tmpa_prop
- \prop_get:cnN { l__cookingunits_cukeys_ #1 _prop } { Erstes Ding } \l__cookingunits_given_unit_tl
- \prop_get:cVN { l__cookingunits_cukeys_ #1 _prop } \l__cookingunits_given_unit_tl \l__cookingunits_tmpa_fp
+ \tl_set_eq:Nc \l__cookingunits_original_unit_tl { l__cookingunits_base_key_unit_ #1 _tl }
+ \prop_set_eq:Nc \l__cookingunits_tmpa_prop { l__cookingunits_cukeys_ \l__cookingunits_original_unit_tl _prop }
+ \prop_get:NnN\l__cookingunits_tmpa_prop { Liste } \l__cookingunits_tmpa_seq
+ \prop_get:NnN \l__cookingunits_tmpa_prop {#1} \l__cookingunits_tmpa_fp
}
\NewDocumentCommand \declarecookingunit { o m }
{
@@ -2210,17 +2287,16 @@
\tl_if_in:NnT \l__cookingunits_unit_letter_not_allowed_tl {##1}
{ \msg_error:nnn { cooking-units } { character-not-allowed } {#2} }
}
- \seq_put_right:Nn \g__cookingunits_list_of_defined_units_seq {#2}
+ \seq_gput_right:Nn \g__cookingunits_list_of_defined_units_seq {#2}
\tl_new:c { l__cookingunits_unit_change_ #2 _tl }
\tl_set:cn { l__cookingunits_unit_change_ #2 _tl } { 1.0 }
- \clist_new:c { l__cookingunits_predefined_option_#2_clist }
+ \clist_new:c { l__cookingunits_unit_option_ #2 _clist }
\keys_define:nn { cooking-units }
{
- set-option-for-#2 .clist_set:c = { l__cookingunits_predefined_option_#2_clist } ,
- add-option-for-#2 .code:n =
- { \clist_put_right:cn { l__cookingunits_predefined_option_#2_clist } {##1} },
+ set-option-for-#2 .code:n = { \cusetoptionfor {#2} {##1} } ,
+ add-option-for-#2 .code:n = { \cuaddoptionfor {#2} {##1} },
}
- \prop_new:c { l__cookingunits_cukeys_ #2 _prop }
+ \tl_new:c { l__cookingunits_base_key_unit_ #2 _tl }
\tl_new:c { l__cookingunits_default_unit_ #2 _tl }
}
}
@@ -2229,15 +2305,115 @@
\IfNoValueTF {#1}
{
\tl_set:cn { l__cookingunits_default_unit_ #2 _tl } {#2}
- \__cookingunits_deftranslation_base:xxn {#2} \c__cookingunits_postfix_unit_tl {#2}
+ \__cookingunits_deftranslation_base:xVn {#2} \c__cookingunits_postfix_unit_tl {#2}
}{
\tl_set:cn { l__cookingunits_default_unit_ #2 _tl } {#1}
- \__cookingunits_deftranslation_base:xxn {#2} \c__cookingunits_postfix_unit_tl {#1}
+ \__cookingunits_deftranslation_base:xVn {#2} \c__cookingunits_postfix_unit_tl {#1}
}
- \__cookingunits_deftranslation_base:xxn {#2} \c__cookingunits_postfix_unitname_tl { \q__cookingunits_no_translation }
- \__cookingunits_deftranslation_base:xxn {#2} \c__cookingunits_postfix_unitname_pl_tl { \q__cookingunits_no_translation }
- \__cookingunits_deftranslation_base:xxn {#2} \c__cookingunits_postfix_gender_tl { m }
+ \__cookingunits_deftranslation_base:xVn {#2} \c__cookingunits_postfix_unitname_tl { \q__cookingunits_no_translation }
+ \__cookingunits_deftranslation_base:xVn {#2} \c__cookingunits_postfix_unitname_pl_tl { \q__cookingunits_no_translation }
+ \__cookingunits_deftranslation_base:xVn {#2} \c__cookingunits_postfix_gender_tl { m }
}
+\NewDocumentCommand \declarecookingderivatives { m m m m }
+ {
+ \__cookingunits_declare_cooking_derivative:nnnn {#1} {#2} {#3} {#4}
+ }
+\cs_new:Npn \__cookingunits_tl_set_list:Nnn #1#2#3
+ {
+ \__cookingunits_tl_set_list_aux:Nnnnnnnnn #1 {#2} #3
+ \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil
+ \q_recursion_stop
+ }
+\cs_generate_variant:Nn \__cookingunits_tl_set_list:Nnn { NnV, NVV }
+\cs_new:Npn \__cookingunits_tl_set_list_aux:Nnnnnnnnn #1#2#3#4#5#6#7#8#9
+ {
+ \tl_set:Nf #1
+ {
+ \int_case:nn { \l__cookingunits_curr_depth_int }
+ {
+ { 1 } { }
+ { 2 } { {#3} }
+ { 3 } { {#3}{#4} }
+ { 4 } { {#3}{#4}{#5} }
+ { 5 } { {#3}{#4}{#5}{#6} }
+ { 6 } { {#3}{#4}{#5}{#6}{#7} }
+ { 7 } { {#3}{#4}{#5}{#6}{#7}{#8} }
+ { 8 } { {#3}{#4}{#5}{#6}{#7}{#8}{#9} }
+ }
+ {#2}
+ }
+ \use_none_delimit_by_q_recursion_stop:w
+ }
+\cs_new:Npn \__cookingunits_declare_cooking_derivative:nnnn #1#2#3#4
+ {
+ \prop_gclear:N \g__cookingunits_master_changer_prop
+ \seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
+ \seq_clear:N \l__cookingunits_number_of_iterations_seq
+ \seq_clear:N \l__cookingunits_derivative_unit_list_seq
+ \seq_clear:N \l__cookingunits_derivative_symbol_list_seq
+ \seq_clear:N \l__cookingunits_derivative_value_list_seq
+ \int_set:Nn \l__cookingunits_max_depth_int { \seq_count:N \l__cookingunits_tmpa_seq }
+ \int_set:Nn \l__cookingunits_curr_depth_int { 1 }
+ \cs_generate_from_arg_count:NNnn \__cookingunits_tmp_unit_and_symbol_list:w \cs_set:Npn
+ { \l__cookingunits_max_depth_int }
+ {
+ \seq_put_right:Nn \l__cookingunits_derivative_unit_list_seq {#2}
+ \seq_put_right:Nn \l__cookingunits_derivative_symbol_list_seq {#4}
+ }
+ \cs_generate_from_arg_count:NNnn \__cookingunits_tmp_value_list:w \cs_set:Npn
+ { \l__cookingunits_max_depth_int }
+ { \seq_put_right:Nx \l__cookingunits_derivative_value_list_seq { \fp_eval:n {#3} } }
+ \int_step_inline:nn { \l__cookingunits_max_depth_int }
+ {
+ \tl_set_eq:Nc \l__cookingunits_original_unit_tl
+ { l__cookingunits_base_key_unit_ \seq_item:Nn \l__cookingunits_tmpa_seq {##1} _tl }
+ \prop_set_eq:Nc \l__cookingunits_tmpa_prop { l__cookingunits_cukeys_ \l__cookingunits_original_unit_tl _prop }
+ \prop_get:NnN \l__cookingunits_tmpa_prop { Liste } \l__cookingunits_tmpb_seq
+ \int_set:Nn \l__cookingunits_tmpa_int { \seq_count:N \l__cookingunits_tmpb_seq }
+ \seq_put_right:NV \l__cookingunits_number_of_iterations_seq \l__cookingunits_tmpa_int
+ \seq_clear_new:c { l__cookingunits_tmp_ ##1 _seq }
+ \prop_clear_new:c { l__cookingunits_tmp_ ##1 _prop }
+ \seq_set_eq:cN { l__cookingunits_tmp_ ##1 _seq } \l__cookingunits_tmpb_seq
+ \prop_set_eq:cN { l__cookingunits_tmp_ ##1 _prop } \l__cookingunits_tmpa_prop
+ }
+ \seq_map_function:cN
+ { l__cookingunits_tmp_ \int_use:N \l__cookingunits_curr_depth_int _seq }
+ \__cookingunits_seq_step_function:n
+ \seq_get_left:NN \l__cookingunits_derivative_unit_list_seq \l__cookingunits_original_unit_tl
+ \prop_clear_new:c { l__cookingunits_cukeys_ \l__cookingunits_original_unit_tl _prop }
+ \int_zero:N \l__cookingunits_tmpa_int
+ \clist_set_from_seq:NN \l__cookingunits_tmpa_clist \l__cookingunits_derivative_unit_list_seq
+ \seq_map_inline:Nn \l__cookingunits_derivative_unit_list_seq
+ {
+ \int_incr:N \l__cookingunits_tmpa_int
+ \tl_set:Nx \l__cookingunits_tmpa_tl { \seq_item:Nn \l__cookingunits_derivative_symbol_list_seq { \l__cookingunits_tmpa_int } }
+ \exp_after:wN \declarecookingunit \exp_after:wN [ \l__cookingunits_tmpa_tl ] {##1}
+ \prop_put:cnx
+ { l__cookingunits_cukeys_ \l__cookingunits_original_unit_tl _prop }
+ {##1}
+ { \seq_item:Nn \l__cookingunits_derivative_value_list_seq { \l__cookingunits_tmpa_int } }
+ \tl_clear_new:c { l__cookingunits_base_key_unit_ ##1 _tl }
+ \tl_set_eq:cN { l__cookingunits_base_key_unit_ ##1 _tl } \l__cookingunits_original_unit_tl
+ \exp_args:NnV \__cookingunits_cukeys_keys_define:nn {##1} \l__cookingunits_tmpa_clist
+ }
+ }
+\cs_new:Npn \__cookingunits_seq_step_function:n #1
+ {
+ \__cookingunits_tl_set_list:NnV \l__cookingunits_list_of_units_tl {#1} \l__cookingunits_list_of_units_tl
+ \prop_get:cnN { l__cookingunits_tmp_ \int_use:N \l__cookingunits_curr_depth_int _prop } {#1} \l__cookingunits_tmpa_tl
+ \__cookingunits_tl_set_list:NVV \l__cookingunits_list_of_values_tl \l__cookingunits_tmpa_tl \l__cookingunits_list_of_values_tl
+ \int_compare:nNnTF { \l__cookingunits_curr_depth_int } = { \l__cookingunits_max_depth_int }
+ {
+ \exp_after:wN \__cookingunits_tmp_unit_and_symbol_list:w \l__cookingunits_list_of_units_tl
+ \exp_after:wN \__cookingunits_tmp_value_list:w \l__cookingunits_list_of_values_tl
+ }{
+ \int_incr:N \l__cookingunits_curr_depth_int
+ \seq_map_function:cN
+ { l__cookingunits_tmp_ \int_use:N \l__cookingunits_curr_depth_int _seq }
+ \__cookingunits_seq_step_function:n
+ \int_decr:N \l__cookingunits_curr_depth_int
+ }
+ }
\tl_new:N \l__cookingunits_sanitise_tl
\cs_new_protected:Npn \__cookingunits_sanitise_aux:w #1 \q_mark
{ \tl_set:Nn \l__cookingunits_sanitise_tl {#1} }
@@ -2323,15 +2499,16 @@
\quark_if_recursion_tail_stop:n {#1}
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
- \__cookingunits_error_if_unit_not_defined:n {#1}
+ \__cookingunits_error_if_unit_not_defined:nT {#1}
+ { \use_none_delimit_by_q_recursion_stop:w }
\quark_if_no_value:nTF {#2}
{
- \__cookingunits_deftranslation_to:Vxxv
+ \__cookingunits_deftranslation_to:VxVv
\l__cookingunits_language_tl {#1}
\c__cookingunits_postfix_unit_tl
{ l__cookingunits_default_unit_ #1 _tl }
}{
- \__cookingunits_deftranslation_to:Vxxn
+ \__cookingunits_deftranslation_to:VxVn
\l__cookingunits_language_tl {#1}
\c__cookingunits_postfix_unit_tl {#2}
}
@@ -2343,8 +2520,11 @@
\quark_if_recursion_tail_stop_do:nn {#2}
{ \msg_error:nn { cooking-units } { missing-argument } }
\seq_if_in:NnF \g__cookingunits_allowed_special_keys_seq {#1}
- { \__cookingunits_error_if_unit_not_defined:n {#1} }
- \__cookingunits_deftranslation_to:Vxxn
+ {
+ \__cookingunits_error_if_unit_not_defined:nT {#1}
+ { \use_none_delimit_by_q_recursion_stop:w }
+ }
+ \__cookingunits_deftranslation_to:VxVn
\l__cookingunits_language_tl {#1}
\c__cookingunits_postfix_unitname_tl {#2}
\peek_meaning_ignore_spaces:NTF [
@@ -2355,7 +2535,7 @@
{
\seq_if_in:NnF \g__cookingunits_allowed_special_keys_seq {#1}
{
- \__cookingunits_deftranslation_to:Vxxn \l__cookingunits_language_tl {#1}
+ \__cookingunits_deftranslation_to:VxVn \l__cookingunits_language_tl {#1}
\c__cookingunits_postfix_unitname_pl_tl {#2}
}
\peek_meaning_ignore_spaces:NTF <
@@ -2364,10 +2544,16 @@
}
\cs_new:Npn \__cookingunits_cuname_parse_gender:nw #1 <#2>
{
- \__cookingunits_check_if_correct_gender_input:n {#2}
- \__cookingunits_deftranslation_to:Vxxn
- \l__cookingunits_language_tl {#1}
- \c__cookingunits_postfix_gender_tl {#2}
+ \__cookingunits_if_gender_error:nTF {#2}
+ {
+ \__cookingunits_deftranslation_to:VxVn
+ \l__cookingunits_language_tl {#1}
+ \c__cookingunits_postfix_gender_tl { m }
+ }{
+ \__cookingunits_deftranslation_to:VxVn
+ \l__cookingunits_language_tl {#1}
+ \c__cookingunits_postfix_gender_tl {#2}
+ }
\__cookingunits_cuname_parse_input:n
}
\NewDocumentCommand \cudefinesymbol { m m }
@@ -2383,13 +2569,15 @@
{ \msg_error:nn { cooking-units } { missing-argument } }
\seq_if_in:NnTF \g__cookingunits_allowed_special_keys_seq {#1}
{
- \__cookingunits_deftranslation_to:Vxxn \l__cookingunits_language_tl {#1}
+ \__cookingunits_deftranslation_to:VxVn \l__cookingunits_language_tl {#1}
\c__cookingunits_postfix_unitname_tl {#2}
}{
- \__cookingunits_error_if_unit_not_defined:n {#1}
- \__cookingunits_deftranslation_to:Vxxn
- \l__cookingunits_language_tl {#1}
- \c__cookingunits_postfix_unit_tl {#2}
+ \__cookingunits_error_if_unit_not_defined:nF {#1}
+ {
+ \__cookingunits_deftranslation_to:VxVn
+ \l__cookingunits_language_tl {#1}
+ \c__cookingunits_postfix_unit_tl {#2}
+ }
}
\__cookingunits_cuprint_define_printed_unit:nn
}
@@ -2443,11 +2631,11 @@
}{ \sort_return_same: }
}
}
- \__cookingunits_deftranslation_to:VxxV
+ \__cookingunits_deftranslation_to:VxVV
\l__cookingunits_language_tl { phrase-prop }
\c__cookingunits_postfix_phrase_tl
\l__cookingunits_phrase_prop
- \__cookingunits_deftranslation_to:VxxV
+ \__cookingunits_deftranslation_to:VxVV
\l__cookingunits_language_tl { phrase-clist }
\c__cookingunits_postfix_phrase_tl \l__cookingunits_phrase_numbers_seq
}
@@ -2492,15 +2680,21 @@
}
\cs_new:Npn \__cookingunits_chuphrase_parse_gender:nw #1 <#2>
{
- \__cookingunits_check_if_correct_gender_input:n {#2}
- \__cookingunits_deftranslation_to:Vxxn
- \l__cookingunits_language_tl { #1-phrase-gender }
- \c__cookingunits_postfix_gender_tl {#2}
+ \__cookingunits_if_gender_error:nTF {#2}
+ {
+ \__cookingunits_deftranslation_to:VxVn
+ \l__cookingunits_language_tl { #1-phrase-gender }
+ \c__cookingunits_postfix_gender_tl { m }
+ }{
+ \__cookingunits_deftranslation_to:VxVn
+ \l__cookingunits_language_tl { #1-phrase-gender }
+ \c__cookingunits_postfix_gender_tl {#2}
+ }
\__cookingunits_cuphrase_parse:n
}
\cs_new:Npn \__cookingunits_old_cutext:nnn #1#2#3
{
- \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_given_unit_tl
+ \tl_set_eq:NN \l__cookingunits_option_unit_tl \l__cookingunits_original_unit_tl
\__cookingunits_old_cutext_default:nnn {#1} {#2} {#3}
}
\cs_new:Npn \__cookingunits_old_cutext_default:nnn #1#2#3
@@ -2612,7 +2806,7 @@
\cs_new:Npn \__cookingunits_cuam_old_parse_mixed_frac:www #1_#2/#3 \q_stop
{
#1
- \__cookingunits_dim_horizontal:N \l__cookingunits_mixed_frac_dim
+ \skip_horizontal:N \l__cookingunits_mixed_frac_dim
\__cookingunits_frac:nn {#2} {#3}
}
\NewDocumentCommand \cufrac { O{} m }
@@ -2653,9 +2847,103 @@
\cs_new:Npn \__cookingunits_cufrac_parse_mixed_frac:www #1_#2/#3 \q_stop
{
#1
- \__cookingunits_dim_horizontal:N \l__cookingunits_mixed_frac_dim
+ \skip_horizontal:N \l__cookingunits_mixed_frac_dim
\__cookingunits_frac:nn {#2} {#3}
}
+\cs_new:Npn \__cookingunits_add_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
+ \seq_map_inline:Nn \l__cookingunits_tmpa_seq
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnF \l__cookingunits_curef_do_not_change_seq {##1}
+ { \seq_put_right:Nn \l__cookingunits_curef_do_not_change_seq {##1} }
+ }
+ }
+ }
+\cs_new:Npn \__cookingunits_remove_forbidden_unit:n #1
+ {
+ \seq_set_from_clist:Nn \l__cookingunits_tmpa_seq {#1}
+ \seq_map_inline:Nn \l__cookingunits_tmpa_seq
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {##1}
+ {
+ \seq_if_in:NnTF \l__cookingunits_curef_do_not_change_seq {##1}
+ { \seq_remove_all:Nn \l__cookingunits_curef_do_not_change_seq {##1} }
+ {
+ \msg_warning:nnnn { cooking-units } { curef-not-inside-list } {##1}
+ { \__cookingunits_seq_use_msg:N \l__cookingunits_curef_do_not_change_seq }
+ }
+ }
+ }
+ }
+\cs_new:Npn \__cookingunits_clear_forbidden_unit:
+ { \seq_clear:N \l__cookingunits_curef_do_not_change_seq }
+\NewDocumentCommand \cudeclareunitgroup { m m }
+ {
+ \__cookingunits_define_clear_unit_group:nn {#1} {#2}
+ \__cookingunits_add_to_unit_group:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuaddtounitgroup { m m }
+ {
+ \__cookingunits_add_to_unit_group:nn {#1} {#2}
+ }
+\NewDocumentCommand \cuclearunitgroup { m }
+ {
+ \__cookingunits_error_if_group_not_defined:nF {#1}
+ { \__cookingunits_define_clear_unit_group:nn {#1} { } }
+ }
+\NewDocumentCommand \cusetoptionfor { m m }
+ {
+ \__cookingunits_map_trough_valid_unit_options:nnn {#1} {#2}
+ { \clist_set:cn { l__cookingunits_unit_option_ ##1 _clist } {##2} }
+ }
+\NewDocumentCommand \cuaddoptionfor { m m }
+ {
+ \__cookingunits_map_trough_valid_unit_options:nnn {#1} {#2}
+ { \clist_put_right:cn { l__cookingunits_unit_option_ ##1 _clist } {##2} }
+ }
+\NewDocumentCommand \cuclearoptionfor { m }
+ {
+ \__cookingunits_map_trough_valid_unit_options:nnn {#1} { }
+ { \clist_clear:c { l__cookingunits_unit_option_ ##1 _clist } }
+ }
+\cs_new:Npn \__cookingunits_tmp:w { }
+\cs_new:Npn \__cookingunits_map_trough_valid_unit_options:nnn #1#2 #3
+ {
+ \seq_clear:N \l__cookingunits_tmpa_seq
+ \clist_clear:N \l__cookingunits_tmpa_clist
+ \cs_set:Npn \__cookingunits_tmp:w ##1##2 {#3}
+ \clist_map_inline:nn {#1}
+ {
+ \__cookingunits_error_if_unit_not_defined:nF {##1}
+ { \seq_put_right:Nn \l__cookingunits_tmpa_seq {##1} }
+ }
+ \tl_if_empty:nF {#2}
+ { \__cookingunits_unit_options_check_validity:n {#2} }
+ \seq_map_inline:Nn \l__cookingunits_tmpa_seq
+ { \exp_args:NnV \__cookingunits_tmp:w {##1} \l__cookingunits_tmpa_clist }
+ }
+\cs_new:Npn \__cookingunits_unit_options_check_validity:n #1
+ {
+ \keyval_parse:NNn
+ \__cookingunits_unit_options_check_validity_aux_i:n
+ \__cookingunits_unit_options_check_validity_aux_ii:nn
+ {#1}
+ }
+\cs_new:Npn \__cookingunits_unit_options_check_validity_aux_i:n #1
+ {
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \clist_put_right:Nn \l__cookingunits_tmpa_clist {#1} }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
+ }
+\cs_new:Npn \__cookingunits_unit_options_check_validity_aux_ii:nn #1#2
+ {
+ \keys_if_exist:nnTF { cooking-units } {#1}
+ { \clist_put_right:Nn \l__cookingunits_tmpa_clist { #1={#2} } }
+ { \msg_error:nnn { cooking-units } { unknown-option } {#1} }
+ }
\NewDocumentCommand \cusetup { m }
{
\keys_set:nn { cooking-units } {#1}
@@ -2838,9 +3126,9 @@
{
{ dag }{ 100 }
{ g } { 1000 }
- { oz } { 35.27399 }
- { lb } { 2.2046226 } %% 2.204 622 6
- { stick } { 8.81849 }
+ { lb } { 1/0.45359237 }
+ { oz } { 16/0.45359237 }
+ { stick } { 4/0.45359237 }
{ eVc-2 } { 560958865.0e+27 } %% 560958865.0 +- 3.5 e+27
}
\cudefinekeys { d }
@@ -2855,7 +3143,7 @@
{ dm } { 10 }
{ cm } { 100 }
{ mm } { 1000 }
- { in } { 39.370079 }
+ { in } { 36/0.9144 }
{ chbareV-1 } { 5067730.759 } %% 5067730.759 +- 0.070
}
\cudefinekeys { l }
@@ -2905,12 +3193,15 @@
{
{ 12 } { Dutzend } < n >
}
+\cudeclareunitgroup { weight } { kg , dag, g, oz, lb, stick }
+\cudeclareunitgroup { length } { m , dm , cm , mm , in }
+\cudeclareunitgroup { volume } { l , dl , cl , ml }
+\cudeclareunitgroup { temperature } { C , F , K , Re }
+\cudeclareunitgroup { energy } { cal, kcal , J , kJ , eV }
+\cudeclareunitgroup { time } { d , h , min , s }
+\cusetoptionfor { F , C , K , Re } { round-precision = 0 }
\cusetup
{
- set-option-for-F = { round-to-int = true } ,
- set-option-for-C = { round-to-int = true } ,
- set-option-for-K = { round-to-int = true } ,
- set-option-for-Re = { round-to-int = true } ,
curef-add-forbidden-unit = { F , C , K , Re } ,
add-temperature-to-check =
{
More information about the tex-live-commits
mailing list