我试图找到这个问题的答案,但目前我不知道如何让它发挥作用。
我想创建一个新命令,根据给定的列表以可变长度填充表格的某些行,例如
\makeTabularRows{item1, item2, item3}
输出应该是
\multicolumn{3}{c}{item1} & \\
\multicolumn{3}{c}{item2} & \\
\multicolumn{3}{c}{item3} &
这样它就可以适合表格
\begin{tabular}{lclr}
\makeTabularRows{item1, item2, item3}
\end{tabular}
我发现了很多部分解决方案,例如这个简短的解决方案
\newcommand{\makeTabularRows}[1]{%
\def\nextitem{\def\nextitem{.}}%
\@for \el:=#1\do{\nextitem\el}%
}
在元素之间插入点,其他解决方案看起来更复杂,例如创建枚举。我发现一个问题是包含 & 符号,而我的测试表明,即使插入 \\ 似乎也不可能。如果有表格解决方案,我找不到。
有什么想法可以做到这一点吗?
答案1
这是一个带有可扩展循环的方法。出于某种原因,大多数xinttools
设施都适用于该类型的输入 {item1}{item2}{item3}
;如果愿意,item1, item2, item3
则需要在命令中应用\xintCSVtoList
此处\makeRows
。
我\xintFor
在评论中提到过,但我没有仔细阅读这个问题(抱歉)...\multicolumn
是一个野兽,它真的想成为其单元格中的第一个(扩展后)。宏\xintFor
执行一些(非全局)分配,因此它不是此处合适的工具。
\documentclass{article}
\usepackage{xinttools}
\newcommand\makeOneRow [1]{\multicolumn{3}{c}{#1} & \\ }
\newcommand\makeRows [1]{%
\xintApplyUnbraced {\makeOneRow}{\xintCSVtoList{#1}}%
}%
\begin{document}
\begin{tabular}{lclr}
\makeRows{item1, item2, item3}
\end{tabular}
\end{document}
如果您想要\multicolumn
第二个单元格,它就会起作用:
\xintFor #1 in {item1, item2, item3}\do
{& \multicolumn{3}{c}{#1}\\}
如果您将其放在 代表项目 csv 的\newcommand\makeTabularRows
位置#1
,则需要使用\xintFor ##1 in {#1} \do {...}
。