
Não encontrei nenhum exemplo claro e/ou funcional de como inserir um checkbox em uma tabela gerada com csvsimple
.
Por exemplo, neste MWE, como posso modificar o código para substituir as strings da caixa de seleção por outras clicáveis reais, 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}
Muito obrigado Jasper, estou muito interessado em todas as suas soluções. Certamente, eu estava pesquisando mais especificamente algo como o segundo onde os nomes das caixas de seleção são gerados automaticamente usando um contador!
Se for possível para você (e se posso abusar!), gostaria de perguntar mais uma coisa: Como adaptar sua segunda segunda solução quando temos uma tabela longa como, por exemplo, no seguinte 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}
Responder1
Bem-vindo ao TeX.SX! Você provavelmente precisará contar um pouco mais sobre seu caso de uso. Pelo que entendi sua pergunta, você está tentando criar algum tipo de formulário PDF interativo. Você pode usar o pacote hyperref
para criar esse formulário com caixas de seleção clicáveis.
Observe, entretanto, que em um formulário PDF interativo, é uma boa ideia que cada campo (uma caixa de seleção também é um campo) tenha um nome exclusivo. Caso contrário, dependendo do uso posterior do formulário (por exemplo, ao exportar os dados do formulário), você poderá encontrar resultados inesperados. No exemplo a seguir, alterei o texto checkbox
em seus dados CSV para checkbox1
etc. checkbox2
para gerar IDs exclusivos que usei como nomes para as caixas de seleção no formulário.
\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}
Você também pode gerar automaticamente os nomes de caixas de seleção exclusivos necessários usando um contador ou usando \thecsvrow
o qual retorna o número da linha atual, como no exemplo a seguir (já que você não precisaria de nenhum dado CSV relacionado à caixa de seleção neste caso, excluí o relevante coluna):
\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}
A saída é a mesma acima.
Pensando bem, você diz que deseja substituir a string checkbox
por uma caixa de seleção clicável. Então, talvez você queira apenas uma caixa de seleção nas linhas onde a string checkbox
aparece na coluna cole
dos dados CSV relevantes. (Obrigado a @Marijn por apontar isso.)
Você pode usar a macro \ifcsvstrequal
para verificar em cada linha se o conteúdo da célula está checkbox
e, somente se sim, colocar a caixa de seleção:
\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}
O código acima não colocaria uma caixa de seleção na segunda linha:
Mais tarde, você também perguntou como adaptar a segunda das soluções acima para uma configuração onde \csvloop
é usada para criar um arquivo longtable
. É importante colocar todos os campos do PDF entre \begin{Form}
e \end{Form}
garantir a funcionalidade total dos campos do formulário. Aqui, podemos adicioná-los às opções before reading
e 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}