
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 hyperref
para 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 checkbox
en sus datos CSV a checkbox1
, checkbox2
etc. 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}
También puede generar los nombres de casilla de verificación únicos necesarios automáticamente usando un contador o usando \thecsvrow
el 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 checkbox
por 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 checkbox
aparece la cadena en la columna cole
de datos CSV relevantes. (Gracias a @Marijn por señalar esto).
Puedes hacer uso de la macro \ifcsvstrequal
para verificar para cada fila si el contenido de la celda es checkbox
y, 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:
Más tarde también preguntaste cómo adaptar la segunda de las soluciones anteriores a una configuración en la que \csvloop
se 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 reading
y 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}