チェックボックスと `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 さん、本当にありがとうございます。あなたのすべてのソリューションにとても興味があります。確かに、私はカウンターを使用してチェックボックス名が自動的に生成される 2 番目のソリューションのようなものを具体的に探していました。

もし可能であれば(そして私が乱用しても構わないなら)、もう 1 つ質問します。たとえば次の MWE のような長い表がある場合、2 番目のソリューションをどのように適応させるかということです。

\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 データ内のテキストを などに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 に感謝します。)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}

上記のコードでは、2 行目にチェックボックスは配置されません。

ここに画像の説明を入力してください



\csvloopまた、後で、を作成するために が使用されるセットアップに、上記のソリューションの 2 番目を適用する方法についても質問されました。フォーム フィールドが完全に機能するようにするには、longtablePDF 内のすべてのフィールドを と の間に配置することが重要です。ここでは、およびオプションに以下を追加できます。\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}

ここに画像の説明を入力してください

関連情報