Casilla de verificación y `csvsimple`

Casilla de verificación y `csvsimple`

No he encontrado ningún ejemplo claro y/o funcional de cómo insertar un checkbox en una tabla generada con csvsimple.

Por ejemplo, en este MWE, ¿cómo puedo modificar el código para reemplazar las cadenas de casilla de verificación por cadenas reales en las que se puede hacer clic, por favor?

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

Muchas gracias Jasper. Estoy muy interesado en todas tus soluciones. Ciertamente, estaba buscando más específicamente algo como el segundo donde los nombres de las casillas de verificación se generan automáticamente usando un contador.

Si es posible para usted (¡y si puedo abusar!), Le pediría una reflexión más: cómo adaptar su segunda solución cuando tenemos una tabla larga como, por ejemplo, en el siguiente 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}

Respuesta1

¡Bienvenido a TeX.SX! Probablemente necesite contar un poco más sobre su caso de uso. Hasta donde entiendo tu pregunta, estás intentando crear algún tipo de formulario PDF interactivo. Puede utilizar el paquete hyperrefpara crear dicho formulario con casillas de verificación en las que se puede hacer clic.

Sin embargo, tenga en cuenta que en un formulario PDF interactivo, es una buena idea que cada campo (una casilla de verificación también es un campo) tenga un nombre único. De lo contrario, dependiendo del uso posterior del formulario (por ejemplo, al exportar los datos del formulario), es posible que encuentre resultados inesperados. Por lo tanto, en el siguiente ejemplo, cambié el texto checkboxen sus datos CSV a checkbox1, checkbox2etc. para generar ID únicos que luego usé como nombres para las casillas de verificación en el formulario.

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

ingrese la descripción de la imagen aquí

También puede generar los nombres de casilla de verificación únicos necesarios automáticamente usando un contador o usando \thecsvrowel cual devuelve el número de fila actual, como en el siguiente ejemplo (dado que en este caso no necesitaría ningún dato CSV relacionado con la casilla de verificación, eliminé los nombres relevantes). columna):

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

El resultado es el mismo que el anterior.


Pensándolo bien, dice que desea reemplazar la cadena checkboxpor una casilla de verificación en la que se puede hacer clic. Entonces, tal vez solo desee una casilla de verificación en aquellas filas donde checkboxaparece la cadena en la columna colede datos CSV relevantes. (Gracias a @Marijn por señalar esto).

Puedes hacer uso de la macro \ifcsvstrequalpara verificar para cada fila si el contenido de la celda es checkboxy, solo en caso afirmativo, colocar la casilla de verificación:

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

El código anterior no colocaría una casilla de verificación en la segunda fila:

ingrese la descripción de la imagen aquí



Más tarde también preguntaste cómo adaptar la segunda de las soluciones anteriores a una configuración en la que \csvloopse utiliza para crear un archivo longtable. Es importante colocar todos los campos del PDF entre ellos \begin{Form}y \end{Form}garantizar la funcionalidad completa de los campos del formulario. Aquí, podemos agregar estos a las opciones before readingy 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}

ingrese la descripción de la imagen aquí

información relacionada