Ich möchte aus Werten in einer CSV-Datei eine Tabelle erstellen, die die folgenden Eigenschaften hat:
- Sie enthalten bidirektionalen Text; einige Spalten enthalten englischen Text (eine Sprache, die von links nach rechts gelesen wird), während andere arabischen Text enthalten (eine Sprache, die von rechts nach links gelesen wird).
- Einige Werte sind leer und ich möchte, dass sie auch in der Tabelle leer erscheinen
- Die CSV-Datei enthält keinen Header.
MWE
\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}
Ausgabe (arabischer Text fehlt)
Probleme müssen gelöst werden
Ich konnte die Datei nur kompilierennachKommentierungspaket
polyglossia
und der zugehörige Code (siehe oben), aber der gesamte arabische Text wurde nicht angezeigt. Wenn ich den Code auskommentiere, wird die Datei nicht kompiliert und es tritt der folgende Fehler auf:FEHLER: Fehlende Zahl, wird als Null behandelt. --- TeX sagte --- Seite l.37 \end{tabularx}
--- HILFE --- Dies wird normalerweise dadurch verursacht, dass ein LaTeX-Befehl eine Zahl oder eine Länge als Argument erwartet, aber nicht findet. Möglicherweise haben Sie ein Argument ausgelassen, oder eine eckige Klammer im Text wurde fälschlicherweise für den Anfang eines optionalen Arguments gehalten. Dieser Fehler wird auch dadurch verursacht, dass Sie \protect vor einen Längenbefehl oder einen Befehl wie \value setzen, der eine Zahl erzeugt.
Wie man die horizontale Linie durch dieFinale
\midrule
, das direkt vor dem\bottomrule
?
PS
Lösungen, die datatool
unser pgfplotstable
Paket oder ein anderes Paket verwenden, sind willkommen, aber das Wichtigste ist, den Header so zu belassen,manuellformatiert und nicht automatisch gesetzt, in meinem Fall ist die Formatierung der Kopfzeile aufwändiger als die hier im MWE angezeigte.
Antwort1
Da Sie erwähnt haben, dass andere Pakete willkommen sind, hier ein Beispiel mit 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}
Da tabularx
der Inhalt mehrfach verarbeitet wird, ist es effizienter, den Inhalt zuerst zu konstruieren. Zum Beispiel so:
\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}
Dadurch \DTLforeach
wird der dadurch entstehende Mehraufwand minimiert. Die tatsächliche Einsparung beim Dokumentaufbau hängt von der Größe der Datenbank ab.