home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char *RCSid = "$Id: doc2tex.c%v 3.38.2.70 1993/02/08 02:19:29 woo Exp woo $";
- #endif
-
-
- /*
- * doc2tex.c -- program to convert Gnuplot .DOC format to LaTeX document
- * Also will work for VMS .HLP files.
- * Modified by Russell Lang from hlp2ms.c by Thomas Williams
- * Extended by David Kotz to support quotes ("), backquotes, tables.
- *
- * usage: doc2tex [file.doc [file.tex]]
- *
- * where file.doc is a Gnuplot .DOC file, and file.tex will be an
- * article document suitable for printing with LaTeX.
- *
- * typical usage for GNUPLOT:
- *
- * doc2tex gnuplot.doc gnuplot.tex
- * latex gnuplot.tex ; latex gnuplot.tex
- */
-
- #include <stdio.h>
- #include <ctype.h>
-
- #define MAX_NAME_LEN 256
- #define MAX_LINE_LEN 256
- #define TRUE 1
- #define FALSE 0
-
- typedef int boolean;
-
- boolean intable = FALSE;
- boolean verb = FALSE;
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- FILE * infile;
- FILE * outfile;
- infile = stdin;
- outfile = stdout;
- if (argc > 3) {
- fprintf(stderr,"Usage: %s [infile [outfile]]\n", argv[0]);
- exit(1);
- }
- if (argc >= 2)
- if ( (infile = fopen(argv[1],"r")) == (FILE *)NULL) {
- fprintf(stderr,"%s: Can't open %s for reading\n",
- argv[0], argv[1]);
- exit(1);
- }
- if (argc == 3)
- if ( (outfile = fopen(argv[2],"w")) == (FILE *)NULL) {
- fprintf(stderr,"%s: Can't open %s for writing\n",
- argv[0], argv[2]);
- }
-
- init(outfile);
- convert(infile,outfile);
- finish(outfile);
- exit(0);
- }
-
-
- init(b)
- FILE *b;
- {
- (void) fputs("\\input{titlepag.tex}\n",b);
- }
-
-
- convert(a,b)
- FILE *a,*b;
- {
- static char line[MAX_LINE_LEN];
-
- while (fgets(line,MAX_LINE_LEN,a)) {
- process_line(line, b);
- }
- }
-
- process_line(line, b)
- char *line;
- FILE *b;
- {
- switch(line[0]) { /* control character */
- case '?': { /* interactive help entry */
- break; /* ignore */
- }
- case '@': { /* start/end table */
- if (intable) {
- (void) fputs("\\hline\n\\end{tabular}\n", b);
- (void) fputs("\\end{center}\n",b);
- intable = FALSE;
- } else {
- if (verb) {
- (void) fputs("\\end{verbatim}\n",b);
- verb=FALSE;
- }
- (void) fputs("\n\\begin{center}\n", b);
- (void) fputs("\\begin{tabular}{|ccl|} \\hline\n", b);
- intable = TRUE;
- }
- /* ignore rest of line */
- break;
- }
- case '#': { /* latex table entry */
- if (intable)
- (void) fputs(line+1, b); /* copy directly */
- else
- fprintf(stderr, "error: # line found outside of table\n");
- break;
- }
- case '%': { /* troff table entry */
- break; /* ignore */
- }
- case '\n': /* empty text line */
- case ' ': { /* normal text line */
- if (intable)
- break; /* ignore while in table */
- if (line[1] == ' ') {
- /* verbatim mode */
- if (!verb) {
- (void) fputs("\\begin{verbatim}\n",b);
- verb=TRUE;
- }
- (void) fputs(line+1,b);
- } else {
- if (verb) {
- (void) fputs("\\end{verbatim}\n",b);
- verb=FALSE;
- }
- if (line[0] == '\n')
- puttex(line,b); /* handle totally blank line */
- else
- puttex(line+1,b);
- }
- break;
- }
- default: {
- if (isdigit(line[0])) { /* start of section */
- if (!intable) /* ignore while in table */
- section(line, b);
- } else
- fprintf(stderr, "unknown control code '%c' in column 1\n",
- line[0]);
- break;
- }
- }
- }
-
- /* process a line with a digit control char */
- /* starts a new [sub]section */
-
- section(line, b)
- char *line;
- FILE *b;
- {
- static char string[MAX_LINE_LEN];
- int sh_i;
-
- if (verb) {
- (void) fputs("\\end{verbatim}\n",b);
- verb=FALSE;
- }
- (void) sscanf(line,"%d %[^\n]s",&sh_i,string);
- switch(sh_i)
- {
- case 1:
- (void) fprintf(b,"\\section{");
- break;
- case 2:
- (void) fprintf(b,"\\section{");
- break;
- case 3:
- (void) fprintf(b,"\\subsection{");
- break;
- case 4:
- (void) fprintf(b,"\\subsubsection{");
- break;
- default:
- case 5:
- (void) fprintf(b,"\\paragraph{");
- break;
- }
- if (islower(string[0]))
- string[0] = toupper(string[0]);
- puttex(string,b);
- (void) fprintf(b,"}\n");
- }
-
- /* put text in string str to file while buffering special TeX characters */
- puttex(str,file)
- FILE *file;
- register char *str;
- {
- register char ch;
- static boolean inquote = FALSE;
-
- while( (ch = *str++) != '\0') {
- switch(ch) {
- case '#':
- case '$':
- case '%':
- case '&':
- case '_':
- case '{':
- case '}':
- (void) fputc('\\',file);
- (void) fputc(ch,file);
- break;
- case '\\':
- (void) fputs("$\\backslash$",file);
- break;
- case '~':
- (void) fputs("\\~{\\ }",file);
- break;
- case '^':
- (void) fputs("\\verb+^+",file);
- break;
- case '>':
- case '<':
- case '|':
- (void) fputc('$',file);
- (void) fputc(ch,file);
- (void) fputc('$',file);
- break;
- case '"':
- /* peek at next character: if space, end of quote */
- if (*str == '\0' || isspace(*str) || ispunct(*str))
- (void) fputs("''", file);
- else
- (void) fputs("``", file);
- break;
- case '`': /* backquotes mean boldface */
- if (inquote) {
- fputs("}", file);
- inquote = FALSE;
- } else {
- fputs("{\\bf ", file);
- inquote = TRUE;
- }
- break;
- default:
- (void) fputc(ch,file);
- break;
- }
- }
- }
-
-
- finish(b)
- FILE *b;
- {
- (void) fputs("\\end{document}\n",b);
- }
-