PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Itemization innerhalb einer Datatool-Tabelle



Tim77
08-10-2015, 22:26
Hallo,

ich habe eine csv-datei, aus der ich dynamisch eine Tabelle erstellen möchte. Soweit mit Datatool kein Problem. In einigen Zellen sind nun aber keine Einzelwerte, sondern Listen. Aus diesen Listen möchte ich Itemizations machen, siehe: 6169.

Die csv-datei kann ich gestalten wie ich möchte. Aktuell habe ich dort Aufzählungen durch "," getrennt. Ich könnte auch problemlos ein anderes Format wählen, z.B. eckige Klammern: "[Kiwis,Bananen]". Ich stelle mir vor, dass beim \DTLforeach aus solchen Werten dann dynamisch eine itemization erstellt wird. Eine Funktion, die beliebig lange itemizations erzeugt, habe ich bereits im Dokument.

Hier ist ein MWE (zunächst für Kisten.csv, dann für das mwe.tex):

Kiste; Inhalt
1; Birnen
2; Kiwis, Bananen
3; Mangos

\documentclass[a4paper]{article}

\usepackage[ngerman]{babel}
\usepackage{datatool}

\DTLsetseparator{;}
\DTLloaddb[]{kisten}{Kisten.csv}

% Dynamische Listen
\usepackage{xparse}
\newcommand\insertitem[1]{\item #1}
\NewDocumentCommand\liste{>{\SplitList{,}}m}{
\begin{itemize}
\ProcessList{#1}{ \insertitem }
\end{itemize}
}

\begin{document}

\section{So soll es aussehen}
\begin{tabular}{cp{4cm}}
\hline\bfseries{Kiste} & \bfseries{Inhalt}\tabularnewline\hline
1 & Birnen\tabularnewline\hline
2 & \liste{Kiwis,Bananen}\tabularnewline\hline
3 & Mangos\tabularnewline\hline
\end{tabular}


\section{So sieht es mit Datatool aus}
\begin{tabular}{cp{4cm}}
\hline\bfseries{Kiste} & \bfseries{Inhalt}\tabularnewline\hline
\DTLforeach*{kisten}{\kiste=Kiste,\inhalt=Inhalt}{
\kiste & \inhalt\tabularnewline\hline}
\end{tabular}


\end{document}
Über jede Hilfe oder Tipps, die mich in die richtige Richtung lenken, wäre ich Euch sehr dankbar!

rais
11-10-2015, 11:12
Die csv-datei kann ich gestalten wie ich möchte. Aktuell habe ich dort Aufzählungen durch "," getrennt. Ich könnte auch problemlos ein anderes Format wählen, z.B. eckige Klammern: "[Kiwis,Bananen]".

warum schreibst Du dann nicht gleich "\liste{Kiwis,Bananen}" in Deine Kisten.csv?

Eine Möglichkeit, das sonst hinterher wieder aufzudröseln:


\begin{filecontents*}{Kisten.csv}
Kiste; Inhalt
1; Birnen
2; Kiwis, Bananen
3; Mangos
\end{filecontents*}

\documentclass[a4paper]{article}

\usepackage[ngerman]{babel}
\usepackage{datatool}

\DTLsetseparator{;}
\DTLloaddb[]{kisten}{Kisten.csv}

% Dynamische Listen
\makeatletter
\newcommand\listnolist[1]{%
\IfCharInString{,}{#1}{% vgl. `texdoc substr'; das Paket wurde bereits von datatool geladen
\begin{itemize}
\@for\i:=#1\do{\item \i}
\end{itemize}
}{% wenn kein Komma im Argument ist, nur das Argument ausgeben:
#1%
}%
}
\makeatother
\begin{document}

\section{So sieht es nun mit Datatool aus}
\begin{tabular}{cp{4cm}}
\hline\bfseries{Kiste} & \bfseries{Inhalt}\tabularnewline\hline
\DTLforeach*{kisten}{\kiste=Kiste,\inhalt=Inhalt}{
\kiste & \listnolist{\inhalt}\tabularnewline\hline}
\end{tabular}

\end{document}

VG

Tim77
12-10-2015, 15:00
Danke, das hilft mir sehr weiter!

warum schreibst Du dann nicht gleich "\liste{Kiwis,Bananen}" in Deine Kisten.csv?
Wollte ich ursprünglich nicht, da ich die CSV-Daten möglichst nicht mit LaTeX-Code mischen wollte. Allerdings ist mein ursprünglicher Vorschlag ("," oder "[,,,]") natürlich auch eine Art von semantischer Auszeichnung, die so nicht der reinen Datenbank-Lehre entspricht.

Ich plane nun dieses Dilemma zu umgehen, indem ich die CSV-Dateien nicht als eigentliche Schicht der Datenhaltung verwende, sondern stattdessen eine SQLite-DB. Darin sind nun alle Entitäten und deren Beziehungen sauber getrennt, also z.B.:


Tabelle Obst:
ObstID; Bezeichnung
o1; Birnen
o2; Kiwis
o3; Bananen
o4; Mangos

Tabelle Kisten:
KistenID; Bezeichnung
k1; Gelbe Kiste
k2; Grüne Kiste
k3; Blaue Kiste

Tabelle Kisten_Obst:
KistenID; ObstID
k1; o1
k2; o2
k2; o3
k3; o4

Der nächste Verarbeitungsschritt würde dann sein, die CSV-Dateien per Makefile (http://www.mrunix.de/forums/showthread.php?76942-Makefile-erstellen) vor dem eigentlichen LaTeX-Lauf aus der SQLite-DB zu generieren. Hierbei denke ich z.Zt. an Python als Verarbeitungssprache. Bei dieser Variante hätte ich keine Probleme damit, LaTeX-Code in die CSV-Zellen zu injizieren. Die Generierung der LaTeX-Tabellen aus den so vorbereiteten CSV-Dateien wäre nun um einiges einfacher. Mal schauen, ob das alles wie geplant klappt.

Meinen ersten Anlauf hatte ich mit LuaTeX gestartet, diesen aber mittlerweile abgebrochen. Zum einen scheint mir die Einbindung der Lua-Module auf den unterschiedlichen Plattformen nicht trivial zu sein und zum anderen erscheint es mir sauberer, die Datenbank-Operationen komplett aus LaTeX/LuaTeX herauszuhalten.

klops
12-10-2015, 16:53
→ https://www.ctan.org/pkg/sqltex
Habe ich zwar noch nie verwendet, scheint aber in die Richtung zu gehen, die Du umsetzen möchtest.