diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/midnight/styledef.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/midnight/styledef.tex | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/midnight/styledef.tex b/Master/texmf-dist/tex/generic/midnight/styledef.tex new file mode 100644 index 00000000000..0bb95cbc27d --- /dev/null +++ b/Master/texmf-dist/tex/generic/midnight/styledef.tex @@ -0,0 +1,208 @@ +\ifx\STYLEDEF\relax\endinput\else\let\STYLEDEF=\relax\fi % \input only once +% +% styledef.tex: Macros to selectively input parts of a file. +% version: 1.0 release: 16 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 styledef.doc. +% You need Midnight/dolines.tex and 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 16 April 1991: the original (this one) +% + +%%%%%% CODE: (you don't need to read this to use the macros) + +\edef\next{\the\catcode`\_} % to remember that catcode +\catcode`\_=11 % 11=letter (for private macros) + +%%%%%%%%%%%%%%%%%%%% the current style list +% A style list is represented by a token register. The register is either +% empty or contains a sequence of words separated by single commas (no spaces). +% A non-empty list starts with a comma. A list denotation is a list of words +% separated by commas and spaces. +% \setstyle#1#2. makes style list reg #1 equal to #2 (a list denotation), +% \addstyle#1#2. adds the list #2 to the list register #1. + +\let\newstyle=\newtoks + +\def\setstyle#1#2% #1 a token reg, #2 a list denotation + {#1={}% + \make_stylelist#1#2 .% space before the dot + } + +\def\addstyle#1#2% #1 a token reg, #2 a list denotation + {\make_stylelist#1#2 .% space before the dot + } + +%%%%%%%%%%%%%%%%%%%% reading a style list denotation +% \make_stylelist takes as first argument the name of a token register. +% Following that name there should be a list of words separated by spaces +% and/or commas, terminated by ` .' (a space and a dot). It constructs +% the corresponding style list in #1. +% \make_stylelist takes the sequence up till the first space, calls +% \nocomma_stylelist with that sequence, and recurses with the sequence after +% the first space. \nocomma_stylelist works similarly, but strips a comma +% rather than a space. (Note: separation by single commas without spaces +% is slightly more efficient.) + +\def\eat_style#1.{} % skip everything till first dot + +\def\make_stylelist#1#2 #3.% #1=name of list; #2#3=list ending in ` .' + {\if.#2.\else\nocomma_stylelist#1#2,.\fi + \if.#3.\let\style_tmp=\eat_style + \else\let\style_tmp=\make_stylelist + \fi + \style_tmp#1#3.% + } + +\def\nocomma_stylelist#1#2,#3.% #1=name of list; #2#3=list ending in `,.' + {\if.#2.\else#1=\expandafter{\the#1,#2}\fi + \if.#3.\let\style_tmp=\eat_style + \else\let\style_tmp=\nocomma_stylelist + \fi + \style_tmp#1#3.% + } + +%%%%%%%%%%%%%%%%%%%% determining whether lists intersect +% \isect_style is used to check whether two lists have a non-empty +% intersection. The switch \if_style will be set to indicate whether +% the lists intersect. +% \style_member takes two arguments, a style list register and a word. +% It sets the switch if the word is in the style list. This check is done +% by TeX's pattern match mechanism rather than through word-by-word comparison: +% To check for the presence of word `xyz' a macro `\style_tmp#1,xyz,#2.' is +% defined. If it is called as `\style_tmp<list>,xyz,.' where <list> is the +% contents of the style list, then #2 will not be empty if and only if the +% pattern `,xyz,' is part of <list>, i.e., iff `xyz' is in the list. +% \doisect_style calls \style_member repeatedly for each word in the second +% list. + +\newif\if_style + +\def\style_member#1#2% #1 a style list (token reg), #2 a word + {\def\style_tmp##1,#2,##2.{\check_style{##2}}% + \expandafter\style_tmp\the#1,#2,.% + } + +\def\check_style#1% check whether #1 is empty + {\if.#1.\else\_styletrue\fi + } + +\def\doisect_style#1,#2,#3.% #1=reg, #2#3=expansion of list reg ending in ,. + {\if.#2.\else\style_member#1{#2}\fi + \if_style\let\style_tmp=\eat_style + \else\if.#3.\let\style_tmp=\eat_style + \else\let\style_tmp=\doisect_style + \fi \fi + \style_tmp#1,#3.% + } + +\def\isect_style#1#2% two list regs + {\_stylefalse + \expandafter\doisect_style\expandafter#1\the#2,,.% extra comma for #2={} + } + +%%%%%%%%%%%%%%%%%%%% including a style +% \readstyle takes a style list register and a filename. It puts the style list +% in \style_list, then inputs the file. +% \skip_style skips everything till the next \endstyle. It uses +% dolines.tex to read the input line-by-line. To make that possible, +% the grouping characters are disabled (because they must balance on a line), +% the comment char is disabled (because it causes wraparound), the argument +% character is disabled (because a macro is defined that has the line as +% body --- it should not have undeclared arguments in the body), and the +% escape character is disabled (not to prevent expansion, but to prevent lines +% containing an `outer' control sequence). Note: If you wanted a real +% ``comment environment,'' you should set all catcodes of all characters to +% 11 or 12. +% \styledef and \negstyledef have list denotations as arguments. They create +% a list \style_other, then skip based on the intersection of \style_other +% and \style_list. If no skip is done, \endstyle is equivalent to \relax. +% \savereadstyle and \setreadstyle serve to access the protected \style_list +% register. + +\input dolines + +\newtoks\style_list +\newtoks\style_other + +\def\readstyle#1#2% #1 a token reg, #2 a filename + {\style_list=#1% + \input#2 % significant space (sometimes) + } + +\def\savereadstyle#1% a style (token) reg + {#1=\style_list} + +\def\setreadstyle#1% a style reg + {\style_list=#1} + +{\catcode`\/=0 /catcode`/\=12 % see dolines.doc + /gdef/end_style{\endstyle} +} + +\let\endstyle=\relax + +\def\skip_style + {\begingroup + \let\beforelines=\relax + \let\afterlines=\relax + \def\everyline##1{}% + \let\enddolines=\end_style + \let\finishdolines=\endgroup + \catcode`\{=12 \catcode`\}=12 \catcode`\%=12 + \catcode`\#=12 \catcode`\\=12 + \begindolines + } + +\def\styledef#1% #1 a list denotation + {\style_other={}% + \make_stylelist\style_other#1 .% space before dot + \isect_style\style_list\style_other + \if_style + \else\expandafter\skip_style + \fi + } + +\def\negstyledef#1% #1 a list denotation + {\style_other={}% + \make_stylelist\style_other#1 .% space before dot + \isect_style\style_list\style_other + \if_style\expandafter\skip_style\fi + } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\catcode`\_=\next |