mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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:
		@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user