From d6e05afc3dc3dd0caaeb0fb11bd1b8d4851ff37a Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 6 Aug 2004 18:09:15 +0000
Subject: [PATCH] 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
---
 src/bin/psql/print.c | 55 +++++++++++++++++++++++---------------------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 72d6a6e288..22639a7947 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -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"
@@ -769,7 +769,7 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
 
 
 /*************************/
-/* LaTeX				 */
+/* LaTeX		 */
 /*************************/
 
 
@@ -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 */