逐列创建具有特殊边框格式的表格

逐列创建具有特殊边框格式的表格

我需要为一份特殊的大学报告创建一些表格。提供的数据逐列指定值。

用户 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}

在此处输入图片描述

相关内容