estou procurando uma solução para renderizar automaticamente listas de dados. No cenário atual, meus dados de entrada são uma lista de strings, que devem ser exibidas em uma lista de três colunas com números sequenciais:
+--------------+-------------+------------+
| 1 xyzxyz | 2 sadsdasd | 3 sadasdf |
| 4 dfasdfas | 3 23ea3ad | 4 898sd |
| ..... |
+-----------------------------------------+
Por enquanto, basta ter um número fixo de itens (no meu caso: 30), então acabei de definir 30 macros diferentes com os valores, que são referenciados pelo template, onde tudo é apenas codificado.
Claro, isso é bastante estático, então estou procurando uma solução melhor, onde a entrada tex apenas defina os dados assim:
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
...
Alguém tem uma boa ideia?
THX
Responder1
\documentclass{article}
\newcommand\putItem[1]{\refstepcounter{enumi}\makebox[.3\textwidth][l]{\theenumi. #1}\hfill\ignorespaces}
\begin{document}
\begin{flushleft}
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
\end{flushleft}
\end{document}
Responder2
Aqui está umpoucomelhoria em relação à solução de David Carlisle, pois uma lista simples separada por vírgulas pode ser especificada:
Notas:
- Use um contador personalizado caso permita o uso em outros ambientes enumerados.
- O contador é o descanso para cada invocação de
\ListTable
.
Código:
\documentclass{article}
\usepackage{pgffor}
\usepackage{xstring}
\newcounter{MyCounter}
\newcommand\putItem[1]{\refstepcounter{MyCounter}\makebox[.3\textwidth][l]{\theMyCounter. #1}\hfill\ignorespaces}
\begin{document}
\newcommand{\DefaultNumberOfColumns}{3}%
\newcommand{\ListTable}[2][\DefaultNumberOfColumns]{%
% #1 = optional number of columns, defaults to \DefaultNumberOfColumns
% #2 = common separated list
\setcounter{MyCounter}{0}%
\noindent
\edef\ListMembersExpanded{#2}%
\foreach \x in \ListMembersExpanded {%
\IfStrEq{\x}{}{}{% Need to eliminate any empty enteries (allows for trailing comma)
\putItem{\x}%
}%
}%
}%
\ListTable{%
xyzxyz,
sadsdasd,
dfasdfas,
23ea3ad,
898sd,
xyzxyz,
sadsdasd,
dfasdfas,
23ea3ad,
898sd,
}%
\end{document}
Responder3
Com base na minha resposta emComo colocar conteúdo de vários bancos de dados em uma tabela usando datatool?, eu inventei isso. Atualmente, este MWE lê os dados de um arquivo data.txt, contendo atualmente
dfkdsfs
sdf
dsfdsfgsdfg
ds4543
rg
ere
r
ewrf
sfs
edfds
swdf
sdfdsfdsfdsf
rtg
435
rtgre
t546
tgr
ret
4trswe
dfdf
fdfsdf
435435rsggf
dsfds
gff
vcvx
gfgfd
asdfdsf
rt
34
32e3
~
embora o arquivo externo possa ser dispensado se \readdef{data.txt}{\tmpa}
for substituído por
\def\tmpa{dfkdsfs sdf dsfdsfgsdfg ds4543 rg ere r ewrf sfs edfds swdf
sdfdsfdsfdsf rtg 435 rtgre t546 tgr ret 4trswe dfdf fdfsdf 435435rsggf
dsfds gff vcvx gfgfd asdfdsf rt 34 32e3 ~
}
O ~
da última linha é um preenchimento (voltarei a isso). Também estou assumindo que as entradas de dados não possuem espaços, o que deduzi da descrição do OP. A macro \readArrayij{\tmpa}{first}{3}
lê os dados em um array identificado como first
, com 3 colunas. Linhas parciais são descartadas e é por isso que adicionei um espaço em branco e uma nova linha no final dos dados, para que uma linha parcial não seja perdida.
A estrutura usa \tabtoks
a abordagem de Herbert (Como criar linhas tabulares programaticamente usando `\whiledo` ?) para adicionar os dados a uma tabela, 3 elementos por vez, neste caso, adicionando um identificador de índice ao front end.
\documentclass{article}
\usepackage{readarray}
\newcounter{index}
\newcounter{mycell}
% Based on:
% https://tex.stackexchange.com/questions/7590/
% how-to-programmatically-make-tabular-rows-using-whiledo
\makeatletter
\newcounter{tabindex}
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{%
\@tabtoks\expandafter{\the\@tabtoks\stepcounter{tabindex}#1}}
\newcommand*\resettabtoks{\@tabtoks{}}
\newcommand*\synctabindex[1]{\setcounter{tabindex}{\value{#1}}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\begin{document}
\readdef{data.txt}{\tmpa}
\readArrayij{\tmpa}{first}{3}
%
\resettabtoks
\setcounter{index}{0}
\setcounter{mycell}{0}
\synctabindex{index}
\whiledo{\value{index} < \numexpr\firstROWS\relax}{%
\addtabtoks{%
\stepcounter{mycell}
\themycell: \arrayij{first}{\thetabindex}{1} &
\stepcounter{mycell}
\themycell: \arrayij{first}{\thetabindex}{2} &
\stepcounter{mycell}
\themycell: \arrayij{first}{\thetabindex}{3}
\ifthenelse{\equal{\thetabindex}{\nrows}}{\\\hline}{\\\hline}%
}
\addtocounter{index}{1}%
}
\begin{tabular}{|l|l|l|}
\hline
\printtabtoks
\end{tabular}
\end{document}