Ilya Zakharevich on Sun, 23 Feb 2003 00:25:29 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
[PATCH CVS] log files, TeX, colors |
This patch: a) Emits correct colors for prompt and user input to the logfile; b) makes emiting colors to logfile optional (use default(log,2) to emit colors); c) allows writing a logfile as a TeX file (use default(log,3)); d) Allows changing the style of TeX output (\frac vs \over [to simplify parsing]), \left/\right pairs, insertion of \PARIbreak after "monomials" by setting bits in default(TeXstyle); e) Corrects an omission in ?\ ; f) splits TeX output for polynomials into several lines; Limitations: 1) TeX output to logfiles is enabled only with \o3 (should be easy to fix); 2) My TeX was never too stellar; please check whether you can improve the default macros; Try default(log,3) default(seriesprecision,9) sin(x+y) or default(log,3) default(TeXstyle,2) sin(x+y) 3) log file is always written as if \PARIbreak were user-enabled; 4) tex does not like it very much when TeX files have an extension .log. I changed my default so that it is .plog: logfile = "~/pari-logs/day-%Y-%m-%d=time-%H-%M-%S.plog" Enjoy, Ilya diff -pru pari/src/gp/gp.c pari-my-200302/src/gp/gp.c --- pari/src/gp/gp.c Sat Feb 22 18:58:44 2003 +++ pari-my-200302/src/gp/gp.c Sat Feb 22 23:49:34 2003 @@ -720,11 +720,18 @@ sd_histsize(const char *v, int flag) static GEN sd_log(const char *v, int flag) { - ulong old = GP_DATA->flags; - GEN r = sd_gptoggle(v,flag,"log",LOG); - if (GP_DATA->flags != old) + static const char * const msg[] = { + "(off)", + "(on)", + "(on with colors)", + "(TeX output)", NULL + }; + ulong oldstyle = logstyle; + GEN res = sd_ulong(v,flag,"log", &logstyle, 0, 3, (char**)msg); + + if (!oldstyle != !logstyle) /* Compare converts to boolean */ { /* toggled LOG */ - if (old & LOG) + if (oldstyle) { /* close log */ if (flag == d_ACKNOWLEDGE) pariputsf(" [logfile was \"%s\"]\n", current_logfile); @@ -737,9 +744,30 @@ sd_log(const char *v, int flag) #ifndef WINCE setbuf(logfile,(char *)NULL); #endif + if (logfile && logstyle == logstyle_TeX) { /* Default values */ + fprintf(logfile, "%s%s%s%s%s%s%s%s%s%s\n", + "\\ifx \\PARIbreak\\undefined\n", + " \\def\\PARIbreak{\\hskip 0pt plus \\hsize\\relax\\discretionary{}{}{}}\\fi\n", + "\\ifx \\PARIpromptSTART\\undefined\n", + " \\def\\PARIpromptSTART|{\\vskip\\medskipamount\\bgroup\\bf}\\fi\n", + "\\ifx \\PARIpromptEND\\undefined\n", + " \\def\\PARIpromptEND|{\\egroup\\bgroup\\tt}\\fi\n", + "\\ifx \\PARIinputEND\\undefined\n", + " \\def\\PARIinputEND|{\\egroup}\\fi\n", + "\\ifx \\PARIout\\undefined\n", + " \\def\\PARIout#1#2{\\vskip\\smallskipamount$\\displaystyle{\\tt\\%#1} = #2$}\\fi\n"); + } } } - return r; + return res; +} + +static GEN +sd_TeXstyle(const char *v, int flag) +{ + static const char * const msg[] = { NULL, + "(bits 0x1/0x2/0x4 control output of \\frac/\\left/\\PARIbreak)"}; + return sd_ulong(v,flag,"TeXstyle", &TeXstyle, 0, 7, (char**)msg); } static GEN @@ -980,6 +1008,7 @@ default_type gp_default_list[] = {"seriesprecision",(void*)sd_seriesprecision}, {"simplify",(void*)sd_simplify}, {"strictmatch",(void*)sd_strictmatch}, + {"TeXstyle",(void *)sd_TeXstyle}, {"timer",(void *)sd_timer}, {NULL,NULL} /* sentinel */ }; @@ -1301,7 +1330,7 @@ slash_commands(void) \\h {m-n}: hashtable information\n\ \\l {f} : enable/disable logfile (set logfile=f)\n\ \\m {n} : print result in prettymatrix format\n\ -\\o {n} : change output method (0=raw, 1=prettymatrix, 2=prettyprint)\n\ +\\o {n} : change output method (0=raw, 1=prettymatrix, 2=prettyprint, 3=2-dim)\n\ \\p {n} : change real precision\n\ \\ps{n} : change series precision\n\ \\q : quit completely this GP session\n\ @@ -2439,7 +2468,15 @@ get_line_from_file(char *prompt, filtre_ if (GP_DATA->flags & ECHO) { pariputs(prompt); pariputs(s); pariputc('\n'); } else - if (logfile) fprintf(logfile, "%s%s\n",prompt,s); + if (logfile) { + if (logstyle == logstyle_TeX) + fprintf(logfile, + "\\PARIpromptSTART|%s\\PARIpromptEND|%s\\PARIinputEND|%%\n", + prompt,s); + else + fprintf(logfile, "%s%s\n",prompt,s); + } + pariflush(); } if (GP_DATA->flags & TEXMACS) diff -pru pari/src/gp/gp_rl.c pari-my-200302/src/gp/gp_rl.c --- pari/src/gp/gp_rl.c Sun Jan 12 16:32:50 2003 +++ pari-my-200302/src/gp/gp_rl.c Sat Feb 22 23:41:28 2003 @@ -912,7 +912,22 @@ get_line_from_readline(char *prompt, cha } /* update logfile */ - if (logfile) fprintf(logfile, "%s%s\n",bare_prompt,s); + switch (logstyle) { + case logstyle_TeX: + fprintf(logfile, + "\\PARIpromptSTART|%s\\PARIpromptEND|%s\\PARIinputEND|%%\n", + bare_prompt,s); + break; + case logstyle_plain: + fprintf(logfile, "%s%s\n",bare_prompt,s); + break; + case logstyle_color: + /* Can't do in one pass, since term_get_color() returns a static */ + fprintf(logfile, "%s%s", term_get_color(c_PROMPT), bare_prompt); + fprintf(logfile, "%s%s", term_get_color(c_INPUT), s); + fprintf(logfile, "%s\n", term_get_color(c_NONE)); + break; + } } unblock_SIGINT(); /* bug in readline 2.0: need to unblock ^C */ return 1; diff -pru pari/src/headers/paristio.h pari-my-200302/src/headers/paristio.h --- pari/src/headers/paristio.h Sun Jan 12 16:32:52 2003 +++ pari-my-200302/src/headers/paristio.h Sat Feb 22 23:13:30 2003 @@ -58,6 +58,18 @@ typedef struct pariFILE { extern PariOUT *pariOut, *pariErr; extern FILE *pari_outfile, *logfile, *infile, *errfile; +extern ulong logstyle, TeXstyle; + +enum logstyles { + logstyle_none, /* 0 */ + logstyle_plain, /* 1 */ + logstyle_color, /* 2 */ + logstyle_TeX, /* 3 */ +}; + +#define TEXSTYLE_FRAC 1 +#define TEXSTYLE_PAREN 2 +#define TEXSTYLE_BREAK 4 extern pari_sp avma,bot,top; extern size_t memused; diff -pru pari/src/language/anal.h pari-my-200302/src/language/anal.h --- pari/src/language/anal.h Sun Jan 12 16:32:56 2003 +++ pari-my-200302/src/language/anal.h Sat Feb 22 23:58:44 2003 @@ -279,11 +279,12 @@ extern void bruti(GEN g, pariout_t *T, i extern void matbruti(GEN g, pariout_t *T); extern void sori(GEN g, pariout_t *T); extern void texi(GEN g, pariout_t *T, int nosign); +extern void texi_nobrace(GEN g, pariout_t *T, int nosign); extern pariout_t DFLT_OUTPUT; /* GP_DATA->flags */ enum { QUIET=1, TEST=2, SIMPLIFY=4, CHRONO=8, ECHO=16, STRICTMATCH=32, - USE_READLINE=64, SECURE=128, EMACS=256, TEXMACS=512, LOG=1024}; + USE_READLINE=64, SECURE=128, EMACS=256, TEXMACS=512}; /* GP */ #define pariputs_opt(s) if (!(GP_DATA->flags & QUIET)) pariputs(s) diff -pru pari/src/language/es.c pari-my-200302/src/language/es.c --- pari/src/language/es.c Sat Feb 22 18:58:50 2003 +++ pari-my-200302/src/language/es.c Sun Feb 23 00:06:12 2003 @@ -317,7 +317,12 @@ pariputsf(const char *format, ...) void term_color(int c) { + FILE *o_logfile = logfile; + + if (logstyle != logstyle_color) + logfile = 0; /* Ugly hack... */ pariputs(term_get_color(c)); + logfile = o_logfile; } void @@ -1457,13 +1462,25 @@ wr_texnome(pariout_t *T, GEN a, const ch if (sig) { putsigne(sig); texi(a,T,sig); } else { - pariputs(" + \\left("); texi(a,T,sig); pariputs("\\right) "); + if (TeXstyle & TEXSTYLE_PAREN) + pariputs(" + ("); + else + pariputs(" + \\left("); + texi_nobrace(a,T,sig); /* With braces no auto-linebreaks */ + if (TeXstyle & TEXSTYLE_PAREN) + pariputs(") "); + else + pariputs("\\right) "); } if (d) { if (GP_DATA && (GP_DATA->flags & TEXMACS)) pariputs("\\*"); texnome(v,d); } + if (TeXstyle & TEXSTYLE_BREAK) + pariputs("\\PARIbreak "); + if (!sig) + pariputc('\n'); /* Avoid TeX buffer overflow */ } } @@ -1501,13 +1518,23 @@ wr_lead_texnome(pariout_t *T, GEN a,cons if (isfactor(a)) texi(a,T,nosign); else { - pariputs(" \\left("); texi(a,T,0); pariputs("\\right) "); + if (TeXstyle & TEXSTYLE_PAREN) + pariputs(" ("); + else + pariputs(" \\left("); + texi_nobrace(a,T,0); /* With braces no auto-linebreaks */ + if (TeXstyle & TEXSTYLE_PAREN) + pariputs(") "); + else + pariputs("\\right) "); } if (d) { if (GP_DATA && (GP_DATA->flags & TEXMACS)) pariputs("\\*"); texnome(v,d); } + if (TeXstyle & TEXSTYLE_BREAK) + pariputs("\\PARIbreak "); } } @@ -1909,17 +1936,25 @@ sori(GEN g, pariout_t *T) void texi(GEN g, pariout_t *T, int nosign) { + pariputc('{'); + texi_nobrace(g, T, nosign); + pariputc('}'); +} + +void +texi_nobrace(GEN g, pariout_t *T, int nosign) +{ long tg,i,j,l,r; GEN a,b; const char *v; char buf[67]; - if (isnull(g)) { pariputs("{0}"); return; } - r = isone(g); pariputc('{'); + if (isnull(g)) { pariputc('0'); return; } + r = isone(g); if (r) { if (!nosign && r<0) pariputc('-'); - pariputs("1}"); return; + pariputs("1"); return; } tg = typ(g); @@ -1934,7 +1969,11 @@ texi(GEN g, pariout_t *T, int nosign) texi((GEN)g[1],T,0); break; case t_FRAC: case t_FRACN: case t_RFRAC: case t_RFRACN: - texi((GEN)g[1],T,nosign); pariputs("\\over"); + if (TeXstyle & TEXSTYLE_FRAC) + pariputs("\\frac"); /* Assume that texi() puts braces */ + texi((GEN)g[1],T,nosign); + if (!(TeXstyle & TEXSTYLE_FRAC)) + pariputs("\\over"); texi((GEN)g[2],T,0); break; case t_COMPLEX: case t_QUAD: r = (tg==t_QUAD); @@ -2059,7 +2098,6 @@ texi(GEN g, pariout_t *T, int nosign) } pariputc('}'); break; } - pariputc('}'); } /*******************************************************************/ @@ -2131,8 +2169,25 @@ tex2mail_output(GEN z, long n) else sprintf(s, "\\%%%ld = ", n); pariputs_opt(s); - if (o_logfile) - fprintf(o_logfile, "%%%ld = ", n); + if (o_logfile) { + switch (logstyle) { + case logstyle_plain: + plain_out: + fprintf(o_logfile, "%%%ld = ", n); + break; + case logstyle_color: + if (!n) + goto plain_out; + fprintf(o_logfile, "%s%%%ld = ", term_get_color(c_HIST), n); + /* Can't merge, term_get_color() uses statics...: */ + fprintf(o_logfile, "%s", term_get_color(c_OUTPUT)); + break; + case logstyle_TeX: + fprintf(o_logfile, "\\PARIout{%ld}", n); + break; + + } + } } /* output */ gen_output(z, &T); @@ -2143,7 +2198,27 @@ tex2mail_output(GEN z, long n) if (o_logfile) { pari_outfile = o_logfile; /* XXXX Maybe it is better to output in another format? */ - outbrute(z); pariputc('\n'); pariflush(); + if (logstyle == logstyle_TeX) { + int extrabraces = 0; + ulong o_style = TeXstyle; + + switch (typ(z)) { + case t_FRAC: case t_FRACN: case t_RFRAC: case t_RFRACN: + if (!(TeXstyle & TEXSTYLE_FRAC)) + /* Extra braces disable line breaks, avoid them if possible */ + extrabraces = 1; + } + if (extrabraces) + pariputc('{'); + TeXstyle |= TEXSTYLE_BREAK; + outtex(z); + if (extrabraces) + pariputc('}'); + pariputc('%'); + TeXstyle = o_style; + } else + outbrute(z); + pariputc('\n'); pariflush(); } logfile = o_logfile; pari_outfile = o_out; diff -pru pari/src/language/init.c pari-my-200302/src/language/init.c --- pari/src/language/init.c Sat Feb 22 18:58:50 2003 +++ pari-my-200302/src/language/init.c Sat Feb 22 19:58:36 2003 @@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place - Suit /* Variables statiques communes : */ FILE *pari_outfile, *errfile, *logfile, *infile; +ulong logstyle, TeXstyle; GEN *polun, *polx; GEN gnil, gzero, gun, gdeux, ghalf, polvar, gi; GEN gpi=NULL, geuler=NULL, bernzone=NULL;