为什么 *[\fill] 在 longtable 的 \endlastfoot 中不起作用?

为什么 *[\fill] 在 longtable 的 \endlastfoot 中不起作用?

根据通过将最后一个元素放入 ,可以将至少一个元素放在 和 之间,\endhead从而\endlastfoot自动分页\endlastfoot。但如果我还想将实际的 endlastfoot 放在页面底部, 就*[\fill]无法像在最后一个元素和 endlastfoot 之间那样工作。

\documentclass[10pt, a4paper]{article}
\usepackage{longtable}
\pagestyle{empty}

\begin{document}
\vspace*{17.4cm}

\begin{longtable}{@{}lc@{}}
Date &       Grade
\endhead
%
2016-01-15 & C\\ *[\fill]
\bfseries Summary:
\endlastfoot
%
2016-01-01 & A\\
2016-01-15 & B\\
2016-01-01 & A\\
2016-01-15 & B\\
2016-01-01 & A\\

\end{longtable}
\end{document}

答案1

有趣的是,我甚至无法使用\rule最后一个脚来添加额外的空间。所以我把它分成两个表格。

\documentclass[10pt, a4paper]{article}
\usepackage{longtable}
\pagestyle{empty}
\usepackage{showframe}

\begin{document}
\vspace*{17.4cm}

\begin{longtable}{@{}lc@{}}
Date &       Grade
\endhead
2016-01-15 & C \\
\phantom{\bfseries Summary:}
\endlastfoot
2016-01-01 & A\\
2016-01-15 & B\\
2016-01-01 & A\\
2016-01-15 & B\\
2016-01-01 & A\\
\end{longtable}
\vfill
\noindent\hfil
\begin{tabular}[b]{@{}lc@{}}
\phantom{2016-01-15} & \phantom{Grade}\\
\bfseries Summary:
\end{tabular}
\end{document}

可以从辅助文件中获取所有列宽,而不必使用\phantom。请参阅这里。通过使用两个 longtable,可以共享宽度。缺点是,要缩小宽度,必须删除旧的辅助文件。

\documentclass[10pt, a4paper]{article}
\usepackage{longtable}
\pagestyle{empty}
\usepackage{showframe}

\newlength{\LTwidth}
\newcommand{\LTwidthA}{0pt}
\newcommand{\LTwidthB}{0pt}

\makeatletter
\newcommand*{\getLTwidth}[1][0]% #1 = offet (optional): 0 = previous, 1 = next
{\bgroup% for \count1 and \LT@entry
  \count1=#1\relax
  \advance\count1 by \value{LT@tables}%
  \@ifundefined{LT@\@roman{\count1}}{\LTwidth=\textwidth}{%
    \dimen0=0pt%
    \count2=0
    \def\LT@entry##1##2{\advance\dimen0 by ##2\relax
      \advance\count2 by 1
      \expandafter\xdef\csname LTwidth\@Alph{\count2}\endcsname{##2}}
    \csname LT@\@roman{\count1}\endcsname
  }%
  \global\LTwidth=\dimen0
\egroup}
\makeatother

\newcommand{\maxcell}[3]% #1 = width, #2 = l/r/c, #3 = text
{\bgroup
  \dimen0=#1\relax
  \sbox0{#3}%
  \ifdim\wd0>\dimen0
    \usebox0
  \else
    \makebox[\dimen0][#2]{\usebox0}%
  \fi
\egroup}

\begin{document}
\vspace*{17.8cm}
\getLTwidth[2]% get widths from second table
\begin{longtable}{@{}lc@{}}
Date &       Grade
\endhead
2016-01-15 & C
\endlastfoot
\maxcell{\dimexpr \LTwidthA-\tabcolsep}{l}{2016-01-01} &
\maxcell{\dimexpr \LTwidthB-\tabcolsep}{c}{A} \\% any row will do
2016-01-15 & B\\
2016-01-01 & A\\
2016-01-15 & B\\
2016-01-01 & A\\
\end{longtable}
\getLTwidth% get widths from previous table
\vfill
\noindent\hfil
\begin{longtable}{@{}lc@{}}
  %\rule{\LTwidthA}{1pt}\hspace{-\tabcolsep} & \hspace{-\tabcolsep}\rule[1pt]{\LTwidthB}{1pt} \\
  \maxcell{\dimexpr \LTwidthA-\tabcolsep}{l}{\bfseries Summary:} &
  \maxcell{\dimexpr \LTwidthB-\tabcolsep}{c}{ }
\end{longtable}\unskip% remove gap at bottom
\end{document}

答案2

此处的语法longtable与以下语法相匹配tabular(实际上它只是使用底层表格实现)\\[...](通常)添加具有指定深度的支柱(零宽度规则),以强制行具有更大的深度。规则尺寸始终是固定长度,如果提供可拉伸长度,则将采用自然长度,此处为 0pt。在某些情况下,\\[...]添加垂直跳跃而不是规则,在这种情况下,拉伸空间可能会起作用,但脚longtable是一个插入的框,因此始终具有固定长度,

相关内容