Флажок и `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}

Спасибо большое, Джаспер, меня очень интересуют все твои решения. Конечно, я искал более конкретно что-то вроде второго, где имена флажков генерируются автоматически с помощью счетчика!

Если это возможно для вас (и если я могу вас оскорбить!), я бы хотел задать еще один вопрос: как адаптировать ваше второе решение, когда у нас есть длинный стол, как, например, в следующем 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}

введите описание изображения здесь

Связанный контент