Troff -ms output for psql
Hello,
I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.
The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.
The output should be saved in a file and piped as follows:
cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.ps
Because it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.
I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).
Regards,
Roger
PS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!
--
Roger Leigh
Printing on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.
This has been saved for the 7.6 release:
http:/momjian.postgresql.org/cgi-bin/pgpatches2
---------------------------------------------------------------------------
Roger Leigh wrote:
Hello,
I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.The output should be saved in a file and piped as follows:
cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.psBecause it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).Regards,
RogerPS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!--
Roger LeighPrinting on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.
Content-Description: patch to add troff output to psql
[ text/x-patch is unsupported, treating like TEXT/PLAIN ]
Index: doc/src/sgml/ref/psql-ref.sgml =================================================================== RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/psql-ref.sgml,v retrieving revision 1.119 diff -u -r1.119 psql-ref.sgml --- doc/src/sgml/ref/psql-ref.sgml 15 Jul 2004 03:56:04 -0000 1.119 +++ doc/src/sgml/ref/psql-ref.sgml 1 Aug 2004 17:36:46 -0000 @@ -1372,9 +1372,10 @@ <listitem> <para> Sets the output format to one of <literal>unaligned</literal>, - <literal>aligned</literal>, <literal>html</literal>, or - <literal>latex</literal>. Unique abbreviations are allowed. - (That would mean one letter is enough.) + <literal>aligned</literal>, <literal>html</literal>, + <literal>latex</literal>, or <literal>troff-ms</literal>. + Unique abbreviations are allowed. (That would mean one letter + is enough.) </para><para> Index: src/bin/psql/command.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/command.c,v retrieving revision 1.122 diff -u -r1.122 command.c --- src/bin/psql/command.c 15 Jul 2004 03:56:06 -0000 1.122 +++ src/bin/psql/command.c 1 Aug 2004 17:36:53 -0000 @@ -1307,6 +1307,9 @@ case PRINT_LATEX: return "latex"; break; + case PRINT_TROFF_MS: + return "troff-ms"; + break; } return "unknown"; } @@ -1335,9 +1338,11 @@ popt->topt.format = PRINT_HTML; else if (pg_strncasecmp("latex", value, vallen) == 0) popt->topt.format = PRINT_LATEX; + else if (pg_strncasecmp("troff-ms", value, vallen) == 0) + popt->topt.format = PRINT_TROFF_MS; else { - psql_error("\\pset: allowed formats are unaligned, aligned, html, latex\n"); + psql_error("\\pset: allowed formats are unaligned, aligned, html, latex, troff-ms\n"); return false; }Index: src/bin/psql/print.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v retrieving revision 1.48 diff -u -r1.48 print.c --- src/bin/psql/print.c 23 May 2004 22:20:10 -0000 1.48 +++ src/bin/psql/print.c 1 Aug 2004 17:36:56 -0000 @@ -769,7 +769,7 @@/*************************/ -/* LaTeX */ +/* LaTeX */ /*************************/@@ -790,6 +790,9 @@
case '$':
fputs("\\$", fout);
break;
+ case '_':
+ fputs("\\_", fout);
+ break;
case '{':
fputs("\\{", fout);
break;
@@ -817,7 +820,6 @@
{
unsigned int col_count = 0;
unsigned int i;
- const char *cp;
const char *const * ptr;@@ -829,42 +831,39 @@
fputs("\n\\end{center}\n\n", fout);
}+ /* count columns */ + for (ptr = headers; *ptr; ptr++) + col_count++; + /* begin environment and set alignments and borders */ fputs("\\begin{tabular}{", fout); - if (opt_border == 0) - fputs(opt_align, fout); - else if (opt_border == 1) - { - for (cp = opt_align; *cp; cp++) - { - if (cp != opt_align) - fputc('|', fout); - fputc(*cp, fout); - } - } - else if (opt_border == 2) + + if (opt_border == 2) + fputs("| ", fout); + for (i = 0; i < col_count; i++) { - for (cp = opt_align; *cp; cp++) - { - fputc('|', fout); - fputc(*cp, fout); - } - fputc('|', fout); + fputc(*(opt_align + i), fout); + if (opt_border != 0 && i < col_count - 1) + fputs (" | ", fout); } + if (opt_border == 2) + fputs(" |", fout); + fputs("}\n", fout);if (!opt_barebones && opt_border == 2)
fputs("\\hline\n", fout);/* print headers and count columns */ - for (i = 0, ptr = headers; *ptr; i++, ptr++) + for (i = 0, ptr = headers; i < col_count; i++, ptr++) { - col_count++; if (!opt_barebones) { if (i != 0) fputs(" & ", fout); + fputs("\\textit{", fout); latex_escaped_print(*ptr, fout); + fputc('}', fout); } }@@ -888,7 +887,7 @@
if (opt_border == 2)
fputs("\\hline\n", fout);- fputs("\\end{tabular}\n\n", fout); + fputs("\\end{tabular}\n\n\\noindent ", fout);/* print footers */ @@ -951,8 +950,12 @@ if (!opt_barebones) { if (opt_border == 2) + { fputs("\\hline\n", fout); - fprintf(fout, "\\multicolumn{2}{c}{Record %d} \\\\\n", record++); + fprintf(fout, "\\multicolumn{2}{|c|}{\\textit{Record %d}} \\\\\n", record++); + } + else + fprintf(fout, "\\multicolumn{2}{c}{\\textit{Record %d}} \\\\\n", record++); } if (opt_border >= 1) fputs("\\hline\n", fout); @@ -967,7 +970,7 @@ if (opt_border == 2) fputs("\\hline\n", fout);- fputs("\\end{tabular}\n\n", fout); + fputs("\\end{tabular}\n\n\\noindent ", fout);/* print footers */
@@ -984,6 +987,213 @@+/*************************/ +/* Troff -ms */ +/*************************/ + + +static void +troff_ms_escaped_print(const char *in, FILE *fout) +{ + const char *p; + + for (p = in; *p; p++) + switch (*p) + { + case '\\': + fputs("\(rs", fout); + break; + default: + fputc(*p, fout); + } +} + + + +static void +print_troff_ms_text(const char *title, const char *const * headers, + const char *const * cells, const char *const * footers, +const char *opt_align, bool opt_barebones, unsigned short int opt_border, + FILE *fout) +{ + unsigned int col_count = 0; + unsigned int i; + const char *const * ptr; + + + /* print title */ + if (!opt_barebones && title) + { + fputs(".LP\n.DS C\n", fout); + troff_ms_escaped_print(title, fout); + fputs("\n.DE\n", fout); + } + + /* count columns */ + for (ptr = headers; *ptr; ptr++) + col_count++; + + /* begin environment and set alignments and borders */ + fputs(".LP\n.TS\n", fout); + if (opt_border == 2) + fputs("center box;\n", fout); + else + fputs("center;\n", fout); + + for (i = 0; i < col_count; i++) + { + fputc(*(opt_align + i), fout); + if (opt_border > 0 && i < col_count - 1) + fputs(" | ", fout); + } + fputs(".\n", fout); + + /* print headers and count columns */ + for (i = 0, ptr = headers; i < col_count; i++, ptr++) + { + if (!opt_barebones) + { + if (i != 0) + fputc('\t', fout); + fputs("\\fI", fout); + troff_ms_escaped_print(*ptr, fout); + fputs("\\fP", fout); + } + } + + if (!opt_barebones) + { + fputs("\n_\n", fout); + } + + /* print cells */ + for (i = 0, ptr = cells; *ptr; i++, ptr++) + { + troff_ms_escaped_print(*ptr, fout); + + if ((i + 1) % col_count == 0) + fputc('\n', fout); + else + fputc('\t', fout); + } + + fputs(".TE\n.DS L\n", fout); + + + /* print footers */ + + if (footers && !opt_barebones) + for (ptr = footers; *ptr; ptr++) + { + troff_ms_escaped_print(*ptr, fout); + fputc('\n', fout); + } + + fputs(".DE\n", fout); +} + + + +static void +print_troff_ms_vertical(const char *title, const char *const * headers, + const char *const * cells, const char *const * footers, +const char *opt_align, bool opt_barebones, unsigned short int opt_border, + FILE *fout) +{ + unsigned int col_count = 0; + unsigned int i; + const char *const * ptr; + unsigned int record = 1; + unsigned short current_format = 0; /* 0=none, 1=header, 2=body */ + + (void) opt_align; /* currently unused parameter */ + + /* print title */ + if (!opt_barebones && title) + { + fputs(".LP\n.DS C\n", fout); + troff_ms_escaped_print(title, fout); + fputs("\n.DE\n", fout); + } + + /* begin environment and set alignments and borders */ + fputs(".LP\n.TS\n", fout); + if (opt_border == 2) + fputs("center box;\n", fout); + else + fputs("center;\n", fout); + + /* basic format */ + if (opt_barebones) + fputs("c l;\n", fout); + + + /* count columns */ + for (ptr = headers; *ptr; ptr++) + col_count++; + + + /* print records */ + for (i = 0, ptr = cells; *ptr; i++, ptr++) + { + /* new record */ + if (i % col_count == 0) + { + if (!opt_barebones) + { + + if (current_format != 1) + { + if (opt_border == 2 && i > 0) + fputs("_\n", fout); + if (current_format != 0) + fputs(".T&\n", fout); + fputs("c s.\n", fout); + current_format = 1; + } + fprintf(fout, "\\fIRecord %d\\fP\n", record++); + } + if (opt_border >= 1) + fputs("_\n", fout); + } + + if (!opt_barebones) + { + if (current_format != 2) + { + if (current_format != 0) + fputs(".T&\n", fout); + if (opt_border != 1) + fputs("c l.\n", fout); + else + fputs("c | l.\n", fout); + current_format = 2; + } + } + + troff_ms_escaped_print(headers[i % col_count], fout); + fputc('\t', fout); + troff_ms_escaped_print(*ptr, fout); + fputc('\n', fout); + } + + fputs(".TE\n.DS L\n", fout); + + + /* print footers */ + + if (footers && !opt_barebones) + for (ptr = footers; *ptr; ptr++) + { + troff_ms_escaped_print(*ptr, fout); + fputc('\n', fout); + } + + fputs(".DE\n", fout); +} + + + /********************************/ /* Public functions */ /********************************/ @@ -1113,6 +1323,12 @@ else print_latex_text(title, headers, cells, footers, align, opt->tuples_only, border, output); break; + case PRINT_TROFF_MS: + if (opt->expanded) + print_troff_ms_vertical(title, headers, cells, footers, align, opt->tuples_only, border, output); + else + print_troff_ms_text(title, headers, cells, footers, align, opt->tuples_only, border, output); + break; default: fprintf(stderr, "+ Oops, you shouldn't see this!\n"); } Index: src/bin/psql/print.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.h,v retrieving revision 1.20 diff -u -r1.20 print.h --- src/bin/psql/print.h 29 Nov 2003 19:52:07 -0000 1.20 +++ src/bin/psql/print.h 1 Aug 2004 17:36:56 -0000 @@ -21,7 +21,8 @@ PRINT_UNALIGNED, PRINT_ALIGNED, PRINT_HTML, - PRINT_LATEX + PRINT_LATEX, + PRINT_TROFF_MS /* add your favourite output format here ... */ };
Content-Description: Troff -ms generated source
[ Attachment, skipping... ]
Content-Description: Troff -ms postscript output
[ Attachment, skipping... ]
Content-Description: LaTeX generated source
[ Attachment, skipping... ]
Content-Description: LaTeX PDF output
[ Attachment, skipping... ]
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
You mean 8.1 release :P
Bruce Momjian wrote:
Show quoted text
This has been saved for the 7.6 release:
http:/momjian.postgresql.org/cgi-bin/pgpatches2
Perhaps. :-)
---------------------------------------------------------------------------
Christopher Kings-Lynne wrote:
You mean 8.1 release :P
Bruce Momjian wrote:
This has been saved for the 7.6 release:
http:/momjian.postgresql.org/cgi-bin/pgpatches2
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Patch applied, thanks.
Following the commit of my psql latex format fixes, I've re-done the
patch for the troff-ms format which previously included this patch.
It's identical to the original but with the latex hunks removed.
---------------------------------------------------------------------------
Roger Leigh wrote:
Hello,
I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.The output should be saved in a file and piped as follows:
cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.psBecause it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).Regards,
RogerPS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!--
Roger LeighPrinting on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.
Content-Description: patch to add troff output to psql
Content-Description: Troff -ms generated source
[ Attachment, skipping... ]
Content-Description: Troff -ms postscript output
[ Attachment, skipping... ]
Content-Description: LaTeX generated source
[ Attachment, skipping... ]
Content-Description: LaTeX PDF output
[ Attachment, skipping... ]
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073