Как заставить \ifdefempty для записей datatool работать в \longtabu?

Как заставить \ifdefempty для записей datatool работать в \longtabu?

У меня есть .csv-файл, который я хочу превратить в таблицу с помощью datatool-package. .csv-файл имеет следующую структуру

фу&бар&фубар

где несколько строк сгруппированы вместе и только первая в каждой группе содержит записи дляфуибар, остальное только дляфубар. Записи могут содержать математические выражения.

Я попытался проверить первую строку в группе с помощью \ifdefemptyfrom etoolbox-package и распечатать \hline, если запись длябарне пусто, но это приводит к сообщению об ошибке.

МРП

\documentclass{article}
\usepackage{etoolbox}
\usepackage{tabu}
\usepackage{longtable}
\usepackage{datatool}

\DTLloaddb[keys={foo,bar,foobar}]{mydatabase}{testbase.csv}

\newcommand{\printcommand}[2][]{%
 \begin{longtabu}to\textwidth{@{}llX@{}}
 \firsthline
 Foo&Bar&Foobar\\
 \hline\endhead
 \DTLforeach*{#2}{\foo=foo,\bar=bar,\foobar=foobar}{%
%   \ifdefempty{\bar}{}{\hline}%
  \foo&\bar&\foobar\\
  }
 \end{longtabu}
}

\begin{document}
foobar

\printcommand{mydatabase}
\end{document}

Выглядит testbase.csvтак

myfoo,mybar,myfoobar
17,barbar,bar 1
,,bar 234
,,barbary
23,ba ba ba,\(a^2+b^2=c^2\)
,,\emph{barfoo}
,,foofoofoo

Если я скомпилирую таким образом, то не получу никаких ошибок, но если я раскомментирую закомментированную строку, то получу misplaced \noalinошибки misplaced \omit.

Если я заменю longtabuна tabu(и уберу then undefined \endhead), я получу еще больше ошибок.

Как мне сделать так, чтобы это работало так, как я хочу?

решение1

Ваша ошибка довольно проста. Вы пытаетесь разместить a, \hlineне закончив предыдущую строку. Это не сработает (с циклом или без него). Попробуйте

\DTLforeach*{#2}{\foo=foo,\bar=bar,\foobar=foobar}{%
  \foo&\bar&\foobar\\
  \ifdefempty{\bar}{}{\hline}%
}

и вы увидите, что он компилируется в

лонгтабу

Вероятно, вы скажете, что это не то, что вам нужно. Я знаю, но ваша проверка не работает для вывода hline до этого. Вам нужно будет убедиться, что предыдущая строка заканчивается чем-то вроде \\.

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