复选框和 `csvsimple`

复选框和 `csvsimple`

我还没有找到关于如何在用生成的表中插入复选框的任何清晰和/或实用的示例csvsimple

例如,在这个 MWE 中,我该如何修改代码以将复选框字符串替换为真正的可点击字符串?

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

非常感谢 Jasper,我对您的所有解决方案都很感兴趣。当然,我更具体地搜索了第二种解决方案,其中复选框名称是使用计数器自动生成的!

如果您可以的话(如果我可以滥用!)我会再问一次:当我们有一个长表时,如何调整您的第二个解决方案,例如在以下 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}

答案1

欢迎来到 TeX.SX!您可能需要多介绍一下您的用例。据我理解,您是在尝试制作某种交互式 PDF 表单。您可以使用该包hyperref创建带有可点击复选框的表单。

但请注意,在交互式 PDF 表单中,每个字段(复选框也是字段)都有一个唯一的名称是个好主意。否则,根据表单的进一步使用(例如,导出表单数据时),您可能会遇到意外结果。因此,在下面的示例中,我将checkboxCSV 数据中的文本更改为等checkbox1checkbox2以生成唯一的 ID,然后将其用作表单中复选框的名称。

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

在此处输入图片描述

您还可以使用计数器或使用\thecsvrow返回当前行号的方法来自动生成所需的唯一复选框名称,如以下示例所示(因为在这种情况下您根本不需要任何与复选框相关的 CSV 数据,所以我删除了相关列):

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

输出与上面相同。


再想想,你说你想用一个可点击的复选框替换字符串。所以,也许你只想要在相关 CSV 数据的列中出现checkbox字符串的行中使用复选框。(感谢@Marijn 指出这一点。)checkboxcole

您可以使用宏\ifcsvstrequal来检查每一行单元格的内容是否正确checkbox,只有正确时才放置复选框:

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

上述代码不会在第二行放置复选框:

在此处输入图片描述



\csvloop稍后您还询问如何将上述第二个解决方案调整为用于创建 的设置longtable。将 PDF 中的所有字段放置在 和 之间非常重要\begin{Form},以确保表单字段的完整功能。在这里,我们可以将这些添加到和选项\end{Form}中:before readingafter 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}

在此处输入图片描述

相关内容