这个问题扩展了解决方案使用 \multido (或类似方法)生成表中的行。根据链接问题的解决方案,我了解如何使用循环\foreach
来为表格表格构建行。我的问题是如何在每行之间添加一条水平线(边框)?在静态表格中我会添加,\hline
但在使用循环时这似乎不起作用\foreach
。
编辑1---
下面的 MWE。
\documentclass{article}
\usepackage{pgffor}
\makeatletter
\newcommand{\Buildtable}{%
\def\tableData{}% empty table
\foreach \n in {1,...,5}{%
\protected@xdef\tableData{\tableData \n & A\n & B\n & C\n \\} % < adding \hline here causes error
}
\begin{tabular}{|l|l|l|l|}
\hline
\textbf{Num} & \textbf{Col A} & \textbf{Col B} & \textbf{Col C} \\ \hline
\tableData \hline
\end{tabular}
}
\makeatother
\begin{document}
\Buildtable
\end{document}
其结果是
我希望在 Excel 中实现与“所有边框”相同的效果(如下所示)。
\hline
在指定行上的括号内但在之后添加\\
会导致错误
Missing control sequence inserted.
<inserted text>
\inaccessible
l.19 \Buildtable
我不明白为什么添加这个会导致错误。
答案1
问题是\hline
无法在多\protected@xdef
条指令中存活。您可以在循环中将\let
其,执行 时它将具有其标准含义。\relax
\Buildtable
\documentclass{article}
\usepackage{pgffor}
\makeatletter
\newcommand{\Buildtable}{%
\def\tableData{}% empty table
\foreach \n in {1,...,5}{%
\let\hline\relax
\protected@xdef\tableData{\tableData \n & A\n & B\n & C\n \\ \hline}
}
\begin{tabular}{|l|l|l|l|}
\hline
\textbf{Num} & \textbf{Col A} & \textbf{Col B} & \textbf{Col C} \\ \hline
\tableData
\end{tabular}
}
\makeatother
\begin{document}
\Buildtable
\end{document}
这是一个通过给出列数和行数来生成此类表格的通用命令。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\Buildtable}{mm}
{% #1 = number of columns, #2 = number of rows
\doomedjupiter_buildtable:nn { #1 } { #2 }
}
\tl_new:N \l__doomedjupiter_buildtable_body_tl
\cs_new_protected:Nn \doomedjupiter_buildtable:nn
{
% header
\tl_set:Nn \l__doomedjupiter_buildtable_body_tl { \hline \textbf{Num} }
\int_step_inline:nn { #1 }
{
\tl_put_right:Nn \l__doomedjupiter_buildtable_body_tl
{
& \textbf{Col ~ \int_to_Alph:n { ##1 }}
}
}
\tl_put_right:Nn \l__doomedjupiter_buildtable_body_tl { \\ \hline }
% make rows
\int_step_inline:nn { #2 }
{
\tl_put_right:Nn \l__doomedjupiter_buildtable_body_tl { ##1 }
\int_step_inline:nn { #1 }
{
\tl_put_right:Nn \l__doomedjupiter_buildtable_body_tl { & \int_to_Alph:n { ####1 } ##1 }
}
\tl_put_right:Nn \l__doomedjupiter_buildtable_body_tl { \\ \hline }
}
% make the table
\begin{tabular}{|l|*{#1}{l|}}
\tl_use:N \l__doomedjupiter_buildtable_body_tl
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\Buildtable{3}{5}
\bigskip
\Buildtable{6}{4}
\end{document}