我还没有找到关于如何在用生成的表中插入复选框的任何清晰和/或实用的示例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 表单中,每个字段(复选框也是字段)都有一个唯一的名称是个好主意。否则,根据表单的进一步使用(例如,导出表单数据时),您可能会遇到意外结果。因此,在下面的示例中,我将checkbox
CSV 数据中的文本更改为等checkbox1
,checkbox2
以生成唯一的 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 指出这一点。)checkbox
cole
您可以使用宏\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 reading
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}