automatische Listen-/Tabellendarstellung

automatische Listen-/Tabellendarstellung

ich suche nach einer Lösung zum automatischen Rendern von Datenlisten. Im aktuellen Szenario sind meine Eingabedaten eine Liste von Zeichenfolgen, die in einer dreispaltigen Liste mit fortlaufenden Nummern angezeigt werden sollen:

+--------------+-------------+------------+
| 1  xyzxyz    | 2  sadsdasd | 3  sadasdf |
| 4  dfasdfas  | 3  23ea3ad  | 4  898sd   |
|                   .....                 |
+-----------------------------------------+

Für den Moment reicht eine feste Anzahl von Elementen (in meinem Fall: 30) aus, daher habe ich einfach 30 verschiedene Makros mit den Werten definiert, auf die dann von der Vorlage verwiesen wird, in der alles einfach fest codiert ist.

Das ist natürlich ziemlich statisch, daher suche ich nach einer besseren Lösung, bei der die Tex-Eingabe die Daten einfach so definiert:

\putItem{xyzxyz}
\putItem{sadsdasd}
\putItem{dfasdfas}
\putItem{23ea3ad}
\putItem{898sd}
...

Hat jemand eine gute Idee?

Danke

Antwort1

\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}

Antwort2

Hier ist einleichtVerbesserung gegenüber der Lösung von David Carlisle, da eine einfache, durch Kommas getrennte Liste angegeben werden kann:

Bildbeschreibung hier eingeben

Anmerkungen:

  • Verwenden Sie ggf. einen benutzerdefinierten Zähler, der die Verwendung in anderen aufgezählten Umgebungen zulässt.
  • Der Zähler ist Rest für jeden Aufruf von \ListTable.

Code:

\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}

Antwort3

Basierend auf meiner Antwort unterWie kann ich mit Datatool Inhalte aus mehreren Datenbanken in einer Tabelle zusammenfassen?, habe ich mir Folgendes ausgedacht. Derzeit liest dieser MWE die Daten aus einer Datei data.txt, die derzeit enthält

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
~

Auf die externe Datei kann jedoch verzichtet werden, wenn sie \readdef{data.txt}{\tmpa}durch

\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 ~
}

Das ~in der letzten Zeile ist ein Füllzeichen (darauf komme ich noch zurück). Ich gehe auch davon aus, dass die Dateneinträge keine Leerzeichen enthalten, was ich aus der Beschreibung des OP gefolgert habe. Das Makro \readArrayij{\tmpa}{first}{3}liest die Daten in ein Array firstmit der Bezeichnung , das 3 Spalten hat. Teilzeilen werden verworfen, und deshalb habe ich am Ende der Daten ein Leerzeichen und eine neue Zeile hinzugefügt, damit keine Teilzeile verloren geht.

Die Struktur verwendet Herberts\tabtoks Ansatz (Wie erstelle ich programmgesteuert tabellarische Zeilen mit „\whiledo“?), um die Daten einer Tabelle hinzuzufügen, jeweils 3 Elemente auf einmal. In diesem Fall wird dem Front-End eine Indexkennung hinzugefügt.

\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}

Bildbeschreibung hier eingeben

verwandte Informationen