
我試圖找到這個問題的答案,但目前我不知道如何讓它發揮作用。
我想創建一個新命令,它根據給定的可變長度列表填充表格的一些行,例如
\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 {...}
.