几周前我开始学习 LaTeX3,目前正在研究表格。这是我的代码:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Npn \juhu_tablerow:n #1
{
\int_new:N \l_row_count_int
\int_set:Nn \l_row_count_int { 1 }
\prg_replicate:nn {#1}
{
\int_use:N \l_row_count_int .~row \\
\int_incr:N \l_row_count_int
}
}
\cs_new_eq:NN \tablerow \juhu_tablerow:n
\ExplSyntaxOff
\begin{document}
\begin{tabular}{c}
\tablerow{3}
\end{tabular}
\end{document}
该代码的输出是:
1. row
1. row
1. row
期望的输出应该是这样的:
1. row
2. row
3. row
当我tabular
用环境替换center
环境时,我得到了预期的输出。
现在,如果我用 替换in \\
,即使在环境内部似乎也能再次工作,输出为:\int_use:N \l_row_count_int .~row \\
,~
\int_incr:N
tabular
1. row, 2. row, 3. row,
所以,我的问题是,为什么在使用多行时增加整数在环境中不起作用tabular
,我该怎么做才能获得所需的结果?
答案1
从我的拙见到答案。:)
您已经非常接近找到解决方案了!问题的关键在于范围:这些任务是在本地进行的;让我们将它们变成全球性的。
在继续之前,我们必须将整数声明移到命令定义之外,否则在后续调用时会引发错误\tablerow
。现在,一个小的编码约定,从
\int_new:N \l_row_count_int
到
\int_new:N \g_row_count_int
因为我们的计数器已经是全局的了。:)
现在,有几个替换项(感谢 egreg 的建议xparse
!):
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \g_row_count_int
\cs_new_protected:Npn \juhu_tablerow:n #1
{
\int_gset:Nn \g_row_count_int { 1 }
\prg_replicate:nn {#1}
{
\int_use:N \g_row_count_int .~row \\
\int_gincr:N \g_row_count_int
}
}
\NewDocumentCommand{ \tablerow }{ m }{
\juhu_tablerow:n{#1}
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{c}
\tablerow{3}
\end{tabular}
\end{document}
一切都会正常进行。:)
您还可以使用\g_tmpa_int
临时整数进行全局分配,从而节省几块钱。:)