IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    LaTeX使用笔记:长表格longtable(附实例)

    SparkandShine发表于 2017-02-03 17:35:43
    love 0

    本文记录我在插入长表格遇到的一些问题及解决方法,包括重复表头、表尾(纵向显示),调整表格适应页面宽度(横向显示)。

    1. 一个简单实例

    最简单的longtable使用跟table一样,下面给出一个简单的实例。

    \documentclass[twoside,12pt]{article}
    \usepackage{longtable}
    
    \begin{document}
    
    % An illustration of longtable
    \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
        \caption{caption}
        \label{table:label}  \\ % add \\ command to tell LaTeX to start a new line
        \hline
        line1   &   line2   &   $t_1$   &   $t_{12}$    &   $t_2$       &   $r$(\%)&    $D$(GB)&    $D_{nc}(GB)$&$G_t$(\%)&Station\\    
        \hline
        % data begins here
        10      &   2       &   0:22:00 &   9:46:00 &   2:00:00 &   80.49   &   159.18  &   302.25  &   89.88   &   Cours Dillon    \\
        204     &   205     &   2:01:00 &   2:57:00 &   1:11:00 &   47.97   &   95.21   &   138.43  &   45.38   &   Ayguevives Collège  \\
        % more data here
        \hline
    \end{longtable}
    
    \end{document}
    

    这里提醒一点,如果把表标题\caption{}或者标签\label{}放在前面,要在其后添加换行\\,否则会报“! Misplaced \noalign.”错误。

    如果是表头单元的宽度与其他行不一致,多编译几次就行了,这是因为longtable为了节省内存和避免溢出采取分块处理表格带来的副作用,详情见TeX – LaTeX Stack Exchange: Bad width of head of longtable。

    2. 重复表头、表尾

    长表格有时会跨越很多页,为了便于阅读,在每一页重复表头或者表尾,这涉及到4个命令,如下:

    • \endhead, specify rows (比如表头) to appear at the top of every page (under the headline, but before the other lines of the table)
    • \endfoot, specify rows (比如水平线\hline) to appear at the bottom of each page.
    • \endfirsthead,只作用于表格的第一页。
    • \endlastfoot,只作用于表格的第一页。

    值得注意的是,这些命令需要放在表格开始处(at the start of the table)。以下是一个实例,每一页头部重复表头,每一页尾部重复水平线(\hline)。

    \documentclass[twoside,12pt]{article}
    \usepackage{longtable}
    
    \begin{document}
    
    \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
        \caption{caption}
        \label{table:label}  \\ % add \\ command to tell LaTeX to start a new line
    
        % Appear table header at the first page as well
        \hline
        line1   &   line2   &   $t_1$       &   $t_{12}$    &   $t_2$       &   $r$(\%)&    $D$(GB)&    $D_{nc}(GB)$&$G_t$(\%)&Station\\    
        \hline
        \endfirsthead
    
        % Appear the table header at the top of every page
        \hline
        line1   &   line2   &   $t_1$       &   $t_{12}$    &   $t_2$       &   $r$(\%)&    $D$(GB)&    $D_{nc}(GB)$&$G_t$(\%)&Station\\    
        \hline
        \endhead 
    
        % Appear \hline at the bottom of every page
        \hline
        \endfoot 
    
        % data begins here
        10  &   2       &   0:22:00 &   9:46:00 &   2:00:00 &   80.49   &   159.18  &   302.25  &   89.88   &   Cours Dillon    \\
        204 &   205 &   2:01:00 &   2:57:00 &   1:11:00 &   47.97   &   95.21   &   138.43  &   45.38   &   Ayguevives Collège  \\
        % more data here
        \hline
    \end{longtable}
    
    \end{document}
    

    3. 适应页面宽度

    上面的方法解决了表格纵向显示问题。对于横向,如果一行有太多数据,默认情况下表格会截断超出的部分。解决方法无非是改变字体大小,缩小列间的间距,调整表格边缘,多行显示,纵向显示。

    3.1 改变字体大小

    在表格开始前声明字体大小,比如\small或者\tiny,为了不影响表格后面的字体大小,用{}括起来,如下:

    \begin{document}
    
    % Temporarily change the font size
    {
    \small
    \tiny
    
    \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
        ...
    \end{longtable}
    
    } % End of changing the font size
    
    \end{document}
    

    或者用\begin{footnotesize}...\end{footnotesize}括起来,

    \begin{document}
    
    \begin{footnotesize}
        \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
        ...
        \end{longtable}
    \end{footnotesize}
    
    \end{document}
    

    3.2 缩小列间的间距

    默认情况下,表格单元左侧和右侧会有填充(padding),被定义为\tabcolsep,默认值为6pt。使用命令\setlength{\tabcolsep}{6pt}调整列间的间距。

    \begin{document}
    
    % Change the intercolumn space
    \setlength{\tabcolsep}{2pt}
    
    \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
    ...
    \end{longtable}
    
    \end{document}
    

    3.3 调整表格边缘

    减少表格的边缘(margins),这样就可以放入更多的内容。

    \begin{document}
    
    % Adjust margins
    \setlength\LTleft{-1in}
    \setlength\LTright{-1in plus 1 fill}
    
    \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
    ...
    \end{longtable}
    
    \end{document}
    

    3.4 多行显示

    使用longtabu(tabularx + longtable)将长文本在单元格多行显示。

    \documentclass[twoside,12pt]{article}
    \usepackage{longtable}
    \usepackage{tabu}
    
    \begin{document}
    
    % Use longtabu
    \begin{longtabu} to \textwidth {|X|X|X|X|X|X|X|X|X|X|}
    ...
    \end{longtabu}
    
    \end{document}
    

    3.5 纵向显示

    使用\begin{landscape}...\end{landscape}将表格纵向显示。

    \documentclass[twoside,12pt]{article}
    \usepackage{longtable}
    \usepackage{lscape}     % for landscape
    
    \begin{document}
    
    \begin{landscape}
        \begin{longtable}{|c|c|r|r|r|r|r|r|r|l|}
        ...
        \end{longtable}
    \end{landscape}
    
    \end{document}
    

    以上这些方法,有时候需要组合使用。

    有了这些,应该能调成自己满意的格式:-) 完整的例子,我已分享到我的GitHub,在这里的longtable.tex。

    References:
    [1] The longtable package – CTeX.pdf
    [2] TeX – LaTeX Stack Exchange: longtable: hline doesn’t display on the first page
    [3] TeX – LaTeX Stack Exchange: How to set width of longtable



沪ICP备19023445号-2号
友情链接