Создание таблицы из значений в 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}

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

изображение таблицы

Связанный контент