Estoy buscando una solución para representar automáticamente listas de datos. En el escenario actual, mis datos de entrada son una lista de cadenas, que deberían mostrarse en una lista de tres columnas con números secuenciales:
+--------------+-------------+------------+
| 1 xyzxyz | 2 sadsdasd | 3 sadasdf |
| 4 dfasdfas | 3 23ea3ad | 4 898sd |
| ..... |
+-----------------------------------------+
Por ahora, es suficiente tener un número fijo de elementos (en mi caso: 30), así que simplemente definí 30 macros diferentes con los valores, a los que luego hace referencia la plantilla, donde todo está codificado.
Por supuesto, eso es bastante estático, así que estoy buscando una solución mejor, donde la entrada tex simplemente defina los datos de esa manera:
\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
...
¿Alguien tiene una buena idea?
Gracias
Respuesta1
\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}
Respuesta2
Aquí hay unlevemejora con respecto a la solución de David Carlisle en el sentido de que se puede especificar una lista simple separada por comas:
Notas:
- Utilice un contador personalizado en caso de que permita su uso en otros entornos enumerados.
- El contador es el resto para cada invocación 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}
Respuesta3
Basado en mi respuesta en¿Cómo poner contenido de múltiples bases de datos en una tabla usando datatool?, Se me ocurrió esto. Actualmente, este MWE lee los datos de un archivo data.txt, que actualmente contiene
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
~
aunque se puede prescindir del archivo externo si se \readdef{data.txt}{\tmpa}
reemplaza 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 ~
}
El ~
de la última fila es un relleno (volveré sobre eso). También supongo que las entradas de datos no tienen espacios, lo que deduje de la descripción del OP. La macro \readArrayij{\tmpa}{first}{3}
lee los datos en una matriz identificada como first
, con 3 columnas. Las filas parciales se descartan, por eso agregué un espacio en blanco y una nueva línea al final de los datos, para que no se pierda una fila parcial.
La estructura utiliza la de Herbert.\tabtoks
el enfoque de Herbert (¿Cómo crear filas tabulares mediante programación usando `\ whiledo`?) para agregar los datos a una tabla, 3 elementos a la vez, en este caso, agregando un identificador de índice al frente.
\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}