Kontrollkästchen und „csvsimple“

Kontrollkästchen und „csvsimple“

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, hyperrefum 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 checkboxin Ihren CSV-Daten in usw. geändert checkbox1, checkbox2um 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}

Bildbeschreibung hier eingeben

Man könnte die benötigten eindeutigen Checkbox-Namen auch automatisch generieren, indem man einen Zähler verwendet oder \thecsvrowdie 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 checkboxin der Spalte der relevanten CSV-Daten erscheint cole. (Danke an @Marijn für den Hinweis.)

Sie können sich das Makro zunutze machen, \ifcsvstrequalum für jede Zeile zu prüfen, ob der Inhalt der Zelle vorhanden ist checkboxund 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:

Bildbeschreibung hier eingeben



Sie haben später auch gefragt, wie die zweite der oben genannten Lösungen an ein Setup angepasst werden kann, bei dem \csvloopzum 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 readingund 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}

Bildbeschreibung hier eingeben

verwandte Informationen