我想创建一个包含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