
Ich habe keine klaren und/oder funktionierenden Beispiele gefunden, wie man ein Kontrollkästchen in eine mit generierte Tabelle einfügt csvsimple
.
Wie kann ich beispielsweise in diesem MWE den Code ändern, um die Kontrollkästchenzeichenfolgen durch echte anklickbare Zeichenfolgen zu ersetzen?
\documentclass{article}
\usepackage{csvsimple}
\begin{filecontents*}{grade.csv}
cola,colb,colc,cold,cole
Maier,Hans,0,m,checkbox
Huber,Anna,1,f,checkbox
Weisbaeck,Werner,3,m,checkbox
\end{filecontents*}
\begin{document}
\begin{tabular}{l|c}%
\bfseries ColA & \bfseries ColE% specify table head
\csvreader[head to column names]{grade.csv}{}% use head of csv as column names
{\\\hline\cola\ \colb & \cole}% specify your columns here
\end{tabular}
\end{document}
Vielen Dank, Jasper. Ich bin sehr an all Ihren Lösungen interessiert. Natürlich habe ich speziell nach etwas wie der zweiten gesucht, bei der Kontrollkästchennamen automatisch mithilfe eines Zählers generiert werden!
Wenn es für Sie möglich ist (und ich missbrauchen darf!), würde ich noch eine Frage stellen: Wie können Sie Ihre zweite Lösung anpassen, wenn wir eine lange Tabelle haben, wie beispielsweise im folgenden MWE:
\documentclass[draft]{article}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{csvsimple}
\begin{document}
\begin{filecontents*}{test.csv}
a,b,c
1,2,3
4,5,6
\end{filecontents*}
\csvloop{
file=test.csv,
respect all,
separator=comma,
no head,
before reading={
\begin{longtable}{lll}
\toprule
},
command={\csviffirstrow
{\textbf{\csvcoli} & \textbf{\csvcolii} & \textbf{\csvcoliii}}
{\csvcoli & \csvcolii & \csvcoliii}
},
late after line=\\,
late after first line=\\\midrule\endhead,
late after last line=\\\bottomrule,
after reading=\end{longtable}
}
\end{document}
Antwort1
Willkommen bei TeX.SX! Sie müssen wahrscheinlich etwas mehr über Ihren Anwendungsfall erzählen. Soweit ich Ihre Frage verstehe, versuchen Sie, eine Art interaktives PDF-Formular zu erstellen. Sie können das Paket verwenden, hyperref
um ein solches Formular mit anklickbaren Kontrollkästchen zu erstellen.
Beachten Sie jedoch, dass es in einem interaktiven PDF-Formular sinnvoll ist, dass jedes Feld (auch eine Checkbox ist ein Feld) einen eindeutigen Namen hat. Andernfalls kann es je nach weiterer Verwendung des Formulars (beispielsweise beim Exportieren der Formulardaten) zu unerwarteten Ergebnissen kommen. Im folgenden Beispiel habe ich daher den Text checkbox
in Ihren CSV-Daten in usw. geändert checkbox1
, checkbox2
um eindeutige IDs zu generieren, die ich dann als Namen für die Checkboxen im Formular verwendet habe.
\documentclass{article}
\usepackage{csvsimple}
\usepackage{hyperref}
\begin{filecontents*}{grade.csv}
cola,colb,colc,cold,cole
Maier,Hans,0,m,checkbox1
Huber,Anna,1,f,checkbox2
Weisbaeck,Werner,3,m,checkbox3
\end{filecontents*}
\begin{document}
\begin{Form}
\begin{tabular}{l|c}%
\bfseries ColA & \bfseries ColE% specify table head
\csvreader[head to column names]{grade.csv}{}% use head of csv as column names
{\\\hline\cola\ \colb & \CheckBox[name=\cole]{}}% specify your columns here
\end{tabular}
\end{Form}
\end{document}
Man könnte die benötigten eindeutigen Checkbox-Namen auch automatisch generieren, indem man einen Zähler verwendet oder \thecsvrow
die aktuelle Zeilennummer zurückgibt, wie im folgenden Beispiel (da man in diesem Fall überhaupt keine CSV-Daten zu der Checkbox benötigt, habe ich die entsprechende Spalte gelöscht):
\documentclass{article}
\usepackage{csvsimple}
\usepackage{hyperref}
\begin{filecontents*}{grade.csv}
cola,colb,colc,cold
Maier,Hans,0,m
Huber,Anna,1,f
Weisbaeck,Werner,3,m
\end{filecontents*}
\begin{document}
\begin{Form}
\begin{tabular}{l|c}%
\bfseries ColA & \bfseries ColE% specify table head
\csvreader[head to column names]{grade.csv}{}% use head of csv as column names
{\\\hline\cola\ \colb & \CheckBox[name=checkbox\thecsvrow]{}}% specify your columns here
\end{tabular}
\end{Form}
\end{document}
Die Ausgabe ist die gleiche wie oben.
Bei näherem Überlegen sagen Sie, dass Sie die Zeichenfolge durch ein anklickbares Kontrollkästchen ersetzen möchten checkbox
. Vielleicht möchten Sie also nur ein Kontrollkästchen in den Zeilen, in denen die Zeichenfolge checkbox
in der Spalte der relevanten CSV-Daten erscheint cole
. (Danke an @Marijn für den Hinweis.)
Sie können sich das Makro zunutze machen, \ifcsvstrequal
um für jede Zeile zu prüfen, ob der Inhalt der Zelle vorhanden ist checkbox
und nur wenn ja, das Kontrollkästchen zu setzen:
\documentclass{article}
\usepackage{csvsimple}
\usepackage{hyperref}
\begin{filecontents*}{grade.csv}
cola,colb,colc,cold,cole
Maier,Hans,0,m,checkbox
Huber,Anna,1,f,
Weisbaeck,Werner,3,m,checkbox
\end{filecontents*}
\def\checkboxstring{checkbox}
\begin{document}
\begin{Form}
\begin{tabular}{l|c}%
\bfseries ColA & \bfseries ColE% specify table head
\csvreader[head to column names]{grade.csv}{}% use head of csv as column names
{\\\hline\cola\ \colb & \ifcsvstrequal{\cole}{checkbox}{\CheckBox[name=checkbox\thecsvrow]{}}{}}% specify your columns here
\end{tabular}
\end{Form}
\end{document}
Der obige Code würde kein Kontrollkästchen in der zweiten Zeile platzieren:
Sie haben später auch gefragt, wie die zweite der oben genannten Lösungen an ein Setup angepasst werden kann, bei dem \csvloop
zum Erstellen eines verwendet wird longtable
. Es ist wichtig, alle Felder im PDF zwischen \begin{Form}
und zu platzieren \end{Form}
, um die volle Funktionalität der Formularfelder sicherzustellen. Hier können wir diese zu den Optionen before reading
und hinzufügen after reading
:
\documentclass{article}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{csvsimple}
\usepackage{hyperref}
\begin{filecontents*}{test.csv}
a,b,c
1,2,3
4,5,6
\end{filecontents*}
\begin{document}
\csvloop{
file=test.csv,
respect all,
separator=comma,
no head,
before reading={
\begin{Form}
\begin{longtable}{llll}
\toprule
},
command={\csviffirstrow
{\textbf{\csvcoli} & \textbf{\csvcolii} & \textbf{\csvcoliii} & }
{\csvcoli & \csvcolii & \csvcoliii & \CheckBox[name=checkbox\thecsvrow]{}}
},
late after line={\\},
late after first line={\\\midrule\endhead},
late after last line={\\\bottomrule},
after reading={
\end{longtable}
\end{Form}
}
}
\end{document}