Re: psql latex bugfixes - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: psql latex bugfixes |
Date | |
Msg-id | 200408030109.i7319EP13667@candle.pha.pa.us Whole thread Raw |
In response to | psql latex bugfixes (Roger Leigh <rleigh@whinlatter.ukfsn.org>) |
Responses |
Re: psql latex bugfixes
|
List | pgsql-patches |
This has been saved for the 7.6 release: http:/momjian.postgresql.org/cgi-bin/pgpatches2 --------------------------------------------------------------------------- Roger Leigh wrote: > I have noticed that the latex format in psql has some bugs: > > ? "_" 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. > ? 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. > ? 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. > > I've attached some example output with this patch applied. > > Regards, > Roger > > > 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 22:54:22 -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 */ > > > > -- > Roger Leigh > > Printing on GNU/Linux? http://gimp-print.sourceforge.net/ > GPG Public Key: 0x25BFB848. Please sign and encrypt your mail. Content-Description: psql latex output [ text/x-tex is unsupported, treating like TEXT/PLAIN ] > \documentclass[a4paper]{article} > > \begin{document} > \title{Test} > \maketitle > > \section{Normal} > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{lll} > \textit{Column} & \textit{Type} & \textit{Modifiers} \\ > \hline > id & integer & not null default nextval('public.suites\_id\_seq'::text) \\ > name & text & not null \\ > archive\_id & integer & not null \\ > version & text & \\ > path & text & \\ > alias & text & \\ > description & text & \\ > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{l | l | l} > \textit{Column} & \textit{Type} & \textit{Modifiers} \\ > \hline > id & integer & not null default nextval('public.suites\_id\_seq'::text) \\ > name & text & not null \\ > archive\_id & integer & not null \\ > version & text & \\ > path & text & \\ > alias & text & \\ > description & text & \\ > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{| l | l | l |} > \hline > \textit{Column} & \textit{Type} & \textit{Modifiers} \\ > \hline > id & integer & not null default nextval('public.suites\_id\_seq'::text) \\ > name & text & not null \\ > archive\_id & integer & not null \\ > version & text & \\ > path & text & \\ > alias & text & \\ > description & text & \\ > \hline > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{cl} > \multicolumn{2}{c}{\textit{Record 1}} \\ > Column & id \\ > Type & integer \\ > Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\ > \multicolumn{2}{c}{\textit{Record 2}} \\ > Column & name \\ > Type & text \\ > Modifiers & not null \\ > \multicolumn{2}{c}{\textit{Record 3}} \\ > Column & archive\_id \\ > Type & integer \\ > Modifiers & not null \\ > \multicolumn{2}{c}{\textit{Record 4}} \\ > Column & version \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 5}} \\ > Column & path \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 6}} \\ > Column & alias \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 7}} \\ > Column & description \\ > Type & text \\ > Modifiers & \\ > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{c|l} > \multicolumn{2}{c}{\textit{Record 1}} \\ > \hline > Column & id \\ > Type & integer \\ > Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\ > \multicolumn{2}{c}{\textit{Record 2}} \\ > \hline > Column & name \\ > Type & text \\ > Modifiers & not null \\ > \multicolumn{2}{c}{\textit{Record 3}} \\ > \hline > Column & archive\_id \\ > Type & integer \\ > Modifiers & not null \\ > \multicolumn{2}{c}{\textit{Record 4}} \\ > \hline > Column & version \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 5}} \\ > \hline > Column & path \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 6}} \\ > \hline > Column & alias \\ > Type & text \\ > Modifiers & \\ > \multicolumn{2}{c}{\textit{Record 7}} \\ > \hline > Column & description \\ > Type & text \\ > Modifiers & \\ > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > \begin{center} > Table "public.suites" > \end{center} > > \begin{tabular}{|c|l|} > \hline > \multicolumn{2}{|c|}{\textit{Record 1}} \\ > \hline > Column & id \\ > Type & integer \\ > Modifiers & not null default nextval('public.suites\_id\_seq'::text) \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 2}} \\ > \hline > Column & name \\ > Type & text \\ > Modifiers & not null \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 3}} \\ > \hline > Column & archive\_id \\ > Type & integer \\ > Modifiers & not null \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 4}} \\ > \hline > Column & version \\ > Type & text \\ > Modifiers & \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 5}} \\ > \hline > Column & path \\ > Type & text \\ > Modifiers & \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 6}} \\ > \hline > Column & alias \\ > Type & text \\ > Modifiers & \\ > \hline > \multicolumn{2}{|c|}{\textit{Record 7}} \\ > \hline > Column & description \\ > Type & text \\ > Modifiers & \\ > \hline > \end{tabular} > > \noindent Indexes: \\ > "suites\_pkey" PRIMARY KEY, btree (id) \\ > "suites\_alias\_key" UNIQUE, btree (alias) \\ > "suites\_name\_key" UNIQUE, btree (name) \\ > Foreign-key constraints: \\ > "suites\_archive\_ref" FOREIGN KEY (archive\_id) REFERENCES archives(id) \\ > > > > \end{document} > > %%% Local Variables: > %%% mode: latex > %%% TeX-master: t > %%% End: Content-Description: psql latex PDF output [ Attachment, skipping... ] > > ---------------------------(end of broadcast)--------------------------- > TIP 9: the planner will ignore your desire to choose an index scan if your > joining column's datatypes do not match -- 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
pgsql-patches by date: