LaTeX::Table(3pm) | User Contributed Perl Documentation | LaTeX::Table(3pm) |
LaTeX::Table - Perl extension for the automatic generation of LaTeX tables.
This document describes LaTeX::Table version 1.0.6
use LaTeX::Table; use Number::Format qw(:subs); # use mighty CPAN to format values my $header = [ [ 'Item:2c', '' ], [ '\cmidrule(r){1-2}' ], [ 'Animal', 'Description', 'Price' ], ]; my $data = [ [ 'Gnat', 'per gram', '13.65' ], [ '', 'each', '0.0173' ], [ 'Gnu', 'stuffed', '92.59' ], [ 'Emu', 'stuffed', '33.33' ], [ 'Armadillo', 'frozen', '8.99' ], ]; my $table = LaTeX::Table->new( { filename => 'prices.tex', maincaption => 'Price List', caption => 'Try our special offer today!', label => 'table:prices', position => 'tbp', header => $header, data => $data, } ); # write LaTeX code in prices.tex $table->generate(); # callback functions help you to format values easily (as # a great alternative to LaTeX packages like rccol) # # Here, the first colum and the header is printed in upper # case and the third colum is formatted with format_price() $table->set_callback(sub { my ($row, $col, $value, $is_header ) = @_; if ($col == 0 || $is_header) { $value = uc $value; } elsif ($col == 2 && !$is_header) { $value = format_price($value, 2, ''); } return $value; }); print $table->generate_string();
Now in your LaTeX document:
\documentclass{article} % for multi-page tables (xtab or longtable) \usepackage{xtab} %\usepackage{longtable} % for publication quality tables (Meyrin theme, the default) \usepackage{booktabs} % for the NYC theme \usepackage{array} \usepackage{colortbl} \usepackage{xcolor} \begin{document} \input{prices} \end{document}
LaTeX makes professional typesetting easy. Unfortunately, this is not entirely true for tables and the standard LaTeX table macros have a rather limited functionality. This module supports many CTAN packages and hides the complexity of using them behind an easy and intuitive API.
This module supports multi-page tables via the "xtab" or the "longtable" package. For publication quality tables, it uses the "booktabs" package. It also supports the "tabularx" and "tabulary" packages for nicer fixed-width tables. Furthermore, it supports the "colortbl" package for colored tables optimized for presentations. The powerful new "ctable" package is supported and especially recommended when footnotes are needed. "LaTeX::Table" ships with some predefined, good looking "THEMES". The program ltpretty makes it possible to use this module from within a text editor.
% include prices.tex, generated by LaTeX::Table \input{prices}
my $latexcode = $table->generate_string();
for my $theme ( keys %{ $table->get_available_themes } ) { ... }
Options can be defined in the constructor hash reference or with the setter "set_optionname". Additionally, getters of the form "get_optionname" are created.
$table->set_header([ [ 'Animal', 'Price' ] ]);
will produce following header:
+--------+-------+ | Animal | Price | +--------+-------+
Here an example for a multirow header:
$table->set_header([ [ 'Animal', 'Price' ], ['', '(roughly)' ] ]);
This code will produce this header:
+--------+-----------+ | Animal | Price | | | (roughly) | +--------+-----------+
Single column rows that start with a backslash are treated as LaTeX commands and are not further formatted. So,
my $header = [ [ 'Item:2c', '' ], ['\cmidrule{1-2}'], [ 'Animal', 'Description', 'Price' ] ];
will produce following LaTeX code in the Zurich theme:
\multicolumn{2}{c}{\textbf{Item}} & \\ \cmidrule{1-2} \textbf{Animal} & \multicolumn{1}{c}{\textbf{Description}} & \multicolumn{1}{c}{\textbf{Price}}\\
Note that there is no "\multicolumn", "\textbf" or "\\" added to the second row.
$table->set_data([ [ 'Gnu', '92.59' ], [ 'Emu', '33.33' ] ]);
And you will get a table like this:
+-------+---------+ | Gnu | 92.59 | | Emu | 33.33 | +-------+---------+
An empty column array will produce a horizontal rule (line):
$table->set_data([ [ 'Gnu', '92.59' ], [], [ 'Emu', '33.33' ] ]);
Now you will get such a table:
+-------+---------+ | Gnu | 92.59 | +-------+---------+ | Emu | 33.33 | +-------+---------+
This works also in "header".
Single column rows starting with a backslash are again printed without any formatting. So,
$table->set_data([ [ 'Gnu', '92.59' ], ['\hline'], [ 'Emu', '33.33' ] ]);
is equivalent to the example above (except that there always the correct rule command is used, i.e. "\midrule" vs. "\hline").
# Returns the header and data formatted in LaTeX code. Nothing else. $table->set_custom_template('[% HEADER_CODE %][% DATA_CODE %]');
See LaTeX::Table::Types::TypeI.
The non-floating xtab and longtable environments are mandatory (get_environment() must return a true value here) and support all options in this section except for "position".
The ctable type automatically adds an environment when any of the following options are set.
... caption_top => 1, ...
You can specify an alternative command here:
... caption_top => 'topcaption', # would require the topcapt package
Or even multiple commands:
caption_top => '\setlength{\abovecaptionskip}{0pt}\setlength{\belowcaptionskip}{10pt}\caption', ...
Default 0 (caption below the table) because the spacing in the standard LaTeX macros is optimized for bottom captions. At least for multi-page tables, however, top captions are highly recommended. You can use the "caption" LaTeX package to fix the spacing:
\usepackage[tableposition=top]{caption}
maincaption => 'Price List', caption => 'Try our special offer today!',
will generate
\caption[Price List]{Price List. Try our special offer today!}
Themes can set the font family of the maincaption.
Default 0. Requires "environment".
$table->set_continued(1);
# don't generate any aligning code $table->set_center(0); ... # restore default $table->clear_center();
$table->set_label('tbl:prices');
$table->set_sideways(1);
$table->set_star(1);
See also the documentation of "width" below for cases when a width is specified.
\begin{tabular}{lrcr} ..
If unset, "LaTeX::Table" tries to guess a good definition. Columns containing only numbers are right-justified, others left-justified. Columns with cells longer than 30 characters are p (paragraph) columns of size '5cm' (X columns when the "tabularx", L when the "tabulary" package is selected). These rules can be changed with set_coldef_strategy(). Default is 0 (guess good definition). The left-hand column, the stub, is normally excluded here and is always left aligned. See LaTeX::Table::Themes::ThemeI.
{ NUMBER => qr{\A\s*([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\s*\z}xms, NUMBER_MUST_MATCH_ALL => 1, NUMBER_COL => 'r', LONG => qr{\A\s*(?=\w+\s+\w+).{29,}?\S}xms, LONG_MUST_MATCH_ALL => 0, LONG_COL => 'p{5cm}', LONG_COL_X => 'X', LONG_COL_Y => 'L', };
Note that columns can have only one type. Types are applied alphabetically, so for example a LONG NUMBER column has as final type NUMBER.
Examples:
# change standard types $table->set_coldef_strategy({ NUMBER => qr{\A \s* \d+ \s* \z}xms, # integers only LONG_COL => '>{\raggedright\arraybackslash}p{7cm}', # non-justified }); # add new types (here: columns that contain only URLs) $table->set_coldef_strategy({ URL => qr{\A \s* http }xms, URL_COL => '>{\ttfamily}l', });
# use 75% of textwidth $table->set_width('0.75\textwidth');
This will produce following LaTeX code:
\begin{tabular*}{0.75\textwidth}{l@{\extracolsep{\fill} ... }
For tables of "type" std, it is also possible to use the "tabularx" and "tabulary" LaTeX packages (see "width_environment" below). The tables of type ctable automatically use the "tabularx" package. See also "width_environment" for how to use this feature with longtable.
\begin{environment}{width}{def}
To use for example the one provided by the "tabularx" LaTeX package, write:
# use the tabularx package (for a std table) $table->set_width('300pt'); $table->set_width_environment('tabularx');
Note this will not add "@{\extracolsep{\fill}}" and that this overwrites a "custom_tabular_environment".
It is possible to use "tabularx" together with tables of type longtable. In this case, you have to generate a file and then load the table with the "LTXtable" command ("ltxtable" package):
$table = LaTeX::Table->new( { filename => 'mylongtable.tex' type => 'longtable', ... width_environment => 'tabularx', } );
Then in LaTeX:
\LTXtable{0.8\textwidth}{mylongtable}
Note that we have to do the specification of the width in LaTeX.
Default is 0 (see "width").
$table->set_eor("\\\\[1em]");
Callback functions (see below) can be used to manually set the eor after the last column. This is useful when some rows require different eor strings.
The passed arguments are $row, $col (both starting with 0), $value and $is_header.
use LaTeX::Encode; use Number::Format qw(:subs); ... # rotate header (not the first column), # use LaTeX::Encode to encode LaTeX special characters, # format the third column with Format::Number (only the data) my $table = LaTeX::Table->new( { header => $header, data => $data, callback => sub { my ( $row, $col, $value, $is_header ) = @_; if ( $col != 0 && $is_header ) { $value = '\begin{sideways}' . $value . '\end{sideways}'; } elsif ( $col == 2 && !$is_header ) { $value = format_price($value, 2, ''); } else { $value = latex_encode($value); } return $value; }, } );
$table->set_foottable('\tnote{footnotes are placed under the table}');
$table->set_resizebox([ '0.6\textwidth' ]); $table->set_resizebox([ '300pt', '200pt' ]);
# don't add any tabletail code: $table->set_tabletail(q{});
$table->set_xentrystretch(-0.1);
See LaTeX::Table::Themes::ThemeI how to define custom themes.
The themes are defined in LaTeX::Table::Themes::Beamer, LaTeX::Table::Themes::Booktabs, LaTeX::Table::Themes::Classic, LaTeX::Table::Themes::Modern.
$table->set_theme('Zurich');
# a "transposed" table ... my $table = LaTeX::Table->new( { data => $data, columns_like_header => [ 0 ], } );
Multicolumns are defined in LaTeX with "\multicolumn{$cols}{$alignment}{$text}". This module supports a simple shortcut of the format "$text:$cols$alignment". For example, "Item:2c" is equivalent to "\multicolumn{2}{c}{Item}". Note that vertical rules ("|") are automatically added here according the rules settings in the theme. See LaTeX::Table::Themes::ThemeI. "LaTeX::Table" also uses this shortcut to determine the column ids. So in this example,
my $data = [ [' \multicolumn{2}{c}{A}', 'B' ], [ 'C:2c', 'D' ] ];
'B' would have an column id of 1 and 'D' 2 ('A' and 'C' both 0). This is important for callback functions and for the coldef calculation. See "TABULAR ENVIRONMENT".
See examples/examples.pdf in this distribution for a short tutorial that covers the main features of this module. See also the example application csv2pdf for an example of the common task of converting a CSV (or Excel) file to LaTeX or even PDF.
If you get a LaTeX error message, please check whether you have included all required packages. The packages we use are "array", "booktabs", "colortbl", "ctable", "graphicx", "longtable", "lscape", "rotating", "tabularx", "tabulary", "xcolor" and "xtab".
"LaTeX::Table" may throw one of these errors:
"LaTeX::Table" requires no configuration files or environment variables.
Carp, Module::Pluggable, Moose, English, Scalar::Util, Template
The "width" option causes problems with themes using the "colortbl" package. You may have to specify here the overhang arguments of the "\columcolor" commands manually. Patches are of course welcome.
Problems with the "width" option are also known for tables of type longtable. You should use the "tabularx" package as described in the "width_environment" documentation.
Please report any bugs or feature requests to "bug-latex-table@rt.cpan.org", or through the web interface at <http://rt.cpan.org>.
Data::Table, LaTeX::Encode
Copyright (c) 2006-2010 "<limaone@cpan.org>"
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.
BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENSE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
2022-06-15 | perl v5.34.0 |