我需要为一份特殊的大学报告创建一些表格。提供的数据逐列指定值。
用户 Andrew Swann 指出,有一种方法可以逐列创建 TeX 表这对我来说是全新的,但对于我的特殊目的来说却有很大的好处。
不幸的是,我既不懂这些命令,也没有找到好的文档。我需要的是一个表格,除了第一个单元格和最后一行之外,每个单元格周围都有边框。下面是使用常规的句法。
您能告诉我如何通过按列构建来创建这样的表格吗?
\begin{tabular}{|l|l|l|}
\cline{2-3}
\multicolumn{1}{l|}{a} & b & c \\ \hline
d & e & f \\ \hline
g & h & i \\ \hline
\multicolumn{1}{l}{j} &
\multicolumn{1}{l}{k} &
\multicolumn{1}{l}{l} &
\end{tabular}
答案1
TeXbook 中记录了宏\halign
和。更准确地说,那里有详细的描述,并简要介绍了,说是类似的。\valign
\halign
\valign
该\valign
声明以序言开头,格式如下
pre-row-1 # post-row-1& pre-row-2 # post-row-2& .... & ... # post-row-n\cr
表格材料是针对给定列的,插入到 的位置,#
就像在宏中一样。一种简便方法是,&
在开头或紧接着另一个 之后添加一个额外的&
,意味着从该点到 的格式材料\cr
将重复用于所有后续行。因此,前言
&pre-row # post-row\cr
产生具有相同格式的任意数量的行。
在表格中,您可以按照通常的方式添加条目;行以 分隔&
,列以 结尾\cr
。可以通过 用其他材料替换完整的列格式规范\noalign{...}
;因此\noalign{\vrule}
会在整个表格中产生垂直规则。通过写入 来替换单个行,\omit<...>
其中<...>
是新材料。 的类似物\multicolumn
是\multispan
,因此\multispan3<...>
将分布<...>
在三行上。
以下是示例:
\documentclass{article}
\begin{document}
\valign{% Preamble
&\hrule\vskip 2pt plus 1fil\hbox{\strut\quad #\quad}\vfil\cr
% First rule empty row one, span across rows 2 and 3, empty in row 4
\omit&\multispan2\leaders\vrule\vfil&\omit\cr
% First column, first cell has non-standard format without rule
\omit \vskip 2.4pt plus 1fil\hbox{\strut\quad a\quad}\vfil&d&g&j\cr
% Second vertical rule, span rows 1 to 3, empty row 4
\multispan3\leaders\vrule\vfil&\omit\cr
% Second column, all cells are regular
b&e&h&k\cr
\multispan3\leaders\vrule\vfil&\omit\cr
c&f&i&l\cr
\multispan3\leaders\vrule\vfil&\omit\cr}
\end{document}
序言中说,每一行都以一条水平线开始,2pt
一个可以拉伸的垂直空间,后面跟着一个包含材料的水平框(\quad
每个尺寸都用空间填充,并保证最小高度和深度\strut
),后面是可拉伸的垂直空间。
\leaders\vrule\vfil
是应该\vrulefill
的,但该命令恰好没有被定义,这与\multispan
在适当的行上绘制垂直规则结合使用。
当我们使用\omit
来包含 框时a
,我们必须提供我们仍然需要的格式的相关部分。.4pt
上的额外部分\vskip
说明了 的厚度\hrule
。
整个表格的另一种方法是为规则提供单独的行,但这实际上使&
我们必须编写的 s 的数量增加了一倍。
答案2
stackengine
包构建垂直堆叠。我编辑了答案以确保它适用于\fboxsep
和的变化\fboxrule
。下面显示了两个示例。进一步的编辑允许单元格内容具有可变宽度。您可以调整五个参数,,,,,fboxrule
和。最后一个是添加到单元格宽度\fboxsep
的水平间隙。\mystrutheight
\mystrutdepth
\horzbuffer
已编辑以反映内部例程的名称变化。
\documentclass{article}
\usepackage{stackengine}
\usepackage{readarray}
% YOU CONTROL THE NEXT FIVE LINES
\fboxsep=3pt
\fboxrule=.25pt
\def\mystrutheight{.7\baselineskip}
\def\mystrutdepth{.1\baselineskip}
\def\horzbuffer{2ex}
%
\def\mybox{}
\newcounter{index}
\newlength\cellwidth
\newlength\colwidth
\newcommand\myLongstack[1]{%
\renewcommand\mybox[1]{##1}%
\getargsC{#1}%
\setlength\colwidth{0pt}%
\setcounter{index}{0}%
\whiledo{\value{index} < \narg}{%
\stepcounter{index}%
\setlength\cellwidth{\widthof{\csname arg\roman{index}\endcsname}}%
\ifthenelse{\cellwidth > \colwidth}{%
\setlength\colwidth{\the\cellwidth}}{}%
}%
\setlength\colwidth{\the\colwidth + \horzbuffer}%
\xdef\myboxwidth{\the\colwidth}%
\renewcommand\mybox[1]{\kern -\fboxrule\protect\framebox[\myboxwidth]{%
\protect\rule[-\mystrutdepth]{0ex}{\mystrutheight}\smash{##1}}}%
\Longstack{#1}%
}
\setstackgap{L}{\mystrutheight+2\fboxsep+\fboxrule}
\begin{document}
\myLongstack{a \mybox{d} \mybox{g} j}%
\myLongstack{\mybox{b} \mybox{e} \mybox{h} k}%
\myLongstack{\mybox{c} \mybox{f} \mybox{i} l}
%
\fboxsep=4pt
\fboxrule=1pt
\def\mystrutheight{.7\baselineskip}
\def\mystrutdepth{.15\baselineskip}
\myLongstack{a \mybox{d} \mybox{g} j}%
\myLongstack{\mybox{b} \mybox{eeeee} \mybox{h} k}%
\myLongstack{\mybox{c} \mybox{f} \mybox{i} l}
\end{document}