summaryrefslogtreecommitdiff
path: root/support/rtflatex/rtflatex.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/rtflatex/rtflatex.c
Initial commit
Diffstat (limited to 'support/rtflatex/rtflatex.c')
-rw-r--r--support/rtflatex/rtflatex.c4699
1 files changed, 4699 insertions, 0 deletions
diff --git a/support/rtflatex/rtflatex.c b/support/rtflatex/rtflatex.c
new file mode 100644
index 0000000000..a7f7385bfe
--- /dev/null
+++ b/support/rtflatex/rtflatex.c
@@ -0,0 +1,4699 @@
+/* Output from p2c 1.21alpha2-dt-Jul.95, the Pascal-to-C translator */
+/* From input file "rtflatex.pas" */
+
+
+#include "p2crtf.h"
+#include "p2c_mods.h"
+#include "p2clib_m.c"
+
+
+/* version 2.15 */
+
+
+#define lmx 511
+#define olmx 1023
+#define maxlevel 72
+#define maxkeyln 64
+#define bfslen 24
+#define numsizes 16
+#define maxfonts 128
+#define maxstyles 12
+#define max_skip_strings 8
+#define maxRTFstyles 64
+#define RTFstyle_length 128
+
+
+typedef Char string24[bfslen + 1];
+
+typedef Char string2[3];
+
+typedef Char string5[6];
+
+typedef Char string128[129];
+
+typedef Char string255[256];
+
+typedef Char exline_type[olmx];
+typedef Char string_RTFstyle[RTFstyle_length + 1];
+
+
+Static FILE *inputfile, *outputfile, *figurefile, *logfile, *skipfile;
+Static short catcode[256], digit[256], majusc[256], letter[256];
+Static string24 acc_transl[256], ftech_transl[256];
+Static Char prev_line[lmx], inpline[lmx];
+Static exline_type exline;
+Static short tex_verbose, verbose, icharz, numl, kout, kinp, prev_kinp,
+ bracelvl;
+Static short lvlcode[maxlevel + 1], tab_nb_cellx[maxlevel + 1],
+ tab_nb_ands[maxlevel + 1], tab_cellx[maxlevel + 1];
+Static Char kar, hexaone, hexatwo;
+Static string255 next_rtf;
+Static boolean removed_ok, write_log, do_it_again, no_space_conv, use_sl,
+ latex209, latex_header, base_flag, envir_closed_ok,
+ last_percent, simplify_ok, no_RTFrtf, par_to_begin;
+Static short num_styles, input_line_number, numfonts, num_word_fonts, stdsize,
+ stdkz;
+Static string24 close_kar[maxlevel + 1], form_code[maxlevel + 1],
+ bfslcode[maxlevel + 1], sizecode[maxlevel + 1],
+ currsize[maxlevel + 1], currbfsl[maxlevel + 1],
+ spacingcode[maxlevel + 1], active_RTFf[maxlevel + 1];
+Static short center_flag[maxlevel + 1], flushright_flag[maxlevel + 1],
+ math_mode[maxlevel + 1];
+Static boolean underl_flag[maxlevel + 1], auto_close[maxlevel + 1];
+Static string24 sizekey[numsizes];
+Static short sizeval[3][numsizes];
+Static short sizemags[3][numsizes];
+Static string24 newfonts[maxfonts], word_fonts[maxfonts],
+ equiv_fonts[maxfonts], font_names[maxfonts];
+Static short word_font_num[maxfonts];
+Static string255 inkeyw;
+Static short num_diff_sizes, keyw, cat, ikar, numval, numsign, num_hexa,
+ num_skip_strings, decl_font_num, num_latex_options, num_indent,
+ i, j, k, l, m, n;
+Static string24 works, worksa, worksb, latex_style, end_math_code;
+Static string24 latex_options[maxstyles + 1];
+Static string24 environ_type[11];
+Static string255 skip_strings[max_skip_strings];
+Static short leftskip, rightskip, leftcurskip, rightcurskip, save_skip,
+ space_after, displ_skip;
+Static string_RTFstyle RTFstyles[maxRTFstyles];
+Static short ref_styles[256];
+
+Static boolean clbrdrr, clbrdrl, clbrdrt, clbrdrb;
+
+/* indications to build file names of figure bitmaps */
+Static string128 figure_name, figure_path, figure_type;
+Static string24 pict_name;
+Static long rtfpicw, rtfpich, pict_char_number, pict_byte_number;
+Static short pict_last_hexa, pict_number;
+Static boolean pict_left_hexa;
+Static Char last_kar;
+Static Char inputfile_NAME[_FNSIZE];
+Static Char outputfile_NAME[_FNSIZE];
+Static Char figurefile_NAME[_FNSIZE];
+Static Char logfile_NAME[_FNSIZE];
+Static Char skipfile_NAME[_FNSIZE];
+
+
+/*---------------------------------------------------------------------------*/
+/* resets all integers to 0, all strings to '', for safety */
+
+Static Void clean_all()
+{
+ short z;
+
+ for (z = 1; z <= lmx; z++)
+ prev_line[k-1] = ' ';
+ for (z = 1; z <= lmx; z++)
+ inpline[k-1] = ' ';
+ for (z = 1; z <= olmx; z++)
+ exline[k-1] = ' ';
+
+ tex_verbose = 0;
+ verbose = 0;
+ icharz = 0;
+ numl = 0;
+ kout = 0;
+ kinp = 0;
+ prev_kinp = 0;
+ bracelvl = 0;
+
+ for (z = 0; z <= maxlevel; z++) {
+ lvlcode[z] = 0;
+ tab_nb_cellx[z] = 0;
+ tab_nb_ands[z] = 0;
+ tab_cellx[z] = 0;
+ }
+ kar = ' ';
+ hexaone = ' ';
+ hexatwo = ' ';
+
+ *next_rtf = '\0';
+ removed_ok = false;
+ write_log = false;
+ do_it_again = false;
+ no_space_conv = false;
+ use_sl = false;
+ latex209 = false;
+ latex_header = false;
+ base_flag = false;
+ envir_closed_ok = false;
+ last_percent = false;
+ simplify_ok = false;
+ no_RTFrtf = false;
+ par_to_begin = false;
+
+ num_styles = 0;
+ input_line_number = 0;
+ numfonts = 0;
+ num_word_fonts = 0;
+ stdsize = 0;
+ stdkz = 0;
+
+ for (z = 0; z <= maxlevel; z++) {
+ *close_kar[z] = '\0';
+ *form_code[z] = '\0';
+ *bfslcode[z] = '\0';
+ *sizecode[z] = '\0';
+ *currsize[z] = '\0';
+ *currbfsl[z] = '\0';
+ *spacingcode[z] = '\0';
+ *active_RTFf[z] = '\0';
+ center_flag[z] = 0;
+ flushright_flag[z] = 0;
+ math_mode[z] = 0;
+ underl_flag[z] = false;
+ auto_close[z] = false;
+ }
+ /* sizekey : array[1..numsizes] of string24; */
+ /* sizeval : array[1..3,1..numsizes] of integer; */
+ /* sizemags : array[1..3,1..numsizes] of integer; */
+ for (z = 0; z <= maxfonts - 1; z++) {
+ *newfonts[z] = '\0';
+ *word_fonts[z] = '\0';
+ *equiv_fonts[z] = '\0';
+ *font_names[z] = '\0';
+ word_font_num[z] = 0;
+ }
+ *inkeyw = '\0';
+ num_diff_sizes = 0;
+ keyw = 0;
+ cat = 0;
+ ikar = 0;
+ numval = 0;
+ numsign = 0;
+ num_hexa = 0;
+ num_skip_strings = 0;
+ decl_font_num = 0;
+ num_latex_options = 0;
+ num_indent = 0;
+ i = 0;
+ j = 0;
+ k = 0;
+ l = 0;
+ m = 0;
+ n = 0;
+ *works = '\0';
+ *worksa = '\0';
+ *worksb = '\0';
+ *latex_style = '\0';
+ *end_math_code = '\0';
+
+ for (z = 0; z <= maxstyles; z++)
+ *latex_options[z] = '\0';
+ for (z = 0; z <= 10; z++)
+ *environ_type[z] = '\0';
+ for (z = 0; z <= max_skip_strings - 1; z++)
+ *skip_strings[z] = '\0';
+ leftskip = 0;
+ rightskip = 0;
+ leftcurskip = 0;
+ rightcurskip = 0;
+ save_skip = 0;
+ space_after = 0;
+ displ_skip = 0;
+
+ for (z = 0; z <= maxRTFstyles - 1; z++)
+ *RTFstyles[z] = '\0';
+ for (z = 0; z <= 255; z++)
+ ref_styles[z] = 0;
+
+ clbrdrr = false;
+ clbrdrl = false;
+ clbrdrt = false;
+ clbrdrb = false;
+
+ /* indications to build file names of figure bitmaps */
+ *figure_name = '\0';
+ *figure_path = '\0';
+ *figure_type = '\0';
+ *pict_name = '\0';
+ rtfpicw = 0;
+ rtfpich = 0;
+ pict_char_number = 0;
+ pict_byte_number = 0;
+ pict_last_hexa = 0;
+ pict_number = 0;
+ pict_left_hexa = false;
+ last_kar = ' ';
+}
+
+
+/*---------------------------------------------------------------------------*/
+
+Static Void title()
+{
+ printf(" MICROSOFT RTF(Word[Perfect]) to LaTeX conversion\n");
+ printf(" Daniel Taupin, CNRS, 20th September 1996\n");
+ printf(" Universite de Paris-Sud, Orsay, France\n");
+ printf(" Version 2.15\n");
+ printf(" E-mail: taupin@lps.u-psud.fr\n");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* converts a hexa character into a number from 0 to 15 */
+
+Static short hx_to_i(kar)
+Char kar;
+{
+ short ikar = kar;
+ short okar;
+
+ if (ikar < '0') {
+ okar = 0;
+ return okar;
+ }
+ if (ikar <= '9') {
+ okar = ikar - '0';
+ return okar;
+ }
+ if (ikar <= 'Z') {
+ okar = ikar + 10 - 'A';
+ return okar;
+ }
+ if (ikar <= 'z')
+ okar = ikar + 10 - 'a';
+ else
+ okar = 0;
+ /*END IF ikar */
+ return okar;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* converts a string of two hexa character into a number from 0 to 255 */
+
+Static short hs_to_i(input_stg)
+Char *input_stg;
+{
+ return (hx_to_i(input_stg[0]) * 16 + hx_to_i(input_stg[1]));
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* truncate at bfslen a string */
+
+Static Char *truncate24(Result, a)
+Char *Result;
+Char *a;
+{
+ sprintf(Result, "%.*s", bfslen, a);
+ return Result;
+/* p2c: rtflatex.h, line 173:
+ * Note: Possible faulty string assignment [145] */
+/* p2c: rtflatex.h, line 173:
+ * Note: string[24] := string[255] => unpredictable crashes */
+}
+
+
+/* version 2.15 */
+
+/*---------------------------------------------------------------------------*/
+/* finds the '.' initiating the postfix of the given file name */
+
+Static short pos_postfix(xx)
+Char *xx;
+{
+ short Result = 0;
+ short i, FORLIM;
+
+ FORLIM = strlen(xx);
+ for (i = 1; i <= FORLIM; i++) { /*END DO*/
+ if (xx[i-1] == '.')
+ Result = i;
+ else if (xx[i-1] == ']')
+ Result = 0;
+ else if (xx[i-1] == '/')
+ Result = 0;
+ else if (xx[i-1] == '\\')
+ Result = 0;
+ else if (xx[i-1] == ':')
+ Result = 0;
+ }
+ /*END IF*/
+ return Result;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* the signed variant of str(n,stg) */
+
+Static Void sign_str(num, out_sign_str)
+short num;
+Char *out_sign_str;
+{
+ string255 sign_work;
+ Char STR2[256];
+
+ sprintf(sign_work, "%d", num);
+ /* if (num<0) then out_sign_str:='-'+sign_work */
+ if (num < 0) {
+ sprintf(STR2, "-%s", sign_work);
+ truncate24(out_sign_str, STR2);
+ } else {
+ truncate24(out_sign_str, sign_work);
+ /*END IF*/
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* prints/displays a message */
+
+Static Void print_msg(verbose_level, msg)
+short verbose_level;
+Char *msg;
+{
+ if (verbose >= verbose_level)
+ fputs(msg, stdout);
+ if (write_log)
+ fputs(msg, logfile);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* prints/displays a message with RETURN */
+
+Static Void println_msg(verbose_level, msg)
+short verbose_level;
+Char *msg;
+{
+ if (verbose >= verbose_level)
+ puts(msg);
+ if (write_log)
+ fprintf(logfile, "%s\n", msg);
+}
+
+
+/* ======================================================================= */
+/* used at initialization to store one size name (Latex) and its magnitudes */
+
+Static Void sizeone(i, s, j, k, l, mag10, mag11, mag12)
+short i;
+Char *s;
+short j, k, l, mag10, mag11, mag12;
+{
+ truncate24(sizekey[i-1], s);
+ sizeval[0][i-1] = j;
+ sizemags[0][i-1] = mag10;
+ sizeval[1][i-1] = k;
+ sizemags[1][i-1] = mag11;
+ sizeval[2][i-1] = l;
+ sizemags[2][i-1] = mag12;
+}
+
+
+/* ======================================================================= */
+/* initialization of LaTeX font heights <==> size keywords */
+
+Static Void sizeinit()
+{
+ short k;
+
+ sizeone(1, "HUGE", 720, 720, 840, 2986, 2986, 3583);
+ sizeone(2, "Huge", 600, 600, 720, 2488, 2488, 2986);
+ sizeone(3, "huge", 500, 500, 600, 2074, 2074, 2488);
+ sizeone(4, "LARGE", 440, 440, 500, 1728, 1728, 2074);
+ sizeone(5, "Large", 360, 360, 440, 1440, 1440, 1728);
+ sizeone(6, "large", 280, 280, 360, 1200, 1200, 1440);
+ sizeone(7, "normalsize", 240, 272, 290, 1000, 1095, 1200);
+ sizeone(8, "small", 220, 240, 272, 900, 1000, 1095);
+ sizeone(9, "footnotesize", 190, 220, 240, 800, 900, 1000);
+ sizeone(10, "scriptsize", 160, 190, 190, 700, 800, 800);
+ sizeone(11, "tiny", 120, 140, 140, 500, 600, 600);
+ for (k = 12; k <= 16; k++)
+ sizeone(k, "tiny", 0, 0, 0, 500, 600, 600);
+ num_diff_sizes = 11;
+
+ for (k = 0; k <= 10; k++)
+ strcpy(environ_type[k], "\\RTFerror");
+
+ strcpy(environ_type[0], "document");
+ strcpy(environ_type[1], "center");
+ strcpy(environ_type[2], "flushright");
+
+}
+
+
+/* ======================================================================= */
+
+Static Void mac_init()
+{
+ short k;
+
+ /* install the conversions of RTF accents (coded \'xx in hexa) */
+ /* build a list of conversion of accented letters */
+
+ for (k = 0; k <= 255; k++)
+ *acc_transl[k] = '\0';
+
+ strcpy(acc_transl[hs_to_i("80")], "\"A");
+ strcpy(acc_transl[hs_to_i("81")], "\\AA{}");
+ strcpy(acc_transl[hs_to_i("82")], "\\c{C}");
+ strcpy(acc_transl[hs_to_i("83")], "\\'E");
+ strcpy(acc_transl[hs_to_i("84")], "\\~N");
+ strcpy(acc_transl[hs_to_i("85")], "\\\"O");
+ strcpy(acc_transl[hs_to_i("86")], "\\\"U");
+ strcpy(acc_transl[hs_to_i("87")], "\\'a");
+ strcpy(acc_transl[hs_to_i("88")], "\\`a");
+ strcpy(acc_transl[hs_to_i("89")], "\\^a");
+ strcpy(acc_transl[hs_to_i("8a")], "\\\"a");
+ strcpy(acc_transl[hs_to_i("8b")], "\\~a");
+ strcpy(acc_transl[hs_to_i("8c")], "\\aa{}");
+ strcpy(acc_transl[hs_to_i("8d")], "\\c{c}");
+ strcpy(acc_transl[hs_to_i("8e")], "\\'e");
+ strcpy(acc_transl[hs_to_i("8f")], "\\`e");
+ strcpy(acc_transl[hs_to_i("90")], "\\^e");
+ strcpy(acc_transl[hs_to_i("91")], "\\\"e");
+ strcpy(acc_transl[hs_to_i("93")], "\\'{\\i}");
+ strcpy(acc_transl[hs_to_i("93")], "\\`{\\i}");
+ strcpy(acc_transl[hs_to_i("94")], "\\^{\\i}");
+ strcpy(acc_transl[hs_to_i("95")], "\\\"{\\i}");
+ strcpy(acc_transl[hs_to_i("96")], "\\~n");
+ strcpy(acc_transl[hs_to_i("97")], "\\'o");
+ strcpy(acc_transl[hs_to_i("98")], "\\`o");
+ strcpy(acc_transl[hs_to_i("99")], "\\^o");
+ strcpy(acc_transl[hs_to_i("9a")], "\\\"o");
+ strcpy(acc_transl[hs_to_i("9b")], "\\~o");
+ strcpy(acc_transl[hs_to_i("9c")], "\\'u");
+ strcpy(acc_transl[hs_to_i("9d")], "\\`u");
+ strcpy(acc_transl[hs_to_i("9e")], "\\^u");
+ strcpy(acc_transl[hs_to_i("9f")], "\\\"u");
+ strcpy(acc_transl[hs_to_i("a0")], "\\dag{}");
+ strcpy(acc_transl[hs_to_i("a1")], "\\degree{}");
+ strcpy(acc_transl[hs_to_i("a3")], "\\pound{}");
+ strcpy(acc_transl[hs_to_i("a4")], "\\S{}");
+ strcpy(acc_transl[hs_to_i("a7")], "\\ss{}");
+ strcpy(acc_transl[hs_to_i("ae")], "\\AE{}");
+ strcpy(acc_transl[hs_to_i("af")], "\\O{}");
+ strcpy(acc_transl[hs_to_i("b0")], "$\\infty ");
+ strcpy(acc_transl[hs_to_i("b1")], "$\\pm ");
+ strcpy(acc_transl[hs_to_i("b2")], "$\\leq ");
+ strcpy(acc_transl[hs_to_i("b3")], "$\\geq ");
+ strcpy(acc_transl[hs_to_i("b5")], "$\\mu ");
+ strcpy(acc_transl[hs_to_i("b6")], "$\\partial ");
+ strcpy(acc_transl[hs_to_i("b7")], "$\\Sigma ");
+ strcpy(acc_transl[hs_to_i("b8")], "$\\Pi ");
+ strcpy(acc_transl[hs_to_i("b9")], "$\\pi ");
+ strcpy(acc_transl[hs_to_i("bd")], "${1\\over2}");
+ strcpy(acc_transl[hs_to_i("bf")], "\\o{}");
+ strcpy(acc_transl[hs_to_i("c6")], "$\\Delta ");
+ strcpy(acc_transl[hs_to_i("c9")], "...");
+ strcpy(acc_transl[hs_to_i("cb")], "\\`A");
+ strcpy(acc_transl[hs_to_i("cc")], "\\~A");
+ strcpy(acc_transl[hs_to_i("cd")], "\\~O");
+ strcpy(acc_transl[hs_to_i("ce")], "\\OE{}");
+ strcpy(acc_transl[hs_to_i("cf")], "\\oe{}");
+ strcpy(acc_transl[hs_to_i("d0")], "--{}");
+ strcpy(acc_transl[hs_to_i("d1")], "---{}");
+ strcpy(acc_transl[hs_to_i("d2")], "``");
+ strcpy(acc_transl[hs_to_i("d3")], "''");
+ strcpy(acc_transl[hs_to_i("d4")], "`{}");
+ strcpy(acc_transl[hs_to_i("d5")], "'{}");
+ strcpy(acc_transl[hs_to_i("d6")], "$\\div ");
+ strcpy(acc_transl[hs_to_i("d8")], "\\\"y");
+ strcpy(acc_transl[hs_to_i("e1")], "$\\cdot ");
+ strcpy(acc_transl[hs_to_i("e4")], "\\\"a");
+ strcpy(acc_transl[hs_to_i("e5")], "\\^A");
+ strcpy(acc_transl[hs_to_i("e6")], "\\^E");
+ strcpy(acc_transl[hs_to_i("e7")], "\\'A");
+ strcpy(acc_transl[hs_to_i("e8")], "\\\"E");
+ strcpy(acc_transl[hs_to_i("e9")], "\\`E");
+ strcpy(acc_transl[hs_to_i("ea")], "\\'I");
+ strcpy(acc_transl[hs_to_i("eb")], "\\^I");
+ strcpy(acc_transl[hs_to_i("ec")], "\\\"I");
+ strcpy(acc_transl[hs_to_i("ed")], "\\`I");
+ strcpy(acc_transl[hs_to_i("ee")], "\\'O");
+ strcpy(acc_transl[hs_to_i("ef")], "\\^O");
+ strcpy(acc_transl[hs_to_i("f1")], "\\`O");
+ strcpy(acc_transl[hs_to_i("f2")], "\\'U");
+ strcpy(acc_transl[hs_to_i("f3")], "\\^U");
+ strcpy(acc_transl[hs_to_i("f4")], "\\`U");
+ strcpy(acc_transl[hs_to_i("f6")], "\\\"o");
+ strcpy(acc_transl[hs_to_i("fb")], "\\degree{}");
+ strcpy(acc_transl[hs_to_i("fc")], "\\\"u");
+
+}
+
+
+/* ======================================================================= */
+
+Static Void ansi_init()
+{
+ short k;
+
+ /* install the conversions of RTF accents (coded \'xx in hexa) */
+ /* build a list of conversion of accented letters */
+
+ for (k = 0; k <= 255; k++)
+ *acc_transl[k] = '\0';
+
+ strcpy(acc_transl[hs_to_i("a1")], "!`");
+ strcpy(acc_transl[hs_to_i("a3")], "\\pound{}");
+ strcpy(acc_transl[hs_to_i("a7")], "\\S{}");
+ strcpy(acc_transl[hs_to_i("a8")], "\\\"{ }");
+ strcpy(acc_transl[hs_to_i("a9")], "\\copyright{}");
+ strcpy(acc_transl[hs_to_i("ab")], "<<");
+ strcpy(acc_transl[hs_to_i("b0")], "\\degree{}");
+ strcpy(acc_transl[hs_to_i("b1")], "$\\pm ");
+ strcpy(acc_transl[hs_to_i("b4")], "\\'{ }");
+ strcpy(acc_transl[hs_to_i("b5")], "$\\mu ");
+ strcpy(acc_transl[hs_to_i("b7")], "$\\cdot ");
+ strcpy(acc_transl[hs_to_i("b8")], "\\c{ }");
+ strcpy(acc_transl[hs_to_i("bb")], ">>");
+ strcpy(acc_transl[hs_to_i("bc")], "${1\\over4}");
+ strcpy(acc_transl[hs_to_i("bd")], "${1\\over2}");
+ strcpy(acc_transl[hs_to_i("be")], "${3\\over4}");
+ strcpy(acc_transl[hs_to_i("bf")], "?`");
+
+ strcpy(acc_transl[hs_to_i("c0")], "\\`A");
+ strcpy(acc_transl[hs_to_i("c1")], "\\'A");
+ strcpy(acc_transl[hs_to_i("c2")], "\\^A");
+ strcpy(acc_transl[hs_to_i("c3")], "\\~A");
+ strcpy(acc_transl[hs_to_i("c4")], "\\\"A");
+ strcpy(acc_transl[hs_to_i("c5")], "\\AA{}");
+ strcpy(acc_transl[hs_to_i("c6")], "\\AE{}");
+ strcpy(acc_transl[hs_to_i("c7")], "\\c{C}");
+ strcpy(acc_transl[hs_to_i("c8")], "\\`E");
+ strcpy(acc_transl[hs_to_i("c9")], "\\'E");
+ strcpy(acc_transl[hs_to_i("ca")], "\\^E");
+ strcpy(acc_transl[hs_to_i("cb")], "\\\"E");
+ strcpy(acc_transl[hs_to_i("cc")], "\\`I");
+ strcpy(acc_transl[hs_to_i("cd")], "\\'I");
+ strcpy(acc_transl[hs_to_i("ce")], "\\^I");
+ strcpy(acc_transl[hs_to_i("cf")], "\\\"I");
+
+ strcpy(acc_transl[hs_to_i("d1")], "\\~N");
+ strcpy(acc_transl[hs_to_i("d2")], "\\`O");
+ strcpy(acc_transl[hs_to_i("d3")], "\\'O");
+ strcpy(acc_transl[hs_to_i("d4")], "\\^O");
+ strcpy(acc_transl[hs_to_i("d5")], "\\~O");
+ strcpy(acc_transl[hs_to_i("d6")], "\\\"O");
+ strcpy(acc_transl[hs_to_i("d8")], "\\O");
+ strcpy(acc_transl[hs_to_i("d9")], "\\`U");
+ strcpy(acc_transl[hs_to_i("da")], "\\'U");
+ strcpy(acc_transl[hs_to_i("db")], "\\^U");
+ strcpy(acc_transl[hs_to_i("dc")], "\\\"U");
+ strcpy(acc_transl[hs_to_i("dd")], "\\'Y");
+ strcpy(acc_transl[hs_to_i("df")], "\\ss{}");
+
+
+ strcpy(acc_transl[hs_to_i("e0")], "\\`a");
+ strcpy(acc_transl[hs_to_i("e1")], "\\'a");
+ strcpy(acc_transl[hs_to_i("e2")], "\\^a");
+ strcpy(acc_transl[hs_to_i("e3")], "\\~a");
+ strcpy(acc_transl[hs_to_i("e4")], "\\\"a");
+ strcpy(acc_transl[hs_to_i("e5")], "\\aa{}");
+ strcpy(acc_transl[hs_to_i("e6")], "\\ae{}");
+ strcpy(acc_transl[hs_to_i("e7")], "\\c{c}");
+ strcpy(acc_transl[hs_to_i("e8")], "\\`e");
+ strcpy(acc_transl[hs_to_i("e9")], "\\'e");
+ strcpy(acc_transl[hs_to_i("ea")], "\\^e");
+ strcpy(acc_transl[hs_to_i("eb")], "\\\"e");
+ strcpy(acc_transl[hs_to_i("ec")], "\\`i");
+ strcpy(acc_transl[hs_to_i("ed")], "\\'i");
+ strcpy(acc_transl[hs_to_i("ee")], "\\^i");
+ strcpy(acc_transl[hs_to_i("ef")], "\\\"i");
+
+ strcpy(acc_transl[hs_to_i("f1")], "\\~n");
+ strcpy(acc_transl[hs_to_i("f2")], "\\`o");
+ strcpy(acc_transl[hs_to_i("f3")], "\\'o");
+ strcpy(acc_transl[hs_to_i("f4")], "\\^o");
+ strcpy(acc_transl[hs_to_i("f5")], "\\~o");
+ strcpy(acc_transl[hs_to_i("f6")], "\\\"o");
+ strcpy(acc_transl[hs_to_i("f8")], "\\o");
+ strcpy(acc_transl[hs_to_i("f9")], "\\`u");
+ strcpy(acc_transl[hs_to_i("fa")], "\\'u");
+ strcpy(acc_transl[hs_to_i("fb")], "\\^u");
+ strcpy(acc_transl[hs_to_i("fc")], "\\\"u");
+ strcpy(acc_transl[hs_to_i("fd")], "\\'y");
+ strcpy(acc_transl[hs_to_i("ff")], "\\\"y");
+
+
+
+}
+
+
+/* ======================================================================= */
+
+Static Void charinit()
+{
+ short K;
+
+ for (K = 0; K <= 255; K++)
+ catcode[K] = 12;
+ for (K = 'A'; K <= 'Z'; K++)
+ catcode[K] = 11;
+ for (K = 'a'; K <= 'z'; K++)
+ catcode[K] = 11;
+ for (K = '0'; K <= '9'; K++)
+ catcode[K] = 16;
+ K = ' ';
+ catcode[K] = 10;
+ K = '{';
+ catcode[K] = 1;
+ K = '}';
+ catcode[K] = 2;
+ K = '(';
+ catcode[K] = 3;
+ K = ')';
+ catcode[K] = 4;
+ K = '\\';
+ catcode[K] = 0;
+
+ icharz = '0';
+
+ /* build an empty list of conversion of accented letters */
+
+ for (K = 0; K <= 255; K++)
+ *acc_transl[K] = '\0';
+
+ /* Now install the conversions of "ftech" characters into math codes
+... or letters*/
+
+ for (K = 0; K <= 255; K++)
+ *ftech_transl[K] = '\0';
+ strcpy(ftech_transl['a'], "\\alpha ");
+ strcpy(ftech_transl['A'], "\\Alpha ");
+ strcpy(ftech_transl['b'], "\\beta ");
+ strcpy(ftech_transl['B'], "\\Beta ");
+ strcpy(ftech_transl['c'], "\\chi ");
+ strcpy(ftech_transl['C'], "\\Chi ");
+ strcpy(ftech_transl['d'], "\\delta ");
+ strcpy(ftech_transl['D'], "\\Delta ");
+ strcpy(ftech_transl['e'], "\\varepsilon ");
+ strcpy(ftech_transl['E'], "\\Epsilon ");
+ strcpy(ftech_transl['f'], "\\phi ");
+ strcpy(ftech_transl['F'], "\\Phi ");
+ strcpy(ftech_transl['g'], "\\gamma ");
+ strcpy(ftech_transl['G'], "\\Gamma ");
+ strcpy(ftech_transl['h'], "\\eta ");
+ strcpy(ftech_transl['H'], "\\Eta ");
+ strcpy(ftech_transl['i'], "\\iota ");
+ strcpy(ftech_transl['I'], "\\Iota ");
+ strcpy(ftech_transl['j'], "\\varphi ");
+ strcpy(ftech_transl['J'], "\\vartheta ");
+ strcpy(ftech_transl['k'], "\\kappa ");
+ strcpy(ftech_transl['K'], "\\Kappa ");
+ strcpy(ftech_transl['l'], "\\lambda ");
+ strcpy(ftech_transl['L'], "\\Lambda ");
+ strcpy(ftech_transl['m'], "\\mu ");
+ strcpy(ftech_transl['M'], "\\Mu ");
+ strcpy(ftech_transl['n'], "\\nu ");
+ strcpy(ftech_transl['N'], "\\Nu");
+ strcpy(ftech_transl['o'], "o");
+ strcpy(ftech_transl['O'], "\\Omicron ");
+ strcpy(ftech_transl['p'], "\\pi ");
+ strcpy(ftech_transl['P'], "\\Pi ");
+ strcpy(ftech_transl['q'], "\\theta ");
+ strcpy(ftech_transl['Q'], "\\Theta ");
+ strcpy(ftech_transl['r'], "\\rho ");
+ strcpy(ftech_transl['R'], "\\Rho ");
+ strcpy(ftech_transl['s'], "\\sigma ");
+ strcpy(ftech_transl['S'], "\\Sigma ");
+ strcpy(ftech_transl['t'], "\\tau ");
+ strcpy(ftech_transl['T'], "\\Tau ");
+ strcpy(ftech_transl['u'], "\\upsilon ");
+ strcpy(ftech_transl['U'], "\\varUpsilon ");
+ strcpy(ftech_transl['v'], "\\varpi ");
+ strcpy(ftech_transl['V'], "\\varsigma ");
+ strcpy(ftech_transl['w'], "\\omega ");
+ strcpy(ftech_transl['W'], "\\Omega ");
+ strcpy(ftech_transl['x'], "\\xi ");
+ strcpy(ftech_transl['X'], "\\Xi ");
+ strcpy(ftech_transl['y'], "\\psi ");
+ strcpy(ftech_transl['Y'], "\\Psi ");
+ strcpy(ftech_transl['z'], "\\zeta ");
+ strcpy(ftech_transl['Z'], "\\Zeta ");
+
+ strcpy(ftech_transl['@'], "\\cong ");
+ strcpy(ftech_transl['~'], "\\sim ");
+ strcpy(ftech_transl['"'], "\\forall ");
+ strcpy(ftech_transl['$'], "\\exists ");
+
+ strcpy(ftech_transl[hs_to_i("27")], "\\ni ");
+ strcpy(ftech_transl[hs_to_i("5e")], "\\bot ");
+ strcpy(ftech_transl[hs_to_i("a0")], "\\dag ");
+ strcpy(ftech_transl[hs_to_i("a1")], "\\Upsilon ");
+ strcpy(ftech_transl[hs_to_i("a2")], "'");
+ strcpy(ftech_transl[hs_to_i("a3")], "\\leq ");
+ strcpy(ftech_transl[hs_to_i("a4")], "/");
+ strcpy(ftech_transl[hs_to_i("a5")], "\\infty ");
+ strcpy(ftech_transl[hs_to_i("a6")], "\\cap ");
+ strcpy(ftech_transl[hs_to_i("a7")], "\\clubsuit ");
+ strcpy(ftech_transl[hs_to_i("a9")], "\\heartsuit ");
+ strcpy(ftech_transl[hs_to_i("aa")], "\\spadesuit ");
+ strcpy(ftech_transl[hs_to_i("ab")], "\\leftrightarrow ");
+ strcpy(ftech_transl[hs_to_i("ac")], "\\leftarrow ");
+ strcpy(ftech_transl[hs_to_i("ad")], "\\uparrow ");
+ strcpy(ftech_transl[hs_to_i("ae")], "\\rightarrow ");
+ strcpy(ftech_transl[hs_to_i("af")], "\\downarrow ");
+ strcpy(ftech_transl[hs_to_i("b0")], "^{\\circ}");
+ strcpy(ftech_transl[hs_to_i("b1")], "\\pm ");
+ strcpy(ftech_transl[hs_to_i("b2")], "''");
+ strcpy(ftech_transl[hs_to_i("b3")], "\\geq ");
+ strcpy(ftech_transl[hs_to_i("b4")], "\\times ");
+ strcpy(ftech_transl[hs_to_i("b5")], "\\propto ");
+ strcpy(ftech_transl[hs_to_i("b6")], "\\partial ");
+ strcpy(ftech_transl[hs_to_i("b7")], "\\bullet ");
+ strcpy(ftech_transl[hs_to_i("b8")], "\\div ");
+ strcpy(ftech_transl[hs_to_i("b9")], "\\neq ");
+ strcpy(ftech_transl[hs_to_i("ba")], "\\equiv ");
+ strcpy(ftech_transl[hs_to_i("bb")], "\\approx ");
+ strcpy(ftech_transl[hs_to_i("bc")], "\\ldots ");
+ strcpy(ftech_transl[hs_to_i("bd")], "\\mid ");
+ strcpy(ftech_transl[hs_to_i("c0")], "\\aleph ");
+ strcpy(ftech_transl[hs_to_i("c1")], "\\Im ");
+ strcpy(ftech_transl[hs_to_i("c2")], "\\Re ");
+ strcpy(ftech_transl[hs_to_i("c3")], "\\wp ");
+ strcpy(ftech_transl[hs_to_i("c4")], "\\otimes ");
+ strcpy(ftech_transl[hs_to_i("c5")], "\\oplus ");
+ strcpy(ftech_transl[hs_to_i("c6")], "\\oslash ");
+ strcpy(ftech_transl[hs_to_i("c7")], "\\cap ");
+ strcpy(ftech_transl[hs_to_i("c8")], "\\cup ");
+ strcpy(ftech_transl[hs_to_i("c9")], "\\supset ");
+ strcpy(ftech_transl[hs_to_i("ca")], "\\supseteq ");
+ strcpy(ftech_transl[hs_to_i("cb")], "\\not\\subset ");
+ strcpy(ftech_transl[hs_to_i("cc")], "\\subset ");
+ strcpy(ftech_transl[hs_to_i("cd")], "\\subseteq ");
+ strcpy(ftech_transl[hs_to_i("ce")], "\\in ");
+ strcpy(ftech_transl[hs_to_i("cf")], "\\not\\in ");
+ strcpy(ftech_transl[hs_to_i("d0")], "\\angle ");
+ strcpy(ftech_transl[hs_to_i("d1")], "\\nabla ");
+ strcpy(ftech_transl[hs_to_i("d2")], "\\registered ");
+ strcpy(ftech_transl[hs_to_i("d3")], "\\copyright ");
+ strcpy(ftech_transl[hs_to_i("d4")], "\\trademark ");
+ strcpy(ftech_transl[hs_to_i("d5")], "\\prod ");
+ strcpy(ftech_transl[hs_to_i("d7")], "\\cdot ");
+ strcpy(ftech_transl[hs_to_i("d8")], "\\neg ");
+ strcpy(ftech_transl[hs_to_i("d9")], "\\wedge ");
+ strcpy(ftech_transl[hs_to_i("da")], "\\vee ");
+ strcpy(ftech_transl[hs_to_i("db")], "\\Leftrightarrow ");
+ strcpy(ftech_transl[hs_to_i("dc")], "\\Leftarrow ");
+ strcpy(ftech_transl[hs_to_i("dd")], "\\Uparrow ");
+ strcpy(ftech_transl[hs_to_i("de")], "\\Rightarrow ");
+ strcpy(ftech_transl[hs_to_i("df")], "\\Downarrow ");
+ strcpy(ftech_transl[hs_to_i("e0")], "\\diamondsuit ");
+ strcpy(ftech_transl[hs_to_i("e1")], "\\langle ");
+ strcpy(ftech_transl[hs_to_i("e2")], "\\registered ");
+ strcpy(ftech_transl[hs_to_i("e3")], "\\copyright ");
+ strcpy(ftech_transl[hs_to_i("e4")], "\\trademark ");
+ strcpy(ftech_transl[hs_to_i("e5")], "\\sum ");
+ strcpy(ftech_transl[hs_to_i("e9")], "\\lceil ");
+ strcpy(ftech_transl[hs_to_i("ea")], "\\mid ");
+ strcpy(ftech_transl[hs_to_i("eb")], "\\lfloor ");
+ strcpy(ftech_transl[hs_to_i("f1")], "\\rangle ");
+ strcpy(ftech_transl[hs_to_i("f2")], "\\int ");
+
+ strcpy(end_math_code, "$");
+}
+
+
+/* ======================================================================= */
+/* this procedure returns a set of 4 chars, the size preamble of a non std font */
+Static Char *sizealpha(Result, i)
+Char *Result;
+short i;
+{
+ short h;
+
+ h = i / 2;
+ if (h <= 5)
+ return strcpy(Result, "\\fiv");
+ else if (h <= 6)
+ return strcpy(Result, "\\six");
+ else if (h <= 7)
+ return strcpy(Result, "\\sev");
+ else if (h <= 8)
+ return strcpy(Result, "\\egt");
+ else if (h <= 9)
+ return strcpy(Result, "\\nin");
+ else if (h <= 10)
+ return strcpy(Result, "\\ten");
+ else if (h <= 11)
+ return strcpy(Result, "\\elv");
+ else if (h <= 13)
+ return strcpy(Result, "\\twl");
+ else if (h <= 15)
+ return strcpy(Result, "\\frt");
+ else if (h <= 18)
+ return strcpy(Result, "\\svtn");
+ else if (h <= 23)
+ return strcpy(Result, "\\twty");
+ else if (h <= 28)
+ return strcpy(Result, "\\twfv");
+ else {
+ return strcpy(Result, "\\thtw");
+ /*END IF*/
+
+ }
+}
+
+
+/* ======================================================================= */
+/* write "help" information */
+
+Static Void write_help()
+{
+ printf("Usage: RTFLATEX [options] <input-file> [options] <output-file>\n");
+ printf("Options:\n");
+ printf(" -b : set explicit \\baselineskip at par ends\n");
+ printf(" -d<nnn> : debug level: 1=default, 0=quiet, >1=verbose\n");
+ printf(" -f<templ> : file template to put figures (need a * )\n");
+ printf(" -l<style> : latex style (default is \"report\")\n");
+ printf(" -m : put debugging marks in output TeX\n");
+ printf(" -o<option> : latex style option (cumulative)\n");
+ printf(" -p<value> : std font size (10, 11, 12)\n");
+ printf(" -r<file> : LOG output file (default is none)\n");
+ printf(" -s : use slanted instead of italic\n");
+ printf(" -t : omit LaTeX \\documentstyle etc.\n");
+ printf(" -v : convert text and fonts, not spacings\n");
+ printf(" -x : inhibit output simplification\n");
+ printf(" -z<file> : file containing list of ignored keywords\n");
+ printf(" -209 : assume ancient Latex209\n");
+ _Escape(0);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* this procedure open files and set the -xxxx options */
+
+Static Void open_files()
+{
+ string128 skipname, outputname, inputname, logname, optstr;
+ short testio, cat, ikar;
+ short kparm = 0;
+ short L, pospt;
+ Char first_char;
+ boolean success;
+ string24 inskipk;
+ short kkk, number_params;
+ Char STR1[256], STR3[256], STR4[256];
+ short FORLIM1;
+ Char *TEMP;
+ Char STR5[40];
+ Char STR6[68];
+
+ strcpy(figure_path, "rtf*.bit");
+ *figure_type = '\0';
+ stdsize = 12;
+ stdkz = 3; /* standard LaTeX size : 10, 11, 12 pt */
+ *inputname = '\0';
+ *outputname = '\0';
+ strcpy(skipname, P_argv[0]);
+ num_skip_strings = 1;
+ for (L = 0; L <= max_skip_strings - 1; L++)
+ *skip_strings[L] = '\0';
+
+ pospt = pos_postfix(skipname);
+ if (pospt > 0) {
+ if (!strcmp(strsub(STR1, skipname, pospt, strlen(skipname)), ".EXE"))
+ sprintf(skipname, "%.*sSKW", pospt, strcpy(STR3, skipname));
+ else if (!strcmp(strsub(STR3, skipname, pospt, strlen(skipname)), ".exe"))
+ sprintf(skipname, "%.*sskw", pospt, strcpy(STR4, skipname));
+ } else
+ strcat(skipname, ".skw");
+ /*END IF*/
+ number_params = P_argc - 1;
+
+ for (kkk = 1; kkk <= number_params; kkk++) { /*END WHILE*/
+ kparm = kkk;
+ strcpy(optstr, P_argv[kparm]);
+ first_char = optstr[0];
+ if (first_char == '-') {
+ printf("%cOption :>%s<\n", first_char, optstr);
+ if (optstr[1] == 'p') {
+ stdsize = 0;
+ FORLIM1 = strlen(optstr);
+ for (L = 2; L <= FORLIM1 - 1; L++) {
+ ikar = optstr[L];
+ cat = catcode[ikar];
+ if (cat != 16) {
+ printf("Illegal character in -p option: %s\n", optstr);
+ _Escape(0);
+ }
+ stdsize = stdsize * 10 + ikar - icharz;
+ }
+ printf("Standard size found: %dpt\n", stdsize);
+ if (stdsize < 11)
+ stdkz = 1;
+ else if (stdsize == 11)
+ stdkz = 2;
+ else
+ stdkz = 3;
+ } else if (optstr[1] == '2') {
+ /*END IF*/
+ latex209 = true;
+ } else if (optstr[1] == 'v')
+ no_space_conv = true;
+ else if (optstr[1] == 's')
+ use_sl = true;
+ else if (optstr[1] == 't')
+ latex_header = false;
+ else if (optstr[1] == 'x')
+ simplify_ok = false;
+ else if (optstr[1] == 'b')
+ base_flag = true;
+ else if (optstr[1] == 'z')
+ strcpy(skipname, optstr + 2);
+ else if (optstr[1] == 'l') {
+ truncate24(latex_style, optstr);
+ if (*latex_style == '\0')
+ strcpy(latex_style, "report");
+ } else if (optstr[1] == 'o') {
+ if (num_latex_options >= maxstyles)
+ printf("Too many style options, %s ignored !\n", optstr);
+ else {
+ num_latex_options++;
+ truncate24(latex_options[num_latex_options],
+ strsub(STR4, optstr, 3, bfslen));
+ }
+ } else if (optstr[1] == 'f') {
+ /*END IF num_latex_options*/
+ strcpy(figure_path, optstr + 2);
+ printf("-f:%s\n", figure_path);
+ } else if (optstr[1] == 'r') {
+ strcpy(logname, optstr + 2);
+ write_log = true;
+ } else if (optstr[1] == 'm')
+ tex_verbose = 1; /* insert marks in TeX output */
+ else if (optstr[1] == 'd') {
+ verbose = 0;
+ FORLIM1 = strlen(optstr);
+ for (L = 2; L <= FORLIM1 - 1; L++) {
+ ikar = optstr[L];
+ cat = catcode[ikar];
+ if (cat != 16) {
+ printf("Illegal character in -d option: %s\n", optstr);
+ _Escape(0);
+ }
+ verbose = verbose * 10 + ikar - icharz;
+ /*END IF*/
+ if (verbose > 0)
+ printf("Verbose=%d\n", verbose);
+ }
+ } else
+ printf("Unsupported option, ignored: %s\n", optstr);
+ } else if (*inputname == '\0') {
+ /*END IF*/
+ strcpy(inputname, optstr);
+ } else if (*outputname == '\0')
+ strcpy(outputname, optstr);
+ else if (*optstr != '\0') {
+ printf("Too many non option args : %s\n", optstr);
+ printf("This one ignored !\n");
+ }
+ }
+
+ /*END IF*/
+ pospt = strpos2(figure_path, "*", 1);
+ if (pospt == 0) {
+ printf("NO * in -f<path> option\n");
+ _Escape(0);
+ }
+ strcpy(figure_type, figure_path + pospt);
+ sprintf(figure_path, "%.*s", pospt - 1, strcpy(STR3, figure_path));
+
+ if (*inputname == '\0') /* stops if help written */
+ write_help();
+
+ if (pos_postfix(inputname) == 0)
+ strcat(inputname, ".rtf");
+
+ strcpy(inputfile_NAME, inputname);
+ if (inputfile != NULL)
+ inputfile = freopen(inputfile_NAME, "r", inputfile);
+ else
+ inputfile = fopen(inputfile_NAME, "r");
+ _SETIO(inputfile != NULL, FileNotFound);
+ testio = P_ioresult;
+ success = (testio == 0);
+ if (!success) {
+ _SETIO(printf("Unable to open input file %s ; code=%d\n",
+ inputname, testio) >= 0, FileWriteError);
+ _Escape(0);
+ }
+
+ if (*outputname == '\0') {
+ pospt = pos_postfix(inputname);
+ sprintf(outputname, "%.*stex", pospt, inputname);
+ _SETIO(printf("Output name taken from input: %s\n", outputname) >= 0,
+ FileWriteError);
+ }
+
+ if (!strcmp(outputname, inputname)) {
+ _SETIO(printf("Input and output files have same names, abort!\n") >= 0,
+ FileWriteError);
+ _SETIO(printf(" Input: %s\n", inputname) >= 0, FileWriteError);
+ _SETIO(printf(" Output: %s\n", inputname) >= 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+
+ strcpy(outputfile_NAME, outputname);
+ if (outputfile != NULL)
+ outputfile = freopen(outputfile_NAME, "w", outputfile);
+ else
+ outputfile = fopen(outputfile_NAME, "w");
+ _SETIO(outputfile != NULL, FileNotFound);
+ testio = P_ioresult;
+ success = (testio == 0);
+
+ if (!success) {
+ _SETIO(printf("ioresult (output)=%d\n", testio) >= 0, FileWriteError);
+ _SETIO(printf("Unable to open output file %s ; code=%d\n",
+ outputname, testio) >= 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+
+ /* opening skip file to eliminate useless output \RTFxxx keywords */
+ if (*skipname == '\0') {
+ pospt = pos_postfix(inputname);
+ sprintf(skipname, "%.*sskw", pospt, inputname);
+ _SETIO(printf("keyword skip file name taken from input: %s\n", skipname) >= 0,
+ FileWriteError);
+ }
+
+ if (!strcmp(skipname, inputname)) {
+ _SETIO(printf("Input and skip files have same names, abort!\n") >= 0,
+ FileWriteError);
+ _SETIO(printf(" Input: %s\n", inputname) >= 0, FileWriteError);
+ _SETIO(printf(" skip: %s\n", inputname) >= 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+
+ strcpy(skipfile_NAME, skipname);
+ if (skipfile != NULL)
+ skipfile = freopen(skipfile_NAME, "r", skipfile);
+ else
+ skipfile = fopen(skipfile_NAME, "r");
+ _SETIO(skipfile != NULL, FileNotFound);
+ testio = P_ioresult;
+ success = (testio == 0);
+
+ if (!success) {
+ _SETIO(printf("ioresult (keyword skip file)=%d\n", testio) >= 0,
+ FileWriteError);
+ _SETIO(printf("Unable to open keyword skip file %s ; code=%d\n",
+ skipname, testio) >= 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+
+
+ if (write_log) { /*END IF write_log*/
+ if (*logname == '\0') { /*END IF logname*/
+ pospt = pos_postfix(inputname);
+ sprintf(logname, "%.*slog", pospt, inputname);
+ _SETIO(printf("Log name taken from input : %s\n", logname) >= 0,
+ FileWriteError);
+ }
+
+ if (!strcmp(logname, inputname) || !strcmp(logname, outputname))
+ { /*END IF logname*/
+ _SETIO(printf("Log and input or output files have same names, abort!\n") >=
+ 0, FileWriteError);
+ _SETIO(printf(" Log: %s\n", logname) >= 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+
+ strcpy(logfile_NAME, logname);
+ if (logfile != NULL)
+ logfile = freopen(logfile_NAME, "w", logfile);
+ else
+ logfile = fopen(logfile_NAME, "w");
+ _SETIO(logfile != NULL, FileNotFound);
+ testio = P_ioresult;
+ write_log = (testio == 0);
+
+ if (!write_log) { /*END IF not success*/
+ _SETIO(printf("ioresult (Log)=%d\n", testio) >= 0, FileWriteError);
+ _SETIO(printf("Unable to open log file %s ; code=%d\n", logname, testio) >=
+ 0, FileWriteError);
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ _Escape(0);
+ }
+ _SETIO(printf("%s, ", logname) >= 0, FileWriteError);
+ }
+ _SETIO(printf("%s, %s and %s successfully opened.\n",
+ inputname, skipname, outputname) >= 0, FileWriteError);
+
+ while (!P_eof(skipfile)) { /*END DO*/
+ _SETIO(fgets(inskipk, bfslen + 1, skipfile) != NULL, EndOfFile);
+ TEMP = strchr(inskipk, '\n');
+ if (TEMP != NULL)
+ *TEMP = 0;
+ sprintf(STR5, "Cancelling \"%s\"", inskipk);
+ println_msg(2, STR5);
+ if (*inskipk == '\0') { /*END IF*/
+ /*END IF*/
+ continue;
+ }
+ if (strlen(inskipk) + strlen(skip_strings[num_skip_strings-1]) < 255)
+ sprintf(skip_strings[num_skip_strings-1] +
+ strlen(skip_strings[num_skip_strings-1]), "%s ", inskipk);
+ else if (num_skip_strings < max_skip_strings) {
+ num_skip_strings++;
+ sprintf(skip_strings[num_skip_strings-1] +
+ strlen(skip_strings[num_skip_strings-1]), "%s ", inskipk);
+ } else {
+ sprintf(STR6, "Too many keywords to ignore, %s not recorded!", inskipk);
+ println_msg(1, STR6);
+ }
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* clean the output line */
+
+Static Void cleanout()
+{
+ for (i = 1; i <= olmx; i++)
+ exline[i-1] = ' ';
+ kout = 0;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* prints/displays the current stored output line */
+
+Static Void print_line(verbose_level)
+short verbose_level;
+{
+ short i, FORLIM;
+ Char STR1[256];
+
+ FORLIM = kout;
+ for (i = 0; i <= FORLIM - 1; i++) {
+ sprintf(STR1, "%c", exline[i]);
+ print_msg(verbose_level, STR1);
+ }
+ println_msg(verbose_level, "<<<");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* makes the pos function in an array of type exline_type */
+
+Static short array_pos(oldstring, testline, array_long)
+Char *oldstring;
+Char *testline;
+short array_long;
+{
+ short Result = 0;
+ boolean string_found;
+ short lth1, jpos, kpos, FORLIM;
+
+ lth1 = strlen(oldstring);
+ FORLIM = array_long - lth1 + 1;
+ for (kpos = 1; kpos <= FORLIM; kpos++) { /*END DO*/
+ string_found = true;
+ for (jpos = 1; jpos <= lth1; jpos++) /*END DO*/
+ string_found = (string_found &&
+ oldstring[jpos-1] == testline[kpos + jpos - 2]);
+ if (string_found) /*END IF*/
+ return kpos;
+ }
+ return Result;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* substitute a string with another in output line */
+
+Static Void outsubstitute(oldstring, newstring)
+Char *oldstring, *newstring;
+{
+ boolean string_found = true;
+ short lth1, lth2, jpos, kpos, oldkout;
+ exline_type oldline;
+
+ lth1 = strlen(oldstring);
+ lth2 = strlen(newstring);
+ while (string_found) { /*END DO*/
+ kpos = array_pos(oldstring, exline, kout);
+ string_found = (kpos > 0);
+ if (!string_found) /*END IF*/
+ break;
+ memcpy(oldline, exline, sizeof(exline_type));
+ oldkout = kout;
+ kout = kpos - 1;
+ for (jpos = 0; jpos <= lth2 - 1; jpos++) { /*END DO*/
+ kout++;
+ exline[kout-1] = newstring[jpos];
+ }
+ for (jpos = kpos + lth1 - 1; jpos <= oldkout - 1; jpos++) { /*END DO*/
+ kout++;
+ exline[kout-1] = oldline[jpos];
+ }
+ for (jpos = kout; jpos <= olmx - 1; jpos++) /*END DO*/
+ exline[jpos] = ' ';
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* converts an integer number of twips into a decimal string */
+
+Static Void str_twips_pt(numval, outpts)
+short numval;
+Char *outpts;
+{
+ short k, l;
+ string24 wk, STR1;
+ Char STR2[28];
+ Char STR3[256];
+ Char STR5[256];
+
+ k = numval * 5; /* convert to hundredth of pts */
+ sign_str(k, wk);
+ if (strlen(wk) < 2) {
+ sprintf(STR2, "00%s", wk);
+ strcpy(wk, truncate24(STR1, STR2));
+ }
+ l = strlen(wk);
+ sprintf(STR5, "%.*s.%s", l - 2, wk, strsub(STR3, wk, l - 1, 2));
+ truncate24(outpts, STR5);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* eliminates end replaces useless sequences in output -- pragmatic feature */
+
+Static Void simplify(oldstring, newstring)
+Char *oldstring, *newstring;
+{
+ if (simplify_ok)
+ outsubstitute(oldstring, newstring);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* read the future chars, excluding control chars < ord(' ') */
+
+Static Void read_next_char()
+{
+ short next_ikar = 0;
+ Char next_char;
+
+ next_char = next_ikar;
+ while (!P_eof(inputfile) && next_ikar < ' ' && strlen(next_rtf) < 8)
+ { /*END DO*/
+ next_char = getc(inputfile);
+ _SETIO(next_char != EOF, EndOfFile);
+ next_ikar = next_char;
+ if (next_ikar == 13) {
+ input_line_number++;
+ memcpy(prev_line, inpline, (long)lmx);
+ prev_kinp = kinp;
+ kinp = 0;
+ } else if (next_ikar >= ' ') {
+ sprintf(next_rtf + strlen(next_rtf), "%c", next_char);
+ /*END IF*/
+ }
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* read one char except nulls */
+
+Static Void read_char()
+{
+ if (*next_rtf != '\0') {
+ kar = next_rtf[0];
+ strdelete((Anyptr)next_rtf, 1, 1);
+ read_next_char();
+ } else
+ kar = '\032';
+ /*END IF*/
+ ikar = kar;
+ cat = catcode[ikar];
+ if (*next_rtf == '\0') /*END IF*/
+ strcat(next_rtf, "\032");
+
+ if (kinp < lmx) { /*END IF*/
+ kinp++;
+ inpline[kinp-1] = kar;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* outputs the stored output line */
+
+Static Void output_line()
+{
+ short i;
+ string24 simpl_pattern;
+ short FORLIM;
+ Char STR1[28];
+ Char STR2[26];
+ Char STR3[42];
+
+ numl++;
+ simplify("{{}", "{");
+ simplify("{}}", "}");
+ simplify("{}{}", "{}");
+ FORLIM = num_diff_sizes;
+ for (i = 0; i <= FORLIM - 1; i++) { /*END DO*/
+ sprintf(STR2, "\\%s", sizekey[i]);
+ truncate24(simpl_pattern, STR2);
+ sprintf(STR1, "%s{}\\", simpl_pattern);
+ sprintf(STR2, "%s\\", simpl_pattern);
+ simplify(STR1, STR2);
+ sprintf(STR2, "%s}", simpl_pattern);
+ simplify(STR2, "}");
+ }
+ simplify("\\root{}\\of{", "\\sqrt{");
+
+ FORLIM = kout;
+ for (i = 0; i <= FORLIM - 1; i++)
+ _SETIO(putc(exline[i], outputfile) >= 0, FileWriteError);
+ _SETIO(putc('\n', outputfile) >= 0, FileWriteError);
+
+ if (numl % 100 == 0) { /*END IF NUML*/
+/* p2c: rtflatex.cmn, line 915:
+ * Note: Using % for possibly-negative arguments [317] */
+ if (verbose > 0) {
+ sign_str(numl, works);
+ sprintf(STR3, "Output : %s lines ", works);
+ print_msg(1, STR3);
+ FORLIM = bracelvl;
+ for (j = 1; j <= FORLIM; j++)
+ print_msg(1, "{");
+ println_msg(1, "");
+ } else
+ putchar('.');
+ }
+ cleanout();
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* write a character into output line */
+
+Static Void output_real_line()
+{
+ if (kout > 0)
+ output_line();
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* write a character into output line */
+
+Static Void outchr(CHARAC)
+Char CHARAC;
+{
+ Char oldchar;
+ Char newchar = CHARAC;
+ Char STR1[48];
+
+ if (kout > 0) {
+ oldchar = exline[kout-1];
+ if (oldchar == ' ' && newchar == ' ')
+ return;
+ } else if (kout == 0 && last_percent && CHARAC == ' ') {
+ kout = 1;
+ exline[kout-1] = '\\';
+ }
+ /*END IF*/
+ last_percent = false;
+
+ if (kout >= olmx - 2) {
+ /*END IF*/
+ sign_str(kout, works);
+ sprintf(STR1, "Output overflow, KOUT:=%s", works);
+ println_msg(0, STR1);
+ /*END IF*/
+ return;
+ }
+ kout++;
+ exline[kout-1] = newchar;
+ if (newchar != '}' || kout <= 80) {
+ /*END IF*/
+ if (newchar == ' ' && kout > 64)
+ output_line();
+ return;
+ }
+ if (exline[kout-2] == ';') {
+ exline[kout-1] = '\\';
+ kout++;
+ exline[kout-1] = 'r';
+ kout++;
+ exline[kout-1] = 'e';
+ kout++;
+ exline[kout-1] = 'l';
+ kout++;
+ exline[kout-1] = 'a';
+ kout++;
+ exline[kout-1] = 'x';
+ output_line();
+ kout++;
+ exline[kout-1] = ' ';
+ kout++;
+ exline[kout-1] = newchar;
+ return;
+ }
+ if (kout <= 120)
+ return;
+ kout++;
+ exline[kout-1] = '%';
+ kout++;
+ exline[kout-1] = '%';
+ output_line();
+ last_percent = true;
+}
+
+
+/* ===================================================================== */
+/* change contents of bfslcode[bracelvl] : replace first arg with 2nd */
+/* but do not declare font, since output will be standard */
+
+Static Void font_subs2e(old, new_)
+Char *old, *new_;
+{
+ Char workstg[49];
+ short positn;
+
+ positn = strpos2(bfslcode[bracelvl], old, 1);
+ if (positn == 0)
+ return;
+ if (lvlcode[bracelvl] == 9) /* ignore new fonts in header/footer */
+ return;
+ if (verbose >= 2)
+ _SETIO(printf("font_subs2e: %s|%s|%s", old, bfslcode[bracelvl], new_) >= 0,
+ FileWriteError);
+ strcpy(workstg, bfslcode[bracelvl]);
+ strdelete((Anyptr)workstg, positn, strlen(old));
+ if (strpos2(workstg, new_, 1) == 0)
+ strinsert(new_, (Anyptr)workstg, positn);
+ truncate24(bfslcode[bracelvl], workstg);
+ if (verbose >= 2)
+ _SETIO(printf("=>%s\n", workstg) >= 0, FileWriteError);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* inserts a new font specification like \bf \rm \sc into bfslcode[bracelvl] */
+
+Static Void add_to_bfsl(kod)
+Char *kod;
+{ /* bfsl_old:=bfslcode[bracelvl]; */
+ Char bfsl_try[65];
+ Char STR1[256];
+ string24 STR2;
+
+ sprintf(bfsl_try, "%s\\", bfslcode[bracelvl]);
+ sprintf(STR1, "%s\\", kod);
+ if (strpos2(bfsl_try, STR1, 1) > 0)
+ return;
+ sprintf(STR1, "%s%s", bfslcode[bracelvl], kod);
+ strcpy(bfslcode[bracelvl], truncate24(STR2, STR1));
+ /* writeln('add_to:',bfsl_old,'+',kod,'=',bfslcode[bracelvl]); */
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* output one character capitalized if needed */
+
+Static Void outchrc(CHARAC)
+Char CHARAC;
+{
+ Char kar;
+
+ if (lvlcode[bracelvl] == 2)
+ kar = toupper(CHARAC);
+ else
+ kar = CHARAC;
+ outchr(kar);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* write a string into output line */
+
+Static Void outstg(CHARACs)
+Char *CHARACs;
+{
+ short k, FORLIM;
+
+ FORLIM = strlen(CHARACs);
+ for (k = 0; k <= FORLIM - 1; k++)
+ outchr(CHARACs[k]);
+}
+
+
+/* ===================================================================== */
+/* checks the presence of a string at end of current output */
+
+Static boolean last_is(CHARACs)
+Char *CHARACs;
+{
+ boolean Result;
+ short k, long_;
+
+ long_ = strlen(CHARACs);
+/* p2c: rtflatex.cmn: Note: Eliminated unused assignment statement [338] */
+ if (kout < long_)
+ return false;
+ for (k = 0; k <= long_ - 1; k++) {
+ if (exline[kout - long_ + k] != CHARACs[k])
+ return false;
+ }
+ return true;
+}
+
+
+/* ===================================================================== */
+/* remove one string from output */
+
+Static Void outrem(CHARACs)
+Char *CHARACs;
+{
+ short k, long_, FORLIM;
+
+ long_ = strlen(CHARACs);
+ removed_ok = last_is(CHARACs);
+ if (!removed_ok)
+ return;
+ FORLIM = kout;
+ for (k = kout - long_ + 1; k <= FORLIM; k++)
+ exline[kout-1] = ' ';
+ kout -= long_;
+}
+
+
+/* ===================================================================== */
+/* remove all empty pairs of braces at the end of output */
+
+Static Void outrem_empty_braces()
+{
+ short num_removed = 0;
+
+ removed_ok = true;
+ while (removed_ok) { /*END WHILE*/
+ outrem("{}");
+ if (removed_ok)
+ num_removed++;
+ }
+ removed_ok = (num_removed > 0);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* output a TeX keyword ( the \ not in args ) on output line EXLINE */
+
+Static Void outkeyw(CHARACs)
+Char *CHARACs;
+{
+ short k, FORLIM;
+
+ /* eliminate useless brace pairs terminating a previous keyword*/
+ outrem_empty_braces();
+ outchr('\\');
+ FORLIM = strlen(CHARACs);
+ for (k = 0; k <= FORLIM - 1; k++)
+ outchr(CHARACs[k]);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* outputs the new \bf \sl code if different from current at that level */
+
+Static Void output_bfsl()
+{
+ if (!strcmp(bfslcode[bracelvl], currbfsl[bracelvl]))
+ return;
+ if (!strcmp(bfslcode[bracelvl], "\\relax"))
+ return;
+ if (math_mode[bracelvl] > 0)
+ return;
+ outrem_empty_braces();
+ outrem(currbfsl[bracelvl]);
+ font_subs2e("\\rm\\bf", "\\bf");
+ font_subs2e("\\rm\\tt", "\\tt");
+ font_subs2e("\\rm\\it", "\\it");
+ font_subs2e("\\rm\\sf", "\\sf");
+ font_subs2e("\\rm\\sl", "\\sl");
+
+ if (!latex209) {
+ font_subs2e("\\bf\\it", "\\bfit");
+ font_subs2e("\\it\\bf", "\\bfit");
+ font_subs2e("\\bf\\sl", "\\bfsl");
+ font_subs2e("\\sl\\bf", "\\bfsl");
+ font_subs2e("\\bf\\sf", "\\sfbf");
+ font_subs2e("\\sf\\bf", "\\sfbf");
+ font_subs2e("\\sf\\it", "\\sfit");
+ font_subs2e("\\sf\\sl", "\\sfsl");
+ font_subs2e("\\tt\\bf", "\\ttbf");
+ font_subs2e("\\tt\\it", "\\ttit");
+ font_subs2e("\\tt\\sl", "\\ttsl");
+ font_subs2e("\\bf\\tt", "\\ttbf");
+ font_subs2e("\\it\\tt", "\\ttit");
+ font_subs2e("\\sl\\tt", "\\ttsl");
+ font_subs2e("\\sfit\\bf", "\\sfbfit");
+ font_subs2e("\\sfsl\\bf", "\\sfbfsl");
+ font_subs2e("\\bfit\\sf", "\\sfbfit");
+ font_subs2e("\\bfsl\\sf", "\\sfbfsl");
+ }
+ /* latex2e */
+ /*END IF latex209*/
+ outstg(bfslcode[bracelvl]);
+ outstg("{}");
+ strcpy(currbfsl[bracelvl], bfslcode[bracelvl]);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* outputs the new \large code if different from current at that level */
+
+Static Void output_size(codesize)
+Char *codesize;
+{
+ if (!strcmp(codesize, currsize[bracelvl]))
+ return;
+ if (!strcmp(codesize, "relax"))
+ return;
+ if (lvlcode[bracelvl] == 8)
+ return;
+ if (lvlcode[bracelvl] == 9)
+ return;
+ if (math_mode[bracelvl] > 0)
+ return;
+ outkeyw(codesize);
+ if (!base_flag) { /*END IF*/
+ outstg("{}");
+ strcpy(currsize[bracelvl], codesize);
+ }
+ strcpy(currbfsl[bracelvl], "\\relax");
+}
+
+
+/* ----------------------------------------------------------------------*/
+Static Void ensure_sizebfsl()
+{
+ if (par_to_begin)
+ return;
+ if (last_is("{"))
+ output_size(sizecode[bracelvl]);
+ output_bfsl();
+}
+
+
+/* ----------------------------------------------------------------------*/
+Static Void output_skips()
+{
+ if (leftcurskip != leftskip) {
+ str_twips_pt(leftskip, worksa);
+ outkeyw("global\\leftskip ");
+ outstg(worksa);
+ outstg("pt\\relax");
+ leftcurskip = leftskip;
+ }
+
+ if (rightcurskip == rightskip)
+ return;
+ str_twips_pt(rightskip, worksa);
+ outkeyw("global\\rightskip ");
+ outstg(worksa);
+ outstg("pt\\relax");
+ rightcurskip = rightskip;
+}
+
+
+/*---------------------------------------------------------------------------*/
+Static Void close_files()
+{
+ if (outputfile != NULL)
+ fclose(outputfile);
+ outputfile = NULL;
+ if (inputfile != NULL)
+ fclose(inputfile);
+ inputfile = NULL;
+ if (!write_log)
+ return;
+ if (logfile != NULL)
+ fclose(logfile);
+ logfile = NULL;
+}
+
+
+/* ===================================================================== */
+/* remove one keyword from output */
+
+Static Void outkrem(CHARACs)
+Char *CHARACs;
+{
+ Char STR1[256];
+
+ sprintf(STR1, "\\%s", CHARACs);
+ outrem(STR1);
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* open brace and increment bracelvl */
+
+Static Void open_brace()
+{
+ Char STR1[56];
+ Char STR2[34];
+
+ if (bracelvl < maxlevel) {
+ bracelvl++;
+ strcpy(bfslcode[bracelvl], bfslcode[bracelvl-1]);
+ tab_nb_cellx[bracelvl] = tab_nb_cellx[bracelvl-1];
+ tab_cellx[bracelvl] = 0;
+ strcpy(sizecode[bracelvl], sizecode[bracelvl-1]);
+ strcpy(currsize[bracelvl], currsize[bracelvl-1]);
+ strcpy(currbfsl[bracelvl], currbfsl[bracelvl-1]);
+ strcpy(spacingcode[bracelvl], spacingcode[bracelvl-1]);
+ lvlcode[bracelvl] = lvlcode[bracelvl-1];
+ if (bracelvl < maxlevel)
+ lvlcode[bracelvl+1] = 0;
+ strcpy(active_RTFf[bracelvl], active_RTFf[bracelvl-1]);
+ /* propagate math_mode, but say 2 if previous was 1 to avoid extra closins by $ */
+ math_mode[bracelvl] = math_mode[bracelvl-1];
+ if (math_mode[bracelvl] == 1)
+ math_mode[bracelvl] = 2;
+
+ flushright_flag[bracelvl] = flushright_flag[bracelvl-1];
+ if (flushright_flag[bracelvl] == 2)
+ flushright_flag[bracelvl] = 3;
+
+ center_flag[bracelvl] = center_flag[bracelvl-1];
+ if (center_flag[bracelvl] == 2)
+ center_flag[bracelvl] = 3;
+
+ underl_flag[bracelvl] = false;
+ auto_close[bracelvl] = false;
+ *form_code[bracelvl] = '\0';
+ strcpy(close_kar[bracelvl], " ");
+ if (lvlcode[bracelvl] == 3) {
+ lvlcode[bracelvl] = 4;
+ return;
+ }
+ if (lvlcode[bracelvl] == 10) { /*in objects*/
+ lvlcode[bracelvl] = -lvlcode[bracelvl];
+ return;
+ }
+ if (lvlcode[bracelvl] == 15)
+ /*brace opened after \RTFintbl => set normal*/
+ lvlcode[bracelvl] = 0;
+ else if (lvlcode[bracelvl] >= 16) /*in formulas*/
+ lvlcode[bracelvl] = -lvlcode[bracelvl];
+ return;
+ } else {
+ /*END IF*/
+ sign_str(maxlevel, works);
+ sprintf(STR1, "Too many brace levels, max is %s", works);
+ print_msg(0, STR1);
+ sign_str(numl + 1, works);
+ sprintf(STR2, " at line%s", works);
+ println_msg(0, STR2);
+ print_line(0);
+ if (write_log)
+ close_files();
+ _Escape(0);
+ /*END IF bracelvl<maxlevel*/
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* output \begin(<arg>) */
+
+Static Void begin_env(environ)
+short environ;
+{
+ if (kout > 0)
+ output_line();
+ outkeyw("begin{");
+ outstg(environ_type[environ]);
+ outstg("}\\strut");
+ open_brace();
+ output_line();
+}
+
+
+/* ----------------------------------------------------------------------*/
+/* execute \begin{center}/{flushright} is center_flag set to 1 */
+Static Void make_center()
+{
+ if (center_flag[bracelvl] == 1) {
+ begin_env(1);
+ center_flag[bracelvl] = 2;
+ }
+ if (flushright_flag[bracelvl] == 1) {
+ begin_env(2);
+ flushright_flag[bracelvl] = 2;
+ }
+}
+
+
+/* ----------------------------------------------------------------------*/
+Static Void begin_par()
+{
+ short k, FORLIM;
+
+ if (!par_to_begin)
+ return;
+ if (lvlcode[bracelvl] == 6)
+ return;
+ if (lvlcode[bracelvl] == 8)
+ return;
+ if (lvlcode[bracelvl] == 9)
+ return;
+ if (center_flag[bracelvl] + flushright_flag[bracelvl] == 0)
+ output_skips();
+ space_after = save_skip;
+ save_skip = 0;
+ if (num_indent == 0 && lvlcode[bracelvl] != 15 &&
+ center_flag[bracelvl] == 0 && flushright_flag[bracelvl] == 0)
+ outkeyw("noindent ");
+ FORLIM = num_indent;
+ for (k = 2; k <= FORLIM; k++)
+ outkeyw("indent ");
+ num_indent = 0;
+ make_center();
+ output_size(sizecode[bracelvl]);
+ output_bfsl();
+ outkeyw("beginparagraph{}");
+ par_to_begin = false;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* write a string into math mode onto output line, and leave in math mode */
+
+Static Void out_math_leave(CHARACs)
+Char *CHARACs;
+{
+ if (math_mode[bracelvl] > 0)
+ outchr(' ');
+ else {
+ outrem_empty_braces();
+ outrem("$");
+ if (removed_ok)
+ math_mode[bracelvl] = 1;
+ }
+ /*END IF math_mode*/
+ if (math_mode[bracelvl] == 0) { /*END IF math_mode=0*/
+ begin_par();
+ outchr('$');
+ math_mode[bracelvl] = 1;
+ }
+ outstg(CHARACs);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* close math_mode if possible, i.e. =1 */
+
+Static Void close_math()
+{
+ if (math_mode[bracelvl] == 1) { /*END IF math_mode*/
+ outstg(end_math_code);
+ math_mode[bracelvl] = 0;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* write a string into math mode onto output and close math mode if possible*/
+
+Static Void out_math(CHARACs)
+Char *CHARACs;
+{
+ out_math_leave(CHARACs);
+ close_math();
+}
+
+
+/* ===================================================================== */
+/* output one string and capitalize it if required */
+
+Static Void outstgc(CHARACs)
+Char *CHARACs;
+{
+ short k, FORLIM;
+
+ FORLIM = strlen(CHARACs);
+ for (k = 0; k <= FORLIM - 1; k++)
+ outchrc(CHARACs[k]);
+}
+
+
+/* ===================================================================== */
+/* output a number */
+
+Static Void output_num(numb)
+short numb;
+{
+ string24 wkk;
+
+ sign_str(numb, wkk);
+ outstg(wkk);
+}
+
+
+/* ===================================================================== */
+/* output one keyword and capitalize it */
+
+Static Void outkeywc(CHARACs)
+Char *CHARACs;
+{
+ short k, FORLIM;
+
+ outrem_empty_braces();
+ outchr('\\');
+ FORLIM = strlen(CHARACs);
+ for (k = 0; k <= FORLIM - 1; k++)
+ outchrc(CHARACs[k]);
+}
+
+
+/* ===================================================================== */
+/* close brace pair and remove all sub/superscripted empty pairs at end of output */
+
+Static Void close_subs()
+{
+ if (math_mode[bracelvl] > 0)
+ outrem(" ");
+ outchr('}');
+ outrem("^{}");
+ outrem("_{}");
+ outrem("^{ }");
+ outrem("_{ }");
+}
+
+
+/* ===================================================================== */
+/* declares a new font as \global, and record it */
+
+Static Void declare_font(font_id, fontname, magnification)
+Char *font_id, *fontname;
+short magnification;
+{
+ short i, FORLIM;
+ Char STR2[256];
+
+ FORLIM = numfonts;
+ for (i = 0; i <= FORLIM - 1; i++) {
+ if (!strcmp(newfonts[i], font_id))
+ return;
+ }
+ if (numfonts >= maxfonts) { /*END IF*/
+ sprintf(STR2, "Font %s cannot be declared... too many fonts !", font_id);
+ println_msg(0, STR2);
+ return;
+ }
+
+ numfonts++;
+ truncate24(newfonts[numfonts-1], font_id);
+
+ if (kout > 1) /* to have font decl at left of a line */
+ output_line();
+ outstg("\\ifx");
+ outstg(font_id);
+ outstg("\\undefined \\global\\font");
+ outstg(font_id);
+ outstg("=\\FontHdg\\FontHdge ");
+ outstg(fontname);
+ sign_str(magnification, works);
+ outstg(" scaled ");
+ outstg(works);
+ outstg("\\fi");
+ output_line();
+
+}
+
+
+/* ===================================================================== */
+/* change contents of bfslcode[bracelvl] : replace first arg with 2nd */
+
+Static Void font_subs(old, new_, fontname, magnification)
+Char *old, *new_, *fontname;
+short magnification;
+{
+ Char workstg[49];
+ short positn;
+
+ positn = strpos2(bfslcode[bracelvl], old, 1);
+ if (positn == 0)
+ return;
+ if (lvlcode[bracelvl] == 9) /* ignore new fonts in header/footer */
+ return;
+ strcpy(workstg, bfslcode[bracelvl]);
+ strdelete((Anyptr)workstg, positn, strlen(old));
+ if (strpos2(bfslcode[bracelvl], new_, 1) == 0)
+ strinsert(new_, (Anyptr)workstg, positn);
+ truncate24(bfslcode[bracelvl], workstg);
+ declare_font(new_, fontname, magnification);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* builds the correct LaTeX font size according to NUMVAL (unit=1/2 pt) */
+/* stores it in sizecode[bracelvl] ; uses the global variable "stdsize" */
+
+Static Void outfsize(numval, magnif)
+short numval, *magnif;
+{
+ short ll;
+ short selectsize = 0;
+ short latex_size;
+ short best_diff = 30000;
+ Char STR1[68];
+
+ /* I select the nearest sizemags */
+ latex_size = numval * 50;
+ /* convert from half points to hundredths of points */
+ /* big integer */
+ strcpy(sizecode[bracelvl], "tiny");
+ for (ll = 0; ll <= numsizes - 1; ll++) { /*END DO*/
+ if (abs(sizemags[stdkz-1][ll] - latex_size) < best_diff) { /*END IF*/
+ strcpy(sizecode[bracelvl], sizekey[ll]);
+ selectsize = sizemags[stdkz-1][ll];
+ *magnif = sizemags[stdkz-1][ll];
+ best_diff = abs(selectsize - latex_size);
+ }
+ }
+
+ sign_str(selectsize, works);
+ sprintf(STR1, " selectsize=%s xkey=%s", works, sizecode[bracelvl]);
+ println_msg(2, STR1);
+
+}
+
+
+/*---------------------------------------------------------------------------*/
+Static Void font_clean(sizeheader, magnification)
+Char *sizeheader;
+short magnification;
+{
+ Char STR1[256];
+
+ if (latex209) {
+ sprintf(STR1, "%sbfit", sizeheader);
+ font_subs("\\rm\\bf\\it", STR1, "bxti10", magnification);
+ sprintf(STR1, "%sbfit", sizeheader);
+ font_subs("\\rm\\it\\bf", STR1, "bxti10", magnification);
+ sprintf(STR1, "%sbfsl", sizeheader);
+ font_subs("\\rm\\bf\\sl", STR1, "bxsl10", magnification);
+ sprintf(STR1, "%sbfsl", sizeheader);
+ font_subs("\\rm\\sl\\bf", STR1, "bxsl10", magnification);
+ sprintf(STR1, "%ssfbf", sizeheader);
+ font_subs("\\rm\\bf\\sf", STR1, "ssbx10", magnification);
+ sprintf(STR1, "%ssfbf", sizeheader);
+ font_subs("\\rm\\sf\\bf", STR1, "ssbx10", magnification);
+ sprintf(STR1, "%sbfit", sizeheader);
+ font_subs("\\bf\\it", STR1, "bxti10", magnification);
+ sprintf(STR1, "%sbfit", sizeheader);
+ font_subs("\\it\\bf", STR1, "bxti10", magnification);
+ sprintf(STR1, "%sbfsl", sizeheader);
+ font_subs("\\bf\\sl", STR1, "bxsl10", magnification);
+ sprintf(STR1, "%sbfsl", sizeheader);
+ font_subs("\\sl\\bf", STR1, "bxsl10", magnification);
+ sprintf(STR1, "%ssfbf", sizeheader);
+ font_subs("\\bf\\sf", STR1, "ssbx10", magnification);
+ sprintf(STR1, "%ssfbf", sizeheader);
+ font_subs("\\sf\\bf", STR1, "ssbx10", magnification);
+ if (magnification > 2000) { /*definir explicitement les grosses polices*/
+ sprintf(STR1, "%sobf", sizeheader);
+ font_subs("\\rm\\oul", STR1, "obx10", magnification);
+ sprintf(STR1, "%ssf", sizeheader);
+ font_subs("\\rm\\sf", STR1, "ss10", magnification);
+ sprintf(STR1, "%sit", sizeheader);
+ font_subs("\\rm\\it", STR1, "ti10", magnification);
+ sprintf(STR1, "%ssl", sizeheader);
+ font_subs("\\rm\\sl", STR1, "sl10", magnification);
+ sprintf(STR1, "%ssc", sizeheader);
+ font_subs("\\rm\\sc", STR1, "csc10", magnification);
+ sprintf(STR1, "%stt", sizeheader);
+ font_subs("\\rm\\tt", STR1, "tt10", magnification);
+ sprintf(STR1, "%ssf", sizeheader);
+ font_subs("\\sf", STR1, "ss10", magnification);
+ sprintf(STR1, "%sit", sizeheader);
+ font_subs("\\it", STR1, "ti10", magnification);
+ sprintf(STR1, "%ssl", sizeheader);
+ font_subs("\\sl", STR1, "sl10", magnification);
+ sprintf(STR1, "%ssc", sizeheader);
+ font_subs("\\sc", STR1, "csc10", magnification);
+ sprintf(STR1, "%stt", sizeheader);
+ font_subs("\\tt", STR1, "tt10", magnification);
+ }
+ } else {
+ font_subs2e("\\rm\\bf\\it", "\\bfit");
+ font_subs2e("\\rm\\it\\bf", "\\bfit");
+ font_subs2e("\\rm\\bf\\sl", "\\bfsl");
+ font_subs2e("\\rm\\sl\\bf", "\\bfsl");
+ font_subs2e("\\rm\\bf\\sf", "\\sfbf");
+ font_subs2e("\\rm\\sf\\bf", "\\sfbf");
+ font_subs2e("\\rm\\sf\\it", "\\sfit");
+ font_subs2e("\\rm\\sf\\sl", "\\sfsl");
+ font_subs2e("\\bf\\it", "\\bfit");
+ font_subs2e("\\it\\bf", "\\bfit");
+ font_subs2e("\\bf\\sl", "\\bfsl");
+ font_subs2e("\\sl\\bf", "\\bfsl");
+ font_subs2e("\\bf\\sf", "\\sfbf");
+ font_subs2e("\\sf\\bf", "\\sfbf");
+ font_subs2e("\\sf\\it", "\\sfit");
+ font_subs2e("\\sf\\sl", "\\sfsl");
+ if (magnification > 2000) { /*definir explicitement les grosses polices*/
+ sprintf(STR1, "%sobf", sizeheader);
+ font_subs("\\rm\\oul", STR1, "obx10", magnification);
+ sprintf(STR1, "%ssf", sizeheader);
+ font_subs("\\rm\\sf", STR1, "ss10", magnification);
+ sprintf(STR1, "%sit", sizeheader);
+ font_subs("\\rm\\it", STR1, "ti10", magnification);
+ sprintf(STR1, "%ssl", sizeheader);
+ font_subs("\\rm\\sl", STR1, "sl10", magnification);
+ sprintf(STR1, "%ssc", sizeheader);
+ font_subs("\\rm\\sc", STR1, "csc10", magnification);
+ sprintf(STR1, "%stt", sizeheader);
+ font_subs("\\rm\\tt", STR1, "tt10", magnification);
+ sprintf(STR1, "%ssf", sizeheader);
+ font_subs("\\sf", STR1, "ss10", magnification);
+ sprintf(STR1, "%sit", sizeheader);
+ font_subs("\\it", STR1, "ti10", magnification);
+ sprintf(STR1, "%ssl", sizeheader);
+ font_subs("\\sl", STR1, "sl10", magnification);
+ sprintf(STR1, "%ssc", sizeheader);
+ font_subs("\\sc", STR1, "csc10", magnification);
+ sprintf(STR1, "%stt", sizeheader);
+ font_subs("\\tt", STR1, "tt10", magnification);
+ }
+ }
+ sprintf(STR1, "%sobf", sizeheader);
+ /* latex2e */
+ /*END IF latex209*/
+ font_subs("\\rm\\oul", STR1, "obx10", magnification);
+
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* output the correct LaTeX spacing size according to NUMVAL (unit=1/20 pt) */
+/* stores it in spacingcode[bracelvl] ; uses the global variable "stdsize" */
+
+Static Void outpsize(numval)
+short numval;
+{
+ short ll;
+ short selectsize = 0, best_diff = 30000;
+ Char STR1[108];
+ Char STR3[40];
+
+ if (base_flag) {
+ str_twips_pt(numval, worksa);
+ sprintf(STR3, "baselineskip%spt", worksa);
+ truncate24(spacingcode[bracelvl], STR3);
+ return;
+ }
+ /* I select the nearest sizeval -- spacings in twips */
+ /* big integer */
+ strcpy(spacingcode[bracelvl], "tiny");
+ for (ll = 0; ll <= numsizes - 1; ll++) { /*END DO*/
+ if (abs(sizeval[stdkz-1][ll] - numval) < best_diff) { /*END IF*/
+ strcpy(spacingcode[bracelvl], sizekey[ll]);
+ selectsize = sizeval[stdkz-1][ll];
+ best_diff = abs(sizeval[stdkz-1][ll] - numval);
+ }
+ }
+
+ sign_str(numval, works);
+ sign_str(selectsize, worksa);
+ sprintf(STR1, "--> (\\par)numval=%s selectsize=%s pkey=%s",
+ works, worksa, spacingcode[bracelvl]);
+ print_msg(2, STR1);
+ /*END IF*/
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* remove $^ before, and remove math_mode if possible */
+
+Static Void remove_mathat()
+{
+ if (math_mode[bracelvl] > 0) { /*END IF math_mode*/
+ if (auto_close[bracelvl]) {
+ outrem("{");
+ if (removed_ok)
+ bracelvl--;
+ }
+ outrem("^");
+ outrem("\\relax");
+ if (math_mode[bracelvl] == 1) {
+ outrem("$");
+ if (removed_ok)
+ math_mode[bracelvl] = 0;
+ }
+ }
+ outrem("{}");
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* close brace and decrement bracelvl */
+
+Static Void close_brace()
+{
+ Char STR1[44];
+ Char STR3[68];
+
+ if (bracelvl <= 0) {
+ sign_str(numl + 1, works);
+ sprintf(STR1, "Too many } at line %s", works);
+ println_msg(0, STR1);
+ print_line(0);
+ outstg("}%%%%% *****");
+ } else {
+ if (lvlcode[bracelvl] != 6) {
+ if (tex_verbose > 1) {
+ sign_str(bracelvl, worksa);
+ sign_str(lvlcode[bracelvl], works);
+ sprintf(STR3, "\\closebr{%s[%s]}\\relax", worksa, works);
+ outstg(STR3);
+ output_line();
+ }
+ }
+ }
+ bracelvl--;
+ /* reset footnote cleaning */
+ if (lvlcode[bracelvl] == 3) /*END IF bracelvl*/
+ lvlcode[bracelvl] = 0;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* output \end(<arg>) */
+
+Static Void end_env(environ)
+short environ;
+{
+ output_line();
+ outkeyw("end{");
+ outstg(environ_type[environ]);
+ outchr('}');
+ close_brace();
+ output_line();
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* stores a new couple of word font chars and number taken in
+decl_font_num which is a global variable */
+
+Static Void store_word_font(font_type)
+Char *font_type;
+{
+ short k;
+ Char new_fnt_name[256];
+ short loc_brace_count = 0;
+ short FORLIM;
+ Char STR2[256], STR3[256];
+
+ sign_str(decl_font_num, works);
+ FORLIM = num_word_fonts;
+ for (k = 0; k <= FORLIM - 1; k++) { /*END/IF + END FOR*/
+ if (word_font_num[k] == decl_font_num) {
+ sprintf(STR2, "RTF font No. %s/%s already declared; this one ignored.",
+ works, font_type);
+ println_msg(0, STR2);
+ return;
+ }
+ }
+ if (num_word_fonts >= maxfonts) { /*END IF*/
+ sprintf(STR3, "Too many RTF fonts: %s/%s; this one ignored.",
+ works, font_type);
+ println_msg(0, STR3);
+ return;
+ }
+ *new_fnt_name = '\0';
+ while (kar != ';' && kar != '}' || loc_brace_count > 0) {
+ /* while (kar<>';') do */
+ if (kar == '{')
+ loc_brace_count++;
+ if (kar == '}')
+ loc_brace_count--;
+ read_char();
+ if (kar != ' ')
+ sprintf(new_fnt_name + strlen(new_fnt_name), "%c", kar);
+ }
+ outrem_empty_braces();
+ num_word_fonts++;
+ word_font_num[num_word_fonts-1] = decl_font_num;
+ truncate24(word_fonts[num_word_fonts-1], font_type);
+ sign_str(num_word_fonts, worksa);
+ if (strpos2(new_fnt_name, "Courier", 1) > 0)
+ strcpy(equiv_fonts[num_word_fonts-1], "\\tt");
+ else if (strpos2(new_fnt_name, "TTY", 1) > 0)
+ strcpy(equiv_fonts[num_word_fonts-1], "\\tt");
+ else if (strpos2(new_fnt_name, "Helvetica", 1) > 0)
+ strcpy(equiv_fonts[num_word_fonts-1], "\\sf");
+ else if (strpos2(new_fnt_name, "SansSerif", 1) > 0)
+ strcpy(equiv_fonts[num_word_fonts-1], "\\sf");
+ else
+ *equiv_fonts[num_word_fonts-1] = '\0';
+ sprintf(STR3, "%s Font %s stored: \"%s\" = %s",
+ worksa, works, font_type, new_fnt_name);
+ /*END IF*/
+ println_msg(2, STR3);
+}
+
+
+
+/*---------------------------------------------------------------------------*/
+/* sets active_RTFf of current bracelvl at the alpha value recorded with kkk
+as \F<number> in \fonttbl declaration */
+
+Static Void set_active_RTFf(kkk)
+short kkk;
+{
+ short k, FORLIM;
+ Char STR1[40];
+ Char STR2[100];
+ Char STR3[38];
+ Char STR4[62];
+ Char STR5[82];
+
+ FORLIM = num_word_fonts;
+ for (k = 0; k <= FORLIM - 1; k++) { /*END/IF + END FOR*/
+ if (word_font_num[k] == kkk) {
+ sign_str(kkk, works);
+ sprintf(STR2, "RTF font No. %s of type %s \"%s\"",
+ works, word_fonts[k], equiv_fonts[k]);
+ println_msg(2, STR2);
+ add_to_bfsl(equiv_fonts[k]);
+ ensure_sizebfsl();
+ strcpy(active_RTFf[bracelvl], word_fonts[k]);
+ return;
+ }
+ }
+ if (lvlcode[bracelvl] != 6) { /*END IF lvlcode*/
+ print_line(2);
+ sign_str(num_word_fonts, works);
+ sprintf(STR1, "num_word_fonts=%s", works);
+ println_msg(2, STR1);
+ FORLIM = num_word_fonts;
+ for (k = 0; k <= FORLIM - 1; k++) {
+ sign_str(word_font_num[k], works);
+ sprintf(STR4, " %s --> \"%s\"", works, word_fonts[k]);
+ println_msg(2, STR4);
+ }
+ sign_str(kkk, works);
+ sprintf(STR3, "RTF font No. %s", works);
+ print_msg(2, STR3);
+ sign_str(lvlcode[bracelvl], works);
+ sign_str(bracelvl, worksa);
+ sprintf(STR5, " font of type unknown, lvlcode[%s]=%s", worksa, works);
+ println_msg(2, STR5);
+ sign_str(lvlcode[bracelvl-1], works);
+ sign_str(bracelvl - 1, worksa);
+ sprintf(STR5, " font of type unknown, lvlcode[%s]=%s", worksa, works);
+ println_msg(2, STR5);
+ }
+ *active_RTFf[bracelvl] = '\0';
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* closing a \sum(...) ... possibly at a ) found !!!!!*/
+
+Static Void close_sum()
+{
+ close_brace();
+ close_math();
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* closing a \sum(...) ... possibly at a closing brace if no ) found !!!!!*/
+
+Static Void close_sum_emergency(kode)
+Char *kode;
+{
+ short k;
+ Char STR1[256];
+ Char STR3[42];
+ short FORLIM;
+
+ sign_str(input_line_number, works);
+ sprintf(STR1, "Emergency close of \\|su or \\|i due to }%s at inp.line %s",
+ kode, works);
+ println_msg(1, STR1);
+ sign_str(next_rtf[0], works);
+ sprintf(STR3, "pattern : \"%c%c\" %s", kar, next_rtf[0], works);
+ print_msg(1, STR3);
+ print_line(1);
+ _SETIO(printf("kinp=%d prev_kinp=%d\n", kinp, prev_kinp) >= 0,
+ FileWriteError);
+ FORLIM = prev_kinp;
+ for (k = 0; k <= FORLIM - 1; k++) {
+ sprintf(STR1, "%c", prev_line[k]);
+ print_msg(1, STR1);
+ }
+ println_msg(1, " ");
+ FORLIM = kinp;
+ for (k = 0; k <= FORLIM - 1; k++) {
+ sprintf(STR1, "%c", inpline[k]);
+ print_msg(1, STR1);
+ }
+ println_msg(1, " ");
+ outstg("\\emergcA ");
+ close_sum();
+}
+
+
+/* --------------------------------------------------------------------------*/
+Static Void perform_RTFcell()
+{
+ if (verbose > 0)
+ _SETIO(printf("(found)%s[%d,%d,%d]\n",
+ inkeyw, lvlcode[bracelvl], tab_nb_ands[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ if (lvlcode[bracelvl] == 15) {
+ output_real_line();
+ /* count the number of ampersands in the tabular line */
+ tab_nb_ands[bracelvl]++;
+ if (tab_nb_ands[bracelvl] < tab_nb_cellx[bracelvl]) {
+ outstg(" & ");
+ if (verbose > 1)
+ _SETIO(printf("(after &)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ return;
+ }
+ outstg("\\\\");
+ if (clbrdrb)
+ outkeyw("hline ");
+ if (verbose > 1)
+ _SETIO(printf("(after &->\\\\)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ return;
+ }
+ if (verbose > 2)
+ _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= 0,
+ FileWriteError);
+ outkeyw("relax");
+ output_line(); /* next line to ensure possible removal */
+ outkeyw("RTFcell ");
+ /*END IF lvlcode*/
+
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* procedure to close center and flushright environments */
+
+Static Void close_envir()
+{
+ boolean RTF_cell_removed;
+
+ envir_closed_ok = false;
+ if (center_flag[bracelvl] == 2) {
+ if (!no_space_conv)
+ output_size(spacingcode[bracelvl]);
+ outkrem("RTFcell ");
+ RTF_cell_removed = removed_ok;
+ center_flag[bracelvl] = 0;
+ end_env(1);
+ if (RTF_cell_removed)
+ perform_RTFcell();
+ output_line();
+ envir_closed_ok = true; /* output_line; */
+ return;
+ }
+ if (flushright_flag[bracelvl] != 2)
+ return;
+ if (!no_space_conv)
+ output_size(spacingcode[bracelvl]);
+ outkrem("RTFcell ");
+ RTF_cell_removed = removed_ok;
+ flushright_flag[bracelvl] = 0;
+ end_env(2);
+ if (RTF_cell_removed)
+ perform_RTFcell();
+ output_line();
+ envir_closed_ok = true; /* output_line; */
+ /*END IF center_flag*/
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* procedure to perform RTFsb/RTFsa */
+
+Static Void make_RTFsab(numval)
+short numval;
+{
+ Char STR1[48];
+
+ if (numval > 300) {
+ outkeyw("bigskip{}");
+ return;
+ }
+ if (numval > 200) {
+ outkeyw("medskip{}");
+ return;
+ }
+ if (numval > 100) {
+ outkeyw("smallskip{}");
+ return;
+ }
+ if (numval > 0) {
+ outkeyw("vspace 0.5\\smallskipamount{}");
+ return;
+ }
+ if (numval < 0) {
+ sign_str(numval, works);
+ sprintf(STR1, "neg. spacing, NUMVAL:=%s", works);
+ println_msg(1, STR1);
+ /*END IF*/
+ }
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* procedure to perform RTFpar (separate since it may be delayed after a } */
+
+Static Void make_RTFpar(texcode)
+Char *texcode;
+{
+ short k;
+ short num_forced = 0;
+ boolean was_underl;
+ Char STR1[72];
+ Char STR2[36];
+ Char STR3[44];
+
+ while (math_mode[bracelvl] > 1) {
+ if (lvlcode[bracelvl] == 16)
+ outstg("\\relax %%% ???");
+ else
+ outstg("}\\relax %%% !!!");
+ output_line();
+ close_brace();
+ num_forced++;
+ }
+ close_math();
+ if (num_forced > 0) { /*END IF*/
+ close_envir();
+ output_size(spacingcode[bracelvl]);
+ output_line();
+ output_line();
+ par_to_begin = true;
+ num_indent = 0;
+ if (space_after != 0)
+ make_RTFsab(space_after);
+ space_after = 0;
+ sign_str(input_line_number, worksa);
+ sign_str(bracelvl, works);
+ sprintf(STR1, "input line %s, bracelvl=%s", worksa, works);
+ println_msg(0, STR1);
+ sign_str(num_forced, works);
+ sprintf(STR2, "num_forced=%s", works);
+ println_msg(0, STR2);
+ }
+
+ was_underl = underl_flag[bracelvl];
+ outkrem(bfslcode[bracelvl]);
+ if (was_underl)
+ outchr('}');
+ output_line();
+ if (!no_space_conv)
+ output_size(spacingcode[bracelvl]);
+ close_envir();
+ if (!(envir_closed_ok || no_space_conv))
+ outkeyw("null ");
+ outstg(texcode);
+ if (space_after != 0)
+ make_RTFsab(space_after);
+ space_after = 0;
+ par_to_begin = true;
+ num_indent = 0;
+
+ if (was_underl)
+ outkeyw("underbar{");
+
+ for (k = 1; k <= num_forced; k++) { /*END DO*/
+ outchr('{');
+ bracelvl++;
+ math_mode[bracelvl] = 0; /*do not open ??? */
+ }
+
+ sign_str(bracelvl, works);
+ if (num_forced > 0) {
+ sprintf(STR3, "restored bracelvl=%s", works);
+ println_msg(0, STR3);
+ }
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* replace recent space with a ~ (before : ; ? ! in general */
+Static Void insert_tilde(CHARAC)
+Char CHARAC;
+{
+ if (math_mode[bracelvl] == 0) { /*END IF*/
+ outrem(" ");
+ if (removed_ok)
+ outchr('~');
+ }
+ begin_par();
+ outchr(CHARAC);
+ keyw = 0;
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* initiates "tabular" but does not reset parms to zero */
+Static Void perform_RTFtrow()
+{
+ if (verbose > 0)
+ _SETIO(printf("(init row)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl], bracelvl) >= 0, FileWriteError);
+ open_brace();
+ lvlcode[bracelvl] = 13;
+ if (verbose > 1)
+ _SETIO(printf("%s(after)[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= 0,
+ FileWriteError);
+ tab_nb_ands[bracelvl] = 0;
+}
+
+
+/* --------------------------------------------------------------------------*/
+Static Void perform_RTFrow()
+{
+ if (lvlcode[bracelvl] == 15) {
+ if (verbose > 0)
+ _SETIO(printf("\\RTFrow[%d,%d,%d]\n",
+ lvlcode[bracelvl], tab_nb_cellx[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ close_brace();
+ outkeyw("end{tabular}\\par ");
+ tab_nb_cellx[bracelvl] = tab_nb_cellx[bracelvl+1];
+ return;
+ }
+ if (verbose > 1)
+ _SETIO(printf("\\RTFrow[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0,
+ FileWriteError);
+ output_real_line();
+ outkeyw("RTFrow ");
+ /*END IF lvlcode*/
+
+}
+
+
+/* --------------------------------------------------------------------------*/
+Static Void make_closing_brace()
+{
+ Char pict_byte;
+ boolean already_closed = false;
+ Char STR1[142];
+ Char STR2[148];
+ Char STR3[34];
+
+ while (auto_close[bracelvl]) { /*END WHILE auto_close*/
+ if (math_mode[bracelvl] == 1)
+ outchr('$');
+ outchr('}');
+ close_brace();
+ }
+ /* check "*/
+ /*" within \|I(...) and similar : then ignore pair */
+ if (lvlcode[bracelvl] >= 16 && next_rtf[0] == '{') {
+ next_rtf[0] = '\0';
+ return;
+ }
+ if (*form_code[bracelvl] != '\0' && next_rtf[0] == '{') {
+ next_rtf[0] = '\0';
+ return;
+ }
+ /* special case of \|su(...) closing */
+ if (lvlcode[bracelvl] == 25)
+ close_sum();
+ else if (lvlcode[bracelvl] >= 16)
+ close_sum_emergency("lvlc");
+ /*END IF*/
+ close_math();
+
+ if (lvlcode[bracelvl] != 4) {
+ if (lvlcode[bracelvl] == 5) {
+ /* this is \RTFpict closing brace */
+ if (pict_left_hexa) { /*END IF pict_left_hexa*/
+ /* look whether there is already one hexa digit stored*/
+ pict_last_hexa *= 16;
+ pict_byte = pict_last_hexa;
+ _SETIO(putc(pict_byte, figurefile) >= 0, FileWriteError);
+ pict_byte_number++;
+ pict_last_hexa = 0;
+ pict_left_hexa = false;
+ }
+
+ if (figurefile != NULL)
+ fclose(figurefile);
+ figurefile = NULL;
+ sprintf(STR1, "closed file %s", figure_name);
+ print_msg(1, STR1);
+ sign_str((int)pict_byte_number, works);
+ sprintf(STR3, "(%s bytes)", works);
+ println_msg(1, STR3);
+ outchr(kar);
+ } else if (lvlcode[bracelvl] == 10) {
+ sprintf(STR2, "closed dummy file %s", figure_name);
+ /* this is \RTFobject closing brace */
+ println_msg(1, STR2);
+ outchr(kar);
+ }
+ /* if there was a \cell just before, put it outside the closing brace */
+ else if (last_is("\\RTFcell ")) {
+ if (verbose > 1)
+ _SETIO(printf("closing}[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0,
+ FileWriteError);
+ outkrem("RTFcell ");
+ if (!removed_ok)
+ _SETIO(printf("*** \\RTFcell not removed before } ***\n") >= 0,
+ FileWriteError);
+ outchr(kar);
+ close_brace();
+ already_closed = true;
+ if (verbose > 0)
+ _SETIO(printf("moved \\RTFcell [%d,%d]\n",
+ lvlcode[bracelvl], bracelvl) >= 0, FileWriteError);
+ perform_RTFcell();
+ }
+ /* if there was a \row just before, put it outside the closing brace */
+ else if (last_is("\\RTFrow ")) {
+ if (verbose > 1)
+ _SETIO(printf("closing}[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0,
+ FileWriteError);
+ outkrem("RTFrow ");
+ outchr(kar);
+ close_brace();
+ already_closed = true;
+ if (verbose > 0)
+ _SETIO(printf("moved \\RTFrow [%d,%d]\n", lvlcode[bracelvl], bracelvl) >=
+ 0, FileWriteError);
+ perform_RTFrow();
+ } else {
+ /* if there was a \par just before, put it outside the closing brace */
+ if (last_is("\\null \\par ")) {
+ outkrem("null \\par ");
+ outchr(kar);
+ if (no_space_conv)
+ outkeyw("par ");
+ else
+ outkeyw("null \\par ");
+ } else if (last_is("\\par ")) {
+ outkrem("par ");
+ outchr(kar);
+ outkeyw("par ");
+ } else
+ outchr(kar);
+ /*ENF IF*/
+
+ if (*form_code[bracelvl] != '\0') { /*END IF*/
+ if (*form_code[bracelvl-1] == '\0')
+ strcpy(form_code[bracelvl-1], form_code[bracelvl]);
+ else {
+ close_sum_emergency("form");
+ /* this is an ordinary closing brace */
+ }
+ }
+ /*END IF*/
+ }
+ }
+ /* this is footnote first and dummy RTF argument closing brace */
+
+ /*END IF*/
+ if (!already_closed) {
+ close_brace();
+ /*END IF*/
+ }
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* special output of single characters due to \TeX special codings */
+
+Static Void special_TeX_chars()
+{
+ Char STR1[256];
+
+ begin_par();
+ if (kar == '$') {
+ outstg("\\$");
+ /*END IF*/
+ return;
+ }
+ if (kar == '_') {
+ outstg("\\_");
+ return;
+ }
+ if (kar == '#') {
+ outstg("\\#");
+ return;
+ }
+ if ((kar == '>' || kar == '<') && math_mode[bracelvl] == 0) {
+ sprintf(STR1, "%c", kar);
+ out_math(STR1);
+ return;
+ }
+ if (kar == '&') {
+ outstg("\\&");
+ return;
+ }
+ if (kar == '%') {
+ outstg("\\%");
+ return;
+ }
+ if (kar == '^') {
+ outstg("\\^{ }");
+ return;
+ }
+ if (kar == '~')
+ out_math("\\sim{}");
+ else
+ outchr(kar);
+}
+
+
+/* --------------------------------------------------------------------------*/
+/* **************** Beginning of RTF decoding procedures ******************* */
+/*---------------------------------------------------------------------------*/
+/* treats a character when KEYW is 0 */
+/* no keyword decoding presently active */
+
+Static Void keyw_is_0()
+{
+ short hexa_digit;
+ Char pict_byte;
+ string24 open_kar, RTFform, acc_converted, STR1;
+ Char STR2[28];
+ Char STR3[26];
+ Char STR4[256];
+ Char STR5[32];
+ Char STR6[36];
+ Char STR8[12];
+
+ if (cat == 0) { /* this is a backslash */
+ if (lvlcode[bracelvl] == 3)
+ return;
+ /* ignore after \footnote until opening brace */
+ if (lvlcode[bracelvl] == 4)
+ return;
+ /* ignore after \footnote { (first brace pair after) */
+ if (lvlcode[bracelvl] == 9) {
+ /*END IF active_RTF*/
+ return;
+ }
+
+ keyw = 1;
+ numval = 0;
+ numsign = 1;
+ strcpy(inkeyw, "\\RTF");
+ return;
+ }
+ /*END IF*/
+ if (cat == 1) { /* this is an opening brace */
+ if (no_RTFrtf) /* ignore first opening brace before \rtf1 */
+ return;
+ if (lvlcode[bracelvl] == 3) {
+ open_brace();
+ return;
+ }
+ if (lvlcode[bracelvl] == 4) {
+ open_brace();
+ return;
+ }
+ if (lvlcode[bracelvl] == 6) {
+ outchr(kar);
+ open_brace();
+ return;
+ }
+ if (par_to_begin)
+ output_size(sizecode[bracelvl]);
+ make_center();
+ outchr(kar);
+ open_brace();
+ return;
+ }
+ /*END IF*/
+ if (cat == 2) { /* this is a closing brace */
+ close_envir();
+ if (bracelvl > 0)
+ make_closing_brace();
+ return;
+ }
+ if (cat == 3) { /* this is an opening parenthesis '(' */
+ if (*form_code[bracelvl] != '\0') {
+ if (!strcmp(form_code[bracelvl], "\\RTFformulaB")) {
+ sprintf(STR2, "%sBC(", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR1, STR2));
+ }
+ if (!strcmp(form_code[bracelvl], "\\RTFformulaBLC")) {
+ sprintf(STR3, "%s(", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR1, STR3));
+ }
+ if (!strcmp(form_code[bracelvl], "\\RTFformulaBRC")) {
+ sprintf(STR3, "%s(", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR1, STR3));
+ }
+ if (!strcmp(form_code[bracelvl], "\\RTFformulaBBC")) {
+ sprintf(STR3, "%s(", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR1, STR3));
+ }
+ if (strpos2(form_code[bracelvl], "\\RTFformulaBBC", 1) > 0) {
+ strcpy(RTFform, form_code[bracelvl]);
+ sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]);
+ if (!strcmp(open_kar, "{"))
+ strcpy(open_kar, "\\{");
+ out_math_leave("\\left");
+ outstg(open_kar);
+ outchr(' ');
+ *form_code[bracelvl] = '\0';
+ open_brace();
+ lvlcode[bracelvl] = 16; /* special code to close with ) */
+ if (!strcmp(open_kar, "("))
+ strcpy(close_kar[bracelvl], ")");
+ else if (!strcmp(open_kar, "["))
+ strcpy(close_kar[bracelvl], "]");
+ else if (!strcmp(open_kar, "\\{"))
+ strcpy(close_kar[bracelvl], "\\}");
+ else
+ strcpy(close_kar[bracelvl], open_kar);
+ /*END IF open_kar*/
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ if (strpos2(form_code[bracelvl], "\\RTFformulaBLC", 1) > 0) {
+ strcpy(RTFform, form_code[bracelvl]);
+ sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]);
+ if (!strcmp(open_kar, "{"))
+ strcpy(open_kar, "\\{");
+ out_math_leave("\\left");
+ outstg(open_kar);
+ outchr(' ');
+ *form_code[bracelvl] = '\0';
+ open_brace();
+ lvlcode[bracelvl] = 16; /* special code to close with ) */
+ strcpy(close_kar[bracelvl], ".");
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ if (strpos2(form_code[bracelvl], "\\RTFformulaBRC", 1) > 0) {
+ strcpy(RTFform, form_code[bracelvl]);
+ sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]);
+ if (!strcmp(open_kar, "{"))
+ strcpy(open_kar, "\\{");
+ out_math_leave("\\left. ");
+ *form_code[bracelvl] = '\0';
+ open_brace();
+ lvlcode[bracelvl] = 16; /* special code to close with ) */
+ if (!strcmp(open_kar, "("))
+ strcpy(close_kar[bracelvl], ")");
+ else if (!strcmp(open_kar, "["))
+ strcpy(close_kar[bracelvl], "]");
+ else if (!strcmp(open_kar, "\\{"))
+ strcpy(close_kar[bracelvl], "\\}");
+ else
+ strcpy(close_kar[bracelvl], open_kar);
+ /*END IF open_kar*/
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|F( ... ; ... ) */
+ if (!strcmp("\\RTFformulaF", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("{\\displaystyle ");
+ open_brace();
+ lvlcode[bracelvl] = 17;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|D\|BA() or \|D\|FO() */
+ if (!strcmp("\\RTFformulaDFO", form_code[bracelvl])) {
+ sign_str(displ_skip, worksa);
+ *form_code[bracelvl] = '\0';
+ sprintf(STR5, "kern %spt", worksa);
+ outkeyw(STR5);
+ open_brace();
+ lvlcode[bracelvl] = 28;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|D\|LI() */
+ if (!strcmp("\\RTFformulaDLI", form_code[bracelvl])) {
+ sign_str(displ_skip, worksa);
+ *form_code[bracelvl] = '\0';
+ sprintf(STR6, "RTFhrule %spt", worksa);
+ outkeyw(STR6);
+ open_brace();
+ lvlcode[bracelvl] = 28;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|O( ... ; ... ) */
+ if (!strcmp("\\RTFformulaO", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ begin_par();
+ outkeyw("hbox{\\ooalign{\\hfil{}");
+ open_brace();
+ lvlcode[bracelvl] = 26;
+ math_mode[bracelvl] = 0;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|L( ... ; ... ) */
+ if (!strcmp("\\RTFformulaL", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ begin_par();
+ outchr('{');
+ open_brace();
+ lvlcode[bracelvl] = 27;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|R( ... ; ... ) */
+ if (!strcmp("\\RTFformulaR", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("\\sqrt{");
+ open_brace();
+ lvlcode[bracelvl] = 23;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|X( ... ; ... ) */
+ if (strpos2(form_code[bracelvl], "\\RTFformulaX", 1) > 0) {
+ *form_code[bracelvl] = '\0';
+ begin_par();
+ sprintf(STR8, "\\boxed%s{", strsub(STR4, form_code[bracelvl], 11, 3));
+ outstg(STR8);
+ open_brace();
+ lvlcode[bracelvl] = 7;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|S( ... ; ... ) */
+ if (!strcmp("\\RTFformulaS", form_code[bracelvl]) ||
+ !strcmp("\\RTFformulaSUP", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("^{");
+ open_brace();
+ lvlcode[bracelvl] = 18;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|SDO( ... ; ... ) */
+ if (!strcmp("\\RTFformulaSDO", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("_{");
+ open_brace();
+ lvlcode[bracelvl] = 19;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|I( ... ; ... ) */
+ if (!strcmp("\\RTFformulaI", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("\\int_{");
+ open_brace();
+ lvlcode[bracelvl] = 20;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|ISU( ... ; ... ) */
+ if (!strcmp("\\RTFformulaISU", form_code[bracelvl])) {
+ *form_code[bracelvl] = '\0';
+ out_math_leave("\\displaystyle\\sum_{");
+ open_brace();
+ lvlcode[bracelvl] = 20;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* case of \|IPR( ... ; ... ) */
+ if (strcmp("\\RTFformulaIPR", form_code[bracelvl]))
+ return;
+ *form_code[bracelvl] = '\0';
+ out_math_leave("\\displaystyle\\prod_{");
+ open_brace();
+ lvlcode[bracelvl] = 20;
+ kar = ' '; /* to prevent do_it_again */
+ return;
+ }
+ /* if an opening parenthese is found inside a deep formula, set lvlcode at 25 */
+ /*END IF*/
+ if (abs(lvlcode[bracelvl]) < 17) {
+ begin_par();
+ outchr(kar);
+ return;
+ }
+ outchr(kar);
+ open_brace();
+ lvlcode[bracelvl] = 25;
+ return;
+ }
+ /*END IF form_code */
+ if (cat == 4) { /* this is a closing parenthesis ')' */
+ /* test 23 sept */
+ while (lvlcode[bracelvl] < 0 && auto_close[bracelvl])
+ { /*END WHILE auto_close*/
+ if (math_mode[bracelvl] == 1)
+ outchr('$');
+ outchr('}');
+ close_brace();
+ }
+ /* fin test 23 sept */
+ /* special case of \|B..(...) closing */
+ if (lvlcode[bracelvl] == 16) {
+ outstg("\\right");
+ outstg(close_kar[bracelvl]);
+ close_sum();
+ return;
+ }
+ /* special case of \|X..(...) closing */
+ if (lvlcode[bracelvl] == 7) {
+ outchr('}');
+ close_sum();
+ return;
+ }
+ /* closing parenthese found inside a formula, was opened with another ( 25 */
+ if (lvlcode[bracelvl] == 25) {
+ outchr(kar);
+ close_brace();
+ return;
+ }
+ /* closing parenthese found inside a formula \|O */
+ if (lvlcode[bracelvl] == 26) {
+ close_math();
+ outstg("\\hfil}}");
+ close_brace();
+ return;
+ }
+ /* closing parenthese found inside a formula \|L */
+ if (lvlcode[bracelvl] == 27) {
+ outchr('}');
+ close_brace();
+ return;
+ }
+ /* closing parenthese found inside a formula \|D */
+ if (lvlcode[bracelvl] == 28) {
+ outstg("{}");
+ close_brace();
+ return;
+ }
+ /* special case of \|F(...) closing */
+ /* special case of \|S(...) closing */
+ /* special case of \|SDO(...) closing */
+ /* special case of \|I(...) closing */
+ /* special case of \|I(..;..) closing */
+ /* special case of \|I(..;..;..) closing */
+ /* special case of \|R(...) closing */
+ if (lvlcode[bracelvl] >= 17) {
+ close_subs();
+ close_sum();
+ return;
+ }
+ /* closing parenthese found inside a deep formula, make it 1 level lower */
+ if (-lvlcode[bracelvl] >= 17)
+ sprintf(next_rtf, "}){%s", strcpy(STR4, next_rtf));
+ else {
+ begin_par();
+ outchr(kar);
+ }
+ return;
+ }
+ /* Ignore chars to be ignored */
+ /*END IF lvlcode*/
+ if (lvlcode[bracelvl] == 1)
+ return;
+
+ if (lvlcode[bracelvl] == 3)
+ return;
+
+ if (lvlcode[bracelvl] == 4)
+ return;
+
+ if (lvlcode[bracelvl] == 5) { /* we are in the hexa part of a \RTFpict */
+ /* ignore possible blanks and control characters within hexadecimal field */
+ if (kar <= 32) /*END IF*/
+ return;
+ hexa_digit = hx_to_i(kar);
+ pict_char_number++;
+ if (pict_left_hexa) {
+ /* there is already one hexa digit stored*/
+ pict_last_hexa = pict_last_hexa * 16 + hexa_digit;
+ pict_byte = pict_last_hexa;
+ _SETIO(putc(pict_byte, figurefile) >= 0, FileWriteError);
+ pict_byte_number++;
+ pict_last_hexa = 0;
+ pict_left_hexa = false;
+ return;
+ }
+ /* there is no hexa digit stored*/
+ pict_last_hexa = hexa_digit;
+ last_kar = kar;
+ pict_left_hexa = true;
+ return;
+ }
+ /*END IF pict-left_hexa*/
+ if (abs(lvlcode[bracelvl]) == 10) /* we are in \RTFobject */
+ return;
+
+ if (abs(lvlcode[bracelvl]) == 9) /* ignore other than braces */
+ return;
+
+ if (cat == 11) { /* this is a letter */
+ begin_par();
+ if (lvlcode[bracelvl] == 2) { /* letters to be capitalized ? */
+ kar = toupper(kar);
+ ikar = kar;
+ }
+ /*END IF lvlcode=2*/
+ if (!strcmp(active_RTFf[bracelvl], "ftech")) {
+ strcpy(acc_converted, ftech_transl[ikar]);
+ if (*acc_converted != '\0')
+ out_math(acc_converted);
+ else
+ outchr(kar);
+ return;
+ }
+ /*END IF acc_converted*/
+ outrem("\\beginparagraph{}");
+ if (removed_ok && kout > 0)
+ outstg("{}");
+ outchr(kar);
+ return;
+ }
+ /*END IF active_RTF*/
+ if (!strcmp(active_RTFf[bracelvl], "ftech")) {
+ begin_par();
+ strcpy(acc_converted, ftech_transl[ikar]);
+ if (*acc_converted != '\0')
+ out_math(acc_converted);
+ else
+ special_TeX_chars();
+ return;
+ }
+ /*END IF acc_converted*/
+ if (kar == '-') {
+ if (last_is("\\beginparagraph{}")) {
+ outrem("\\beginparagraph{}");
+ outkeyw("plainitem{--}");
+ } else
+ outchr(kar);
+ return;
+ }
+ /*END IF*/
+ if (kar == '"') {
+ begin_par(); /* test march 94 */
+ if (math_mode[bracelvl] == 0 && (kout == 0 || last_is(" ")))
+ outstg("``");
+ else
+ outstg("''");
+ return;
+ }
+ /*END IF*/
+ if (kar != ';') {
+ /*END IF*/
+ special_TeX_chars();
+ return;
+ }
+ /* ignore ; in colortbl section */
+ if (lvlcode[bracelvl] == 9)
+ return;
+ /* special case of \|F(. ; .) intermediate semi-colon */
+ if (lvlcode[bracelvl] == 17) {
+ /* special case of \|S(. ; .) intermediate semi-colon */
+ outstg(" \\over\\displaystyle ");
+ return;
+ }
+ if (lvlcode[bracelvl] == 18) {
+ close_subs();
+ out_math_leave(" _{");
+ return;
+ }
+ /* special case of \|SDO(. ; .) intermediate semi-colon */
+ if (lvlcode[bracelvl] == 19) {
+ close_subs();
+ out_math_leave(" ^{");
+ return;
+ }
+ /* special case of \|I(. ; .) intermediate semi-colon */
+ if (lvlcode[bracelvl] == 20) {
+ close_subs();
+ outstg(" ^{");
+ lvlcode[bracelvl] = 21;
+ return;
+ }
+ /* special case of \|su(. ; .) second intermediate semi-colon */
+ if (lvlcode[bracelvl] == 21) {
+ close_subs();
+ outchr('{');
+ lvlcode[bracelvl] = 22;
+ return;
+ }
+ /* special case of \|R(. ; .) intermediate semi-colon */
+ if (lvlcode[bracelvl] == 23) {
+ outsubstitute("\\sqrt{", "\\root{");
+ outstg("}\\of{");
+ lvlcode[bracelvl] = 24;
+ output_line(); /* safety */
+ return;
+ }
+ /* special case of \|O(. ; .) intermediate semi-colon */
+ if (lvlcode[bracelvl] == 26) {
+ /* special case of \|L(. ; .) intermediate semi-colon */
+ outstg("\\hfil\\crcr\\hfil{}");
+ return;
+ }
+ if (lvlcode[bracelvl] == 27)
+ outchr(',');
+ else
+ outchr(kar);
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* treats a character when KEYW is 1 */
+/* Keyword being decoded, we are just after the BACKSLASH */
+
+Static Void keyw_is_1()
+{
+ Char STR1[256];
+
+ if (cat == 11) { /* letter : store and say KEYW:=2 */
+ sprintf(inkeyw + strlen(inkeyw), "%c", kar);
+ keyw = 2;
+ return;
+ }
+ if (cat == 16) { /* case of a digit : store \RTF */
+ outrem_empty_braces();
+ outstg(inkeyw);
+ outchr(kar);
+ keyw = 0;
+ return;
+ }
+ /* turn \{ into \RTFaccol and... try to continue ! */
+ if (kar == '{') {
+ out_math("\\{");
+ keyw = 0;
+ /* inkeyw:=inkeyw+'accol '; keyw:=2 ; */
+ return;
+ }
+ /* turn \} into \RTFlocca and... try to continue ! */
+ if (kar == '}') {
+ out_math("\\}");
+ keyw = 0;
+ /* inkeyw:=inkeyw+'locca '; keyw:=2 ; */
+ return;
+ }
+ if (kar == '(') {
+ begin_par();
+ outkeyw("RTFparen ");
+ keyw = 0;
+ return;
+ }
+ if (kar == '-') {
+ /* case of a word cutting hyphen \- */
+ begin_par();
+ sprintf(STR1, "%c", kar);
+ outkeyw(STR1);
+ keyw = 0;
+ return;
+ }
+ if (kar == '*') {
+ if (abs(lvlcode[bracelvl]) < 10 || abs(lvlcode[bracelvl]) > 12) {
+ begin_par();
+ outchr(kar);
+ }
+ keyw = 0; /*END IF*/
+ return;
+ }
+ if (kar == '_') {
+ /* case of a word non cutting hyphen \_ */
+ begin_par();
+ outchr('-');
+ keyw = 0;
+ return;
+ }
+ if (kar == '~') {
+ /* case of a non breaking space */
+ begin_par();
+ outchr(kar);
+ keyw = 0;
+ return;
+ }
+ if (kar == '\'') {
+ keyw = 4;
+ num_hexa = 0;
+ return;
+ }
+ if (kar == ':') {
+ insert_tilde(kar);
+ return;
+ }
+ if (kar == ';') {
+ insert_tilde(kar);
+ return;
+ }
+ if (kar == ')') {
+ begin_par();
+ outchr(kar);
+ return;
+ }
+ if (kar == '(') {
+ begin_par();
+ outchr(kar);
+ return;
+ }
+ if (kar == '\\') {
+ if (next_rtf[0] == 'f' && lvlcode[bracelvl] == 12) {
+ lvlcode[bracelvl] = 9;
+ /*END IF*/
+ return;
+ }
+ begin_par();
+ outstg("{\\char92}");
+ keyw = 0;
+ return;
+ }
+ if (kar == '|') {
+ if (next_rtf[0] != '}') {
+ /* case of \| (in formulae) store as "formula" and expect letters */
+ strcat(inkeyw, "formula");
+ keyw = 2;
+ return;
+ }
+ /* if \|} cancel \| and post it for later */
+ *inkeyw = '\0';
+ keyw = 0;
+ strdelete((Anyptr)next_rtf, 1, 1);
+ sprintf(next_rtf, "}\\|%s", strcpy(STR1, next_rtf));
+ return;
+ }
+ /* store \RTF and try again */
+ outkeyw("RTF{}");
+ keyw = 0;
+ do_it_again = true;
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* treats a character when KEYW is 2 */
+/* We are in a letter keyword */
+
+Static Void keyw_is_2()
+{
+ short poskeyw, k, posbsl, testio;
+ string24 inkeywb;
+ Char STR1[256], STR2[256];
+ Char STR3[232];
+ Char STR4[150];
+ string24 STR5;
+ Char STR6[188];
+ Char STR7[28];
+ Char STR8[26];
+ short FORLIM;
+
+ if (cat == 11) {
+ /* letter : store and capitalize for formulas */
+ if (strpos2(inkeyw, "\\RTFformula", 1) > 0)
+ sprintf(inkeyw + strlen(inkeyw), "%c", toupper(kar));
+ else
+ sprintf(inkeyw + strlen(inkeyw), "%c", kar);
+ return;
+ }
+ /*END IF*/
+ if (cat == 16) {
+ /* case of a digit : store with opening brace and say KEYW:=3 */
+ sprintf(inkeyw + strlen(inkeyw), "{%c", kar);
+ numval = kar - icharz;
+ numsign = 1;
+ keyw = 3;
+ return;
+ }
+ if (kar == '-') {
+ /* case of a - introduction : store opening brace and say KEYW:=3 */
+ strcat(inkeyw, "{-");
+ numval = 0;
+ numsign = -1;
+ keyw = 3;
+ return;
+ }
+ /* delay \begin(center) to further opening \par */
+ if (!strcmp(inkeyw, "\\RTFqc")) {
+ if (lvlcode[bracelvl] != 9)
+ center_flag[bracelvl] = 1;
+ }
+ /* delay \begin(flushright) to further opening \par */
+ else if (!strcmp(inkeyw, "\\RTFqr")) {
+ if (lvlcode[bracelvl] != 9)
+ flushright_flag[bracelvl] = 1;
+ }
+ /* interpret some other keywords */
+ else if (!strcmp(inkeyw, "\\RTFtab")) {
+ if (par_to_begin)
+ num_indent++;
+ else
+ outkeyw("indent ");
+ } else if (!strcmp(inkeyw, "\\RTFchpgn")) {
+ begin_par();
+ outkeyw("the\\count0{}");
+ } else if (!strcmp(inkeyw, "\\RTFb")) {
+ add_to_bfsl("\\bf");
+ ensure_sizebfsl();
+ } else if (!strcmp(inkeyw, "\\RTFscaps")) {
+ add_to_bfsl("\\sc");
+ ensure_sizebfsl();
+ } else if (!strcmp(inkeyw, "\\RTFoutl")) {
+ add_to_bfsl("\\oul");
+ ensure_sizebfsl();
+ } else if (!strcmp(inkeyw, "\\RTFul")) {
+ outrem("{");
+ if (removed_ok) {
+ if (math_mode[bracelvl] == 0) {
+ begin_par();
+ outkeyw("underbar{");
+ } else {
+ begin_par();
+ outkeyw("underline{");
+ }
+ } else
+ outkeyw("RTFul{}");
+ /*END IF removed_OK*/
+ underl_flag[bracelvl] = true;
+ } else if (!strcmp(inkeyw, "\\RTFuldb")) {
+ outrem("{");
+ if (removed_ok) {
+ if (math_mode[bracelvl] == 0) {
+ begin_par();
+ outkeyw("underbar{\\bf{}");
+ } else {
+ begin_par();
+ outkeyw("underline{");
+ }
+ } else
+ outkeyw("RTFuldb{}");
+ /*END IF removed_OK*/
+ underl_flag[bracelvl] = true;
+ } else if (!strcmp(inkeyw, "\\RTFv")) {
+ outrem("{");
+ if (removed_ok) {
+ begin_par();
+ outkeyw("index{");
+ } else
+ outkeyw("RTFul{}");
+ /*END IF removed_OK*/
+ underl_flag[bracelvl] = true;
+ } else if (strpos2(inkeyw, "\\RTFheader", 1) + strpos2(inkeyw,
+ "\\RTFfooter", 1) > 0) {
+ outrem("{");
+ if (removed_ok) {
+ sprintf(STR1, "%s{", inkeyw + 1);
+ outkeyw(STR1);
+ } else {
+ sprintf(STR2, "%s{\\relax}", inkeyw + 1);
+ outkeyw(STR2);
+ }
+ /*END IF removed_OK*/
+ lvlcode[bracelvl] = 9;
+ } else if (!strcmp(inkeyw, "\\RTFi")) {
+ if (use_sl)
+ add_to_bfsl("\\sl");
+ else
+ add_to_bfsl("\\it");
+ /*END IF*/
+ ensure_sizebfsl();
+ } else if (!strcmp(inkeyw, "\\RTFpard"))
+ { /* old center_flag[bracelvl]:=0; flushright_flag[bracelvl]:=0; */
+ close_math();
+ close_envir();
+ center_flag[bracelvl] = 0;
+ flushright_flag[bracelvl] = 0;
+ strcpy(bfslcode[bracelvl], "\\rm");
+
+ if (abs(lvlcode[bracelvl]) != 8 && abs(lvlcode[bracelvl]) != 9 &&
+ lvlcode[bracelvl] != 13 && lvlcode[bracelvl] != 15)
+ { /*END IF*/
+ leftskip = 0;
+ rightskip = 0;
+ num_indent = 0;
+ par_to_begin = true;
+ if (!last_is("\\end{tabular}\\par ")) {
+ if (kout > 0)
+ output_line();
+ outstg(" %\\check ");
+ output_line(); /* for testing */
+ }
+ }
+ /* never cut line+\check after \end{tabular} */
+ if (lvlcode[bracelvl] == 2)
+ lvlcode[bracelvl] = 0;
+ } else if (!strcmp(inkeyw, "\\RTFpar")) {
+ if (next_rtf[0] == '}') {
+ *inkeyw = '\0';
+ strdelete((Anyptr)next_rtf, 1, 1);
+ sprintf(next_rtf, "}\\par %s", strcpy(STR2, next_rtf));
+ } else
+ make_RTFpar("\\par ");
+ } else if (!strcmp(inkeyw, "\\RTFpagebb")) {
+ /*END IF next_rtf[1]*/
+ if (next_rtf[0] == '}') {
+ *inkeyw = '\0';
+ strdelete((Anyptr)next_rtf, 1, 1);
+ sprintf(next_rtf, "}\\pagebb %s", strcpy(STR2, next_rtf));
+ } else
+ make_RTFpar("\\clearpage ");
+ } else if (!strcmp(inkeyw, "\\RTFpage")) {
+ /*END IF next_rtf[1]*/
+ if (next_rtf[0] == '}') {
+ *inkeyw = '\0';
+ strdelete((Anyptr)next_rtf, 1, 1);
+ sprintf(next_rtf, "}\\page %s", strcpy(STR2, next_rtf));
+ } else {
+ output_size(spacingcode[bracelvl]);
+ outkeyw("break\\eject\\noindent ");
+ output_size(sizecode[bracelvl]);
+ output_bfsl();
+ }
+ } else if (!strcmp(inkeyw, "\\RTFsect")) {
+ /*END IF next_rtf[1]*/
+ if (next_rtf[0] == '}') {
+ *inkeyw = '\0';
+ strdelete((Anyptr)next_rtf, 1, 1);
+ sprintf(next_rtf, "}\\par %s", strcpy(STR2, next_rtf));
+ } else
+ make_RTFpar("\\par \\relax ");
+ } else if (!strcmp(inkeyw, "\\RTFrquote")) {
+ /*END IF next_rtf[1]*/
+ outchr('\'');
+ } else if (!strcmp(inkeyw, "\\RTFlquote"))
+ outchr('`');
+ else if (!strcmp(inkeyw, "\\RTFmac"))
+ mac_init();
+ else if (!strcmp(inkeyw, "\\RTFansi"))
+ ansi_init();
+ else if (!strcmp(inkeyw, "\\RTFline")) {
+ /* flag to say future capitalized */
+ outkeyw("break ");
+ } else if (!strcmp(inkeyw, "\\RTFcaps")) {
+ lvlcode[bracelvl] = 2;
+ /* flag to say we are in \fonttbl block */
+ } else if (!strcmp(inkeyw, "\\RTFfonttbl")) {
+ lvlcode[bracelvl] = 6;
+ outrem_empty_braces();
+ outkrem(sizecode[bracelvl]);
+ outrem("{");
+ if (removed_ok)
+ outkeyw("RTFfonttbl{");
+ else
+ outkeyw("RTFfonttbl{}{}{}\\relax ");
+ } else if (!strcmp(inkeyw, "\\RTFcolortbl")) {
+ /*END IF*/
+ outrem_empty_braces();
+ lvlcode[bracelvl] = 9;
+ outkrem(sizecode[bracelvl]);
+ outrem("{");
+ if (removed_ok)
+ outkeyw("RTFcolortbl{");
+ else
+ outkeyw("RTFcolortbl{}{}{}\\relax ");
+ } else if (!strcmp(inkeyw, "\\RTFinfo")) {
+ /*END IF*/
+ outrem_empty_braces();
+ outkrem(sizecode[bracelvl]);
+ outrem("{");
+ if (removed_ok)
+ outkeyw("RTFinfo{");
+ else
+ outkeyw("RTFinfo{}{}{}\\relax ");
+ } else if (!strcmp(inkeyw, "\\RTFstylesheet")) {
+ /*END IF*/
+ outrem_empty_braces();
+ outkrem(sizecode[bracelvl]);
+ outrem("{");
+ if (removed_ok) {
+ outkrem("RTFcolortbl{}");
+ outkeyw("RTFstylesheet{");
+ } else
+ outkeyw("RTFstylesheet{}{}{}\\relax ");
+ /*END IF*/
+ lvlcode[bracelvl] = 8;
+ } else if (!strcmp(inkeyw, "\\RTFfield"))
+ lvlcode[bracelvl] = 11;
+ else if (strcmp(inkeyw, "\\RTFflddirty")) {
+
+ if (strpos2(inkeyw, "\\RTFfldinst", 1) > 0 && lvlcode[bracelvl-1] == 11) {
+ lvlcode[bracelvl] = 12;
+ return; /* to avoid resetting keyw:=0 */
+ }
+ if (!strcmp(inkeyw, "\\RTFtrowd")) {
+ perform_RTFtrow();
+ outkeyw("begin{tabular}{");
+ clbrdrr = false;
+ clbrdrl = false;
+ clbrdrt = false;
+ clbrdrb = false;
+ tab_nb_cellx[bracelvl] = 0;
+ tab_cellx[bracelvl] = 0;
+ } else if (strcmp(inkeyw, "\\RTFbrdrs") || lvlcode[bracelvl] != 13) {
+ /* ignore */
+ if (!strcmp(inkeyw, "\\RTFclbrdrl") && lvlcode[bracelvl] == 13) {
+ outchr('|');
+ if (verbose > 1)
+ _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >=
+ 0, FileWriteError);
+ clbrdrl = false;
+ } else if (!strcmp(inkeyw, "\\RTFclbrdrr") && lvlcode[bracelvl] == 13) {
+ if (verbose > 1)
+ _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >=
+ 0, FileWriteError);
+ clbrdrr = true;
+ } else if (!strcmp(inkeyw, "\\RTFclbrdrt") && lvlcode[bracelvl] == 13) {
+ if (verbose > 1)
+ _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >=
+ 0, FileWriteError);
+ clbrdrt = true;
+ } else if (!strcmp(inkeyw, "\\RTFclbrdrb") && lvlcode[bracelvl] == 13) {
+ if (verbose > 1)
+ _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >=
+ 0, FileWriteError);
+ clbrdrb = true;
+ } else if (!strcmp(inkeyw, "\\RTFintbl")) {
+ if (verbose > 0)
+ _SETIO(printf("(found)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ if (lvlcode[bracelvl] == 13) {
+ if (clbrdrr)
+ outchr('|');
+ clbrdrr = false;
+ outchr('}');
+ lvlcode[bracelvl] = 15; /* second part of \RTFtrowd */
+ if (clbrdrt) {
+ outkeyw("hline");
+ output_line();
+ }
+ tab_nb_ands[bracelvl] = 0;
+ if (verbose > 1)
+ _SETIO(printf("(after)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ } else if (lvlcode[bracelvl] == 15) {
+ if (verbose > 1)
+ _SETIO(printf("(ignored)%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ } else {
+ if (verbose > 0)
+ _SETIO(printf("forcing\\RTFtrowd%s[%d,%d]\n",
+ inkeyw, lvlcode[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ if (last_is("\\\\\\end{tabular}\\par "))
+ outkrem("end{tabular}\\par ");
+ else if (last_is("\\\\\\hline \\end{tabular}\\par "))
+ outkrem("end{tabular}\\par ");
+ else if (last_is("\\end{tabular}\\par ")) {
+ outkrem("end{tabular}\\par ");
+ outstg("\\\\");
+ if (clbrdrb)
+ outkeyw("hline ");
+ } else
+ outkeyw("begin{tabular}{ppppppppppppppp}");
+ /*END IF last_is(...)*/
+ perform_RTFtrow();
+ lvlcode[bracelvl] = 15; /* second part of \RTFtrowd */
+ if (verbose > 1) {
+ _SETIO(printf("(<after)%s[%d,%d,%d]\n",
+ inkeyw, lvlcode[bracelvl], tab_nb_cellx[bracelvl],
+ bracelvl) >= 0, FileWriteError);
+ /* force \RTFtrowd if missing */
+ /*END IF verbose*/
+ }
+ }
+ } else if (!strcmp(inkeyw, "\\RTFrow"))
+ perform_RTFrow();
+ else if (!strcmp(inkeyw, "\\RTFcell"))
+ perform_RTFcell();
+ else if (!strcmp(inkeyw, "\\RTFobject")) {
+ rtfpicw = 0;
+ rtfpich = 0; /* reset picture width and height to 0 */
+ pict_char_number = 0;
+ pict_byte_number = 0;
+ pict_last_hexa = 0; /* reset last hexa byte of the picture */
+ pict_left_hexa = false;
+ pict_number++; /* count picture number */
+ sign_str(pict_number, pict_name);
+ sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type);
+ while (strpos2(figure_name, "\\", 1) > 0) { /*END DO*/
+ posbsl = strpos2(figure_name, "\\", 1);
+ figure_name[posbsl-1] = '/';
+ }
+ begin_par();
+ sprintf(STR3, "%s{%s}", strsub(STR1, inkeyw, 2, 99), figure_name);
+ outkeyw(STR3);
+ sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type);
+ output_line();
+ sprintf(STR4, "Skipped object file %s", figure_name);
+ println_msg(1, STR4);
+ lvlcode[bracelvl] = 10;
+ } else if (!strcmp(inkeyw, "\\RTFpict")) {
+ rtfpicw = 0;
+ rtfpich = 0; /* reset picture width and height to 0 */
+ pict_char_number = 0;
+ pict_byte_number = 0;
+ pict_last_hexa = 0; /* reset last hexa byte of the picture */
+ pict_left_hexa = false;
+ pict_number++; /* count picture number */
+ sign_str(pict_number, pict_name);
+ sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type);
+ while (strpos2(figure_name, "\\", 1) > 0) { /*END DO*/
+ posbsl = strpos2(figure_name, "\\", 1);
+ figure_name[posbsl-1] = '/';
+ }
+ begin_par();
+ sprintf(STR3, "%s{%s}", strsub(STR1, inkeyw, 2, 99), figure_name);
+ outkeyw(STR3);
+ sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type);
+ output_line();
+ strcpy(figurefile_NAME, figure_name);
+ if (figurefile != NULL)
+ figurefile = freopen(figurefile_NAME, "w", figurefile);
+ else
+ figurefile = fopen(figurefile_NAME, "w");
+ _SETIO(figurefile != NULL, FileNotFound);
+ testio = P_ioresult;
+ if (testio != 0) { /*ENF IF testio*/
+ sign_str(testio, works);
+ sprintf(STR6, "Unable to open figure file %s ; code=%s",
+ figure_name, works);
+ println_msg(0, STR6);
+ close_files();
+ _Escape(0);
+ }
+ sprintf(STR4, "Opened picture file %s", figure_name);
+ println_msg(1, STR4);
+ lvlcode[bracelvl] = 5;
+ } else if (!strcmp(inkeyw, "\\RTFfootnote")) {
+ if (math_mode[bracelvl] == 0) {
+ lvlcode[bracelvl] = 3;
+ outrem("{");
+ if (removed_ok)
+ outkeyw("footnote{");
+ else
+ outkeyw("footnote ");
+ } else if (math_mode[bracelvl] == 1) {
+ /*END IF removed*/
+ close_math();
+ sprintf(next_rtf, "\\footnote %s", strcpy(STR1, next_rtf));
+ } else if (math_mode[bracelvl-1] == 1)
+ sprintf(next_rtf, "}{\\footnote %s", strcpy(STR1, next_rtf));
+ else if (bracelvl >= 2 && math_mode[bracelvl-2] == 1)
+ sprintf(next_rtf, "}}{{\\footnote %s", strcpy(STR1, next_rtf));
+ else if (bracelvl >= 3 && math_mode[bracelvl-3] == 1)
+ sprintf(next_rtf, "}}}{{{\\footnote %s", strcpy(STR1, next_rtf));
+ else
+ outkeyw("footnote ");
+ } else if (!strcmp(inkeyw, "\\RTFplain")) {
+ /*END IF math_mode*/
+ outpsize(stdsize * 20);
+ strcpy(bfslcode[bracelvl], "\\rm");
+ strcpy(sizecode[bracelvl], "normalsize");
+ } else if (!strcmp(inkeyw, "\\RTFchftn"))
+ remove_mathat();
+ else if (!strcmp(inkeyw, "\\RTFendash")) {
+ if (math_mode[bracelvl] > 0)
+ outchr('-');
+ else
+ outstg("--");
+ } else if (!strcmp(inkeyw, "\\RTFemdash")) {
+ if (math_mode[bracelvl] > 0)
+ outchr('-');
+ else
+ outstg("---");
+ } else if (!strcmp(inkeyw, "\\RTFfnil"))
+ /* decl_font_num is a global variable */
+ store_word_font("fnil");
+ else if (!strcmp(inkeyw, "\\RTFfroman"))
+ store_word_font("froman");
+ else if (!strcmp(inkeyw, "\\RTFfmodern"))
+ store_word_font("fmodern");
+ else if (!strcmp(inkeyw, "\\RTFfdecor"))
+ store_word_font("fdecor");
+ else if (!strcmp(inkeyw, "\\RTFfswiss"))
+ store_word_font("fswiss");
+ else if (!strcmp(inkeyw, "\\RTFfscript"))
+ store_word_font("fscript");
+ else if (!strcmp(inkeyw, "\\RTFftech"))
+ store_word_font("ftech");
+ else if (!strcmp(inkeyw, "\\RTFformulaB"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaO"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaLC")) {
+ sprintf(STR7, "%sLC", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaRC")) {
+ sprintf(STR7, "%sRC", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaBC")) {
+ sprintf(STR7, "%sBC", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaF"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaR"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaS"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaD"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaX"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaI"))
+ truncate24(form_code[bracelvl], inkeyw);
+ else if (!strcmp(inkeyw, "\\RTFformulaSU")) {
+ sprintf(STR7, "%sSU", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaPR")) {
+ sprintf(STR7, "%sPR", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaIN")) {
+ sprintf(STR7, "%sIN", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaRI")) {
+ sprintf(STR7, "%sRI", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaBO")) {
+ sprintf(STR7, "%sBO", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaLE")) {
+ sprintf(STR7, "%sLE", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ } else if (!strcmp(inkeyw, "\\RTFformulaTO")) {
+ sprintf(STR7, "%sTO", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ /* case of \|<non-alpha> */
+ } else if (!strcmp(inkeyw, "\\RTFformula")) {
+ if (cat == 0 && next_rtf[0] == '{') {
+ sprintf(STR8, "%s{", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR8));
+ kar = ' ';
+ next_rtf[0] = '\0'; /* to prevent do_it_again */
+ } else if (cat == 0 && next_rtf[0] == '}') {
+ sprintf(STR8, "%s}", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR8));
+ kar = ' ';
+ next_rtf[0] = '\0'; /* to prevent do_it_again */
+ } else {
+ sprintf(STR8, "%s%c", form_code[bracelvl], kar);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR8));
+ kar = ' '; /* to prevent do_it_again */
+ }
+ }
+ /* case of \{ */
+ else if (!strcmp(inkeyw, "\\RTFaccol ")) {
+ /*END IF*/
+ /* case of \} */
+ out_math("\\{");
+ } else if (!strcmp(inkeyw, "\\RTFlocca "))
+ out_math("\\}");
+ else {
+ poskeyw = 0;
+ sprintf(STR1, "%s ", inkeyw);
+ truncate24(inkeywb, STR1);
+ FORLIM = num_skip_strings;
+ /* check whether this keyword should be skipped in output */
+ for (k = 0; k <= FORLIM - 1; k++) /*END DO*/
+ poskeyw += strpos2(skip_strings[k], inkeyw, 1);
+ /* output other keywords with an additional space */
+ if (poskeyw == 0) { /*END IF poskeyw*/
+ outrem_empty_braces();
+ outstg(inkeyw);
+ /* do not put a space if following is a (, for TeX macros syntax */
+ if (kar != '(')
+ outchr(' ');
+ }
+ }
+ }
+ }
+ /*END IF*/
+ /* reset KEYW and try again */
+ keyw = 0;
+ if (kar != ' ') {
+ do_it_again = true;
+ /*END IF cat=11*/
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* treats a character when KEYW is 3 */
+/* Numeric arg of Keyword being decoded */
+
+Static Void keyw_is_3()
+{
+ string24 sizeheader; /* will be 'large', 'Large', 'footnotesize'... */
+ short magnification; /* will be 1000, 1095, 900... */
+ short diff_cellx, style_ref, poskeyw, k;
+ string24 acc_converted, inkeywb;
+ string_RTFstyle test_RTFstyle;
+ Char STR1[64];
+ Char STR2[186];
+ Char STR3[58];
+ Char STR4[256];
+ short FORLIM;
+ string24 STR5;
+ Char STR6[26];
+ Char STR7[28];
+
+ if (cat == 16) {
+ /* case of a digit */
+ sprintf(inkeyw + strlen(inkeyw), "%c", kar);
+ numval = numval * 10 + numsign * (kar - icharz);
+ return;
+ }
+ /* case of a non digit: terminate but ignore some keywords with brace pairs */
+ if (strpos2(inkeyw, "RTFsl{", 1) > 0) {
+ outpsize(numval);
+ sign_str(numval, works);
+ sprintf(STR1, "\\RTFsl{%s} --> \\%s", works, spacingcode[bracelvl]);
+ println_msg(2, STR1);
+ } else if (strpos2(inkeyw, "RTFli{", 1) > 0 && center_flag[bracelvl] < 2) {
+ if (lvlcode[bracelvl] != 8) /*END IF*/
+ leftskip = numval;
+ } else if (strpos2(inkeyw, "RTFri{", 1) > 0 && center_flag[bracelvl] < 2) {
+ if (lvlcode[bracelvl] != 8) /*END IF*/
+ rightskip = numval;
+ } else if (strpos2(inkeyw, "RTFf{", 1) > 0) {
+ decl_font_num = numval; /* store numval for further use */
+ set_active_RTFf(numval);
+ outstg("{}");
+ }
+ /* use _ and ^ for sub/superscripts and put in math mode if needed */
+ else if (strpos2(inkeyw, "RTFup{", 1) > 0) {
+ out_math_leave("\\relax^{");
+ open_brace();
+ auto_close[bracelvl] = true;
+ } else if (strpos2(inkeyw, "RTFdn{", 1) > 0) {
+ out_math_leave("\\relax_{");
+ open_brace();
+ auto_close[bracelvl] = true;
+ }
+ /* ignore \RTFfi if option '-v' */
+ else if (strpos2(inkeyw, "RTFfi{", 1) > 0) {
+ num_indent = 1;
+ if (!(no_space_conv && numval > 0)) {
+ outkeyw("parindent=");
+ output_num(numval);
+ outkeyw("RTFtwips");
+ output_line();
+ }
+ }
+ /* style description */
+ else if (strpos2(inkeyw, "RTFs{", 1) > 0) {
+ sign_str(numval, works);
+ if (abs(lvlcode[bracelvl]) == 8) {
+ if (num_styles >= maxRTFstyles) {
+ sprintf(STR3, "Too many styles, style %s ignored.", works);
+ println_msg(0, STR3);
+ } else if (numval > 255) {
+ sprintf(STR1, "Illegal style number, style %s ignored.", works);
+ println_msg(0, STR1);
+ } else {
+ num_styles++;
+ ref_styles[numval] = num_styles;
+ sprintf(test_RTFstyle, "%c", kar);
+ while (kar != ';' && kar != '}') { /*END while*/
+ read_char();
+ sprintf(test_RTFstyle + strlen(test_RTFstyle), "%c", kar);
+ }
+ /* clean style to the first blank after \snext */
+ if (kar == ';')
+ kar = ' ';
+ k = strpos2(test_RTFstyle, "\\snext", 1);
+ m = strlen(test_RTFstyle);
+ FORLIM = strlen(test_RTFstyle);
+ for (l = k; l <= FORLIM; l++) {
+ if (test_RTFstyle[l-1] == ' ' && l < m)
+ m = l;
+ }
+ sign_str(num_styles, worksa);
+ /* start at the first space in style text */
+ n = strpos2(test_RTFstyle, " ", 1) + 1;
+ strsub(RTFstyles[num_styles-1], test_RTFstyle, n, m - n + 1);
+ sprintf(STR2, "%s --> %s \"%s\"",
+ works, worksa, RTFstyles[num_styles-1]);
+ println_msg(2, STR2);
+ }
+ } else {
+ /*END IF*/
+ style_ref = ref_styles[numval];
+ if (style_ref <= 0 || style_ref > 255) {
+ sprintf(STR1, "Illegal style number, style %s ignored.", works);
+ println_msg(0, STR1);
+ } else {
+ if (kar != ' ')
+ sprintf(next_rtf, "%c%s", kar, strcpy(STR4, next_rtf));
+ kar = ' ';
+ sprintf(next_rtf, "%s%s",
+ RTFstyles[style_ref-1], strcpy(STR4, next_rtf));
+ /*END IF*/
+ }
+ }
+ }
+ /* font size description */
+ else if (strpos2(inkeyw, "RTFfs{", 1) + strpos2(inkeyw, "RTFfldinstfs{", 1) > 0 &&
+ lvlcode[bracelvl] != 8) {
+ /*END IF*/
+ /* before putting \LARGE, \Huge etc., remove previous \bf, \rm, etc. */
+ outrem_empty_braces();
+ outrem(bfslcode[bracelvl]);
+
+ /* output \large, \normalsize, \footnotesize according to NUMVAL */
+ outfsize(numval, &magnification);
+
+ sprintf(STR6, "\\%s", sizecode[bracelvl]);
+ truncate24(sizeheader, STR6);
+ if (!strcmp(sizeheader, "\\footnotesize"))
+ strcpy(sizeheader, "\\footnsize");
+
+ /* correct font names in bfslcode[bracelvl] according to latex209 or latex2e */
+ font_clean(sizeheader, magnification);
+
+ if (!par_to_begin) { /*END IF*/
+ output_size(sizecode[bracelvl]);
+ output_bfsl();
+ if (!last_is("}")) {
+ if (!last_is("{"))
+ outstg("{}");
+ }
+ }
+ } else if (strpos2(inkeyw, "RTFsb{", 1) > 0) {
+ /*END IF*/
+ outkrem("par");
+ outkrem("par ");
+ if (lvlcode[bracelvl] != 8 && lvlcode[bracelvl] != 9)
+ outkeyw("par ");
+ make_RTFsab(numval);
+ } else if (strpos2(inkeyw, "RTFsa{", 1) > 0)
+ save_skip = numval;
+ else if (strpos2(inkeyw, "RTFtrleft{", 1) <= 0) { /* en attente */
+ if (strpos2(inkeyw, "\\RTFcellx{", 1) > 0 && lvlcode[bracelvl] == 13) {
+ /* \RTCcellx gives absolutes abscissae, but tabular's p{} needs differences */
+ diff_cellx = numval - tab_cellx[bracelvl];
+ outstg("p{");
+ output_num(diff_cellx);
+ outstg("\\RTFtwips}");
+ if (clbrdrl)
+ outchr('|');
+ clbrdrl = false;
+ tab_nb_cellx[bracelvl]++;
+ tab_cellx[bracelvl] = numval;
+ } else if (strpos2(inkeyw, "RTFpicw{", 1) > 0) {
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ rtfpicw = numval;
+ } else if (strpos2(inkeyw, "RTFpich{", 1) > 0) {
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ rtfpich = numval;
+ } else if (strpos2(inkeyw, "RTFobjw{", 1) > 0) {
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ rtfpicw = numval;
+ } else if (strpos2(inkeyw, "RTFobjh{", 1) > 0) {
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ rtfpich = numval;
+ }
+ /* case of \|DO( ... ) */
+ else if (strpos2(inkeyw, "\\RTFformulaDO{", 1) > 0) {
+ if (*form_code[bracelvl] == '\0')
+ strcpy(form_code[bracelvl], "\\RTFformulaSDO");
+ else {
+ sprintf(STR7, "%sDO", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ /* case of \|UP( ... ) */
+ }
+ } else if (strpos2(inkeyw, "\\RTFformulaUP{", 1) > 0) {
+ if (*form_code[bracelvl] == '\0')
+ strcpy(form_code[bracelvl], "\\RTFformulaSUP");
+ else {
+ sprintf(STR7, "%sUP", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ /* case of \|FO( ... ) */
+ }
+ } else if (strpos2(inkeyw, "\\RTFformulaFO{", 1) > 0) {
+ if (*form_code[bracelvl] == '\0')
+ strcpy(form_code[bracelvl], "\\RTFformulaDFO");
+ else {
+ sprintf(STR7, "%sFO", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ }
+ displ_skip = numval;
+ }
+ /* case of \|UP( ... ) */
+ else if (strpos2(inkeyw, "\\RTFformulaBA{", 1) > 0) {
+ if (*form_code[bracelvl] == '\0')
+ strcpy(form_code[bracelvl], "\\RTFformulaDFO");
+ else {
+ sprintf(STR7, "%sFO", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ }
+ displ_skip = -numval;
+ }
+ /* case of \|UP( ... ) */
+ else if (strpos2(inkeyw, "\\RTFformulaLI{", 1) > 0) {
+ if (*form_code[bracelvl] == '\0')
+ strcpy(form_code[bracelvl], "\\RTFformulaDLI");
+ else {
+ sprintf(STR7, "%sLI", form_code[bracelvl]);
+ strcpy(form_code[bracelvl], truncate24(STR5, STR7));
+ }
+ displ_skip = numval;
+ }
+ /* case of \|AI( ... ) */
+ else if (strpos2(inkeyw, "\\RTFformulaAI{", 1) <= 0) {
+ /* case of \|DI( ... ) */
+ if (strpos2(inkeyw, "\\RTFformulaDI{", 1) <= 0) {
+ if (strpos2(inkeyw, "RTFrtf{", 1) > 0) {
+ no_RTFrtf = false;
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ }
+ /* explicit references to symbol characters */
+ else if (strpos2(inkeyw, "RTFfldinstsymbol", 1) + strpos2(inkeyw,
+ "RTFfldinstbsymbol",
+ 1) + strpos2(inkeyw, "RTFfldinstbisymbol", 1) > 0) {
+ if (numval > 255)
+ numval = 0;
+ strcpy(acc_converted, ftech_transl[numval]);
+ if (*acc_converted != '\0')
+ out_math(acc_converted);
+ else
+ outchr('?');
+ } else {
+ /*END IF acc_converted*/
+ poskeyw = 0;
+ k = strpos2(inkeyw, "{", 1);
+ if (k > 0) {
+ sprintf(inkeywb, "%.*s", k, inkeyw);
+/* p2c: rtflatex.pas, line 1513:
+ * Note: Possible faulty string assignment [145] */
+/* p2c: rtflatex.pas, line 1513:
+ * Note: string[24] := string[255] => unpredictable crashes */
+ } else {
+ sprintf(STR4, "%s}", inkeyw);
+ truncate24(inkeywb, STR4);
+ }
+ FORLIM = num_skip_strings;
+ /* check whether this keyword should be skipped in output */
+ for (k = 0; k <= FORLIM - 1; k++) /*END DO*/
+ poskeyw += strpos2(skip_strings[k], inkeywb, 1);
+ if (poskeyw == 0) { /*END IF poskeyw*/
+ strcat(inkeyw, "}");
+ outrem_empty_braces();
+ outstg(inkeyw);
+ }
+ }
+ }
+ /* this test is eliminate first brace opened */
+ }
+ }
+ /*END IF*/
+ keyw = 0;
+ if (kar != ' ') {
+ do_it_again = true;
+ /*END IF*/
+ }
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* treats a character when KEYW is 4 */
+/* Hexadecimal arg of RTFac */
+
+Static Void keyw_is_4()
+{
+ string2 acchexa;
+ string24 acc_converted;
+ short posbrace;
+ Char STR1[256];
+ Char STR2[12];
+ Char STR3[40];
+
+ if (cat == 10)
+ return;
+
+ if (num_hexa == 0) {
+ num_hexa = 1;
+ hexaone = kar;
+ return;
+ }
+ if (num_hexa != 1) {
+ sign_str(num_hexa, works);
+ sprintf(STR3, "Wrong num_hexa:%s", works);
+ println_msg(0, STR3);
+ /*END IF*/
+
+ return;
+ }
+ hexatwo = kar;
+ sprintf(acchexa, "%c%c", hexaone, hexatwo);
+/* p2c: rtflatex.pas, line 1546:
+ * Note: Possible faulty string assignment [145] */
+/* p2c: rtflatex.pas, line 1546:
+ * Note: string[2] := string[3] => unpredictable crashes */
+ begin_par();
+ if (!strcmp(active_RTFf[bracelvl], "ftech")) {
+ strcpy(acc_converted, ftech_transl[hs_to_i(acchexa)]);
+ if (*acc_converted != '\0')
+ out_math(acc_converted);
+ else {
+ sprintf(STR2, "RTFac{%s}", acchexa);
+ outkeyw(STR2);
+ }
+ } else {
+ /*END IF acc_converted*/
+ strcpy(acc_converted, acc_transl[hs_to_i(acchexa)]);
+ if (*acc_converted != '\0') {
+ if (acc_converted[0] == '\\')
+ outrem_empty_braces();
+ posbrace = strpos2(acc_converted, "{", 1);
+ if (acc_converted[0] == '$') {
+ outrem_empty_braces();
+ out_math(strcpy(STR1, acc_converted + 1));
+ } else if (posbrace <= 1)
+ outstgc(acc_converted);
+ else if (strpos2(acc_converted, "\\c{", 1) + strpos2(acc_converted,
+ "\\dag{",
+ 1) + strpos2(acc_converted, "\\pound{", 1) + strpos2(
+ acc_converted, "\\copyright{",
+ 1) + strpos2(acc_converted, "\\degree{", 1) > 0) {
+ sprintf(STR1, "%.*s", posbrace - 1, acc_converted);
+ outstg(STR1);
+ outstgc(strcpy(STR1, acc_converted + posbrace - 1));
+ } else
+ outstgc(acc_converted);
+ } else {
+ /*END IF*/
+ outkeyw("RTFac{");
+ outstg(acchexa);
+ outchr('}');
+ /*END IF acc_converted*/
+ }
+ }
+ /*END IF active_RTF*/
+ num_hexa = 0;
+ keyw = 0;
+}
+
+
+/*---------------------------------------------------------------------------*/
+Static Void make_latex_header()
+{
+ short i;
+ string24 strpts;
+ Char STR1[28];
+ Char STR2[26];
+ short FORLIM;
+ Char STR3[30];
+
+ if (latex209)
+ outkeyw("documentstyle[");
+ else
+ outkeyw("documentclass[");
+ /*END IF*/
+ if (stdsize != 10) { /*END IF*/
+ sign_str(stdsize, strpts);
+ sprintf(STR1, "%spt,", strpts);
+ outstg(STR1);
+ }
+ outstg("twoside");
+
+ if (latex209) {
+ FORLIM = num_latex_options;
+ for (i = 0; i <= FORLIM; i++) {
+ sprintf(STR2, ",%s", latex_options[i]);
+ outstg(STR2);
+ }
+ sprintf(STR3, "]{%s}", latex_style);
+ outstg(STR3);
+ output_line();
+ } else {
+ sprintf(STR3, "]{%s}", latex_style);
+ outstg(STR3);
+ output_line();
+ outkeyw("usepackage{");
+ outstg(latex_options[0]);
+ FORLIM = num_latex_options;
+ for (i = 1; i <= FORLIM; i++) {
+ sprintf(STR2, ",%s", latex_options[i]);
+ outstg(STR2);
+ }
+ outstg("}");
+ output_line();
+ }
+
+
+
+ outkeyw("begin{document}\\RTFsetfontheading");
+ output_line();
+}
+
+
+/*---------------------------------------------------------------------------*/
+/* MAIN */
+/*---------------------------------------------------------------------------*/
+main(argc, argv)
+int argc;
+Char *argv[];
+{
+ short FORLIM;
+ Char STR1[48];
+ Char STR2[56];
+ Char STR3[50];
+ Char STR4[30];
+ Char STR5[64];
+
+ PASCAL_MAIN(argc, argv);
+ skipfile = NULL;
+ logfile = NULL;
+ figurefile = NULL;
+ outputfile = NULL;
+ inputfile = NULL;
+ clean_all(); /* for safety... */
+
+ latex209 = false;
+ write_log = false;
+ use_sl = false;
+ latex_header = true;
+ simplify_ok = true;
+ no_RTFrtf = true;
+ base_flag = false;
+ no_space_conv = false;
+ last_percent = false;
+ num_latex_options = 0;
+ strcpy(latex_style, "report");
+ strcpy(latex_options[0], "rtflatex");
+ kar = '\0';
+ save_skip = 0;
+ space_after = 0;
+ math_mode[0] = 0;
+ auto_close[0] = false;
+ bracelvl = 0;
+ input_line_number = 1;
+ /* envir_closed_ok:=FALSE; (test) */
+ envir_closed_ok = true;
+ num_styles = 0;
+ displ_skip = 0;
+ for (k = 0; k <= 255; k++)
+ ref_styles[k] = 0;
+
+ verbose = 1; /* default moderate verbosity */
+ tex_verbose = 0; /* no insertion of flags within TeX output */
+
+ title();
+ charinit();
+ sizeinit();
+ open_files();
+
+ /* "lvlcode" : say what to do of the contents of that block. 1=ignore
+until end of current block, 2=caps, 3=ignore footnote headings, 4=
+ignore contents of first arg of \footnote, 5= \RTFpict text, 6= \fonttbl
+declaration, 7= \RTFformulaX[xx], 8= within \stylesheet, 9= within
+\header/\footer, 9= within \RTFcolortbl, 10= \RTFobject text, 11=
+\RTFfield text, 12= inside \RTFfldinst, 13= inside \RTFtrowd/\RTFrow,
+15= inside \RTFtrowd/RTFrow after \RTFintbl, 16=
+within \RTFformulaB(...), 17= within \RTFformulaF(...), 18=
+\RTFformulaSUP(...), 19= \RTFformulaSDO(...), 20= \RTFformulaI, 21= idem
+after ";", 22= idem after second ";", 23= \RTFformulaR, 24= \RTFformulaR
+after ";", 25= ordinary brace within a formula, 26=\RTFformulaO,
+27=\RTFformulaL, 28=\RTFformulaD */
+ lvlcode[0] = 0;
+
+ /* bfslcode stores the recorded \bf, \sl, \it, \sf commands
+ to repeat them AFTER \large, \Large */
+ *bfslcode[0] = '\0';
+ strcpy(sizecode[0], "normalsize");
+ *active_RTFf[0] = '\0';
+ strcpy(close_kar[0], " ");
+ *form_code[0] = '\0';
+ strcpy(spacingcode[0], "relax");
+ *currsize[0] = '\0';
+ *currbfsl[0] = '\0';
+ leftskip = 0;
+ rightskip = 0;
+ leftcurskip = 0;
+ rightcurskip = 0;
+ tab_nb_cellx[0] = 0;
+ /* the number of cells in a tabular line = #\RTFcellx */
+ tab_nb_ands[0] = 0; /* the number of &, must be < #\RTFcellx */
+ tab_cellx[0] = 0; /* current \RTFcellx value */
+ clbrdrr = false;
+ clbrdrl = false;
+ clbrdrt = false;
+ clbrdrb = false;
+
+ *inkeyw = '\0';
+ numl = 0;
+ numval = 0;
+ numsign = 1;
+ num_hexa = 0;
+ ikar = 0;
+ kinp = 0;
+ prev_kinp = 0;
+ *next_rtf = '\0';
+ num_indent = 0;
+ num_word_fonts = 0; /* number of RTF/Word defined fonts */
+ numfonts = 0; /* number of specially defined fonts */
+ keyw = 0; /* a flag to say whether we are decoding a keyword */
+ pict_number = 0; /* counts the pictures */
+
+ center_flag[0] = 0;
+ flushright_flag[0] = 0;
+ do_it_again = false;
+ underl_flag[0] = false;
+ par_to_begin = true;
+
+ cleanout(); /* clean EXFILE for safety */
+
+ if (latex_header)
+ make_latex_header();
+
+ /* main loop to read input RTF file */
+
+ read_next_char();
+ while (ikar != 26) {
+ /* read one character unless said to be retried */
+ if (do_it_again)
+ do_it_again = false;
+ else
+ read_char();
+ /*END IF*/
+ if (ikar < ' ') /*END IF ikar*/
+ continue;
+
+ switch (keyw) {
+
+ case 0:
+ keyw_is_0();
+ break;
+
+ case 1:
+ keyw_is_1();
+ break;
+
+ case 2:
+ keyw_is_2();
+ break;
+
+ case 3:
+ keyw_is_3();
+ break;
+
+ case 4:
+ keyw_is_4();
+ break;
+ }/* case KEYW */
+ }
+ if (center_flag[bracelvl] > 0)
+ outkeyw("end{center}");
+ if (latex_header)
+ outkeyw("end{document}");
+ else
+ outkeyw("bye");
+ /*END IF latex_header*/
+ output_line();
+
+ println_msg(0, "RTFLaTeX terminated");
+ sign_str(bracelvl, works);
+ sprintf(STR1, "brace level finally is:%s", works);
+ println_msg(0, STR1);
+ sign_str(numl, works);
+ if (numl > 0) {
+ sprintf(STR2, "%s lines of code were generated.", works);
+ println_msg(0, STR2);
+ }
+ sign_str(numfonts, works);
+ if (numfonts > 0) {
+ sprintf(STR3, "%s new fonts were declared:", works);
+ println_msg(0, STR3);
+ }
+ FORLIM = numfonts;
+ for (k = 1; k <= FORLIM; k++) {
+ sprintf(STR4, " %s", newfonts[k-1]);
+ println_msg(0, STR4);
+ }
+ sign_str(pict_number, works);
+ if (pict_number > 0) {
+ sprintf(STR5, "%s pictures were stored in binary files.", works);
+ println_msg(0, STR5);
+ }
+ close_files();
+ if (inputfile != NULL)
+ fclose(inputfile);
+ if (outputfile != NULL)
+ fclose(outputfile);
+ if (figurefile != NULL)
+ fclose(figurefile);
+ if (logfile != NULL)
+ fclose(logfile);
+ if (skipfile != NULL)
+ fclose(skipfile);
+ exit(EXIT_SUCCESS);
+}
+
+
+
+
+
+/* End. */
+/* end of file */