在使用 \foreach 生成的表格行中包含 \hrule

在使用 \foreach 生成的表格行中包含 \hrule

这个问题扩展了解决方案使用 \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}

在此处输入图片描述

相关内容