summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/ifis-macros/ifis-macros-doc.tex
blob: a5b3c21942f676f8606c3742edb0441efad7d618 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
% This file is part of the CTAN package named isIntDim.
% 
%   info.tex: instructions for two macro packages: ifisinteger.tex
%             and ifisdimension.tex
%
%   Copyright (C) 2024  Udo Wermuth (author)
%
%   This program is free software: you can redistribute it and/or modify
%   it under the terms of the GNU General Public License as published by
%   the Free Software Foundation, either version 3 of the License, or
%   (at your option) any later version.
%
%   This program is distributed in the hope that it will be useful,
%   but WITHOUT ANY WARRANTY; without even the implied warranty of
%   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%   GNU General Public License for more details.
%
%   You should have received a copy of the GNU General Public License
%   along with this program.  If not, see <http://www.gnu.org/licenses/>.

% %%%
% %%% verbatim macros (from manmac.tex)
% %%%
\newskip\ttglue {\tt\global\ttglue=0.5em plus 0.25em minus 0.15em }
\def\ttverbatim{\begingroup \frenchspacing
  \catcode`\\=12 \catcode`\{=12 \catcode`\}=12 \catcode`\$=12 \catcode`\&=12
  \catcode`\#=12 \catcode`\%=12 \catcode`\~=12 \catcode`\_=12 \catcode`\^=12
  \obeyspaces \obeylines \tt}
\def\verbatimspace{\ifvmode\indent\fi\space}
{\obeyspaces \gdef\makespaceverbspace{\def {\verbatimspace}}}
\outer\def\verbatim{$$\ifdim\parskip>0pt
    \abovedisplayskip=\parskip \abovedisplayshortskip=\parskip
    \belowdisplayskip=\parskip \belowdisplayshortskip=\parskip
  \else
    \abovedisplayskip=3pt \abovedisplayshortskip=3pt
    \belowdisplayskip=3pt \belowdisplayshortskip=3pt
  \fi
  \let\par=\endgraf \ttverbatim \makespaceverbspace \parskip=0pt
  \catcode`\§=0 \advance\leftskip by 10pt \ttfinish}
{\catcode`\§=0 §catcode`§\=12 % § is temporary escape character
  §obeylines % end of line is active
  §gdef§ttfinish#1^^M#2\endverbatim{§vbox{#2}§endgroup$$}}
\catcode`\|=\active
{\obeylines \gdef|{\ttverbatim \spaceskip\ttglue \let^^M=\  \let|=\endgroup}}

\def\noitem{\item{\phantom{0.}}}

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\font\titlefont=cmssdc10 at 36pt
\font\subtitlefont=cmssdc10 at 17pt
%
\centerline{\titlefont ifis-macros}
\bigskip
\centerline{\subtitlefont Version 1.0, 7.04.2024}
\bigskip
\centerline{Macros for plain \TeX}
\medskip
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\noindent
There are two main macros in the files {\tt ifisinteger.tex} and {\tt
ifisdimension.tex}. The macro |\ifisint| tests if a given input string
represents a number for \TeX. The macro |\ifisdim| does this for
dimensions.

Both macros generate errors but hide them from the terminal as they
work in |\batchmode|. There is one configuration parameter:
|\IIcurrentmode|. The default is |\errorstopmode|. Change this if you
call the macros in a different interaction mode so that they can
return to this mode.

\bigskip

\beginsection 0.\ Installation

To use the macro |\ifisint| load via |\input ifisinteger.tex| the file
that contains the code. For |\ifisdim| use |\input ifisdimension.tex|.

\bigskip

\beginsection 1.\ File {\tt ifisinteger.tex}

The main macro is called |\ifisint| and must be used like an
|\if|-conditional except that its argument is delimited by |\Boolend|:
|\ifisint <argument>\Boolend <true branch>\else <false branch>\fi|.

\medskip

The implemented algorithm has four steps:
\smallskip
\item{1.}1)~Remove signs with or without braces; add sentinel |W|.
\noitem  2)~Test that the input isn't now |"W|, etc.; otherwise
         return false.
\item{2.}Create a canonical form with a leading zero.
\item{3.}1)~Assign the input to a |\count| register inside an
         |\hbox|.
\noitem  2)~Test that the box width is the width of the sentinel.
\noitem  3)~Otherwise return false.
\item{4.}1)~Return true if the number isn't \TeX's maximum.
\noitem  2)~Otherwise test if the canonical form is \TeX's maximum.
         If yes, return true.
\noitem  3)~Otherwise return false.
\medskip

For more details see my article in TUGboat {\bf45}:1 (2024), 106--109.

\bigskip

\beginsection 2.\ File {\tt ifisdimension.tex}

The main macro is called |\ifisdim| and must be used like an
|\if|-conditional except that its argument is delimited by |\Boolend|:
|\ifisdim <argument>\Boolend <true branch>\else <false branch>\fi|.

\medskip

The implemented algorithm has four steps:
\smallskip
\item{1.}1)~Remove signs with or without braces; add sentinel |mm|.
\noitem  2)~Exclude trivial non-numerics as done in |\ifisint|.
\noitem  3)~Otherwise return false.
\item{2.}1)~Get the integer part.
\noitem  2)~Get fraction and the unit.
\noitem  3)~Get the width of the unit.
\item{3.}1)~Assign the input to a |\dimen| register inside an
         |\hbox|.
\noitem  2)~Test that the box width is the width of the sentinel.
\noitem  3)~Otherwise return false.
\item{4.}1)~Return true if the dimension isn't \TeX's |\maxdimen|.
\noitem  2)~Otherwise test if the coerced sum of the integer part
         and the fraction expressed in the unit |sp| is |\maxdimen|.
\noitem  3)~If no, return false.
\noitem  4)~Otherwise return true.
\medskip

For more details see my article in TUGboat {\bf45}:1 (2024), 109--112.

\bye