我目前正在制作一张可以打印和做笔记的表格。我的主要问题是,我想让表格的最后一行占据所有可用空间。不知何故,列“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
可能有点复杂。它使用 Ti钾Z 来测量一行的高度,这相对容易,因为包中添加了 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}