summaryrefslogtreecommitdiff
path: root/tex/context/base/spac-cha.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/spac-cha.mkiv')
-rw-r--r--tex/context/base/spac-cha.mkiv191
1 files changed, 191 insertions, 0 deletions
diff --git a/tex/context/base/spac-cha.mkiv b/tex/context/base/spac-cha.mkiv
new file mode 100644
index 000000000..a07c8f198
--- /dev/null
+++ b/tex/context/base/spac-cha.mkiv
@@ -0,0 +1,191 @@
+%D \module
+%D [ file=spac-cha, % was supp-ali,
+%D version=2012.06.08, % 2000.04.17,
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Character Alignment,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Yet undocumented but nevertheless used.
+
+% 0 = centered
+% 1 = left in before
+% 2 = right in before
+% 3 = left in after
+% 4 = right in after
+
+\unprotect
+
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10\\ \NG 10\\ \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+% We gain not much by luafication and actually make things worse.
+
+\chardef\characteralignmentmode\plusfour
+\chardef\characteralignmentslot\plusone
+
+\let\afterassignwidth \!!zeropoint
+\let\beforeassignwidth\!!zeropoint
+
+\def\alignmentcharacter{.}
+
+\newdimen\d_supp_charalign_width
+\newtoks \t_supp_charalign_list
+
+\let\alignmentclass\s!default % can be used to handle multiple mixed ones
+
+\installcorenamespace{characteralign}
+
+\unexpanded\def\supp_charalign_push
+ {\ifcsname\??characteralign\alignmentclass\endcsname\else
+ \normalexpanded{\global\t_supp_charalign_list{\the\t_supp_charalign_list\supp_charalign_do{\alignmentclass}}}%
+ \fi
+ \setxvalue{\??characteralign\alignmentclass}{\supp_charalign_do
+ {\afterassignwidth}{\beforeassignwidth}{\alignmentcharacter}}}
+
+\unexpanded\def\supp_charalign_pop_do#1#2#3%
+ {\def\afterassignwidth {#1}%
+ \def\beforeassignwidth {#2}%
+ \def\alignmentcharacter{#3}}
+
+\unexpanded\def\supp_charalign_pop
+ {\let\supp_charalign_do\supp_charalign_pop_do
+ \executeifdefined{\??characteralign\alignmentclass}\donothing}
+
+\unexpanded\def\supp_charalign_reset_do#1%
+ {\global\letbeundefined{\??characteralign#1}} % global !
+
+\unexpanded\def\resetcharacteralign
+ {\let\supp_charalign_do\supp_charalign_reset_do
+ \the\t_supp_charalign_list
+ \global\t_supp_charalign_list\emptytoks}
+
+\unexpanded\def\supp_charalign_firstpass_one#1#2%
+ {\supp_charalign_pop
+ \let\\\empty
+ \setbox\scratchbox\hbox{#1}%
+ \d_supp_charalign_width\wd\scratchbox
+ \setbox\scratchbox\emptyhbox
+ \supp_charalign_check#2#1\relax\relax
+ \scratchdimen-\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces#2\unskip}%
+ \advance\scratchdimen \wd\scratchbox
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \ifdim\scratchdimen=\zeropoint
+ \setbox\scratchbox\hbox{\ignorespaces#2\unskip}%
+ \scratchdimen\wd\scratchbox
+ \ifcase\characteralignmentmode
+ % do nothing
+ \else\ifnum\characteralignmentmode<\plusthree
+ \advance\scratchdimen\d_supp_charalign_width\relax
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \else
+ \ifdim\scratchdimen>\afterassignwidth\relax
+ \edef\afterassignwidth{\the\scratchdimen}%
+ \fi
+ \fi\fi
+ \fi
+ \supp_charalign_push}
+
+\unexpanded\def\supp_charalign_firstpass_two#1#2#3%
+ {\ifx#2\relax
+ \setbox\scratchbox\hbox{\ignorespaces#1\unskip}%
+ \ifdim\wd\scratchbox>\afterassignwidth
+ \edef\afterassignwidth{\the\wd\scratchbox}%
+ \fi
+ \else
+ \supp_charalign_check#2#3\relax\relax
+ \fi}
+
+\unexpanded\def\supp_charalign_secondpass_one#1#2%
+ {\supp_charalign_pop
+ \let\\\empty % beware, no grouping
+ \setbox\scratchbox\hbox{#1}%
+ \d_supp_charalign_width\wd\scratchbox
+ \setbox\scratchbox\emptyhbox
+ % new 12,34 vs 10\\ where 10 aligns on 12 if #1 = ,
+ \ifcase\characteralignmentslot
+ \supp_charalign_check#2#1\relax\relax
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \else
+ \def\\{#1}%
+ \normalexpanded{\supp_charalign_check#2#1\relax\relax}%
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\def\\{\hphantom{#1}}\ignorespaces#2\unskip}%
+ \fi
+ \noindent
+ \ifdim\scratchdimen=\wd\scratchbox
+ \ifcase\characteralignmentmode
+ \box\scratchbox
+ \else
+ \hbox
+ {\dontcomplain
+ \hbox to \beforeassignwidth
+ {\ifcase\characteralignmentmode\or
+ \box\scratchbox\hss
+ \or
+ \hss\box\scratchbox\hskip\d_supp_charalign_width
+ \or
+ \hss\rlap{\box\scratchbox}%
+ \or
+ \hss\rlap{\hbox to \afterassignwidth{\hss\box\scratchbox}}%
+ \fi}%
+ \hskip\afterassignwidth}%
+ \fi
+ \else
+ \hbox
+ {\hbox to \beforeassignwidth
+ {\hss\box\scratchbox\hskip-\scratchdimen}%
+ \hskip\afterassignwidth}%
+ \fi}
+
+\unexpanded\def\supp_charalign_secondpass_two#1#2#3%
+ {\ifx#2\relax
+ \setbox\scratchbox\hbox{\ignorespaces#1\unskip}%
+ \else
+ \supp_charalign_check#2#3\relax\relax
+ \fi}
+
+\unexpanded\def\supp_charalign_firstpass#1%
+ {\unexpanded\def\checkalignment ##1{\supp_charalign_firstpass_one{#1}{##1}}%
+ \unexpanded\def\supp_charalign_check##1#1##2##3\relax{\supp_charalign_firstpass_two{##1}{##2}{##3}}}
+
+\unexpanded\def\supp_charalign_secondpass#1%
+ {\unexpanded\def\checkalignment ##1{\supp_charalign_secondpass_one{#1}{##1}}%
+ \unexpanded\def\supp_charalign_check##1#1##2##3\relax{\supp_charalign_secondpass_two{##1}{##2}{##3}}}
+
+\unexpanded\def\setfirstpasscharacteralign
+ {\supp_charalign_pop
+ \normalexpanded{\supp_charalign_firstpass{\alignmentcharacter}}}
+
+\unexpanded\def\setsecondpasscharacteralign
+ {\supp_charalign_pop
+ \normalexpanded{\supp_charalign_secondpass{\alignmentcharacter}}}
+
+\unexpanded\def\startcharacteralign#1\stopcharacteralign
+ {\bgroup
+ \setfirstpasscharacteralign #1%
+ \setsecondpasscharacteralign#1%
+ \egroup}
+
+\let\stopcharacteralign\relax
+
+\protect \endinput