Caixa de seleção e `csvsimple`

Caixa de seleção e `csvsimple`

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 hyperrefpara 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 checkboxem seus dados CSV para checkbox1etc. checkbox2para 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}

insira a descrição da imagem aqui

Você também pode gerar automaticamente os nomes de caixas de seleção exclusivos necessários usando um contador ou usando \thecsvrowo 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 checkboxpor uma caixa de seleção clicável. Então, talvez você queira apenas uma caixa de seleção nas linhas onde a string checkboxaparece na coluna coledos dados CSV relevantes. (Obrigado a @Marijn por apontar isso.)

Você pode usar a macro \ifcsvstrequalpara verificar em cada linha se o conteúdo da célula está checkboxe, 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:

insira a descrição da imagem aqui



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

insira a descrição da imagem aqui

informação relacionada