% This file is part of the CTAN package named ifis-macros. % % ifis-macros-doc.tex: instructions for three macro packages: % ifisinteger.tex, ifisdimension.tex, and ifisglue.tex; % and the componentwise test macros in gluecomp.tex: % \ifnatwd, \ifstretch, and \ifshrink % % % Copyright (C) 2024,2025 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 . \outer\def\beginsection#1\par{\vskip 0pt plus 3\baselineskip\penalty-250 \vskip 0pt plus -3\baselineskip\bigskip\vskip\parskip \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent} % %%% % %%% 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 2.0, 25.02.2025} \bigskip \centerline{Macros for plain \TeX\ by Udo Wermuth} \medskip % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \noindent There are three main macros in the files {\tt ifisinteger.tex}, {\tt ifisdimension.tex}, and {\tt ifisglue.tex}. The macro |\ifisint| tests if a given input string represents a number for \TeX. The macro |\ifisdim| does this for dimensions and |\ifisglue| for glue and muglue. All 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. For |\ifisglue| an application is included. The macros |\ifnatwd|, |\ifstretch|, and |\ifshrink| test the corresponding component of two glue or muglue specifications. \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| and for |\ifisglue \input ifisglue.tex|. To use |\ifnatwd|, |\ifstretch|, or |\ifshrink| enter |\input gluecomp.tex|. \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 \Boolend \else \fi|. 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. \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 \Boolend \else \fi|. 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. \beginsection 3. File {\tt ifisglue.tex} The main macro is called |\ifisglue| and must be used like an |\if|-conditional except that its argument is delimited by |\Boolend|: |\ifisglue \Boolend \else \fi|. In contrast to integers and dimensions glue and muglue are specific to \TeX. The macro |\ifisglue| accepts only alphabetic constants without backslashes and shouldn't be used with the double-hat notation involving the hexadecimal digit `f'. I assume no user enters glue specifications with such constructions. The implemented algorithm has four steps: \smallskip \item{1.}Convert the characters of the keywords to lowercase letters; use uppercase for `f'. \item{2.}Split at keywords {\tt minus} and {\tt plus} and store the components in |\II@nw| (natural width), |\II@st| (stretchability), |\II@sh| (shrinkability). \item{3.}1)~Replace in |\II@nw| {\tt mu} by {\tt pt}. \noitem 2)~Replace in |\II@st| {\tt mu}, {\tt Fil}, {\tt Fill}, and {\tt Filll} by {\tt pt}. \noitem 3)~Do 2) for |\II@sh|. \noitem 4)~Count replacements and absences; if the count equals 3, set |\ifIImugluetrue| as the input must be muglue. \item{4.}1)~Check if |\II@nw| is a valid dimension. \noitem 2)~If okay check |\II@st|. \noitem 3)~If okay check |\II@sh|. \noitem 4)~If okay perform the box-width test using |\skip| for glue and |\muskip| for muglue. \noitem 5)~If okay return true; otherwise return false. \medskip For more details see my article in TUGboat {\bf46}:1 (2025), 145--147. \beginsection 4. File {\tt gluecomp.tex} This is an application of |\ifisglue|. It provides three macros |\ifnatwd|, |\ifstretch|, and |\ifshrink| to test individual components of two glue or muglue specifications. They must be used with so-called \TeX\ split glue macros (Tsgm). Usage: |\if \Boolend \else \fi|, where |\if| is one of |\ifnatwd|, |\ifstretch|, or |\ifshrink| and || is one of |<|, |=|, or |>|. First create a Tsgm via |\makeTsgm !|. It defines the || and stores the data of ||. Second test one component of two Tsgms. For example, after |\makeTsgm 3pt plus 1fil!\one| and |\makeTsgm 1pt plus 1.1fil!\two| the test |\ifnatwd\one>\two\Boolend| executes the ||; with the relations |<| and |=| the || is chosen. Similar, |\ifstretch\one<\two\Boolend| and |\ifshrink\one=\two\Boolend| are true and other relations make the comparisons false. \medskip For more details see my article in TUGboat {\bf46}:1 (2025), 147--150. \bye