我是第一次使用 LaTeX,正在尝试排版我的论文。我的问题是,有些表格太大,无法放在一页纸上;长度(行数多)和宽度(列数多)都太大。
longtable 包为长表格提供了一个很好的解决方案,但我还没有找到令人满意的宽表格解决方案。我认为最好的解决方案是让这些表格跨越两个相对的页面,前几列在左页,后续列在右页。
最近,tex.stackexchange 上有人问了一个问题,与我的问题类似(尽管只处理两列):如何将长表格分割为偶数页/奇数页?。David Carlisle 也发布了一个答案代码与 longtable 配合使用;将表格分成两个相对的页面。
然而,实施该代码暴露了两个问题:
David 的代码要求
\pagebreak
在 之前有一个 。这似乎会干扰通过 longtable ( , )\end{longtable}
指定的重复页脚。具体来说,也在表格末尾重复,而不是。\endfoot
\endlastfoot
\endfoot
\endlastfoot
周围的文本没有自然地围绕表格浮动:前面的文本只打印在左边/偶数页上,后面的文本被放置在新的页面上(可能是由于
\pagebreak
上面提到的原因),导致表格下方留下大量空白。
我的问题是,是否有人知道这些问题是否可以解决,以及如何解决?
在此先感谢您的帮助!
以下为 David 代码的编辑版本,说明了存在的问题:
\documentclass{book}
\usepackage{array,longtable,color}
\usepackage{booktabs}
\usepackage{lipsum}
\usepackage[justification=justified,singlelinecheck=false]{caption}
\makeatletter
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\zzz\vbox{\moveleft10in\vbox{\unvcopy\@cclv\copy\LT@foot}\vss}%
\setbox\@cclv\vbox{\vbox{\unvbox\@cclv\copy\LT@foot}\vss}%
\@makecol
\@outputpage
\setbox\@cclv\box\zzz
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
% \vbox
% {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\setbox\zzz\vbox{\moveleft10in\vbox{\unvcopy\@cclv\copy\LT@foot}\vss}%
\setbox\@cclv\vbox{\vbox{\unvbox\@cclv\copy\LT@foot}\vss}%
\@makecol
\@outputpage
\setbox\@cclv\box\zzz
\@makecol
\@outputpage
\global\vsize\@colroom
\copy\LT@head\nobreak
\fi}
\newbox\zzz
\def\a{%
one&&red\\
two&&green\\
three&&yellow\\
four&&brown\\
}
\def\b{%
111&&this\\
2&&that\\
333&&the other\\
44&&something\\}
\begin{document}
\pagenumbering{arabic}
\lipsum
\begin{longtable}{cp{10in}c}
\caption{Test table} \\
% This is the first header
\toprule
LEFT&&RIGHT\\
\midrule
\endfirsthead
% This is for subsequent headers
\multicolumn{3}{l}{{\tablename\ \thetable{}, continued}} \\
\toprule
LEFT&&RIGHT\\
\midrule
\endhead
% This is the first footer
\midrule
\multicolumn{3}{r}{{Continued on next page}} \\
\endfoot
% This is the last footer
\bottomrule
\multicolumn{3}{l}{{This is the footer}} \\
\endlastfoot
%These are the data
first&&row\\
\a\uppercase{\a}\b
\a\uppercase{\a}\b\b
last&&row\\
\pagebreak % you need this %BUT: it interferes with the \endfoot and \endlastfoot
\caption{end caption}
\end{longtable}
\lipsum
\end{document}
PS 感谢 Jubobs 将我的疑问重定向为新问题发布。
答案1
最后的强制分页符或多或少是必要的,否则很难知道如何处理表格后面的文本(在表格末尾你需要完成二页面,您肯定不希望在两个页面上都出现以下文本,因此完全不允许它是最简单的。可能可以\endlastfoot
再次工作,但不是今天。
让文本越过周围文本的通常方法longtable
是将\afterpage
其插入到下一个分页符处,如下面的代码所示。
\begin{filecontents}{\jobname.lt1}
\begin{longtable}{cp{10in}c}
\caption{Test table} \\
% This is the first header
\toprule
LEFT&&RIGHT\\
\midrule
\endfirsthead
% This is for subsequent headers
\multicolumn{3}{l}{{\tablename\ \thetable{}, continued}} \\
\toprule
LEFT&&RIGHT\\
\midrule
\endhead
% This is the first footer
\midrule
\multicolumn{3}{r}{{foot}}
\endfoot
% This is the last footer% sorry not today
%\bottomrule
%\multicolumn{3}{l}{{This is the footer}} \\
%\endlastfoot
%These are the data
first&&row\\
\a\uppercase{\a}\b
\a\uppercase{\a}\b\b
last&&row\\
\pagebreak % you need this %BUT: it interferes with the \endfoot and \endlastfoot
\caption{end caption}
\end{longtable}
\end{filecontents}
\documentclass{book}
\usepackage{array,longtable,color}
\usepackage{booktabs}
\usepackage{lipsum}
\usepackage{afterpage}
\usepackage[justification=justified,singlelinecheck=false]{caption}
\makeatletter
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
\LT@err{floats and marginpars not allowed in a longtable}\@ehc
\else
\setbox\z@\vbox{\unvbox\@cclv}%
\ifdim \ht\LT@lastfoot>\ht\LT@foot
\dimen@\pagegoal
\advance\dimen@-\ht\LT@lastfoot
\ifdim\dimen@<\ht\z@
\setbox\zzz\vbox{\moveleft10in\vbox{\unvcopy\@cclv\copy\LT@foot}\vss}%
\setbox\@cclv\vbox{\vbox{\unvbox\@cclv\copy\LT@foot}\vss}%
\@makecol
\@outputpage
\setbox\@cclv\box\zzz
\@makecol
\@outputpage
\setbox\z@\vbox{\box\LT@head}%
\fi
\fi
\global\@colroom\@colht
\global\vsize\@colht
% \vbox
% {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
\fi
\else
\setbox\zzz\vbox{\moveleft10in\vbox{\unvcopy\@cclv\copy\LT@foot}\vss}%
\setbox\@cclv\vbox{\vbox{\unvbox\@cclv\copy\LT@foot}\vss}%
\@makecol
\@outputpage
\setbox\@cclv\box\zzz
\@makecol
\@outputpage
\global\vsize\@colroom
\copy\LT@head\nobreak
\fi}
\newbox\zzz
\def\a{%
one&&red\\
two&&green\\
three&&yellow\\
four&&brown\\
}
\def\b{%
111&&this\\
2&&that\\
333&&the other\\
44&&something\\}
\title{zzz}
\begin{document}
\maketitle
\clearpage
\pagenumbering{arabic}
\lipsum
\afterpage{\clearpage
\ifodd\value{page}\afterpage{\input{\jobname.lt1}\clearpage}%
\else\input{\jobname.lt1}\clearpage
\fi}
\lipsum
\lipsum
\end{document}