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