次のプロパティを持つ 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 コマンドが引数として数値または長さのいずれかを期待しているが、見つからないことが原因で発生します。引数を省略したか、テキスト内の角括弧がオプションの引数の先頭と間違えられた可能性があります。このエラーは、長さコマンドまたは数値を生成する \value などのコマンドの前に \protect を置くことによっても発生します。
水平線を取り除く方法最後の
\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
最小限に抑えられることを意味します。ドキュメント構築プロセスに関する実際の節約は、データベースのサイズによって異なります。