将 \textheight 精确地分成 n 行的正确表达式是什么?

将 \textheight 精确地分成 n 行的正确表达式是什么?

我想创建一个表确切地占据整个打印区域,没有剩余空间。表格每页有 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设置)。因此外部的贡献\topskip0pt

重复的\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}

两种情况下的结果:

结果

相关内容