我正在尝试用自定义命令按顺序存储的内容来填充表格。
\documentclass{article}
\usepackage{xparse}
\usepackage{expl3}
\ExplSyntaxOn
\seq_new:N \my_sequence
\NewDocumentCommand{\addToMySequence}{mmm}{ \seq_gput_right:Nn \my_sequence {#1 & #2 & #3 \\ \hline} }
\NewDocumentCommand{\fillTable}{}{
\seq_map_inline:Nn \my_sequence
{
##1
}
}
\ExplSyntaxOff
\addToMySequence{a}{b}{c}
\addToMySequence{d}{e}{f}
\addToMySequence{g}{h}{i}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\fillTable
\end{tabular}
\end{document}
代码基本上按预期工作,但在表格末尾产生了一个孤立单元格:
如果您注释掉迭代中的所有调用\addToMySequence
或##1
迭代内部的调用,也会发生这种情况。因此它必须来自该命令内部的某个地方。
有什么建议可以解决这个问题吗?
答案1
问题在于,由 启动的循环只有在发出\seq_map_inline:Nn
最后一个后才意识到序列已结束,因此启动了新的单元。您可以利用来代替。\hline
\seq_use
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_hurzelchen_cells_seq
\tl_new:N \l_hurzelchen_table_tl
\NewDocumentCommand{\addToMySequence}{mmm}
{
\seq_gput_right:Nn \g_hurzelchen_cells_seq {#1 & #2 & #3 \\ \hline}
}
\NewDocumentCommand{\fillTable}{}
{
\tl_clear:N \l_hurzelchen_table_tl
\seq_map_inline:Nn \g_hurzelchen_cells_seq
{
\tl_put_right:Nn \l_hurzelchen_table_tl { ##1 }
}
\tl_use:N \l_hurzelchen_table_tl
}
\ExplSyntaxOff
\addToMySequence{a}{b}{c}
\addToMySequence{d}{e}{f}
\addToMySequence{g}{h}{i}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\fillTable
\end{tabular}
\end{document}
g
请注意,每个变量名都应以(全局用法)、l
(局部用法)或(全局常量)为前缀,c
并以变量类型结尾。
另一种方法非常方便,如果我们必须对序列执行更多操作而不仅仅是传递它,那么可以在标记列表中构建整个表并传递这个表:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_hurzelchen_cells_seq
\NewDocumentCommand{\addToMySequence}{mmm}
{
\seq_gput_right:Nn \g_hurzelchen_cells_seq {#1 & #2 & #3 \\ \hline}
}
\NewDocumentCommand{\fillTable}{}
{
\seq_use:Nn \g_hurzelchen_cells_seq { }
}
\ExplSyntaxOff
\addToMySequence{a}{b}{c}
\addToMySequence{d}{e}{f}
\addToMySequence{g}{h}{i}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\fillTable
\end{tabular}
\end{document}
这完全执行了第一个单元格中的循环,因此孤立单元格的问题就消失了。