使用双向文本根据 CSV 文件中的值生成表格

使用双向文本根据 CSV 文件中的值生成表格

我想根据 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}

输出(缺少阿拉伯语文本) MWE 的排版输出

问题需要解决

  • 我只能编译文件注释polyglossia包及其相关代码(见上文),但并未显示所有阿拉伯语文本,当我取消注释该代码时,文件无法编译并抛出以下错误:

    错误:缺少数字,视为零。 --- TeX 说 --- ١ l.37 \end{tabularx}

    --- 帮助 --- 这通常是由于 LaTeX 命令期望但未找到数字或长度作为参数而导致的。您可能省略了一个参数,或者文本中的方括号可能被误认为是可选参数的开头。将 \protect 放在长度命令或产生数字的命令(如 \value)前面也会导致此错误。

  • 如何消除水平线最终的 \midrule,就在 之前的一个\bottomrule

附言

欢迎使用datatoolpgfplotstable包或任何其他包的解决方案,但最重要的是将标题保留为手动格式化并且不会自动排版,就我而言,标题的格式比 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被最小化。文档构建过程的实际节省取决于数据库的大小。

表格图像

相关内容