多对列

多对列

考虑这个示例代码,它创建一个 2x6 表,其中 6 列由三个名称/值对组成:

\documentclass{article}
\usepackage[svgnames,table]{xcolor}
\usepackage{tabu}
\usepackage{booktabs}

\begin{document}

\begin{center}
\taburowcolors[1]{ForestGreen!40..ForestGreen!40}
\begin{tabu}{p{1cm}|X|p{1cm}|X|p{1cm}|X}
\tabucline-
name1 & value1 & name3 & value3 & name5 & value6 \\
name2 & value2 & name4 & value4 & name6 & value6 \\
\tabucline-
\end{tabu}
\end{center}

\end{document}

看起来像这样:

截屏

它可以工作,但我们必须明确地布置 2 行 3 对列。有没有办法像这样指定它:

name1 & value1 
name2 & value2
name3 & value3
name4 & value4 
name5 & value5
name6 & value6

然后只需告诉它将其包装成三对(或我们希望指定的任何数字)的列对?

编辑:

谢谢,ArTourterless。这是我的尝试,还有一个问题,关于如何完成它,以便它看起来像禁忌包方法。

首先,我们尝试使用 multicols 和 itemenum 包。接下来,我们使用 tabu 包完成了艰难的任务。multicols/itemenum 方法似乎仍然缺少的关键内容是水平蓝线。有人知道如何获取这些吗?

\documentclass{article}
\usepackage{multicol}
\usepackage{enumitem}
\usepackage{tabu}
\usepackage[table]{xcolor}

\begin{document}

Using multicols/enumitem:

\begin{center}
\setlength{\columnseprule}{.4pt}
\renewcommand\columnseprulecolor{\color{blue}}
\begin{multicols}{2}
\begin{description}[font=\bfseries, leftmargin=2cm, style=nextline]
\item[Name1] Value1.
\item[Name2] Value2.
\item[Name3]  Value3.
\end{description}
\end{multicols}
\end{center}

Using tabu (manually doing the layout ourself):

\begin{center}\small
\tabulinesep=1.5mm
\begin{tabu} {>{\bfseries}p{1cm}X |[blue] >{\bfseries}p{1cm}X }
\everyrow{\tabucline[blue]-}
Name1 & Value1. & Name3 & Value3. \\
Name2 & Value2. & & \\
\tabucline[blue]-
\end{tabu}
\end{center}

\end{document}

看起来像这样:

截屏

编辑 2:已经想出了编辑 1 中方法的另一种变体。我们可以为每一行创建一个单独的禁忌表,然后将其放入多列中。如果列数不能均匀地划分数据的长度,那么分界线将与单禁忌方法不同,但其他方面看起来非常相似。虽然每行都有额外的条目,但这确实意味着我们可以摆脱特定于布局的代码,因此它更加灵活。

\documentclass{article}
\usepackage{multicol}
\usepackage{enumitem}
\usepackage{tabu}
\usepackage[table]{xcolor}

\begin{document}

\begin{center}\small
\setlength{\columnseprule}{.4pt}
\renewcommand\columnseprulecolor{\color{blue}}
\begin{multicols}{2}

\begin{tabu} {>{\bfseries}p{1cm}X}
Name1 & Value1. \\
\tabucline[blue]-
\end{tabu}

\begin{tabu} {>{\bfseries}p{1cm}X}
Name2 & Value2. \\
\tabucline[blue]-
\end{tabu}

\begin{tabu} {>{\bfseries}p{1cm}X}
Name3 & Value3. \\
\tabucline[blue]-
\end{tabu}

\end{multicols}
\end{center}

\end{document}

看起来像这样:

截屏

编辑3:

添加了屏幕截图。

答案1

也许有点过头了,但我喜欢用它TikZ来解决这种布局问题。接下来是一个具有易于使用界面的“解决方案”。查看代码的最后一部分,它提供了使用示例。您可以\NewColumn在序列中的任何位置插入\Row(尝试取消注释最后一个\NewColumn

请注意,each\Row实际上是tabular宏中使用的\RowContent。您可以在那里自定义列类型或宽度。使用tikz可以为蓝线、行背景等提供无限的可能性。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\thispagestyle{empty}
\usetikzlibrary{positioning}

\def\RowWidth{4cm}

\def\RowContent#1{\begin{tabular}{ll}
#1\\
\end{tabular}}

\def\Row#1{
\node[text width=\RowWidth,
      below=0mm of previous row, 
      name=previous row] {\RowContent{#1}};
\draw[blue] (previous row.south west) -- (previous row.south east);
}

\def\NewColumn{
\path (previous column) +(\RowWidth,0) coordinate[name = previous column] {};
\coordinate[right=of previous column] (previous column) {};
\coordinate (previous row) at (previous column) {};
}

\def\Start{
\coordinate (previous column) at (0,0) {};
\coordinate (previous row) at (0,0) {};
}

\begin{tikzpicture}
\Start  % This Start is mandatory, it defines the nodes to which the rest is positioned
\Row{ Name1 & Value 1}
\Row{ Name2 &  Value 2}
\Row{ Name3 &  Value 3}

\NewColumn
\Row{ Name4 & Value 4}
\Row{ Name5 &  Value 5}

% \NewColumn
\Row{ Name6 & Value 6}
\Row{ Name7 &  Value 7}
\end{tikzpicture}

\end{document}

上述代码的结果是:

输出

答案2

ArTourterless 评论说,解决方案是将列表放在多列环境中,我一直在追求这个想法的实现。我遇到的主要问题是想在连续的项目之间放一条蓝线。这很容易用禁忌来实现,但似乎不太适合列表。在阅读禁忌包文档时,我遇到了\savetabu\usetabu。它们保存并重用禁忌表的列宽和其他设置。这似乎是一个完美的应用,因为我们可以将每一行设为一个单独的禁忌表,其列宽与其他行相同:

\documentclass{article}
\usepackage{multicol}
\usepackage{enumitem}
\usepackage{tabu}
\usepackage[table]{xcolor}

\begin{document}

\begin{center}\small
\setlength{\columnseprule}{.4pt}
\renewcommand\columnseprulecolor{\color{blue}}
\begin{multicols}{2}

\begin{tabu} {>{\bfseries}lX}\savetabu{mytabu}
Name1 & Value1. \\
\tabucline[blue]-\end{tabu}

\begin{tabu} {\usetabu{mytabu}}
Name2 & Value2. \\
\tabucline[blue]-\end{tabu}

\begin{tabu} {\usetabu{mytabu}}
Name3 & Value3. \\
\tabucline[blue]-\end{tabu}

\end{multicols}
\end{center}

\end{document}

输出如下所示:

截屏

相关内容