sources-request@mirror.UUCP (02/14/87)
Submitted by: Kamal Al-Yahya <kamal@hanauma.STANFORD.EDU> Mod.sources: Volume 8, Issue 61 Archive-name: tektools2/Part01 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # DeTeX.c # Eqn.c # Expand.c # Match.c # README # TEX # TEX.1 # detex.1 # detex1.c # detex2.c # inc_file # inc_file2.tex # makefile # makefile.msc # makefile.par # setups.h # subs.c # testfile # texeqn.1 # texeqn1.c # texeqn2.c # texexpand.1 # texexpand1.c # texexpand2.c # texmatch.1 # texmatch1.c # texmatch2.c # texspell # texspell.1 # This archive created: Thu Feb 12 10:14:11 1987 export PATH; PATH=/bin:$PATH if test -f 'DeTeX.c' then echo shar: will not over-write existing file "'DeTeX.c'" else cat << \SHAR_EOF > 'DeTeX.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ #include "setups.h" DeTeX(buffer,out_file) /* stripping TEX commands */ char *buffer; FILE *out_file; { int c,cc; char w[MAXWORD]; while ((c = *buffer++) != NULL) { switch (c) { /* detect TeX commands (backslash) */ case '\\': c=' ' ; /* "erase" the backslash */ putc(c,out_file); cc = *buffer++; if (cc == '\n') putc(cc,out_file); else if (cc == '[') buffer += display(buffer); else if (cc == '(') buffer += formula(buffer); else if (cc == '$' || cc == '%') break; /* check for LaTeX \begin{equation}, \begin{eqnarray}, and \begin{displaymath} */ else { buffer--; buffer += get_buf_word(buffer,w); if (strcmp(w,"begin") == 0) { buffer++; buffer += get_buf_word(buffer,w); if (strcmp(w,"equation") == 0 || strcmp(w,"eqnarray") == 0 || strcmp(w,"displaymath") == 0) buffer += begin_to_end(buffer,w); } } break; case '$': buffer += dollar(buffer,out_file); break; case '%': buffer += comment(buffer); break; /* erase these character */ case '{': c=' '; case '}': c=' '; case '_': c=' '; case '^': c=' '; case '&': c=' '; case '#': c=' '; /* default is doing nothing: pass the character to the output */ default: putc(c,out_file); break; } } } SHAR_EOF fi # end of overwriting check if test -f 'Eqn.c' then echo shar: will not over-write existing file "'Eqn.c'" else cat << \SHAR_EOF > 'Eqn.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ #include "setups.h" Eqn(buffer,out_file) /* srips TEX equations */ FILE *out_file; char *buffer; { int c,d; int i; char w[MAXLINE], ww[MAXWORD]; while ((c = *buffer++) != NULL) { if(c == '%') { while ((c = *buffer++) != NULL) if (c == '\n') break; } else if(c == '$') { if ((d = *buffer++) == '$') { putc(c,out_file); putc(d,out_file); while ((c = *buffer++) != NULL) { if(c != '$') putc(c,out_file); else { buffer++; fprintf(out_file,"$$ \n"); break; } } } } /* check for LaTeX \begin{equation}, \begin{eqnarray}, and \begin{displaymath} */ else if(c == '\\') { c = *buffer++; if (c == '[') { putc('\\',out_file); putc(c,out_file); while((c = *buffer++) != NULL) { if(c == '\\') { c = *buffer++; fprintf(out_file,"\\%c",c); if (c == ']') { putc('\n',out_file); break; } } else putc(c,out_file); } continue; } buffer--; buffer += get_buf_word(buffer,w); if (strcmp(w,"begin") == 0) { buffer++; i = get_buf_word(buffer,w); buffer += i; if (strcmp(w,"equation") == 0 || strcmp(w,"eqnarray") == 0 || strcmp(w,"displaymath") == 0) { fprintf(out_file,"\\begin{%s}",w); buffer++; while ((c = *buffer++) != NULL) { putc(c,out_file); if (c == '\\') { i = get_buf_word(buffer,ww); buffer += i; fprintf(out_file,"%s",ww); if (strcmp(ww,"end") == 0) { buffer++; i = get_buf_word(buffer,ww); buffer += i; fprintf(out_file, "{%s}\n",ww); buffer++; if (strcmp(ww,"equation") == 0 || strcmp(ww,"eqnarray") == 0 || strcmp(ww,"displaymath") == 0) break; } } } } } else if (strcmp(w,"def") == 0) { i = def(buffer,w); buffer += i; fprintf(out_file,"\\def%s\n",w); } else if (strcmp(w,"newcommand") == 0) { i = command(buffer,w); buffer += i; fprintf(out_file,"\\newcommand%s\n",w); } } } } SHAR_EOF fi # end of overwriting check if test -f 'Expand.c' then echo shar: will not over-write existing file "'Expand.c'" else cat << \SHAR_EOF > 'Expand.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ #include "setups.h" unsigned int len=0; /* length of document */ Expand(fp,buf) /* expand TeX and LaTeX's \input and \include */ FILE *fp; char *buf; { char *buf2; FILE *fpp; int c; int c1=' '; /* previous character */ char w[MAXWORD]; int i,j; extern wflag; if (((buf2 = (char *)malloc(MAXLEN*sizeof(char))) == (char *)NULL)) { fprintf(stderr,"Expand: Cannot malloc() internal buffer space\n\ Need an arrays of %d characters\n",MAXLEN); exit(-1); } while ((c = getc(fp)) != EOF) { if (++len >= MAXLEN) { fprintf(stderr,"Document is too large\n"); exit(-1); } if (c == '%' || c1 == '%') { *buf++ = c; while ((c =getc(fp)) != EOF) { if (++len >= MAXLEN) { fprintf(stderr,"Sorry: document is too large\n"); exit(-1); } *buf++=c; if (c == '\n') break; } c1=c; continue; } if (c != '\\') *buf++ = c; else /* detect TeX commands (backslash) */ { /* see if \input or \include is the control sequence */ i=0; c1=c; /* update last character */ while ((c = getc(fp)) != EOF && i < MAXWORD) { if (++len >= MAXLEN) { fprintf(stderr,"Document is too large\n"); exit(-1); } if (c == ' ' || c=='\n' || c=='$' || c=='#' || c=='%' || c=='{' || c=='(' || c==')' || c == '\\') break; w[i++] = (char)c; } if (strncmp(w,"input",5) == 0 || (strncmp(w,"include",7) == 0 && strcmp(w,"includeonly") !=0)) { /* if it is \input or \include , get the file name */ i=0; while ((c=getc(fp)) != EOF && i < MAXWORD) { if (c == ' ' || c == '\n' || c == '\t' || c == '}' || c == '%') break; w[i++] = (char)c; } w[i] = NULL; fpp=fopen(w, "r"); /* open the new file */ if( fpp == NULL ) { /* if file is not found, try file.tex */ strcat(w,".tex"); fpp=fopen(w, "r"); if( fpp == NULL ) { fprintf(stderr, "TeXExpand: Cannot open %s\n",w); buf2[0] = NULL; } else { if (wflag != 1) { fprintf(stderr,"%s:\n",w); Match(fpp); fprintf(stderr,"\n"); fseek(fpp,0,0); } Expand(fpp,buf2); fclose(fpp); } } else { if (wflag != 1) { fprintf(stderr,"%s:\n",w); Match(fpp); fprintf(stderr,"\n"); fseek(fpp,0,0); } Expand(fpp,buf2); fclose(fpp); } strcat(buf,buf2); buf += strlen(buf2); w[0] = NULL; } else /* if the control sequence is not \input or \include write it out */ { /* if it is \def, \newcommand, or \newenvironment, write the full command */ if (strncmp(w,"def",3) == 0) { i = def_file(fp,&j,0); fseek(fp,-i,1); strcat(buf,"\\def\\"); buf += 5; for (j=0; j < i; j++) *buf++=getc(fp); } else if (strncmp(w,"newcommand",10) == 0) { i = comm_file(fp,&j,0); fseek(fp,-i,1); strcat(buf,"\\newcommand{"); buf += 12; for (j=0; j < i; j++) *buf++=getc(fp); } else if (strncmp(w,"newenvironment",14)==0) { i = getenv_file(fp,&j,0); fseek(fp,-i,1); strcat(buf,"\\newenvironment{"); buf += 16; for (j=0; j < i; j++) *buf++=getc(fp); } else { *buf++='\\'; for (j=0; j < i; j++) *buf++ = w[j]; *buf++ = c; } } } c1 = c; /* update last character */ } *buf = NULL; /* terminate it with a null */ } SHAR_EOF fi # end of overwriting check if test -f 'Match.c' then echo shar: will not over-write existing file "'Match.c'" else cat << \SHAR_EOF > 'Match.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ #define IN_TM #include "setups.h" Match(fp) /* check matching */ FILE *fp; { int line=1; /* line counter */ int ld=0; /* single left dollar signs */ int rd=0; /* single right dollar signs */ int ldd=0; /* left double dollar signs */ int rdd=0; /* right double dollar signs */ int disp=0; /* \[ \] */ int disp_line=1; /* line number of \[ */ int form=0; /* \( \) */ int lform=1; /* line number of \( */ int lp=0; /* left parenthesis */ int rp=0; /* right parenthesis */ int lb=0; /* left brackets */ int rb=0; /* right brackets */ int lbr=0; /* left braces */ int rbr=0; /* right braces */ int c=' '; /* current character */ int c1=' '; /* previous character */ int lbrl=0; /* line number of left braces */ int lbl=0; /* line number of left bracket */ int lpl=0; /* line number of left parenthesis */ int ldl=1; /* line number of left single dollar sign */ int lddl=1; /* line number of left double dollar sign */ int warn=0; /* warning status */ int env_count = 0; /* environment counter */ int i=0, j=0; char w[MAXWORD]; char *p; int cc; extern char *malloc(); while ((c =getc(fp)) != EOF) { if (ldd == 1 && ld == 1 && c != '$') { fprintf(stderr,"line %d: a double dollar sign is closed by a single dollar sign\n",line); ld=0.; ldd=0.; /* reset dollar signs */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",lddl,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } switch(c) { case '\n': line++; /* increment line counter */ /* check to see if a single dollar sign is not closed at the same line */ if (ld == 1 && warn == 0) { fprintf(stderr,"line %d: single dollar sign is not closed on the same line\n",line-1); warn=1; /* warning has been given */ } break; case '%': /* ignore commented text */ while ((c =getc(fp)) != EOF) if (c == '\n') {line++; break;} break; case '{': if (lbrl == 0) lbrl=line; lbr++; break; case '}': rbr++; if (rbr > lbr) { fprintf(stderr,"line %d: unmatched brace\n",line); rbr--; /* reset counter */ } if (lbr == rbr) lbrl=0; break; case '[': if (lbl == 0) lbl=line; lb++; break; case ']': rb++; if (rb > lb) { fprintf(stderr,"line %d: unmatched bracket\n",line); rb--; /* reset counter */ } if (lb == rb) lbl=0; break; case '(': if (lpl == 0) lpl=line; lp++; break; case ')': rp++; if (rp > lp) { fprintf(stderr,"line %d: unmatched parenthesis\n",line); rp--; /* reset counter */ } if (lp == rp) lpl=0; break; case '$': if (c1 == '$') /* double dollar sign */ { if (ld == 0) { fprintf(stderr,"line %d: single dollar sign is closed by a duble dollar sign\n",line); c=' '; /* reset the dollar sign */ break; } if (ldd == 1) { rdd=1; /* right double dollar sign */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",lddl,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } else { ldd=1; /* left double dollar sign */ lddl=line; /* line number */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces before equation, first opened at line %d\n",lddl,lbr-rbr,lbrl); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets before equation, first opened at line %d\n",lddl,lb-rb,lbl); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses before equation, first opened at line %d\n",lddl,lp-rp,lpl); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } } if (ld == 1) rd=1; /* right dollar sign */ else { ld=1; /* left dollar sign */ ldl=line; /* line number */ warn=0; /* no warning has been given */ } break; case '\\': /* check for \begin{...} and \end{...} */ i = get_file_word(fp,w,&line,&cc); if (i == 0 && cc == '[') { if (disp == 1) fprintf(stderr,"line %d: displayed equation starts, previous one at line %d not closed\n",line,disp_line); disp=1; /* left \] */ disp_line=line; /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces before equation\n",line,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets before equation\n",line,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses before equation\n",line,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } else if (i == 0 && cc == ']') { if (disp == 0) fprintf(stderr,"line %d: displayed equation ends but no beginning\n",line); disp=0; /* right \] */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",line,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",line,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses in equation\n",line,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } else if (i == 0 && cc == '(') { if (form == 1) fprintf(stderr,"line %d: formula starts but previous one not closed\n",line); form=1; /* left \( */ lform=line; /* line of \( */ } else if (i == 0 && cc == ')') { if (form == 0) fprintf(stderr,"line %d: formula ends but no beginning\n",line); form=0; /* right \) */ } else if (strcmp(w,"begin") == 0) { (void) get_file_word(fp,w,&line,&cc); if ((j=is_new_env(w,env_count)) < 0) { j = env_count; env[j].env_beg = 0; env[j].env_end = 0; p = (char *) malloc((unsigned)(i*sizeof(char))); strcpy(p,w); env[env_count++].env_name = p; } env[j].beg_line = line; env[j].env_beg++; /* Give warning about unclosed openings before these environments */ if (strcmp(env[j].env_name,"equation") == 0 || strcmp(env[j].env_name,"eqnarray") == 0 || strcmp(env[j].env_name,"eqnarray*") == 0 || strcmp(env[j].env_name,"displaymath") == 0) { if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces before environment ``%s'', first opened at line %d\n",line,lbr-rbr,env[j].env_name,lbrl); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets before environment ``%s'', first opened at line %d\n",line,lb-rb,env[j].env_name,lbl); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses before environment ``%s'', first opened at line %d\n",line,lp-rp,env[j].env_name,lpl); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } } else if (strcmp(w,"end") == 0) { (void) get_file_word(fp,w,&line,&cc); if ((j=is_new_env(w,env_count)) < 0) fprintf(stderr,"line %d: unmatched end for environment ``%s''\n",line,w); else { env[j].env_end++; if (env[j].env_end > env[j].env_beg) { fprintf(stderr,"line %d: unmatched end for environment ``%s''\n",line, env[j].env_name); env[j].env_end--; /* reset */ } /* Give warning about unclosed openings in these environments */ if (strcmp(env[j].env_name,"equation") == 0 || strcmp(env[j].env_name,"eqnarray") == 0 || strcmp(env[j].env_name,"eqnarray*") == 0 || strcmp(env[j].env_name,"displaymath") == 0) { if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in environment ``%s''\n", line,lbr-rbr,env[j].env_name); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in environment ``%s''\n", line,lb-rb,env[j].env_name); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses in environment ``%s''\n", line,lp-rp,env[j].env_name); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } } } else if (strcmp(w,"def") == 0) (void) def_file(fp,&line,1); else if (strcmp(w,"newcommand") == 0) (void) comm_file(fp,&line,1); else if (strcmp(w,"newenvironment") == 0) (void) getenv_file(fp,&line,1); else if (i > 0) fseek(fp,-1,1); break; default: break; } c1=c; /* update previous character */ if (ld == 1 && rd == 1) {ld=0.; rd=0.;} /* matched dollar signs */ if (ldd == 1 && rdd == 1) {ldd=0.; rdd=0.;} /* matched double dollar signs */ } if ((lbr-rbr) > 0) fprintf(stderr,"file ends: %d unclosed left braces, first opened at line %d \n",lbr-rbr,lbrl); if ((lb-rb) > 0) fprintf(stderr,"file ends: %d unclosed left brackets, first opened at line %d\n",lb-rb,lbl); if ((lp-rp) > 0) fprintf(stderr,"file ends: %d unclosed left parentheses, first opened at line %d\n",lp-rp,lpl); if (ld == 1) fprintf(stderr,"file ends: single dollar sign opened at line %d unclosed\n",ldl); if (ldd == 1) fprintf(stderr,"file ends: double dollar sign opened at line %d unclosed\n",lddl); if (disp == 1) fprintf(stderr,"file ends: displayed equation opened at line %d unclosed\n",disp_line); if (form == 1) fprintf(stderr,"file ends: formula opened at line %d unclosed\n",lform); for (i=0; i<env_count; i++) if (env[i].env_beg > env[i].env_end) fprintf(stderr,"file ends: enviornment ``%s'' begun at line %d not ended\n",env[i].env_name,env[i].beg_line); } SHAR_EOF fi # end of overwriting check if test -f 'README' then echo shar: will not over-write existing file "'README'" else cat << \SHAR_EOF > 'README' TeXTools Version 1.0 Date: 1/25/87 Copyright (C) 1987 by Kamal Al-Yahya This directory contains some filters that were developed at the Stanford Exploration Project (SEP), Geophysics Department, by Kamal Al-Yahya. Copying them to any other machine is permitted without prior permission provided that copyright messages are kept, no profit is made by copying the files, and modifications are clearly documented and noted in the edit history below. -------------------------------------------------------------------------- EDIT HISTORY: -------------------------------------------------------------------------- Acknowledgment: Many users at the SEP gave valuable feedbacks that improved the programs. The main programs have names that end with either 1 or 2 (e.g. detex1.c, detex2.c). Those ending with 2 are used in makefile.par and can be used only by those who have getpar(). This enables them to use in= and out= for input and output files specifications in addition to what can be done in files ending with 1. The maximum number of characters in a document is set by MAXLEN (in setups.h) to be 65535. If the limit of unsigned integers in your machine is lower than this, change this number accordingly. To install: - modify MAXLEN in setups.h if necessary. - choose either makefile or makefile.par (as explained above). - type 'make'. - test the programs on the testfile provided. - move the executables to a common path (like /usr/local/bin). - type 'make clean'. The following files should be in this directory: README this file setups.h an include file used by all programs. testfile a file that demonstrates how these programs work inc_file an include file that is opened by testfile inc_file2.tex another include file makefile what else but a makefile makefile.par a makefile that assumes you have access to getpar() detex1.c strips TeX's commands from the document detex2.c same as detex1.c but assumes you have access to getpar() texeqn1.c picks displayed equations from a document texeqn2.c same as texeqn1.c but assumes you have access to getpar() texexpand1.c expands the document by opening \input and \include files texexpand2.c same as texexpand1.c but assumes you have access to getpar() texmatch1.c checks for matching braces, brackets, parentheses, and dollar signs texmatch2.c same as texmatch1.c but assumes you have access to getpar() DeTeX.c subroutine to strip TeX's commands from the document Eqn.c subroutine to extracts equations Expand.c subroutine to expand the document Match.c subroutine that checks the matching subs.c subroutines used by the programs TEX a shell that can be used to run all TeX processing texspell shell that runs spell on TeX documnets detex.1 manual page for detex texeqn.1 manual page for texeqn texexpand.1 manual page for texexpand texmatch.1 manual page for texmatch texspell.1 manual page for texspell TEX.1 manual page for TEX Feedbacks are welcome. E-mail: try any of these kamal@hanauma.stanford.edu kamal%hanauma@score.stanford.edu SHAR_EOF fi # end of overwriting check if test -f 'TEX' then echo shar: will not over-write existing file "'TEX'" else cat << \SHAR_EOF > 'TEX' #! /bin/csh -f # # Usage: TEX [-flags ...] filename # # The various flags are described below, but only one filename should # be given; stdin is not used. File types are indicated by the filename # suffix. Input files may have one of the following suffixes: # .tex -- a file with tex commands, equations. # .dvi -- device independent format. # .ver -- output of verser1 (for the varian or AED) # .imp -- output of dvi-imagen (or dviimp) # Anything else is assumed to be in .tex format. # If TEX sees a .dvi, .ver, or .imp suffix, it will skip ahead to the right # point in the processing sequence. Specifically, # texeqn accepts .tex, outputs .tex # tex accepts .tex, outputs .dvi and .log # latex accepts .tex, outputs .dvi and .log # verser1 accepts .dvi, outputs .ver (for the varian or AED, not on hanuma). # lpr accepts .ver, outputs raster # ipr accepts .imp, outputs raster # # Flags: # -latex uses LaTeX. # -log saves a log file from the tex run in filename.log. # -d quits once the .dvi file has been made. # -x makes two passes on the (latex) input, so cross-references # are resolved. # -v output device is the varian (imagen is the default) # -q quits once the .imp file has been made if the imagen is the target printer # or after the .ver file (i.e. after verser1 stage) if the AED or the varian # is the target printer. # -eqn strips out the equations with texeqn and typeset them. # # Authors: Kamal Al-Yahya, Jeff Thorson, and Chuck Sword, Stanfor University # umask 0 onintr removal set name=() host=() set destdir = /usr/local set tmp = TEX$$ set device = imagen set st = 0 unset latex x d q eqn log if ($#argv == 0) then echo "usage: TEX [-latex] [-eqn] [-log] [-d] [-q] [-x] filename" exit(-1) endif while ($#argv > 0 && !($?inf)) switch ($argv[1]) case -latex: set latex breaksw case -x: set x breaksw case -q: set q breaksw case -d: set d breaksw case -v: set device = varian breaksw case -eqn: set eqn breaksw case -log: set log breaksw case -*: echo unknown flag $argv[1], ignored breaksw default: set inf = $argv[1] if !(-e $inf) then # filename not found, try with .tex ending if !(-e $inf.tex) then echo $0 'cannot find file' $inf. exit(-1) else set inf = ($inf.tex) endif endif breaksw endsw shift argv end set name = $inf:t set sname = $name:r set name = $cwd/$name set suffix = $name:e if ($suffix == dvi) then echo TEX: starting with .dvi file set name = $name:r set dvifile = $inf goto dvi endif if ($suffix == ver) then echo TEX: starting with .ver file set name = $name:r set verfile = $inf goto ver endif if ($suffix == imp) then echo TEX: starting with .imp file set name = $name:r set impfile = $inf goto imp endif if ($suffix == tex || $suffix == eqn) then set name = $name:r endif echo "\batchmode" > $tmp.tex if ($?eqn) then $destdir/texeqn < $inf >> $tmp.tex else cat $inf >> $tmp.tex endif echo "\bye" >> $tmp.tex # Choose tex or latex if ($?latex) then if (-e $name.aux) then cp $name.aux $tmp.aux endif $destdir/latex $tmp:t if ($status != 0) then goto oops else if (-e $tmp.aux) then cp $tmp.aux $name.aux endif endif if ($?x) then echo "Starting second pass" $destdir/latex $tmp if ($status != 0) then goto oops endif if (-e $tmp.aux) then cp $tmp.aux $name.aux endif endif else $destdir/tex $tmp if ($status != 0) then oops: echo TEX could not process your file. echo Error messages are in $name.log mv -f $tmp.log $name.log set st = -1 goto removal endif endif if ($?log) then mv -f $tmp.log $name.log if (-e $tmp.aux) then mv -f $tmp.aux $name.aux endif endif set dvifile = $tmp.dvi if ($?d) then mv -f $dvifile $name.dvi goto removal endif dvi: if($device == imagen) then $destdir/dvi-imagen -s $dvifile > $tmp.imp if ($?q) then mv -f $tmp.imp $name.imp goto removal endif set impfile = $tmp.imp imp: (echo -n \@document\(owner \"$user\", site \"$host\", spooldate \ \"`date`\", language \"imPress\", jobheader off, \ jamresistance on\) ; cat $impfile ) | $destdir/ipr goto removal endif if($device == varian) then $destdir/verser1 < $dvifile > $tmp.ver if ($status != 0) then echo TEX bombed out on verser1. set st = -1 goto removal endif set verfile = $tmp.ver if ($?q) then mv -f $verfile $name.ver goto removal endif ver: lpr -d -s -Pvarian $tmp.ver endif removal: /bin/rm -f $tmp.tex $tmp.log $tmp.dvi $tmp.ver $tmp.imp $tmp.aux exit($st) SHAR_EOF chmod +x 'TEX' fi # end of overwriting check if test -f 'TEX.1' then echo shar: will not over-write existing file "'TEX.1'" else cat << \SHAR_EOF > 'TEX.1' .TH TEX 1 2/2/84 .UC 4 .SH NAME TEX \- .I TeX and .I LaTeX typesetter and printer. .SH SYNOPSIS .B TEX [ options ] .I filename .SH DESCRIPTION .I TEX processes a file and sends it to a printer. The default is the Imagen; other devices can be used if available at the site. .PP The input to .I TEX does not have to be the raw manuscript. .I TEX can be given a .I .dvi file (which results from using the .B -d option), or .I .imp and .I .ver files (which result from using the .B -q option), and it will proceed from and end at the appropriate stage. .br The file name does not have to end with .I tex. .sp 2 OPTIONS : .br .TP .B \-latex uses LaTeX. See the LaTeX manual. .TP .B \-x makes two passes on the .I LaTeX input to resolve cross-references. .TP .B \-eqn uses .B texeqn to extract the equations. .TP .B \-log saves messages from the .B tex run in .I filename .B .log and saves messages from LaTeX run in .I filename .B .aux .TP .B \-d quits once the .I dvi file is produced without producing a hardcopy. .TP .B \-q (for quiescent) intermediate output is not spooled to the printing device. .TP .B \-v output device is the varian (default is the imagen). .fi .SH SEE ALSO tex(1), texeqn(1), texmatch(1), detex(1) .SH FILES file.aux the auxiliary file used by LaTeX for labeling figures. .br The default is to remove the following files at the end of the run: .br TE????.dvi the device independent file. .br TE????.log the log file. .br TE????.imp the impress file; can be printed by .B ipr file. .SH BUGS Only one file can be processed at a time. .br Drivers flags are not incorporated. Add the ones you need. .SH AUTHOR Kamal Al-Yahya .br Jeff Thorson .br Chuck Sword SHAR_EOF fi # end of overwriting check if test -f 'detex.1' then echo shar: will not over-write existing file "'detex.1'" else cat << \SHAR_EOF > 'detex.1' .TH detex 1 2/27/86 .UC 4 .SH NAME detex \- a filter to strip TeX and LaTeX's commands from a file. .SH SYNOPSIS .B detex [-iw] .I file1 [file2 ......] .br or .B detex [-iw] .I < file .br .SH DESCRIPTION TeX and LaTeX have control characters that .B spell and other .I troff -dependent processors (like diction) do not recognize. .I Detex works as a preprocessor by filtering those control characters. The output can then be piped to the next process. The output can be saved by redirecting the standard output. .I Detex does not break the document into individual words. It merely .I erases the control sequences. .br In-line or displayed equation are not passed to the output. Also, the character '%' is recognized as a comment indicator and the commented text is not passed to the output. .br .I Detex recognizes and opens files called by TeX's and LaTeX's \\input and \\include commands. The .B -i flag makes .I detex ignore these commands. The file name has to be correct relative to the current working directory. If it cannot open the file nor file_name.tex, it will give a non-fatal error message and proceed. .br Warning is given if suspected unmatching is detected. Use the .B -w flag to suppress these warnings. .SH DIAGNOSTICS Nesting of \\input and \\include is allowed but the number of opened files must not exceed the system's limit on the number of simultaneously opened files (normally < 20). .br Displayed material is regarded as mathematical equations and is ignored. .br White spaces withing LaTeX's \\begin{...} or \\end{...} are not allowed for. .SH SEE ALSO texexpand(1), texeqn(1), texmatch(1). .SH AUTHOR Kamal Al-Yahya, Stanford University SHAR_EOF fi # end of overwriting check if test -f 'detex1.c' then echo shar: will not over-write existing file "'detex1.c'" else cat << \SHAR_EOF > 'detex1.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ /* detex: strips TeX's and LaTeX's commands */ char *documentation[] = { " SYNTAX", " detex [-i] file1 [file2 .....]", " or detex [-i] < file1 [file2 ....]", "", "See the manual page for more details.", "", " Flag:", " -i: ignores TeX's and LaTeX's \input and \include commands", " -w: matching is not checked", "", }; /* Author: Kamal Al-Yahya, Stanford University, 11/1/83 */ /* Last modified: 1/25/87 */ int doclength = { sizeof documentation/sizeof documentation[0] }; #include "setups.h" #ifdef tops20 #define TEMPFILE "texXXXXXX" #else #define TEMPFILE "/tmp/texXXXXXX" #endif #ifdef MSC #else struct sgttyb ttystat; #endif extern char *mktemp(); char scratch_file[MAXWORD]; int wflag; int xargc; char **xargv; main(argc,argv) int argc; char *argv[]; { char *buf; FILE *temp,*scr; register char *cptr; int piped_in; int iflag,i; if (((buf = (char *)malloc(MAXLEN*sizeof(char))) == (char *)NULL)) { fprintf(stderr,"detex: Cannot malloc() internal buffer space\n\ Need an array of %d characters\n",MAXLEN); exit(-1); } /* If no arguments, and not in a pipeline, self document */ #ifdef MSC /* MS-DOS cannot distinguish piped input from no input */ piped_in = (argc == 1); #else piped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat); #endif if (argc == 1 && !piped_in) { for( i=0; i<doclength; i++) printf("%s\n",documentation[i]); exit (0); } /* process option flags */ xargc = argc; xargv = argv; for (xargc--,xargv++; xargc; xargc--,xargv++) { cptr = *xargv; if( *cptr=='-' ) { while( *(++cptr)) { switch( *cptr ) { case 'i': iflag=1; break; case 'w': wflag=1; break; default: fprintf(stderr, "detex: unknown flag -%c\n",*cptr); break; } } } } /* first process pipe input */ if(piped_in) { /* need to buffer; can't seek in pipes */ /* make a temporary and volatile file in /tmp */ strcpy(scratch_file,TEMPFILE); mktemp(scratch_file); if ((scr=fopen(scratch_file,"w")) == (FILE *)NULL) { fprintf(stderr, "detex: Cannot open scratch file [%s]\n",scratch_file); exit(-1); } scrbuf(stdin,scr); fclose(scr); scr=fopen(scratch_file,"r"); unlink(scratch_file); if (wflag != 1) { fprintf(stderr,"Checking matching...\n"); Match(scr); fseek(scr,0,0); } /* either expand or buffer */ if (iflag != 1) { Expand(scr,buf); fclose(scr); } else { tmpbuf(scr,buf); fclose(scr); } if (wflag != 1) fprintf(stderr,"Checking matching done\n\n"); DeTeX(buf,stdout); fclose(scr); } /* then process input line for arguments and assume they are input files */ xargc = argc; xargv = argv; for (xargc--,xargv++; xargc; xargc--,xargv++) { cptr = *xargv; if( *cptr=='-' ) continue; /* this is a flag */ if((temp=fopen(cptr,"r")) != (FILE *)NULL) { if (wflag != 1) { fprintf(stderr,"Checking matching...\n"); fprintf(stderr,"%s:\n",cptr); Match(temp); fprintf(stderr,"\n"); fseek(temp,0,0); } /* either expand or buffer */ if (iflag != 1) { Expand(temp,buf); fclose(temp); } else { tmpbuf(temp,buf); fclose(temp); } if (wflag != 1) fprintf(stderr,"Checking matching done\n\n"); DeTeX(buf,stdout); fclose(temp); } else fprintf(stderr,"detex: Cannot open %s\n",cptr); } } SHAR_EOF fi # end of overwriting check if test -f 'detex2.c' then echo shar: will not over-write existing file "'detex2.c'" else cat << \SHAR_EOF > 'detex2.c' /* COPYRIGHT (C) 1987 Kamal Al-Yahya */ /* detex: strips TeX's and LaTeX's commands */ char *documentation[] = { " SYNTAX", " detex [-iw] [parameters] [inputfiles]", "", " flags:", " -i ignores TeX's and LaTeX's \input and \include commands", " -w does not check matching", "", " parameters:", " in=filename filename is the input file", " (Default: in=stdin)", "", " out=filename filename is the output file", " (Default: out=stdout)", "" }; /* Author: Kamal Al-Yahya, Stanford University, 11/1/83 */ /* Last modified: 1/25/87 */ int doclength = { sizeof documentation/sizeof documentation[0] }; #include "setups.h" #ifdef tops20 #define TEMPFILE "texXXXXXX" #else #define TEMPFILE "/tmp/texXXXXXX" #endif char string[MAXWORD], filename[MAXWORD], scratch_file[MAXWORD]; FILE *out_file; extern char *mktemp(); #ifdef MSC #else struct sgttyb ttystat; #endif int wflag; int xargc; char **xargv; main(argc,argv) int argc; char *argv[]; { char *buf; FILE *temp,*scr; register char *cptr; int piped_in; int iflag,i; if (((buf = (char *)malloc(MAXLEN*sizeof(char))) == (char *)NULL)) { fprintf(stderr,"detex: Cannot malloc() internal buffer space\n\ Need an array of %d characters\n",MAXLEN); exit(-1); } /* If no arguments, and not in a pipeline, self document */ #ifdef MSC /* MS-DOS cannot distinguish piped input from no input */ piped_in = (argc == 1); #else piped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat); #endif if (argc == 1 && !piped_in) { for( i=0; i<doclength; i++) printf("%s\n",documentation[i]); exit (0); } out_file = stdout; /* default output */ /* process option flags */ xargc = argc; xargv = argv; for (xargc--,xargv++; xargc; xargc--,xargv++) { cptr = *xargv; if( *cptr=='-' ) { while( *(++cptr)) { switch( *cptr ) { case 'i': iflag=1; break; case 'w': wflag=1; break; default: fprintf(stderr, "detex: unknown flag -%c\n",*cptr); break; } } } } /* process getpar parameters */ xargc = argc; xargv = argv; if(getpar_("out","s",string)) { sscanf(string,"%s",filename); if((temp=fopen(filename,"w")) == NULL) fprintf(stderr,"detex: Cannot open output file %s\n",filename); else out_file = temp; } /* first process pipe input */ if(piped_in) { /* need to buffer; can't seek in pipes */ /* make a temporary and volatile file in /tmp */ strcpy(scratch_file,TEMPFILE); mktemp(scratch_file); if ((scr=fopen(scratch_file,"w")) == (FILE *)NULL) { fprintf(stderr, "detex: Cannot open scratch file [%s]\n",scratch_file); exit(-1); } scrbuf(stdin,scr); fclose(scr); scr=fopen(scratch_file,"r"); unlink(scratch_file); if (wflag != 1) { fprintf(stderr,"Checking matching...\n"); Match(scr); fseek(scr,0,0); } /* either expand or buffer */ if (iflag != 1) { Expand(scr,buf); fclose(scr); } else { tmpbuf(scr,buf); fclose(scr); } if (wflag != 1) fprintf(stderr,"Checking matching done\n\n"); DeTeX(buf,out_file); fclose(scr); } /* next process in=inputfiles */ if(getpar_("in","s",string)) { sscanf(string,"%s",filename); if((temp=fopen(filename,"r")) != NULL) { if (wflag != 1) { fprintf(stderr,"Checking matching...\n"); fprintf(stderr,"%s:\n",filename); Match(temp); fprintf(stderr,"\n"); fseek(temp,0,0); } /* either expand or buffer */ if (iflag != 1) { Expand(temp,buf); fclose(temp); } else { tmpbuf(temp,buf); fclose(temp); } if (wflag != 1) fprintf(stderr,"Checking matching done\n\n"); DeTeX(buf,out_file); fclose(temp); } else fprintf(stderr,"detex: Cannot open %s\n",filename); } /* then process input line for arguments and assume they are input files */ xargc = argc; xargv = argv; for (xargc--,xargv++; xargc; xargc--,xargv++) { cptr = *xargv; if( *cptr=='-' ) continue; /* this is a flag */ while (*cptr) { if (*cptr == '=') break; /* this is for getpar */ cptr++; } if (*cptr) continue; cptr = *xargv; if((temp=fopen(cptr,"r")) != (FILE *)NULL) { if (wflag != 1) { fprintf(stderr,"Checking matching...\n"); fprintf(stderr,"%s:\n",cptr); Match(temp); fprintf(stderr,"\n"); fseek(temp,0,0); } /* either expand or buffer */ if (iflag != 1) { Expand(temp,buf); fclose(temp); } else { tmpbuf(temp,buf); fclose(temp); } if (wflag != 1) fprintf(stderr,"Checking matching done\n\n"); DeTeX(buf,out_file); fclose(temp); } else fprintf(stderr,"detex: Cannot open %s\n",cptr); } } SHAR_EOF fi # end of overwriting check if test -f 'inc_file' then echo shar: will not over-write existing file "'inc_file'" else cat << \SHAR_EOF > 'inc_file' This is an included file. when texexpand is run on testfile, this file should be inserted. (unmatching in inc_file)) END OF INSERTED FILE. SHAR_EOF fi # end of overwriting check if test -f 'inc_file2.tex' then echo shar: will not over-write existing file "'inc_file2.tex'" else cat << \SHAR_EOF > 'inc_file2.tex' This is another included file SHAR_EOF fi # end of overwriting check if test -f 'makefile' then echo shar: will not over-write existing file "'makefile'" else cat << \SHAR_EOF > 'makefile' CFLAGS = -O LINTFLAGS = -abchnpux CSUBS = Expand.c Match.c subs.c OSUBS = Expand.o Match.o subs.o B = default: all all: texexpand detex texeqn texmatch texexpand: texexpand1.o $(OSUBS) cc $(CFLAGS) -o $(B)texexpand texexpand1.o $(OSUBS) detex: detex1.o DeTeX.o $(OSUBS) cc $(CFLAGS) -o $(B)detex detex1.o DeTeX.o $(OSUBS) texeqn: texeqn1.o Eqn.o $(OSUBS) cc $(CFLAGS) -o $(B)texeqn texeqn1.o Eqn.o $(OSUBS) texmatch: texmatch1.o $(OSUBS) cc $(CFLAGS) -o $(B)texmatch texmatch1.o $(OSUBS) lint: lint $(LINTFLAGS) texexpand1.c $(CSUBS) > texexpand.lnt lint $(LINTFLAGS) detex1.c DeTeX.c $(CSUBS) > detex.lnt lint $(LINTFLAGS) texeqn1.c Eqn.c $(CSUBS) > texeqn.lnt lint $(LINTFLAGS) texmatch1.c $(CSUBS) > texmatch.lnt clean: /bin/rm -f *.o texexpand detex texeqn texmatch core *junk* SHAR_EOF fi # end of overwriting check if test -f 'makefile.msc' then echo shar: will not over-write existing file "'makefile.msc'" else cat << \SHAR_EOF > 'makefile.msc' #----------------------------------------------------------------------- # Makefile for textools # Make targets: # (none) same as all # all produces all executables # lint run lint on sources # clean remove object files # share make ../textools.sh for mailing # CFLAGS = -O LINTFLAGS = -abchnpux CSUBS = Expand.c Match.c subs.c OSUBS = Expand.o Match.o subs.o B = default: all all: texexpand detex texeqn texmatch texexpand: texexpand1.o $(OSUBS) cc $(CFLAGS) -o $(B)texexpand texexpand1.o $(OSUBS) detex: detex1.o DeTeX.o $(OSUBS) cc $(CFLAGS) -o $(B)detex detex1.o DeTeX.o $(OSUBS) texeqn: texeqn1.o Eqn.o $(OSUBS) cc $(CFLAGS) -o $(B)texeqn texeqn1.o Eqn.o $(OSUBS) texmatch: texmatch1.o $(OSUBS) cc $(CFLAGS) -o $(B)texmatch texmatch1.o $(OSUBS) share: make clean makescript ../textools.sh * lint: lint $(LINTFLAGS) texexpand1.c $(CSUBS) > texexpand.lnt lint $(LINTFLAGS) detex1.c DeTeX.c $(CSUBS) > detex.lnt lint $(LINTFLAGS) texeqn1.c Eqn.c $(CSUBS) > texeqn.lnt lint $(LINTFLAGS) texmatch1.c $(CSUBS) > texmatch.lnt clean: \rm -f *.o core *junk* lint.lst SHAR_EOF fi # end of overwriting check if test -f 'makefile.par' then echo shar: will not over-write existing file "'makefile.par'" else cat << \SHAR_EOF > 'makefile.par' # Use this makefile if you have access to getpar(). You then # need to link with the library that provides it (e.g. -lsep below). # If you don't use the other makefile (./makefiile). CFLAGS = -O LINTFLAGS = -abchnpux CSUBS = Expand.c Match.c subs.c OSUBS = Expand.o Match.o subs.o B = default: all all: texexpand detex texeqn texmatch texexpand: texexpand2.o $(OSUBS) cc $(CFLAGS) -o $(B)texexpand texexpand2.o $(OSUBS) -lsep detex: detex2.o DeTeX.o $(OSUBS) cc $(CFLAGS) -o $(B)detex detex2.o DeTeX.o $(OSUBS) -lsep texeqn: texeqn2.o Eqn.o $(OSUBS) cc $(CFLAGS) -o $(B)texeqn texeqn2.o Eqn.o $(OSUBS) -lsep texmatch: texmatch2.o $(OSUBS) cc $(CFLAGS) -o $(B)texmatch texmatch2.o $(OSUBS) -lsep lint: lint $(LINTFLAGS) texexpand2.c $(CSUBS) > texexpand.lnt lint $(LINTFLAGS) detex2.c DeTeX.c $(CSUBS) > detex.lnt lint $(LINTFLAGS) texeqn2.c Eqn.c $(CSUBS) > texeqn.lnt lint $(LINTFLAGS) texmatch2.c $(CSUBS) > texmatch.lnt clean: /bin/rm -f *.o core *junk* lint.lst SHAR_EOF fi # end of overwriting check if test -f 'setups.h' then echo shar: will not over-write existing file "'setups.h'" else cat << \SHAR_EOF > 'setups.h' /* setup file */ #include <stdio.h> #ifdef MSC #include <string.h> #include <stdlib.h> /* for type declarations */ #include <io.h> /* for type declarations */ #else #include <strings.h> #include <sys/ioctl.h> #include <sgtty.h> #endif #define MAXLEN 65535 /* maximum number of chars in a document */ #define MAXWORD 100 /* maximum word length */ #define MAXLINE 250 /* maximum line length */ #define MAXENV 50 /* maximum number of environments */ extern char *malloc(); #ifdef IN_TM /* can only declare globals once */ #else extern #endif struct environment { char *env_name; /* name of environment */ int env_beg; /* counter for \begin{environment} */ int env_end; /* counter for \end{environment} */ int beg_line; /* line number for \beging{environment} */ } env[MAXENV]; #ifdef ANSI int begin_to_end(char*,char*); int command(char*,char*); int comm_file(FILE*,int*); int comment(char*); int def(char*,char*); int def_file(FILE*,int*); int display(char*); int dollar(char*,FILE*); int formula(char*); int get_buf_word(char*,char*); int getenv_file(FILE*,int*); int get_file_word(FILE*,char*,int*,int*); int is_new_env(char*,int); int one_dollar(char*); void scrbuf(FILE*,FILE*); void tmpbuf(FILE*,char*); int two_dollars(char*,FILE*); #else int begin_to_end(); int command(); int comm_file(); int comment(); int def(); int def_file(); int display(); int dollar(); int formula(); int get_buf_word(); int getenv_file(); int get_file_word(); int is_new_env(); int one_dollar(); void scrbuf(); void tmpbuf(); int two_dollars(); #endif SHAR_EOF fi # end of overwriting check ############################## CONNECT HERE #############################