I have noticed that the latex format in psql has some bugs:

o "_" is not escaped, and causes TeX to abort, thinking it's a
  subscript outside of maths mode.  Most of my table and field names
  use underscores, so this is a really nasty one.
o The column count is calculated using the contents of opt_align. But
  opt_align has one extra element, and so it's always one too many.  I
  changed it to count the column headings, like all the other output
  formats.  There may be a bug in computing opt_align that this patch
  does not address, but I'm not yet familiar enough with the psql
  source to fix this as well.
o  The line drawing rules for each border setting (0-3) and expanded
  mode didn't always match the documented behaviour and what other
  formats (e.g. aligned) did.  I made it as conformant as possible,
  and also tidied the alignment of the first line of the footer, which
  was incorrectly indented.

Roger Leigh
This commit is contained in:
Bruce Momjian 2004-08-06 18:09:15 +00:00
parent 7f018ac1c2
commit d6e05afc3d

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.48 2004/05/23 22:20:10 neilc Exp $
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.49 2004/08/06 18:09:15 momjian Exp $
*/
#include "postgres_fe.h"
#include "common.h"
@ -790,6 +790,9 @@ latex_escaped_print(const char *in, FILE *fout)
case '$':
fputs("\\$", fout);
break;
case '_':
fputs("\\_", fout);
break;
case '{':
fputs("\\{", fout);
break;
@ -817,7 +820,6 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
{
unsigned int col_count = 0;
unsigned int i;
const char *cp;
const char *const * ptr;
@ -829,42 +831,39 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
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)
if (opt_border == 2)
fputs("| ", fout);
for (i = 0; i < col_count; i++)
{
for (cp = opt_align; *cp; cp++)
{
if (cp != opt_align)
fputc('|', fout);
fputc(*cp, fout);
}
}
else if (opt_border == 2)
{
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 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
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 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
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 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
if (opt_border == 2)
fputs("\\hline\n", fout);
fputs("\\end{tabular}\n\n", fout);
fputs("\\end{tabular}\n\n\\noindent ", fout);
/* print footers */