summaryrefslogtreecommitdiff
path: root/macros/generic/midnight/loop.doc
blob: ecd37bcd6a7a6303d2b6d73406abfd7115bf55c6 (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
139
140
141
142
143
144
% loop.doc  --- version 1.0 (15 April 1991)
% This is the documentation for loop.tex.
% To read this file, process it with (plain) TeX: tex loop.doc
% (To do that, you need manmac.tex, which has
% the macros for typesetting the TeXbook, as explained in appendix E.
% It comes free with the standard distribution of TeX.)
%
% NOTE: Processing this file with TeX will create empty files
%       index.tex and answers.tex in your directory. And if you
%	have a file pages.tex in your directory, TeX will probably
%	get very confused.
%	The manmac format will try to load a font called cmman; if
%	TeX complains that it cannot find that font you can savely
%	ignore that, since the font is not actually used.
%
% This file: copyright (c) 1991  Marcel van der Goot.
%	You may redistribute this file and printed versions of it.
%
% original: csvax.cs.caltech.edu [131.215.131.131] in pub/tex
%           (use anonymous ftp). Also in various archives.
%
% Marcel van der Goot
% marcel@cs.caltech.edu
%   Caltech 256--80
%   Pasadena, CA 91125
%   (818) 356--4603

% ------ definitions for manual pages:
% The documentation is typeset using Knuth's ``manmac'' macros, with a
% few additional things defined here. You are free to use or adapt these
% extra definitions.

\input manmac % the macros used for typesetting The TeXbook (appendix E)
\catcode`^=7 % manmac makes ^ active for creating an index
	% we don't make an index, and we need ^ to be non-active

{\catcode`\^^M=12 \endlinechar=-1 % 12 = other
\long\gdef\manpagehead#1^^M#2^^M#3^^M^^M% tex-file, description, version
   {\egroup % matches \bgroup in \manpage
    \par\vfill\eject
    \edef\rhead{\manualname: #1\unskip}%
    \setbox1=\hbox{\titlefont #1\quad}%
    \setbox3=\vtop{\advance\hsize by-\wd1 \parindent=0pt \raggedright
		   #2\par
		   #3\par
		   \cnotice
		  }%
    \line{\box1\box3}%
    \bigskip\bigskip\bigskip\noindent
   }%
} % restore \catcode`\^^M

\outer\def\manpage
   {\bgroup\catcode`\^^M=12
    \manpagehead
   }

\hsize=6.5in\vsize=8.9in % default plain TeX values
\pagewidth=\hsize \pageheight=\vsize

\def\cnotice{Copyright \copyright\ 1991 Marcel R. van der Goot}
\def\manualname{Midnight Macros}

% LaTeX logo, from latex.tex (except for the capital `A': manmac
% doesn't have a real smallcaps font)
\def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\sc A}\kern-.15em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}

\tenpoint

% (end of extra definitions)

% -------------------- loop.doc:

\pageno=8 % follows gloss.doc

\manpage loop.tex
A simple looping construct (meta-macros).
Version: 1.0 (15 April 1991) (doc: 15 Apr 1991)

The macros in loop.tex are intended to help you write your own
macros, rather than to typeset text directly. Consequently, it is
assumed that you have some experience writing macros; In other words,
assume that this whole section is preceded by a ``dangerous bend'' symbol.
These macros are kept
simple and are not very robust: if you decide
to use them in a different way than described below you are
entirely responsible for what happens\footnote{$^1$}{Not that the
author assumes any responsibility even if you {\sl do\/}
obey the rules.}.

Loop.tex defines an alternative to plain \TeX's |\loop| construct.
(It can also be used with, e.g., \LaTeX.)
Plain \TeX's |\loop| is often awkward to use because of the
limited form of tests in \TeX. The new construct tries to alleviate
this problem by allowing a more flexible use of tests in the loop.
To execute a loop, you say |\Loop ... \Pool|\footnote{$^2$}{We use
initial capital letters to prevent confusion with plain \TeX's |\loop|.
Although you don't need |\loop| anymore, there may still be macros
that depend on it (e.g., plain \TeX's tabbing macros).}.
This will normally
execute the loop `body', i.e., the commands corresponding to the dots,
infinitely many times.
There are two special commands you can use within the loop,
|\Break| and |\Continue|. When a |\Break| command is
executed, the rest of the body is ignored, and the loop is terminated.
Execution of a |\Continue| command also causes the rest of the body
to be ignored, but then the loop is started again from the beginning.

Both |\Break| and |\Continue| must be followed by a number. This
number should be the number of |\if...| constructs that are terminated
by the command. In other words, it is the number of |\fi|'s that
has to be `executed' to get proper balancing of all |\if...| tests.
It is somewhat unfortunate that this number has to be supplied,
but there seems to be no way to close all |\if...| tests automatically.
Here is an example similar to one from the \TeX book.
\begintt
\def\yes{Yes } \def\no{No }
\Loop\message{Are you happy? }
     \read-1 to\answer
     \ifx\answer\yes \Break1
     \else\ifx\answer\no \Continue2
     \fi  \fi
     \message{(Please type Yes or No.)}
\Pool
\endtt
At the position of |\Break| the nesting level of |\if...| tests
is 1, at the position of |\Continue| the level is 2.
If you forget the number you will (usually) get a `|missing number|' error
message, but possibly at an unexpected point in the program. The
wrong number typically results in either an `|Extra \fi|' or
an `|\if... was incomplete|' message.

There can be any number of |\Break| and |\Continue| commands in
a loop, although it is wise to have at least one |\Break| command.
The text following any of these commands up till the |\Pool| at the
end of the loop must have balanced braces, and the loop body itself
must also have balanced braces. If this causes a problem, you
can use |\bgroup| and |\egroup| instead of |{| and |}|. If you
want to nest two loops, you will have to enclose the inner loop within
a group. (Incidentally, these restrictions on balancing braces and
nesting loops also apply to plain \TeX's |\loop| construct.)

\bye