我想從 csv 檔案內的值產生一個表,該表具有以下屬性:
- 它們包括雙向文字;有些欄位包含英文文字(從左到右的語言),而其他欄位則包含阿拉伯語(從右到左的語言)。
- 有些值是空的,我希望它們在表格內也顯示為空
- csv 文件內沒有標題。
微量元素
\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}
\usepackage{csvsimple}
\usepackage{tabularx}
\usepackage{booktabs}
% \usepackage{polyglossia}
% \setmainlanguage{arabic}
% \setotherlanguages{english}
% \newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{Simplified Arabic}
% \setmonofont[Scale=1]{DejaVu Sans Mono}
% \setsansfont[Script=Arabic,Scale=1,Ligatures=TeX]{Simplified Arabic}
% \newfontfamily\englishfont{Arial}
\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}
\begin{document}
\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
\toprule
Heading1 & Heading2 & Heading3 & Heading4 & Heading5 & Heading6 & Heading7 \\
\midrule
\csvreader[no head,%
late after line=\\\midrule,%
table foot=\bottomrule]%
{DB.csv}{1=\idcode,2=\labname,3=\roomcode,4=\roomno,5=\arab,6=\eng,7=\person}%
{\idcode & \labname & \roomcode & \roomno & \arab & \eng & \person}
\bottomrule
\end{tabularx}
\end{document}
需要解決的問題
我只能編譯文件後註解
polyglossia
包及其相關程式碼(見上文),但未顯示所有阿拉伯文本,當我取消註解程式碼時,該文件將無法編譯並拋出以下錯誤:錯誤:缺少數字,視為零。 --- TeX 說 --- ١ l.37 \end{tabularx}
--- 幫助 --- 這通常是由 LaTeX 指令期望但沒有找到數字或長度作為參數所引起的。您可能省略了參數,或者文字中的方括號可能被誤認為是可選參數的開頭。此錯誤也是由於將 \protect 放在長度命令或產生數字的命令(例如 \value)前面而引起的。
如何消除水平線最終的
\midrule
,就在\bottomrule
?
聚苯乙烯
歡迎使用datatool
或pgfplotstable
打包或任何其他套件的解決方案,但最重要的是保留標頭手動格式化並且不會自動排版,在我的例子中,標題的格式比 MWE 中顯示的格式更複雜。
答案1
既然您提到歡迎其他軟體包,這裡有一個使用的範例datatool
:
\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{filecontents}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{datatool}
\setmainlanguage{arabic}
\setotherlanguages{english}
\newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{FreeSerif}
\newfontfamily\englishfont{FreeSerif}
\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}
\DTLloaddb[noheader]{data}{DB.csv}
\begin{document}
\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
\toprule
\textenglish{Heading1} &
\textenglish{Heading2} &
\textenglish{Heading3} &
\textenglish{Heading4} &
\textenglish{Heading5} &
\textenglish{Heading6} &
\textenglish{Heading7}
\DTLforeach*{data}{\idcode=Column1,\labname=Column2,\roomcode=Column3,%
\roomno=Column4,\arab=Column5,\eng=Column6,\person=Column7}%
{%
\\\midrule
\textenglish{\idcode} &
\textarabic{\labname} &
\textenglish{\roomcode} &
\textenglish{\roomno} &
\textarabic{\arab} &
\textenglish{\eng} &
\textarabic{\person}
}\\\bottomrule
\end{tabularx}
\end{document}
由於tabularx
多次處理其內容,因此首先建立內容會更有效。例如,像這樣:
\documentclass[10pt,a4paper,landscape]{report}
\usepackage[margin=5mm,landscape]{geometry}
\setlength{\parindent}{0pt}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{filecontents}
\usepackage{etoolbox}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{datatool}
\setmainlanguage{arabic}
\setotherlanguages{english}
\newfontfamily\arabicfont[Script=Arabic,Scale=1,Ligatures=TeX]{FreeSerif}
\newfontfamily\englishfont{FreeSerif}
\begin{filecontents*}{DB.csv}
1,عنوان باللغة العربية,YYY-XX-01,27,عنوان اخر,English Name,اسم شخص س
2,,UUU-ZZ-02,29,عنوان 2,English Too,اسم شخص ص
3,,BBB-GG-03,30,عنوان 3,English Term,اسم شخص و
4,,CCC-UG-04,25,عنوان عربي,English Text,اسم شخص ن
\end{filecontents*}
\DTLloaddb[noheader]{data}{DB.csv}
\begin{document}
\newcommand{\tabcontents}{\begin{tabularx}{\textwidth}{@{}XXXXXXX@{}}
\toprule
\textenglish{Heading1} &
\textenglish{Heading2} &
\textenglish{Heading3} &
\textenglish{Heading4} &
\textenglish{Heading5} &
\textenglish{Heading6} &
\textenglish{Heading7}}
\DTLforeach*{data}{\idcode=Column1,\labname=Column2,\roomcode=Column3,%
\roomno=Column4,\arab=Column5,\eng=Column6,\person=Column7}%
{%
\eappto\tabcontents{\noexpand\\\noexpand\midrule
\noexpand\textenglish{\idcode} \noexpand&
\noexpand\textarabic{\labname} \noexpand&
\noexpand\textenglish{\roomcode} \noexpand&
\noexpand\textenglish{\roomno} \noexpand&
\noexpand\textarabic{\arab} \noexpand&
\noexpand\textenglish{\eng} \noexpand&
\noexpand\textarabic{\person}}
}%
\appto\tabcontents{\\\bottomrule\end{tabularx}}
\tabcontents
\end{document}
這意味著所產生的開銷\DTLforeach
被最小化。文件建置過程的實際節省取決於資料庫的大小。