summaryrefslogtreecommitdiff
path: root/Build/source/texk/detex/detex-2.7
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/detex/detex-2.7')
-rw-r--r--Build/source/texk/detex/detex-2.7/README189
-rw-r--r--Build/source/texk/detex/detex-2.7/detex.h44
-rw-r--r--Build/source/texk/detex/detex-2.7/detex.l740
-rw-r--r--Build/source/texk/detex/detex-2.7/detex.man126
4 files changed, 1099 insertions, 0 deletions
diff --git a/Build/source/texk/detex/detex-2.7/README b/Build/source/texk/detex/detex-2.7/README
new file mode 100644
index 00000000000..59fb6b558c4
--- /dev/null
+++ b/Build/source/texk/detex/detex-2.7/README
@@ -0,0 +1,189 @@
+Detex - Version 2.7
+
+Detex is a program to remove TeX constructs from a text file. It recognizes
+the \input command.
+
+This program assumes it is dealing with LaTeX input if it sees the string
+"\begin{document}" in the text. It recognizes the \include and \includeonly
+commands.
+
+This directory contains the following files:
+
+README - you're looking at it.
+
+Makefile - makefile for generating detex on a 4.2BSD Unix system.
+
+detex.1l - troff source for the detex manual page.
+ Assuming you have the -man macros, use "make man-page" to
+ generate it.
+
+detex.h - Various global definitions. These should be modified to suit
+ the local installation.
+
+detex.l - Lex and C source for the detex program.
+
+lexout.c - C code generated from detex.l using lex on a Sun (SunOS 4.1.1)
+ This can be useful for DOS, OS/2 or systems that don't have
+ lex.
+
+states.sed - sed(1) script to munge the state names in detex.l so that
+ reasonable names can be used in the source without causing
+ lex(1) to overflow.
+
+os2 - subdirectory containing support for compilation on
+ OS/2 and DOS systems
+
+
+Feel free to redistribute this program, but distribute the complete contents
+of this directory. The latest version is available at
+http://www.cs.purdue.edu/homes/trinkle/detex/ Send comments and fixes
+to me via email.
+
+Daniel Trinkle <trinkle@cs.purdue.edu>
+Department of Computer Sciences
+Purdue University
+West Lafayette, IN 47907-1398
+
+April 26, 1986
+
+Modified -- June 4, 1986
+Changed so that it automatically recognizes LaTeX source and ignores several
+environment modes such as array.
+
+
+Modified (Version 2.0) -- June 30, 1984
+Now handles white space in sequences like "\begin { document }". Detex is not
+as easily confused by such things as display mode ends and begins that don't
+match up.
+
+
+Modified -- September 19, 1986
+Added the "-e <environment-list>" option to ignore specified LaTeX
+environments.
+
+
+Modified -- June 30, 1987
+Added the "-n" no-follow option, to allow detex to ignore \input and \include
+commands. Also changed the algorithm for locating the input files. It now
+interprets the "." more reasonably (i.e. it is not always the beginning of an
+extension).
+
+
+Modified -- December 15, 1988
+Added handling of verbatim environment in LaTeX mode and added it to the list
+of modes ignored by default. Because of limitations with lex, it was
+necessary to shorten the names of some of the existing start states before
+adding a new one (ugh).
+
+
+Modified -- January 3, 1988
+Added ignore of \$ inside $$ (math) pair.
+
+
+Modified (Version 2.2) -- June 25, 1990
+Control sequences are no longer replaced by space, but just removed. This
+means accents no longer cause output words to be broken. The "-c" option was
+added to show the arguments of \cite, \ref, and \pageref macros. This is
+useful when using something like style on the output.
+
+
+Modified (Version 2.3) -- September 7, 1990
+Fixed the handling of Ctl mode a little better and added an exception
+for \index on suggestions from kcb@hss.caltech.edu (KC Border). Also
+changed the value for DEFAULTINPUTS to coincide with a local change.
+
+
+Modified -- February 10, 1991
+Added -t option to force TeX mode even when seeing the "\begin{document}"
+string in the input.
+
+
+Modified -- February 23, 1991
+Based on suggestions from pinard@iro.umontreal.ca (Francois Pinard), I
+added support for the SysV string routines (-DUSG), added defines for
+the flex lexical scanner (-DFLEX_SCANNER), changed NULL to '\0' when
+using it as a character (his sys defined NULL as (void *)0), changed
+the Makefile to use ${CC} instead of cc, and added comments about the
+new compile time options.
+
+
+Modified (Version 2.4) -- September 2, 1992
+Corrected the way CITEBEGIN worked. Due to serious braindeath I had
+the condition wrong in the if test. It should be (fLatex && !fCite).
+This solves the problem a couple people reported with amstex style
+\ref entries.
+
+Added a preprocessing sed(1) command to replace all the long, easy to
+read state names with short two letter state names (SA-S?) so that lex
+won't overflow and I don't have to keep shortening the state names
+every time I add one. If a state is added, it must also be added to
+states.sed (order is important) along with its unique S? replacement.
+
+Added \pagestyle, \setcounter, and \verb handling from
+K.Sattar@cs.exeter.ac.uk (Khalid Sattar). Also allows invocation as
+"delatex" to force LaTeX mode.
+
+Applied patches from queinnec@cenatls.cena.dgac.fr (Philippe Queinnec)
+to handle nested {}s in state <LaMacro2> (\bibitem, \cite, \index).
+
+Added special ligature handling (\aa, \ae, \oe, \l, \o, \i, \j, \ss)
+at the suggestion of gwp@dido.caltech.edu (G. W. Pigman II).
+
+Cleaned up the comments on detex.h, added mathmatica to DEFAULTENV.
+
+
+Modified (Version 2.5) -- January 28, 1993
+Leading spaces in macros are no longer stripped. This means
+"foo\footnote{ bar}" comes out as "foo bar" instead of "foobar".
+
+Fixed special ligature handling so it works in cases line {\ss} instead of
+just when followed by a space.
+
+
+Modified (Version 2.6) -- July 30, 1993
+Added OS/2 port from hankedr@mail.auburn.edu (Darrel R Hankerson).
+
+Added handling of leading and trailing ':' in TEXINPUTS per the latest
+TeX as suggested by jnp@tfl.dk (J|rgen N|rgaard).
+
+Changed the way the input path is constructed in SetInputPaths() so we
+never try to modify a constant string.
+
+Changed the way the the ignore environment list is contructed in
+SetEnvIgnore() so we never try to modify a constant string.
+
+Changed the USG define to HAVE_STRING_H.
+
+Fixed the states.sed script so it only replaces "Input" in the correct
+places. I would like to use the \< \> word separator patterns but
+they are not supported by all versions of sed. This as least works.
+
+Changed the detex.c target in the Makefile to use a temporary file
+because I experienced problems (segmentation fault) with lex on
+Solaris 2.1 when input was from stdin.
+
+
+Modified (Version 2.7) -- September 10, 1997
+Removed line breaks in detex.l between a few patterns and actions. It
+appears that flex is no longer able to handle this. Thanks to Anthony
+Harris <harris@hebb.neurology.pitt.edu> and Marty Leisner
+<leisner@sdsp.mc.xerox.com> for reporting this.
+
+
+Porting notes -- March 30, 1992
+When using gcc, or compiling on a NeXT, you should compile with
+-fwritable-strings. With the change to SetInputPaths() in 2.6 this
+should no longer be necessary.
+
+On a NeXT, it has been reported that lex replaces the '\0' with NULL,
+and then the compiler complains about it. I think this is an old bug
+that is no longer applicable.
+
+July 30, 1993
+The flex scanner generator does not work because it does not handle
+input buffering the same way as lex. I don't know of any reasonable
+way to rewrite detex to get around this problem.
+
+May 25, 1995
+According to alain@ia1.u-strasbg.fr (Alain Ketterlin), using flex
+allows 8-bit characters to be handled correctly.
diff --git a/Build/source/texk/detex/detex-2.7/detex.h b/Build/source/texk/detex/detex-2.7/detex.h
new file mode 100644
index 00000000000..2ed7fbf1eb0
--- /dev/null
+++ b/Build/source/texk/detex/detex-2.7/detex.h
@@ -0,0 +1,44 @@
+/******
+** The following parameters should be modified as necessary
+** MAXINCLIST - maximum number of files allowed in an \includeonly list
+**
+** DEFAULTINPUTS - this should be the same as the default TEXINPUTS
+** CHPATHSEP - the path separator character in TEXINPUTS
+** MAXINPUTPATHS - (arbitrary) number of separate paths in TEXINPUTS
+**
+** DEFAULTENV - list of LaTeX environments ignored
+** CHENVSEP - the list separator character in the ignore envronment list
+** MAXENVS - maximum number of environments listed in the ignore list
+** CCHMAXENV - maximum count of characters in an environment name (LaTex)
+******/
+
+#define MAXINCLIST 40
+
+#ifdef OS2
+#define DEFAULTINPUTS ".;/emtex/texinput"
+#define CHPATHSEP ';'
+#else
+#define DEFAULTINPUTS ".:/usr/local/tex/inputs"
+#define CHPATHSEP ':'
+#endif
+#define MAXINPUTPATHS 10
+
+#define DEFAULTENV "array,eqnarray,equation,figure,mathmatica,picture,table,verbatim"
+#define CHENVSEP ','
+#define MAXENVS 10
+#define CCHMAXENV 100
+
+/******
+** These probably should not be changed
+******/
+
+#define CHOPT '-'
+#define CHCITEOPT 'c'
+#define CHENVOPT 'e'
+#define CHLATEXOPT 'l'
+#define CHNOFOLLOWOPT 'n'
+#define CHSPACEOPT 's'
+#define CHTEXOPT 't'
+#define CHWORDOPT 'w'
+
+#define ERROR -1
diff --git a/Build/source/texk/detex/detex-2.7/detex.l b/Build/source/texk/detex/detex-2.7/detex.l
new file mode 100644
index 00000000000..3d9a961dfa6
--- /dev/null
+++ b/Build/source/texk/detex/detex-2.7/detex.l
@@ -0,0 +1,740 @@
+%{
+#ifndef lint
+static char rcsid[] = "$Header: /p/src/local/bin/detex/RCS/detex.l,v 2.19 1997/09/10 18:12:37 trinkle Exp $";
+#endif
+
+/*
+ * detex [-e environment-list] [-c] [-l] [-n] [-s] [-t] [-w] [file[.tex] ]
+ *
+ * This program is used to remove TeX or LaTeX constructs from a text
+ * file.
+ *
+ * Written by:
+ * Daniel Trinkle
+ * Department of Computer Science
+ * Purdue University
+ *
+ */
+
+#ifdef FPTEX
+#include <win32lib.h>
+#undef ERROR
+#endif
+
+#include "detex.h"
+#ifndef KPATHSEA
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#define index strchr
+#define rindex strrchr
+#else
+#include <strings.h>
+#endif
+#ifndef MAXPATHLEN
+#include <sys/param.h>
+#endif
+#define PATH_MAX MAXPATHLEN
+#ifdef OS2
+#include <stdlib.h>
+#endif
+#ifndef NO_MALLOC_DECL
+char *malloc();
+#endif
+
+#else
+
+#include "c-auto.h"
+#include "kpathsea/c-auto.h"
+#include "kpathsea/config.h"
+#include "kpathsea/c-memstr.h"
+#include "kpathsea/c-pathmx.h"
+#include "kpathsea/c-std.h"
+#include "kpathsea/tex-file.h"
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#endif
+
+#undef IGNORE
+
+void SetEnvIgnore(const char *sbEnvList);
+int BeginEnv(const char *sbEnv);
+int EndEnv(const char *sbEnv);
+void InputFile(char *sbFile);
+void IncludeFile(char *sbFile);
+void AddInclude(char *sbFile);
+int InList(char *sbFile);
+void SetInputPaths(void);
+int SeparateList(char *sbList, char **rgsbList ,char chSep,int csbMax);
+FILE * TexOpen(char *sbFile);
+char * SafeMalloc(int cch, const char *sbMessage);
+void Warning(const char *sb1, const char *sb2);
+void ErrorExit(const char *sb1);
+
+#define LaBEGIN if (fLatex) BEGIN
+#define CITEBEGIN if (fLatex && !fCite) BEGIN
+#define IGNORE if (fSpace && !fWord) putchar(' ')
+#define SPACE if (!fWord) putchar(' ')
+#define NEWLINE if (!fWord) putchar('\n')
+
+#ifdef OS2
+void yyless(int);
+void OS2UsageExit(void);
+#endif
+
+char *rgsbEnvIgnore[MAXENVS]; /* list of environments ignored */
+char *rgsbIncList[MAXINCLIST]; /* list of includeonly files */
+char *rgsbInputPaths[MAXINPUTPATHS]; /* list of input paths in order */
+char sbCurrentEnv[CCHMAXENV]; /* current environment being ignored */
+char *sbProgName; /* name we were invoked with */
+#ifndef NOFILE /* might be defined in <sys/param.h> */
+#define NOFILE 256
+#endif
+FILE *rgfp[NOFILE+1]; /* stack of input/include files */
+int cfp = 0; /* count of files in stack */
+int cOpenBrace = 0; /* count of `{' in <LaMacro2> */
+int csbEnvIgnore; /* count of environments ignored */
+int csbIncList = 0; /* count of includeonly files */
+int csbInputPaths; /* count of input paths */
+int fLatex = 0; /* flag to indicated delatex */
+int fWord = 0; /* flag for -w option */
+int fFollow = 1; /* flag to follow input/include */
+int fCite = 0; /* flag to echo \cite and \ref args */
+int fSpace = 0; /* flag to replace \cs with space */
+int fForcetex = 0; /* flag to inhibit latex mode */
+%}
+
+S [ \t\n]*
+W [a-zA-Z]+
+
+%Start Define Display IncludeOnly Input Math Normal Control
+%Start LaBegin LaDisplay LaEnd LaEnv LaFormula LaInclude
+%Start LaMacro LaMacro2 LaVerbatim
+
+%%
+<Normal>"%".* /* ignore comments */ ;
+
+<Normal>"\\begin"{S}"{"{S}"document"{S}"}" {fLatex = !fForcetex; IGNORE;}
+
+<Normal>"\\begin" /* environment start */ {LaBEGIN LaBegin; IGNORE;}
+
+<LaBegin>{S}"{"{S}"verbatim"{S}"}" { if (BeginEnv("verbatim"))
+ BEGIN LaEnv;
+ else
+ BEGIN LaVerbatim;
+ IGNORE;
+ }
+
+<LaVerbatim>"\\end"{S}"{"{S}"verbatim"{S}"}" /* verbatim mode */ {BEGIN Normal; IGNORE;}
+<LaVerbatim>. ECHO;
+
+<LaBegin>{W} { if (BeginEnv(yytext))
+ BEGIN LaEnv;
+ else
+ BEGIN LaMacro;
+ IGNORE;
+ }
+<LaBegin>"\n" NEWLINE;
+<LaBegin>. ;
+
+<LaEnv>"\\end" /* absorb some environments */ {LaBEGIN LaEnd; IGNORE;}
+<LaEnv>"\n" NEWLINE;
+<LaEnv>. ;
+
+<LaEnd>{W} /* end environment */ { if (EndEnv(yytext))
+ BEGIN Normal;
+ IGNORE;
+ }
+<LaEnd>"}" {BEGIN LaEnv; IGNORE;}
+<LaEnd>"\n" NEWLINE;
+<LaEnd>. ;
+
+<Normal>"\\bibitem" /* ignore args */ {LaBEGIN LaMacro2; IGNORE;}
+<Normal>"\\bibliography" /* of these \cs */ {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\bibstyle" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\cite" {CITEBEGIN LaMacro2; IGNORE;}
+<Normal>"\\documentstyle" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\end" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\footnote" {SPACE;}
+<Normal>"\\index" {LaBEGIN LaMacro2; SPACE;}
+<Normal>"\\label" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\pageref" {CITEBEGIN LaMacro; IGNORE;}
+<Normal>"\\pagestyle" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\ref" {CITEBEGIN LaMacro; IGNORE;}
+<Normal>"\\setcounter" {LaBEGIN LaMacro; IGNORE;}
+<Normal>"\\verb" /* ignore \verb<ch>...<ch> */ { if (fLatex) {
+ char verbchar, c;
+ verbchar = input();
+ while ((c = input()) != verbchar)
+ if (c == '\n')
+ NEWLINE;
+ }
+ IGNORE;
+ }
+<LaMacro>"}" BEGIN Normal;
+<LaMacro>"\n" NEWLINE;
+<LaMacro>. ;
+<LaMacro2>"{" { cOpenBrace++; }
+<LaMacro2>"}" { cOpenBrace--;
+ if (cOpenBrace == 0)
+ BEGIN Normal;
+ }
+<LaMacro2>"\n" NEWLINE;
+<LaMacro2>. ;
+
+<Normal>"\\def" /* ignore def begin */ {BEGIN Define; IGNORE;}
+<Define>"{" BEGIN Normal;
+<Define>"\n" NEWLINE;
+<Define>. ;
+
+<Normal>"\\(" /* formula mode */ {LaBEGIN LaFormula; IGNORE;}
+<LaFormula>"\\)" BEGIN Normal;
+<LaFormula>"\n" NEWLINE;
+<LaFormula>. ;
+
+<Normal>"\\[" /* display mode */ {LaBEGIN LaDisplay; IGNORE;}
+<LaDisplay>"\\]" BEGIN Normal;
+<LaDisplay>"\n" NEWLINE;
+<LaDisplay>. ;
+
+<Normal>"$$" /* display mode */ {BEGIN Display; IGNORE;}
+<Display>"$$" BEGIN Normal;
+<Display>"\n" NEWLINE;
+<Display>. ;
+
+<Normal>"$" /* math mode */ {BEGIN Math; IGNORE;}
+<Math>"$" BEGIN Normal;
+<Math>"\n" NEWLINE;
+<Math>"\\$" ;
+<Math>. ;
+
+<Normal>"\\include" /* process files */ {LaBEGIN LaInclude; IGNORE;}
+<LaInclude>[^{ \t\n}]+ { IncludeFile(yytext);
+ BEGIN Normal;
+ }
+<LaInclude>"\n" NEWLINE;
+<LaInclude>. ;
+
+<Normal>"\\includeonly" {BEGIN IncludeOnly; IGNORE;}
+<IncludeOnly>[^{ \t,\n}]+ AddInclude(yytext);
+<IncludeOnly>"}" { if (csbIncList == 0)
+ rgsbIncList[csbIncList++] = '\0';
+ BEGIN Normal;
+ }
+<IncludeOnly>"\n" NEWLINE;
+<IncludeOnly>. ;
+
+<Normal>"\\input" {BEGIN Input; IGNORE;}
+<Input>[^{ \t\n}]+ { InputFile(yytext);
+ BEGIN Normal;
+ }
+<Input>"\n" NEWLINE;
+<Input>. ;
+
+<Normal>\\(aa|AA|ae|AE|oe|OE|ss)[ \t]*[ \t\n}] /* handle ligatures */ {(void)printf("%.2s", yytext+1);}
+<Normal>\\[OoijLl][ \t]*[ \t\n}] {(void)printf("%.1s", yytext+1);}
+
+<Normal>\\[a-zA-Z@]+ /* ignore other \cs */ {BEGIN Control; IGNORE;}
+<Normal>"\\ " SPACE;
+<Normal>\\. IGNORE;
+<Control>\\[a-zA-Z@]+ IGNORE;
+<Control>[a-zA-Z@0-9]*[-'=`][^ \t\n{]* IGNORE;
+<Control>"\n" {BEGIN Normal; NEWLINE;}
+<Control>[ \t]*[{]* {BEGIN Normal; IGNORE;}
+<Control>. {yyless(0);BEGIN Normal;}
+
+<Normal>[{}\\|] /* special characters */ IGNORE;
+<Normal>[!?]"`" IGNORE;
+<Normal>~ SPACE;
+
+<Normal>{W}[']*{W} { if (fWord)
+ (void)printf("%s\n", yytext);
+ else
+ ECHO;
+ }
+<Normal>[0-9]+ if (!fWord) ECHO;
+<Normal>(.|\n) if (!fWord) ECHO;
+%%
+/******
+** main --
+** Set sbProgName to the base of arg 0.
+** Set the input paths.
+** Check for options
+** -c echo LaTeX \cite, \ref, and \pageref values
+** -e <env-list> list of LaTeX environments to ignore
+** -l force latex mode
+** -n do not follow \input and \include
+** -s replace control sequences with space
+** -t force tex mode
+** -w word only output
+** Set the list of LaTeX environments to ignore.
+** Process each input file.
+** If no input files are specified on the command line, process stdin.
+******/
+
+int
+main(int cArgs, char *rgsbArgs[])
+{
+ char *pch, sbBadOpt[2];
+ const char *sbEnvList = DEFAULTENV;
+ int fSawFile = 0, iArgs = 1;
+
+ /* get base name and decide what we are doing, detex or delatex */
+#ifdef OS2
+ char drive[_MAX_DRIVE], dir[_MAX_DIR];
+ char fname[_MAX_FNAME], ext[_MAX_EXT];
+#ifdef __EMX__
+ _wildcard(&cArgs, &rgsbArgs);
+ _response(&cArgs, &rgsbArgs);
+#endif
+ _splitpath (rgsbArgs[0], drive, dir, fname, ext);
+ sbProgName = strlwr(fname);
+#else
+#ifdef KPATHSEA
+ kpse_set_program_name (rgsbArgs[0], NULL);
+#endif
+ if ((sbProgName = strrchr(rgsbArgs[0], '/')) != NULL)
+ sbProgName++;
+ else
+ sbProgName = rgsbArgs[0];
+#endif
+ if (strcmp("delatex",sbProgName) == 0)
+ fLatex = 1;
+
+#ifndef KPATHSEA
+ /* set rgsbInputPaths for use with TexOpen() */
+ SetInputPaths();
+#endif
+
+ /* process command line options */
+ while (iArgs < cArgs && *(pch = rgsbArgs[iArgs]) == CHOPT) {
+ while (*++pch)
+ switch (*pch) {
+ case CHCITEOPT:
+ fCite = 1;
+ break;
+ case CHENVOPT:
+ sbEnvList = rgsbArgs[++iArgs];
+ break;
+ case CHLATEXOPT:
+ fLatex = 1;
+ break;
+ case CHNOFOLLOWOPT:
+ fFollow = 0;
+ break;
+ case CHSPACEOPT:
+ fSpace = 1;
+ break;
+ case CHTEXOPT:
+ fForcetex = 1;
+ break;
+ case CHWORDOPT:
+ fWord = 1;
+ break;
+ default:
+#ifdef OS2
+ OS2UsageExit();
+#else
+ sbBadOpt[0] = *pch;
+ sbBadOpt[1] = '\0';
+ Warning("unknown option ignored -", sbBadOpt);
+#endif
+ }
+ iArgs++;
+ }
+ SetEnvIgnore(sbEnvList);
+
+ /* process input files */
+ for (; iArgs < cArgs; iArgs++) {
+ fSawFile++;
+ if ((yyin = TexOpen(rgsbArgs[iArgs])) == NULL) {
+ Warning("can't open file", rgsbArgs[iArgs]);
+ continue;;
+ }
+ BEGIN Normal;
+ (void)yylex();
+ }
+
+ /* if there were no input files, assume stdin */
+ if (!fSawFile) {
+ yyin = stdin;
+#ifdef OS2
+ if (isatty(fileno(stdin)))
+ OS2UsageExit();
+#endif
+ BEGIN Normal;
+ (void)yylex();
+ }
+#ifndef FLEX_SCANNER
+ if (YYSTATE != Normal)
+ ErrorExit("input contains an unterminated mode or environment");
+#endif
+ return(0);
+}
+
+#ifdef FLEX_SCANNER
+#undef yywrap
+#endif
+
+/******
+** yywrap -- handles EOF for lex. Check to see if the stack of open files
+** has anything on it. If it does, set yyin to the to value. If not
+** return the termination signal for lex.
+******/
+
+int
+yywrap(void)
+{
+ (void)fclose(yyin);
+ if (cfp > 0) {
+ yyin = rgfp[--cfp];
+ return(0);
+ }
+ return(1);
+}
+
+#ifdef OS2
+
+/******
+** yyless -- return characters to the input stream. Some systems don't have
+** a yyless routine
+******/
+
+void
+yyless(int n)
+{
+ int i = strlen(yytext);
+
+ while (i > n) unput(yytext[--i]);
+ yytext[yyleng = n] = '\0';
+}
+#endif
+
+/******
+** SetEnvIgnore -- sets rgsbEnvIgnore to the values indicated by the
+** sbEnvList.
+******/
+
+void
+SetEnvIgnore(const char *sbEnvList)
+{
+ char *sb;
+
+ sb = SafeMalloc(strlen(sbEnvList) + 1, "malloc for SetEnvIgnore failed");
+ (void) strcpy(sb, sbEnvList);
+ csbEnvIgnore = SeparateList(sb, rgsbEnvIgnore, CHENVSEP, MAXENVS);
+ if (csbEnvIgnore == ERROR)
+ ErrorExit("The environtment list contains too many environments");
+}
+
+/******
+** BeginEnv -- checks to see if sbEnv is in the list rgsbEnvIgnore. If it
+** is, sbCurrentEnv is set to sbEnv.
+******/
+
+int
+BeginEnv(const char *sbEnv)
+{
+ int i;
+
+ if (!fLatex) return(0);
+ for (i = 0; i < csbEnvIgnore; i++)
+ if (strcmp(sbEnv, rgsbEnvIgnore[i]) == 0) {
+ (void)strcpy(sbCurrentEnv, sbEnv);
+ return(1);
+ }
+ return(0);
+}
+
+/******
+** EndEnv -- checks to see if sbEnv is the current environment being ignored.
+******/
+
+int
+EndEnv(const char *sbEnv)
+{
+ if (!fLatex) return(0);
+ if (strcmp(sbEnv, sbCurrentEnv) == 0)
+ return(1);
+ return(0);
+}
+
+/******
+** InputFile -- push the current yyin and open sbFile. If the open fails,
+** the sbFile is ignored.
+******/
+
+void
+InputFile(char *sbFile)
+{
+ if (!fFollow)
+ return;
+ rgfp[cfp++] = yyin;
+ if ((yyin = TexOpen(sbFile)) == NULL) {
+ Warning("can't open \\input file", sbFile);
+ yyin = rgfp[--cfp];
+ }
+}
+
+/******
+** IncludeFile -- if sbFile is not in the rgsbIncList, push current yyin
+** and open sbFile. If the open fails, the sbFile is ignored.
+******/
+
+void
+IncludeFile(char *sbFile)
+{
+ if (!fFollow)
+ return;
+ if (!InList(sbFile))
+ return;
+ rgfp[cfp++] = yyin;
+ if ((yyin = TexOpen(sbFile)) == NULL) {
+ Warning("can't open \\include file", sbFile);
+ yyin = rgfp[--cfp];
+ }
+}
+
+/******
+** AddInclude -- adds sbFile to the rgsbIncList and increments csbIncList.
+** If the include list is too long, sbFile is ignored.
+******/
+
+void
+AddInclude(char *sbFile)
+{
+ if (!fFollow)
+ return;
+ if (csbIncList >= MAXINCLIST)
+ Warning("\\includeonly list is too long, ignoring", sbFile);
+ rgsbIncList[csbIncList] = SafeMalloc(strlen(sbFile) + 1, "malloc for AddInclude failed");
+ (void)strcpy(rgsbIncList[csbIncList++], sbFile);
+}
+
+/******
+** InList -- checks to see if sbFile is in the rgsbIncList. If there is
+** no list, all files are assumed to be "in the list".
+******/
+
+int
+InList(char *sbFile)
+{
+ char *pch, sbBase[PATH_MAX];
+ int i;
+
+ if (csbIncList == 0) /* no list */
+ return(1);
+ (void)strcpy(sbBase, sbFile);
+ if ((pch = strrchr(sbBase, '.')) != NULL)
+ *pch = '\0';
+ i = 0;
+ while ((i < csbIncList) && rgsbIncList[i])
+ if (strcmp(rgsbIncList[i++], sbBase) == 0)
+ return(1);
+ return(0);
+}
+
+/******
+** SetInputPaths -- sets rgsbInputPaths to the values indicated by the
+** TEXINPUTS environment variable if set or else DEFAULTINPUTS. If
+** the user's TEXINPUTS has a leading ':' prepend the DEFAULTINPUTS
+** to the path, if there is a trailing ':' append the DEFAULTINPUTS.
+** This is consistent with the most recent TeX. However, this
+** routine does not honor the '//' construct (expand subdirs).
+******/
+
+void
+SetInputPaths(void)
+{
+ const char *sb;
+ char *sbPaths;
+#ifndef WIN32
+ char *getenv();
+#endif
+ int cchDefaults, cchPaths;
+
+ cchDefaults = strlen(DEFAULTINPUTS);
+#ifdef OS2
+ if ((sb = getenv("TEXINPUT")) == NULL)
+#endif
+ if ((sb = getenv("TEXINPUTS")) == NULL)
+ sb = DEFAULTINPUTS;
+ cchPaths = strlen(sb);
+ if (sb[0] == CHPATHSEP)
+ cchPaths += cchDefaults;
+ if (sb[strlen(sb) - 1] == CHPATHSEP)
+ cchPaths += cchDefaults;
+ sbPaths = SafeMalloc(cchPaths + 1, "malloc for SetInputPaths failed");
+ sbPaths[0] = '\0';
+ if (sb[0] == CHPATHSEP)
+ (void)strcat(sbPaths, DEFAULTINPUTS);
+ (void)strcat(sbPaths, sb);
+ if (sb[strlen(sb) - 1] == CHPATHSEP)
+ (void)strcat(sbPaths, DEFAULTINPUTS);
+
+ csbInputPaths = SeparateList(sbPaths, rgsbInputPaths, CHPATHSEP, MAXINPUTPATHS);
+ if (csbInputPaths == ERROR)
+#ifdef OS2
+ ErrorExit("TEXINPUT(S) environment variable has too many paths");
+#else
+ ErrorExit("TEXINPUTS environment variable has too many paths");
+#endif
+}
+
+/******
+** SeparateList -- takes a chSep separated list sbList, replaces the
+** chSep's with NULLs and sets rgsbList[i] to the beginning of
+** the ith word in sbList. The number of words is returned. A
+** ERROR is returned if there are more than csbMax words.
+******/
+
+int
+SeparateList(char *sbList, char **rgsbList, char chSep, int csbMax)
+{
+ int csbList = 0;
+
+ while (sbList && *sbList && csbList < csbMax) {
+ rgsbList[csbList++] = sbList;
+ if ((sbList = strchr(sbList, chSep)))
+ *sbList++ = '\0';
+ }
+ return(sbList && *sbList ? ERROR : csbList);
+}
+
+/******
+** TexOpen -- tries to open sbFile in each of the rgsbInputPaths in turn.
+** For each input path the following order is used:
+** file.tex - must be as named, if not there go to the next path
+** file.ext - random extension, try it
+** file - base name, add .tex and try it
+** file - try it as is
+** Notice that if file exists in the first path and file.tex exists in
+** one of the other paths, file in the first path is what is opened.
+** If the sbFile begins with a '/', no paths are searched.
+******/
+
+FILE *
+TexOpen(char *sbFile)
+{
+ char *sbNew;
+#ifndef KPATHSEA
+ char *pch;
+ FILE *fp;
+ int iPath;
+ static char sbFullPath[PATH_MAX];
+
+ for (iPath = 0; iPath < csbInputPaths; iPath++) {
+#ifdef OS2
+ if (*sbFile == '/' || *sbFile == '\\' || strchr(sbFile, ':')) /* absolute path */
+#else
+ if (*sbFile == '/') /* absolute path */
+#endif
+ {
+ (void)sprintf(sbFullPath, "%s", sbFile);
+ iPath = csbInputPaths; /* only check once */
+ } else
+ (void)sprintf(sbFullPath, "%s/%s", rgsbInputPaths[iPath], sbFile);
+#ifdef OS2
+ pch = sbFullPath;
+ while (pch = strchr(pch, '\\'))
+ *pch = '/';
+#endif
+
+ /* If sbFile ends in .tex then it must be there */
+ if ((pch = strrchr(sbFullPath, '.')) != NULL
+ && (strcmp(pch, ".tex") == 0))
+ if ((fp = fopen(sbFullPath, "r")) != NULL)
+ return(fp);
+ else
+ continue;
+
+ /* if .<ext> then try to open it. the '.' represents */
+ /* the beginning of an extension if it is not the first */
+ /* character and it does not follow a '.' or a '/' */
+ if (pch != NULL && pch > &(sbFullPath[0])
+ && *(pch - 1) != '.' && *(pch - 1) != '/'
+ && (fp = fopen(sbFullPath, "r")) != NULL)
+ return(fp);
+
+ /* just base name, add .tex to the name */
+ sbNew = SafeMalloc(strlen(sbFullPath) + 5, "malloc for TexOpen failed");
+ (void)strcpy(sbNew, sbFullPath);
+ (void)strcat(sbNew, ".tex");
+ if ((fp = fopen(sbNew, "r")) != NULL)
+ return(fp);
+
+ /* try sbFile regardless */
+ if ((fp = fopen(sbFullPath, "r")) != NULL)
+ return(fp);
+ }
+ return((FILE *)NULL);
+#else
+ sbNew = kpse_find_file (sbFile, kpse_tex_format, false);
+
+ if (sbNew == NULL)
+ return (FILE *)NULL;
+
+ return fopen (sbNew, "r");
+#endif
+}
+
+/******
+** SafeMalloc -- wrapper around malloc() to check for failure.
+******/
+
+char *
+SafeMalloc(int cch, const char *sbMessage)
+{
+ char *sb;
+
+ if ((sb = (char *)malloc((unsigned)cch)) == NULL)
+ ErrorExit(sbMessage);
+ return(sb);
+}
+
+/******
+** Warning -- print a warning message preceded by the program name.
+******/
+
+void
+Warning(const char *sb1, const char *sb2)
+{
+ (void)fprintf(stderr, "%s: warning: %s %s\n", sbProgName, sb1, sb2);
+}
+
+/******
+** ErrorExit -- print an error message preceded by the program name.
+** Stdout is flushed and detex exits.
+******/
+
+void
+ErrorExit(const char *sb1)
+{
+ (void)fflush(stdout);
+ (void)fprintf(stderr, "%s: error: %s\n", sbProgName, sb1);
+ exit(1);
+}
+#ifdef OS2
+
+/******
+** OS2UsageExit -- print OS/2 usage message and exit.
+******/
+
+void
+OS2UsageExit(void)
+{
+ (void)printf("\n%s [ -clnstw ] [ -e environment-list ] [ filename[.tex] ... ]\n",
+ sbProgName);
+ puts(" -c echo LaTeX \\cite, \\ref, and \\pageref values\n \
+-e <env-list> list of LaTeX environments to ignore\n \
+-l force latex mode\n \
+-n do not follow \\input and \\include\n \
+-s replace control sequences with space\n \
+-t force tex mode\n \
+-w word only output");
+ exit(0);
+}
+#endif
diff --git a/Build/source/texk/detex/detex-2.7/detex.man b/Build/source/texk/detex/detex-2.7/detex.man
new file mode 100644
index 00000000000..93e71005746
--- /dev/null
+++ b/Build/source/texk/detex/detex-2.7/detex.man
@@ -0,0 +1,126 @@
+.TH DETEX 1L "12 August 1993" "Purdue University"
+.SH NAME
+detex \- a filter to strip \fITeX\fP commands from a .tex file.
+.SH SYNOPSIS
+.B detex
+[ \fB\-clnstw\fR ] [ \fB\-e\fI environment-list\fR ] [ \fIfilename\fR[.tex] ... ]
+.SH DESCRIPTION
+.I Detex
+(Version 2.6)
+reads each file in sequence, removes all comments and
+.I TeX
+control sequences
+and writes the remainder on the standard output.
+All text in math mode and display mode is removed.
+By default,
+.I detex
+follows \\input commands.
+If a file cannot be opened, a warning message is
+printed and the command is ignored.
+If the
+.B \-n
+option is used, no \\input or \\include commands will be processed.
+This allows single file processing.
+If no input file is given on the command line,
+.I detex
+reads from standard input.
+.PP
+If the magic sequence ``\\begin{document}'' appears in the text,
+.I detex
+assumes it is dealing with
+.I LaTeX
+source and
+.I detex
+recognizes additional constructs used in
+.IR LaTeX .
+These include the \\include and \\includeonly commands.
+The
+.B \-l
+option can be used to force
+.I LaTeX
+mode and the
+.B \-t
+option can be used to force
+.I TeX
+mode regardless of input content.
+.PP
+Text in various environment modes of
+.I LaTeX
+is ignored. The default modes are array, eqnarray, equation, figure,
+mathmatica, picture, table and verbatim. The
+.B \-e
+option can be used to specify a comma separated
+.I environment-list
+of environments to ignore. The list replaces the defaults so specifying an
+empty list effectively causes no environments to be ignored.
+.PP
+The
+.B \-c
+option can be used in
+.I LaTeX
+mode to have detex echo the arguments to \\cite,
+\\ref, and \\pageref macros. This can be useful when sending the output to
+a style checker.
+.PP
+.I Detex
+assumes the standard character classes are being used for
+.IR TeX .
+.I Detex
+allows white space between control sequences
+and magic characters like `{' when recognizing things like
+.I LaTeX
+environments.
+.PP
+If the
+.B \-w
+flag is given, the output is a word list, one `word' (string of two or more
+letters and apostrophes beginning with a letter)
+per line, and all other characters ignored.
+Without \fB\-w\fR the output follows the original,
+with the deletions mentioned above. Newline characters are
+preserved where possible
+so that the lines of output match the input as closely as possible.
+.PP
+The TEXINPUTS environment variable is used to find \\input and \\include
+files. Like \fITeX\fP, it interprets a leading or trailing `:' as the default
+TEXINPUTS. It does \fInot\fP support the `//' directory expansion magic sequence.
+.PP
+Detex now handles the basic \fITeX\fP ligatures as a special case, replacing the
+ligatures with acceptable charater substitutes. This eliminates
+spelling errors introduced by merely removing them. The ligatures are
+\\aa, \\ae, \\oe, \\ss, \\o, \\l (and their upper-case
+equivalents). The special "dotless" characters \\i and \\j are also
+replaced with i and j respectively.
+.PP
+Note that previous versions of
+.I detex
+would replace control sequences with a space character to prevent words
+from running together.
+However, this caused accents in the middle of words to break words, generating
+"spelling errors" that were not desirable.
+Therefore, the new version merely removes these accents.
+The old functionality can be essentially duplicated by using the
+.B \-s
+option.
+.SH SEE ALSO
+tex(1L)
+.SH DIAGNOSTICS
+Nesting of \\input is allowed but the number of opened files must not
+exceed the system's limit on the number of simultaneously opened files.
+.I Detex
+ignores unrecognized option characters after printing a warning message.
+.SH AUTHOR
+Daniel Trinkle, Computer Science Department, Purdue University
+.SH BUGS
+.I Detex
+is not a complete
+.I TeX
+interpreter, so it can be confused by some constructs.
+Most errors result in too much rather than too little output.
+.PP
+Running \fILaTeX\fR
+source without a ``\\begin{document}''
+through \fIdetex\fR may produce
+errors.
+.PP
+Suggestions for improvements are (mildly) encouraged.