summaryrefslogtreecommitdiff
path: root/tex/context/base/phys-dim.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/phys-dim.mkiv')
-rw-r--r--tex/context/base/phys-dim.mkiv147
1 files changed, 98 insertions, 49 deletions
diff --git a/tex/context/base/phys-dim.mkiv b/tex/context/base/phys-dim.mkiv
index 4218d9dd0..4df9d3ad9 100644
--- a/tex/context/base/phys-dim.mkiv
+++ b/tex/context/base/phys-dim.mkiv
@@ -16,7 +16,7 @@
\unprotect
%D \macros
-%D {digits, setdigitmode, setdigitsign, setdigitorder}
+%D {digits, setdigitmode, setdigitsign}
%D
%D This is an update of the \MKII\ digits mechanism. Beware,
%D space delimited mode is now resticted!
@@ -128,16 +128,15 @@
%D \getbuffer
%D \stoplines
-% todo: smaller adn raised signs
+\newconstant\c_digits_order
+\newconstant\c_digits_method
+\newconstant\c_digits_sign % we has sized (text script scriptscript)
-\newconditional\c_digits_seen
-\newconstant \c_digits_mode
-\newconstant \c_digits_sign % we has sized (text script scriptscript)
-\newconstant \c_digits_order % 0=period comma 1=comma period
+\def\setdigitmethod#1{\c_digits_method #1\relax}
+\def\setdigitsign #1{\c_digits_sign #1\relax}
+\def\setdigitorder #1{\c_digits_order #1\relax}
-\def\setdigitmode #1{\c_digits_mode #1\relax}
-\def\setdigitsign #1{\c_digits_sign #1\relax}
-\def\setdigitorder#1{\c_digits_order#1\relax}
+\let\setdigitmode\setdigitmethod % compatibility
\def\digits_normalized % we could calculate once and remember
{\ifcase\c_digits_sign
@@ -177,49 +176,55 @@
\def\digitspower {\digits_raised}
\def\digitspowerplus #1{\digits_raised{\digitsplus#1}}
\def\digitspowerminus #1{\digits_raised{\digitsminus#1}}
+\def\digitsdigit #1{#1}
-% we can move the logic to lua
+\def\normaldigitscommasymbol {,}
+\def\normaldigitsperiodsymbol {.}
+\let\normaldigitsseparatorspace\digitsseparatorspace
-\def\digitsdigit #1{\ifconditional\c_digits_seen#1\else\ifnum#1=\zerocount\digitsspace\else\settrue\c_digits_seen#1\fi\fi}
-\def\digitscomma {\ifconditional\c_digits_seen\ifconditional\c_digits_order\digitscommasymbol \else\digitsperiodsymbol\fi\else\digitsseparatorspace\fi}
-\def\digitsperiod {\ifconditional\c_digits_seen\ifconditional\c_digits_order\digitsperiodsymbol\else\digitscommasymbol \fi\else\digitsseparatorspace\fi}
+\letvalue{digit_c_0}\normaldigitscommasymbol
+\letvalue{digit_p_0}\normaldigitsperiodsymbol
+\letvalue{digit_s_0}\normaldigitsseparatorspace
-\def\normaldigitscommasymbol {,}
-\def\normaldigitsperiodsymbol{.}
+\letvalue{digit_c_1}\normaldigitsperiodsymbol
+\letvalue{digit_p_1}\normaldigitscommasymbol
+\letvalue{digit_s_1}\normaldigitsseparatorspace
-\let\digitscommasymbol \normaldigitscommasymbol
-\let\digitsperiodsymbol\normaldigitsperiodsymbol
+\letvalue{digit_c_2}\normaldigitscommasymbol
+\letvalue{digit_p_2}\normaldigitsperiodsymbol
+\letvalue{digit_s_2}\normaldigitsseparatorspace
-\unexpanded\def\tempdigits#1% for testing
+\letvalue{digit_c_3}\thinspace
+\letvalue{digit_p_3}\normaldigitscommasymbol
+\letvalue{digit_s_3}\thinspace
+
+\letvalue{digit_c_4}\thinspace
+\letvalue{digit_p_4}\normaldigitsperiodsymbol
+\letvalue{digit_s_4}\thinspace
+
+\letvalue{digit_c_5}\thickspace
+\letvalue{digit_p_5}\normaldigitscommasymbol
+\letvalue{digit_s_5}\thickspace
+
+\letvalue{digit_c_6}\thickspace
+\letvalue{digit_p_6}\normaldigitsperiodsymbol
+\letvalue{digit_s_6}\thickspace
+
+\def\digitscommasymbol {\csname digit_c_\number\c_digits_method\endcsname}
+\def\digitsperiodsymbol {\csname digit_p_\number\c_digits_method\endcsname}
+\def\digitsseparatorspace {\csname digit_s_\number\c_digits_method\endcsname}
+
+\def\digitsfinalcomma {\digitscommasymbol } % more for tracing
+\def\digitsfinalperiod {\digitsperiodsymbol} % more for tracing
+\def\digitsintermediatecomma {\digitscommasymbol } % more for tracing
+\def\digitsintermediateperiod {\digitsperiodsymbol} % more for tracing
+
+%D The user macro:
+
+\unexpanded\def\digits_indeed#1%
{\dontleavehmode
\begingroup
- \setfalse\c_digits_seen
- \ifcase\c_digits_mode
- % keep as-is
- \or
- \let\digitscommasymbol \normaldigitsperiodsymbol
- \let\digitsperiodsymbol \normaldigitscommasymbol
- \or
- \let\digitscommasymbol \normaldigitscommasymbol
- \let\digitsperiodsymbol \normaldigitsperiodsymbol
- \or
- \let\digitsperiodsymbol \thinspace
- \let\digitscommasymbol \normaldigitscommasymbol
- \let\digitsseparatorspace\thinspace
- \or
- \let\digitsperiodsymbol \thinspace
- \let\digitscommasymbol \normaldigitsperiodsymbol
- \let\digitsseparatorspace\thinspace
- \or
- \let\digitsperiodsymbol \thickspace
- \let\digitscommasymbol \normaldigitscommasymbol
- \let\digitsseparatorspace\thickspace
- \or
- \let\digitsperiodsymbol \thickspace
- \let\digitscommasymbol \normaldigitsperiodsymbol
- \let\digitsseparatorspace\thickspace
- \fi
- \ctxcommand{digits(\!!bs\detokenize{#1}\!!es)}%
+ \ctxcommand{digits(\!!bs\detokenize{#1}\!!es,"\ifcase\c_digits_order \v!normal\else\v!reverse\fi")}%
\endgroup
\settrue\c_units_dospace}
@@ -227,10 +232,10 @@
{\doifnextbgroupelse\digits_argument\digits_spaced}
\def\digits_argument#1%
- {\tempdigits{#1}}
+ {\digits_indeed{#1}}
-\def\digits_spaced#1 %
- {\tempdigits{#1}}
+\def\digits_spaced#1 % space delimited
+ {\digits_indeed{#1}}
%D \macros
%D {unit}
@@ -282,6 +287,46 @@
%D
%D Depending on needs we can add more tweaks (also depends on to what
%D extent we need to be compatible with \MKII.
+%D
+%D Formatting is supported too:
+%D
+%D \startbuffer
+%D \starttabulate[|l|l|l|]
+%D \HL
+%D \NC \unit{10 kilo gram} \NC \digits{10} \NC \unit{10} \NC \NR
+%D \NC \unit{1 kilogram} \NC \digits{1} \NC \unit{1} \NC \NR
+%D \NC \unit{0.1 kilogram} \NC \digits{0.1} \NC \unit{0.1} \NC \NR
+%D \NC \unit{1.1 kilogram} \NC \digits{1.1} \NC \unit{1.1} \NC \NR
+%D \NC \unit{11 kilogram} \NC \digits{11} \NC \unit{11} \NC \NR
+%D \HL
+%D \NC \unit{00,000.10 kilogram} \NC \digits{00,000.10} \NC \unit{00,000.10} \NC \NR
+%D \NC \unit{@@,@@0.10 kilogram} \NC \digits{@@,@@0.10} \NC \unit{@@,@@0.10} \NC \NR
+%D \NC \unit{__,___.10 kilogram} \NC \digits{__,___.10} \NC \unit{__,___.10} \NC \NR
+%D \NC \unit{__,__0:10 kilogram} \NC \digits{__,__0:10} \NC \unit{__,__0:10} \NC \NR
+%D \NC \unit{__,___:10 kilogram} \NC \digits{__,___:10} \NC \unit{__,___:10} \NC \NR
+%D \HL
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Punctuation can be configures usiing \type {method}:
+%D
+%D \startbuffer
+%D \starttabulate[|l|l|l|]
+%D \HL
+%D \NC \NC \setupunits[method=0]\unit{00,000.10 kilogram} \NC \setupunits[method=0]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 1 \NC \setupunits[method=1]\unit{00,000.10 kilogram} \NC \setupunits[method=1]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 2 \NC \setupunits[method=2]\unit{00,000.10 kilogram} \NC \setupunits[method=2]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 3 \NC \setupunits[method=3]\unit{00,000.10 kilogram} \NC \setupunits[method=3]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 4 \NC \setupunits[method=4]\unit{00,000.10 kilogram} \NC \setupunits[method=4]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 5 \NC \setupunits[method=5]\unit{00,000.10 kilogram} \NC \setupunits[method=5]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \NC 6 \NC \setupunits[method=6]\unit{00,000.10 kilogram} \NC \setupunits[method=6]\unit{@@,@@0.10 kilogram} \NC \NR
+%D \HL
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
% only a space when a number is part of the unit
@@ -291,6 +336,8 @@
[\c!alternative=, % done: text
\c!separator=\v!normal, % done: cdot|big|medium|space
\c!label=, % done: (no interface yet)
+ \c!order=\v!normal, % ,. (reverse: .,)
+ \c!method=0,
%\c!grid=\v!yes, % (maybe)
%\c!style=..., % done
%\c!color=..., % done
@@ -341,6 +388,8 @@
\settrue\c_units_dospace
\removelastskip
\fi
+ \c_digits_method\unitsparameter\c!method\relax
+ \ifmmode\else\dontleavehmode\fi
\edef\currentunits{#1}%
\the\everyunits
%\removeunwantedspaces % now ok yet
@@ -399,7 +448,7 @@
\let\units_direct\units_direct_nested
\to \everyunits
-\unexpanded\def\units_indeed#1{\ctxcommand{unit(\!!bs\detokenize{#1}\!!es,"\unitsparameter\c!label")}}
+\unexpanded\def\units_indeed#1{\ctxcommand{unit(\!!bs\detokenize{#1}\!!es,"\unitsparameter\c!label","\unitsparameter\c!order")}}
\unexpanded\def\unitsPUS#1#2#3{\units_next#1#2\unitsraise{#3}\c_units_state\plusone} % suffix
\unexpanded\def\unitsPU #1#2{\units_next#1#2\c_units_state \plusthree} % unit