¿Cómo hacer que \ifdefempty en las entradas de la herramienta de datos funcione en \longtabu?

¿Cómo hacer que \ifdefempty en las entradas de la herramienta de datos funcione en \longtabu?

Tengo un archivo .csv que quiero convertir en una tabla usando el datatoolpaquete. El archivo .csv está estructurado como

foo&bar&foobar

donde varias líneas están agrupadas y sólo la primera de cada grupo contiene entradas parafooybar, el resto sólo paraFoobar. Las entradas pueden contener matemáticas.

Intenté verificar la primera línea en un grupo con \ifdefemptyfrom etoolbox-package e imprimir \hline, si la entrada parabarno está vacío, pero genera un mensaje de error.

MWP

\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}

Se testbase.csvve así

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

Si compilo así, no obtengo errores, pero si descomento la línea comentada, obtengo misplaced \noalinerrores misplaced \omit.

Si reemplazo longtabupor tabu(y elimino el entonces indefinido \endhead), obtengo aún más errores.

¿Cómo puedo hacer que esto funcione como quiero?

Respuesta1

Tu error es bastante simple. Intentas colocar a \hlinesin que haya finalizado la línea anterior. Eso no funcionará (con o sin bucle). Intentar

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

y verás que se compila a

longtabu

Probablemente dirás que esto no es lo que quieres. Lo sé, pero su verificación no funciona para generar una línea h antes. Deberías asegurarte de que la línea anterior termine con algo como \\.

información relacionada