我想创建一个表确切地占据整个打印区域,没有剩余空间。表格每页有 5 行,如下所示。
\documentclass[table]{article}
\usepackage[a4paper,margin=1cm,showframe]{geometry}
\usepackage{longtable,array,xcolor}
\newcounter{counter}
\pagestyle{empty}
\newcolumntype\specifier{|%
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\makeatletter
\arrayrulecolor{red}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} \textcolor{red}{#2}}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\let\oldendlongtable\endlongtable
\def\endlongtable{%
\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi
\oldendlongtable}
\begin{document}
\begin{longtable}{\specifier}\hline
\row[RAM]{Random Access Memory}
\row[BIOS]{Basic Input Output System}
\row[OMG]{Oh My Ghost}
\row[PS]{Post Script}
\row[BJT]{Bipolar Junction Transistor}
\row[DEK]{Donut E. Knot}
\row[B]{Batman}
\row[MS]{Microsoft}
\row[CPP]{C Plus Plus}
\end{longtable}
\end{document}
问题与疑问
输出结果表格上方有一个不需要的空白。这可能是由于我的表达错误造成的
0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax
简单来说,该怎么解决?正确的表达方式是什么?
答案1
\topskip
包两次应用了设置算法longtable
。其输出例程从当前垂直列表中获取材料,包括\topskip
在一个框中,并将其重新插入到现在为空的垂直列表中,从而\topskip
再次触发设置。通常在后一种情况下不会插入任何内容,因为重新插入的框的高度通常是\topskip
(由于前一种\topskip
设置)。因此外部的贡献\topskip
是0pt
。
重复的\topskip
设置使得反制措施变得复杂。
变体a)
\begin{document}
\null % = \hbox{}, triggers full \topskip
\vskip-\topskip % remove \topskip
\vskip-\LTpre %
% \LTpre would be dropped at the start of a fresh page, but
% there is already material (empty box)
\begin{longtable}{...}...\end{longtable}
并且计算无需\topskip
:
0.2\dimexpr\textheight-6\arrayrulewidth\relax
此外,表格应该足够大,以弥补负空间。否则外部\tabskip
可能会变得有效。
变体b)
这将暂时将的值设置\topskip
为零(\topskip
在计算中无关紧要):
\begin{document}
\begingroup
\setlength{\topskip}{0pt}
\begin{longtable}{...}...\end{longtable}
\endgroup
\end{document}
两种情况下的结果: