我想生成一个多列表格,该列表格包含在文档的列内,并跨页面拆分。这里有几个类似的问题
但它们似乎都未能真正解决问题。
标准:
表格/列表将通过循环生成,行数任意。它应该分页。它应该可以在多列环境中使用。
最接近的解决方案似乎是使用列表而不是表格,但当列表被包装在多列环境中时,这存在对齐顶行的问题。以下是示例文档:
\documentclass[12pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{xcolor,array}
\usepackage{multicol}
\usepackage{ifthen,enumitem}
\def\stnum{30} % number of items
\newcolumntype{C}{>{\centering}p{.5in}}
\setlist{nolistsep}
\pagestyle{empty}
\begin{document}
\enlargethispage{3\baselineskip}
\begin{multicols*}{2}
\begin{enumerate}[label={\bfseries\arabic*.\qquad},leftmargin=1.3in]
\item[Item \#]
\whiledo{\value{enumi}<\stnum}{
\item \begin{tabular}{CC}T & F\end{tabular}
\item[]{\color{black!20}\rule{1.5in}{3ex}}
}
\end{enumerate}
\end{multicols*}
\end{document}
主要问题是如何正确排列行(就好像这是一个表格一样)。次要问题是当列换行时,会出现相当于重复的列标题。
以下是上述文档输出的部分图片:
答案1
可以通过重新定义为第一列和第二列来欺骗supertabular
在环境中工作。我还需要在第一列的底部粘贴高度 0、宽度规则。没有它,就会发生奇怪的事情。multicols
\newpage
\columnbreak
\newpage
\linewidth
\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{xcolor,supertabular,multicol}
\newcount\n
\n=0
\def\tablebody{}
\makeatletter
\loop\ifnum\n<300
\advance\n by1
\protected@edef\tablebody{\tablebody
\textbf{\number\n.}&
\hfill T\hfill\hfill F\hfill\hskip0pt\endgraf
\vskip.5\baselineskip
\color@begingroup
\color{black!20}
\hrule height3ex
\color@endgroup
\tabularnewline
}
\repeat
\makeatother
\pagestyle{empty}
\begin{document}
\begin{multicols*}{2}
\let\mcnewpage=\newpage
\makeatletter
\renewcommand\newpage{%
\if@firstcolumn
\hrule width\linewidth height0pt
\columnbreak
\else
\mcnewpage
\fi
}
\makeatother
\tablehead{Item \#&\\}
\begin{supertabular}{lp{1.5in}}
\tablebody
\end{supertabular}
\end{multicols*}
\end{document}
我实际上并不确定这是生成身体的最佳方式,但它确实有效。
答案2
以下是针对您的主要问题(正确排列行)的一个非常粗略的解决方案:使用环境tabbing
。如果我没记错的话,没有简单的方法可以将制表符“单元格”的内容居中,但tabbing
允许在环境内进行列/分页。诀窍是使用\\*
以禁止在某些行之后进行分页。
\documentclass[12pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{multicol,xcolor}
\usepackage{ifthen}
\def\stnum{30} % number of items
\newcounter{mytabbing}
\begin{document}
\begin{multicols*}{2}
\setcounter{mytabbing}{0}
\begin{tabbing}
\rule{0.7in}{1pt} \= \rule{0.7in}{1pt} \= \rule{0.7in}{1pt} \kill
\whiledo{\value{mytabbing}<\stnum}{%
\stepcounter{mytabbing}%
\themytabbing \> T \> F \\* % "\\" would produce an incorrect column break
\> {\color{black!20}\rule{1.4in}{2.8ex}} \\
}
\end{tabbing}
\end{multicols*}
\end{document}