Я хочу создать таблицу из значений внутри 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}
--- HELP --- Обычно это происходит, когда команда 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
сводятся к минимуму. Фактическая экономия в плане процесса создания документа зависит от размера базы данных.