summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/midnight/dolines.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/midnight/dolines.tex')
-rw-r--r--Master/texmf-dist/tex/generic/midnight/dolines.tex180
1 files changed, 180 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/midnight/dolines.tex b/Master/texmf-dist/tex/generic/midnight/dolines.tex
new file mode 100644
index 00000000000..1147fe92752
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/midnight/dolines.tex
@@ -0,0 +1,180 @@
+\ifx\DOLINES\relax\endinput\else\let\DOLINES=\relax\fi % \input only once
+%
+% dolines.tex: Meta-macros to separate arguments by newlines and by
+% empty lines.
+% version: 1.0 release: 15 April 1991
+%
+% copyright (c) 1991 Marcel R. van der Goot
+% You can use these macros to typeset documents. You may
+% distribute this file freely, provided that you also distribute
+% the accompanying documentation.
+% You may make changes to this file, or extract portions
+% of it for inclusion in other files, provided that
+% (1) you change the name of the file;
+% (2) you give proper credit and include copyright
+% information where applicable;
+% (3) explain how an unchanged version can be obtained; and
+% (4) document the usage of your macros/changes (if usage
+% of your macros is not worth documenting, they must not
+% be worth using).
+% You are not allowed to use the name ``Midnight Macros'' for
+% any changed files.
+% The above rules for making changes do not apply where it
+% is explicitly noted in this file that something can be changed
+% to conform to your local installation.
+%
+% USAGE:
+% See the file dolines.doc
+% You need Midnight/loop.tex to use these macros.
+%
+% original: csvax.cs.caltech.edu [131.215.131.131] in pub/tex
+% (use anonymous ftp). Also in various archives.
+%
+% Caltech, Pasadena --- Marcel van der Goot
+% marcel@cs.caltech.edu
+% Caltech 256--80
+% Pasadena, CA 91125
+% USA
+% (818) 356--4603
+%
+
+% update history:
+% version 1.0: This one.
+% release 15 April 1991: This one.
+% release 8 February 1991: Used \next instead of \do_next, which
+% occasionally conflicted with use of \next in other macros.
+
+%%%%%% CODE: (you don't need to read this to use the macros)
+
+\input loop % CHANGE this filename to correspond to your installation
+
+%%%%%%% Reading from a different file
+% This is relatively simple, it can be done with a loop. The read function
+% reads a single line (that is what \read does). A file that is being
+% \read always ends with an empty line, therefore no test for eof(lines_in)
+% is needed in the inner loop.
+%
+% while (!eof(lines_in))
+% {
+% read(lines_in, _ln);
+% if (_ln != empty_ln)
+% {
+% beforelines();
+% do { everyline(_ln);
+% read(lines_in, _ln);
+% } while (_ln != empty_ln);
+% afterlines();
+% }
+% }
+%
+
+{\catcode`\^^M=12 \endlinechar=-1 % 12 = other
+\catcode`\_=11 % 11 = letter (used to make macros private)
+
+\newread\lines_in
+
+\globaldefs=1
+
+\def\empty_ln{\par}
+
+\def\filedolines#1%
+ {{\openin\lines_in=#1 %
+ \ifeof\lines_in\message{File #1 not found.}\fi
+ \Loop\ifeof\lines_in \Break1 \fi
+ \read\lines_in to\_ln
+ \ifx\_ln\empty_ln
+ \else {\beforelines
+ \Loop\everyline{\_ln}%
+ \read\lines_in to\_ln
+ \ifx\_ln\empty_ln \Break1 \fi
+ \Pool
+ \afterlines
+ }%
+ \fi
+ \Pool
+ \closein\lines_in
+ }}
+
+} % restore \catcode`\^^M, \catcode`\_, etc.
+
+
+%%%%%%% Reading from the current file
+% This is more complicated. The problem is that a line can only be
+% read at the end of a macro, because otherwise a part of the macro
+% itself will be read. Therefore, the above solution with \Loop cannot
+% be used. Instead, this is implemented as a finite state machine. The
+% FSM has two major states, outer_loop and inner_loop, corresponding to the
+% program above. In these states, the value of _ln is used to determine
+% what actions to take, and what the next state is. The next state
+% is indicated by the control-sequence \do_next.
+% There are two minor states, get_out and get_in. In each of them
+% the next line is read into _ln. After get_out, the next state is always
+% outer_loop; after get_in it is always inner_loop.
+% Here is a ``picure.'' `(...)' is a state, `...?' denotes the value
+% of _ln, and other texts are actions. ctrl-M stands for an empty line.
+%
+% /---<----\
+% (get_out) |
+% \ ctrl-M?
+% begindolines V /
+% \->bgroup -> (get_out) -> (outer_loop) -> enddolines? -> egroup
+% ^ | ^ \-> (finish)
+% / | \
+% afterlines --/ other? \-- afterlines
+% ^ V ^
+% | beforelines |
+% ctrl-M? <--\ | /--> enddolines?
+% \ V /
+% (inner_loop)
+% / ^
+% other? \
+% | (get_in)
+% V |
+% \-everyline->/
+%
+
+
+{\catcode`\^^M=12 \endlinechar=-1 % 12 = other
+\catcode`\_=11 % 11 = letter (used to make macros private)
+\globaldefs=1
+
+
+\long\def\get_out#1^^M% here a line is read (as #1)
+ {\gdef\_ln{#1}%
+ \outer_loop
+ }
+
+\long\def\get_in#1^^M% here a line is read (as #1)
+ {\gdef\_ln{#1}%
+ \inner_loop
+ }
+
+\def\outer_loop
+ {\ifx\_ln\enddolines \egroup\let\do_next=\finishdolines
+ \else\ifx\_ln\empty \let\do_next=\get_out
+ \else \beforelines\let\do_next=\inner_loop
+ \fi \fi
+ \do_next
+ }
+
+\def\inner_loop
+ {\ifx\_ln\enddolines \afterlines\let\do_next=\outer_loop
+ \else\ifx\_ln\empty \afterlines\let\do_next=\outer_loop
+ \else \everyline\_ln\let\do_next=\get_in
+ \fi \fi
+ \do_next
+ }
+
+\def\begindolines
+ {\bgroup
+ \catcode`\^^M=12 %
+ \get_out
+ }
+
+} % restore \catcode`\^^M, \catcode`\_, etc.
+
+% We define \finishdolines and \enddolines, in case someone forgets:
+
+\let\finishdolines=\relax
+\def\enddolines{\enddolines}
+