根据计数器创建表格

根据计数器创建表格

我想创建一个包含i+2多个列的表格,其中i包含一个计数器。该表格应具有以下布局:

-------------------------------
| 1 | 2 | ... | i | foo | bar |
-------------------------------

这意味着,第一行应该有一个1作为内容,第二行应该有一个 2 等等,直到i最后两行应该foo分别有bar一个作为内容。

我尝试使用 LaTeX3 while 循环,但这当然不能按预期工作:

\int_new:N \l_loop_ctr_int
\int_zero:N \l_loop_ctr_int
\begin{tabular}{
  \int_while_do:nn {\l_loop_ctr_int < \arabic{i}}{l \int_incr:N \l_loop_ctr_int}
  ll
}
\int_zero:N \l_loop_ctr_int
\int_while_do:nn {\l_loop_ctr_int < \arabic{i}}{\int_incr:N \l_loop_ctr_int &}
foo & bar \\
\end{tabular}

有谁可以给​​我提示吗?

答案1

在我看来,\int_....循环不能正确扩展\begin{tabular}{....},但之前生成列说明符并将它们存储在标记列表中是可行的。

\documentclass{article}

\usepackage{xparse}

\newcounter{ictr}
\setcounter{ictr}{10}
\begin{document}

\ExplSyntaxOn


\int_new:N \ictr_int 
\int_set:Nn \ictr_int {\value{ictr}}
\int_step_inline:nnnn {1}{1}{\ictr_int}{%
  \tl_put_right:Nn \l_tmpa_tl {l}
}
\begin{tabular}{\tl_use:N \l_tmpa_tl ll}
  \int_step_inline:nnnn {1}{1}{\ictr_int}{#1 &}
  foo & bar \\
\end{tabular}

    \par
\setcounter{ictr}{20}
\int_set:Nn \ictr_int {\value{ictr}}
\int_step_inline:nnnn {1}{1}{\ictr_int}{%
  \tl_put_right:Nn \l_tmpa_tl {l}
}
\begin{tabular}{\tl_use:N \l_tmpa_tl ll}
  \int_step_inline:nnnn {1}{1}{\ictr_int}{#1 &}
  foo & bar \\
\end{tabular}
\ExplSyntaxOff

\end{document}

在此处输入图片描述

使用宏更新:

\documentclass{article}

\usepackage{xparse}

\newcounter{ictr}
\setcounter{ictr}{10}

\ExplSyntaxOn
\int_new:N \ictr_int 
\newcommand{\testfoobar}[1]{%
  \tl_clear:N \l_tmpa_tl
  \int_set:Nn \ictr_int {#1}
  \int_step_inline:nnnn {1}{1}{\ictr_int+2}{%  Use 2 more columns
    \tl_put_right:Nn \l_tmpa_tl {l}
  }
\begin{tabular}{\l_tmpa_tl}
  \int_step_inline:nnnn {1}{1}{\ictr_int}{##1 &}
  foo & bar \\
\end{tabular}
}
\ExplSyntaxOff

\usepackage{pgffor}

\begin{document}
\testfoobar{\value{ictr}}

\foreach \x in {1,...,20} {%
\testfoobar{\x}

}


\end{document}

在此处输入图片描述

答案2

\int_while_do:nn不能从一个表格单元格开始而在另一个表格单元格结束。

不过,您可以使用\prg_replicate:nn它来一次性提供所有内容。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\maiertable}{mmm}
 {% #1 = number of columns (minus 2), #2 and #3 = last two cells
  \begin{tabular}{|*{\int_eval:n { #1 + 2 }}{c|}}
  \hline
  \int_zero:N \g_tmpa_int
  \prg_replicate:nn { #1 } { \int_gincr:N \g_tmpa_int \int_to_arabic:n { \g_tmpa_int } & }
  #2 & #3 \\
  \hline
  \end{tabular}
 }
\ExplSyntaxOff

\begin{document}

\maiertable{3}{foo}{bar}

\medskip

\maiertable{10}{foo}{bar}

\end{document}

在此处输入图片描述

答案3

仅供比较,以下是使用 LuaTeX 执行此操作的方法。下面的代码是在 ConTeXt 中编写的,但 LaTeX 代码应该同样简单易懂。

\startluacode
  thirddata = thirddata or {}

  function thirddata.fancytable(n, s1, s2) 
    context.bTABLE()
    context.bTR()
    for i = 1, n do
      context.bTD() context(i) context.eTD()
    end
    context.bTD() context(s1) context.eTD()
    context.bTD() context(s2) context.eTD()
    context.eTABLE()
  end
\stopluacode

\define[3]\FancyTable{\ctxlua{thirddata.fancytable(#1,"#2", "#3")}}

\starttext
\FancyTable{5}{foo}{bar}
\stoptext

在此处输入图片描述

相关内容