psql latex bugfixes - Mailing list pgsql-patches
From | Roger Leigh |
---|---|
Subject | psql latex bugfixes |
Date | |
Msg-id | 87acxe1m5a.fsf@whinlatter.whinlatter.ukfsn.org Whole thread Raw |
Responses |
Re: psql latex bugfixes
Re: psql latex bugfixes |
List | pgsql-patches |
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. \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:
Attachment
pgsql-patches by date: