mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Add a latex-longtable output format to psql
latex longtable is more powerful than the 'tabular' output format 'latex' uses. Also add border=3 support to 'latex'.
This commit is contained in:
@ -1612,8 +1612,8 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
if (cancel_pressed)
|
||||
return;
|
||||
|
||||
if (opt_border > 2)
|
||||
opt_border = 2;
|
||||
if (opt_border > 3)
|
||||
opt_border = 3;
|
||||
|
||||
if (cont->opt->start_table)
|
||||
{
|
||||
@ -1628,7 +1628,7 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
/* begin environment and set alignments and borders */
|
||||
fputs("\\begin{tabular}{", fout);
|
||||
|
||||
if (opt_border == 2)
|
||||
if (opt_border >= 2)
|
||||
fputs("| ", fout);
|
||||
for (i = 0; i < cont->ncolumns; i++)
|
||||
{
|
||||
@ -1636,12 +1636,12 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
if (opt_border != 0 && i < cont->ncolumns - 1)
|
||||
fputs(" | ", fout);
|
||||
}
|
||||
if (opt_border == 2)
|
||||
if (opt_border >= 2)
|
||||
fputs(" |", fout);
|
||||
|
||||
fputs("}\n", fout);
|
||||
|
||||
if (!opt_tuples_only && opt_border == 2)
|
||||
if (!opt_tuples_only && opt_border >= 2)
|
||||
fputs("\\hline\n", fout);
|
||||
|
||||
/* print headers */
|
||||
@ -1668,6 +1668,8 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
if ((i + 1) % cont->ncolumns == 0)
|
||||
{
|
||||
fputs(" \\\\\n", fout);
|
||||
if (opt_border == 3)
|
||||
fputs("\\hline\n", fout);
|
||||
if (cancel_pressed)
|
||||
break;
|
||||
}
|
||||
@ -1679,7 +1681,7 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
{
|
||||
printTableFooter *footers = footers_with_default(cont);
|
||||
|
||||
if (opt_border == 2)
|
||||
if (opt_border >= 2)
|
||||
fputs("\\hline\n", fout);
|
||||
|
||||
fputs("\\end{tabular}\n\n\\noindent ", fout);
|
||||
@ -1701,6 +1703,162 @@ print_latex_text(const printTableContent *cont, FILE *fout)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
print_latex_text_longtable(const printTableContent *cont, FILE *fout)
|
||||
{
|
||||
bool opt_tuples_only = cont->opt->tuples_only;
|
||||
unsigned short opt_border = cont->opt->border;
|
||||
unsigned int i;
|
||||
const char *opt_table_attr = cont->opt->tableAttr;
|
||||
const char *next_opt_table_attr_char = opt_table_attr;
|
||||
const char *last_opt_table_attr_char = NULL;
|
||||
const char *const * ptr;
|
||||
|
||||
if (cancel_pressed)
|
||||
return;
|
||||
|
||||
if (opt_border > 3)
|
||||
opt_border = 3;
|
||||
|
||||
if (cont->opt->start_table)
|
||||
{
|
||||
/* begin environment and set alignments and borders */
|
||||
fputs("\\begin{longtable}{", fout);
|
||||
|
||||
if (opt_border >= 2)
|
||||
fputs("| ", fout);
|
||||
|
||||
for (i = 0; i < cont->ncolumns; i++)
|
||||
{
|
||||
/* longtable supports either a width (p) or an alignment (l/r) */
|
||||
/* Are we left-justified and was a proportional width specified? */
|
||||
if (*(cont->aligns + i) == 'l' && opt_table_attr)
|
||||
{
|
||||
#define LONGTABLE_WHITESPACE " \t\n"
|
||||
|
||||
/* advance over whitespace */
|
||||
next_opt_table_attr_char += strspn(next_opt_table_attr_char,
|
||||
LONGTABLE_WHITESPACE);
|
||||
/* We have a value? */
|
||||
if (next_opt_table_attr_char[0] != '\0')
|
||||
{
|
||||
fputs("p{", fout);
|
||||
fwrite(next_opt_table_attr_char, strcspn(next_opt_table_attr_char,
|
||||
LONGTABLE_WHITESPACE), 1, fout);
|
||||
last_opt_table_attr_char = next_opt_table_attr_char;
|
||||
next_opt_table_attr_char += strcspn(next_opt_table_attr_char,
|
||||
LONGTABLE_WHITESPACE);
|
||||
fputs("\\textwidth}", fout);
|
||||
}
|
||||
/* use previous value */
|
||||
else if (last_opt_table_attr_char != NULL)
|
||||
{
|
||||
fputs("p{", fout);
|
||||
fwrite(last_opt_table_attr_char, strcspn(last_opt_table_attr_char,
|
||||
LONGTABLE_WHITESPACE), 1, fout);
|
||||
fputs("\\textwidth}", fout);
|
||||
}
|
||||
else
|
||||
fputc('l', fout);
|
||||
}
|
||||
else
|
||||
fputc(*(cont->aligns + i), fout);
|
||||
|
||||
if (opt_border != 0 && i < cont->ncolumns - 1)
|
||||
fputs(" | ", fout);
|
||||
}
|
||||
|
||||
if (opt_border >= 2)
|
||||
fputs(" |", fout);
|
||||
|
||||
fputs("}\n", fout);
|
||||
|
||||
/* print headers */
|
||||
if (!opt_tuples_only)
|
||||
{
|
||||
/* firsthead */
|
||||
if (opt_border >= 2)
|
||||
fputs("\\toprule\n", fout);
|
||||
for (i = 0, ptr = cont->headers; i < cont->ncolumns; i++, ptr++)
|
||||
{
|
||||
if (i != 0)
|
||||
fputs(" & ", fout);
|
||||
fputs("\\small\\textbf{\\textit{", fout);
|
||||
latex_escaped_print(*ptr, fout);
|
||||
fputs("}}", fout);
|
||||
}
|
||||
fputs(" \\\\\n", fout);
|
||||
fputs("\\midrule\n\\endfirsthead\n", fout);
|
||||
|
||||
/* secondary heads */
|
||||
if (opt_border >= 2)
|
||||
fputs("\\toprule\n", fout);
|
||||
for (i = 0, ptr = cont->headers; i < cont->ncolumns; i++, ptr++)
|
||||
{
|
||||
if (i != 0)
|
||||
fputs(" & ", fout);
|
||||
fputs("\\small\\textbf{\\textit{", fout);
|
||||
latex_escaped_print(*ptr, fout);
|
||||
fputs("}}", fout);
|
||||
}
|
||||
fputs(" \\\\\n", fout);
|
||||
/* If the line under the row already appeared, don't do another */
|
||||
if (opt_border != 3)
|
||||
fputs("\\midrule\n", fout);
|
||||
fputs("\\endhead\n", fout);
|
||||
|
||||
/* table name, caption? */
|
||||
if (!opt_tuples_only && cont->title)
|
||||
{
|
||||
/* Don't output if we are printing a line under each row */
|
||||
if (opt_border == 2)
|
||||
fputs("\\bottomrule\n", fout);
|
||||
fputs("\\caption[", fout);
|
||||
latex_escaped_print(cont->title, fout);
|
||||
fputs(" (Continued)]{", fout);
|
||||
latex_escaped_print(cont->title, fout);
|
||||
fputs("}\n\\endfoot\n", fout);
|
||||
if (opt_border == 2)
|
||||
fputs("\\bottomrule\n", fout);
|
||||
fputs("\\caption[", fout);
|
||||
latex_escaped_print(cont->title, fout);
|
||||
fputs("]{", fout);
|
||||
latex_escaped_print(cont->title, fout);
|
||||
fputs("}\n\\endlastfoot\n", fout);
|
||||
}
|
||||
/* output bottom table line? */
|
||||
else if (opt_border >= 2)
|
||||
{
|
||||
fputs("\\bottomrule\n\\endfoot\n", fout);
|
||||
fputs("\\bottomrule\n\\endlastfoot\n", fout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* print cells */
|
||||
for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
|
||||
{
|
||||
/* Add a line under each row? */
|
||||
if (i != 0 && i % cont->ncolumns != 0)
|
||||
fputs("\n&\n", fout);
|
||||
fputs("\\raggedright{", fout);
|
||||
latex_escaped_print(*ptr, fout);
|
||||
fputc('}', fout);
|
||||
if ((i + 1) % cont->ncolumns == 0)
|
||||
{
|
||||
fputs(" \\tabularnewline\n", fout);
|
||||
if (opt_border == 3)
|
||||
fputs(" \\hline\n", fout);
|
||||
}
|
||||
if (cancel_pressed)
|
||||
break;
|
||||
}
|
||||
|
||||
if (cont->opt->stop_table)
|
||||
fputs("\\end{longtable}\n", fout);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
print_latex_vertical(const printTableContent *cont, FILE *fout)
|
||||
{
|
||||
@ -2394,6 +2552,12 @@ printTable(const printTableContent *cont, FILE *fout, FILE *flog)
|
||||
else
|
||||
print_latex_text(cont, fout);
|
||||
break;
|
||||
case PRINT_LATEX_LONGTABLE:
|
||||
if (cont->opt->expanded == 1)
|
||||
print_latex_vertical(cont, fout);
|
||||
else
|
||||
print_latex_text_longtable(cont, fout);
|
||||
break;
|
||||
case PRINT_TROFF_MS:
|
||||
if (cont->opt->expanded == 1)
|
||||
print_troff_ms_vertical(cont, fout);
|
||||
|
Reference in New Issue
Block a user