
Я не нашел ни одного понятного и/или функционального примера того, как вставить флажок в таблицу, созданную с помощью 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}
Спасибо большое, Джаспер, меня очень интересуют все твои решения. Конечно, я искал более конкретно что-то вроде второго, где имена флажков генерируются автоматически с помощью счетчика!
Если это возможно для вас (и если я могу вас оскорбить!), я бы хотел задать еще один вопрос: как адаптировать ваше второе решение, когда у нас есть длинный стол, как, например, в следующем 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
т. д., чтобы сгенерировать уникальные идентификаторы, которые затем использовал в качестве имен для флажков в форме.
\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}
Результат тот же, что и выше.
Если подумать, вы говорите, что хотите заменить строку checkbox
на кликабельный флажок. Так что, возможно, вам нужен флажок только в тех строках, где строка checkbox
появляется в столбце cole
соответствующих данных CSV. (Спасибо @Marijn за указание на это.)
Вы можете использовать макрос, \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}