表格行填满整个页面

表格行填满整个页面

我目前正在制作一张可以打印和做笔记的表格。我的主要问题是,我想让表格的最后一行占据所有可用空间。不知何故,列“X”适用于表格的宽度,但适用于行和高度。有什么聪明的方法可以解决这个问题吗?

我当前的解决方案是仅“猜测”可用空间并使用\vspace*{}来扩展行。

我的解决方案的另一个问题是第一列的垂直对齐。如您所见,注释被推高了一点。有没有办法保留文本的垂直位置,甚至更好地垂直对齐文本?

\documentclass[]{article}
\usepackage{tabularx}
\begin{document}

\begin{tabularx}{\textwidth}{|p{2.7cm}|X|p{0.5cm}|p{0.5cm}|p{0.5cm}|p{0.5cm}|}
\hline
Col 1 & Col 2 & a & b & c & d \\
\hline
Chapter 1 & Some Text & 1 & 2 & 3 & 4\\
\hline
Notes \vspace*{1cm} & \multicolumn{5}{c|}{}\\
\hline
\end{tabularx}
\end{document} 

在此处输入图片描述

答案1

使用的解决方案nicematrix可能有点复杂。它使用 TiZ 来测量一行的高度,这相对容易,因为包中添加了 Ti单元格的 Z 坐标。这样,您可以计算第一行的高度并将其减去,\textheight最终创建一个\vcellfill宏:

\documentclass{article}
\usepackage{nicematrix, tikz}

% ===== code copied from Zarko
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}
% =====

\newlength{\lastrowheight}
\newcommand{\getrowheight}[1]{%
    \tikz {
        \pgfmathparse{int(#1+1)} 
        \path (#1-|1);
        \pgfgetlastxy{\ax}{\ay}
        \path (\pgfmathresult-|1);
        \pgfgetlastxy{\bx}{\by}
        \pgfmathsetlength{\global\lastrowheight}{abs(\by-\ay)}
    }%
}

\newlength{\rowsheight}
\newcommand{\addtorowsheight}[1]{%
    \getrowheight{#1}\global\addtolength{\rowsheight}{\lastrowheight}%
}

% ===== idea copied from John Kormylo
\newcommand{\vcellfill}{%
    \rule[\dimexpr\arraystretch\ht\strutbox-\textheight+\rowsheight\relax]%
        {0pt}{\dimexpr\textheight-\rowsheight\relax}%
}
% =====

\begin{document}

\noindent
\begin{NiceTabular}{ p{2.7cm} X p{0.5cm} p{0.5cm} p{0.5cm} p{0.5cm} }[hvlines]
\CodeBefore
    % we want the height of the first two rows
    \addtorowsheight{1}\addtorowsheight{2}
\Body
Col 1 & Col 2 & a & b & c & d  \\
Chapter 1 & Some Text \newline more text & 1 & 2 & 3 & 4 \\
Notes & \multicolumn{5}{c|}{\vcellfill} \\
\end{NiceTabular}

\end{document} 

在此处输入图片描述

答案2

您可以与 tcolorbox 结合使用并绘制一些带覆盖的线条(这里是虚线):

\documentclass[addpoints,12pt,a4paper,dvipsnames]{exam}
\usepackage{setspace}
\usepackage{lipsum}
\usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2.5cm, headsep=1cm]{geometry}
\usepackage[most]{tcolorbox}
\newtcolorbox{mynotes}
 {height fill=true,
  enhanced,colback=white,
  size=tight,
  sharp corners,
  overlay={\draw[dotted]([xshift=2.7cm+2\tabcolsep]frame.north west)--([xshift=2.7cm+2\tabcolsep]frame.south west);}}


\usepackage{tabularx}
\begin{document}

\begin{mynotes}
\begin{tabularx}{\textwidth}{p{2.7cm}X|p{0.5cm}|p{0.5cm}|p{0.5cm}|p{0.5cm}}
Col 1 & Col 2 & a & b & c & d \\
\hline
Chapter 1 & Some Text & 1 & 2 & 3 & 4\\
\hline
Notes   \\

\end{tabularx}
\end{mynotes}

\end{document}

在此处输入图片描述

答案3

这使用一个保存框来测量没有注释的表格,然后使用支柱(\ruie{0pt}{...})代替\vspace

\documentclass[]{article}
\usepackage{tabularx}
\usepackage{showframe}

\newlength{\goodguess}

%\def\arraystretch{2}

\begin{document}

\par% \pagetotal refeshed between paragraphs, duplicate \par is ignored
\ifdim\pagegoal=\maxdimen
  \setlength{\goodguess}{\textheight}%
\else
  \setlength{\goodguess}{\dimexpr \pagegoal-\pagetotal}%
\fi
\sbox0{\begin{tabularx}{\textwidth}{|p{2.7cm}|X|p{0.5cm}|p{0.5cm}|p{0.5cm}|p{0.5cm}|}
\hline
Col 1 & Col 2 & a & b & c & d \\
\hline
Chapter 1 & Some Text & 1 & 2 & 3 & 4\\
\hline
\end{tabularx}}% measure height
\setlength{\goodguess}{\dimexpr \goodguess-\ht0-\dp0}%

\noindent
\begin{tabularx}{\textwidth}{|p{2.7cm}|X|p{0.5cm}|p{0.5cm}|p{0.5cm}|p{0.5cm}|}
\hline
Col 1 & Col 2 & a & b & c & d \\
\hline
Chapter 1 & Some Text & 1 & 2 & 3 & 4\\
\hline
Notes & \multicolumn{5}{c|}{\rule[\dimexpr \arraystretch\ht\strutbox-\goodguess]{0pt}{\goodguess}}\\
\hline
\end{tabularx}
\end{document} 

答案4

编辑:
编辑问题后,我猜您会想到以下几点:

在此处输入图片描述

(红线显示页面布局)

这就是你想要的吗(显然我没明白你的问题=?

对于上表,我使用tabularray包(而不是tabular),因为使用它来定义多列单元格及其高度更简单:

\documentclass{article} 
\usepackage{geometry}
%---------------- show page layout. don't use in a real document!
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}
%---------------------------------------------------------------%
\usepackage{tabularray}

\begin{document}
\setlength\parindent{0pt}

\bigskip
\begin{tblr}{hlines, vlines,
             colspec = {Q[l, wd=27mm] X[l] *{4}{Q[l, wd=5mm]}},
             row{Z}  = {\dimexpr\textheight-3\baselineskip}, % determine row height
             hspan=minimal
             }
Col 1       & Col 2     & a & b & c & d     \\
Chapter 1   & Some Text & 1 & 2 & 3 & 4     \\
Notes       & \SetCell[c=5]{j}  \lipsum[66]   % multicolumn cell, adjusted content over all spanned columns, \lipsum is just to demonstrate how it works
                        &   &   &   &       \\
\end{tblr}

\end{document} 

相关内容