在 longtable 的中间更改 \endhead

在 longtable 的中间更改 \endhead

我在文档中创建了许多长表,其中一个表代表特定主题的结果。长表的标题通常由主题名称、N 和一些 cmidrules 组成。如果表格在某个点必须中断,新的标题会将主题名称更改为主题(续)。

现在有时一个主题有两个子问题。如果表格在第二个问题后中断,我想更改结尾以包含第二个问题。这是一个简短的 MWE:

\documentclass[a4paper]{scrartcl} 
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[latin1]{inputenc}
\usepackage{booktabs}
\usepackage{longtable}

\begin{document}
\begin{longtable}{lc}
\toprule
Question 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endfirsthead
\toprule
Question 1 (cont.) 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endhead
\bottomrule\endfoot
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6 \\
& \\

Question 2   & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\ \newpage
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6 \\
\end{longtable}
\end{document}

现在,如果表格损坏,它会写入问题 1(续),但我希望它是问题 2(续)。有没有办法用 longtable 实现这个目标,或者是否可以构建一个新命令,例如

\newendhead{
Question 2 (cont.)  & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
}

我可以将其插入到表格的某个位置吗?

答案1

您可以使用两个长表,但安排它们共享相同的列宽:

\documentclass[a4paper]{scrartcl} 
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[latin1]{inputenc}
\usepackage{booktabs}
\usepackage{longtable}

\begin{document}

\begingroup
\makeatletter
\ifx\LT@ii\@undefined\else
\def\LT@entry#1#2{\noexpand\LT@entry{-#1}{#2}}
\xdef\LT@i{\LT@ii}
\fi
\endgroup
\begin{longtable}{lc}
\toprule
Question 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endfirsthead
\toprule
Question 1 (cont.) 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endhead
\bottomrule\endfoot
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6
\end{longtable}

\begin{longtable}{lc}
\toprule
Question 2 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endfirsthead
\toprule
Question 2 (cont.) 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endhead
\bottomrule\endfoot
\cmidrule(r){1-1}
\cmidrule(l){2-2}
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\ \newpage
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10000widdddeeer col& 6 \\
\end{longtable}
\end{document}

如果需要两个以上,则除了最后一个之外,每个前面都需要有奇怪的代码,使得在每种情况下都\LT@<thistable>定义为\LT@<the last>表>

答案2

注意力: 由于我没有进行大量测试,因此这并不意味着该代码可以在实际文档中使用。但我很好奇是否可以在表格中间交换长表头,这就是结果。

longtable 的头部存储在一个框 ( \LT@head) 中,当 longtable 块输出到页面顶部时,将添加此框。框存储在命令中\endhead。表中可以有多个框,\endhead只要它们都在 longtable 的开头即可。最后一个将获胜。也可以LT@head在表中间交换。主要问题是在正确的时机执行此操作,以免过早使用,小的 LTchunksize 在这里很有用。

对于高度不同的盒子来说,这样做可能不是一个好主意。

\documentclass[a4paper]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage{booktabs}
\usepackage{longtable}

\begin{document}
\newbox\LTheadsave
\makeatletter
\newcommand\saveLThead{\noalign{\global\setbox\LTheadsave\copy\LT@head}}
\newcommand\restoreLThead{\noalign{\global\setbox\LT@head\copy\LTheadsave}}
\makeatother

\setcounter{LTchunksize}{2}
\begin{longtable}{lc}
\toprule
Question 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endfirsthead
\toprule
Question 2 (cont.) 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endhead\saveLThead
\toprule
Question 1 (cont.) 1 & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
\endhead

\bottomrule\endfoot
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6 \\
& \\\newpage
Item 1 & 4 \\
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\
Item 5 & 20 \\
Item 6 & 3 \\
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6 \\
&\\

Question 2   & N \\
\cmidrule(r){1-1}
\cmidrule(l){2-2}
Item 1 & 4 \\\restoreLThead
Item 2 & 10 \\
Item 3 & 2 \\
Item 4 & 8 \\
Item 5 & 20 \\
Item 6 & 3 \\\newpage
Item 7 & 6 \\
Item 8 & 1 \\
Item 9 & 11 \\
Item 10 & 6 \\
\end{longtable}


\end{document}

在此处输入图片描述

相关内容