summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty')
-rw-r--r--macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty95
1 files changed, 95 insertions, 0 deletions
diff --git a/macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty b/macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty
new file mode 100644
index 0000000000..291b343baa
--- /dev/null
+++ b/macros/latex/contrib/lisp-on-tex/lisp-mod-fpnum.sty
@@ -0,0 +1,95 @@
+%%% module name :: fpnum
+
+% regist type and gc
+\ifx\@defined@additional@type\@empty
+ \def\@defined@additional@type{fpnum}%
+\else
+ \edef\@defined@additional@type{\@defined@additional@type,fpnum}%
+\fi
+\let\@lisp@gc@trace@fpnum\@gobble
+
+\def\@mod@read@fpnum#1#2{\gdef#1{\@tlabel@fpnum{#2}}}
+\def\@tlabel@fpnum{\@eval@fpnum\@apply@fpnum\@@apply@fpnum}
+
+\def\@eval@fpnum#1#2#3{\gdef#3{\@tlabel@fpnum{#1}}} % #1 contents, #2 environment, #3 register
+\def\@apply@fpnum{\errmessage{LISP on TeX [internal apply, module fpnum] cannot apply}}
+\def\@@apply@fpnum{\errmessage{LISP on TeX [function --- apply, module fpnum] cannot apply}}
+
+\newdimen\@tempdimeni
+\newdimen\@tempdimenii
+
+\@lisp@env@add@global\fpnumTOstring{\@tlabel@func{\@lisp@func@check@args{1}{\@mod@fpnum@tostring}}}
+%TODO: error handling
+\def\@mod@fpnum@tostring#1\@tlabel@fpnum#2{\gdef#1{\@tlabel@string{#2}}}
+
+\@lisp@env@add@global\fpplus{\@tlabel@func{\@lisp@func@check@args{*}{\@tempdimeni0pt\relax\@mod@fpnum@plus}}}
+%TODO: error handling
+\def\@mod@fpnum@plus#1#2#3{%
+ \ifx#2\relax
+ \let\@next@fpnum@plus\@@fin@fpnum@plus
+ \else\ifx#2\@tlabel@fpnum
+ \advance\@tempdimeni#3pt\relax
+ \let\@next@fpnum@plus\@mod@fpnum@plus
+ \else
+ \errmessage{LISP on TeX [fpnum --- plus]: Invalid argument}%
+ \fi\fi\@next@fpnum@plus#1}
+\def\@@fin@fpnum@plus#1{\xdef#1{\noexpand\@tlabel@fpnum{\strip@pt\@tempdimeni}}}
+
+\@lisp@env@add@global\fpmul{\@tlabel@func{\@lisp@func@check@args{*}{\@tempdimeni1pt\relax\@mod@fpnum@mul}}}
+%TODO: error handling
+\def\@mod@fpnum@mul#1#2#3{%
+ \ifx#2\relax
+ \let\@next@fpnum@mul\@@fin@fpnum@mul
+ \else\ifx#2\@tlabel@fpnum
+ \@tempdimeni#3\@tempdimeni
+ \let\@next@fpnum@mul\@mod@fpnum@mul
+ \else
+ \errmessage{LISP on TeX [fpnum --- mul]: Invalid argument}%
+ \fi\fi\@next@fpnum@mul#1}
+\def\@@fin@fpnum@mul#1{\xdef#1{\noexpand\@tlabel@fpnum{\strip@pt\@tempdimeni}}}
+
+\@lisp@env@add@global\fpminus{\@tlabel@func{\@lisp@func@check@args{+}{\@mod@fpnum@minus}}}
+\def\@mod@fpnum@minus#1#2#3#4#5{%
+ \ifx#4\relax
+ \ifx#2\@tlabel@fpnum
+ \@tempdimenii#3pt
+ \@tempdimeni0pt
+ \advance\@tempdimeni-\@tempdimenii
+ \let\@next@fpnum@minus\@@fin@fpnum@minus
+ \else
+ \errmessage{LISP on TeX [fpnum --- minus]: Invalid argument}%
+ \fi
+ \else\ifx#4\@tlabel@fpnum
+ \ifx#2\@tlabel@fpnum
+ \@tempdimeni#3pt
+ \let\@next@fpnum@minus\@@next@fpnum@minus
+ \else
+ \errmessage{LISP on TeX [fpnum --- minus]: Invalid argument}%
+ \fi
+ \else
+ \errmessage{LISP on TeX [fpnum --- minus]: Invalid argument}%
+ \fi\fi
+ \@next@fpnum@minus#1#4{#5}}
+\def\@@fin@fpnum@minus#1{\xdef#1{\noexpand\@tlabel@fpnum{\strip@pt\@tempdimeni}}}
+\def\@@next@fpnum@minus#1#2#3{%
+ \ifx#2\relax
+ \let\@next@fpnum@minus\@@fin@fpnum@minus
+ \else\ifx#2\@tlabel@fpnum
+ \@tempdimenii#3pt
+ \advance\@tempdimeni-\@tempdimenii
+ \let\@next@fpnum@minus\@@next@fpnum@minus
+ \else
+ \errmessage{LISP on TeX [fpnum --- minus]: Invalid argument}%
+ \fi\fi
+ \@next@fpnum@minus#1}
+
+\@lisp@env@add@global\fplt{\@tlabel@func{\@lisp@func@check@args{2}{\@mod@fpnum@lt}}}
+\def\@mod@fpnum@lt#1\@tlabel@fpnum#2\@tlabel@fpnum#3{%
+ \ifdim#2pt<#3pt
+ \gdef#1{\@tlabel@bool{t}}%
+ \else
+ \gdef#1{\@tlabel@bool{f}}%
+ \fi
+}
+
+