我想根据 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
被最小化。文档构建过程的实际节省取决于数据库的大小。