複選框和“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 表單中,最好每個欄位(複選框也是欄位)都有一個唯一的名稱。否則,根據表單的進一步使用(例如匯出表單資料時),您可能會遇到意外的結果。因此,在下面的範例中,我將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}

輸出與上面相同。


再想一想,您說您想checkbox用可單擊的複選框替換該字串。因此,也許您只需要在相關 CSV 資料checkbox列中出現字串的那些行中新增一個複選框。 cole(感謝@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 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}

在此輸入影像描述

相關內容