
Tentei encontrar uma resposta para isso, mas atualmente não tenho ideia de como fazê-lo funcionar.
Quero criar um novo comando que preencha algumas linhas de uma tabela com base em uma determinada lista com comprimento variável como
\makeTabularRows{item1, item2, item3}
A saída disso deve ser
\multicolumn{3}{c}{item1} & \\
\multicolumn{3}{c}{item2} & \\
\multicolumn{3}{c}{item3} &
Para que caiba em uma tabela como
\begin{tabular}{lclr}
\makeTabularRows{item1, item2, item3}
\end{tabular}
Encontrei muitas soluções parciais, por exemplo, esta curta
\newcommand{\makeTabularRows}[1]{%
\def\nextitem{\def\nextitem{.}}%
\@for \el:=#1\do{\nextitem\el}%
}
para inserir pontos entre os elementos e outras soluções que pareçam mais complexas, por exemplo, para criar uma enumeração. Descobri que um problema é incluir o sinal & e meus testes me mostraram que mesmo inserir o \\ parece não ser possível. Estou perdido para encontrar uma solução para o tabular, se houver.
Alguma idéia de como isso pode ser feito?
Responder1
Aqui está uma abordagem com um loop expansível. Por alguma razão, a maioria das xinttools
instalações são para insumos do {item1}{item2}{item3}
tipo ; se preferir, item1, item2, item3
é necessário aplicar \xintCSVtoList
como aqui no \makeRows
comando.
Mencionei \xintFor
em um comentário mas não tinha lido com atenção a pergunta (desculpe) ... \multicolumn
é uma fera que realmente quer ser o primeiro em sua cela (após a expansão). A macro \xintFor
faz algumas atribuições (não globais), portanto não é a ferramenta apropriada aqui.
\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}
Se você quisesse \multicolumn
na segunda célula, teria funcionado:
\xintFor #1 in {item1, item2, item3}\do
{& \multicolumn{3}{c}{#1}\\}
e se você colocar isso em um \newcommand\makeTabularRows
local onde #1
representará o csv dos itens, você precisará usar \xintFor ##1 in {#1} \do {...}
.