
我還沒有找到任何關於如何在使用 生成的表中插入複選框的清晰和/或功能範例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
以產生唯一 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 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}