将 longtable 拆分为偶数页和奇数页(2)

将 longtable 拆分为偶数页和奇数页(2)

我是第一次使用 LaTeX,正在尝试排版我的论文。我的问题是,有些表格太大,无法放在一页纸上;长度(行数多)和宽度(列数多)都太大。

longtable 包为长表格提供了一个很好的解决方案,但我还没有找到令人满意的宽表格解决方案。我认为最好的解决方案是让这些表格跨越两个相对的页面,前几列在左页,后续列在右页。

最近,tex.stackexchange 上有人问了一个问题,与我的问题类似(尽管只处理两列):如何将长表格分割为偶数页/奇数页?。David Carlisle 也发布了一个答案代码与 longtable 配合使用;将表格分成两个相对的页面。

然而,实施该代码暴露了两个问题:

  1. David 的代码要求\pagebreak在 之前有一个 。这似乎会干扰通过 longtable ( , )\end{longtable}指定的重复页脚。具体来说,也在表格末尾重复,而不是。\endfoot\endlastfoot\endfoot\endlastfoot

  2. 周围的文本没有自然地围绕表格浮动:前面的文本只打印在左边/偶数页上,后面的文本被放置在新的页面上(可能是由于\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}

相关内容