diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/tr2latex/tr2latex.c |
Initial commit
Diffstat (limited to 'support/tr2latex/tr2latex.c')
-rw-r--r-- | support/tr2latex/tr2latex.c | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/support/tr2latex/tr2latex.c b/support/tr2latex/tr2latex.c new file mode 100644 index 0000000000..59202b574c --- /dev/null +++ b/support/tr2latex/tr2latex.c @@ -0,0 +1,222 @@ +/* +** tr2latex - troff to LaTeX converter +** COPYRIGHT (C) 1987 Kamal Al-Yahya, 1991,1992 Christian Engel +** +** Module: tr2latex.c +** +** This module contains the main function inititating the translation +** and supporting the Usage. +*/ + +#define MAIN + +#include "getopt.h" +#include "setups.h" +#include "protos.h" +#include <assert.h> + +const char *version = "2.6"; + +int man, /* option -m: manual page */ + fontsize, /* option -9/-10/-11/-12: font size */ + twoside, /* option -t: twoside */ + piped_in; + +char *document = "article"; /* document type, see also -s option */ + +FILE *out_file; /* in case they can't use UN*X redirecting or piping */ + +char *prgname; +char inbuf[MAXLEN], + outbuf[MAXLEN]; + +static void usage (int exitcode) +{ + printf ("tr2latex (c) 1986/1987 Kamal Al-Yahya, 1991 C. Engel, 2008..2016 Dirk Jagdmann\n" + "Version %s\n", + version); + printf ("tr2latex - troff to LaTeX converter\n" + "SYNTAX: tr2latex [-m] [-t] [-<n>] [-s <style>] [-o <outfile>] [-d] [-b] [<file>...]\n" + "options: -m for manual\n" + " -t twoside page style\n" + " -<n> a number n gives the font size (default is 12pt\n" + " for man, 11pt otherwise)\n" + " -s <style> use documentstyle <style> (default is article)\n" + " -o <outfile> send output to <outfile> (default is stdout)\n" + " -d debug output\n" + " -b LaTeX body, don't print declarations\n" + ); + + exit (exitcode); +} + +static void process (FILE *in_file, char *f_name, char *pin, char *pout) +{ + static char sep[] = "--------------------------------------------------"; + + const size_t r = fread(pin, 1, MAXLEN, in_file); + if (r == MAXLEN) + { + fprintf(stderr, "Sorry: document is too large, you have to increase MAXLEN\n"); + exit(EXIT_FAILURE); + } + assert(r < MAXLEN); + pin[r] = EOS; + + fprintf (out_file, "%%%s\n%% start of input file: %s\n%%\n", sep, f_name); + troff_tex (pin, pout, 0, 0); + fputs (pout, out_file); + fprintf (out_file, "%%\n%% end of input file: %s\n%%%s\n", f_name, sep); +} + +int main (int argc, char *argv[]) +{ + char *pin = inbuf, + *pout = outbuf; + FILE *in_file; + time_t timeval; + int c, only_body=0; + + prgname = argv [0]; + out_file = stdout; /* default output */ + + /* process option flags */ + while((c=getopt(argc, argv, "0123456789bhmtds:o:")) != EOF) + switch(c) + { + default: + case '?': + case 'h': usage (EXIT_SUCCESS); + + case 'b': only_body=1; break; + case 'm': man = 1; break; + case 't': twoside = 1; break; + case 's': document = optarg; break; + case 'o': + if ((out_file = fopen(optarg, "w")) == NULL) + { + fprintf(stderr, "%s: can't open %s\n", prgname, optarg); + usage (EXIT_FAILURE); + } + break; + case 'd': debug_o = 1; break; + + case '0': fontsize = 10; break; + case '1': fontsize = 11; break; + case '2': fontsize = 12; break; + case '3': fontsize = 13; break; + case '4': fontsize = 14; break; + case '5': fontsize = 15; break; + case '6': fontsize = 16; break; + case '7': fontsize = 17; break; + case '8': fontsize = 18; break; + case '9': fontsize = 9; break; + } + + /* initialize spacing and indentation parameters */ + strcpy(linespacing.def_units,"\\normalbaselineskip"); + strcpy(linespacing.old_units,"\\normalbaselineskip"); + strcpy(indent.def_units,"em"); + strcpy(indent.old_units,"em"); + strcpy(tmpind.def_units,"em"); + strcpy(tmpind.old_units,"em"); + strcpy(space.def_units,"\\baselineskip"); + strcpy(space.old_units,"\\baselineskip"); + strcpy(vspace.def_units,"pt"); + strcpy(vspace.old_units,"pt"); + linespacing.value = 1.; + linespacing.old_value = 1.; + indent.value = 0.; + indent.old_value = 0.; + tmpind.value = 0.; + tmpind.old_value = 0.; + space.value = 1.; + space.old_value = 1.; + vspace.value = 1.; + vspace.old_value = 1.; + linespacing.def_value = 0; + indent.def_value = 0; + tmpind.def_value = 0; + space.def_value = 1; + vspace.def_value = 1; + + math_mode = 0; /* start with non-math mode */ + de_arg = 0; /* not a .de argument */ + + /* start of translated document */ + + timeval = time(0); + fprintf (out_file, + "%% -*-LaTeX-*-\n" + "%% Converted automatically from troff to LaTeX\n" + "%% by tr2latex %s\n" + "%% on %s" + "%% tr2latex was written by Kamal Al-Yahya at Stanford University <Kamal%%Hanauma@SU-SCORE.ARPA>\n" + "%% and substantially enhanced by Christian Engel at RWTH Aachen <krischan@informatik.rwth-aachen.de>\n" + "%% it is currently maintained by Dirk Jagdmann <doj@cubic.org>\n" + "%% visit http://www.ctan.org/pkg/tr2latex for details.\n" + "%%\n" + "%% troff input file%s:%s", + version, + ctime(&timeval), + argc>2?"s":"", + argc==1?" <stdin>":""); +#if 0 + for (argi = 1; argi < argc; argi++) + { + if (strcmp (argv [argi], "-") == 0) + fprintf (out_file, " <stdin>"); + else + fprintf (out_file, " %s", argv[argi]); + } +#endif + + if(!only_body) + { + /* document style and options */ + fprintf (out_file,"\n\n\\documentclass["); + if (fontsize == 0 && !man) + fontsize = 11; + if (fontsize != 0) + fprintf (out_file,"%dpt", fontsize); + if (twoside) + fputs (",twoside", out_file); + fprintf (out_file,"]{%s}", document); + fprintf (out_file,"\n\n\\usepackage{%s}", man? "troffman": "troffms"); + fprintf (out_file,"\n\\usepackage{textcomp}\n"); + fprintf (out_file,"\n\n\\begin{document}\n"); + } + + if (optind == argc) + process (stdin, "<stdin>", pin, pout); + else + { + for (; optind!=argc; ++optind) + { + if (strcmp (argv[optind], "-") == 0) + process (stdin, "<stdin>", pin, pout); + else if ((in_file = fopen(argv[optind],"r")) == NULL) + fprintf(stderr,"%s: Cannot open input file `%s'\n", + prgname,argv[optind]); + else + { + process (in_file, argv[optind], pin, pout); + fclose(in_file); + } + } + } + + if(!only_body) + { + /* close translated document */ + fputs("\\end{document}\n",out_file); + } + + exit(EXIT_SUCCESS); +} + +void errexit (int exitcode) +{ + fprintf (stderr, "%s: Error #%03d ", prgname, exitcode); + exit (exitcode); +} |